; ______________________________________________________________________________ ; .............................................................................. ; ...................................................................2222222.... ; ................................................................22222222220... ; ...................................................222........222222.....222.. ; ..............................................2202222222222..22000............ ; ..................................22000.....20222222222200000200002........... ; .................................2002202...2222200222.220000000200000000022... ; ....................220002......22222200..2200002.......2200000...20000000000. ; ....................22222202....2220000022200000..........200002........200000 ; .....200000.........2222200000222200220000000002..........200002........20000. ; .....00222202........2220022000000002200002000002........2000002000020000000.. ; ....2222200000.......220002200000002.2000000000000222222000000..2000000002.... ; ....220000200002......20000..200002..220000200000000000000002.......22........ ; ...2220002.220000 2....220002...22.....200002..0000000000002................... ; ...220000..222000002...20000..........200000......2222........................ ; ...000000000000000000..200000..........00002.................................. ; ..220000000022020000002.200002.........22.......______________________________ ; ..0000002........2000000220022.................| ; .200000............2002........................| Tokenisation ; .200002........................................| ; 220002.........................................|______________________________ ; ______________________________________________________________________________ ; Include "+Debug.s" IFEQ Debug=2 Include "+AMOS_Includes.s" Include "+Version.s" ENDC ; ______________________________________________________________________________ ; Branchements internes ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TDebut dc.l Tokenise-TDebut dc.l Detok-TDebut dc.l Mon_Detok-TDebut dc.l TInst-TDebut dc.l 0 *********************************************************** * TOKENISE LA LIGNE COURANTE *********************************************************** Tokenise: movem.l a1-a6/d2-d7,-(sp) * Sauve le debut de la ligne move.l a1,a4 move.l a0,a3 pea 512(a4) clr.w d5 * RAZ de tous les flags clr.w (a4)+ ******* Compte les TABS moveq #0,d1 TokT: addq.w #1,d1 move.b (a3)+,d0 beq TokVide cmp.b #32,d0 beq.s TokT subq.l #1,a3 cmp.w #127,d1 bcs.s TokT1 moveq #127,d1 TokT1: move.b d1,-1(a4) ******* Un chiffre au debut de la ligne? move.b (a3),d0 cmp.b #"0",d0 bcs.s TokT2 cmp.b #"9",d0 bhi.s TokT2 bset #1,d5 * Flag VARIABLE bset #4,d5 * Flag LABEL move.l a4,TkAd(a5) move.w #_TkVar,(a4)+ clr.l (a4)+ move.b (a3)+,(a4)+ ******* Une apostrophe en debut de ligne? TokT2: cmp.b #"'",d0 bne.s TokLoop addq.l #1,a3 move.w #_TkRem2,(a4)+ bra TkKt2 ******* Prend une lettre TokLoop: cmp.l (sp),a4 bhi TokFin move.b (a3)+,d0 beq TokFin * Rem en route? btst #5,d5 beq.s TkROn move.b d0,(a4)+ bra.s TokLoop TkROn: * Variable en route? btst #1,d5 bne TkVD * Chaine en route? btst #0,d5 beq.s TkC2 cmp.b TkChCar(a5),d0 beq.s TkC1 move.b d0,(a4)+ bra.s TokLoop * Fin d'une chaine alphanumerique TkChf: subq.l #1,a3 TkC1: bclr #0,d5 move.l a4,d0 btst #0,d0 beq.s TkC0 clr.b (a4)+ TkC0: move.l TkAd(a5),a0 sub.l a0,d0 subq.w #4,d0 move.w d0,2(a0) bra.s TokLoop * Debut d'une chaine alphanumerique? TkC2: cmp.b #'"',d0 beq TkC2a cmp.b #"'",d0 bne TkOtre TkC2a: move.b d0,TkChCar(a5) move.l a4,TkAd(a5) cmp.b #"'",d0 beq.s TkC2b move.w #_TkCh1,(a4)+ bra.s TkC2c TkC2b: move.w #_TkCh2,(a4)+ TkC2c: clr.w (a4)+ bset #0,d5 bra.s TokLoop * Variable en route TkVD: bsr Minus * Numero de ligne en route TkFV: moveq #0,d1 move.l TkAd(a5),a0 btst #4,d5 beq.s TkV2 cmp.b #"0",d0 bcs.s TkV0 cmp.b #"9",d0 bls.s TkV3 TkV0: bset #3,d5 Fin du debut de ligne! bclr #4,d5 Fin du numero de ligne cmp.b #":",d0 beq.s TkV1 subq.l #1,a3 bra.s TkV1 * Variable normale / label TkV2: cmp.b #"_",d0 beq.s TkV3 cmp.b #"0",d0 bcs.s TkV4 cmp.b #"9",d0 bls.s TkV3 cmp.b #"a",d0 bcs.s TkV4 cmp.b #"z",d0 bls.s TkV3 cmp.b #128,d0 bls.s TkV4 TkV3: move.b d0,(a4)+ bra TokLoop * Fin de la variable/label/label goto TkV4: bset #3,d5 * Si pas debut de ligne bne.s TkV5 cmp.b #":",d0 * Si : bne.s TkV5 TkV1: move.w #_TkLab,(a0) bra.s TkV7 TkV5: subq.l #1,a3 moveq #2,d1 cmp.b #"$",d0 beq.s TkV6 moveq #1,d1 cmp.b #"#",d0 beq.s TkV6 moveq #0,d1 bra.s TkV7 TkV6: addq.w #1,a3 TkV7: move.w a4,d2 * Rend pair btst #0,d2 beq.s TkV8 clr.b (a4)+ TkV8: move.l a4,d0 sub.l a0,d0 subq.l #6,d0 move.b d0,4(a0) * Poke la longueur move.b d1,5(a0) * Poke le flag bclr #1,d5 bra TokLoop * Saute les 32 TkOtre: cmp.b #" ",d0 beq TokLoop * Est-ce un chiffre? lea -1(a3),a0 Pointe le debut du chiffre moveq #0,d0 Ne pas tenir compte du signe (valtok) JJsrR L_ValRout,a1 bne.s TkK move.l a0,a3 move.w d1,(a4)+ move.l d3,(a4)+ cmp.w #_TkDFl,d1 bne TokLoop move.l d4,(a4)+ bra TokLoop TkK: ******* Tokenisation RAPIDE! moveq #-4,d7 * D7--> Numero de l'extension lea AdTokens(a5),a6 moveq #0,d3 lea -10(sp),sp * Prend le premiere caractere... moveq #0,d0 move.b -1(a3),d0 bsr MinD0 move.l d0,d2 lea Dtk_Operateurs(pc),a1 Operateur, LENTS en 1er... bra TkLIn * Lent ou rapide? TkUn cmp.b #"a",d2 bcs.s Tkl1 cmp.b #"z",d2 bhi.s Tkl1 bset #31,d2 move.w d2,d6 sub.w #"a",d6 lsl.w #1,d6 * Mode rapide: init! Tkr1 lea AdTTokens(a5),a2 move.l 0(a2,d7.w),d0 beq.s Tkl1 move.l d0,a2 move.w 4(a2,d6.w),d0 add.w d0,a2 * A2-> Adresse des adresses bset #31,d6 bra TkRNext * Tokens lents Tkl1 move.l 0(a6,d7.w),d0 beq TkNext move.l d0,a1 addq.l #6,a1 TkLIn bclr #31,d6 cmp.b #"!",d2 Entree pour les operateurs... beq TkKF cmp.b #"?",d2 bne.s Tkl2 move.l a3,a0 Tkl1a move.b (a0)+,d0 * ? PRINT / ? PRINT # beq.s Tkl1b cmp.b #"#",d0 beq.s Tkl1c cmp.s #" ",d0 beq.s Tkl1a Tkl1b move.w #_TkPr,d4 bra TkKt0 Tkl1c move.l a0,a3 move.w #_TkHPr,d4 bra TkKt0 Tkl2 move.l a1,d4 * Recherche la 1ere lettre lea 4(a1),a1 move.w d2,d0 Tkl0 move.b (a1)+,d1 bmi Tkl4 cmp.b #" ",d1 beq.s Tkl0 cmp.b #"!",d1 beq.s Tkl0 cmp.b d0,d1 beq.s TkRe0 Tkl3 bsr TklNext bne.s Tkl2 * Tableau de token suivant! TkNext addq.l #4,d7 beq TkUn cmp.l #4*26,d7 bcc.s .TrouV tst.l d2 bpl.s Tkl1 bra Tkr1 .TrouV tst.w d3 beq TkKF move.l (sp),d4 move.l 4(sp),a3 move.w 8(sp),d7 bra TklT * Trouve 1 lettre lent? Tkl4 subq.l #1,a1 and.b #$7f,d1 cmp.b #" ",d1 beq TklT cmp.b d0,d1 bne.s Tkl3 bra TklT * Token rapide suivant TkRNext move.w (a2)+,d0 beq TkNext move.l 0(a6,d7.w),a1 add.w d0,a1 move.l a1,d4 lea 5(a1),a1 move.b -1(a1),d0 cmp.b #"!",d0 beq.s TkRe0a cmp.b #" ",d0 bne.s TkRe0 TkRe0a addq.l #1,a1 * Explore les autres lettres du token TkRe0 move.l a3,a0 TkRe1 move.b (a0)+,d0 bsr MinD0 TkRe2 move.b (a1)+,d1 bmi.s TkKt cmp.b #" ",d1 bne.s TkRe3 cmp.b d1,d0 bne.s TkRe2 beq.s TkRe1 TkRe3 cmp.b d0,d1 beq.s TkRe1 * Mot cle suivant TkRe4 tst.l d6 bpl Tkl3 bmi.s TkRNext * Mot trouve? TkKt: subq.l #1,a0 subq.l #1,a1 and.b #$7f,d1 cmp.b #" ",d1 beq.s TkKt1 cmp.b d0,d1 bne.s TkRe4 addq.l #1,a0 TkKt1: tst.l d6 bpl.s TklTl move.l a1,d0 sub.l d4,d0 cmp.w d3,d0 bls.s TkRe4 move.w d0,d3 move.l d4,(sp) move.l a0,4(sp) move.w d7,8(sp) bra.s TkRe4 TklTl move.l a0,a3 *** Token trouve! TklT tst.w d7 Une extension bgt TkKtE beq.s .Norm Un operateur? lea Dtk_OpFin(pc),a0 sub.l a0,d4 bra.s TkKt0 .Norm sub.l AdTokens(a5),d4 Un token librairie principale TkKt0: lea 10(sp),sp move.w d4,(a4)+ bclr #4,d5 Plus de numero de ligne bset #3,d5 Plus debut de ligne cmp.w #_TkEqu,d4 Tokens de structure? bcs.s .SkS cmp.w #_TkStruS,d4 bls TkKt5 .SkS cmp.w #_TkOn,d4 beq.s TkKt7 cmp.w #_TkData,d4 beq TkKt3 cmp.w #_TkRem1,d4 beq.s TkKt2 cmp.w #_TkFor,d4 beq.s TkKt3 cmp.w #_TkRpt,d4 beq.s TkKt3 cmp.w #_TkWhl,d4 beq.s TkKt3 cmp.w #_TkDo,d4 beq.s TkKt3 cmp.w #_TkExit,d4 beq.s TkKt4 cmp.w #_TkExIf,d4 beq.s TkKt4 cmp.w #_TkIf,d4 beq.s TkKt3 cmp.w #_TkElse,d4 beq.s TkKta cmp.w #_TkElsI,d4 beq.s TkKt3 cmp.w #_TkThen,d4 beq.s TkKtb cmp.w #_TkProc,d4 beq.s TkKt6 cmp.w #_TkDPre,d4 beq.s TkKDPre bra TokLoop * ON TkKt7: clr.l (a4)+ bra TokLoop * Debut d'une REM TkKt2: clr.w (a4)+ move.l a4,TkAd(a5) bset #5,d5 bra TokLoop * Poke les blancss TkKt6 clr.w (a4)+ 8 octets TkKt5 clr.w (a4)+ 6 octets TkKt4 clr.w (a4)+ 4 octets TkKt3 clr.w (a4)+ 2 octets bra TokLoop * Token double precision: flags à 1 TkKDPre or.b #%10000011,MathFlags(a5) bra TokLoop * Token d'extension! .w EXT/.b #Ext/.b Nb Par/.w TOKEN TkKtE: lea 10(sp),sp move.w #_TkExt,(a4)+ move.w d7,d0 lsr.w #2,d0 move.b d0,(a4)+ clr.b (a4)+ lea AdTokens(a5),a6 sub.l 0(a6,d7.w),d4 move.w d4,(a4)+ bclr #4,d5 bset #3,d5 bra TokLoop * ELSE/THEN: regarde si numero de ligne apres! TkKta: clr.w (a4)+ TkKtb: move.l a3,a0 TkKtc: move.b (a0)+,d0 beq TokLoop cmp.b #" ",d0 beq TkKtc cmp.b #"0",d0 bcs TokLoop cmp.b #"9",d0 bhi TokLoop move.l a0,a3 move.w #_TkLGo,d1 bra.s TkKf2 ******* Rien trouve ===> debut d'une variable TkKF: lea 10(sp),sp move.w #_TkVar,d1 move.b -1(a3),d0 TkKf0: cmp.b #"A",d0 bcs.s TkKf1 cmp.b #"Z",d0 bhi.s TkKf1 add.b #"a"-"A",d0 TkKf1: cmp.b #"_",d0 beq.s TkKf2 cmp.b #128,d0 bcc.s TkKf2 cmp.b #"a",d0 bcs TokLoop cmp.b #"z",d0 bhi TokLoop TkKf2: move.l a4,TkAd(a5) move.w d1,(a4)+ clr.l (a4)+ move.b d0,(a4)+ bset #1,d5 bra TokLoop * Appel d'un label? TkKf3: move.w #_TkLGo,d1 cmp.b #"0",d0 bcs.s TkKf0 cmp.b #"9",d0 bls.s TkKf2 bra.s TkKf0 ******* Fin de la tokenisation TokFin: btst #1,d5 Fin de variable bne TkFV btst #0,d5 Fin de chaine alphanumerique bne TkChf moveq #1,d0 * Quelquechose dans la ligne! btst #5,d5 REM beq.s TokPaR move.w a4,d1 btst #0,d1 Rend pair la REM! beq.s FRem move.b #" ",(a4)+ FRem: move.l a4,d1 Calcule et stocke la longueur move.l TkAd(a5),a0 sub.l a0,d1 move.w d1,-2(a0) * Marque la fin TokPaR: clr.w (a4)+ clr.w (a4) * Poke la longueur de la ligne / 2 move.l a4,d1 addq.l #4,sp movem.l (sp)+,a1-a6/d2-d7 sub.l a1,d1 cmp.w #510,d1 bcc.s .Long lsr.w #1,d1 move.b d1,(a1) lsl.w #1,d1 ext.l d1 * Fini! tst.w d0 rts * Trop longue! .Long clr.w (a1) * <0= Trop longue moveq #0,d1 moveq #-1,d0 rts * Ligne vide! TokVide moveq #0,d0 * = 0 Vide moveq #0,d1 bra.s TokPaR * Routine: D0 minuscule MinD0 cmp.b #"A",d0 bcs.s Mnd0a cmp.b #"Z",d0 bhi.s Mnd0a add.b #32,d0 Mnd0a rts * Routine: token suivant TklNext tst.b (a1)+ * Saute le nom bpl.s TklNext Tkln1 tst.b (a1)+ * Saute les params bpl.s Tkln1 move.w a1,d1 btst #0,d1 * Rend pair beq.s Tkln2 addq.l #1,a1 Tkln2 tst.w (a1) rts ; ___________________________________________________________________________ ; ; DETOKENISATION ; ___________________________________________________________________________ ; ; A0: Ligne à detokeniser ; A1: Buffer ; D0: Adresse à détecter ; ___________________________________________________________________________ ; Mon_Detok moveq #-1,d1 bra.s Dtk Detok: moveq #0,d1 Dtk movem.l d2-d7/a2-a6,-(sp) lea 2(a1),a4 * Place pour la taille move.l a0,a6 move.l d0,a3 move.l a4,a2 clr.w -(sp) * Position du curseur ******* Met les espaces devant? tst.w d1 Mode monitor bne.s DtkMon tst.b (a6) Mode normal beq DtkFin clr.w d0 move.b 1(a6),d0 subq.w #2,d0 bmi.s Dtk2 Dtk1: move.b #" ",(a4)+ dbra d0,Dtk1 Dtk2: addq.l #2,a6 DtkMon clr.w d5 ******* Boucle de detokenisation DtkLoop:cmp.l a3,a6 Trouve la P en X? bne.s Dtk0 move.l a4,d0 sub.l a2,d0 move.w d0,(sp) Dtk0: move.l a3,d0 Detournement? bpl.s .Skip neg.l d0 move.l d0,a0 jsr (a0) .Skip move.w (a6)+,d0 beq DtkFin cmp.w #_TkLGo,d0 bls DtkVar cmp.w #_TkExt,d0 bcs DtkCst bclr #0,d5 tst.w d0 bmi DtkOpe Un operateur? lea AdTokens(a5),a0 cmp.w #_TkPar1,d0 beq DtkP cmp.w #_TkDFl,d0 beq DtkCst cmp.w #_TkExt,d0 bne.s Dtk0a * Detokenise une extension move.w 2(a6),d1 move.b (a6),d2 ext.w d2 move.w d2,d3 lsl.w #2,d2 tst.l 0(a0,d2.w) beq.s DtkEe move.l 0(a0,d2.w),a0 lea 4(a0,d1.w),a0 move.l a0,a1 bra.s Dtk3 * Extension not present DtkEe: lea ExtNot(pc),a0 add.b #"A",d3 add.b #$80,d3 move.l a0,a1 DtkEee tst.b (a1)+ bpl.s DtkEee move.b d3,-1(a1) move.w #"I",d3 bra.s Dtk3a * Un operateur DtkOpe lea Dtk_OpFin(pc),a0 bra.s Dtk0b * Instruction normale Dtk0a move.l AdTokens(a5),a0 Dtk0b lea 4(a0,d0.w),a0 move.l a0,a1 Dtk3: tst.b (a1)+ bpl.s Dtk3 move.b (a1),d3 cmp.b #"O",d3 beq.s Dtk4 cmp.b #"0",d3 beq.s Dtk4 cmp.b #"1",d3 beq.s Dtk4 cmp.b #"2",d3 beq.s Dtk4 cmp.b #"V",d3 beq.s Dtk4 * Met un espace avant s'il n'y en a pas! Dtk3a: cmp.l a4,a2 * Debut de la ligne? beq.s Dtk4 cmp.b #" ",-1(a4) beq.s Dtk4 move.b #" ",(a4)+ * Doit prendre le token prececent? Dtk4: move.b (a0),d1 cmp.b #$80,d1 bcs.s Dtk4x cmp.b #$9f,d1 bhi.s Dtk4x subq.l #4,a0 sub.b #$80,d1 beq.s Dtk4a ext.w d1 sub.w d1,a0 bra.s Dtk4x Dtk4a: move.b -(a0),d1 cmp.b #"!",d1 beq.s Dtk4x cmp.b #$80,d1 bne.s Dtk4a bra.s Dtk4 * Ecrit le mot Dtk4x: cmp.b #"!",d1 bne.s Dtk4y addq.l #1,a0 Dtk4y: move.b DtkMaj1(a5),d1 beq.s Dtk5 cmp.b #1,d1 beq.s Dtk6 bne.s Dtk8 * 0- Ecrit en MINUSCULES Dtk5: move.b (a0)+,(a4)+ bpl.s Dtk5 and.b #$7f,-1(a4) bra.s DtkE * 1- Ecrit en MAJUSCULES Dtk6: move.b (a0)+,d1 move.b d1,d2 and.b #$7f,d1 cmp.b #"a",d1 bcs.s Dtk7 cmp.b #"z",d1 bhi.s Dtk7 sub.b #"a"-"A",d1 Dtk7: move.b d1,(a4)+ tst.b d2 bpl.s Dtk6 bra DtkE * 2- Ecrit AVEC UNE MAJUSCULE Dtk8: move.b (a0)+,d1 move.b d1,d2 and.b #$7f,d1 cmp.b #"a",d1 bcs.s Dtk9 cmp.b #"z",d1 bhi.s Dtk9 sub.b #"a"-"A",d1 Dtk9: move.b d1,(a4)+ tst.b d2 bmi.s DtkE Dtk9a: move.b (a0)+,d1 move.b d1,(a4)+ bmi.s Dtk9b cmp.b #" ",d1 bne.s Dtk9a bra.s Dtk8 Dtk9b: and.b #$7f,-1(a4) * Met une espace si c'est une INSTRUCTION DtkE: cmp.w #_TkRem1,d0 beq DtkRem cmp.w #_TkRem2,d0 beq DtkRem cmp.b #"I",d3 bne.s DtkE1 move.b #" ",(a4)+ * Saute le token... DtkE1: move.l a6,a0 bsr TInst move.l a0,a6 bra DtkLoop * Ouverture de parenthese, jamais d'espace! DtkP: cmp.l a4,a2 beq.s DtkP1 cmp.b #" ",-1(a4) bne.s DtkP1 subq.l #1,a4 DtkP1: move.b #"(",(a4)+ bra.s DtkE1 ******* Detokenisation de VARIABLE DtkVar: btst #0,d5 * Si variable juste avant, met 32 beq.s DtkV0 cmp.b #" ",-1(a4) beq.s DtkV0 move.b #" ",(a4)+ DtkV0: moveq #0,d2 move.b 2(a6),d2 * Longueur move.w d2,d1 subq.w #1,d1 move.b 3(a6),d3 FLAG lea 4(a6),a0 moveq #0,d4 cmp.w #_TkLab,d0 bne.s DtkV1 moveq #1,d4 D4: 0=> Variable cmp.b #"0",(a0) 1=> Label bcs.s DtkV1 -1=> Numero ligne cmp.b #"9",(a0) bhi.s DtkV1 moveq #-1,d4 DtkV1: move.b DtkMaj2(a5),d0 beq.s DtkV2 cmp.b #1,d0 beq.s DtkV3 bne.s DtkV5 * 0- En MINUSCULES DtkV2: move.b (a0)+,d0 beq DtkVF move.b d0,(a4)+ dbra d1,DtkV2 bra DtkVF * 1- En MAJUSCULES DtkV3: move.b (a0)+,d0 beq DtkVF cmp.b #"a",d0 bcs.s DtkV4 cmp.b #"z",d0 bhi.s DtkV4 sub.b #"a"-"A",d0 DtkV4: move.b d0,(a4)+ dbra d1,DtkV3 bra DtkVF * 2- Avec UNE MAJUSCULE DtkV5: move.b (a6)+,d0 cmp.b #"a",d0 bcs.s DtkV6 cmp.b #"z",d0 bhi.s DtkV6 sub.b #"a"-"A",d0 DtkV6: move.b d0,(a4)+ dbra d1,DtkV2 * Saute la variable / met le flag de la variable DtkVF: bset #0,d5 lea 4(a6,d2.w),a6 moveq #":",d0 tst.w d4 bmi DtkLoop bne.s DtkV7 moveq #"#",d0 and.b #3,d3 cmp.b #1,d3 beq.s DtkV7 moveq #"$",d0 cmp.b #2,d3 bne DtkLoop DtkV7: move.b d0,(a4)+ bra DtkLoop ******* Detokenise des constantes DtkCst: bclr #0,d5 Si variable avant, met un espace! beq.s DtkC0 cmp.b #" ",-1(a4) beq.s DtkC0 move.b #" ",(a4)+ DtkC0: cmp.w #_TkEnt,d0 beq.s DtkC3 cmp.w #_TkHex,d0 beq.s DtkC4 cmp.w #_TkBin,d0 beq.s DtkC5 cmp.w #_TkFl,d0 beq.s DtkC6 cmp.w #_TkDFl,d0 beq.s DtkC7 * Detokenise une chaine alphanumerique cmp.w #_TkCh1,d0 bne.s DtkC0a moveq #'"',d0 bra.s DtkC0b DtkC0a: moveq #"'",d0 DtkC0b: move.b d0,(a4)+ move.w (a6)+,d1 subq.w #1,d1 bmi.s DtkC2 DtkC1: move.b (a6)+,(a4)+ dbra d1,DtkC1 move.w a6,d1 btst #0,d1 beq.s DtkC2 addq.l #1,a6 DtkC2: move.b d0,(a4)+ bra DtkLoop * Detokenise un chiffre entier DtkC3: move.l (a6)+,d0 move.l a4,a0 JJsrR L_LongToDec,a1 move.l a0,a4 bra DtkLoop * Detokenise un chiffre HEXA DtkC4: move.l (a6)+,d0 move.l a4,a0 JJsrR L_LongToHex,a1 move.l a0,a4 bra DtkLoop * Detokenise un chiffre BINAIRE DtkC5: move.l (a6)+,d0 move.l a4,a0 JJsrR L_LongToBin,a1 move.l a0,a4 bra DtkLoop * Detokenise un chiffre FLOAT simple precision DtkC6: move.l (a6)+,d0 move.l a4,a0 moveq #-1,d4 moveq #0,d5 JJsrR L_FloatToAsc,a1 exg a0,a4 bra.s DtkC8 * Detokenise un chiffre FLOAT double precision DtkC7 move.l (a6)+,d0 move.l (a6)+,d1 pea 2.w Automatique pea 15.w 15 maxi move.l a4,-(sp) Buffer move.l d1,-(sp) Le chiffre move.l d0,-(sp) JJsrR L_DoubleToAsc,a1 lea 20(sp),sp move.l a4,a0 .Fin tst.b (a4)+ bne.s .Fin subq.l #1,a4 ; Si pas 0.0, le met! DtkC8 move.b (a0)+,d0 * Si pas de .0, le met! beq.s DtkC9 cmp.b #".",d0 beq DtkLoop cmp.b #"E",d0 beq DtkLoop bra.s DtkC8 DtkC9 move.b #".",(a4)+ move.b #"0",(a4)+ bra DtkLoop ******* Token d'extension DtkX: bra DtkLoop ******* REMarque DtkRem: addq.w #2,a6 Saute la longueur DtkR: tst.b (a6) beq DtkLoop move.b (a6)+,(a4)+ bra.s DtkR ******* Fin de la DETOKENISATION DtkFin: sub.l a2,a4 * Ramene PX move.w a4,-2(a2) move.l a4,a0 move.w (sp)+,d0 movem.l (sp)+,d2-d7/a2-a6 rts ; RAMENE LA TAILLE DE L'INSTRUCTION D0 en D1 ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ TInst: tst.w d0 beq TFin cmp.w #_TkLGo,d0 bls TVar cmp.w #_TkCh1,d0 beq TCh cmp.w #_TkCh2,d0 beq TCh cmp.w #_TkRem1,d0 beq TCh cmp.w #_TkRem2,d0 beq TCh cmp.w #_TkDFl,d0 beq.s T8 cmp.w #_TkFl,d0 bls.s T4 cmp.w #_TkExt,d0 beq.s T4 cmp.w #_TkFor,d0 beq.s T2 cmp.w #_TkRpt,d0 beq.s T2 cmp.w #_TkWhl,d0 beq.s T2 cmp.w #_TkDo,d0 beq.s T2 cmp.w #_TkExit,d0 beq.s T4 cmp.w #_TkExIf,d0 beq.s T4 cmp.w #_TkIf,d0 beq.s T2 cmp.w #_TkElse,d0 beq.s T2 cmp.w #_TkElsI,d0 beq.s T2 cmp.w #_TkData,d0 beq.s T2 cmp.w #_TkProc,d0 beq.s T8 cmp.w #_TkOn,d0 beq.s T4 cmp.w #_TkEqu,d0 bcs.s T0 cmp.w #_TkStruS,d0 bls.s T6 T0: moveq #1,d1 TFin: rts T2: addq.l #2,a0 bra.s T0 T4: addq.l #4,a0 bra.s T0 T8: addq.l #8,a0 bra.s T0 T6: addq.l #6,a0 bra.s T0 TCh: add.w (a0)+,a0 move.w a0,d1 btst #0,d1 beq.s T0 addq.l #1,a0 bra.s T0 TVar: moveq #0,d1 move.b 2(a0),d1 lea 4(a0,d1.w),a0 bra.s T0 ; Passe en minuscules ; ~~~~~~~~~~~~~~~~~~~~~~~~~ Minus: cmp.b #"A",d0 bcs.s .Skip cmp.b #"Z",d0 bhi.s .Skip add.b #"a"-"A",d0 .Skip rts ; Table des operateurs ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Dtk_Operateurs dc.w 1,1 dc.b " xor"," "+$80,"O00",-1 dc.w 1,1 dc.b " or"," "+$80,"O00",-1 dc.w 1,1 dc.b " and"," "+$80,"O00",-1 dc.w 1,1 dc.b "<",">"+$80,"O20",-1 dc.w 1,1 dc.b ">","<"+$80,"O20",-1 dc.w 1,1 dc.b "<","="+$80,"O20",-1 dc.w 1,1 dc.b "=","<"+$80,"O20",-1 dc.w 1,1 dc.b ">","="+$80,"O20",-1 dc.w 1,1 dc.b "=",">"+$80,"O20",-1 dc.w 1,1 dc.b "="+$80,"O20",-1 dc.w 1,1 dc.b "<"+$80,"O20",-1 dc.w 1,1 dc.b ">"+$80,"O20",-1 dc.w 1,1 dc.b "+"+$80,"O22",-1 dc.w 1,1 dc.b "-"+$80,"O22",-1 dc.w 1,1 dc.b " mod"," "+$80,"O00",-1 dc.w 1,1 dc.b "*"+$80,"O00",-1 dc.w 1,1 dc.b "/"+$80,"O00",-1 dc.w 1,1 dc.b "^"+$80,"O00",-1 even Dtk_OpFin dc.l 0 ExtNot dc.b "Extension ",$80 Even