LEX 'GRAPHLEX' * (c) Copyright PPC Paris 1986 t EQU 78 CON(2) #E1 Id CON(2) t Lowest token CON(2) 1+t Highest token CON(5) 0 Next Lex chain NIBHEX F REL(4) 1+TxTbSt Offset to text table CON(4) 0 No message table CON(5) 0 No poll handler CON(3) (TxEn01)-(TxTbSt) REL(5) LINEe CON(1) #D CON(3) (TxEn02)-(TxTbSt) REL(5) PSETe CON(1) #D TxTbSt TxEn01 CON(1) 9 NIBASC 'GLINE' Syntaxe: GLINE x,l,p,t,e CON(2) t TxEn02 CON(1) 9 NIBASC 'GPSET' Syntaxe: GPSET x CON(2) 1+t NIBHEX 1FF STMTR0 EQU #2F871 DROPDC EQU #05470 FIXP EQU #02A6E NUMCK EQU #0369D COMCK EQU #036CD RESPTR EQU #03172 MSPARe EQU #02E5C RNDAHX EQU #136CB ADRS50 EQU #0F551 MFERR EQU #09393 ARGERR EQU #0BF19 EXPEX- EQU #0F178 NXTSTM EQU #08A48 ************************************************** * rndahx * * but: Åvaluer le parametre au sommet de la math- * stack * entrÅe: * - D1 ^ sommet de la math-stack * sortie: * - A(A) = valeur du paramÉtre, en hexa * - D1 ^ paramÉtre suivant * - mode = HEX * - P=0 * appelle: RNDAHX * note: si le paramÉtre est nÅgatif, une erreur * ARGERR est gÅnÅrÅe ************************************************** rndahx GOSBVL RNDAHX A(A) := param. en hexa GONC argerr ParamÉtre < 0 D1=D1+ 16 RTN argerr GOVLNG ARGERR ************************************************** * PSETd, LINEd * * but: routines de dÅcompilation de PSET et LINE * appelle: DROPDC ************************************************** PSETd LINEd GOVLNG DROPDC ************************************************** * PSETp * * but: routine de parse de PSET (PSET x) * appelle: FIXP ************************************************** PSETp GOVLNG FIXP ************************************************** * LINEp * * but: routine de parse de LINE * LINE x, l, p, t, e * appelle: NUMCK, COMCK, RESPTR ************************************************** LINEp LC(1) 5 5 paramÉtres È parser LIp10 C=C-1 P sauvegarde du compteur dans R2=C R2 GOSBVL NUMCK parser une expression num. GOSUB resptr C=R2 restauration du compteur ?C=0 P sortie si = 0 GOYES resptr GOSBVL COMCK sinon, on cherche une "," GONC mspare si non trouvÅe, erreur C=R2 restauration du compteur GOC LIp10 B.E.T. resptr GOVLNG RESPTR mspare GOVLNG MSPARe "missing parameter" ************************************************** * initgr * * but: initialiser le nÅcessaire pour l'exÅcution * des ordres PSET et LINE * entrÅe: * - D1 ^ sommet de la math-stack * sortie: * - D0 = adresse de la chaÑne * - A(A) = longueur de la chaÑne en pixels ************************************************** initgr GOSBVL EXPEX- Evaluation des paramÉtres LC(3) 'g' Code de la variable B=C X transfÅrÅ dans B(X) GOSBVL ADRS50 GOC invvar variable non trouvÅe D0=D0+ 11 on cherche l'adresse de la A=DAT0 A chaÑne (ad. relative) CD0EX C=C-A A calcul de l'adresse rÅelle D0=C D0 := adresse de la chaÑne A=0 A A=DAT0 4 A(A) := LEN(G$) A=A+A A A=A+A A A=A+A A longueur en pixels D0=D0+ 4 D0 := adresse des donnÅes RTN dans la chaÑne invvar LC(2) 83 GOVLNG MFERR REL(5) PSETd REL(5) PSETp ************************************************** * PSETe * * but: allumer un point, pour le programme GRAPH ************************************************** PSETe GOSUB initgr initialise le graphique R0=A sauvegarde de la longueur GOSUB rndahx C=R0 C(A) := xmax ?A#0 A GOYES PSET10 A=A+1 A si x = 0 alors x := 1 GONC PSET20 B.E.T. PSET10 ?A<=C A GOYES PSET20 A=C A si x > 640 alors x := 640 PSET20 GOSUB pset GOTO LINE99 NXTSTM ************************************************** * pset * * but: allumer le point A(A) * entrÅe : * - A(A) = numÅro du point È allumer (1..640) * - D0 = adresse de la variable G$ * sortie : * - P = 0 * - D0 inchangÅ * utilise: A(W), B(A), C(A) ************************************************** pset A=A-1 A x := numÅro - 1 B=A A A=0 W A=B A A := 00000000000xxxxx ASRB ASRB ASRB A := x div 8 C=0 A LC(1) 7 B=B&C A B := x mod 8 B=C-B A C := 7 - (x mod 8) LC(2) 79 C=C-A A C := offset de x en octets C=C+C A C := " " " quartets AD0EX C=C+A A C := adresse rÅelle de x D0=C C=0 B C=C+1 B GOTO pset20 pset10 C=C+C B pset20 B=B-1 A GONC pset10 B=C B C=DAT0 B C=C!B B Allumage du point DAT0=C B D0=A Restauration ancien D0 RTN REL(5) LINEd REL(5) LINEp ************************************************** * LINEe * * but: tracer une ligne, pour le programme GRAPH ************************************************** LINEe GOSUB initgr initialisation du graphique R2=A R2 := LEN(G$) CD0EX C := adresse de G$ R0=C R0 := @ G$ LC(1) 5 5 paramÉtres È stocker D0=(5) STMTR0 a partir de STMTR0 GOTO LINE20 LINE10 R1=C sauvegarde du compteur GOSUB rndahx DAT0=A A sauvegarde du paramÉtre D0=D0+ 5 C=R1 restauration du compteur LINE20 C=C-1 P GONC LINE10 tant que compteur >= 0 * 0 + STMTR0 : Åcart * 5 + STMTR0 : taille * 10 + STMTR0 : premier incrÅment * 15 + STMTR0 : longueur * 20 + STMTR0 : x ?A#0 A x GOYES LINE30 A=A+1 A si x = 0 alors x := 1 LINE30 C=R0 C = adresse de G$ D0=C D0 = " " R1=A R1 := valeur courante de x GOSUB pset allumer x D1=(5) 5*3+STMTR0 longueur A=R1 A := x C=DAT1 A C := longueur ?C#0 A GOYES LINE35 C=C+1 A si longueur = 0 alors DAT1=C A longueur := 1 LINE35 A=C+A A A := point final + 1 A=A-1 A A := point final C=R2 C=LEN(G$) ?A<=C A GOYES LINE40 A=R1 A := x1 C=C-A A C=C+1 A nouvelle longueur calculÅe DAT1=C A A=R2 LINE40 R0=A R0 := limite, nommons-la xf GOSUB pset allumer xf D1=D1- 5 D1 = 10 + STMTD0 C=DAT1 A C(A) := premier incrÅment A=R1 A=A+C A R1=A C=R0 xf ?A>=C A si x+premier incrÅment>=xf GOYES LINE99 pas la peine de tracer D1=D1- 5 D1 = 5 + STMTR0 (taille) C=DAT1 A R2=C D1=D1- 5 D1 = 0 + STMTR0 (Åcart) * R0 := xf * R1 := x * R2 := taille * R3 := incrÅment dans la taille * D1 pointe sur l'Åcart LINE50 C=0 A boucle externe C=C+1 A le compteur de taille est R3=C initialisÅ avec 1 LINE60 A=R1 A := x GOSUB pset A=R1 A=A+1 A x := x + 1 R1=A C=R0 ?A>=C A si x >= x2 GOYES LINE99 fini A=R3 A=A+1 A compteur taille incrementÅ R3=A C=R2 C := taille ?A