amos-professional/+Verif.s

5322 lines
108 KiB
ArmAsm
Raw Permalink 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........................| GESTION SOURCE
; .200002........................................| CHARGEMENT / TEST / VERIF
; 220002.........................................|______________________________
; ______________________________________________________________________________
;
; Published under the MIT Licence
;
; Copyright (c) 1992 Europress Software
; Copyright (c) 2020 Francois Lionet
;
; Permission is hereby granted, free of charge, to any person
; obtaining a copy of this software and associated documentation
; files (the "Software"), to deal in the Software without
; restriction, including without limitation the rights to use,
; copy, modify, merge, publish, distribute, sublicense, and/or
; sell copies of the Software, and to permit persons to whom the
; Software is furnished to do so, subject to the following
; conditions:
;
; The above copyright notice and this permission notice shall be
; included in all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
; ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
; THE USE OR OTHER DEALINGS IN THE SOFTWARE.
;
; ______________________________________________________________________________
Reloc_Step equ 1024
TablA_Step equ 1024
Reloc_End equ $80
Reloc_Var equ $82
Reloc_Long equ $84
Reloc_NewBuffer equ $86
Reloc_Proc1 equ $88
Reloc_Proc2 equ $8A
Reloc_Proc3 equ $8C
Reloc_Proc4 equ $8E
Reloc_Debug equ $90
Reloc_Label equ $92
;_____________________________________________________________________________
;
; Test en mode direct
;_____________________________________________________________________________
;
VerDirect
Ver_Direct
tst.l VarBuf(a5) Buffer general deja reserve?
bne.s .PaVar
move.l #4*1024,d1
bsr ResVarBuf
.PaVar bsr ResDir Espace pour variables directes
tst.l VNmMini(a5) Buffer noms deja reserve?
bne.s .PaNom
move.l PI_VNmMax(a5),d1
bsr ResVNom
.PaNom tst.w Stack_Size(a5) Buffer des boucles deja reserve?
bne.s .PaSt
move.w #10,Stack_Size(a5)
.PaSt move.l Ed_BufT(a5),Prg_Test(a5) Adresse de test
move.l Prg_Test(a5),Prg_Run(a5) Adresse de run
clr.l Edt_Runned(a5) Securites!
clr.l Prg_Runned(a5)
move.w #1,Phase(a5) Parametres de test
move.w #1,DirFlag(a5)
bsr SsTest
bsr Free_VerTables Efface les tables
bsr Ver_Run Table de tokens
rts
;_____________________________________________________________________________
;
; Test du programme
;_____________________________________________________________________________
;
PTest:
movem.l a2-a4/a6/d2-d7,-(sp)
clr.b VerNot1.3(a5) Compatible, au depart...
; Recherche les includes / Met l'adresse du programme <20> runner...
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l Prg_Source(a5),Prg_Run(a5) Par defaut
bsr Get_Includes
tst.l Prg_FullSource(a5) Faut-il changer?
beq.s .Skip
move.l Prg_FullSource(a5),Prg_Run(a5)
.Skip move.l Prg_Run(a5),Prg_Test(a5) A tester
; RAZ de toutes les variables
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l #8*1024,d1
bsr ResVarBuf
move.l PI_VNmMax(a5),d1
bsr ResVNom
clr.w Phase(a5)
clr.w ErrRet(a5)
clr.w DirFlag(a5)
clr.w VarBufFlg(a5)
move.w #51,Stack_Size(a5)
clr.b Prg_Accessory(a5)
clr.b MathFlags(a5) Plus de double precision
clr.b Ver_SPConst(a5) Plus de flags
clr.b Ver_DPConst(a5)
clr.l VerNInst(a5)
; PHASE 1: exploration du programme principal
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ReVer clr.w VarLong(a5)
move.l DVNmBas(a5),a0
move.l a0,VNmHaut(a5)
clr.w -(a0)
move.l a0,VNmBas(a5)
bsr SsTest
bne.s .ReVer
move.l Ver_TablA(a5),d0
move.l d0,Ver_MainTablA(a5) Stocke la table
beq.s .Skop
addq.l #4,d0 Si table il y a
.Skop clr.l Ver_TablA(a5) Une nouvelle table
move.l VNmBas(a5),DVNmBas(a5) Variables
move.l VNmHaut(a5),DVNmHaut(a5)
move.w VarLong(a5),GloLong(a5)
; Exploration de la TablA a la recherche des procedures
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tst.l d0 Une table?
beq.s .Fini
.PLoop move.l d0,a0
cmp.b #1<<VF_Proc,Vta_Flag(a0) Une procedure?
beq.s .Test
move.l (a0),d0
bne.s .PLoop
bra.s .Fini
; Verification de la procedure
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Test move.l (a0),-(sp) La suivante
move.l Vta_Prog(a0),Prg_Test(a5) Va explorer la procedure!
addq.w #1,Phase(a5) Une phase de plus
clr.w VarLong(a5)
move.l DVNmBas(a5),a0
move.l a0,VNmHaut(a5)
clr.w -(a0)
move.l a0,VNmBas(a5)
bsr Locale Toutes les variables >>> locales
bsr SsTest
move.l Prg_Test(a5),a0 Longueur variable procedure
move.w VarLong(a5),6(a0)
move.l (sp)+,d0
bne.s .PLoop
.Fini
; Libere l'espace pour les variables globales
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l LabBas(a5),a1
clr.l -(a1)
move.w #-1,-(a1) * Marque la fin des variables
move.l a1,a0
sub.w GloLong(a5),a0
cmp.l HiChaine(a5),a0
bcs VerVNm
move.l a0,VarGlo(a5)
move.l a0,VarLoc(a5)
move.l a0,TabBas(a5)
move.l a1,d0 * Nettoie les variables globales
sub.l a0,d0
beq.s .Clr3
lsr.l #2,d0
bcc.s .Clr1
clr.w (a0)+
.Clr1 subq.w #1,d0
.Clr2 clr.l (a0)+
dbra d0,.Clr2
.Clr3
; Rend toutes les variables GLOBALES
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Globale
; Libere les tables
; ~~~~~~~~~~~~~~~~~
bsr Free_VerTables
; Remet la table de tokenisation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Ver_Run
; Verification compatibilite sur le nombre de banques
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clr.b VerCheck1.3(a5) Plus de check 1.3
move.l Cur_Banks(a5),a0
bra.s .Next
.Loop move.l d0,a0
cmp.l #16,8(a0) Numero de la banque
bhi.s .Non
.Next move.l (a0),d0
bne.s .Loop
beq.s .Oui
.Non move.b #1,VerNot1.3(a5) Flag, directement...
.Oui
; Termine!!!
; ~~~~~~~~~~
movem.l (sp)+,a2-a4/a6/d2-d7
rts
; Libere les tables de verification
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Free_VerTables
bsr Free_Reloc
bsr Free_TablA La courante
move.l Ver_MainTablA(a5),Ver_TablA(a5)
clr.l Ver_MainTablA(a5)
bsr Free_TablA La principale
rts
; Met le flag 1.3!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SetNot1.3
move.b #1,VerNot1.3(a5)
tst.b VerCheck1.3(a5)
bne.s .Stop
rts
.Stop moveq #47,d0
bra VerErr
; Sous programme de verification
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SsTest: clr.l ErrRet(a5)
clr.w Passe(a5)
clr.w Ver_NBoucles(a5)
clr.w Ver_PBoucles(a5)
bsr Ver_Verif
bsr Reserve_Reloc
bsr Reserve_TablA
move.l Prg_Test(a5),a6
move.l a6,a3
tst.w DirFlag(a5)
bne.s VerD
tst.w Phase(a5)
bne.s VerDd
; Debut d'une ligne
; ~~~~~~~~~~~~~~~~~
VerD move.l a6,VDLigne(a5)
tst.w (a6)+
beq VerX
; Definition procedures / Data en debut de ligne
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerDd: move.l a6,VerPos(a5)
move.w (a6)+,d0
beq.s VerD
bmi VerSynt
move.l AdTokens(a5),a0
move.b 0(a0,d0.w),d1
bpl.s VLoop1
addq.l #1,VerNInst(a5)
ext.w d1
asl.w #2,d1
jmp .Jmp(pc,d1.w)
bra VerSha FA-Global (Nouvelle maniere)
bra VerSha FB-Shared
bra VerDFn FC-Def Fn
bra VerData FD-Debut data
bra V1_EndProc FE-Fin procedure
bra V1_Procedure FF-Debut procedure
.Jmp
; Boucle de test dans une ligne
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerLoop move.l a6,VerPos(a5) Position du test
move.w (a6)+,d0
beq VerD
bmi VerSynt
move.l AdTokens(a5),a0
move.b 0(a0,d0.w),d1
VLoop1 addq.l #1,VerNInst(a5) Un instruction de plus!
ext.w d1
asl.w #2,d1
jmp .Jmp(pc,d1.w) Branche <EFBFBD> la fonction
; Table des sauts pour les instructions particulieres
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bra VerShal FA-Global (Nouvelle maniere)
bra VerShal FB-Shared
bra VerDaL FC-Def Fn
bra VerDaL FD-Debut data
bra VerPDb FE-Fin procedure
bra VerPDb FF-Debut procedure
.Jmp bra Ver_Normal 00-Instruction normale
bra VerSynt 01-Syntax error
bra VerRem 02-Rem
bra VerSBu 03-Set Buffer
bra VerDPre 04-Set Double Precision
bra VerSStack 05-Set Stack
bra VerVar 06-Variable
bra VerLab 07-Un label
bra VerPro 08-Un appel de procedure
bra VerDim 09-DIM
bra VerPr 0A-Print
bra VerDPr 0B-Print #
bra VerInp 0C-Input / Line Input
bra VerDInp 0D-Input #
bra VerInc 0E-Dec
bra V1_Proc 0F-Proc
IFNE Debug=2
bra V1_Debug 10- Debugging
ENDC
IFEQ Debug=2
bra Ver_Normal
ENDC
bra VerPal 11-Default Palette
bra VerPal 12-Palette
bra VerRead 13-Read
bra VerRest 14-Restore
bra VerChan 15-Channel
bra VerInc 16-Inc
bra VerAdd 17-Add
bra VerPo 18-Polyline/Gon
bra VerFld 19-Field
bra VerCall 1A-Call
bra VerMn 1B-Menu
bra VerMnD 1C-Menu Del
bra VerSmn 1D-Set Menu
bra VerMnK 1E-Menu Key
bra VerIMn 1F-Menu diverse
bra VerFade 20-Fade
bra VerSort 21-Sort
bra VerSwap 22-Swap
bra VerFol 23-Follow
bra VerSetA 24-Set Accessory
bra VerTrap 25-Trap
bra VerStruI 26-Struc
bra VerStruIS 27-Struc$
bra Ver_Extension 28-Token d'extension
bra Ver_NormalPro 29-Instruction AMOSPro
bra Ver_DejaTesteePro 2A-Instruction AMOSPro deja testee
bra Ver_VReservee 2B-Variable reservee
bra Ver_VReserveePro 2C-Variable reservee AMOSPro
bra Ver_DejaTestee 2D-Instruction normale deja testee
bra VerD 2E-LIBRE
bra VerD 2F-Fin de ligne
bra V1_For 30-For
bra V1_Next 31-Next
bra V1_Repeat 32-Repeat
bra V1_Until 33-Until
bra V1_While 34-While
bra V1_Wend 35-Wend
bra V1_Do 36-Do
bra V1_Loop 37-Loop
bra V1_Exit 38-Exit
bra V1_ExitI 39-Exit If
bra V1_If 3A-If
bra V1_Else 3B-Else
bra V1_ElseIf 3C-ElseIf
bra V1_EndI 3D-EndIf
bra V1_Goto 3E-Goto
bra V1_Gosub 3F-Gosub
bra V1_OnError 40-OnError
bra V1_OnBreak 41-OnBreak
bra V1_OnMenu 42-OnMenu
bra V1_On 43-On
bra V1_Resume 44-Resume
bra V1_ResLabel 45-ResLabel
bra V1_PopProc 46-PopProc
bra V1_Every 47-Every
bra VerPr 48-LPrint
bra VerInp 49-Line Input
bra VerDInp 4A-Line Input #
bra VerMid 4B-Mid3
bra VerMid 4C-Mid2
bra VerMid 4D-Left
bra VerMid 4E-Right
bra VerAdd 4F-Add
bra Ver_NormalPro 50-Dialogues
bra Ver_Normal 51-Dir
bra VerSynt 52-Then
bra Ver_Normal 53-Return
bra Ver_Normal 54-Pop
bra Ver_NormalPro 55-Procedure langage machine
bra Ver_Normal 56-Bset/Bchg/Ror///
bra VerSynt 57-APCmp Call
IFNE Debug=2
V1_Debug
move.b #Reloc_Debug,d0 Dans relocation
bsr New_Reloc
lea V2_Debug(pc),a0 Dans TablA
move.w #_TkDP,d0
moveq #0,d1
moveq #1<<VF_Debug,d2
bsr Init_TablA
bra VerDP
V2_Debug
jsr BugBug
rts
ENDC
; Une extension
; ~~~~~~~~~~~~~~~~~~~
Ver_Extension
bset #0,VarBufFlg(a5)
move.b (a6)+,d1 Numero de l'extension
ext.w d1
move.l a6,-(sp) Position du nombre de params
tst.b (a6)+
move.w (a6)+,d0 Token de l'extension
lsl.w #2,d1
lea AdTokens(a5),a0
tst.l 0(a0,d1.w) Extension definie?
beq VerExN
move.l 0(a0,d1.w),a0
clr.w -(sp) Flag librairie 2.0 ou ancienne
btst #LBF_20,LB_Flags(a0) Librarie 2.0?
beq.s .Skip
move.w #-1,(sp)
.Skip move.l a0,VerBase(a5) Base de la librairie
bsr Ver_OlDInst Debut de la definition
cmp.b #"I",d0 Une instruction
beq.s .Inst
cmp.b #"V",d0 Une variable reservee?
bne VerSynt
bsr VerVR
bra.s .Poke
.Inst bsr VerI Verification
.Poke tst.w (sp)+ Le flag
move.l (sp)+,a0 Poke le nombre de params...
beq.s .Old
move.b #-1,(a0) Nouvelle extension: pas de params!
bra VerDP
.Old move.b d0,(a0) Ancienne extension: des params...
bra VerDP
; Variable reservee
; ~~~~~~~~~~~~~~~~~~~~~~~
Ver_VReserveePro
bsr SetNot1.3 Si AMOSPro
Ver_VReservee
bset #0,VarBufFlg(a5)
move.l a0,VerBase(a5)
bsr Ver_DInst
bsr VerVR
bra VerDP
; Routine de verification VARIABLE RESERVEE en instruction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerVR: move.b (a0)+,d2
move.w d2,-(sp)
bsr VerF
move.w d0,-(sp)
move.l a6,VerPos(a5)
cmp.w #_TkEg,(a6)+
bne VerSynt
bsr Ver_Expression
move.w (sp)+,d0
move.w (sp)+,d1
cmp.b d1,d2
bne VerType
rts
; Instruction deja testee
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_DejaTesteePro
bsr SetNot1.3 Si AMOSPro
Ver_DejaTestee
bset #0,VarBufFlg(a5)
bsr Ver_DInst
bsr VerI_DejaTestee
bra VerDP
; Instruction normale
; ~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_NormalPro
bsr SetNot1.3 Si AMOSPro
Ver_Normal
bset #0,VarBufFlg(a5)
move.l a0,VerBase(a5)
bsr Ver_DInst
bsr VerI
; Veut un deux points apres l'instruction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerDP: move.l a6,VerPos(a5)
move.w (a6)+,d0
beq VerD
cmp.w #_TkDP,d0
beq VerLoop
cmp.w #_TkElse,d0
bne VerSynt
subq.l #2,a6
bra VerLoop
; PASSE2: simple relecture du programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerX: addq.w #1,Passe(a5)
move.b #Reloc_End,d0
bsr New_Reloc
; Boucle de relocation des variables / labels / appel procedures
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l Ver_Reloc(a5),a4
move.l a4,Ver_CReloc(a5)
addq.l #4,a4
move.l Prg_Test(a5),a6
.RReloc moveq #0,d6
.Reloc add.w d6,a6
move.b (a4)+,d6
lsl.b #1,d6
bcc.s .Reloc
jsr .V2Jmp(pc,d6.w)
bra.s .RReloc
.V2Jmp bra V2_EndRel
bra V2_StoVar
bra V2_Long
bra V2_NTable
bra V2_CallProc1
bra V2_CallProc2
bra V2_CallProc3
bra V2_CallProc4
IFNE Debug=2
bra V2_Debug A
ENDC
IFEQ Debug=2
rts
nop
ENDC
; Find label
; ~~~~~~~~~~
move.l a6,VerPos(a5) C
subq.l #2,VerPos(a5)
bsr V2_FindLabel
beq VerUnd
rts
; Nouvelle table de relocation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_NTable
move.l Ver_CReloc(a5),a4
move.l (a4),a4
move.l a4,Ver_CReloc(a5)
addq.l #4,a4
rts
; Saut long dans relocation
; ~~~~~~~~~~~~~~~~~~~~~~~~~
V2_Long moveq #0,d6
move.b (a4)+,d6
lsl.w #8,d6
move.b (a4)+,d6
add.l d6,a6
rts
; Fin de la relocation
; ~~~~~~~~~~~~~~~~~~~~
V2_EndRel
addq.l #4,sp
; Boucle d'appel des traitement de boucle
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l Ver_TablA(a5),d0
beq.s .TablX
addq.l #4,d0
.TablA move.l d0,a4
move.l Vta_Jump(a4),d0
beq.s .TablB
move.l d0,a1
move.l Vta_Prog(a4),a6
move.l a6,VerPos(a5)
subq.l #2,VerPos(a5)
move.l a4,a0
jsr (a1)
.TablB move.l (a4),d0
bne.s .TablA
.TablX
; Efface la relocation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Free_Reloc
; Fin des deux passes, erreur retardee?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l ErrRet(a5),d0
beq.s .Skip
move.l ErrRAd(a5),VerPos(a5)
bra VerErr
.Skip moveq #0,d0 Ne pas reboucler...
rts
******* MESSAGES D'ERREUR VERIFICATION
* Loops crossing / ERREUR RETARDEE
VerCrs: move.l a0,-(sp)
moveq #1,d0 Bad Structure
bsr ERetard
move.l (sp)+,a0
rts
ERetard:tst.l ErrRet(a5)
bne.s ERet1
move.l d0,ErrRet(a5)
move.l VerPos(a5),ErrRAd(a5)
ERet1: rts
* User function
VerNFn moveq #2,d0
bra VerEr
* Impossible to change buffer
VerNoB moveq #3,d0
bra VerEr
* Datas en debut de ligne
VerDaL: moveq #4,d0
bra VerEr
* Extension not present
VerExN: moveq #5,d0
bra VerEr
* Too many direct variables
VerVTo: moveq #6,d0
bra VerEr
* Illegal direct mode
VerIlD: moveq #7,d0
bra.s VerEr
* Buffer variable too small
VerVNm: moveq #8,d0
bra.s VerEr
* Goto dans une boucle
VerPaGo:moveq #9,d0
bra.s VerEr
* Structure too long
VerLong:moveq #10,d0
bra.s VerEr
* Shared
VerShp: moveq #11,d0
bra.s VerEr
VerAlG: moveq #12,d0
bra.s VerEr
VerPaG: moveq #13,d0
bra.s VerEr
VerNoPa:moveq #14,d0
bra.s VerEr
VerShal:moveq #15,d0
bra.s VerEr
* Procedures
VerPDb: moveq #16,d0
bra.s VerEr
VerPOp: moveq #17,d0
bra.s VerEr
VerPNo: moveq #18,d0
bra.s VerEr
VerPRTy:moveq #18,d0
bra.s VerEr
VerIlP: moveq #19,d0
bra.s VerEr
VerUndP:moveq #20,d0
bra.s VerEr
* Else without If
VerElI: moveq #21,d0
VerEr: bra VerErr
VerIfE: moveq #22,d0
bra VerErr
VerEIf: moveq #23,d0
bra VerErr
VerElE: moveq #24,d0
bra VerErr
VerNoT: moveq #25,d0
bra VerErr
* Not enough loop
VerNoL: moveq #26,d0
bra VerErr
* Do/Loop
VerDoL: moveq #27,d0
bra VerErr
VerLDo: moveq #28,d0
bra.s VerErr
* While/Wend
VerWWn: moveq #29,d0
bra.s VerErr
VerWnW: moveq #30,d0
bra.s VerErr
* Repeat/until
VerRUn: moveq #31,d0
bra.s VerErr
VerUnR: moveq #32,d0
bra.s VerErr
* For/Next
VerFoN: moveq #33,d0
bra.s VerErr
VerNFo: moveq #34,d0
bra.s VerErr
* Syntax
VerSynt:moveq #35,d0
bra.s VerErr
* Out of mem
VerOut: moveq #36,d0
bra.s VerErr
* Out of variable name space
VerNmO: moveq #37,d0
bra.s VerErr
* Non dimensionned
VerNDim moveq #38,d0
bra.s VerErr
* Already dimensionned
VerAlD: moveq #39,d0
bra.s VerErr
* Type mismatch
VerType moveq #40,d0
bra.s VerErr
* Label not defined
VerUnd: moveq #41,d0
bra.s VerErr
* Label defined twice
VerLb2: moveq #42,d0
; Traitement message d'erreur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerErr move.l d0,-(sp)
; Remet les tokens
; ~~~~~~~~~~~~~~~~
bsr Ver_Run
; Efface les buffers d'inclusion
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l VerPos(a5),a0
bsr Includes_Adr
move.l a0,VerPos(a5)
bsr Includes_Clear
; Efface les equates
; ~~~~~~~~~~~~~~~~~~
jsr D_Close
; Efface les tables
; ~~~~~~~~~~~~~~~~~
bsr Free_VerTables
; Plus de check1.3
; ~~~~~~~~~~~~~~~~
clr.b VerCheck1.3(a5)
; Depile le programme
; ~~~~~~~~~~~~~~~~~~~
move.l Prg_JError(a5),a2
bsr Prg_Pull
; Branche <20> l'appelant
; ~~~~~~~~~~~~~~~~~~~~
move.l (sp)+,d0
neg.l d0 Message negatif= TEST
sub.l a0,a0 Trouver le message
jmp (a2) On branche
; REM
; ~~~~~~~~~
VerRem tst.w Direct(a5)
bne VerIlD
add.w (a6)+,a6
addq.l #2,a6
bra VerD
; Token appel procedure, change en variable
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerPro tst.w Direct(a5)
bne VerIlD
; Variable en instruction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerVar bset #0,VarBufFlg(a5)
bsr V1_IVariable
bra VerDP
; D<>finition d'un label
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerLab: tst.w Direct(a5)
bne VerIlD
bset #0,VarBufFlg(a5)
bsr V1_StockLabel
cmp.w #_TkData,(a6)
bne VerLoop
addq.l #2,a6
bra VerData
; SET DOUBLE PRECISION
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
VerDPre bsr SetNot1.3
btst #0,VarBufFlg(a5)
bne.s VVErr
bset #1,VarBufFlg(a5)
bne.s VVErr
move.b #%10000011,MathFlags(a5)
bra VerDP
VVErr moveq #50,d0
bra VerErr
; SET STACK n
; ~~~~~~~~~~~~~~~~~
VerSStack
tst.w Direct(a5)
bne VerIlD
btst #0,VarBufFlg(a5)
bne.s VVErr
bset #3,VarBufFlg(a5)
bne.s VVErr
cmp.w #_TkEnt,(a6)+
bne VerSynt
move.l (a6)+,d1
cmp.w #10,d1
bcc.s .Ok
moveq #10,d1
.Ok addq.w #1,d1
move.w d1,Stack_Size(a5)
bra VerDP
; SET BUFFER n
; ~~~~~~~~~~~~~~~~~~
VerSBu tst.w Direct(a5)
bne VerIlD
btst #0,VarBufFlg(a5)
bne VerNoB
cmp.w #_TkEnt,(a6)+
bne VerSynt
move.l (a6)+,d1
mulu #1024,d1
cmp.l VarBufL(a5),d1
beq VerDP
; Change la taille / recommence
bset #2,VarBufFlg(a5)
bne VerNoB
bsr ResVarBuf
moveq #-1,d0
rts
; SET ACCESSORY
; ~~~~~~~~~~~~~~~~~~~
VerSetA bsr SetNot1.3
addq.b #1,Prg_Accessory(a5)
bra VerDP
; DIM
; ~~~~~~~~~
VerDim: bset #0,VarBufFlg(a5)
cmp.w #_TkVar,(a6)+ Veut une variable
bne VerSynt
and.b #%00001111,3(a6) RAZ du flag!
bsr VarA0
cmp.w #_TkPar1,(a0) TABLEAU?
bne VerSynt
bset #6,3(a6) Met le flag tableau!
move.b 3(a6),d3
bsr V1_StoVar
beq VerAlD
bsr VerTablo Verifie les params d'un tableau
move.b d0,4(a1) Stocke le nb de dimensions
cmp.w #_TkVir,(a6)+ Une autre variable?
beq VerDim
subq.l #2,a6
bra VerDP
; SORT
; ~~~~~~~~~~
VerSort bset #0,VarBufFlg(a5)
move.l a6,-(sp)
bsr VerGV
move.l (sp)+,a0
btst #6,5(a0)
bne VerDP
bra VerSynt
; SWAP
; ~~~~~~~~~~
VerSwap bset #0,VarBufFlg(a5)
bsr VerGV
move.w d2,-(sp)
cmp.w #_TkVir,(a6)+
bne VerSynt
bsr VerGV
cmp.w (sp)+,d2
beq VerDP
bne VerType
; DEF FN
; ~~~~~~~~~~~~
VerDFn bset #0,VarBufFlg(a5)
cmp.w #_TkVar,(a6)+
bne VerSynt
and.b #%00001111,3(a6) Change le flag
bset #3,3(a6)
bsr VarA0 Adresse
move.w d2,-(sp)
bsr V1_StoVar Stocke la variable
bsr VDfnR Recupere les parametres
cmp.w #_TkEg,(a6)+
bne VerSynt
bsr Ver_Expression Evalue l'expression
move.w (sp)+,d0 Verifie le type
cmp.b d0,d2
bne VerType
tst.w (a6) Seul sur la ligne
bne VerDaL
bra VerDP
; Routinette---> Prend les variables!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VDfnR cmp.w #_TkPar1,(a6)
bne.s .Exit
addq.l #2,a6
.Loop bsr VerGV
cmp.w #_TkVir,(a6)+
beq.s .Loop
cmp.w #_TkPar2,-2(a6)
bne VerSynt
.Exit rts
; Verification PRINT/LPRINT
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerDPr bsr Ver_ExpE
cmp.w #_TkVir,(a6)+
bne VerSynt
VerPr: bset #0,VarBufFlg(a5)
move.w (a6),d0
cmp.w #_TkDieze,d0
bne.s VerPr1
addq.l #2,a6
bsr Ver_Expression
cmp.b #"2",d2
beq VerType
cmp.w #_TkVir,(a6)
bne VerDP
addq.l #2,a6
VerPr1: bsr Finie
beq VerDP
move.l a6,VerPos(a5)
cmp.w #_TkUsing,(a6)
bne.s VerPr2
addq.l #2,a6
bsr Ver_ExpA
cmp.w #_TkPVir,(a6)+
bne VerSynt
VerPr2 bsr Ver_Expression
move.w (a6)+,d0
cmp.w #_TkVir,d0
beq.s VerPr1
cmp.w #_TkPVir,d0
beq.s VerPr1
subq.l #2,a6
bra VerDP
; Verification INPUT / LINE INPUT
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerDInp bsr Ver_ExpE
cmp.w #_TkVir,(a6)+
bne VerSynt
bra.s VerIn1
VerInp: bset #0,VarBufFlg(a5)
cmp.w #_TkVar,(a6)
beq.s VerIn1
bsr Ver_Expression
cmp.b #"2",d2
bne VerType
cmp.w #_TkPVir,(a6)+
bne VerSynt
VerIn1: bsr VerGV
cmp.w #_TkVir,(a6)+
beq.s VerIn1
cmp.w #_TkPVir,-2(a6)
beq VerDP
subq.l #2,a6
bra VerDP
; Verification PALETTE / DEFAULT PALETTE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerFa1: addq.l #2,a6
VerPal: clr.w d0
VPal: bset #0,VarBufFlg(a5)
addq.w #1,d0
move.w d0,-(sp)
bsr Ver_ExpE
move.w (sp)+,d0
cmp.w #_TkVir,(a6)
bne VerDP
addq.l #2,a6
cmp.w #32,d0
bcs.s VPal
bra VerDP
; Verification FADE
; ~~~~~~~~~~~~~~~~~~~~~~~
VerFade bset #0,VarBufFlg(a5)
bsr Ver_ExpE
cmp.w #_TkVir,d0
beq.s VerFa1
cmp.w #_TkTo,d0
bne VerDP
addq.l #2,a6
bsr Ver_ExpE
cmp.w #_TkVir,(a6)
bne VerDP
addq.l #2,a6
bsr Ver_ExpE
bra VerDP
; Verification instructions MENU
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Instruction MENU$(,,)=
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerMn bsr VerTablo
cmp.w #MnNDim,d0
bcc VerSynt
cmp.w #_TkEg,(a6)+
bne VerSynt
; Chaines alphanumeriques
; ~~~~~~~~~~~~~~~~~~~~~~~
cmp.w #_TkVir,(a6)
beq.s VerMn1
bsr Ver_ExpA
cmp.w #_TkVir,(a6)
bne VerDP
VerMn1 addq.l #2,a6
cmp.w #_TkVir,(a6)
beq.s VerMn2
bsr Ver_ExpA
cmp.w #_TkVir,(a6)
bne VerDP
VerMn2 addq.l #2,a6
cmp.w #_TkVir,(a6)
beq.s VerMn3
bsr Ver_ExpA
cmp.w #_TkVir,(a6)
bne VerDP
VerMn3 addq.l #2,a6
bsr Ver_ExpA
bra VerDP
; Instructions diverses flags
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerIMn bset #0,VarBufFlg(a5)
cmp.w #_TkPar1,(a6)
beq.s VIMn1
cmp.w #_TkMnCl,(a6)
bcc VerSynt
bsr Ver_ExpE
bra VerDP
VIMn1 bsr VerTablo
cmp.w #MnNDim,d0
bcc VerSynt
bra VerDP
; Menu del
; ~~~~~~~~~~~~~~
VerMnD bset #0,VarBufFlg(a5)
cmp.w #_TkPar1,(a6)
bne VerDP
bra.s VIMn1
; Set Menu
; ~~~~~~~~~~~~~~
VerSmn bset #0,VarBufFlg(a5)
bsr VerTablo
cmp.w #MnNDim,d0
bcc VerSynt
cmp.w #_TkTo,(a6)+
bne VerSynt
bsr Ver_ExpE
cmp.w #_TkVir,(a6)+
bne VerSynt
bsr Ver_ExpE
bra VerDP
; On menu
; ~~~~~~~~~~~~~
V1_OnMenu
move.w (a6)+,d0
cmp.w #_TkGto,d0
beq.s .Goto
cmp.w #_TkGsb,d0
beq.s .Goto
cmp.w #_TkPrc,d0
beq.s .Proc
bra VerSynt
; Goto, prend le label
; ~~~~~~~~~~~~~~~~~~~~
.Goto bsr V1_GoLabel
cmp.w #_TkVir,(a6)+
beq.s .Goto
subq.l #2,a6
bra VerDP
; Procedure
; ~~~~~~~~~
.Proc bsr V1_GoProcedureNoParam
cmp.w #_TkVir,(a6)+
beq.s .Proc
subq.l #2,a6
bra VerDP
; Menu key
; ~~~~~~~~~~~~~~
VerMnK bset #0,VarBufFlg(a5)
bsr VerTablo
cmp.w #MnNDim,d0
bcc VerSynt
cmp.w #_TkTo,(a6)
bne VerDP
addq.l #2,a6
bsr Ver_Evalue
cmp.b #"2",d2
beq VerDP
cmp.b #"0",d2
bne VerType
cmp.w #_TkVir,(a6)
bne VerDP
addq.l #2,a6
bsr Ver_ExpE
bra VerDP
; Verification FOLLOW
; ~~~~~~~~~~~~~~~~~~~~~~~~~
VerFol bsr Finie
beq VerDP
.Loop bsr Ver_Expression
cmp.w #_TkVir,(a6)+
beq.s .Loop
subq.l #2,a6
bra VerDP
; Verification DATAS
; ~~~~~~~~~~~~~~~~~~~~~~~~
VerData bset #0,VarBufFlg(a5)
move.l a6,d0
sub.l VDLigne(a5),d0
move.w d0,(a6)
.Loop addq.l #2,a6
bsr Ver_Expression
cmp.w #_TkVir,(a6)
beq.s .Loop
bra VerDP
; Verification READ
; ~~~~~~~~~~~~~~~~~~~~~~~
VerRead bset #0,VarBufFlg(a5)
bsr VerGV
cmp.w #_TkVir,(a6)
bne VerDP
addq.l #2,a6
bra.s VerRead
; Verification RESTORE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
VerRest bsr Finie
beq VerDP
bsr V1_GoLabel
bra VerDP
; Verification CHANNEL x TO SPRITE x
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerChan bset #0,VarBufFlg(a5)
bsr Ver_ExpE
cmp.w #_TkTo,(a6)+
bne VerSynt
move.w (a6)+,d0
cmp.w #_TkScD,d0
beq.s VerCh1
cmp.w #_TkScO,d0
beq.s VerCh1
cmp.w #_TkScS,d0
beq.s VerCh1
cmp.w #_TkBob,d0
beq.s VerCh1
cmp.w #_TkSpr,d0
beq VerCh1
cmp.w #_TkRn,d0
beq.s VerCh1
subq.l #2,a6 * Channel to ADRESS!
VerCh1: bsr Ver_ExpE
bra VerDP
; Verification POLYLINE/POLYGON
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerPo bset #0,VarBufFlg(a5)
cmp.w #_TkTo,(a6)
beq.s VerPo1
VerPo0 bsr Ver_ExpE
cmp.w #_TkVir,(a6)+
bne VerSynt
bsr Ver_ExpE
VerPo1 cmp.w #_TkTo,(a6)+
beq.s VerPo0
subq.l #2,a6
bra VerDP
; Verification MID/LEFT/RIGHT en instruction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerMid: bset #0,VarBufFlg(a5)
move.w d0,-(sp)
move.l a6,-(sp)
addq.b #1,Ver_NoReloc(a5)
addq.l #2,a6
bsr VerVarA
subq.b #1,Ver_NoReloc(a5)
cmp.w #_TkVir,(a6)+
bne VerSynt
move.l (sp)+,a6
move.w (sp)+,d0
move.l AdTokens(a5),a0
move.l a0,VerBase(a5)
bsr Ver_OlDInst
bsr VerF
cmp.w #_TkEg,(a6)+
bne VerSynt
bsr Ver_Expression
cmp.b #"2",d2
bne VerType
bra VerDP
; Verification INC/DEC
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
VerInc: bset #0,VarBufFlg(a5)
bsr VerVEnt
bsr VerGV
bra VerDP
; Verification ADD
; ~~~~~~~~~~~~~~~~~~~~~~
VerAdd: bset #0,VarBufFlg(a5)
move.w #_TkAd2,-2(a6)
move.l a6,-(sp)
bsr VerVEnt
bsr VerGV
cmp.w #_TkVir,(a6)+
bne VerSynt
bsr Ver_ExpE
cmp.w #_TkVir,(a6)
bne VerAdX
; Plus de 2 parametres
; ~~~~~~~~~~~~~~~~~~~~
move.l (sp),a0
move.w #_TkAd4,-2(a0)
addq.l #2,a6
bsr Ver_ExpE
cmp.w #_TkTo,(a6)+
bne VerAdX
bsr Ver_ExpE
VerAdX: addq.l #4,sp
bra VerDP
; Verification FIELD
; ~~~~~~~~~~~~~~~~~~~~~~~~
VerFld bset #0,VarBufFlg(a5)
bsr Ver_ExpE
cmp.w #_TkVir,(a6)
bne VerSynt
.Loop addq.l #2,a6
bsr Ver_ExpE
cmp.w #_TkAs,(a6)+
bne VerSynt
bsr VerVarA
cmp.w #_TkVir,(a6)
beq.s .Loop
bra VerDP
; CALL
; ~~~~~~~~~~
VerCall bset #0,VarBufFlg(a5)
bsr Ver_ExpE
.Loop cmp.w #_TkVir,(a6)
bne VerDP
addq.l #2,a6
bsr Ver_Expression
bra.s .Loop
; STRUCTURE en instruction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerStruI
bset #0,VarBufFlg(a5)
bsr VStru
cmp.b #7,d2
bcc EquType
moveq #"0",d2
bra.s VStru2
VerStruIS
bsr VStru
cmp.b #6,d2
bne EquType
moveq #"2",d2
; Fin verification
VStru2 cmp.w #_TkEg,(a6)+
bne VerSynt
move.w d2,-(sp)
bsr Ver_Expression
ext.w d2
cmp.w (sp)+,d2
bne VerType
bra VerDP
; Routine verification
VStru move.l a6,-(sp)
addq.l #6,a6
cmp.w #_TkPar1,(a6)+
bne VerSynt
bsr Ver_Expression
cmp.b #"0",d2
bne VerType
cmp.w #_TkVir,(a6)+
bne VerSynt
move.l (sp)+,a1
lea Equ_Nul(pc),a0
bsr Equ_Verif
move.b 4(a1),d2
cmp.w #_TkPar2,(a6)+
bne VerSynt
rts
EquType moveq #54,d0
bra VerErr
; Verification d'un Equate / Structure
; A0= Header equate
; A1= Debut des donnees
; A6= Debut de la chaine
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Equ_Verif
bsr SetNot1.3 AMOSPro!
btst #7,5(a1) Flag, equate correct?
bne .Ok
; Poke l'equate dans le buffer, <20> la suite du header
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
movem.l a0-a2,-(sp)
move.l a1,-(sp)
move.l Buffer(a5),a2
.Cop move.b (a0)+,(a2)+
bne.s .Cop
subq.l #1,a2
move.w (a6),d0
cmp.w #_TkCh1,d0
beq.s .Ch
cmp.w #_TkCh2,d0
bne VerSynt
.Ch move.w 2(a6),d0
beq VerSynt
cmp.w #127,d0
bcc VerSynt
move.w d0,d2
move.l a2,a1
lea 4(a6),a0
subq.w #1,d0
.Lop2 move.b (a0)+,(a1)+
dbra d0,.Lop2
move.b #":",(a1)+
move.l Buffer(a5),a2
move.l a1,d2
sub.l a2,d2
; Va charger le fichier d'equates>>> A1/D1 positionnes
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Equ_Load
; Recherche dans le fichier
; ~~~~~~~~~~~~~~~~~~~~~~~~~
movem.l a1/d1/d2,-(sp)
moveq #0,d4
JJsr L_InstrFind ***
movem.l (sp)+,a1/d1/d2
tst.l d3
beq .NoDef
; Trouve: poke dans le listing
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea -1(a1,d3.l),a1
.Fnd cmp.b #":",(a1)+ Trouve le debut
bne.s .Fnd
clr.w -(sp)
move.l a1,a0
cmp.b #"-",(a0)
bne.s .Pam
addq.w #1,(sp)
addq.l #1,a0
.Pam moveq #0,d0 Pas de signe!
JJsrR L_ValRout,a1
bne.s .Bad
cmp.w #_TkFl,d1
beq.s .Bad
cmp.w #_TkDFl,d1
beq.s .Bad
tst.w (sp)+
beq.s .Pamm
neg.l d0
.Pamm move.l (sp),a2
move.l d0,(a2)
cmp.b #",",(a0)+
bne.s .Bad
move.b (a0),d0
sub.b #"0",d0
cmp.b #7,d0
bhi.s .Bad
move.b d0,4(a2)
bset #7,5(a2)
addq.l #4,sp
movem.l (sp)+,a0-a2
; Saute la variable alphanumerique
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Ok move.w 2(a6),d0
move.w d0,d1
and.w #1,d1
add.w d1,d0
lea 4(a6,d0.w),a6
rts
; Not defined!
; ~~~~~~~~~~~~
.NoDef moveq #51,d0
bra VerErr
; Bad equates file
; ~~~~~~~~~~~~~~~~
.Bad moveq #53,d0
bra VerErr
; Charge le fichier d'equates dans un buffer
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Equ_Load
movem.l a0/d2/d3,-(sp)
tst.l Equ_Base(a5)
bne .Ok
; Branche la routine de FLUSH equates
JLea L_Equ_Free,a0
lea Equ_FlushStructure(pc),a1
move.l a0,(a1)
SyCall AddFlushRoutine
; Charge le fichier
moveq #9,d0
JJsr L_Sys_GetMessage
JJsrR L_Sys_AddPath,a1
move.l #1005,d2
jsr D_Open
beq.s .Err
; Trouve la taille du fichier!
moveq #0,d2
moveq #1,d3
jsr D_Seek
moveq #0,d2
moveq #-1,d3
jsr D_Seek
; Reserve la memoire
move.l d0,d3
move.l #Fast|Public,d1
lea Equ_Base(a5),a0
bsr A5_Reserve
beq.s .Err
; Charge le fichier
move.l a0,d2
jsr D_Read
bne.s .Err
; Ferme le fichier
jsr D_Close
; Retourne l'adresse et la longueur
.Ok move.l Equ_Base(a5),a1
move.l -4(a1),d1
movem.l (sp)+,a0/d2/d3
rts
; Erreur!
.Err jsr D_Close
bsr Equ_Free
moveq #52,d0
bra VerErr
; Structure FLUSH pour les equates
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Equ_FlushStructure
dc.l 0
; Libere le fichier d'equates (ne pas bouger!)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Equ_Free
lea Equ_Base(a5),a0
bsr A5_Free
rts
; Routine, veut une variable numerique
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerVEnt move.l a6,-(sp)
cmp.w #_TkVar,(a6)+
bne VerSynt
bsr VarA0
tst.b d0
bne VerType
move.l (sp)+,a6
rts
; Routine, veut une variable seule alphanumerique
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerVarA:bsr VerGV
cmp.b #"2",d2
bne VerType
rts
; RouRoutine, veut une variable, SEULE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerGV: move.l a6,VerPos(a5)
cmp.w #_TkVar,(a6)+
bne VerSynt
and.b #%00001111,3(a6) RAZ du flag!
bsr VarA0
cmp.w #_TkPar1,(a0) TABLEAU?
bne.s VGv1
bset #6,3(a6) Met le flag tableau!
move.b 3(a6),d3
bsr V1_StoVar Le tableau doit etre cree avant
bne VerNDim
bsr VerTablo Verifie les params d'un tableau
bra.s VGv2
VGv1: bsr V1_StoVar
VGv2: rts
; Verification des procedures
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Instruction Proc
; ~~~~~~~~~~~~~~~~~~~~~~
V1_OnBreak
V1_Proc tst.w Direct(a5)
bne VerIlD
bset #0,VarBufFlg(a5)
cmp.w #_TkVar,(a6) Un variable?
beq.s .Skip
cmp.w #_TkPro,(a6) Un procedure
bne VerSynt
.Skip move.l a6,-(sp)
addq.l #2,a6
bsr V1_IVariable
move.l (sp)+,a0
cmp.w #_TkPro,(a0)
bne VerUndP
bra VerDP
; Debut de procedure
; ~~~~~~~~~~~~~~~~~~~~~~~~
V1_Procedure
bset #0,VarBufFlg(a5)
subq.l #2,a6
tst.w Direct(a5)
bne VerIlD
tst.w Phase(a5)
bne V1_ProcedureIn
; PHASE 0: Stocke et saute le nom et les params
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
subq.l #1,VerNInst(a5) Retabli le compte...
btst #6,8(a6) Decoder la procedure?
beq.s .Skip0
btst #5,8(a6)
beq.s .Skip0
bsr ProCode
.Skip0 sub.l a0,a0
move.w #_TkProc,d0
moveq #4,d1
moveq #1<<VF_Proc,d2
bsr Init_TablA
move.l a6,-(sp)
move.l a0,-(sp)
lea 10(a6),a6
cmp.w #_TkVar,(a6)+ Stocke dans les labels
bne VerSynt
and.b #$0F,3(a6)
or.b #$80,3(a6)
bsr V1_StockLabel
move.l 4(sp),4(a2) Pointe le DEBUT de la procedure!
cmp.w #_TkBra1,(a6)
bne.s .NoPar
.Par addq.l #2,a6
move.l a6,VerPos(a5)
cmp.w #_TkVar,(a6)+
bne VerSynt
and.b #$0F,3(a6)
move.b 2(a6),d0
ext.w d0
lea 4(a6,d0.w),a6
cmp.w #_TkVir,(a6)
beq.s .Par
move.l a6,VerPos(a5)
cmp.w #_TkBra2,(a6)+
bne VerSynt
.NoPar move.l a6,VerPos(a5)
move.w (a6),d0
bne VerPDb
addq.l #2,a6
; Saute une procedure COMPILED/LANGAGE MACHINE
move.l 4(sp),a0
btst #4,8(a0) Langage machine?
beq.s .EPLoop
cmp.w #_TkAPCmp,2(a6) Une procedure compilee AMOSPro?
bne.s .Noap
move.l a0,-(sp)
lea 2(a6),a0 Va reloger
bsr Ver_APCmp
bsr SetNot1.3
move.l (sp)+,a0
.Noap move.l 2(a0),d0 Et saute la procedure
lea 12(a0,d0.l),a6
bra.s .Comp
; Cherhe le ENDPROC
moveq #0,d0
.EPLoop move.b (a6),d0
beq VerPOp
move.w 2(a6),d1
cmp.w #_TkEndP,d1
beq.s .EndP
cmp.w #_TkSha,d1
beq.s .Shared
cmp.w #_TkGlo,d1
beq.s .Shared
.Resha add.w d0,a6
add.w d0,a6
bra.s .EPLoop
; Traite les variables shared
.Shared movem.l d0/a6,-(sp) Appel de shared / Global
addq.l #2,a6
bsr VpSha
movem.l (sp)+,d0/a6
bra.s .Resha
; END PROC trouve, prend la ligne suivante
.EndP add.w d0,a6 Pointe la ligne suivante
add.w d0,a6
.Comp subq.l #2,a6 Zero de la ligne precedente
move.l (sp)+,a0 TablA
move.l (sp)+,a1 Debut procedure
move.l a6,Vta_Variable(a0)
move.l a6,a0
sub.l a1,a0 Poke la distance au END PROC
lea -10(a0),a0
move.l a0,2(a1)
; Termine
addq.w #2,a6
bra VerD
; Procedure compilee: reloge le programme
; A0= Instruction ||APCmp||
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_APCmp
movem.l a0-a6/d0-d7,-(sp)
lea 2(a0),a6
move.w APrg_MathFlags(a6),d0 Prend les flags mathematiques
or.b d0,MathFlags(a5)
lsr.w #8,d0 Et le flag accessory...
move.b d0,Prg_Accessory(a5)
lea APrg_Relocation(a6),a1 Table de relocation
add.l (a1),a1
lea APrg_Program(a6),a2 Pointe le programme
move.l a2,d1
sub.l APrg_OldReloc(a6),d1 Ancienne relocation
beq.s .RFin Deja reloge!
move.l a2,APrg_OldReloc(a6)
.RLoop moveq #0,d0
move.b (a1)+,d0
beq.s .RFin
cmp.b #1,d0
bne.s .RReloc
lea 508(a2),a2
bra.s .RLoop
.RReloc lsl.w #1,d0
add.l d0,a2
move.l (a2),d0
add.l d1,(a2)
bra.s .RLoop
.RFin movem.l (sp)+,a0-a6/d0-d7
rts
; Procedure PHASE >0, Passe 1, stocke les variables!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_ProcedureIn
btst #4,8(a6) Procedure Machine?
bne.s .PMach
lea 12(a6),a6
move.b 2(a6),d0
ext.w d0
lea 4(a6,d0.w),a6
cmp.w #_TkBra1,(a6) Pointe les parametres
bne VerDP
.Loop addq.l #4,a6
bsr V1_StoVar
cmp.w #_TkVir,(a6)
beq.s .Loop
addq.l #2,a6
bra VerDP
.PMach move.w 6(a6),VarLong(a5) Recopie le nombre de params
bra VerX Et on sort!
; END PROC [expression]
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_EndProc
tst.w Direct(a5)
bne VerIlD
tst.w Phase(a5)
beq VerPNo
cmp.w #_TkBra1,(a6)+
bne.s .Skip
bsr Ver_Expression
.Skip bra VerX
; Verification des test, boucles et branchements
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Flags pour table-A
VF_Boucles equ 0
VF_If equ 1
VF_Proc equ 2
VF_Exit equ 3
VF_Goto equ 4
VF_Debug equ 5
; FOR / Passe 1
; ~~~~~~~~~~~~~~~~~~~
V1_For addq.w #1,Ver_NBoucles(a5) Une boucle de plus
add.w #TForNxt,Ver_PBoucles(a5)
lea V2_For(pc),a0
moveq #2,d1
bsr Init_TablABoucle
; Verification
clr.w (a6)+
movem.l a0/a6,-(sp)
bsr VerGV La variable
movem.l (sp)+,a0/a1
move.w 2(a1),Vta_Variable(a0) Stocke l'offset de la variable
cmp.b #"0",d2
bne VerType
move.w d2,-(sp) Verifie la suite
cmp.w #_TkEg,(a6)+ =
bne VerSynt
bsr Ver_Expression Expression
cmp.b 1(sp),d2 Meme type
bne VerType
move.l a6,VerPos(a5)
cmp.w #_TkTo,(a6)+ To
bne VerSynt
bsr Ver_Expression Expression
cmp.b 1(sp),d2 Meme type
bne VerType
cmp.w #_TkStp,(a6) Step?
bne.s .Skip
addq.l #2,a6
bsr Ver_Expression Expression
cmp.b 1(sp),d2 Meme type
bne VerType
.Skip addq.l #2,sp OK!
bra VerDP
; FOR / Passe 2 : cherche le NEXT
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_For move.l a0,a1
move.w #1<<VF_Boucles,d0 Flag <EFBFBD> trouver
move.w Vta_NBoucles(a0),d1 Position de pile
subq.w #1,d1
move.w #_TkNxt,d2 Token <EFBFBD> trouver
bsr Find_TablA
beq VerFoN For without Next
tst.b Vta_UFlag(a0) Une variable dans le NEXT?
beq.s .Skip
move.w Vta_Variable+4(a0),d0 La meme?
cmp.w Vta_Variable(a1),d0
bne VerFoN
.Skip clr.l Vta_Jump(a0) NEXT pris en compte
; Doke la distance au NEXT dans le FOR
move.l Vta_Variable(a0),d0
bsr Doke_Distance
rts
; NEXT / Passe 1
; ~~~~~~~~~~~~~~~~~~~~
V1_Next
subq.w #1,Ver_NBoucles(a5) Une boucle de moins
sub.w #TForNxt,Ver_PBoucles(a5)
lea VerNFo(pc),a0 Next without For
move.w #6,d1
bsr Init_TablABoucle
; Verification
move.l a0,-(sp)
bsr Finie Une variable?
beq.s .Skip
movem.l a0/a6,-(sp)
bsr VerGV
movem.l (sp)+,a0/a1
move.w 2(a1),Vta_Variable+4(a0) Stocke pointeur variable
addq.b #1,Vta_UFlag(a0) Flag pour For / Passe2
.Skip move.l (sp)+,a0
bsr Find_End Trouve la fin du NEXT
move.l d0,Vta_Variable(a0) Pour le for passe 2
bra VerDP
; REPEAT / Passe1
; ~~~~~~~~~~~~~~~~~~~~~
V1_Repeat
addq.w #1,Ver_NBoucles(a5) Une boucle de plus
add.w #TRptUnt,Ver_PBoucles(a5)
lea V2_Repeat(pc),a0
moveq #0,d1
bsr Init_TablABoucle
clr.w (a6)+
bra VerDP
; REPEAT / Passe2
; ~~~~~~~~~~~~~~~~~~~~~
V2_Repeat
move.l a0,a1
move.w #1<<VF_Boucles,d0 Flag <EFBFBD> trouver
move.w Vta_NBoucles(a0),d1 Position de pile
subq.w #1,d1
move.w #_TkUnt,d2 Token <EFBFBD> trouver
bsr Find_TablA
beq VerRUn Repeat without Until
clr.l Vta_Jump(a0) Until pris en compte
; Doke la distance au NEXT dans le FOR
move.l Vta_Variable(a0),d0
bsr Doke_Distance
rts
; UNTIL / Passe 1
; ~~~~~~~~~~~~~~~~~~~~~
V1_Until
subq.w #1,Ver_NBoucles(a5) Une boucle de moins
sub.w #TRptUnt,Ver_PBoucles(a5)
lea VerUnR(pc),a0
moveq #4,d1
bsr Init_TablABoucle
; Verification / Poke l'adresse de fin
move.l a0,-(sp)
bsr Ver_Expression
bsr Find_End
move.l (sp)+,a0
move.l d0,Vta_Variable(a0)
bra VerDP
; WHILE / Passe1
; ~~~~~~~~~~~~~~~~~~~~
V1_While
addq.w #1,Ver_NBoucles(a5) Une boucle de plus
add.w #TWhlWnd,Ver_PBoucles(a5)
lea V2_While(pc),a0
moveq #0,d1
bsr Init_TablABoucle
clr.w (a6)+
bsr Ver_Expression
bra VerDP
; WHILE / Passe2
; ~~~~~~~~~~~~~~~~~~~~
V2_While
move.l a0,a1
move.w #1<<VF_Boucles,d0 Flag <EFBFBD> trouver
move.w Vta_NBoucles(a0),d1 Position de pile
subq.w #1,d1
move.w #_TkWnd,d2 Token <EFBFBD> trouver
bsr Find_TablA
beq VerWWn Repeat without Until
clr.l Vta_Jump(a0) Wend pris en compte
; Doke la distance au NEXT dans le FOR
move.l Vta_Variable(a0),d0
bsr Doke_Distance
rts
; WEND / Passe1
; ~~~~~~~~~~~~~~~~~~~
V1_Wend
subq.w #1,Ver_NBoucles(a5) Une boucle de moins
sub.w #TWhlWnd,Ver_PBoucles(a5)
lea VerWnW(pc),a0
moveq #4,d1
bsr Init_TablABoucle
; Verification / Poke l'adresse de fin
bsr Find_End
move.l d0,Vta_Variable(a0)
bra VerDP
; DO / Passe1
; ~~~~~~~~~~~~~~~~~~
V1_Do addq.w #1,Ver_NBoucles(a5) Une boucle de moins
add.w #TDoLoop,Ver_PBoucles(a5)
lea V2_Do(pc),a0
moveq #0,d1
bsr Init_TablABoucle
clr.w (a6)+
bra VerDP
; DO / Passe2
; ~~~~~~~~~~~~~~~~~
V2_Do move.l a0,a1
move.b #1<<VF_Boucles,d0 Flag <EFBFBD> trouver
move.w Vta_NBoucles(a0),d1 Position de pile
subq.w #1,d1
move.w #_TkLoo,d2 Token <EFBFBD> trouver
bsr Find_TablA
beq VerDoL Repeat without Until
; Doke la distance au NEXT dans le FOR
clr.l Vta_Jump(a0) Loop pris en compte
move.l Vta_Variable(a0),d0
bsr Doke_Distance
rts
; LOOP / Passe1
; ~~~~~~~~~~~~~~~~~~~
V1_Loop
subq.w #1,Ver_NBoucles(a5) Une boucle de moins
sub.w #TDoLoop,Ver_PBoucles(a5)
lea VerLDo(pc),a0
moveq #4,d1
bsr Init_TablABoucle
; Verification / Poke l'adresse de fin
bsr Find_End
move.l d0,Vta_Variable(a0)
bra VerDP
; EXIT / Passe1
; ~~~~~~~~~~~~~~~~~~~
V1_Exit
lea V2_Exit(pc),a0
moveq #4,d1
moveq #1<<VF_Exit,d2
bsr Init_TablA
clr.l (a6)+
move.l #1,Vta_Variable(a0)
cmp.w #_TkEnt,(a6)
bne VerDP
move.l 2(a6),Vta_Variable(a0)
addq.l #6,a6
bra VerDP
; EXIT / Passe2
; ~~~~~~~~~~~~~~~~~~~
V2_ExitI
V2_Exit move.l a0,a1
move.l a6,a2
move.l Vta_Variable(a1),d3
move.b #1<<VF_Boucles,d0 Flag <EFBFBD> trouver
move.w Vta_NBoucles(a0),d1 Position de pile
sub.w d3,d1
bmi VerNoL Not enough loops
moveq #-1,d2 Pas de token
bsr Find_TablA
beq VerNoL Not enough loops
; Loke dans le source
move.l Vta_Variable(a0),d0
sub.l a2,d0
subq.l #4,d0
cmp.l #$10000,d0
bcc VerSynt
move.w Vta_PBoucles(a1),d1
sub.w Vta_PBoucles(a0),d1
move.w d0,(a2)+ Distance a la fin
move.w d1,(a2)+ Decalage de la pile
rts
; EXIT IF / Passe1
; ~~~~~~~~~~~~~~~~~~~~~~
V1_ExitI
lea V2_ExitI(pc),a0
moveq #4,d1
moveq #1<<VF_Exit,d2
bsr Init_TablA
move.l a0,-(sp)
clr.l (a6)+
bsr Ver_ExpE
move.l (sp)+,a0
move.l #1,Vta_Variable(a0)
cmp.w #_TkVir,(a6)
bne VerDP
cmp.w #_TkEnt,2(a6)
bne VerSynt
move.l 4(a6),Vta_Variable(a0)
addq.l #8,a6
bra VerDP
; IF Passe 1
; ~~~~~~~~~~~~~~~~
V1_If lea V2_If(pc),a0
moveq #8,d1
moveq #1<<VF_If,d2
bsr Init_TablA
clr.w (a6)+
move.l a6,Vta_Variable(a0)
move.l VDLigne(a5),Vta_Variable+4(a0)
; Verification
move.l a0,-(sp)
bsr Ver_ExpE
move.l (sp)+,a0
cmp.w #_TkThen,(a6)
bne VerDP
addq.l #2,a6
move.l a6,Vta_Variable(a0)
move.b #1,Vta_UFlag(a0)
lea V2_IfThen(pc),a1
move.l a1,Vta_Jump(a0)
cmp.w #_TkLGo,(a6)
bne VerLoop
bsr V1_SautLGoto
bra VerDP
; If non structure / Passe2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_IfThen
move.l a0,a1
; Cherche sur la meme ligne
move.l Vta_Variable+4(a1),d1
moveq #1,d2
.Loop tst.l (a0)
beq.s .NextL
move.l (a0),a0
cmp.b #1<<VF_If,Vta_Flag(a0)
bne.s .Loop
cmp.l Vta_Variable+4(a0),d1 Sur la meme ligne
bne.s .NextL
cmp.w #_TkElse,Vta_Token(a0) Else?
beq.s .Moins
cmp.w #_TkIf,Vta_Token(a0) If
bne.s .Loop
addq.w #1,d2
bra.s .Loop
.Moins subq.w #1,d2
bne.s .Loop
lea V2_ElseThen(pc),a2 Traitement du ELSE
move.l a2,Vta_Jump(a0)
move.l Vta_Variable(a0),d0
moveq #0,d2
bra.s V2_IfThenLabel
.NextL move.l Vta_Variable+4(a1),a6 Pointe la fin ligne
moveq #0,d0
move.b (a6),d0
add.w d0,a6
lea -2(a6,d0.w),a6
move.l a6,d0
moveq #0,d2
; Verifie le label goto apres le then
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_IfThenLabel
move.l a1,-(sp)
bsr V2_IfDoke
move.l (sp),a0
move.l Vta_Variable(a0),a6
cmp.w #_TkLGo,(a6)+
bne.s .Fin
bsr V2_FindLabel
beq VerUnd
move.l (sp),a0
bsr Goto_Loops
.Fin addq.l #4,sp
rts
; If structure / Passe 2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_If move.l a0,a1
move.w #_TkElse,d1 Tokens a trouver
move.w #_TkElsI,d2
move.w #_TkEndI,d3
bsr Find_TablATest Va chercher
beq VerIfE If without EndIf
move.w Vta_Token(a0),d0 Trouve le traitement de la passe 2
move.l Vta_Variable(a0),a6 Adresse de saut
cmp.w d0,d1 Else ?
beq.s .j1
cmp.w d0,d2 Else If ?
beq.s .j2
bsr Find_End
sub.l a2,a2 End If >>> Rien!
moveq #0,d2
bra.s .j0
.j2 lea V2_ElsI(pc),a2
moveq #1,d2
move.l a6,d0
bra.s .j0
.j1 lea V2_Else(pc),a2
moveq #0,d2
move.l a6,d0
.j0 move.l a2,Vta_Jump(a0)
; Doke dans le source, en tenant compte des boucles...
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_IfDoke
exg a0,a1
move.l Vta_Prog(a0),a6
bsr Goto_Loops Verifie la validite du saut
sub.l a6,d0
subq.l #2,d0
cmp.l #$10000,d0
bcc VerLong
tst.w d2
beq.s .Skip
bset #0,d0
.Skip move.w d0,(a6)+
rts
; ELSE IF / Passe 1
; ~~~~~~~~~~~~~~~~~~~~~~~
V1_ElseIf
lea VerElI(pc),a0 Else without If
moveq #4,d1
moveq #1<<VF_If,d2
bsr Init_TablA
clr.w (a6)+
move.l a6,Vta_Variable(a0) Adresse apres endif
bsr Ver_ExpE Cherche l'expression
bra VerDP
; ELSE IF / Passe2
; ~~~~~~~~~~~~~~~~~~~~~~
V2_ElsI move.l a0,a1
.Loop move.w #_TkElse,d1 Tokens a trouver
move.w #_TkElsI,d2
move.w #_TkEndI,d3
bsr Find_TablATest Va chercher
beq VerElI Else without Endif
move.w Vta_Token(a0),d0 Trouve le traitement de la passe 2
move.l Vta_Variable(a0),a6 Adresse de saut
cmp.w d0,d1 Else ?
beq.s .j1
cmp.w d0,d2 Else If ?
beq.s .j2
bsr Find_End
sub.l a2,a2 End If >>> Rien!
moveq #0,d2
bra.s .j0
.j2 lea V2_ElsI(pc),a2
moveq #1,d2
move.l a6,d0
bra.s .j0
.j1 lea V2_Else(pc),a2
moveq #0,d2
move.l a6,d0
.j0 move.l a2,Vta_Jump(a0)
bra V2_IfDoke
; ELSE Passe 1
; ~~~~~~~~~~~~~~~~~~
V1_Else lea VerElI(pc),a0 Else without If
moveq #8,d1
moveq #1<<VF_If,d2
bsr Init_TablA
clr.w (a6)+
move.l a6,Vta_Variable(a0) Adresse apres endif
move.l VDLigne(a5),Vta_Variable+4(a0)
; Verification
cmp.w #_TkDP,(a6)
beq VerDP
cmp.w #_TkLGo,(a6)
bne VerLoop
bsr V1_SautLGoto
bra VerDP
; ELSE non structure, passe2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_ElseThen
move.l a0,a1
move.l Vta_Variable+4(a1),a6 Pointe la fin ligne
moveq #0,d0
move.b (a6),d0
add.w d0,a6
lea -2(a6,d0.w),a6
move.l a6,d0
moveq #0,d2
bra V2_IfThenLabel
; ELSE structure / Passe2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_Else move.l a0,a1
.Loop moveq #-1,d1 Tokens a trouver
moveq #-1,d2
move.w #_TkEndI,d3
bsr Find_TablATest Va chercher
beq VerEIf ENDIF without IF
clr.l Vta_Jump(a0) Endif detecte >>> Pas d'erreur
move.l Vta_Variable(a0),a6 Adresse de saut
bsr Find_End
moveq #0,d2
bra V2_IfDoke
; ENDIF Passe 1
; ~~~~~~~~~~~~~~~~~~~
V1_EndI lea VerEIf(pc),a0 EndIf without If
moveq #4,d1
moveq #1<<VF_If,d2
bsr Init_TablA
move.l a6,Vta_Variable(a0)
bra VerDP
; Gosub
; ~~~~~~~~~~~
V1_Gosub
bsr V1_GoLabel
bra VerDP
; Goto / Passe 1
; ~~~~~~~~~~~~~~~~~~~~
V1_Goto moveq #0,d1
move.b #1<<VF_Goto,d2
lea V2_Goto(pc),a0
bsr Init_TablA
bsr V1_GoLabel
bra VerDP
; Goto / Passe 2
; ~~~~~~~~~~~~~~~~~~~~
V2_Goto move.l a0,-(sp)
bsr V2_GoLabel
move.l (sp)+,a0
beq.s .Skip
bsr Goto_Loops
.Skip rts
; On XX Goto / Gosub / Passe1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_On move.l a6,-(sp)
clr.l (a6)+
bsr Ver_ExpE
move.w (a6)+,d0
cmp.w #_TkGto,d0
beq.s .Goto
cmp.w #_TkGsb,d0
beq.s .Gosub
cmp.w #_TkPrc,d0
bne VerSynt
; Des procedures
; ~~~~~~~~~~~~~~
clr.w -(sp)
.Pro1 addq.w #1,(sp)
bsr V1_GoProcedureNoParam
cmp.w #_TkVir,(a6)+
beq.s .Pro1
bra.s .Poke
; Des Goto
; ~~~~~~~~
.Goto move.w #_TkOn,d0
moveq #0,d1
move.b #1<<VF_Goto,d2
lea V2_OnGoto(pc),a0
bsr Init_TablA
.Gosub clr.w -(sp)
.Gto1 addq.w #1,(sp)
bsr V1_GoLabel
cmp.w #_TkVir,(a6)+
beq.s .Gto1
; Poke le nombre dans le source
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Poke subq.l #2,a6
move.w (sp)+,d0
move.l (sp)+,a0
move.w d0,2(a0) Poke le nombre de labels
move.l a6,d0
sub.l a0,d0
subq.l #4,d0
move.w d0,(a0) Poke la longueur de l'instruction
bra VerDP
; On xx GOTO verifie les branchements
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_OnGoto
bsr V2_Goto
cmp.w #_TkVir,(a6)+
beq.s V2_OnGoto
rts
; On Error / Passe1
; ~~~~~~~~~~~~~~~~~~~~~~~
V1_OnError
cmp.w #_TkPrc,(a6)
beq VerLoop
cmp.w #_TkGto,(a6)
bne VerDP
addq.l #2,a6
bra V1_Goto
; Resume / Passe1
; ~~~~~~~~~~~~~~~~~~~~~
V1_Resume
bsr Finie
beq VerDP
bra V1_Goto
; Resume Label
; ~~~~~~~~~~~~~~~~~~
V1_ResLabel
bsr Finie
beq VerDP
bsr V1_GoLabel
bra VerDP
; AMOSPro: TRAP, veut une instruction juste apr<70>s!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerTrap bsr SetNot1.3 Non compatible!
bsr Finie
bne VerLoop
moveq #43,d0 Must be followed by an inst
bra VerErr
; POP PROC
; ~~~~~~~~~~~~~~
V1_PopProc
tst.w Phase(a5)
beq VerPNo
cmp.w #_TkBra1,(a6)
bne VerDP
addq.l #2,a6
bsr Ver_Expression
cmp.w #_TkBra2,(a6)+
beq VerDP
bra VerSynt
; EVERY n PROC / GOSUB
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_Every
bsr Ver_ExpE
move.w (a6)+,d0
cmp.w #_TkGsb,d0
beq.s .Skip
cmp.w #_TkPrc,d0
bne VerSynt
bsr V1_GoProcedureNoParam Une procedure
bra VerDP
.Skip bsr V1_GoLabel Gosub
bra VerDP
RSRESET
Vta_Next rs.l 1 0
Vta_Prev rs.l 1 4
Vta_Token rs.w 1 8
Vta_Flag rs.b 1 10
Vta_UFlag rs.b 1 11
Vta_Prog rs.l 1 12
Vta_NBoucles rs.w 1 16
Vta_PBoucles rs.w 1 18
Vta_Jump rs.l 1 20
Vta_Variable equ __RS 24
; Initialisation generale de la table des boucles
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Reserve_TablA
bsr Free_TablA
lea Ver_TablA(a5),a0
move.l a0,Ver_CTablA(a5)
clr.l Ver_PTablA(a5)
clr.l Ver_PrevTablA(a5)
rts
; Efface les buffers de relocation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Free_TablA
move.l Ver_TablA(a5),d2
beq.s .Out
.Loop move.l d2,a1
move.l (a1),d2
move.l #TablA_Step,d0
SyCall MemFree
tst.l d2
bne.s .Loop
.Out clr.l Ver_TablA(a5)
clr.l Ver_FTablA(a5)
rts
; Nouveau buffer de table
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
New_TablA
movem.l a1/d0/d1,-(sp)
move.l #TablA_Step,d0
SyCall MemFast
beq VerOut
move.l Ver_CTablA(a5),a1
move.l a0,(a1)
move.l a0,Ver_CTablA(a5)
clr.l (a0)+
move.l a0,Ver_PTablA(a5)
lea TablA_Step-8(a0),a1
move.l a1,Ver_FTablA(a5)
movem.l (sp)+,a1/d0/d1
rts
; Creation d'une entree TablA
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Init_TablABoucle
moveq #1<<VF_Boucles,d2
Init_TablA
bset #0,VarBufFlg(a5)
move.l a0,-(sp)
move.l Ver_PTablA(a5),a0
lea Vta_Variable(a0,d1.w),a1
cmp.l Ver_FTablA(a5),a1 Sorti de la table?
bcs.s .Ok
bsr New_TablA
lea Vta_Variable(a0,d1.w),a1
.Ok move.l a1,Ver_PTablA(a5) Suivant
clr.l Vta_Next(a0)
clr.l Vta_Prev(a0)
move.w d0,Vta_Token(a0) Token
move.b d2,Vta_Flag(a0) Flag
clr.b Vta_UFlag(a0) User-Flag
move.l a6,Vta_Prog(a0) Position programme
move.w Ver_NBoucles(a5),Vta_NBoucles(a0) Position pile
move.w Ver_PBoucles(a5),Vta_PBoucles(a0) Position pile
move.l (sp)+,Vta_Jump(a0) Jump Passe2
move.l Ver_PrevTablA(a5),d0 Branche au precedent
beq.s .Skip
move.l d0,a1
move.l a0,Vta_Next(a1)
move.l a1,Vta_Prev(a0)
.Skip move.l a0,Ver_PrevTablA(a5)
rts
; Trouve une boucle / structure apres (a0)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Find_TablA
tst.l (a0)
beq.s .Not
move.l (a0),a0
cmp.w Vta_NBoucles(a0),d1 Bonne pile?
bne.s Find_TablA
cmp.b Vta_Flag(a0),d0 Bon flag?
bne.s Find_TablA
tst.w d2 Bon token?
bmi.s .Skip
cmp.w Vta_Token(a0),d2
bne.s Find_TablA
.Skip move.w Vta_Token(a0),d0
.Not rts
; Trouve un test structure apres (a0)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Find_TablATest
moveq #0,d4
.Loop tst.l (a0)
beq.s .NFnd
move.l (a0),a0
cmp.b #1<<VF_If,Vta_Flag(a0) Meme flag
bne.s .Loop
tst.b Vta_UFlag(a0) Meme structure
bne.s .NoT
move.w Vta_Token(a0),d0
cmp.w #_TkIf,d0
beq.s .Plus
tst.w d4
bne.s .PaTst
cmp.w d0,d1
beq.s .Fnd
cmp.w d0,d2
beq.s .Fnd
cmp.w d0,d3
bne.s .Loop
.Fnd tst.w d0
rts
.PaTst cmp.w #_TkEndI,d0
bne.s .Loop
subq.w #1,d4
bpl.s .Loop
.NFnd moveq #0,d0
rts
.Plus addq.w #1,d4
bra.s .Loop
; No then in a structured loop
.NoT move.l Vta_Prog(a0),VerPos(a5)
subq.l #2,VerPos(a5)
bra VerNoT
; Doke une distance
; ~~~~~~~~~~~~~~~~~~~~~~~
Doke_Distance
sub.l a6,d0
subq.l #2,d0
cmp.l #$10000,d0
bcc VerLong
move.w d0,(a6)+
rts
; Trouve la veritable adresse de fin d'une instruction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Find_End
move.l a0,-(sp)
move.l a6,a0
move.w (a0),d0
bne.s .S1
tst.w 2(a0)
beq.s .S2
addq.l #4,a0
bra.s .S2
.S1 cmp.w #_TkDP,d0
bne VerSynt
addq.l #2,a0
.S2 move.l a0,d0
move.l (sp)+,a0
rts
; Verification GOTO pas a l'interieur d'une boucle
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Goto_Loops
move.w Vta_NBoucles(a0),d1
cmp.l a6,d0
bcc .Avant
; Saut en arriere
; ~~~~~~~~~~~~~~~
.Arr tst.l Vta_Prev(a0)
beq.s .Ok
move.l Vta_Prev(a0),a0
cmp.l Vta_Prog(a0),d0
bcs.s .Arr
cmp.w Vta_NBoucles(a0),d1
bcs VerPaGo
rts
; Saut en AVANT
; ~~~~~~~~~~~~~
.Avant move.l a0,a1
tst.l (a0)
beq.s .Ok
move.l (a0),a0
cmp.l Vta_Prog(a0),d0
bcc.s .Avant
cmp.w Vta_NBoucles(a1),d1
bcs VerPaGo
.Ok rts
; Saute un LABEL GOTO / Passe 1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_SautLGoto
move.l a6,VerPos(a5)
cmp.w #_TkLGo,(a6)+
bne VerSynt
move.b 2(a6),d0
ext.w d0
lea 4(a6,d0.w),a6
rts
; Verification des expressions
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Veut une expression alphanumerique
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_ExpA
bsr Ver_Expression
cmp.b #"2",d2
bne VerType
rts
; Veut une expression entiere
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_ExpE
bsr Ver_Expression
cmp.b #"0",d2
bne VerType
rts
; Verification d'une expression
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_Expression
move.l a6,VerPos(a5)
bsr Ver_Evalue
tst.w Parenth(a5)
bne VerSynt
rts
; Boucle de verification d'une expression
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_Evalue
clr.w Parenth(a5)
Ver_REvalue
move.w #$7FFF,d0
bra.s Eva_1
Eva_0 move.w d2,-(sp)
Eva_1 move.w d0,-(sp)
move.l VerBase(a5),-(sp)
bsr Ver_Operande
move.l (sp)+,VerBase(a5)
Eva_Ret move.w (a6)+,d0
cmp.w (sp),d0
bhi.s Eva_0
subq.l #2,a6
move.w (sp)+,d1
bpl.s Eva_Fin
move.w (sp)+,d5
lea Tst_Jumps(pc),a0
jmp 0(a0,d1.w)
Eva_Fin cmp.w #_TkPar2,d0
beq.s .Par
rts
.Par subq.w #1,Parenth(a5)
addq.l #2,a6
rts
; Operateur mixte: Chiffre / String
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tst_Mixte
cmp.b d2,d5
bne VerType
bra Eva_Ret
; Operateur mixte de comparaison
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tst_Comp
cmp.b d2,d5
bne VerType
moveq #"0",d2
bra Eva_Ret
; Operateur puissance
; ~~~~~~~~~~~~~~~~~~~~~~~~~
Tst_Puis
or.b #%00000011,MathFlags(a5)
; Operateur entier seulement
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tst_Chiffre
cmp.b d2,d5
bne VerType
cmp.b #"0",d2
bne VerType
bra Eva_Ret
; V<>rification d'un operande
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_Operande
clr.w -(sp) Pas de signe devant
Ope_Loop
move.w (a6)+,d0
beq Ope_Fin1
bmi.s .Moins
move.l AdTokens(a5),a0
move.b 1(a0,d0.w),d1
ext.w d1 Branche <EFBFBD> la routine
lsl.w #2,d1
jmp .Jmp(pc,d1.w)
.Moins cmp.w #_TkM,d0 Signe moins devant?
bne VerSynt
tst.w (sp) Deja un?
bne VerSynt
addq.w #1,(sp)
bra Ope_Loop
; Table des sauts directs aux operandes particuliers
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Jmp bra Ope_Normal 00- Normal
bra VerSynt 01= Syntax error!
bra Ope_Fin1 02= Evaluation finie
bra Ope_Fin2 03= Evaluation finie par une virgule
bra Ope_Parenth 04= Ouverture de parenthese
bra Ope_Normal 05= Val!
bra Ope_Extension 06= Extension
bra Ope_Variable 07= Variable
bra Ope_Varptr 08= Varptr
bra Ope_Fn 09= FN
bra Ope_Not 0A= Not
bra Ope_XYMn 0B= X Menu
bra Ope_Equ 0C= Equ
bra Ope_Match 0D= Match
bra Ope_Array 0E- Array
bra Ope_MinMax 0F= Min
bra Ope_LVO 10= LVO
bra Ope_Struc 11= Struc
bra Ope_StrucS 12= Struc$
bra Ope_Math 13= Fonction math
bra Ope_ConstEnt 14= Constante Entiere
bra Ope_ConstFl 15= Constante Float
bra Ope_ConstDFl 16= Constante DFloat
bra Ope_ConstStr 17= Constante String
bra Ope_InstFonction 18= Instruction + Fonction
bra Ope_DejaTeste 19- Deja teste!
bra Ope_VReservee 1A- Variable reservee
; Fonctions speciales compilateur
bra Ope_Normal 1B- ParamE
bra Ope_Normal 1C- ParamF
bra Ope_Normal 1D- ParamS
bra Ope_Normal 1E- False
bra Ope_Normal 1F- True
bra Ope_MinMax 20- Max
bra Ope_Normal 21- Mid3
bra Ope_Normal 22- Mid2
bra Ope_Normal 23- Left
bra Ope_Normal 24- Right
bra Ope_Normal 25- Fonction dialogues
bra Ope_Normal 26- Selecteur de fichier
bra Ope_Normal 27- Btst
; Operande mathematique>>> met les flags
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_Math
or.b #%00000011,MathFlags(a5)
bra.s Ope_Normal
; Nouvelle fonction normale AMOSPro
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_ProNormal
bsr SetNot1.3
; Gestion d'un operande normal
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_Normal
move.l a0,VerBase(a5)
bsr Ver_DInst Pointe la definition
move.w d0,d2
bsr VerF Va verifier
; Compute type in D2>>> float / integer
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_CheckType
addq.l #2,sp
moveq #0,d0
move.b d2,d0
sub.w #"0",d0
lsl.w #1,d0
jmp .jmp(pc,d0.w)
.jmp rts 0 Entier
bra.s .Float 1 Float
rts 2 Chaine
rts 3 Entier/Chaine ??? Impossible
bra.s .Indif 4 Entier/Float
.Math bset #1,MathFlags(a5) Angle (=math)
.Float bset #0,MathFlags(a5)
.Indif move.b #"0",d2
rts
; Gestion d'une variable reservee
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_VReservee
move.l a0,VerBase(a5)
bsr Ver_DInst Pointe la definition
move.b (a0)+,d2
bsr VerF
bra Ope_CheckType
; Operande deja teste +++ rapide (jamais une vreservee)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_DejaTeste
bsr Ver_DInst Pointe la definition
move.w d0,d2
bsr VerF_DejaTeste Va verifier
bra.s Ope_CheckType
; Une extension: toutes les possibilites
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_Extension
move.b (a6)+,d1
move.l a6,-(sp)
tst.b (a6)+
move.w (a6)+,d0
ext.w d1
lsl.w #2,d1
lea AdTokens(a5),a0
tst.l 0(a0,d1.w)
beq VerExN
move.l 0(a0,d1.w),a0
clr.w -(sp) Flag librairie 2.0 ou ancienne
btst #LBF_20,LB_Flags(a0) Librarie 2.0?
beq.s .Old
move.w #-1,(sp)
; Verifie Fonction / Variable reservee, sans table!
.Old move.l a0,VerBase(a5) Debut de tokenisation
bsr Ver_OlDInst
move.w d0,d2
cmp.b #"I",d2
beq VerSynt
cmp.b #"V",d2 Variable r<EFBFBD>servee
bne.s .Skip
move.b (a0)+,d2
.Skip bsr VerF Va verifier
; Poke le nombre de parametres
tst.w (sp)+ Le flag
move.l (sp)+,a0 Poke le nombre de params...
beq.s .Old2
move.b #-1,(a0) Nouvelle extension: pas de params!
bra Ope_CheckType
.Old2 move.b d0,(a0) Ancienne extension: des params...
bra Ope_CheckType
; Une instruction, essaie de trouver une fonction apres!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_InstFonction
move.l a0,VerBase(a5)
lea 0(a0,d0.w),a0
.Loop0 move.l a0,d1
addq.l #4,a0
.Loop1 tst.b (a0)+
bpl.s .Loop1
move.b (a0)+,d2
cmp.b #"I",d2
bne.s .Ok
.Loop2 tst.b (a0)+
bpl.s .Loop2
move.b -1(a0),d0
cmp.b #-3,d0
bne VerSynt
move.w a0,d0
and.w #$0001,d0
add.w d0,a0
bra.s .Loop0
; Trouve, change le token
.Ok sub.l VerBase(a5),d1
move.w d1,-2(a6)
bsr VerF
bra Ope_CheckType
; Fin: une virgule avant---> ommis!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_Fin1
cmp.w #_TkVir,-4(a6)
bne VerSynt
; Fin, avec une virgule: le parametre est ommis
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_Fin2
subq.l #2,a6
moveq #"0",d2
tst.w (sp)+
bne VerSynt
rts
; Ouverture d'un parenthese
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_Parenth
addq.w #1,Parenth(a5)
bsr Ver_REvalue
addq.l #2,sp
rts
; Variable en fonction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_Variable
bsr V1_FVariable
addq.l #2,sp
rts
; Varptr(var)
; ~~~~~~~~~~~~~~~~~
Ope_Varptr
cmp.w #_TkPar1,(a6)+
bne VerSynt
cmp.w #_TkVar,(a6)+
bne VerSynt
bsr V1_FVariable
cmp.w #_TkPar2,(a6)+
bne VerSynt
moveq #"0",d2
addq.l #2,sp
rts
; Constante entiere
; ~~~~~~~~~~~~~~~~~~~~~~~
Ope_ConstEnt
addq.l #4,a6
moveq #"0",d2
addq.l #2,sp
rts
; Constante string
; ~~~~~~~~~~~~~~~~~~~~~~
Ope_ConstStr
move.w (a6)+,d0 * Saute la chaine
move.w d0,d1
and.w #$0001,d1
add.w d1,d0
lea 0(a6,d0.w),a6
moveq #"2",d2
addq.l #2,sp
rts
; Constante float simple precision
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_ConstFl
addq.l #4,a6
move.b #1,Ver_SPConst(a5)
bset #0,MathFlags(a5) Flag: un peu de maths!
moveq #"0",d2
addq.l #2,sp
rts
; Constante float double precision
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_ConstDFl
addq.l #8,a6
move.b #1,Ver_DPConst(a5)
bset #0,MathFlags(a5) Flag: un peu de maths!
bsr SetNot1.3 Non compatible!
moveq #"0",d2
addq.l #2,sp
rts
; =Array(a$())
; ~~~~~~~~~~~~~~~~~~
Ope_Array
bsr SetNot1.3 Non compatible
; =Match(a$())
; ~~~~~~~~~~~~~~~~~~
Ope_Match
move.l a6,-(sp)
move.l a0,VerBase(a5)
bsr Ver_DInst
bsr VerF
moveq #"0",d2 BUG, type= 0, entier!
move.l (sp)+,a0
btst #6,5+2(a0) La variable est-elle un tableau?
bne Ope_CheckType
bra VerSynt
; =MIN / MAX
; ~~~~~~~~~~~~~~~~
Ope_MinMax
cmp.w #_TkPar1,(a6)+
bne VerSynt
move.w Parenth(a5),-(sp)
bsr Ver_Expression
move.w d2,-(sp)
cmp.w #_TkVir,(a6)+
bne VerSynt
bsr Ver_Evalue
cmp.w #-1,Parenth(a5)
bne VerSynt
move.w (sp)+,d1
cmp.b d1,d2
bne VerType
move.w (sp)+,Parenth(a5)
addq.l #2,sp
rts
; NOT
; ~~~~~~~~~
Ope_Not move.w Parenth(a5),-(sp)
bsr Ver_Evalue
tst.w Parenth(a5)
bne VerSynt
move.w (sp)+,Parenth(a5)
cmp.b #"2",d2
beq VerType
addq.l #2,sp
rts
; = Fn AKJDKJS(k,d,d,d)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_OpeFn
tst.w -(sp)
Ope_Fn cmp.w #_TkVar,(a6)+
bne VerSynt
and.b #%00001111,3(a6)
bset #3,3(a6)
bsr VarA0
move.w d2,-(sp)
bsr V1_StoVar
bne VerNFn
* Verifie les parametres
cmp.w #_TkPar1,(a6)
bne.s VerFn3
addq.l #2,a6
move.w Parenth(a5),-(sp)
VerFn1 bsr Ver_Evalue
tst.w Parenth(a5)
bne.s VerFn2
cmp.w #_TkVir,(a6)+
beq.s VerFn1
bne VerSynt
VerFn2 cmp.w #-1,Parenth(a5)
bne VerSynt
move.w (sp)+,Parenth(a5)
* Ok!
VerFn3 move.w (sp)+,d2
addq.w #2,sp
moveq #0,d0
rts
; =XY MENU(,,) / =MENU(,,)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ope_XYMn
bsr VerTablo
cmp.w #MnNDim,d0
bcc VerSynt
moveq #"0",d2
addq.l #2,sp
rts
; STRUC / STRUC$
; ~~~~~~~~~~~~~~~~~~~~
Ope_Struc
move.w Parenth(a5),-(sp)
bsr VStru
move.w (sp)+,Parenth(a5)
cmp.b #7,d2
bcc VerType
moveq #"0",d2
addq.l #2,sp
rts
Ope_StrucS
move.w Parenth(a5),-(sp)
bsr VStru
move.w (sp)+,Parenth(a5)
cmp.b #6,d2
bne VerType
moveq #"2",d2
addq.l #2,sp
rts
; Equates / LVO
; ~~~~~~~~~~~~~
Ope_Equ lea Equ_Nul(pc),a0
bra VEqu
Ope_LVO lea Equ_LVO(pc),a0
VEqu move.l a6,a1
addq.l #6,a6
cmp.w #_TkPar1,(a6)+
bne VerSynt
bsr Equ_Verif
cmp.w #_TkPar2,(a6)+
bne VerSynt
moveq #"0",d2
addq.l #2,sp
rts
; Verification instruction deja testee
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerI_DejaTestee
move.b (a0)+,d0 Un parametre?
bmi.s .Ok
.Loop move.l a0,-(sp)
bsr Ver_Evalue Evaluation
move.l (sp)+,a0
tst.b (a0)+ Un separateur?
bmi.s .Ok
addq.l #1,a0 Un autre parametre!
addq.l #2,a6 Saute le separateur
bra.s .Loop
.Ok rts
; Verification d'une instruction standart
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Position dans la table de tokens
; A6= Instruction + 2
VerI: move.w d2,-(sp)
pea -2(a6) * Adresse de l'instruction
move.l a0,-(sp)
clr.w -(sp) * Position dans definition
clr.l -(sp) * Chaine SOURCE
clr.l -(sp)
clr.l -(sp)
clr.l -(sp)
clr.l -(sp)
move.b #-1,(sp)
move.w (a6),d0 * Fin ligne?
bsr FinieB
beq VerI6
* Compte les parametres
VerI2: bsr Ver_Evalue
move.w 20(sp),d0
move.b d2,0(sp,d0.w)
move.b #-1,1(sp,d0.w)
addq.w #1,d0
cmp.w #19,d0
bcs.s VerI3
subq.w #1,d0
VerI3: move.w d0,20(sp)
tst.w Parenth(a5)
bne VerSynt
moveq #",",d2
move.w (a6),d1
cmp.w #_TkVir,d1
beq.s VerI4
moveq #"t",d2
cmp.w #_TkTo,d1
bne VerI6
VerI4: addq.l #2,a6
move.b d2,0(sp,d0.w)
move.b #-1,1(sp,d0.w)
addq.w #1,d0
cmp.w #19,d0
bcs.s VerI5
subq.w #1,d0
VerI5: move.w d0,20(sp)
bra.s VerI2
* Compare la chaine cree aux parametres
VerI6: bsr VerC
* C'est bon: depile
move.w 20(sp),d0 * Nombre de parametres!
addq.w #1,d0
lsr.w #1,d0
lea 30(sp),sp
move.w (sp)+,d2
rts
; Verification fonction deja testee
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerF_DejaTeste
move.b (a0)+,d0 Un parametre?
bmi.s .Fin
move.w d2,-(sp)
move.w Parenth(a5),-(sp)
.Loop addq.l #2,a6 Parenth / Separateur
move.l a0,-(sp)
bsr Ver_Evalue Evaluation
move.l (sp)+,a0
tst.b (a0)+ Un separateur?
bmi.s .Ok
addq.l #1,a0 Un autre parametre!
bra.s .Loop
.Ok move.w (sp)+,Parenth(a5)
move.w (sp)+,d2
.Fin rts
; Verification d'une fonction standart
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerF: move.w d2,-(sp)
move.w Parenth(a5),-(sp)
pea -2(a6) * Adresse de l'instruction
move.l a0,-(sp) * Adresse definition
clr.w -(sp) * Position dans definition
clr.l -(sp) * Chaine SOURCE
clr.l -(sp)
clr.l -(sp)
clr.l -(sp)
clr.l -(sp)
move.b #-1,(sp)
cmp.w #_TkPar1,(a6)
bne Verf6
addq.l #2,a6
cmp.w #_TkPar2,(a6)+
beq Verf6
subq.l #2,a6
* Compte les parametres
Verf2: bsr Ver_Evalue
move.w 20(sp),d0
move.b d2,0(sp,d0.w)
move.b #-1,1(sp,d0.w)
addq.w #1,d0
cmp.w #19,d0
bcs.s Verf3
subq.w #1,d0
Verf3: move.w d0,20(sp)
cmp.w #-1,Parenth(a5)
beq.s Verf6
tst.w Parenth(a5)
bne VerSynt
moveq #",",d2
move.w (a6)+,d1
cmp.w #_TkVir,d1
beq.s Verf4
moveq #"t",d2
cmp.w #_TkTo,d1
bne VerSynt
Verf4: move.b d2,0(sp,d0.w)
move.b #-1,1(sp,d0.w)
addq.w #1,d0
cmp.w #19,d0
bcs.s Verf5
subq.w #1,d0
Verf5: move.w d0,20(sp)
bra.s Verf2
* Compare la chaine cree aux parametres
Verf6: bsr VerC
* C'est bon: depile et ramene le type
move.w 20(sp),d0
addq.w #1,d0
lsr.w #1,d0
lea 30(sp),sp
move.w (sp)+,Parenth(a5)
move.w (sp)+,d2
rts
; Verification standart: compare la chaine cree aux parametres
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerC: move.l (sp)+,a2 * Adresse de retour
lea (sp),a0
move.l 22(sp),a1 * Pas de definition: PROCEDURE!
cmp.l #0,a1
beq VerCF
* Pas de parametre?
move.b (a1),d1
bpl.s VerC0
tst.b (a0)
bmi.s VerCF
bra.s VerC3
VerC0: tst.b (a0)
bmi.s VerC3
* Explore les params
VerC1: move.b (a1)+,d1
bmi.s VerC4
move.b (a0)+,d0
cmp.b #"3",d1 Indifferent?
beq.s VerC1a
cmp.b #"2",d1 Chaine
beq.s .Comp
moveq #"0",d1 Sinon, un chiffre!
.Comp cmp.b d0,d1
bne VerType
VerC1a: move.b (a0)+,d0
bmi.s VerC2
move.b (a1)+,d1
bmi.s VerC4
cmp.b d0,d1
beq.s VerC1
bra VerC3
VerC2: move.b (a1)+,d1
bpl.s VerC3
* OK!
VerCF: jmp (a2)
* Essaie les params suivants
VerC3: move.b (a1)+,d1
bpl.s VerC3
VerC4: cmp.b #-2,d1 * Change le numero de l'instruction
bne VerSynt
move.l a1,d0
btst #0,d0
beq.s VerC5
addq.l #1,a1
addq.l #1,d0
VerC5: sub.l VerBase(a5),d0
move.l 26(sp),a0
move.w d0,(a0)
addq.l #4,a1
VerC6: tst.b (a1)+
bpl.s VerC6
lea (sp),a0
cmp.b #"V",(a1)+
bne.s VerC1
addq.l #1,a1
bra.s VerC1
; Pointe la liste des params d'une instruction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_DInst:
add.w d0,a0
move.b 2(a0),d0
ext.w d0
add.w d0,a0
move.b (a0)+,d0
bpl.s .Skip
subq.l #1,a0
.Skip rts
; DInst, ancienne maniere
; ~~~~~~~~~~~~~~~~~~~~~~~
Ver_OlDInst
lea 4(a0,d0.w),a0
.Loop tst.b (a0)+
bpl.s .Loop
move.b (a0)+,d0
bpl.s .Skip
subq.l #1,a0
.Skip rts
; Verification / Stockage des variables
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Variable en INSTRUCTION: egalisation ou appel procedure
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_IVariable
move.w #_TkVar,-2(a6) Force le token
and.b #%00001111,3(a6) RAZ du flag!
bsr VarA0
moveq #0,d4 Pour CallProc
cmp.w #_TkEg,(a0) Egal=> egalisation (!)
beq.s .VVi1
cmp.w #_TkPar1,(a0) Une procedure!
bne V1_CallProc
; Un tableau
; ~~~~~~~~~~
move.w d2,-(sp)
bset #6,3(a6) Met le flag tableau!
bsr V1_StoVar
bne VerNDim
bsr VerTablo Verifie les params d'un tableau
cmp.b 4(a1),d0
bne VerIlP Illegal numbre of dimensions
bra.s .VVi2
; Une variable normale
; ~~~~~~~~~~~~~~~~~~~~
.VVi1 move.w d2,-(sp)
bsr V1_StoVar
; Verifie l'expression
; ~~~~~~~~~~~~~~~~~~~~
.VVi2 cmp.w #_TkEg,(a6)+
bne VerSynt
move.l a6,VerPos(a5)
bsr Ver_Expression
move.w (sp)+,d0
cmp.b d0,d2
bne VerType
rts
; VARIABLE EN FONCTION
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_FVariable
and.b #%00001111,3(a6) RAZ du flag
bsr VarA0
cmp.w #_TkPar1,(a0)
bne V1_StoVar
bset #6,3(a6) Met le flag tableau!
bsr V1_StoVar
bne VerNDim
bsr VerTablo Verifie les params d'un tableau
cmp.b 4(a1),d0
bne VerIlP Illegal numbre of dimensions
rts
; Routine, veut un appel de procedure
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_GoProcedureParam
moveq #1,d4
bra.s GoPro
V1_GoProcedureNoParam
moveq #0,d4
GoPro move.w (a6)+,d0
cmp.w #_TkPro,d0
beq.s V1_CallProc
cmp.w #_TkVar,d0
bne VerSynt
; Appel de procedure
; ~~~~~~~~~~~~~~~~~~~~~~~~
V1_CallProc
tst.w Direct(a5)
bne VerIlD
move.b #Reloc_Proc1,d0 Flag un appel de procedure
bsr New_Reloc Force la relocation en V2
bsr VarA0
move.w #_TkPro,-2(a6)
or.b #$80,3(a6) Change le flag
move.l a0,a6
; Saute les params
move.l a6,VerPos(a5)
cmp.w #_TkBra1,(a6)
bne.s .NopA
tst.w d4
bne VerSynt
.Loop addq.l #2,a6
bsr Ver_Expression
move.b #Reloc_Proc2,d0
bsr New_Reloc
move.b d2,d0 Stocke dans la table de relocation
bsr Out_Reloc
cmp.w #_TkVir,(a6)
beq.s .Loop
move.l a6,VerPos(a5)
cmp.w #_TkBra2,(a6)+
bne VerSynt
move.b #Reloc_Proc3,d0
bsr New_Reloc
.Out rts
.NopA move.b #Reloc_Proc4,d0
bsr New_Reloc
rts
; Appel de procedure passe2, premiere etape
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_CallProc1
move.l a6,VerPos(a5)
moveq #0,d0 Retrouve le label
bsr V2_FindLabelP
beq VerUndP
move.l d0,a3
lea 12(a3),a3
move.b 2(a3),d0
ext.w d0
lea 4(a3,d0.w),a3 Pointe le debut de la procedure
cmp.w #_TkBra1,(a3)+
beq.s .Skip
sub.l a3,a3
.Skip rts
; Appel de procedure passe2, pas de parametre
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_CallProc4
move.l a3,d0
bne VerIlP
rts
; Appel de procedure passe2, deuxieme etape
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_CallProc2
move.l a3,d0
beq VerIlP
move.l a6,VerPos(a5)
cmp.w #_TkBra2,(a3)
beq VerIlP
cmp.w #_TkVir,(a3)
bne.s .Sko
addq.l #2,a3
.Sko move.b 5(a3),d1
and.w #$0F,d1
cmp.w #1,d1
bne.s .Skip
moveq #0,d1
.Skip add.b #"0",d1
cmp.b (a4)+,d1
bne VerType
move.b 4(a3),d0
ext.w d0
lea 6(a3,d0.w),a3
rts
; Appel de procedure passe3, derniere etape
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_CallProc3
move.l a6,VerPos(a5)
cmp.w #_TkBra2,(a3)
bne VerIlP
rts
; Stockage des labels
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Verification d'un label / Expression
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_GoLabel
move.w (a6),d0
cmp.w #_TkLGo,d0
bne.s .Skip
move.w #_TkVar,d0
move.w d0,(a6)
.Skip cmp.w #_TkVar,d0
bne.s .Expr
move.b 5(a6),d2
and.b #$0F,d2
bne.s .Expr
; Est-ce REEELEMENT un label?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.b 4(a6),d0
ext.w d0
lea 6(a6,d0.w),a0
move.w (a0),d0
beq.s .Label
cmp.w #_TkVir,d0
beq.s .Label
bsr FinieB
bne.s .Expr
; C'est un label GOTO! Change le token!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Label move.w #_TkLGo,(a6)+
move.b #Reloc_Label,d0 Un label
bsr New_Reloc Relocation en passe2
move.l a0,a6
rts
; C'est une expression: va evaluer!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Expr bsr Ver_Evalue
rts
; Retourne en D0 l'adresse d'un label, si vrai label
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_GoLabel
cmp.w #_TkLGo,(a6)+
bne.s .Nul
move.w (a6)+,d0
move.l LabHaut(a5),a0
move.b (a6),d1
ext.w d1
lea 2(a6,d1.w),a6
move.l 0(a0,d0.w),d0
rts
.Nul moveq #0,d0
rts
; STOCKAGE D'UN LABEL / PASSE 1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_StockLabel
move.w Phase(a5),d0
bsr Get_Label
bne VerLb2
; Cree le label
; ~~~~~~~~~~~~~
move.w d1,d3
move.l LabBas(a5),a0 Baisse le bas des labels
subq.l #8,a0
sub.w d1,a0
cmp.l LabMini(a5),a0 Attention aux boucles
bcs VerVNm
move.l a0,LabBas(a5)
move.l a0,a2
move.l d0,(a0)+ Longueur / Flags / Phase
lea 4(a6),a1
addq.l #4,a0
lsr.w #1,d3 Copie le nom
subq.w #1,d3
.N1 move.w (a1)+,(a0)+
dbra d3,.N1
lea 4(a6,d1.w),a6 Saute le label
move.l a6,a0 Trouve l'adresse de saut
tst.w (a0)
bne.s .N2
tst.w 2(a0) Pointe la ligne suivante si on peut
beq.s .N2
addq.l #4,a0
.N2 move.l a0,4(a2) Poke l'adresse, A2= pointeur
rts
; STOCKAGE LABEL PASSE 2 : essaie de retrouver le label
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_FindLabel
move.w Phase(a5),d0 Niveau de procedure
V2_FindLabelP
bsr Get_Label Va chercher
beq.s .NFnd
; Label trouve, LOKE dans le listing / saute le label
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l a0,a2
addq.l #4,a0
sub.l LabHaut(a5),a0
move.w a0,(a6)
move.l 4(a2),d0
.NFnd rts
; Routine: retrouve un label dans la liste. D0=Phase
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Get_Label
move.b 3(a6),d2 Flag
moveq #0,d1
move.b 2(a6),d1 Longueur du nom
swap d0
move.b d1,d0
lsl.w #8,d0
move.b d2,d0
swap d0
; Boucle de recherche + rapide
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l LabBas(a5),a0
moveq #0,d3
move.b (a0),d3
beq.s .Nouvo
.Loop cmp.l (a0),d0
beq.s .Test
.Loop2 lea 8(a0,d3.w),a0
move.b (a0),d3
bne.s .Loop
bra.s .Nouvo
.Test lea 4(a6),a1
lea 8(a0),a2
move.w d3,d4
lsr.w #1,d4
subq.w #1,d4
.Test2 cmp.w (a1)+,(a2)+
dbne d4,.Test2
tst.w d4
bpl.s .Loop2
move.w #%00000,CCR BNE: trouve, A0=adresse
rts
.Nouvo move.w #%00100,CCR BEQ: pas trouve
rts
******* ENLEVE TOUS LES FLAGS VARIABLE GLOBALE!
Locale: move.l DVNmBas(a5),a0
bra.s LoK2
LoK1: ext.w d0
cmp.b #2,5(a0)
beq.s LoK0
clr.b 5(a0)
LoK0: lea 6(a0,d0.w),a0
LoK2: move.b (a0),d0
bne.s LoK1
rts
******* MET TOUS LES FLAGS VARIABLE GLOBALE!
Globale:move.l DVNmBas(a5),a0
bra.s GlK2
GlK1: ext.w d0
move.b #1,5(a0)
lea 6(a0,d0.w),a0
GlK2: move.b (a0),d0
bne.s GlK1
rts
; STOCKAGE VARIABLE PASSE 1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V1_StoVar
movem.l d2/d3/a3/a4,-(sp)
lea 4(a6),a0 * Pointe le nom
move.l a0,d0
move.b 2(a6),d1
ext.w d1 * Longueur variable
move.b 3(a6),d2 * Flag
move.l a6,a3
tst.w Phase(a5)
beq.s StV1
; Essaie de trouver les variables globales
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l DVNmBas(a5),a4 * Prend les noms GLOBAUX
move.l a4,a1
StV1a: move.l a1,a2
move.b (a1),d3
beq.s StV1
ext.w d3
tst.b 5(a1)
beq.s StV1n
cmp.w d1,d3
bne.s StV1n
cmp.b 1(a1),d2
bne.s StV1n
move.w d3,d4
lsr.w #1,d4
subq.w #1,d4
addq.w #6,a1
move.l d0,a0
StV1b: cmp.w (a0)+,(a1)+
bne.s StV1n
dbra d4,StV1b
move.l a2,a1 * Ramene l'adresse variable
move.l a2,d0
sub.l DVNmHaut(a5),d0 * Offset / Table variables
neg.w d0 * >0===> GLOBALES!
move.w d0,(a6)
moveq #0,d0 * Deja existante
bra Rn1VFin * Va terminer
StV1n: lea 6(a2,d3.w),a1
bra.s StV1a
; Trouve la variable LOCALE!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
StV1: move.l VNmBas(a5),a4
move.l a4,a1
Rn1Va: move.l d0,a0
move.l a1,a2
move.b (a1)+,d3
beq.s Rn1Vx
ext.w d3
cmp.b d1,d3 * Longueur egale?
bne.s Rn1Vn
cmp.b (a1)+,d2 * Flag egal?
bne.s Rn1Vn
tst.w (a1)+ * Saute DIVERS
move.w d3,d4
lsr.w #1,d4
subq.w #1,d4
addq.w #2,a1
Rn1Vb: cmp.w (a0)+,(a1)+
bne.s Rn1Vn
dbra d4,Rn1Vb
moveq #0,d0 * Variable deja existante
bra.s Rn1Vz
; Passe a la variable suivante
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Rn1Vn: lea 6(a2,d3.w),a1
bra.s Rn1Va
; Cree la variable
; ~~~~~~~~~~~~~~~~
Rn1Vx: lea -6(a4),a2
sub.w d1,a2
cmp.l VNmMini(a5),a2
bcs VerNmO
move.l a2,VNmBas(a5)
move.l a2,a1
move.b d1,(a1)+ * Poke la longueur
move.b d2,(a1)+ * Poke le flag
move.w VarLong(a5),(a1)+ * Pointeur
clr.w (a1)+ * Variables Locale-Non dim
addq.w #6,VarLong(a5) * Place pour le type
; Si float DP, non tableau: variable sur 10 octets...
cmp.b #1,d2
bne.s .Skip
tst.b MathFlags(a5)
bpl.s .Skip
addq.w #4,VarLong(a5)
.Skip move.w d1,d3
lsr.w #1,d3
subq.w #1,d3
move.l d0,a0
Rn1Vy: move.w (a0)+,(a1)+
dbra d3,Rn1Vy
moveq #-1,d0 * Variable nouvelle!
; Variable trouvee
; ~~~~~~~~~~~~~~~~
Rn1Vz: move.l a2,a1 * Ramene l'adresse variable
sub.l VNmHaut(a5),a2 * Offset / Table variables
move.w a2,(a6)
; Force la relocation en passe 2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Rn1VFin movem.l (sp)+,d2/d3/a3/a4
move.w d0,-(sp)
move.b #Reloc_Var,d0
bsr New_Reloc * Nouvelle relocation
lea 4(a6,d1.w),a6 * Saute la variable
tst.w (sp)+ * Positionne le flag
rts
; STOCKAGE VARIABLE DEUXIEME PASSE: retrouve l'adresse
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
V2_StoVar
lea 4(a6),a0 * Pointe le nom
move.b 2(a6),d1
ext.w d1 * Longueur variable
move.w (a6),d3
bpl.s .Skip
; DOKE le pointeur, variable locale (<0!)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l VNmHaut(a5),a1
lea 0(a1,d3.w),a1
move.w 2(a1),(a6)
bra.s .Out
; Variable GLOBALE (>0!)
; ~~~~~~~~~~~~~~~~~~~~~~
.Skip neg.w d3
move.l DVNmHaut(a5),a1
lea 0(a1,d3.w),a1
move.w 2(a1),d0
addq.w #1,d0
neg.w d0
move.w d0,(a6)
.Out rts
; Saute le nom d'une variable / A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VarA0: lea 2(a6),a0
move.b (a0)+,d1
ext.w d1
move.b (a0)+,d3
move.b d3,d0
moveq #"0",d2
and.b #%111,d0
beq.s .Skip
cmp.b #1,d0
beq.s .Skip
moveq #"2",d2
.Skip add.w d1,a0
rts
; Verifie les params d'un tableau
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VerTablo
move.w d2,-(sp)
move.l a1,-(sp)
move.l a6,VerPos(a5)
cmp.w #_TkPar1,(a6)+
bne VerSynt
move.w Parenth(a5),-(sp)
clr.w -(sp)
.VTab move.l a6,VerPos(a5)
addq.w #1,(sp)
bsr Ver_Evalue Verifie les parametres
cmp.b #"0",d2
bne VerType
tst.w Parenth(a5)
bne.s .VTab1
cmp.w #_TkVir,(a6)+
beq.s .VTab
bne VerSynt
.VTab1 cmp.w #-1,Parenth(a5)
bne VerSynt
move.w (sp)+,d0 Nombre de dimensions
move.w (sp)+,Parenth(a5)
move.l (sp)+,a1
move.w (sp)+,d2
rts
; Initialisation de la table de relocation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Reserve_Reloc
bsr Free_Reloc
lea Ver_Reloc(a5),a0
move.l a0,Ver_CReloc(a5)
clr.l Ver_FReloc(a5)
clr.b Ver_NoReloc(a5)
sub.l a4,a4
rts
; Efface les buffers de relocation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Free_Reloc
move.l Ver_Reloc(a5),d2
beq.s .Out
.Loop move.l d2,a1
move.l (a1),d2
move.l #Reloc_Step,d0
SyCall MemFree
tst.l d2
bne.s .Loop
.Out clr.l Ver_Reloc(a5)
clr.l Ver_FReloc(a5)
rts
; Poke le pointeur actuel dans la table de relocation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
New_Reloc
tst.b Ver_NoReloc(a5) Relocation autorisee???
bne.s .Out
cmp.l Ver_FReloc(a5),a4 Sorti de la table?
bcc.s .NewBuf
move.l d0,-(sp)
move.l a6,d0
sub.l a3,d0
beq.s .ReJ5
bls.s .Bug
.ReJ1 cmp.l #254,d0
bls.s .ReJ4
cmp.l #254*3,d0
bls.s .ReJ3
cmp.l #65534,d0
bls.s .ReJ2
; >65534
move.b #Reloc_Long,(a4)+
move.b #$FF,(a4)+
move.b #$FE,(a4)+
sub.l #65534,d0
bra.s .ReJ1
; >254*3 <65536
.ReJ2 move.b #Reloc_Long,(a4)+
move.b d0,1(a4)
ror.w #8,d0
move.b d0,(a4)
addq.l #2,a4
bra.s .ReJ5
; >254 <254*3
.ReJ3 move.b #127,(a4)+
sub.l #254,d0
bra.s .ReJ1
; <254
.ReJ4 lsr.w #1,d0
move.b d0,(a4)+
; Fini
.ReJ5 move.l a6,a3
move.l (sp)+,d0
move.b d0,(a4)+
.Out rts
.Bug illegal
; Nouveau buffer de relocation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.NewBuf tst.l Ver_FReloc(a5) Premiere table?
beq.s .Init
move.b #Reloc_NewBuffer,(a4)+ Code de changement
.Init movem.l a0/a1/d0/d1,-(sp)
move.l #Reloc_Step,d0
SyCall MemFastClear
beq VerOut
move.l Ver_CReloc(a5),a1
move.l a0,(a1)
move.l a0,Ver_CReloc(a5)
move.l a0,a4
clr.l (a4)+
lea Reloc_Step-32(a0),a0
move.l a0,Ver_FReloc(a5)
movem.l (sp)+,a0/a1/d0/d1
bra New_Reloc
; Simple sortie d'un chiffre
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Out_Reloc
tst.b Ver_NoReloc(a5) Relocation autorisee???
bne.s .Out
move.b d0,(a4)+
.Out rts
******* SHARED a,b()
******* Routine SHARED: cree les variables
VpSha: addq.l #2,a6
VpSha1: bsr VpGv
cmp.w #_TkVir,(a6)+
beq.s VpSha1
move.w -(a6),d0
move.l a6,VerPos(a5)
tst.w d0
bne VerSynt
rts
* Verification des variables
VpGv: move.l a6,VerPos(a5)
cmp.w #_TkVar,(a6)+
bne VerSynt
* Premiere passe
and.b #%00001111,3(a6)
bsr VarA0
cmp.w #_TkPar1,(a0)
bne V1_StoVar
cmp.w #_TkPar2,2(a0)
bne VerNoPa
lea 4(a0),a6
rts
******* Verification proprement dite
VerSha bset #0,VarBufFlg(a5)
subq.l #2,a6
tst.w Direct(a5)
bne VerIlD
* GLOBAL: Cree les variables
move.l DVNmBas(a5),-(sp)
tst.w Phase(a5)
bne VSh0a
move.l a6,-(sp)
bsr VpSha
move.l (sp)+,a6
move.l VNmBas(a5),(sp)
* Ok! verifie
VSh0a: addq.l #2,a6
* Passe 1
VSh1a: move.l a6,VerPos(a5)
cmp.w #_TkVar,(a6)+
bne VerSynt
lea 4(a6),a0 * Pointe le nom
move.l a0,d0
move.b 2(a6),d1
ext.w d1 * Longueur variable
and.b #%00001111,3(a6)
move.b 3(a6),d2 * Flag
lea 4(a6,d1.w),a6
cmp.w #_TkPar1,(a6)
bne.s Sh1d
bset #6,d2
bset #6,-1(a0)
cmp.w #_TkPar2,2(a6)
bne VerNoPa
addq.l #4,a6
* Cherche la variable dans les variables globales
Sh1d: move.l (sp),a1
Sh1a: move.l a1,a2
move.b (a1),d3
beq VerNDim * PaG * Pas une variable GLOBALE!
ext.w d3
cmp.w d1,d3
bne.s Sh1n
cmp.b 1(a1),d2
bne.s Sh1n
move.w d3,d4
lsr.w #1,d4
subq.w #1,d4
addq.w #6,a1
move.l d0,a0
Sh1b: cmp.w (a0)+,(a1)+
bne.s Sh1n
dbra d4,Sh1b
cmp.b #2,5(a2) * Already GLOBALE!
beq.s Sh1c
move.b #1,5(a2) * Marque la variable
tst.w Phase(a5)
bne.s Sh1c
addq.b #1,5(a2) * Devient globale!
bra.s Sh1c
Sh1n: lea 6(a2,d3.w),a1
bra.s Sh1a
* Une autre variable?
Sh1c: move.w (a6)+,d0
cmp.w #_TkVir,d0
beq VSh1a
addq.l #4,sp
tst.w d0
bne VerShal
bra VerD
***********************************************************
******* Instruction finie??
Finie: move.w (a6),d0
FinieB: beq.s Finy
cmp.w #_TkDP,d0
beq.s Finy
cmp.w #_TkThen,d0
beq.s Finy
cmp.w #_TkElse,d0
Finy: rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; NETTOYAGES DES VARIABLES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ClearVar
; - - - - - - - - - - - - -
movem.l d0-d7/a0-a6,-(sp)
; Variables du programme
; ~~~~~~~~~~~~~~~~~~~~~~
lea DebRaz(a5),a0
lea FinRaz(a5),a1
ClV1: clr.w (a0)+
cmp.l a1,a0
bcs.s ClV1
clr.b Test_Flags(a5)
; Initialisation du disque
; ~~~~~~~~~~~~~~~~~~~~~~~~
move.l #$FFFFFFFF,IffMask(a5)
moveq #47,d0
JJsr L_Sys_GetMessage
move.l DirFNeg(a5),a1
ClV2: move.b (a0)+,(a1)+
bne.s ClV2
move.w PI_DirSize(a5),DirLNom(a5)
clr.l T_ClLast(a5)
move.w #$0A0D,ChrInp(a5)
; DREG/AREG
; ~~~~~~~~~
lea CallReg(a5),a0
move.l a5,(8+5)*4(a0) * A5-> Datazone
move.l T_ClAsc(a5),(8+4)*4(a0) * A4-> Clavier actuel
move.l Prg_Source(a5),(8+3)*4(a0) * A3-> Bas du programme
move.l T_RastPort(a5),(8+0)*4(a0) * A0-> Rastport
move.l DosBase(a5),7*4(a0) * D7-> Dos Base
move.l T_GfxBase(a5),6*4(a0) * D6-> Gfx Base
move.l T_IntBase(a5),5*4(a0) * D5-> Int Base
move.l BasSp(a5),4*4(a0) * D4-> BasSp
lea Ed_Config(a5),a1 * D3-> Configuration Base Editor
move.l a1,3*4(a0)
; Ferme toutes les routines appellees
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea Sys_ClearRoutines(a5),a1
SyCall CallRoutines
; Initialisations diverses
; ~~~~~~~~~~~~~~~~~~~~~~~~
JJsr L_Bnk.EffTemp
JJsr L_Bnk.Change
JJsr L_MenuReset
JJsr L_Dia_WarmInit
; Plus de buffers!
; ~~~~~~~~~~~~~~~~
bsr ClearBuffers
; Init float
; ~~~~~~~~~~
move.w #-1,FixFlg(a5)
clr.w ExpFlg(a5)
movem.l (sp)+,d0-d7/a0-a6
rts
; Nettoie tous les buffers
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClearBuffers
moveq #0,d1
bsr ResVarBuf
clr.w VarBufFlg(a5)
moveq #0,d1
bsr ResVNom
clr.w Stack_Size(a5)
bsr Stack_Reserve
rts
; Reservation de la memoire pour la pile
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Stack_Reserve
move.w Stack_CSize(a5),d0
cmp.w Stack_Size(a5),d0
beq.s .Ok
tst.w d0
beq.s .NoFree
clr.w Stack_CSize(a5)
addq.w #1,d0
mulu #Stack_ProcSize,d0
move.l BaLoop(a5),a1
SyCall MemFree
.NoFree move.w Stack_Size(a5),d0
beq.s .Ok
move.w d0,Stack_CSize(a5)
addq.w #1,d0
mulu #Stack_ProcSize,d0
move.l d0,d1
SyCall MemFastClear
beq .Out
move.l a0,BaLoop(a5)
add.l d1,a0
move.l a0,HoLoop(a5)
.Ok move.w Stack_CSize(a5),d0
rts
.Out moveq #0,d0
rts
; RESERVE DE L'ESPACE POUR LES VARIABLES DIRECTES
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ResDir: movem.l d0/d1/a0,-(sp)
tst.w TVMax(a5)
bne.s RsD3
move.l TabBas(a5),d1
move.l d1,a0
sub.l HiChaine(a5),d1
bcs.s RsD3
moveq #0,d0
move.w PI_TVDirect(a5),d0
cmp.l d1,d0
bls.s RsD1
move.l d1,d0
RsD1: divu #6,d0
mulu #6,d0
subq.l #6,d0
beq.s RsD3
move.l VarLoc(a5),-(a0)
move.w #$FFFF,-(a0)
sub.l d0,a0
move.l a0,VarLoc(a5)
move.l a0,TabBas(a5)
move.w d0,TVMax(a5)
lsr.w #1,d0
subq.w #1,d0
bmi.s RsD3
RsD2: clr.w (a0)+
dbra d0,RsD2
RsD3: movem.l (sp)+,d0/d1/a0
rts
; Reserve le buffer chaines / variables
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; D1= Taille
ResVarBuf
move.l VarBuf(a5),d0
beq.s Vbr1
clr.l VarBuf(a5)
move.l d0,a1
move.l VarBufL(a5),d0
SyCall MemFree
Vbr1 move.l d1,d0
beq.s Vbr2
SyCall MemFastClear
beq VerOut
move.l a0,VarBuf(a5)
lea 0(a0,d1.l),a1
* Adresses dans ce buffer
move.l a1,LabHaut(a5)
clr.w -(a1)
move.l a1,LabBas(a5)
clr.l -(a1)
move.w #-1,-(a1)
move.l a1,VarGlo(a5)
move.l a1,TabBas(a5)
move.l a1,VarLoc(a5)
* Chaines
move.l a0,LoChaine(a5)
move.l a0,ChVide(a5)
move.l a0,ParamC(a5)
clr.w (a0)+
move.l a0,HiChaine(a5)
move.l a0,LabMini(a5)
* Fini!
Vbr2 clr.w VarLong(a5)
clr.w GloLong(a5)
clr.w TVMax(a5)
move.l d1,VarBufL(a5)
rts
; Reserve le buffer des noms de variable
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; D1= taille
ResVNom move.l VNmMini(a5),d0
beq.s RVn1
clr.l VNmMini(a5)
move.l d0,a1
move.l VNmLong(a5),d0
clr.l VNmLong(a5)
SyCall MemFree
RVn1 move.l d1,d0
beq.s RVn2
SyCall MemFastClear
beq VerOut
move.l a0,VNmMini(a5)
move.l d1,VNmLong(a5)
add.l d1,a0
move.l a0,DVNmHaut(a5)
clr.w -(a0)
move.l a0,DVNmBas(a5)
move.l a0,VNmHaut(a5)
clr.w -(a0)
move.l a0,VNmBas(a5)
RVn2 rts
; Inclus les INCLUDES dans le programme courant
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Get_Includes
; Efface d'eventuels anciens
bsr Includes_Clear
; Demande un buffer
lea Prg_Includes(a5),a0
move.l #20*16,d0
move.l #Public|Clear,d1
bsr A5_Reserve
beq .XX
move.l a0,a3
; Explore le d<>but
move.l Prg_Source(a5),a0
move.l a0,(a3)
moveq #0,d6
moveq #0,d7
moveq #0,d0
bsr Tk_FindL
beq .Inclus
.Incl1 cmp.w #_TkIncl,2(a0)
beq.s .Inclu
bsr Tk_FindN
bne.s .Incl1
bra .Inclus
; Une inclusion
.Inclu bsr SetNot1.3 Non compatible!
addq.w #1,d7
move.l a0,d0
sub.l (a3),d0
move.l a0,(a3)
add.l d0,d6
move.l d0,4(a3)
; Ouvre le fichier, sauve le lock
cmp.w #_TkCh1,4(a0)
bne .SErr
lea 6(a0),a0
move.w (a0)+,d0
subq.w #1,d0
bmi .SErr
cmp.w #107,d0
bcc .SErr
move.l Name1(a5),a1
.Incl2 move.b (a0)+,(a1)+
dbra d0,.Incl2
clr.b (a1)
move.l #1005,d2
jsr D_Open
beq .DErr
; Verifie entete, prend la taille du source
move.l Buffer(a5),d2
moveq #16+4,d3
jsr D_Read
bne .DErr
move.l d2,a2
move.l d2,a1 Entete AMOSPRO
lea H_Pro(pc),a0
moveq #8-1,d0
.Ver1 cmp.b (a0)+,(a1)+
bne .13
dbra d0,.Ver1
bra.s .Ver3
.13 move.l d2,a1 Entete AMOS1.3
lea H_1.3(pc),a0
moveq #10-1,d0
.Ver2 cmp.b (a0)+,(a1)+
bne .AErr
dbra d0,.Ver2
.Ver3 add.l 16(a2),d6 Taille du source
move.l 16(a2),12(a3)
move.l Handle(a5),8(a3) Sauve le lock
clr.l Handle(a5)
; Reprend le cours
move.l (a3),a0
bsr Tk_FindN
move.l a0,d0
sub.l (a3),d0
move.l d0,16(a3)
lea 20(a3),a3
move.l a0,(a3)
bra .Incl1
; Reserve le buffer / Charge les programmes
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Inclus move.l a0,d0
sub.l (a3),d0
move.l a0,(a3)
move.l d0,4(a3)
tst.w d7
beq .PaIncl
add.l d6,d0 Taille du dernier incluse
addq.l #4,d0
move.l #Public,d1
lea Prg_FullSource(a5),a0
bsr A5_Reserve
beq .MErr
move.l a0,a2
move.l Prg_Includes(a5),a3
move.l Prg_Source(a5),a4
; Copie le programme
.Copy move.l 4(a3),d0
lsr.l #1,d0
beq.s .Copf
.Cop move.w (a4)+,(a2)+
subq.l #1,d0
bne.s .Cop
.Copf
; Charge le chunk
move.l 8(a3),Handle(a5)
beq.s .X
move.l a2,d2
move.l 12(a3),d3
jsr D_Read
bne .DErr
add.l d0,a2
jsr D_Close
clr.l 8(a3)
; Le suivant!
add.l 16(a3),a4 Saute le INCLUDE
lea 20(a3),a3 Suivant
bra.s .Copy
; Fini
.X clr.l (a2)+
.XX rts
; Pas d'include
; ~~~~~~~~~~~~~
.PaIncl bsr Includes_Clear
rts
; Erreur dans les includes
; ~~~~~~~~~~~~~~~~~~~~~~~~
.MErr moveq #36,d0
bra.s .Err
.DErr moveq #45,d0
bra.s .Err
.AErr moveq #46,d0
bra.s .Err
.SErr moveq #35,d0
.Err move.l d0,-(sp)
move.l (a3),VerPos(a5)
; Ferme tous les fichiers
jsr D_Close
move.l Prg_Includes(a5),a3
.Clo move.l 8(a3),d0
beq.s .Nx
clr.l 8(a3)
move.l d0,Handle(a5)
jsr D_Close
.Nx lea 20(a3),a3
subq.w #1,d7
bne.s .Clo
; Efface les zones
bsr Includes_Clear
; Erreur!
move.l (sp)+,d0
bra VerErr
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INCLUDES ET FIN DE PROGRAMME
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Effacement des buffers includes / Retour <20> la normale
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Includes_Clear
movem.l a0-a1/d0-d1,-(sp)
lea Prg_FullSource(a5),a0
bsr A5_Free
lea Prg_Includes(a5),a0
bsr A5_Free
movem.l (sp)+,a0-a1/d0-d1
rts
; Transforme une adresse FullSource (eventuellement) en adresse Source
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Includes_Adr
movem.l a1/d0-d1,-(sp)
move.l Prg_Includes(a5),d1
beq.s .Out
move.l d1,a1
lea -20(a1),a1
sub.l Prg_FullSource(a5),a0
moveq #0,d1
moveq #0,d2
; Chunk de source
.Loop lea 20(a1),a1
add.l 4(a1),d2 Longueur de source
cmp.l d2,a0
bcs.s .Source
; Chunk d'include
tst.l 12(a1)
beq.s .Out
add.l 12(a1),d1 A soustraire au source
sub.l 16(a1),d1 Sans l'include lui meme
add.l 12(a1),d2
cmp.l d2,a0
bcc.s .Loop
; Dans un include
move.l (a1),a0
bra.s .Out
; Dans le source
.Source sub.l d1,a0
add.l Prg_Source(a5),a0
; Sortie
.Out movem.l (sp)+,a1/d0-d1
rts
Equ_LVO dc.b 10,"_LVO",0
Equ_Nul dc.b 10,0
even
; __________________________________________________________________________
;
; CHARGEMENTS / SAUVEGARDE PROGRAMMES
; __________________________________________________________________________
;
; Entete AMOS Basic
; ~~~~~~~~~~~~~~~~~
H_1.3 dc.b "AMOS Basic v134 "
H_Pro dc.b "AMOS Pro101v",0,0,0,0
even
; ___________________________________________________________________
;
; RUN programme general (A6)
;
; D0= 0:Normal / 1:Accessoire / -1:PRUN
; A1= Adresse Errors
; A2= Patches lors du test
; ___________________________________________________________________
;
Prg_RunIt
movem.l a2-a6/d2-d7,-(sp)
move.w d0,d2
; Deja en route?
; ~~~~~~~~~~~~~~
bsr Prg_DejaRunned
bne .Deja
; Sauve les donnees courantes
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Prg_Push
bne .Omm
; Va tester le programme
; ~~~~~~~~~~~~~~~~~~~~~~
move.l a1,Prg_JError(a5)
bsr Prg_SetBanks Banques courantes
JJsr L_Bnk.Change Envoie aux trappes
clr.b Prg_Not1.3(a6) Non compatible au depart
move.l a2,d0 Premier affichage
beq.s .Skip1
jsr (a2)
.Skip1 bsr ClearVar Plus de variables
bsr PTest Tests
clr.b Prg_StModif(a6) Programme teste!
move.b VerNot1.3(a5),Prg_Not1.3(a6) Stocke la comptibilite
move.b MathFlags(a5),Prg_MathFlags(a6) Double precision
move.l a2,d0 Deuxieme affichage
beq.s .Skip2
jsr 4(a2)
; Initialisation graphique
; ~~~~~~~~~~~~~~~~~~~~~~~~
.Skip2 tst.w d2 Un accessoire
beq.s .Nor
bmi.s .PRun
; Accessoire
tst.b Prg_Accessory(a5) Vraiment un accessoire?
beq.s .Nor
; PRun
.PRun JJsr L_DefRunAcc
JJsr L_ReCop
JJsr L_WOption AMOS en premier s'il faut!
JJmp L_New_ChrGet
; Programme normal
.Nor move.w #-1,DefFlag(a5) Non, programme normal
JJsr L_DefRun1
move.l a2,d0
beq.s .Skip3
jsr 8(a2)
.Skip3 JJsr L_DefRun2
JJsr L_ReCop
EcCalD Active,0
clr.b Prg_Accessory(a5)
JJsr L_WOption AMOS en premier s'il faut!
JJmp L_New_ChrGet
; Out of memory
; ~~~~~~~~~~~~~
.Omm moveq #0,d0
bra.s .Out
; Deja runned
; ~~~~~~~~~~~
.Deja moveq #-1,d0
.Out movem.l (sp)+,a2-a6/d2-d7
rts
; ___________________________________________________________________
;
; TEST programme general (A6)
;
; A1= Adresse Errors
; A2= Patches lors du test
; ___________________________________________________________________
;
Prg_TestIt
movem.l a2-a6/d2-d7,-(sp)
move.w d0,d2
; Deja en route?
; ~~~~~~~~~~~~~~
bsr Prg_DejaRunned
bne.s .Deja
; Sauve les donnees courantes
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Prg_Push
bne .Omm
; Va tester le programme
; ~~~~~~~~~~~~~~~~~~~~~~
move.l a1,Prg_JError(a5)
bsr Prg_SetBanks
clr.b Prg_Not1.3(a6) Non compatible au depart
move.l a2,d0 Premier affichage
beq.s .Skip1
jsr (a2)
.Skip1 bsr ClearVar Plus de variables
bsr PTest Tests
clr.b Prg_StModif(a6) Programme teste!
move.b VerNot1.3(a5),Prg_Not1.3(a6) Stocke la compatibilite
move.b MathFlags(a5),Prg_MathFlags(a6) Double precision
move.l a2,d0 Deuxieme affichage
beq.s .Skip2
jsr 4(a2)
.Skip2
; Depile le programme
; ~~~~~~~~~~~~~~~~~~~
bsr Prg_Pull
moveq #0,d0
.Out movem.l (sp)+,a2-a6/d2-d7
rts
; Deja runned
; ~~~~~~~~~~~
.Deja moveq #-1,d0
bra.s .Out
; Out of memory
; ~~~~~~~~~~~~~
.Omm moveq #0,d0
bra.s .Out
;
; Regarde si le programme A6 est deja RUNNE!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Prg_DejaRunned
movem.l a0-a1/d0-d1,-(sp)
move.l Prg_Runned(a5),d0
beq.s .Ok
.DejaL move.l d0,a0
cmp.l a0,a6
beq.s .Deja
move.l Prg_Previous(a0),d0
bne.s .DejaL
.Ok moveq #0,d0
bra.s .Out
.Deja moveq #-1,d0
.Out movem.l (sp)+,a0-a1/d0-d1
rts
;
; STOCKAGE DES DONNEES DU PROGRAMME A6
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
Prg_Push
movem.l a0-a4/a6/d1-d7,-(sp)
move.l Prg_Runned(a5),d0
move.l a6,Prg_Runned(a5)
move.l d0,Prg_Previous(a6)
beq .Ok
; Programme en route, stocke les donn<6E>es pour les programmes suivants
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l Prg_Previous(a6),a0
lea Prg_RunData(a0),a0
bsr Prg_DataSave
beq .Err
; Prepare le nouveau programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Prg_DataNew
; Pas d'erreur
; ~~~~~~~~~~~~
.Ok moveq #0,d0
.Out movem.l (sp)+,a0-a4/a6/d1-d7
rts
; Out of mem
; ~~~~~~~~~~
.Err move.l Prg_Previous(a6),Prg_Runned(a5)
clr.l Prg_Previous(a6)
moveq #-1,d0
bra.s .Out
;
; RESTAURATION DES DONNEES DU PROGRAMME POUSSE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
Prg_Pull
movem.l a0-a4/a6/d0-d7,-(sp)
move.l Prg_Runned(a5),d0
beq.s .Skip
move.l d0,a6 Prend l'ancien programme
move.l Prg_Previous(a6),d0 Programme precedent
clr.l Prg_Previous(a6) Plus de programme precedent!
move.l d0,Prg_Runned(a5) Le programme actuel
beq.s .Skip Si dernier programme, on garde tout!
; Efface les variables
; ~~~~~~~~~~~~~~~~~~~~
bsr ClearVar
bsr Includes_Clear
; Efface la structure programme ancienne, si non editee...
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tst.b Prg_Edited(a6)
bne.s .Edited
bsr Prg_DelStructure
.Edited
; Remet les donnees
; ~~~~~~~~~~~~~~~~~
move.l Prg_Runned(a5),a6
lea Prg_RunData(a6),a0
bsr Prg_DataLoad
; Fini!
; ~~~~~
.Skip movem.l (sp)+,a0-a4/a6/d0-d7
rts
;
; Programme en route, stocke les donn<6E>es pour les programmes suivants
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Adresse ou poker la structure
;
Prg_DataSave
move.l #FinSave-DebSave+4+4+4*32,d0
move.l #Public|Clear,d1
bsr A5_Reserve
beq .Err
move.l a0,a1
; Sauve les donnees
; ~~~~~~~~~~~~~~~~~
lea DebSave(a5),a0
move.w #(FinSave-DebSave)/2-1,d0
.Copy1 move.w (a0)+,(a1)+
dbra d0,.Copy1
; Sauve la liste CLEARVAR
; ~~~~~~~~~~~~~~~~~~~~~~~
lea Sys_ClearRoutines(a5),a2
move.l (a2),d0
.Loop move.l d0,(a1)+
beq.s .Out
move.l d0,a0
move.l (a0),d0
lsl.l #1,d0
bra.s .Loop
.Out
; Pas d'erreur
; ~~~~~~~~~~~~
moveq #-1,d0
rts
.Err moveq #0,d0
rts
;
; Remet les donn<6E>es pour retour de programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Adresse ou prendre la structure
;
Prg_DataLoad
move.l a0,a2
move.l (a2),a0
lea DebSave(a5),a1
move.w #(FinSave-DebSave)/2-1,d0
.Copy1 move.w (a0)+,(a1)+
dbra d0,.Copy1
; Remet la liste CLEARVAR
; ~~~~~~~~~~~~~~~~~~~~~~~
lea Sys_ClearRoutines(a5),a1
move.l (a0)+,d0
move.l d0,(a1)
bra.s .In
.Loop move.l d0,a1
move.l (a0)+,d0
move.l d0,d1
lsr.l #1,d1
bset #31,d1
move.l d1,(a1)
.In tst.l d0
bne.s .Loop
; Remet le moniteur s'il faut
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.w Cur_ChrJump(a5),d0
JJsr L_SetChrPatch
; Les banques ont change
; ~~~~~~~~~~~~~~~~~~~~~~
JJsr L_Bnk.Change
; Efface la zone de donn<6E>es
; ~~~~~~~~~~~~~~~~~~~~~~~~~
move.l a2,a0
bsr A5_Free
moveq #0,d0
rts
; Nettoie les structures interpreteur pour appel en boucle
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Prg_DataNew
clr.l VarBuf(a5) Plus de buffers
clr.l VNmMini(a5)
clr.w Stack_Size(a5)
clr.w Stack_CSize(a5)
clr.l MnBase(a5) Plus de menus
clr.w OMnNb(a5)
clr.l OMnBase(a5)
clr.l Prg_Includes(a5) Plus d'includes
clr.l Prg_FullSource(a5)
clr.l Patch_Errors(a5) Plus de moniteur
clr.l Patch_Menage(a5)
clr.l Patch_ScFront(a5)
clr.l Patch_ScCopy(a5)
bclr #1,ActuMask+1(a5)
moveq #0,d0
JJsr L_SetChrPatch
clr.b Ed_Zappeuse(a5) Plus de zappeuse
clr.b Prg_Accessory(a5) Plus une accessoire
lea Fichiers(a5),a0 Plus de fichiers
moveq #NFiche-1,d0
.New1 clr.l (a0)
lea TFiche(a0),a0
dbra d0,.New1
lea Dev_List(a5),a0 Plus de devices (12 byte/device)
moveq #(3*Dev_Max)-1,d0
.New2 clr.l (a0)+
dbra d0,.New2
lea Lib_List(a5),a0 Plus de librairies
moveq #Lib_Max-1,d0
.New3 clr.l (a0)+
dbra d0,.New3
rts
;
; Ouvre une structure de programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; IN D0= Longueur buffer
; OUT D0= 0(rate) Structure(reussi)
Prg_NewStructure
movem.l d2/a6,-(sp)
move.l d0,d2
; Reserve la structure
move.l #Prg_Long,d0
SyCall SyFast
beq .Err2
move.l d0,a0
; Insere dans la liste
move.l Prg_List(a5),Prg_Next(a0)
move.l a0,Prg_List(a5)
; Reserve le buffer
move.l a0,a6
move.l d2,d0
bsr Prg_ChgTTexte
beq.s .Err1
move.l a6,d0
movem.l (sp)+,d2/a6
rts
; Rate: efface le buffer
.Err1 bsr Prg_DelStructure
.Err2 moveq #0,d0
movem.l (sp)+,d2/a6
rts
;
; Ferme une structure de programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; IN A6= Adresse structure
Prg_DelStructure
movem.l a0-a6/d0-d7,-(sp)
; Efface le programme
tst.l Prg_StTTexte(a6) Efface programme + Banques
beq.s .Skip
bsr Prg_SetBanks
bsr ClearVar
JJsr L_Bnk.EffAll Enleve les banques
moveq #0,d0 Efface le buffer de texte
bsr Prg_ChgTTexte
; Enleve de la liste
.Skip move.l a6,a1 Enleve de la liste
move.l Prg_List(a5),d0
cmp.l d0,a6
beq.s .First
.Loop move.l d0,a0
move.l Prg_Next(a0),d0
cmp.l d0,a6
bne.s .Loop
move.l Prg_Next(a6),Prg_Next(a0)
bra.s .End
.First move.l Prg_Next(a6),Prg_List(a5)
; Efface la structure
.End move.l #Prg_Long,d0 Efface la structure
move.l a6,a1
SyCall SyFree
movem.l (sp)+,a0-a6/d0-d7
rts
;
; Programme A6 >>> Programme courant
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Prg_ReSetBanks
move.l a6,-(sp)
move.l Prg_Runned(a5),a6
bsr.s Prg_SetBanks
move.l (sp)+,a6
rts
Prg_SetBanks
move.l a0,-(sp)
lea Prg_Banks(a6),a0
move.l a0,Cur_Banks(a5)
lea Prg_Dialogs(a6),a0
move.l a0,Cur_Dialogs(a5)
move.l Prg_StBas(a6),Prg_Source(a5)
move.l (sp)+,a0
rts
; New du program A6 - D0=0 Pas de DEFRUN 1- DEFRUN -2-DEFRUN sans ecran
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Prg_New move.w d0,-(sp)
; Plus rien dans le buffer
clr.w Prg_NLigne(a6)
tst.l Prg_StTTexte(a6)
beq.s .Vide
move.l Prg_StHaut(a6),a0
clr.w -(a0)
move.l a0,Prg_StBas(a6)
; Plus de nom!
clr.b Prg_NamePrg(a6)
clr.b Prg_Change(a6)
move.b #1,Prg_StModif(a6)
clr.b Prg_MathFlags(a6)
; Raz des banques
.Vide clr.b T_Actualise(a5)
bsr Prg_SetBanks
JJsr L_Bnk.EffAll
bsr ClearVar
; Raz de l'affichage
move.w (sp)+,d0
beq.s .Skip
move.w d0,DefFlag(a5)
JJsr L_DefRun1
JJsr L_DefRun2
.Skip rts
;
; Change la taille du buffer de texte
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; IN D0= Nouvelle taille
; A6= Structure programme
; OUT D0= 0(rate) StBas(reussi)
Prg_ChgTTexte
movem.l d1/a1,-(sp)
and.l #$FFFFFFFE,d0
move.l d0,d1
move.l Prg_StTTexte(a6),d0
beq.s .Ctt1
move.l Prg_StMini(a6),a1
SyCall MemFree
clr.l Prg_StTTexte(a6)
.Ctt1 move.l d1,d0
beq.s .Ctt2
SyCall MemFastClear
beq.s .Ctt3
move.l d1,Prg_StTTexte(a6) Raz du programme
move.l a0,Prg_StMini(a6)
add.l d1,a0
move.l a0,Prg_StHaut(a6)
clr.w -(a0)
move.l a0,Prg_StBas(a6)
; Ok!
.Ctt2 move.l a0,d0
.Ctt3 movem.l (sp)+,d1/a1
rts
;
; Charge un programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; IN Name1= nom du programme
; A6 structure dans laquelle charger
; D0= <1: TOUJOURS adapter
; =0: Adapter si necessaire
; >0: Revenir si trop petit
Prg_Load
movem.l a2-a4/d2-d7,-(sp)
move.w d0,-(sp)
move.l #1005,d2
jsr D_Open
beq .DErr
; Verifie l'entete 1.3 ou pro
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l Buffer(a5),d2
moveq #16+4,d3
jsr D_Read
bne .DErr
move.l d2,a2
clr.b Prg_MathFlags(a6)
; 1.3?
clr.b Prg_Not1.3(a6)
lea H_1.3(pc),a0
move.l d2,a1
moveq #10-1,d0
.Ver1 cmp.b (a0)+,(a1)+
bne.s .P13
dbra d0,.Ver1
moveq #0,d7
bra.s .Load
; Pro?
.P13 move.b #1,Prg_Not1.3(a6)
lea H_Pro(pc),a0
move.l d2,a1
moveq #8-1,d0
.Ver2 cmp.b (a0)+,(a1)+
bne .PAmos
dbra d0,.Ver2
move.l d2,a1 Prend le flag maths...
move.b 15(a1),d7
; Verifie la taille du buffer
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Load move.l 16(a2),d3
move.l d3,d1
tst.w (sp)
beq.s .Sine
bmi.s .2Joor
; Charge si possible
cmp.l Prg_StTTexte(a6),d1
blt.s .CBon
add.l #256,d1
bra.s .Papo
; Adapter si necessaire
.Sine cmp.l Prg_StTTexte(a6),d1
blt.s .CBon
; Adapter!
.2Joor add.l #256,d1
move.l d1,d0
bsr Prg_ChgTTexte
beq.s .MErr
.CBon move.l Prg_StHaut(a6),a0
clr.w -(a0)
move.l a0,d2
sub.l d3,d2
; Charge le fichier
; ~~~~~~~~~~~~~~~~~
jsr D_Read
bne .DErr
move.l d2,Prg_StBas(a6)
; Charge les banques
; ~~~~~~~~~~~~~~~~~~
bsr Prg_SetBanks
move.l #EntNul,d0
JJsr L_Bnk.Load
bne .Out
; Change le nom
; ~~~~~~~~~~~~~
move.l Name1(a5),a0
lea Prg_NamePrg(a6),a1
.Copy move.b (a0)+,(a1)+
bne.s .Copy
; Programme non modifie
; ~~~~~~~~~~~~~~~~~~~~~
bsr Prg_CptLines
clr.b Prg_Change(a6)
move.b d7,Prg_MathFlags(a6)
moveq #0,d0
bra.s .Out
; Erreur de disque
; ~~~~~~~~~~~~~~~~
.DErr moveq #-1,d0
bra.s .Out
; Out of mem
; ~~~~~~~~~~
.MErr moveq #-2,d0
bra.s .Out
; Pas un programme AMOS
; ~~~~~~~~~~~~~~~~~~~~~
.PAmos moveq #-3,d0
bra.s .Out
; Impossible de charger: buffer trop petit
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Papo moveq #1,d0
; Ferme le fichier et sort
; ~~~~~~~~~~~~~~~~~~~~~~~~
.Out jsr D_Close
addq.l #2,sp
movem.l (sp)+,a2-a4/d2-d7
tst.l d0
rts
;
; COMPTE LE NOMBRE DE LIGNES
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
Prg_CptLines
move.l Prg_StBas(a6),a0
moveq #0,d0
moveq #0,d1
CpL1 add.w d1,a0
add.w d1,a0
CpL2 move.b (a0),d1
beq.s CpLx
addq.w #1,d0
cmp.w #_TkProc,2(a0)
bne.s CpL1
; Saute une procedure fermee
tst.b 10(a0)
bpl.s CpL1
add.l 4(a0),a0
moveq #(10+2+2)/2,d1
bra.s CpL1
; Nombre de lignes
CpLx move.w d0,Prg_NLigne(a6)
rts
;
; TROUVE L'ADRESSE DU PROGRAMME NAME1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; In Name1 Nom <20> cherche
; Out Trouve BNE, A0=adresse
; Non BEQ
;
Prg_AccAdr
movem.l a2-a3/d2,-(sp)
move.l Name1(a5),a0
JJsrR L_Dsk.DNom,a3
move.l a0,d2
move.l Prg_List(a5),d0
beq.s .Out
.Loop0 move.l d0,a2
lea Prg_NamePrg(a2),a0
JJsrR L_Dsk.DNom,a3
move.l d2,a1
.Loop1 move.b (a0)+,d0
bsr MajD0
move.b d0,d1
move.b (a1)+,d0
bsr MajD0
cmp.b d0,d1
bne.s .Next
or.b d1,d0
bne.s .Loop1
move.l a2,d0
bra.s .Ok
.Next move.l Prg_Next(a2),d0
bne.s .Loop0
.Out moveq #0,d0
.Ok move.l d0,a0
movem.l (sp)+,a2-a3/d2
rts
MajD0 cmp.b #"a",d0
bcs.s .Ski
cmp.b #"z",d0
bhi.s .Ski
sub.b #$20,d0
.Ski rts
;
; Sauve un programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; IN Name1= nom du programme
; A6 structure <20> sauver
Prg_Save
movem.l a2/d2-d4,-(sp)
move.l #1006,d2
jsr D_Open
beq .Err
; Sauve le header du programme: PRO / 1.3
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea H_Pro(pc),a0 Header PRO
move.b Prg_MathFlags(a6),15(a0) Double precision
tst.b Prg_Not1.3(a6)
bne.s .N13
lea H_1.3(pc),a0
.N13 moveq #"V",d0 Teste!
tst.b Prg_StModif(a6)
beq.s .Skip
moveq #"v",d0 Non teste!
.Skip move.b d0,11(a0) Met la marque
move.l a0,d2
moveq #16,d3
jsr D_Write
bne .Err
; Trouve la fin REELLE du programme (pas les zeros de fin!)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l Prg_StBas(a6),a0
.Loop bsr Tk_FindN Explore le programme
bne.s .Loop
.Fin move.l a0,d4 Stoppe sur le premier zero
; Sauve la taille PRG
; ~~~~~~~~~~~~~~~~~~~
move.l Buffer(a5),a0
move.l d4,d0
sub.l Prg_StBas(a6),d0
move.l d0,(a0)
move.l a0,d2
moveq #4,d3
jsr D_Write
bne .Err
; Sauve le corps du programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l Prg_StBas(a6),d2
move.l d4,d3
sub.l d2,d3
jsr D_Write
bne .Err
; Sauve les banques....
; ~~~~~~~~~~~~~~~~~~~~~
bsr Prg_SetBanks
JJsr L_Bnk.SaveAll
bne .Err
; Fin de la sauvegarde
; ~~~~~~~~~~~~~~~~~~~~
jsr D_Close
; Change le nom
; ~~~~~~~~~~~~~
move.l Name1(a5),a0
lea Prg_NamePrg(a6),a1
.Copy move.b (a0)+,(a1)+
bne.s .Copy
; Pas d'erreur
; ~~~~~~~~~~~~
clr.b Prg_Change(a6)
moveq #0,d0
bra.s .Out
.Err moveq #-1,d0
.Out movem.l (sp)+,a2/d2-d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ROUTINES GESTION SOURCE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FIND_LINE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Trouve la ligne D0
; Debut source A0
; Debut Proc >>> A1
Tk_FindN
moveq #1,d0
Tk_FindL
move.l d1,-(sp)
moveq #0,d1
sub.l a1,a1
subq.w #1,d0
bmi.s FndT
; Boucle principale
Fnd1 move.b (a0),d1
beq.s FndT
cmp.w #_TkProc,2(a0)
beq.s Fnd4
Fnd2 add.w d1,a0
add.w d1,a0
Fnd3 dbra d0,Fnd1
bra.s FndT
; Debut de procedure
Fnd4 tst.w 10(a0) * Fermee
bpl.s Fnd5
move.l 4(a0),d1
lea 12+2(a0,d1.l),a0
moveq #0,d1
bra.s Fnd3
Fnd5 move.l a0,a1 * Ouverte
bra.s Fnd7
Fnd6 move.b (a0),d1
beq.s FndT
cmp.w #_TkEndP,2(a0)
beq.s Fnd8
Fnd7 add.w d1,a0
add.w d1,a0
dbra d0,Fnd6
bra.s FndT
Fnd8 sub.l a1,a1
bra.s Fnd2
; Trouve!
FndT move.l (sp)+,d1
move.w (a0),d0
beq.s FndT1
cmp.w #_TkProc,2(a0)
bne.s FndT1
move.l a0,a1
FndT1 tst.w d0
rts
; Taille de la ligne A0
; ~~~~~~~~~~~~~~~~~~~~~
Tk_SizeL
moveq #0,d0
move.b (a0),d0
beq.s .Out
cmp.w #_TkProc,2(a0)
beq.s .Proc
.Ouv lsl.w #1,d0
.Out rts
.Proc tst.w 10(a0)
bpl.s .Ouv
moveq #12+2,d0
add.l 4(a0),d0
rts
; La ligne courante est-elle editable?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tk_EditL
tst.b (a0)
beq.s .Oui
cmp.w #_TkProc,2(a0)
bne.s .Oui
btst #7,10(a0)
beq.s .Oui
move.w #%00100,CCR BEQ>>> faux
rts
.Oui move.w #%00000,CCR BNE>>> vrai
rts
; TROUVE LE NUMERO ET LE DEBUT DE LA LIGNE A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A1-> Debut du buffer
; D0-> Numero
; D1-> Adresse debut proc
Tk_FindA
movem.l d2/a2,-(sp)
move.l a1,a2
moveq #-1,d0
moveq #0,d1
moveq #0,d2
FdA1: addq.l #1,d0
move.l a2,a1
move.b (a2),d2
beq.s FdAT
cmp.w #_TkProc,2(a2)
beq.s FdA4
FdA2 add.w d2,a2
add.w d2,a2
FdA3 cmp.l a0,a2
bls.s FdA1
bra.s FdAT
; Une procedure
FdA4 tst.w 10(a2)
bpl.s FdA2
move.l a2,d1
btst #4,10(a2)
beq.s FdA6
add.l 4(a2),a2
lea 12+2(a2),a2
moveq #0,d2
bra.s FdA6
FdA5 move.l a2,a1
move.b (a2),d2
beq.s FdAT
cmp.w #_TkEndP,2(a2)
beq.s FdA7
FdA6 add.w d2,a2
add.w d2,a2
cmp.l a0,a2
bls.s FdA5
bra.s FdAT
FdA7 moveq #0,d1
bra.s FdA2
; Trouve!
FdAT move.l a1,a0
movem.l (sp)+,d2/a2
rts
; Codage / Decodage procedure LOCKEE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A6---> "PROC"
ProCode movem.l d0-d7/a0-a6,-(sp)
btst #4,8(a6) * Flag COMPILED?
bne PaCo
move.l 2(a6),d0
lea 10+2+4(a6,d0.l),a2 * A2---> ENDPROC
move.w -2(a6),d0
lsr.w #8,d0
lsl.w #1,d0
lea -2(a6,d0.w),a1 * A1---> Ligne suivante
move.l 2(a6),d5
rol.l #8,d5
move.b 9(a6),d5
moveq #1,d4
move.w 6(a6),d3
bra.s PrCo2
PrCo1 eor.w d5,(a0)+
add.w d4,d5
add.w d3,d4
ror.l #1,d5
cmp.l a0,a1
bne.s PrCo1
PrCo2 move.l a1,a0
move.w (a0)+,d0
lsr.w #8,d0
lsl.w #1,d0
lea -2(a0,d0.w),a1
addq.l #2,a0
cmp.l a0,a2
bne.s PrCo1
* Change le flag
bchg #5,8(a6)
PaCo movem.l (sp)+,d0-d7/a0-a6
rts
; Echange des tables de tokenisation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ver_Verif
moveq #-1,d3
bra.s Ver_Echange
Ver_Run moveq #0,d3
Ver_Echange
lea AdTokens(a5),a2
moveq #27-1,d2
.Loop tst.l (a2)
beq.s .Next
move.l (a2),a1
tst.l LB_Verif(a1) Une table?
beq.s .Next
tst.w d3 Run (0) ou Verif (1)
bne.s .Verif
; Run!
bclr #LBF_Verif,LB_Flags(a1) Deja RUN?
beq .Next
bsr.s Ver_Ech On echange
bra.s .Next
; Verif!
.Verif bset #LBF_Verif,LB_Flags(a1) Deja VERIF?
bne .Next
bsr.s Ver_Ech
; Table suivante
.Next addq.l #4,a2
dbra d2,.Loop
rts
; Echange des tables
; ~~~~~~~~~~~~~~~~~~
Ver_Ech move.l a1,a0 Debut des tokens
move.l LB_Verif(a0),a1 Adresse table
move.w (a1)+,d1 Longueur table
ext.l d1
add.l a1,d1 Fin table
.Loop move.l (a0),d0
move.l (a1),(a0)+
move.l d0,(a1)+
.Skip1 tst.b (a0)+
bpl.s .Skip1
.Skip2 tst.b (a0)+
bpl.s .Skip2
move.w a0,d0
and.w #$0001,d0
add.w d0,a0
cmp.l d1,a1
bcs.s .Loop
rts
; Table des operateurs / Test
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tst_Operateurs
bra Tst_Chiffre
dc.b " xor"," "+$80,"O00",-1
bra Tst_Chiffre
dc.b " or"," "+$80,"O00",-1
bra Tst_Chiffre
dc.b " and"," "+$80,"O00",-1
bra Tst_Comp
dc.b "<",">"+$80,"O20",-1
bra Tst_Comp
dc.b ">","<"+$80,"O20",-1
bra Tst_Comp
dc.b "<","="+$80,"O20",-1
bra Tst_Comp
dc.b "=","<"+$80,"O20",-1
bra Tst_Comp
dc.b ">","="+$80,"O20",-1
bra Tst_Comp
dc.b "=",">"+$80,"O20",-1
bra Tst_Comp
dc.b "="+$80,"O20",-1
bra Tst_Comp
dc.b "<"+$80,"O20",-1
bra Tst_Comp
dc.b ">"+$80,"O20",-1
bra Tst_Mixte
dc.b "+"+$80,"O22",-1
bra Tst_Mixte
dc.b "-"+$80,"O22",-1
bra Tst_Chiffre
dc.b " mod"," "+$80,"O00",-1
bra Tst_Chiffre
dc.b "*"+$80,"O00",-1
bra Tst_Chiffre
dc.b "/"+$80,"O00",-1
bra Tst_Puis
dc.b "^"+$80,"O00",-1
even
Tst_Jumps
dc.l 0