amos-professional/AMOSPro Sources/+Token.s
2020-04-26 02:58:13 +02:00

1044 lines
19 KiB
ArmAsm
Raw Blame History

; ______________________________________________________________________________
; ..............................................................................
; ...................................................................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 <EFBFBD> 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 <20> detokeniser
; A1: Buffer
; D0: Adresse <20> 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