amos-professional/compiler/+CLib.s

12192 lines
262 KiB
ArmAsm
Raw Normal View History

2020-04-26 00:58:13 +00:00
; ______________________________________________________________________________
; ..............................................................................
; ...................................................................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........................| AMOSPro Compiler
; .200002........................................| Internal library
; 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.
; ______________________________________________________________________________
Include "+CLib_Size.S"
Include "+AMOS_Includes.s"
Include "+Version.s"
; ______________________________________________________________________________
Start dc.l C_Lib-C_Off
dc.l 0
dc.l C_End-C_Lib
dc.l 0
dc.w 0
;---------------------------------------------------------------------
; Creates the pointers to functions
;---------------------------------------------------------------------
MCInit
C_Off
REPT Lib_Size
MC
ENDR
;---------------------------------------------------------------------
Lib_Ini 0
;---------------------------------------------------------------------
C_Lib
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Reservatioin du STACK si <>4k ***
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Stack_Reserve
; - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RESERVATION / LIBERATION MEMOIRE (ancienne!)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Mise a zero!
; ~~~~~~~~~~~~~~~~~~
Lib_Cmp RamFast
move.l a0,-(sp)
SyCall MemFastClear
move.l a0,d0
move.l (sp)+,a0
rts
Lib_Cmp RamFast2
move.l a0,-(sp)
SyCall MemFast
move.l a0,d0
move.l (sp)+,a0
rts
Lib_Cmp RamChip
move.l a0,-(sp)
SyCall MemChipClear
move.l a0,d0
move.l (sp)+,a0
rts
Lib_Cmp RamChip2
move.l a0,-(sp)
SyCall MemChip
move.l a0,d0
move.l (sp)+,a0
rts
Lib_Cmp RamFree
move.l a0,-(sp)
SyCall MemFree
move.l (sp)+,a0
rts
;
; Reserve / Libere le buffer temporaire
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lib_Cmp ResTempBuffer
ResTempBuffer
movem.l d1/a1,-(sp)
move.l d0,d1
; Libere l'ancien buffer
move.l TempBuffer(a5),d0
beq.s .NoLib
move.l d0,a1
move.l -(a1),d0
addq.l #4,d0
SyCall MemFree
clr.l TempBuffer(a5)
; Reserve le nouveau
.NoLib move.l d1,d0
beq.s .Exit
addq.l #4,d0
SyCall MemFastClear
beq.s .Exit
move.l d1,(a0)+
move.l a0,TempBuffer(a5)
move.l d1,d0
; Branche les routines de liberation automatique
movem.l a0-a2/d0-d1,-(sp)
lea .LibClr(pc),a1
lea Sys_ClearRoutines(a5),a2
SyCall AddRoutine
lea .LibErr(pc),a1
lea Sys_ErrorRoutines(a5),a2
SyCall AddRoutine
movem.l (sp)+,a0-a2/d0-d1
.Exit movem.l (sp)+,d1/a1
rts
; Structures liberation
; ~~~~~~~~~~~~~~~~~~~~~
.LibClr dc.l 0
moveq #0,d0
bra.s ResTempBuffer
.LibErr dc.l 0
moveq #0,d0
bra.s ResTempBuffer
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Wait vbl multi tache
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Sys_WaitMul
; - - - - - - - - - - - - -
movem.l a0-a1/a6/d0-d1,-(sp)
; Inhibition
SyCall Test_Cyclique
; Attente multitache
move.l T_GfxBase(a5),a6
jsr -270(a6)
movem.l (sp)+,a0-a1/a6/d0-d1
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Retourne le message default resource D0
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Def_GetMessage
; - - - - - - - - - - - - -
move.l Sys_Resource(a5),a0
add.l 6(a0),a0
Rbra L_GetMessage
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Retourne le message system D0
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Sys_GetMessage
; - - - - - - - - - - - - -
move.l Sys_Messages(a5),a0
Rbra L_GetMessage
; - - - - - - - - - - - - -
Lib_Cmp GetMessage
; - - - - - - - - - - - - -
move.w d1,-(sp)
clr.w d1
cmp.l #0,a0
beq.s .Big
addq.l #1,a0
bra.s .In
.Loop move.b (a0),d1
cmp.b #$ff,d1
beq.s .Big
lea 2(a0,d1.w),a0
.In subq.w #1,d0
bgt.s .Loop
.Out move.w (sp)+,d1
move.b (a0)+,d0
rts
.Big lea .Fake(pc),a0
bra.s .Out
.Fake dc.b 0,0,0,0
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ADDITIONNE LE PATH DU SYSTEME AU NOM A0 >>> NAME1
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Sys_AddPath
; - - - - - - - - - - - - -
Rbsr L_Sys_GetPath Va chercher le path du systeme
movem.l a1/a2,-(sp)
move.l Name1(a5),a2
move.l a0,a1
.Ess move.b (a1)+,d0
cmp.b #":",d0
beq.s .Cop2
tst.b d0
bne.s .Ess
lea Sys_Pathname(a5),a1
.Cop1 move.b (a1)+,(a2)+
bne.s .Cop1
subq.l #1,a2
.Cop2 move.b (a0)+,(a2)+
bne.s .Cop2
movem.l (sp)+,a1/a2
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TROUVE LE PATH DU SYSTEME
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Sys_GetPath
; - - - - - - - - - - - - -
tst.b Sys_Pathname(a5)
bne.s .Fin
; Demande le path si non defini
movem.l a0-a3/d0-d7,-(sp)
moveq #1,d0 Acces au path
Rbsr L_Sys_GetMessage
move.l a0,d1 Demande le lock
moveq #-2,d2
DosCall _LVOLock
tst.l d0
Rbeq L_DiskError
Rbsr L_AskDir2 Demande le directory
move.l Buffer(a5),a0 Copie le directory
lea 384(a0),a0
lea Sys_Pathname(a5),a1
.CC move.b (a0)+,(a1)+
bne.s .CC
movem.l (sp)+,a0-a3/d0-d7
; Termine!
.Fin rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ROUTINES DE DEBUGGAGE!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp BugBug
; - - - - - - - - - - - - -
movem.l d0-d2/a0-a2,-(sp)
.Ll move.w #$FF0,$DFF180
btst #6,$BFE001
bne.s .Ll
move.w #20,d0
.L0 move.w #10000,d1
.L1 move.w d0,$DFF180
dbra d1,.L1
dbra d0,.L0
btst #6,$BFE001
beq.s .Ill
movem.l (sp)+,d0-d2/a0-a2
rts
.Ill EcCalD AMOS_WB,0
movem.l (sp)+,d0-d2/a0-a2
illegal
rts
; - - - - - - - - - - - - -
Lib_Cmp PreBug
; - - - - - - - - - - - - -
btst #6,$BFE001
Rbeq L_BugBug
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RECOP
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp ReCop
; - - - - - - - - - - - - -
SyCall WaitVbl
EcCall CopForce
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; GESTION DES LISTES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Cree un element de liste en CHIP MEM
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lib_Cmp Lst.ChipNew
move.l #Chip|Clear|Public,d1
Rbra L_Lst.Cree
; Cree une element de liste en FAST MEM
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lib_Cmp Lst.New
move.l #Clear|Public,d1
Rbra L_Lst.Cree
; Cree un <20>l<EFBFBD>ment en tete de liste A0 / longueur D0 / Memoire D1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lib_Cmp Lst.Cree
movem.l a0/d0,-(sp)
addq.l #8,d0
SyCall MemReserve
move.l a0,a1
movem.l (sp)+,a0/d1
beq.s .Out
move.l (a0),(a1)
move.l a1,(a0)
move.l d1,4(a1)
move.l a1,d0
.Out rts
; Efface une liste entiere A0
; ~~~~~~~~~~~~~~~~~~~~~~~~
Lib_Cmp Lst.DelAll
bra.s .In
.Loop move.l d0,a1
Rbsr L_Lst.Del
.In move.l (a0),d0
bne.s .Loop
rts
; Efface un <20>l<EFBFBD>ment de liste A1 / Debut liste A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lib_Cmp Lst.Del
movem.l a0/d0-d2,-(sp)
move.l a1,d0
move.l a0,a1
move.l (a1),d2
beq.s .NFound
.Loop move.l a1,d1
move.l d2,a1
cmp.l d0,a1
beq.s .Found
move.l (a1),d2
bne.s .Loop
bra.s .NFound
; Enleve de la liste
.Found move.l d1,a0
move.l (a1),(a0)
move.l 4(a1),d0
addq.l #8,d0
SyCall MemFree
.NFound movem.l (sp)+,a0/d0-d2
rts
; INSERE un <20>l<EFBFBD>ment A1 en tete de liste A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lib_Cmp Lst.Insert
move.l (a0),(a1)
move.l a1,(a0)
rts
; Enleve un <20>l<EFBFBD>ment de liste A1 / Debut liste A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lib_Cmp Lst.Remove
movem.l a0/a1/d0-d2,-(sp)
move.l a1,d0
move.l a0,a1
move.l (a1),d2
beq.s .NFound
.Loop move.l a1,d1
move.l d2,a1
cmp.l d0,a1
beq.s .Found
move.l (a1),d2
bne.s .Loop
bra.s .NFound
; Enleve de la liste
.Found move.l d1,a0
move.l (a1),(a0)
.NFound movem.l (sp)+,a0/a1/d0-d2
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Trouve le directory courant >
; >>> Buffer + 384
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp AskDir
; - - - - - - - - - - - - -
move.l Buffer(a5),a0
clr.w (a0)
clr.w 384(a0)
move.l a0,d1
moveq #-2,d2
DosCall _LVOLock
tst.l d0
Rbne L_AskDir2
rts
; - - - - - - - - - - - - -
Lib_Cmp AskDir2
; - - - - - - - - - - - - -
clr.l -(sp)
ADir0: move.l d0,-(sp)
move.l d0,d1
DosCall _LVOParentDir
tst.l d0
bne.s ADir0
* Redescend les LOCKS en demandant le NOM!
move.l Buffer(a5),a2
lea 384(a2),a2
clr.b (a2)
moveq #":",d2
ADir1: move.l (sp)+,d1
beq.s ADir4
move.l Buffer(a5),a1
movem.l d1/d2/a1/a2,-(sp)
move.l a1,d2
DosCall _LVOExamine
movem.l (sp)+,d1/d2/a1/a2
tst.l d0
beq.s ADir3
lea 8(a1),a1
ADir2: move.b (a1)+,(a2)+
bne.s ADir2
move.b d2,-1(a2)
clr.b (a2)
moveq #"/",d2
ADir3 DosCall _LVOUnLock
bra.s ADir1
ADir4 moveq #0,d0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TOKENISATEUR POUR LE COMPILATEUR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Tokenisation
; - - - - - - - - - - - - -
bra Tokenise
bra Tok_Init
bra Tok_Del
; Initialisation des tables de tokenisation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tok_Init
tst.l Ed_BufT(a5)
bne MTokX
; Reserve le buffer de tokenisation...
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l #EdBTT,d0
Rjsr L_RamFast
beq MTError
move.l d0,Ed_BufT(a5)
; Fabrique les tables de tokenisation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l #1024*12,d0
Rjsr L_ResTempBuffer
beq MTError
lea AdTokens(a5),a3
lea AdTTokens(a5),a4
moveq #-4,d7
MTok1 addq.w #4,d7
cmp.w #26*4,d7
bcc MTokX
move.l 0(a3,d7.w),d6
beq.s MTok1
move.l d6,a1
addq.l #6,a1
; Premiere table
move.l TempBuffer(a5),a6
move.l a6,a0
lea 2048(a0),a2
moveq #0,d0
MTok2 move.l a1,d1
lea 4(a1),a1
MTok0 move.b (a1)+,d0
bpl.s MTok3
and.w #$7f,d0
subq.l #1,a1
MTok3 cmp.b #"!",d0
beq.s MTok0
cmp.b #" ",d0
beq.s MTok0
bsr MnD0
cmp.b #"a",d0
bcs.s MTok4
cmp.b #"z",d0
bhi.s MTok4
move.w d0,(a0)+
sub.l d6,d1
move.w d1,(a2)+
MTok4 bsr EdlNext
bne.s MTok2
move.w #-1,(a0)+
; Deuxieme table
move.l a0,d0
sub.l a6,d0
add.l #26*4+2+4,d0
move.l d0,d1
Rjsr L_RamFast
beq MTError
move.l d0,a0
move.l a0,0(a4,d7.w)
move.l a0,a1
move.l a0,d3
move.l d1,(a1)+
lea 26*2+2(a1),a2
moveq #"a",d5
move.w #2048,d4
MTok5 move.l a2,d0
sub.l d3,d0
move.w d0,(a1)+
move.l a6,a0
MTok6 move.w (a0)+,d0
bmi.s MTok7
cmp.w d0,d5
bne.s MTok6
move.w -2(a0,d4.w),(a2)+
bra.s MTok6
MTok7 clr.w (a2)+
addq.w #1,d5
cmp.w #"z",d5
bls.s MTok5
clr.w (a1)+
bra MTok1
MTokX moveq #0,d0
Rjsr L_ResTempBuffer
moveq #0,d0
rts
; Out of memory!
; ~~~~~~~~~~~~~~
MTError moveq #0,d0
Rjsr L_ResTempBuffer
moveq #1,d0
rts
; Routine: token suivant
; ~~~~~~~~~~~~~~~~~~~~~~
EdlNext tst.b (a1)+ ; Saute le nom
bpl.s EdlNext
.Tkln1 tst.b (a1)+ ; Saute les params
bpl.s .Tkln1
move.w a1,d1
btst #0,d1 ; Rend pair
beq.s .Tkln2
addq.l #1,a1
.Tkln2 tst.w (a1)
rts
; Routine: D0 minuscule
MnD0 cmp.b #"A",d0
bcs.s .Mnd0a
cmp.b #"Z",d0
bhi.s .Mnd0a
add.b #32,d0
.Mnd0a rts
; Effacement de la tokenisation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tok_Del
; Efface le buffer de tokenisation
move.l Ed_BufT(a5),d0
beq.s DlTkX
clr.l Ed_BufT(a5)
move.l d0,a1
move.l #EdBTT,d0
Rjsr L_RamFree
; Efface les tables de tokens rapide
lea AdTTokens(a5),a2
moveq #25,d1
DlTk1 move.l (a2)+,d0
beq.s DlTk2
clr.l -4(a2)
move.l d0,a1
move.l (a1),d0
Rjsr L_RamFree
DlTk2 dbra d1,DlTk1
DlTkX rts
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;+ TOKENISE LA LIGNE COURANTE
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Tokenise:
movem.l a1-a6/d2-d7,-(sp) * Sauve le debut de la ligne
move.l a1,a4
move.l a0,a3
pea 512(a4)
clr.w d5 * RAZ de tous les flags
clr.w (a4)+
; ----- Compte les TABS
moveq #0,d1
TokT: addq.w #1,d1
move.b (a3)+,d0
beq TokVide
cmp.b #32,d0
beq.s TokT
subq.l #1,a3
cmp.w #127,d1
bcs.s TokT1
moveq #127,d1
TokT1: move.b d1,-1(a4)
; ----- Un chiffre au debut de la ligne?
move.b (a3),d0
cmp.b #"0",d0
bcs.s TokT2
cmp.b #"9",d0
bhi.s TokT2
bset #1,d5 * Flag VARIABLE
bset #4,d5 * Flag LABEL
move.l a4,TkAd(a5)
move.w #_TkVar,(a4)+
clr.l (a4)+
move.b (a3)+,(a4)+
; ----- Une apostrophe en debut de ligne?
TokT2: cmp.b #"'",d0
bne.s TokLoop
addq.l #1,a3
move.w #_TkRem2,(a4)+
bra TkKt2
; ----- Prend une lettre
TokLoop:
cmp.l (sp),a4
bhi TokFin
move.b (a3)+,d0
beq TokFin
* Rem en route?
btst #5,d5
beq.s TkROn
move.b d0,(a4)+
bra.s TokLoop
TkROn:
* Variable en route?
btst #1,d5
bne TkVD
* Chaine en route?
btst #0,d5
beq.s TkC2
cmp.b TkChCar(a5),d0
beq.s TkC1
move.b d0,(a4)+
bra.s TokLoop
* Fin d'une chaine alphanumerique
TkChf: subq.l #1,a3
TkC1: bclr #0,d5
move.l a4,d0
btst #0,d0
beq.s TkC0
clr.b (a4)+
TkC0: move.l TkAd(a5),a0
sub.l a0,d0
subq.w #4,d0
move.w d0,2(a0)
bra.s TokLoop
* Debut d'une chaine alphanumerique?
TkC2: cmp.b #'"',d0
beq TkC2a
cmp.b #"'",d0
bne TkOtre
TkC2a: move.b d0,TkChCar(a5)
move.l a4,TkAd(a5)
cmp.b #"'",d0
beq.s TkC2b
move.w #_TkCh1,(a4)+
bra.s TkC2c
TkC2b: move.w #_TkCh2,(a4)+
TkC2c: clr.w (a4)+
bset #0,d5
bra.s TokLoop
* Variable en route
TkVD: bsr Minus
* Numero de ligne en route
TkFV: moveq #0,d1
move.l TkAd(a5),a0
btst #4,d5
beq.s TkV2
cmp.b #"0",d0
bcs.s TkV0
cmp.b #"9",d0
bls.s TkV3
TkV0: bset #3,d5 Fin du debut de ligne!
bclr #4,d5 Fin du numero de ligne
cmp.b #":",d0
beq.s TkV1
subq.l #1,a3
bra.s TkV1
* Variable normale / label
TkV2: cmp.b #"_",d0
beq.s TkV3
cmp.b #"0",d0
bcs.s TkV4
cmp.b #"9",d0
bls.s TkV3
cmp.b #"a",d0
bcs.s TkV4
cmp.b #"z",d0
bls.s TkV3
cmp.b #128,d0
bls.s TkV4
TkV3: move.b d0,(a4)+
bra TokLoop
* Fin de la variable/label/label goto
TkV4: bset #3,d5 * Si pas debut de ligne
bne.s TkV5
cmp.b #":",d0 * Si :
bne.s TkV5
TkV1: move.w #_TkLab,(a0)
bra.s TkV7
TkV5: subq.l #1,a3
moveq #2,d1
cmp.b #"$",d0
beq.s TkV6
moveq #1,d1
cmp.b #"#",d0
beq.s TkV6
moveq #0,d1
bra.s TkV7
TkV6: addq.w #1,a3
TkV7: move.w a4,d2 * Rend pair
btst #0,d2
beq.s TkV8
clr.b (a4)+
TkV8: move.l a4,d0
sub.l a0,d0
subq.l #6,d0
move.b d0,4(a0) * Poke la longueur
move.b d1,5(a0) * Poke le flag
bclr #1,d5
bra TokLoop
* Saute les 32
TkOtre: cmp.b #" ",d0
beq TokLoop
* Est-ce un chiffre?
lea -1(a3),a0 Pointe le debut du chiffre
moveq #0,d0 Ne pas tenir compte du signe (valtok)
Rbsr L_CValRout
bne.s TkK
move.l a0,a3
move.w d1,(a4)+
move.l d3,(a4)+
cmp.w #_TkDFl,d1
bne TokLoop
move.l d4,(a4)+
bra TokLoop
TkK:
; ----- Tokenisation RAPIDE!
moveq #-4,d7 * D7--> Numero de l'extension
lea AdTokens(a5),a6
moveq #0,d3
lea -10(sp),sp
* Prend le premiere caractere...
moveq #0,d0
move.b -1(a3),d0
bsr MinD0
move.l d0,d2
lea Dtk_Operateurs(pc),a1 Operateur, LENTS en 1er...
bra TkLIn
* Lent ou rapide?
TkUn cmp.b #"a",d2
bcs.s Tkl1
cmp.b #"z",d2
bhi.s Tkl1
bset #31,d2
move.w d2,d6
sub.w #"a",d6
lsl.w #1,d6
* Mode rapide: init!
Tkr1 lea AdTTokens(a5),a2
move.l 0(a2,d7.w),d0
beq.s Tkl1
move.l d0,a2
move.w 4(a2,d6.w),d0
add.w d0,a2 * A2-> Adresse des adresses
bset #31,d6
bra TkRNext
* Tokens lents
Tkl1 move.l 0(a6,d7.w),d0
beq TkNext
move.l d0,a1
addq.l #6,a1
TkLIn bclr #31,d6
cmp.b #"!",d2 Entree pour les operateurs...
beq TkKF
cmp.b #"?",d2
bne.s Tkl2
move.l a3,a0
Tkl1a move.b (a0)+,d0 * ? PRINT / ? PRINT #
beq.s Tkl1b
cmp.b #"#",d0
beq.s Tkl1c
cmp.s #" ",d0
beq.s Tkl1a
Tkl1b move.w #_TkPr,d4
bra TkKt0
Tkl1c move.l a0,a3
move.w #_TkHPr,d4
bra TkKt0
Tkl2 move.l a1,d4 * Recherche la 1ere lettre
lea 4(a1),a1
move.w d2,d0
Tkl0 move.b (a1)+,d1
bmi Tkl4
cmp.b #" ",d1
beq.s Tkl0
cmp.b #"!",d1
beq.s Tkl0
cmp.b d0,d1
beq.s TkRe0
Tkl3 bsr TklNext
bne.s Tkl2
* Tableau de token suivant!
TkNext addq.l #4,d7
beq TkUn
cmp.l #4*26,d7
bcc.s .TrouV
tst.l d2
bpl.s Tkl1
bra Tkr1
.TrouV tst.w d3
beq TkKF
move.l (sp),d4
move.l 4(sp),a3
move.w 8(sp),d7
bra TklT
* Trouve 1 lettre lent?
Tkl4 subq.l #1,a1
and.b #$7f,d1
cmp.b #" ",d1
beq TklT
cmp.b d0,d1
bne.s Tkl3
bra TklT
* Token rapide suivant
TkRNext move.w (a2)+,d0
beq TkNext
move.l 0(a6,d7.w),a1
add.w d0,a1
move.l a1,d4
lea 5(a1),a1
move.b -1(a1),d0
cmp.b #"!",d0
beq.s TkRe0a
cmp.b #" ",d0
bne.s TkRe0
TkRe0a addq.l #1,a1
* Explore les autres lettres du token
TkRe0 move.l a3,a0
TkRe1 move.b (a0)+,d0
bsr MinD0
TkRe2 move.b (a1)+,d1
bmi.s TkKt
cmp.b #" ",d1
bne.s TkRe3
cmp.b d1,d0
bne.s TkRe2
beq.s TkRe1
TkRe3 cmp.b d0,d1
beq.s TkRe1
* Mot cle suivant
TkRe4 tst.l d6
bpl Tkl3
bmi.s TkRNext
* Mot trouve?
TkKt: subq.l #1,a0
subq.l #1,a1
and.b #$7f,d1
cmp.b #" ",d1
beq.s TkKt1
cmp.b d0,d1
bne.s TkRe4
addq.l #1,a0
TkKt1:
tst.l d6
bpl.s TklTl
move.l a1,d0
sub.l d4,d0
cmp.w d3,d0
bls.s TkRe4
move.w d0,d3
move.l d4,(sp)
move.l a0,4(sp)
move.w d7,8(sp)
bra.s TkRe4
TklTl move.l a0,a3
** Token trouve!
TklT tst.w d7 Une extension
bgt TkKtE
beq.s .Norm Un operateur?
lea Dtk_OpFin(pc),a0
sub.l a0,d4
bra.s TkKt0
.Norm sub.l AdTokens(a5),d4 Un token librairie principale
TkKt0: lea 10(sp),sp
move.w d4,(a4)+
bclr #4,d5 Plus de numero de ligne
bset #3,d5 Plus debut de ligne
cmp.w #_TkEqu,d4 Tokens de structure?
bcs.s .SkS
cmp.w #_TkStruS,d4
bls TkKt5
.SkS cmp.w #_TkOn,d4
beq.s TkKt7
cmp.w #_TkData,d4
beq TkKt3
cmp.w #_TkRem1,d4
beq.s TkKt2
cmp.w #_TkFor,d4
beq.s TkKt3
cmp.w #_TkRpt,d4
beq.s TkKt3
cmp.w #_TkWhl,d4
beq.s TkKt3
cmp.w #_TkDo,d4
beq.s TkKt3
cmp.w #_TkExit,d4
beq.s TkKt4
cmp.w #_TkExIf,d4
beq.s TkKt4
cmp.w #_TkIf,d4
beq.s TkKt3
cmp.w #_TkElse,d4
beq.s TkKta
cmp.w #_TkElsI,d4
beq.s TkKt3
cmp.w #_TkThen,d4
beq.s TkKtb
cmp.w #_TkProc,d4
beq.s TkKt6
cmp.w #_TkDPre,d4
beq.s TkKDPre
bra TokLoop
* ON
TkKt7: clr.l (a4)+
bra TokLoop
* Debut d'une REM
TkKt2: clr.w (a4)+
move.l a4,TkAd(a5)
bset #5,d5
bra TokLoop
* Poke les blancss
TkKt6 clr.w (a4)+ 8 octets
TkKt5 clr.w (a4)+ 6 octets
TkKt4 clr.w (a4)+ 4 octets
TkKt3 clr.w (a4)+ 2 octets
bra TokLoop
* Token double precision: flags <EFBFBD> 1
TkKDPre or.b #%10000011,MathFlags(a5)
bra TokLoop
* Token d'extension! .w EXT/.b #Ext/.b Nb Par/.w TOKEN
TkKtE: lea 10(sp),sp
move.w #_TkExt,(a4)+
move.w d7,d0
lsr.w #2,d0
move.b d0,(a4)+
clr.b (a4)+
lea AdTokens(a5),a6
sub.l 0(a6,d7.w),d4
move.w d4,(a4)+
bclr #4,d5
bset #3,d5
bra TokLoop
* ELSE/THEN: regarde si numero de ligne apres!
TkKta: clr.w (a4)+
TkKtb: move.l a3,a0
TkKtc: move.b (a0)+,d0
beq TokLoop
cmp.b #" ",d0
beq TkKtc
cmp.b #"0",d0
bcs TokLoop
cmp.b #"9",d0
bhi TokLoop
move.l a0,a3
move.w #_TkLGo,d1
bra.s TkKf2
; ----- Rien trouve ===> debut d'une variable
TkKF: lea 10(sp),sp
move.w #_TkVar,d1
move.b -1(a3),d0
TkKf0: cmp.b #"A",d0
bcs.s TkKf1
cmp.b #"Z",d0
bhi.s TkKf1
add.b #"a"-"A",d0
TkKf1: cmp.b #"_",d0
beq.s TkKf2
cmp.b #128,d0
bcc.s TkKf2
cmp.b #"a",d0
bcs TokLoop
cmp.b #"z",d0
bhi TokLoop
TkKf2: move.l a4,TkAd(a5)
move.w d1,(a4)+
clr.l (a4)+
move.b d0,(a4)+
bset #1,d5
bra TokLoop
* Appel d'un label?
TkKf3: move.w #_TkLGo,d1
cmp.b #"0",d0
bcs.s TkKf0
cmp.b #"9",d0
bls.s TkKf2
bra.s TkKf0
; ----- Fin de la tokenisation
TokFin: btst #1,d5 Fin de variable
bne TkFV
btst #0,d5 Fin de chaine alphanumerique
bne TkChf
moveq #1,d0 * Quelquechose dans la ligne!
btst #5,d5 REM
beq.s TokPaR
move.w a4,d1
btst #0,d1 Rend pair la REM!
beq.s FRem
move.b #" ",(a4)+
FRem: move.l a4,d1 Calcule et stocke la longueur
move.l TkAd(a5),a0
sub.l a0,d1
move.w d1,-2(a0)
* Marque la fin
TokPaR: clr.w (a4)+
clr.w (a4)
* Poke la longueur de la ligne / 2
move.l a4,d1
addq.l #4,sp
move.l a3,a0
movem.l (sp)+,a1-a6/d2-d7
sub.l a1,d1
cmp.w #510,d1
bcc.s .Long
lsr.w #1,d1
move.b d1,(a1)
lsl.w #1,d1
ext.l d1
* Fini!
tst.w d0
rts
* Trop longue!
.Long clr.w (a1) * <0= Trop longue
moveq #0,d1
moveq #-1,d0
rts
* Ligne vide!
TokVide moveq #0,d0 * = 0 Vide
moveq #0,d1
bra.s TokPaR
* Routine: D0 minuscule
MinD0 cmp.b #"A",d0
bcs.s Mnd0a
cmp.b #"Z",d0
bhi.s Mnd0a
add.b #32,d0
Mnd0a rts
* Routine: token suivant
TklNext tst.b (a1)+ * Saute le nom
bpl.s TklNext
Tkln1 tst.b (a1)+ * Saute les params
bpl.s Tkln1
move.w a1,d1
btst #0,d1 * Rend pair
beq.s Tkln2
addq.l #1,a1
Tkln2 tst.w (a1)
rts
; Passe en minuscules
; ~~~~~~~~~~~~~~~~~~~~~~~~~
Minus: cmp.b #"A",d0
bcs.s .Skip
cmp.b #"Z",d0
bhi.s .Skip
add.b #"a"-"A",d0
.Skip rts
; Table des operateurs
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Dtk_Operateurs
dc.w 1,1
dc.b " xor"," "+$80,"O00",-1
dc.w 1,1
dc.b " or"," "+$80,"O00",-1
dc.w 1,1
dc.b " and"," "+$80,"O00",-1
dc.w 1,1
dc.b "<",">"+$80,"O20",-1
dc.w 1,1
dc.b ">","<"+$80,"O20",-1
dc.w 1,1
dc.b "<","="+$80,"O20",-1
dc.w 1,1
dc.b "=","<"+$80,"O20",-1
dc.w 1,1
dc.b ">","="+$80,"O20",-1
dc.w 1,1
dc.b "=",">"+$80,"O20",-1
dc.w 1,1
dc.b "="+$80,"O20",-1
dc.w 1,1
dc.b "<"+$80,"O20",-1
dc.w 1,1
dc.b ">"+$80,"O20",-1
dc.w 1,1
dc.b "+"+$80,"O22",-1
dc.w 1,1
dc.b "-"+$80,"O22",-1
dc.w 1,1
dc.b " mod"," "+$80,"O00",-1
dc.w 1,1
dc.b "*"+$80,"O00",-1
dc.w 1,1
dc.b "/"+$80,"O00",-1
dc.w 1,1
dc.b "^"+$80,"O00",-1
even
Dtk_OpFin
dc.l 0
ExtNot dc.b "Extension ",$80
Even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TEST DU PROGRAMME POUR COMPILATEUR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Testing
; - - - - - - - - - - - - -
bra Init
bra PTest
bra Fin
bra Detok
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
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INITIALISATION
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Init bsr ClearVar
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FIN
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Fin bsr ClearVar
bsr Equ_Free
bsr Includes_Clear
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TEST DU PROGRAMME
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PTest:
move.l sp,BasSp(a5) Sauve la pile
movem.l a2-a4/a6/d2-d7,-(sp) Sauvegarde registres
; 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)
clr.b VerNot1.3(a5) Compatible, au depart...
; 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 les tables
; ~~~~~~~~~~~~~~~~~
bsr Free_VerTables
; Termine!!!
; ~~~~~~~~~~
moveq #0,d0
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 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 VerLoop 57-APCmp Call
IFNE Debug=2
V1_Debug
bra VerDP
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
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 BasSp(a5),sp
move.l d0,-(sp)
move.l VerPos(a5),a0
bsr Includes_Adr
move.l a0,VerPos(a5)
bsr VD_Close
bsr Free_VerTables
clr.b VerCheck1.3(a5)
; Trouve le numero de la ligne en question
move.l VerPos(a5),a0
move.l Prg_Source(a5),a1
bsr Tk_FindA a0= debut de la ligne
move.l d0,d1 d1= numero
move.l (sp)+,d0 d0= erreur
rts
; 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_CValRout,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
; lea Equ_Free(pc),a0
; lea Equ_FlushStructure(pc),a1
; move.l a0,(a1)
; SyCall AddFlushRoutine
; Charge le fichier
moveq #9,d0
Rjsr L_Sys_GetMessage
Rjsr L_Sys_AddPath
move.l #1005,d2
bsr VD_Open
beq.s .Err
; Trouve la taille du fichier!
moveq #0,d2
moveq #1,d3
bsr VD_Seek
moveq #0,d2
moveq #-1,d3
bsr VD_Seek
; Reserve la memoire
move.l d0,d3
move.l #Fast|Public,d1
lea Equ_Base(a5),a0
bsr VA5_Reserve
beq.s .Err
; Charge le fichier
move.l a0,d2
bsr VD_Read
bne.s .Err
; Ferme le fichier
bsr VD_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 bsr VD_Close
bsr Equ_Free
moveq #52,d0
bra VerErr
; Libere le fichier d'equates
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Equ_Free
lea Equ_Base(a5),a0
bsr VA5_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
move.l 4(sp),a0
btst #4,8(a0)
beq.s .EPLoop
move.l 2(a0),d0
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 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
Rjsr L_RamFree
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
Rjsr L_RamFast
beq VerOut
move.l d0,a0
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_DejaTeste 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) 5-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 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
Rjsr L_RamFree
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
Rjsr L_RamFast
beq VerOut
move.l d0,a0
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)
; Plus de buffers!
; ~~~~~~~~~~~~~~~~
bsr ClearBuffers
movem.l (sp)+,d0-d7/a0-a6
rts
; Nettoie tous les buffers
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClearBuffers
moveq #0,d0
JJsr L_ResTempBuffer
moveq #0,d1
bsr ResVarBuf
clr.w VarBufFlg(a5)
moveq #0,d1
bsr ResVNom
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
Rjsr L_RamFree
Vbr1 move.l d1,d0
beq.s Vbr2
Rjsr L_RamFast
beq VerOut
move.l d0,a0
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)
Rjsr L_RamFree
RVn1 move.l d1,d0
beq.s RVn2
Rjsr L_RamFast
beq VerOut
move.l d0,a0
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 VA5_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
bsr VD_Open
beq .DErr
; Verifie entete, prend la taille du source
move.l Buffer(a5),d2
moveq #16+4,d3
bsr VD_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 VA5_Reserve
beq .MErr
lea 20(a0),a2 Saute le header
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
bsr VD_Read
bne .DErr
add.l d0,a2
bsr VD_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
bsr VD_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)
bsr VD_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
; Effacement des buffers includes / Retour <20> la normale
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Includes_Clear
movem.l a0-a1/d0-d1,-(sp)
lea Prg_FullSource(a5),a0
bsr VA5_Free
lea Prg_Includes(a5),a0
bsr VA5_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
; Reserve un espace m<>moire sur (a5)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Adresse dans (a5)
; D0= Longueur
; D1= Flags
VA5_Reserve
movem.l d0-d2/a1-a2/a6,-(sp)
move.l a0,a2
addq.l #4,d0
move.l d0,d2
move.l $4.w,a6
jsr _LVOAllocMem(a6)
tst.l d0
beq.s .Out
move.l d0,a0
move.l d2,(a0)+
move.l a0,(a2)
.Out movem.l (sp)+,d0-d2/a1-a2/a6
rts
; Efface un espace m<>moire sur (a5)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Adresse dans (a5)
VA5_Free
movem.l a0-a1/d0-d1/a6,-(sp)
move.l (a0),d0
beq.s .Skip
clr.l (a0)
move.l d0,a1
move.l -(a1),d0
move.l $4.w,a6
jsr _LVOFreeMem(a6)
.Skip movem.l (sp)+,a0-a1/d0-d1/a6
rts
; 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
; 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
;
; NOUVELLE ROUTINES DISQUE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
; OPEN: ouvre le fichier systeme (diskname1) access mode D2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VD_Open move.l Name1(a5),d1
VD_OpenD1
move.l a6,-(sp)
move.l DosBase(a5),a6
jsr _LVOOpen(a6)
move.l (sp)+,a6
move.l d0,Handle(a5)
rts
; CLOSE fichier systeme
; ~~~~~~~~~~~~~~~~~~~~~
VD_Close
movem.l d0/d1/a0/a1/a6,-(sp)
move.l Handle(a5),d1
beq.s .Skip
clr.l Handle(a5)
move.l DosBase(a5),a6
jsr _LVOClose(a6)
.Skip movem.l (sp)+,d0/d1/a0/a1/a6
rts
; READ fichier systeme D3 octets dans D2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VD_Read movem.l d1/a0/a1/a6,-(sp)
move.l Handle(a5),d1
move.l DosBase(a5),a6
jsr _LVORead(a6)
movem.l (sp)+,d1/a0/a1/a6
cmp.l d0,d3
rts
; WRITE fichier systeme D3 octets de D2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VD_Write
movem.l d1/a0/a1/a6,-(sp)
move.l Handle(a5),d1
move.l DosBase(a5),a6
jsr _LVOWrite(a6)
movem.l (sp)+,d1/a0/a1/a6
cmp.l d0,d3
rts
; SEEK fichier system D3 mode D2 deplacement
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VD_Seek move.l Handle(a5),d1
move.l a6,-(sp)
move.l DosBase(a5),a6
jsr _LVOSeek(a6)
move.l (sp)+,a6
tst.l d0
rts
; ___________________________________________________________________________
;
; DETOKENISATION
; ___________________________________________________________________________
;
; A0: Ligne <20> detokeniser
; A1: Buffer
; D0: Adresse <20> d<>tecter
; ___________________________________________________________________________
;
Mon_Detok
moveq #-1,d1
bra.s Dtk
Detok:
moveq #0,d1
Dtk
movem.l d2-d7/a2-a6,-(sp)
lea 2(a1),a4 * Place pour la taille
move.l a0,a6
move.l d0,a3
move.l a4,a2
clr.w -(sp) * Position du curseur
; ----- Met les espaces devant?
tst.w d1 Mode monitor
bne.s DtkMon
tst.b (a6) Mode normal
beq DtkFin
clr.w d0
move.b 1(a6),d0
subq.w #2,d0
bmi.s Dtk2
Dtk1: move.b #" ",(a4)+
dbra d0,Dtk1
Dtk2: addq.l #2,a6
DtkMon clr.w d5
; ----- Boucle de detokenisation
DtkLoop:cmp.l a3,a6 Trouve la P en X?
bne.s Dtk0
move.l a4,d0
sub.l a2,d0
move.w d0,(sp)
Dtk0: move.l a3,d0 Detournement?
bpl.s .Skip
neg.l d0
move.l d0,a0
jsr (a0)
.Skip move.w (a6)+,d0
beq DtkFin
cmp.w #_TkLGo,d0
bls DtkVar
cmp.w #_TkExt,d0
bcs DtkCst
bclr #0,d5
tst.w d0
bmi DtkOpe Un operateur?
lea AdTokens(a5),a0
cmp.w #_TkPar1,d0
beq DtkP
cmp.w #_TkDFl,d0
beq DtkCst
cmp.w #_TkExt,d0
bne.s Dtk0a
* Detokenise une extension
move.w 2(a6),d1
move.b (a6),d2
ext.w d2
move.w d2,d3
lsl.w #2,d2
tst.l 0(a0,d2.w)
beq.s DtkEe
move.l 0(a0,d2.w),a0
lea 4(a0,d1.w),a0
move.l a0,a1
bra.s Dtk3
* Extension not present
DtkEe: lea ExtNot(pc),a0
add.b #"A",d3
add.b #$80,d3
move.l a0,a1
DtkEee tst.b (a1)+
bpl.s DtkEee
move.b d3,-1(a1)
move.w #"I",d3
bra.s Dtk3a
* Un operateur
DtkOpe lea Tst_Jumps(pc),a0
bra.s Dtk0b
* Instruction normale
Dtk0a move.l AdTokens(a5),a0
Dtk0b lea 4(a0,d0.w),a0
move.l a0,a1
Dtk3: tst.b (a1)+
bpl.s Dtk3
move.b (a1),d3
cmp.b #"O",d3
beq.s Dtk4
cmp.b #"V",d3
beq.s Dtk4
cmp.b #"0",d3 0->8 des fonctions
bcs.s Dtk3a
cmp.b #"9",d3
bcs.s Dtk4
* Met un espace avant s'il n'y en a pas!
Dtk3a: cmp.l a4,a2 * Debut de la ligne?
beq.s Dtk4
cmp.b #" ",-1(a4)
beq.s Dtk4
move.b #" ",(a4)+
* Doit prendre le token prececent?
Dtk4: move.b (a0),d1
cmp.b #$80,d1
bcs.s Dtk4x
cmp.b #$9f,d1
bhi.s Dtk4x
subq.l #4,a0
sub.b #$80,d1
beq.s Dtk4a
ext.w d1
sub.w d1,a0
bra.s Dtk4x
Dtk4a: move.b -(a0),d1
cmp.b #"!",d1
beq.s Dtk4x
cmp.b #$80,d1
bne.s Dtk4a
bra.s Dtk4
* Ecrit le mot
Dtk4x: cmp.b #"!",d1
bne.s Dtk4y
addq.l #1,a0
Dtk4y: move.b DtkMaj1(a5),d1
beq.s Dtk5
cmp.b #1,d1
beq.s Dtk6
bne.s Dtk8
* 0- Ecrit en MINUSCULES
Dtk5: move.b (a0)+,(a4)+
bpl.s Dtk5
and.b #$7f,-1(a4)
bra.s DtkE
* 1- Ecrit en MAJUSCULES
Dtk6: move.b (a0)+,d1
move.b d1,d2
and.b #$7f,d1
cmp.b #"a",d1
bcs.s Dtk7
cmp.b #"z",d1
bhi.s Dtk7
sub.b #"a"-"A",d1
Dtk7: move.b d1,(a4)+
tst.b d2
bpl.s Dtk6
bra DtkE
* 2- Ecrit AVEC UNE MAJUSCULE
Dtk8: move.b (a0)+,d1
move.b d1,d2
and.b #$7f,d1
cmp.b #"a",d1
bcs.s Dtk9
cmp.b #"z",d1
bhi.s Dtk9
sub.b #"a"-"A",d1
Dtk9: move.b d1,(a4)+
tst.b d2
bmi.s DtkE
Dtk9a: move.b (a0)+,d1
move.b d1,(a4)+
bmi.s Dtk9b
cmp.b #" ",d1
bne.s Dtk9a
bra.s Dtk8
Dtk9b: and.b #$7f,-1(a4)
* Met une espace si c'est une INSTRUCTION
DtkE: cmp.w #_TkRem1,d0
beq DtkRem
cmp.w #_TkRem2,d0
beq DtkRem
cmp.b #"I",d3
bne.s DtkE1
move.b #" ",(a4)+
* Saute le token...
DtkE1: move.l a6,a0
bsr TInst
move.l a0,a6
bra DtkLoop
* Ouverture de parenthese, jamais d'espace!
DtkP: cmp.l a4,a2
beq.s DtkP1
cmp.b #" ",-1(a4)
bne.s DtkP1
subq.l #1,a4
DtkP1: move.b #"(",(a4)+
bra.s DtkE1
; ----- Detokenisation de VARIABLE
DtkVar: btst #0,d5 * Si variable juste avant, met 32
beq.s DtkV0
cmp.b #" ",-1(a4)
beq.s DtkV0
move.b #" ",(a4)+
DtkV0: moveq #0,d2
move.b 2(a6),d2 * Longueur
move.w d2,d1
subq.w #1,d1
move.b 3(a6),d3 FLAG
lea 4(a6),a0
moveq #0,d4
cmp.w #_TkLab,d0
bne.s DtkV1
moveq #1,d4 D4: 0=> Variable
cmp.b #"0",(a0) 1=> Label
bcs.s DtkV1 -1=> Numero ligne
cmp.b #"9",(a0)
bhi.s DtkV1
moveq #-1,d4
DtkV1: move.b DtkMaj2(a5),d0
beq.s DtkV2
cmp.b #1,d0
beq.s DtkV3
bne.s DtkV5
* 0- En MINUSCULES
DtkV2: move.b (a0)+,d0
beq DtkVF
move.b d0,(a4)+
dbra d1,DtkV2
bra DtkVF
* 1- En MAJUSCULES
DtkV3: move.b (a0)+,d0
beq DtkVF
cmp.b #"a",d0
bcs.s DtkV4
cmp.b #"z",d0
bhi.s DtkV4
sub.b #"a"-"A",d0
DtkV4: move.b d0,(a4)+
dbra d1,DtkV3
bra DtkVF
* 2- Avec UNE MAJUSCULE
DtkV5: move.b (a6)+,d0
cmp.b #"a",d0
bcs.s DtkV6
cmp.b #"z",d0
bhi.s DtkV6
sub.b #"a"-"A",d0
DtkV6: move.b d0,(a4)+
dbra d1,DtkV2
* Saute la variable / met le flag de la variable
DtkVF: bset #0,d5
lea 4(a6,d2.w),a6
moveq #":",d0
tst.w d4
bmi DtkLoop
bne.s DtkV7
moveq #"#",d0
and.b #3,d3
cmp.b #1,d3
beq.s DtkV7
moveq #"$",d0
cmp.b #2,d3
bne DtkLoop
DtkV7: move.b d0,(a4)+
bra DtkLoop
; ----- Detokenise des constantes
DtkCst: bclr #0,d5 Si variable avant, met un espace!
beq.s DtkC0
cmp.b #" ",-1(a4)
beq.s DtkC0
move.b #" ",(a4)+
DtkC0: cmp.w #_TkEnt,d0
beq.s DtkC3
cmp.w #_TkHex,d0
beq.s DtkC4
cmp.w #_TkBin,d0
beq.s DtkC5
cmp.w #_TkFl,d0
beq.s DtkC6
cmp.w #_TkDFl,d0
beq.s DtkC7
* Detokenise une chaine alphanumerique
cmp.w #_TkCh1,d0
bne.s DtkC0a
moveq #'"',d0
bra.s DtkC0b
DtkC0a: moveq #"'",d0
DtkC0b: move.b d0,(a4)+
move.w (a6)+,d1
subq.w #1,d1
bmi.s DtkC2
DtkC1: move.b (a6)+,(a4)+
dbra d1,DtkC1
move.w a6,d1
btst #0,d1
beq.s DtkC2
addq.l #1,a6
DtkC2: move.b d0,(a4)+
bra DtkLoop
* Detokenise un chiffre entier
DtkC3: move.l (a6)+,d0
move.l a4,a0
JJsrR L_LongToDec,a1
move.l a0,a4
bra DtkLoop
* Detokenise un chiffre HEXA
DtkC4: move.l (a6)+,d0
move.l a4,a0
JJsrR L_LongToHex,a1
move.l a0,a4
bra DtkLoop
* Detokenise un chiffre BINAIRE
DtkC5: move.l (a6)+,d0
move.l a4,a0
JJsrR L_LongToBin,a1
move.l a0,a4
bra DtkLoop
* Detokenise un chiffre FLOAT simple precision
DtkC6: move.l (a6)+,d0
move.l a4,a0
moveq #-1,d4
moveq #0,d5
JJsrR L_FloatToAsc,a1
exg a0,a4
bra.s DtkC8
* Detokenise un chiffre FLOAT double precision
DtkC7 move.l (a6)+,d0
move.l (a6)+,d1
pea 2.w Automatique
pea 15.w 15 maxi
move.l a4,-(sp) Buffer
move.l d1,-(sp) Le chiffre
move.l d0,-(sp)
JJsrR L_DoubleToAsc,a1
lea 20(sp),sp
move.l a4,a0
.Fin tst.b (a4)+
bne.s .Fin
subq.l #1,a4
; Si pas 0.0, le met!
DtkC8 move.b (a0)+,d0 * Si pas de .0, le met!
beq.s DtkC9
cmp.b #".",d0
beq DtkLoop
cmp.b #"E",d0
beq DtkLoop
bra.s DtkC8
DtkC9 move.b #".",(a4)+
move.b #"0",(a4)+
bra DtkLoop
; ----- Token d'extension
DtkX: bra DtkLoop
; ----- REMarque
DtkRem: addq.w #2,a6 Saute la longueur
DtkR: tst.b (a6)
beq DtkLoop
move.b (a6)+,(a4)+
bra.s DtkR
; Fin de la DETOKENISATION
DtkFin: sub.l a2,a4 * Ramene PX
move.w a4,-2(a2)
move.l a4,a0
move.w (sp)+,d0
movem.l (sp)+,d2-d7/a2-a6
rts
; RAMENE LA TAILLE DE L'INSTRUCTION D0 en D1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TInst: tst.w d0
beq TFin
cmp.w #_TkLGo,d0
bls TVar
cmp.w #_TkCh1,d0
beq TCh
cmp.w #_TkCh2,d0
beq TCh
cmp.w #_TkRem1,d0
beq TCh
cmp.w #_TkRem2,d0
beq TCh
cmp.w #_TkDFl,d0
beq.s T8
cmp.w #_TkFl,d0
bls.s T4
cmp.w #_TkExt,d0
beq.s T4
cmp.w #_TkFor,d0
beq.s T2
cmp.w #_TkRpt,d0
beq.s T2
cmp.w #_TkWhl,d0
beq.s T2
cmp.w #_TkDo,d0
beq.s T2
cmp.w #_TkExit,d0
beq.s T4
cmp.w #_TkExIf,d0
beq.s T4
cmp.w #_TkIf,d0
beq.s T2
cmp.w #_TkElse,d0
beq.s T2
cmp.w #_TkElsI,d0
beq.s T2
cmp.w #_TkData,d0
beq.s T2
cmp.w #_TkProc,d0
beq.s T8
cmp.w #_TkOn,d0
beq.s T4
cmp.w #_TkEqu,d0
bcs.s T0
cmp.w #_TkStruS,d0
bls.s T6
T0: moveq #1,d1
TFin: rts
T2: addq.l #2,a0
bra.s T0
T4: addq.l #4,a0
bra.s T0
T8: addq.l #8,a0
bra.s T0
T6: addq.l #6,a0
bra.s T0
TCh: add.w (a0)+,a0
move.w a0,d1
btst #0,d1
beq.s T0
addq.l #1,a0
bra.s T0
TVar: moveq #0,d1
move.b 2(a0),d1
lea 4(a0,d1.w),a0
bra.s T0
; 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
; Donnees
; ~~~~~~~~~~~~~
H_1.3 dc.b "AMOS Basic v134 "
H_Pro dc.b "AMOS Pro101v",0,0,0,0
Equ_LVO dc.b 10,"_LVO",0
Equ_Nul dc.b 10,0
even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SOUS PROGRAMME UTILISE PAR VAL ET INPUT
; D0= Tenir compte du signe (TRUE)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CValRout
; - - - - - - - - - - - - -
movem.l a1-a2/d5-d7,-(sp)
move.l a0,d7
moveq #0,d4
move.l a0,a2
tst.w d0
beq.s Cal1c
; y-a-t'il un signe devant?
Cal1: move.b (a0)+,d0
beq Cal10
cmp.b #32,d0
beq.s Cal1
move.l a0,a2
subq.l #1,a2
cmp.b #"-",d0
bne.s Cal1a
not d4
bra.s Cal1c
Cal1a: cmp.b #"+",d0
beq.s Cal1c
Cal1b: subq.l #1,a0
Cal1c
; Explore le chiffre
; ~~~~~~~~~~~~~~~~~~
move.b (a0)+,d0
beq Cal10
cmp.b #32,d0
beq.s Cal1c
cmp.b #"$",d0 ;chiffre HEXA
beq Cal5
cmp.b #"%",d0 ;chiffre BINAIRE
beq Cal6
cmp.b #".",d0
beq.s Cal2
cmp.b #"0",d0
bcs Cal10
cmp.b #"9",d0
bhi Cal10
; c'estn chiffre DECIMAL: entier ou float?
Cal2: subq.l #1,a0
move.l a0,a1 ;si float: trouve la fin du chiffre
clr d3
Cal3: move.b (a1)+,d0
beq.s Cal4
cmp.b #32,d0
beq.s Cal3
cmp.b #"0",d0
bcs.s Cal3z
cmp.b #"9",d0
bls.s Cal3
Cal3z: cmp.b #".",d0 ;cherche une "virgule"
bne.s Cal3a
bset #0,d3 ;si deux virgules: fin du chiffre
beq.s Cal3
bne.s Cal4
Cal3a: cmp.b #"e",d0 ;cherche un exposant
beq.s Cal3b
cmp.b #"E",d0 ;autre caractere: fin du chiffre
bne.s Cal4
Cal3ab: move.b #"e",-1(a1) ;met un E minuscule!!!
Cal3b: move.b (a1)+,d0 ;apres un E, accepte -/+ et chiffres
cmp.b #32,d0
beq.s Cal3b
cmp.b #"+",d0
beq.s Cal3c
cmp.b #"-",d0
bne.s Cal3e
Cal3c: bset #1,d3 ;+ ou -: c'est un float!
Cal3d: move.b (a1)+,d0 ;puis cherche la fin de l'exposant
cmp.b #32,d0
beq.s Cal3d
Cal3e: cmp.b #"0",d0
bcs.s Cal4
cmp.b #"9",d0 ;chiffre! c'est un float
bls.s Cal3c
Cal4: tst d3 ;si d3=0: c'est un entier
beq Cal7
; conversion ASCII--->FLOAT
move.l a2,a0
subq.l #1,a1
movem.l a1/a3-a6,-(sp)
lea BuFloat(a5),a2
move.l a2,-(sp)
moveq #32,d1
Ca1: cmp.l a0,a1
beq.s Ca2
move.b (a0)+,d0
cmp.b #32,d0
beq.s Ca1
move.b d0,(a2)+
dbra d1,Ca1
Ca2: clr.b (a2)
clr.b 1(a2)
tst.b MathFlags(a5) Simple ou double precision?
bmi.s .Double
; Simple precision
Rjsr L_AscToFloat
addq.l #4,sp
move.l d0,d3
moveq #1,d2
move.w #_TkFl,d1 chiffre FLOAT
bset #0,MathFlags(a5) Un peu de maths
bra.s .FQuit
; Double precision
.Double Rjsr L_AscToDouble
addq.l #4,sp
move.l d0,d3
move.l d1,d4
moveq #1,d2
move.w #_TkDFl,d1
.FQuit movem.l (sp)+,a0/a3-a6
moveq #0,d0
bra.s CalOut
; chiffre hexa
Cal5: bsr Cexalong
move.w #_TkHex,d2
bra.s Cal8
; chiffre binaire
Cal6: bsr Cinlong
move.w #_TkBin,d2
bra.s Cal8
; chiffre entier
Cal7: bsr Ceclong
move.w #_TkEnt,d2
Cal8: exg d2,d1 ;type de conversion--->d1
tst d2
bne.s Cal10 ;si probleme: ramene zero!
move.l d0,d3
; Test du signe, si entier
tst d4
beq.s Cal8a
neg.l d3
Cal8a: moveq #0,d2
bra.s CalOut
; ramene zero
Cal10: moveq #0,d2 Erreur: ramene zero!
moveq #0,d3
move.l d7,a0
moveq #1,d0
; Sortie
CalOut movem.l (sp)+,a1-a2/d5-d7
rts
; MINI CHRGET POUR LES CONVERSIONS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cinichr move.b (a0)+,d2
beq.s .mc1
cmp.b #32,d2
beq.s Cinichr
cmp.b #"a",d2 ;si minuscule: majuscule
bcs.s .mc0
sub.b #"a"-"A",d2
.mc0 sub.b #48,d2
rts
.mc1 move.b #-1,d2
rts
; Minichr pour hexa
; ~~~~~~~~~~~~~~~~~
Cinichr2
move.b (a0)+,d2
beq.s .mc1
cmp.b #"a",d2 ;si minuscule: majuscule
bcs.s .mc0
sub.b #"a"-"A",d2
.mc0: sub.b #48,d2
rts
.mc1: move.b #-1,d2
rts
; CONVERSION DECIMAL->HEXA SUR QUATRE OCTETS, SIGNE!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ceclong moveq #0,d0
moveq #0,d2
moveq #0,d3
move.l a0,-(sp)
Cdh1: bsr Cinichr
Cdh1a: cmp.b #10,d2
bcc.s Cdh5
move d0,d1
mulu #10,d1
swap d0
mulu #10,d0
swap d0
tst d0
bne.s Cdh2
add.l d1,d0
bcs.s Cdh2
add.l d2,d0
bmi.s Cdh2
addq #1,d3
bra.s Cdh1
Cdh2: move.l (sp)+,a0
moveq #1,d1 ;out of range: bpl, et recupere l'adresse
rts
Cdh5: subq.l #1,a0
addq.l #4,sp
tst d3
beq.s Cdh7
moveq #0,d1 ;OK: chiffre en d0, et beq
rts
Cdh7: moveq #-1,d1 ;pas de chiffre: bmi
rts
; CONVERSION HEXA-ASCII EN HEXA-HEXA
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cexalong
moveq #0,d0
moveq #0,d2
moveq #0,d3
move.l a0,-(sp)
.hh1 bsr Cinichr2
cmp.b #10,d2
bcs.s .hh2
cmp.b #17,d2
bcs.s Cdh5
subq.w #7,d2
.hh2 cmp.b #16,d2
bcc.s Cdh5
lsl.l #4,d0
or.b d2,d0
addq.w #1,d3
cmp #9,d3
bne.s .hh1
beq.s Cdh2
; CONVERSION BINAIRE ASCII ---> HEXA SUR QUATRE OCTETS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Cinlong moveq #0,d0
moveq #0,d2
moveq #0,d3
move.l a0,-(sp)
.bh1 bsr Cinichr
cmp.b #2,d2
bcc.s Cdh5
roxr #1,d2
roxl.l #1,d0
bcs.s Cdh2
addq.w #1,d3
cmp.w #33,d3
bne.s .bh1
beq Cdh1
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INITIALISATION PROGRAMME COMPILE PART 1
; D0= Longueur du stack
; D1= Longueur buffer
; D2= Flags initialisation
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpInit1
; - - - - - - - - - - - - -
; Branche la routine de fin, si non definie
tst.l Prg_JError(a5)
bne.s .Skip
lea CmpQuit(pc),a0
move.l a0,Prg_JError(a5)
.Skip
; Stocke les flags de demarrage. Negatif >>> abort!
move.w d2,DefFlag(a5)
bmi.s .Mem
; Longueur du stack ***
; Flag WB2.0
move.l $4.w,a0
cmp.w #36,$14(a0)
bcs.s .Pa20
move.w $14(a0),WB2.0(a5)
.Pa20
; Init VARBUF
move.l d1,d0
SyCall MemFastClear
beq.s .Mem
move.l a0,VarBuf(a5)
move.l d1,VarBufL(a5)
; Ok, Passe aux autres inits
move.w #-1,T_AMOState(a5)
rts
; Out of memory
.Mem moveq #2,d0
move.l Prg_JError(a5),a1
jmp (a1)
; - - - - - - - - - - - - -
CmpQuit
; - - - - - - - - - - - - -
movem.l a0/d0,-(sp) Sauve les erreurs
move.w #-2,DefFlag(a5)
Rbsr L_DefRun1
Rjsr L_Bnk.EffAll
Rbsr L_CmpClearVar
Rbsr L_CmpLibrariesStop
lea Sys_EndRoutines(a5),a1 Appelle les routines de fin
SyCall CallRoutines
SyCall MemFlush Enleve les routines flush
Rbsr L_CmpLibClose
Rbsr L_CmpEffVarBuf
; Retourne a l'appellant!
movem.l (sp)+,a0/d0
move.l BasSp(a5),sp
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INITIALISATION PROGRAMME COMPILE PART 2
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpInit2
; - - - - - - - - - - - - -
tst.l d0 Un probleme dans les extensions?
bne.s .Quit
; Initialisation ecrans
move.w DefFlag(a5),d5 Flags de demarrage
moveq #-2,d0
btst #FPrg_Default,d5 Ecran par defaut?
beq.s .Skip1
moveq #-1,d0
.Skip1 move.w d0,DefFlag(a5)
btst #FPrg_DefRunAcc,d5 Programme en accessoire?
bne.s .Acc
Rbsr L_DefRun1
Rbsr L_DefRun2
bra.s .Skip2
.Acc Rbsr L_DefRunAcc
.Skip2 move.w #-1,DefFlag(a5) Pour le prochaine Default
; Force l'affichage
SyCall WaitVbl
EcCall CopForce
; Fin de l'init
Rbsr L_CmpClearVar >>> Change A6
; Fait passer devant le workbench?
btst #FPrg_Wb,d5 Flag workbench?
bne.s .WB
EcCalD AMOS_WB,1
.WB rts
.Quit move.l Prg_JError(a5),a1
jmp (a1)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INITIALISATION / SORTIE AMOS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp AMOSInit
; - - - - - - - - - - - - -
move.l (sp)+,a1
; Sauvegarde des donnees du programme courant
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
movem.l a3-a6/d6/d7,-(sp)
move.l Prg_JError(a5),-(sp)
move.l EveLabel(a5),-(sp)
move.l BasSp(a5),-(sp)
move.l sp,BasSp(a5)
; Preparation des variables du programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea AMOSQuit(pc),a0
move.l a0,Prg_JError(a5)
clr.l EveLabel(a5)
move.l TabBas(a5),d7
sub.l a6,a6
jmp (a1)
; - - - - - - - - - - - - -
AMOSQuit
; - - - - - - - - - - - - -
move.l BasSp(a5),sp
move.l (sp)+,BasSp(a5)
move.l (sp)+,EveLabel(a5)
move.l (sp)+,Prg_JError(a5)
movem.l (sp)+,a3-a6/d6/d7
; Si erreur dans le programme: appelle les routines DEFAULT / END
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
movem.l a0/d0,-(sp)
lea Sys_ErrorRoutines(a5),a1
SyCall CallRoutines
lea Sys_ClearRoutines(a5),a1
SyCall CallRoutines
lea Sys_DefaultRoutines(a5),a1
SyCall CallRoutines
lea Sys_EndRoutines(a5),a1
SyCall CallRoutines
movem.l (sp)+,a0/d0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MODE DEBUG: rajoute "At Line" au message d'erreur
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpDbMode
; - - - - - - - - - - - - -
move.l (sp),a0 Branche la routine sur le retour
lea .Debug(pc),a1
move.l a1,(sp)
move.l sp,BasSp(a5)
jmp (a0)
.Debug tst.w d0 Une erreur?
beq.s .End
move.l d0,-(sp)
lea .Buffer(pc),a2
move.l a0,d1
beq.s .NoMess
move.l d1,a1
.Copy1 move.b (a1)+,(a2)+
bne.s .Copy1
subq.l #1,a2
.NoMess lea .Atline(pc),a1
.Copy2 move.b (a1)+,(a2)+
bne.s .Copy2
lea -1(a2),a0
moveq #0,d0
move.w Cmp_Ligne(a5),d0
Rjsr L_LongToDec
clr.b (a0)
move.l (sp)+,d0
lea .Buffer(pc),a0
; Retourne au header
.End rts
.Buffer ds.b 128
.Atline dc.b " at line ",0
even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MODE DEBUG 1 : imprime le numero de la ligne sur le CLI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpLineCLI
; - - - - - - - - - - - - -
moveq #0,d0
move.w Cmp_Ligne(a5),d0
move.l Buffer(a5),a0
move.b #"(",(a0)+
Rjsr L_LongToDec
move.b #")",(a0)+
move.l a0,d3
move.l Buffer(a5),d2
sub.l d2,d3
Rbra L_CmpPrintCLI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MODE DEBUG 2 : imprime le numero su run ecran AMOS en front
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpLineSER
; - - - - - - - - - - - - -
moveq #0,d0
move.w Cmp_Ligne(a5),d0
move.l Buffer(a5),a0
move.b #"(",(a0)+
Rjsr L_LongToDec
move.b #")",(a0)+
move.l a0,d3
move.l Buffer(a5),d2
sub.l d2,d3
Rbra L_CmpPrintSER
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Imprime la chaine D2/D3 sur le CLI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpPrintCLI
; - - - - - - - - - - - - -
move.l a6,-(sp)
move.l DosBase(a5),a6
jsr -60(a6)
move.l d0,d1
beq.s .Exit
jsr _LVOWrite(a6)
.Exit move.l (sp)+,a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Imprime la chaine D2/D3 sur le AMOS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpPrintSER
; - - - - - - - - - - - - -
; tst.w Cmp_DebugScreen(a5)
; bne.s .Done
; movem.l d0-d7/a0-a3,-(sp)
; moveq #8,d1 Ecran editeur
; move.w #640,d2
; move.w #8*8,d3
; moveq #2,d4
; move.w #$8000,d5
; moveq #4,d6
; lea DefPal(a5),a1
; EcCall Cree
; beq.s .End
; move.w #8,Cmp_DebugScreen(a5)
;.Done rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Effacement du buffer de variables
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpEffVarBuf
; - - - - - - - - - - - - -
move.l VarBuf(a5),d0
beq.s .skip
move.l d0,a1
move.l VarBufL(a5),d0
SyCall MemFree
clr.l VarBuf(a5)
.skip rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; APPEL INITIALISATION DES EXTENSIONS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpLibrariesInit
; - - - - - - - - - - - - -
tst.b AdTokens(a5,d0.w)
bne.s .Dejala
addq.b #1,AdTokens(a5,d0.w) On la met!
move.w d0,-(sp) # extension
move.l Name1(a5),a1 Command line vide
clr.b (a1)
move.l #"APex",d1 Code AMOSPro
move.l #VerNumber,d2 Numero de version
jsr (a0) Appel
move.w (sp)+,d3
ext.w d0 Refuse de charger...
bpl.s .Nomi
move.l a0,d0
cmp.l #"Err!",d1 Un Message?
beq.s .Mess
.Err moveq #-2,d0 Message header 1: cannot load ext
bra.s .Out
.Mess moveq #-1,d0 Message en A0
.Out rts
.Nomi cmp.w d0,d3 Bon numero d'extension?
bne.s .Err
.Dejala moveq #0,d0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ARRET DES LIBRAIRIES Extensions
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpLibrariesStop
; - - - - - - - - - - - - - - - -
movem.l a2-a6/d2-d7,-(sp)
moveq #26-1,d2
lea ExtAdr+26*16-16(a5),a2
lea AdTokens+26-1(a5),a3
.Loop tst.b (a3) Une extension?
beq.s .Next
subq.b #1,(a3) Decremente le compteur
bne.s .Next
move.l 8(a2),d0 Une routine de fin?
beq.s .Next
move.l d0,a0
movem.l a2/a3/d2,-(sp) Appel de la routine de fin
jsr (a0)
movem.l (sp)+,a2/a3/d2
move.l a2,a0
clr.l (a0)+ Efface les pointeurs
clr.l (a0)+
clr.l (a0)+
clr.l (a0)+
.Next lea -16(a2),a2
subq.l #1,a3
dbra d2,.Loop
movem.l (sp)+,a2-a6/d2-d7
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Ferme les libraries mathematiques
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpLibClose
; - - - - - - - - - - - - -
move.l a6,-(sp)
move.l $4.w,a6
move.l FloatBase(a5),d0
beq.s .SkipM1
move.l d0,a1
jsr _LVOCloseLibrary(a6)
clr.l FloatBase(a5)
.SkipM1 move.l MathBase(a5),d0
beq.s .SkipM2
move.l d0,a1
jsr _LVOCloseLibrary(a6)
clr.l MathBase(a5)
.SkipM2 move.l DFloatBase(a5),d0
beq.s .SkipM3
move.l d0,a1
jsr _LVOCloseLibrary(a6)
clr.l DFloatBase(a5)
.SkipM3 move.l DMathBase(a5),d0
beq.s .SkipM4
move.l d0,a1
jsr _LVOCloseLibrary(a6)
clr.l DMathBase(a5)
.SkipM4 move.l (sp)+,a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; NETTOYAGES DES VARIABLES pour programme CLI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpClearVar
; - - - - - - - - - - - - -
movem.l d0-d6/a0-a5,-(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
Rjsr 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
; ~~~~~~~~~~~~~~~~~~~~~~~~
Rjsr L_Bnk.EffTemp
Rjsr L_Bnk.Change
Rjsr L_MenuReset
Rjsr L_Dia_WarmInit
clr.l EveLabel(a5)
; Rjsr L_FillFFree * Fait!
; Rjsr L_CloAll * Fait!
; Rjsr L_PRT_Close * Fait!
; Rjsr L_Dev.Close * Fait!
; Rjsr L_Lib.Close * Fait!
; Rjsr L_Arx_Close * Fait!
; Rjsr L_MnRaz * Fait!
; Rjsr L_OMnEff * Fait!
; Rjsr L_Dia_CloseChannels * Fait!
; Rjsr L_ResTempBuffer * Fait!
; Variables
; ~~~~~~~~~
move.l VarBuf(a5),d0
beq.s .Nul
move.l d0,a0
move.l a0,a1
add.l VarBufL(a5),a1
move.l a1,TabBas(a5)
move.l a1,d7 VGlobales
; clr.l VarLoc(a5) Au depart
sub.l a6,a6
move.l a0,LoChaine(a5)
move.l a0,ChVide(a5)
move.l a0,ParamC(a5)
clr.w (a0)+
move.l a0,HiChaine(a5)
.Nul
; Init float
; ~~~~~~~~~~
move.w #-1,FixFlg(a5)
clr.w ExpFlg(a5)
movem.l (sp)+,d0-d6/a0-a5
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Operateur PLUS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PlusF
; - - - - - - - - - - - - -
moveq #_LVOSPAdd,d2
Rjmpt L_Float_Operation
; - - - - - - - - - - - - -
Lib_Cmp PlusC
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,a2
moveq #0,d3
move.w (a0),d3 ;taille de la deuxieme chaine
beq.s plus11 ;deuxieme chaine nulle
moveq #0,d0
move.w (a2),d0
beq.s plus10 ;premiere chaine nulle
add.l d0,d3
cmp.l #String_Max,d3
Rbcc L_StooLong ;string too long!
move.l a0,-(sp)
Rbsr L_Demande
move.w d3,(a0)+ ;poke la taille resultante
move.w (a2)+,d0
beq.s plus4
subq.w #1,d0
plus3: move.b (a2)+,(a0)+ ;recopie de la premiere chaine
dbra d0,plus3
plus4: move.l (sp)+,a2
move.w (a2)+,d0
beq.s plus6
subq #1,d0
plus5: move.b (a2)+,(a0)+
dbra d0,plus5
plus6: move.w a0,d0 ;rend pair
btst #0,d0
beq.s plus7
addq.l #1,a0
plus7: move.l a0,HiChaine(a5)
move.l a1,d3
rts
plus10: move.l a0,d3 ;premiere chaine nulle: ramene la deuxieme
rts
plus11: move.l a2,d3 ;deuxieme chaine nulle: ramene la premiere
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Operateur moins
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp MoinsF
; - - - - - - - - - - - - -
moveq #_LVOSPSub,d2
Rjmpt L_Float_Operation
; - - - - - - - - - - - - -
Lib_Cmp MoinsC
; - - - - - - - - - - - - -
move.l d3,d4 ;sauve pour plus tard
move.l (a3)+,a2
clr.l d3
move.w (a2)+,d3
move.l d3,d1
Rbsr L_Demande ;prend la place une fois pour toute!
move.w d3,(a0)+
beq.s ms4
addq #1,d3
lsr #1,d3
subq #1,d3
ms3: move.w (a2)+,(a0)+ ;recopie la chaine
dbra d3,ms3
ms4: move.l a0,HiChaine(a5)
addq.l #2,a1 ;chaine dont auquelle on soustrait en a1/d1
move.l d4,a2
clr.l d2
move (a2)+,d2 ;chaine a soustraire en a2/d2
ms5: clr.l d4
movem.l d1-d2/a1-a3,-(sp)
Rbsr L_InstrFind
movem.l (sp)+,d1-d2/a1-a3
tst.l d3
beq.s ms9
move.l a1,a0
move.l a1,d4 ;pour plus tard!
subq.l #1,d3
move.l d3,d5 ;taille du debut a garder
add.l d3,a1 ;pointe ou transferer la fin
add.l d2,d3
add.l d3,a0 ;pointe la fin a recopier
sub.l d3,d1
add.l d1,d5 ;taille finale en memoire
subq.l #1,d1
bmi.s ms7
ms6: move.b (a0)+,(a1)+
dbra d1,ms6
ms7: move a0,d0 ;rend pair
btst #0,d0
beq.s ms8
addq.l #1,a0
ms8: move.l a0,HiChaine(a5)
move.l d4,a1
move.w d5,-2(a1)
move.l d5,d1
bra.s ms5
ms9: moveq #2,d2
move.l a1,d3
subq.l #2,d3
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Operateur MULTIPLIE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp MultE
; - - - - - - - - - - - - -
move.l (a3)+,d2
clr d4 ;multiplication signee 32*32 bits
tst.l d3 ;aabb*ccdd
bpl.s mlt1
neg.l d3
not d4
mlt1: tst.l d2 ;tests des signes
bpl.s mlt2
neg.l d2
not d4
* Peut on faire une mult rapide?
mlt2: cmp.l #$00010000,d3
bcc.s mlt0
cmp.l #$00010000,d2
bcc.s mlt0
mulu d2,d3 ;quand on le peut: multiplication directe!
tst.w d4
beq.s mltF
neg.l d3
bra.s mltF
* Multipcation lente
mlt0: move d2,d1
mulu d3,d1
bmi.s mltO
swap d2
move d2,d0
mulu d3,d0
swap d0
bmi.s mltO
tst d0
bne.s mltO
add.l d0,d1
bvs.s mltO
swap d3
move d2,d0
mulu d3,d0
bne.s mltO
swap d2
move d2,d0
mulu d3,d0
swap d0
bmi.s mltO
tst d0
bne.s mltO
add.l d0,d1
bvs.s mltO
tst d4 ;signe du resultat
beq.s mlt3
neg.l d1
mlt3: move.l d1,d3
mltF: rts
mltO Rbra L_OverFlow
; - - - - - - - - - - - - -
Lib_Cmp MultF
; - - - - - - - - - - - - -
moveq #_LVOSPMul,d2
Rjmpt L_Float_Operation
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Operateur DIVISE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp DiviseE
; - - - - - - - - - - - - -
move.l (a3)+,d2
moveq #0,d4
tst.l d2
bpl.s dva
bset #31,d4
neg.l d2
dva: tst.l d3
Rbeq L_DByZero ;division par zero!
bpl.s dvb
bchg #31,d4
neg.l d3
dvb: cmp.l #$10000,d3 ;Division rapide ou non?
bcc.s dv0
move.l d2,d0
divu d3,d0 ;division rapide: 32/16 bits
bvs.s dv0
moveq #0,d3
move d0,d3
bra.s dvc
dv0: move.w #31,d4 ;division lente: 32/32 bits
moveq #-1,d5
clr.l d1
dv2: lsl.l #1,d2
roxl.l #1,d1
cmp.l d3,d1
bcs.s dv1
sub.l d3,d1
lsr.l #1,d5 ;met X a un!
dv1: roxl.l #1,d0
dbra d4,dv2
move.l d0,d3
dvc: tst.l d4
bpl.s dvd
neg.l d3
dvd: rts
; - - - - - - - - - - - - -
Lib_Cmp DiviseF
; - - - - - - - - - - - - -
Rjsrt L_Float_Test
Rbeq L_DByZero
moveq #_LVOSPDiv,d2
Rjmpt L_Float_Operation
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Operateur PUISSANCE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Puissance
; - - - - - - - - - - - - -
moveq #_LVOSPPow,d2
Rjmpt L_Math_Operation
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Operateur MODULO
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Modulo
; - - - - - - - - - - - - -
move.l d6,-(sp)
move.l (a3)+,d6
tst.l d3
bpl.s mdv3
neg.l d3
mdv3: moveq #31,d2 ;division lente: 32/32 bits
moveq #-1,d4
clr.l d1
mdv2: lsl.l #1,d6
roxl.l #1,d1
cmp.l d3,d1
bcs.s mdv1
sub.l d3,d1
lsr #1,d4 ;met X a un!
mdv1: roxl.l #1,d0
dbra d2,mdv2
move.l d1,d3 ;prend le reste!
move.l (sp)+,d6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Comparaison de deux chaines
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Chaine_Compare
; - - - - - - - - - - - - -
move.l (a3)+,a0
move.l d3,a1
moveq #0,d3
moveq #0,d4
clr.b d2
move.w (a0)+,d0
move.w (a1)+,d1
beq.s cpch8
tst d0
beq.s cpch7
cpch1: cmpm.b (a0)+,(a1)+
bne.s cpch6
subq #1,d0
beq.s cpch3
subq #1,d1
bne.s cpch1
; on est arrive au bout d'une des chaines
cpch2: moveq #1,d4 A$>B$
bra.s cpch5
cpch3: subq #1,d1 egalite!
beq.s cpch5
cpch4: moveq #1,d3 B$>A$
cpch5: cmp.l d4,d3 Positionne les bits
rts
; on est arrive au bout des chaines
cpch6: bcc.s cpch4
bcs.s cpch2
; a$ est nulle
cpch7: tst d1
bne.s cpch4 ;B$>A$
bra.s cpch5
; b$ est nulle
cpch8: tst d0
bne.s cpch2 ;A$>B$
bra.s cpch5
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; DEFRUN: initialisation graphique
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp DefRun1
; - - - - - - - - - - - - -
tst.w DefFlag(a5)
beq DRunX
movem.l d0-d7/a0-a6,-(sp)
; Enleve les animations
; ~~~~~~~~~~~~~~~~~~~~~
SyCall AMALClr
clr.w PAmalE(a5)
; Enleve les rainbows
; ~~~~~~~~~~~~~~~~~~~
EcCalD RainDel,-1
; Appel des routines de nettoyage
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea Sys_DefaultRoutines(a5),a1
SyCall CallRoutines
; Enleve tous les ecrans
; ~~~~~~~~~~~~~~~~~~~~~~
move.w PI_DefEBa(a5),ColBack(a5)
moveq #0,d1
moveq #7,d2
EcCall DelAll
clr.w ScOn(a5)
clr.l ScOnAd(a5)
move.w #8,CurTab(a5) Tab par defaut
; Enleve le tempras
; ~~~~~~~~~~~~~~~~~
clr.l RasLock(a5)
Rjsr L_FreeRas
; Enleve les blocs!
; ~~~~~~~~~~~~~~~~~
EcCall CBlRaz
EcCall BlRaz
; Enleve les font-infos
; ~~~~~~~~~~~~~~~~~~~~~
EcCall FFonts
; RAZ des canaux d'animation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
lea AnCanaux(a5),a0
moveq #0,d0
DRun1: clr.b (a0)+
move.b d0,(a0)+
addq.w #1,d0
cmp.w #64,d0
bne.s DRun1
; Priority off
; ~~~~~~~~~~~~
moveq #0,d1
moveq #0,d2
SyCall SPrio
; RAZ des scrollings
; ~~~~~~~~~~~~~~~~~~
moveq #NDScrolls-1,d0
lea DScrolls(a5),a0
DRun2: move.w #$8000,(a0)
lea 12(a0),a0
dbra d0,DRun2
; Interruptions branchees
; ~~~~~~~~~~~~~~~~~~~~~~~
clr.w InterOff(a5)
move.w InterOff(a5),d1
SyCall SetSync
move.w #%0111000100000000,ActuMask(a5)
clr.w VBLDelai(a5)
clr.w VBLOCount(a5)
; Copie la palette par defaut
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea PI_DefEPa(a5),a0
lea DefPal(a5),a1
moveq #31,d0
EdTr: move.w (a0)+,(a1)+
dbra d0,EdTr
; Call extensions
; ~~~~~~~~~~~~~~~
Rbsr L_DefRunExtensions
; Cree l'ecran (si pas system!)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.w #-2,DefFlag(a5)
beq.s DRex0
move.w PI_DefETx(a5),d2
ext.l d2
move.w PI_DefETy(a5),d3
ext.l d3
move.w PI_DefECo(a5),d4
ext.l d4
move.w PI_DefEMo(a5),d5
move.w PI_DefECoN(a5),d6
moveq #0,d7
lea DefPal(a5),a1
EcCalD Cree,0
bne.s DRex0
move.l a0,ScOnAd(a5)
move.w #1,ScOn(a5)
move.l #EntNul,d4
move.l d4,d5
move.w PI_DefEWx(a5),d2 Si non initialise...
bne.s .Skip1
move.l d4,d2
.Skip1 move.w PI_DefEWy(a5),d3
bne.s .Skip2
move.l d4,d3
.Skip2 EcCalD AView,0
; Fait flasher la couleur 3 (si plus de 2 couleurs)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.w #1,PI_DefECo(a5)
beq.s DRex0
moveq #3,d1
moveq #46,d0
Rjsr L_Sys_GetMessage
move.l a0,a1
EcCall Flash
DRex0 movem.l (sp)+,d0-d7/a0-a6
DRunX rts
; - - - - - - - - - - - - -
Lib_Cmp DefRun2
; - - - - - - - - - - - - -
tst.w DefFlag(a5)
beq.s .Out
clr.w DefFlag(a5)
; Limite la souris
; ~~~~~~~~~~~~~~~~
move.w T_DefWX(a5),d1
move.w T_DefWY(a5),d2
move.w PI_DefETx(a5),d3
move.w PI_DefETy(a5),d4
subq.w #1,d3
subq.w #1,d4
add.w d1,d3
add.w d2,d4
lsl.w #1,d1
lsl.w #1,d2
lsl.w #1,d3
lsl.w #1,d4
lea LimSave(a5),a0
move.w d1,(a0)+
move.w d2,(a0)+
move.w d3,(a0)+
move.w d4,(a0)+
lea T_MouXMin(a5),a0
tst.l (a0)
bne.s .Skip
move.w d1,(a0)+
move.w d2,(a0)+
move.w d3,(a0)+
move.w d4,(a0)+
.Skip move.l PI_ParaTrap+16(a5),d1 * Nombre de lignes
SyCall SBufHs
SyCall OffHs
SyCall StoreM
SyCall StoreM
SyCall AffHs
.Out rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; DEFRUNACC: semi initialisation graphique pour accessoires
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp DefRunAcc
; - - - - - - - - - - - - -
movem.l d0-d7/a0-a6,-(sp)
; Appel des routines de nettoyage
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea Sys_DefaultRoutines(a5),a1
SyCall CallRoutines
; Enleve les animations
; ~~~~~~~~~~~~~~~~~~~~~
SyCall AMALClr
clr.w PAmalE(a5)
; RAZ des canaux d'animation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
lea AnCanaux(a5),a0
moveq #0,d0
.DRun1 clr.b (a0)+
move.b d0,(a0)+
addq.w #1,d0
cmp.w #64,d0
bne.s .DRun1
; Priority off
; ~~~~~~~~~~~~
moveq #0,d1
moveq #0,d2
SyCall SPrio
; RAZ des scrollings
; ~~~~~~~~~~~~~~~~~~
moveq #NDScrolls-1,d0
lea DScrolls(a5),a0
.DRun2 move.w #$8000,(a0)
lea 12(a0),a0
dbra d0,.DRun2
; Interruptions branchees
; ~~~~~~~~~~~~~~~~~~~~~~~
clr.w InterOff(a5)
move.w InterOff(a5),d1
SyCall SetSync
move.w #%0111000100000000,ActuMask(a5)
clr.w VBLDelai(a5)
clr.w VBLOCount(a5)
; Call extensions
; ~~~~~~~~~~~~~~~
Rbsr L_DefRunExtensions
; Sprites
; ~~~~~~~
SyCall OffHs
SyCall AffHs
move.w #1,DefFlag(a5)
movem.l (sp)+,d0-d7/a0-a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INITIALISATION ECRAN DES EXTENSIONS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp DefRunExtensions
; - - - - - - - - - - - - -
movem.l a2-a6/d2-d7,-(sp)
.DRex0 lea ExtAdr(a5),a0
moveq #26-1,d0
.DRex1 move.l 4(a0),d1
beq.s .DRex2
move.l d1,a1
movem.l a0/d0,-(sp)
jsr (a1)
movem.l (sp)+,a0/d0
.DRex2 lea 16(a0),a0
dbra d0,.DRex1
movem.l (sp)+,a2-a6/d2-d7
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; END
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InEnd
; - - - - - - - - - - - - -
moveq #NbEnd,d0
Rbra L_GoError
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TEST INTER SANS SAUT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Test_PaSaut
; - - - - - - - - - - - - -
movem.l d0-d7/a0-a2,-(sp)
bset #Bit_PaSaut,Test_Flags(a5)
Rbsr L_Test_Normal
bclr #Bit_PaSaut,Test_Flags(a5)
movem.l (sp)+,d0-d7/a0-a2
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TEST NORMAL
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Test_Normal
; - - - - - - - - - - - - -
moveq #1,d6
tst.b T_Actualise(a5)
Rbmi L_Test_Force
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TEST FORCE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Test_Force
; - - - - - - - - - - - - -
move.w ActuMask(a5),d4
; Inhibition par un autre AMOS?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SyCall Test_Cyclique
; Les dialogues???
; ~~~~~~~~~~~~~~~~
move.l Cur_Dialogs(a5),a0 Un dialogue?
tst.l (a0)
beq.s .NoDia
move.l GoTest_Dialog(a5),a0
jsr (a0)
beq.s .NoDia
add.w #IDia_Errors,d0
Rbra L_Error
.NoDia
; Les menus???
; ~~~~~~~~~~~~
btst #BitMenu,d4 Menus en route?
beq.s Tst0
tst.l MnBase(a5) Un menu defini?
beq.s Tst0
tst.w MnProc(a5) Pas dans une procedure menu
bne.s Tst0
tst.l T_ClLast(a5) Une touche?
beq.s Tst0a
tst.w Direct(a5) Pas en mode direct
bne.s Tst0a
move.l GoTest_MenuKey(a5),a0 Appelle la routine
jsr (a0)
Tst0a btst #10,$dff016 Afficher le menu?
bne.s Tst0
move.l GoTest_Menus(a5),a0
jsr (a0)
Rbne L_Error
; Autres choses???
; ~~~~~~~~~~~~~~~~
Tst0 move.w T_Actualise(a5),d3
bclr #BitControl,d3
bne.s Tst00
and.w d4,d3
beq TstX1
bra.s Tst1
; CONTROLE-C?
; ~~~~~~~~~~~
Tst00 tst.l Mon_Base(a5) Retour au moniteur?
bne.s IStop
btst #BitControl,d4 Break autorise?
beq.s Tst01
IStop move.w d3,T_Actualise(a5)
moveq #9,d0
Rbra L_Error
Tst01 move.w d3,T_Actualise(a5)
move.l GoTest_OnBreak(a5),d0
beq.s Tst1a
move.l d0,a0
jsr (a0)
bra.s Tst1a
; Branchement automatique aux menus?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tst1 bclr #BitJump,d3
beq.s Tst1a
move.l GoTest_GoMenu(a5),a0
jsr (a0)
; Actualisation des ecrans/animations
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Tst1a move.w T_VblCount+2(a5),d0
sub.w VBLOCount(a5),d0
cmp.w VBLDelai(a5),d0
bcs TstX1
move.w T_VblCount+2(a5),VBLOCount(a5)
; Bobs?
bclr #BitBobs,d3
beq.s Tst2
SyCall EffBob
SyCall ActBob
SyCall AffBob
EcCall SwapScS
; Hard Sprites?
Tst2: bclr #BitSprites,d3
beq.s Tst3
SyCall ActHs
SyCall AffHs
; Extensions?
Tst3: lsr.b #1,d3
beq.s Tst4
lea ExtTests(a5),a1
bra.s Tst3b
Tst3a move.l (a1),d0
beq.s Tst3b
move.l d0,a0
jsr (a0)
Tst3b addq.l #4,a1
lsr.b #1,d3
bcs.s Tst3a
bne.s Tst3b
; Ecrans?
Tst4: bclr #BitEcrans,d3
beq.s Tst5
EcCall CopMake
Tst5:
; Correction du bug CONTROL-C / Beaucoup de sprites
move.w T_Actualise(a5),d0
and.w #%0000000100000000,d0 BITCONTROL=8
or.w d0,d3
; Every
; ~~~~~
TstX1 move.w d3,T_Actualise(a5)
btst #BitEvery,d4
beq.s TstX2
tst.w T_EveCpt(a5)
bgt.s TstX2
move.w EveCharge(a5),T_EveCpt(a5)
bclr #BitEvery,d4
move.l GoTest_Every(a5),a0
jsr (a0)
TstX2 bclr #BitVBL,T_Actualise(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait le branchement ON MENU
; Appele par TESTS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp GoMenu
; - - - - - - - - - - - - -
tst.w EveLabel(a5)
bmi.s .GoMX
lea MnChoix(a5),a0
move.w (a0),d0
beq.s .GoMX
cmp.w OMnNb(a5),d0
bls.s .GoMGo
.GoMX: rts
; Fait le branchement
.GoMGo bclr #BitJump,d4 Restore les actualisations
move.w d4,ActuMask(a5)
move.w d3,T_Actualise(a5)
Rbsr L_GetInstruction Adresse de l'instruction courante
moveq #1,d6 Pour les erreurs
move.l BasA3(a5),a3 Pile parametres
move.l Cmp_LowPile(a5),sp
move.l OMnBase(a5),a0
lsl.w #2,d0
move.l -4(a0,d0.w),a0 Adresse du saut
tst.w OMnType(a5)
bmi.s GoMG2
beq.s GoMG1
; 1: Procedure!
move.l a1,-(sp) Adresse de retour
jmp (a0)
; 0: Gosub
GoMG1 move.l a1,-(sp) Simple JSR
move.l sp,Cmp_LowPile(a5)
jmp (a0)
; -1: Goto
GoMG2 jmp (a0) Simple JMP
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait le branchement a ON BREAK *** Brancher / Tester
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp OnBreakGo
; - - - - - - - - - - - - -
btst #Bit_PaSaut,Test_Flags(a5)
beq.s .Skip
tst.l OnBreak(a5)
bne.s .Jmp
.Skip rts
.Jmp Rbsr L_GetInstruction Instruction courante
moveq #1,d6 Pas d'erreur
move.l Cmp_LowPile(a5),sp
move.l a1,-(sp)
move.l OnBreak(a5),a0
jmp (a0)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait le branchement a EVERY *** Tester
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp EveJump
; - - - - - - - - - - - - -
tst.l EveLabel(a5)
bne.s EveJ1
EveJ0 rts
; Branche!
EveJ1 bmi.s EveJ0
bclr #BitEvery,d4
move.w d4,ActuMask(a5)
Rbsr L_GetInstruction Adresse instruction courante
moveq #1,d6 Pas de probleme erreur
move.l Cmp_LowPile(a5),sp Restore la pile
move.l EveLabel(a5),a0 Le label
tst.w EveType(a5)
bne.s EveJ2
; Gosub!
move.l a1,-(sp)
move.l sp,Cmp_LowPile(a5)
jmp (a0)
; Procedure!
EveJ2 move.l a1,-(sp)
jmp (a0)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Erreurs de la premiere partie
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - -
Lib_Cmp RIllDir
; - - - - - - - - - - - - -
moveq #17,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp OOfData
; - - - - - - - - - - - - -
moveq #33,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp OOfBuf
; - - - - - - - - - - - - -
moveq #11,d0 Out of buffer space
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp InpTL
; - - - - - - - - - - - - -
moveq #DEBase+20,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp EProErr
; - - - - - - - - - - - - -
moveq #8,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp ResLNo
; - - - - - - - - - - - - -
moveq #6,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp NoOnErr
; - - - - - - - - - - - - -
moveq #5,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp ResPLab
; - - - - - - - - - - - - -
moveq #4,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp NoResume
; - - - - - - - - - - - - -
moveq #3,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp NoErr
; - - - - - - - - - - - - -
moveq #7,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp OofStack
; - - - - - - - - - - - - -
moveq #13,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp NonDim
; - - - - - - - - - - - - -
moveq #27,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp AlrDim
; - - - - - - - - - - - - -
moveq #28,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp DByZero
; - - - - - - - - - - - - -
moveq #20,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp OverFlow
; - - - - - - - - - - - - -
moveq #29,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp RetGsb
; - - - - - - - - - - - - -
moveq #1,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp PopGsb
; - - - - - - - - - - - - -
moveq #2,d0
Rbra L_Error
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TRAITEMENT DES ERREURS RunErr:
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Error
; - - - - - - - - - - - - -
moveq #19,d1
moveq #-1,d2
Rbra L_ErrorExt
; - - - - - - - - - - - - -
Lib_Cmp ErrorExt
; - - - - - - - - - - - - -
; Recupere les registres?
; ~~~~~~~~~~~~~~~~~~~~~~~
tst.b ErrorRegs(a5)
beq.s .Skip
clr.b ErrorRegs(a5)
movem.l ErrorSave(a5),d6-d7
.Skip
; Ferme toutes les routines appellees
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Rjsr L_D_Close
; Rjsr L_ResTempBuffer
; Rjsr L_MnEnd rajouter lors de procedure menu!
movem.l d0-d3/a0,-(sp)
lea Sys_ErrorRoutines(a5),a1
SyCall CallRoutines
movem.l (sp)+,d0-d3/a0
; Peut-on detourner l'erreur?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
clr.l PrintPos(a5)
clr.w InputFlg(a5)
clr.w ContFlg(a5)
cmp.w #11,d0 Variable space?
beq.s .skip
cmp.w d1,d0
bcs rErr1
.skip cmp.w #1000,d0 Edit / Direct?
bcc rErr1
tst.w Direct(a5) Mode direct
bne rErr1
tst.w ErrorOn(a5) Erreur en route
bne rErr1
Rbsr L_GetInstruction Trouve l'adresse de l'instruction
cmp.l TrapAdr(a5),a1 TRAP?
beq.s .ETrap
tst.l OnErrLine(a5) On error goto
beq rErr1
; Erreurs detournees
; ~~~~~~~~~~~~~~~~~~
clr.l TrapAdr(a5) Plus de trap
clr.w TrapErr(a5)
addq.w #1,d0
addq.w #1,d2
lsl.w #8,d2
or.w d2,d0
move.w d0,ErrorOn(a5) Numero de l'erreur
move.l BasA3(a5),a3 Restore les piles
move.l Cmp_LowPile(a5),sp
tst.w ErrorChr(a5)
bmi.s .rErr0
move.l a1,ErrorChr(a5)
move.l OnErrLine(a5),a0
jmp (a0)
; ON ERROR PROC
; ~~~~~~~~~~~~~
.rErr0 move.l a1,-(sp) Adresse de l'instruction
move.l OnErrLine(a5),a0 Adresse de la procedure
jmp 2(a0) D0= ErrorOn / Skippe le moveq #0,d0
; Nouvelle intruction TRAP
; ~~~~~~~~~~~~~~~~~~~~~~~~
.ETrap clr.l TrapAdr(a5)
addq.w #1,d2
lsl.w #8,d2
or.w d2,d0
move.w d0,TrapErr(a5)
move.l BasA3(a5),a3
move.l Cmp_LowPile(a5),sp
jmp (a2) Continue a l'instruction suivante
; Une erreur extension?
; ~~~~~~~~~~~~~~~~~~~~~
rErr1 move.l Prg_JError(a5),a2 Branchement de fin
ext.l d0
move.l d0,d1
tst.w d2
bpl.s .ExtErr
; Erreur normale
; ~~~~~~~~~~~~~~
cmp.w #NbEnd,d0 End
beq.s .Nul
cmp.w #1000,d0 Edit / Direct
bcc.s .Nul
move.l Ed_RunMessages(a5),a0 Trouve le message
addq.w #1,d0
Rbsr L_GetMessage
move.l d1,d0
jmp (a2)
; Erreur extension: trouve le message
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.ExtErr tst.l d3
beq.s .Ext
lea .MNul(pc),a0
bra.s .ExtOut
.ELoop tst.b (a0)+
bne.s .ELoop
.Ext dbra d1,.ELoop
.ExtOut swap d2
clr.w d2
or.l d2,d0 D0= Message / Extension
jmp (a2)
.Nul moveq #0,d0 Pas d'erreur!
jmp (a2)
.MNul dc.w 0 Message nul!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; DEBUT DES SWAPS AMOS / CLI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INSTRUCTION RUN
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InRun0
; - - - - - - - - - - - - -
rts
; - - - - - - - - - - - - -
Lib_Cmp InRun0CLI
; - - - - - - - - - - - - -
rts
; - - - - - - - - - - - - -
Lib_Cmp InRun1
; - - - - - - - - - - - - -
tst.l Mon_Base(a5)
bne.s .Acc
tst.b Prg_Accessory(a5)
bne.s .Acc
; Verifie la presence du programme
move.l d3,a2
move.w (a2)+,d2
move.l Name1(a5),a0
Rjsr L_ChVerBuf2
Rjsr L_Dsk.PathIt
move.l #1005,d2 Verifie la presence du fichier!
Rbsr L_D_Open
Rbeq L_DiskError
Rbsr L_D_Close Le ferme!
; Branche a la routine RUN suite!
moveq #-1,d0
sub.l a0,a0
move.l Prg_JError(a5),a1
jmp (a1)
.Acc moveq #102,d0
Rbra L_Error
; - - - - - - - - - - - - -
Lib_Cmp InRun1CLI
; - - - - - - - - - - - - -
Rbsr L_RunName
; Short mem ou non?
; ~~~~~~~~~~~~~~~~
move.l Buffer(a5),a0
lea TBuffer-256-6(a0),a0
cmp.l #"CmdL",(a0)+
bne .Normal
move.l 2(a0),d0
cmp.l #"-Mem",d0
beq.s .Short
cmp.l #"-Def",d0
bne .Normal
; SHORT Mem, on ferme tout!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Short move.l d0,-(sp)
move.w (a0),d0 Recopie la fin de la ligne de commande
subq.w #5,d0
bpl.s .Skyp
moveq #0,d0
.Skyp move.w d0,(a0)+
beq.s .Skop
lea 5(a0),a1
subq.w #1,d0
.Loop move.b (a1)+,(a0)+
dbra d0,.Loop
.Skop move.w #-2,DefFlag(a5)
Rbsr L_DefRun1
cmp.l #"-Def",(sp)+
beq.s .Normal
Rjsr L_Bnk.EffAll
Rbsr L_CmpClearVar
Rbsr L_CmpLibrariesStop Arret des extensions
clr.l Prg_JError(a5)
clr.l Sys_ErrorRoutines(a5)
clr.l Sys_DefaultRoutines(a5)
lea Sys_EndRoutines(a5),a1 Appelle les routines de fin
SyCall CallRoutines
SyCall MemFlush Enleve les routines flush
Rbsr L_CmpLibClose Ferme les librairies
Rbsr L_CmpEffVarBuf Efface les variables
; Branche au header, short mem reload!!!
move.l BasSp(a5),sp
move.l (sp)+,a0
jmp 8(a0)
; Assez de memoire, on reste tel quel
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Normal
; Plus de variable
Rjsr L_Bnk.EffAll
Rbsr L_CmpClearVar
lea Sys_DefaultRoutines(a5),a1
SyCall CallRoutines
Rbsr L_CmpLibrariesStop Arret des extensions
clr.l Prg_JError(a5)
clr.l Sys_ErrorRoutines(a5) Plus d'effacement
lea Sys_DefaultRoutines(a5),a1
SyCall CallRoutines
lea Sys_EndRoutines(a5),a1 Appelle les routines de fin
SyCall CallRoutines
SyCall MemFlush Enleve les routines flush
Rbsr L_CmpLibClose Ferme les librairies
Rbsr L_CmpEffVarBuf Efface les variables
; Branche au header, normalement
move.l BasSp(a5),sp
move.l (sp)+,a0
jmp 4(a0)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRUN en AMOS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InPRun
; - - - - - - - - - - - - -
tst.l Mon_Base(a5)
bne .Acc
move.l d3,a2
move.w (a2)+,d2
move.l Name1(a5),a0
Rjsr L_ChVerBuf2
; Sauve le programme courant
movem.l a3-a6/d6/d7,-(sp)
move.l BasSp(a5),-(sp)
; Le programme est-il deja charge?
JJsr L_Prg_AccAdr
beq.s .Loadit
move.l a0,a6
JJsr L_Prg_DejaRunned
beq.s .Runit
; Il faut charger: verifie la presence du programme
.Loadit Rjsr L_Dsk.PathIt
move.l #1005,d2 Verifie la presence du fichier!
Rbsr L_D_Open
Rbeq L_DiskError
Rbsr L_D_Close Le ferme!
; Ouvre une nouvelle structure
moveq #0,d0 Pas de buffer
JJsr L_Prg_NewStructure Ouvre la structure
Rbeq L_OOfMem
move.l d0,a6
; Charge le programme
moveq #-1,d0 Toujours adapter
JJsr L_Prg_Load
tst.w d0
bne .LErr
move.l a6,-(sp) Remet les banques
move.l Prg_Runned(a5),a6 du premier programme
JJsr L_Prg_SetBanks
move.l (sp)+,a6
; Programme charge: on le demarre!
.Runit moveq #-1,d0 Semi init graphique
lea PRun_Errors(pc),a1 Retour en cas d'erreur
sub.l a2,a2 Pas de message
move.l sp,BasSp(a5) Bas de la pile
JJsr L_Prg_RunIt
bra.s .OMm
; Erreur lors du chargement
.LErr move.w d0,d1
moveq #101,d0
cmp.w #-1,d1
beq.s .Goerr
.OMm moveq #36,d0
; Revient au programme, avec un message d'erreur
.Goerr move.l d0,-(sp)
tst.b Prg_Edited(a6) Efface la structure s'il faut
bne.s .Edited
JJsr L_Prg_DelStructure
.Edited move.l Prg_Runned(a5),a6
JJsr L_Prg_SetBanks
Rjsr L_Bnk.Change
move.l (sp)+,d0
move.l Ed_RunMessages(a5),a0
Rjsr L_GetMessage
move.l (sp)+,BasSp(a5)
movem.l (sp)+,a3-a6/d6/d7
move.l sp,BasSp(a5)
Rbra L_ZapReturn
.Acc moveq #102,d0
Rbra L_Error
; Retour d'erreur lors de PRUN
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PRun_Errors
move.l BasSp(a5),sp
move.l (sp)+,BasSp(a5)
movem.l (sp)+,a3-a6/d6/d7 Restore le programme
movem.l d6/d7,ErrorSave(a5) Au cas zou
movem.l a0-a1/d0-d1,-(sp)
JJsr L_Open_MathLibraries Rouvre les libraries
movem.l (sp)+,a0-a1/d0-d1
cmp.w #10,d0
beq.s .Nul
cmp.w #1000,d0
blt.s .Null
.Nul moveq #0,d0
.Null move.l ChVide(a5),a0
Rbra L_ZapReturn
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INSTRUCTION PRUN sous CLI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InPRunCLI
; - - - - - - - - - - - - -
L_DSave equ DataLong-DosBase+8*4
Rbsr L_RunName
; Sauve les donnees du programme courant
move.l #L_DSave,d0 Reserve une zone de sauvegarde
SyCall MemFast
Rbeq L_OOfMem
move.l a0,Prg_Run(a5)
movem.l a3-a6/d6/d7,(a0) Sauve les registres
lea 6*4(a0),a0
lea DosBase(a5),a1
move.l #(DataLong-DosBase)/2-1,d0
.Copy move.w (a1)+,(a0)+ Recopie les donnees
dbra d0,.Copy
move.l DosBase(a5),-(sp) Sauve DOSBASE
; Effacement selectif
SyCall MemFlush Enleve les routines flush
clr.l DFloatBase(a5)
clr.l DMathBase(a5)
clr.l FloatBase(a5)
clr.l MathBase(a5)
clr.l Sys_Banks(a5) Les messages systeme
clr.l Ed_RunMessages(a5)
clr.l Cmp_CurBanks(a5) Dialogues / banks programme
clr.l Cmp_CurDialogs(a5)
clr.l Sys_EndRoutines(a5) Routines flush
clr.l Sys_ClearRoutines(a5)
clr.l Sys_ErrorRoutines(a5)
clr.l Sys_DefaultRoutines(a5)
clr.l EveLabel(a5) Every!
clr.l MnBase(a5) Menus
clr.w OMnNb(a5)
clr.l OMnBase(a5)
clr.l Patch_Errors(a5) Plus de patchs
clr.l Patch_Menage(a5)
clr.l Patch_ScFront(a5)
clr.l Patch_ScCopy(a5)
bclr #1,ActuMask+1(a5)
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
lea .NextQuit(pc),a0 Effacement du programme suivant!
move.l a0,Prg_JError(a5)
; Charge le programme
move.l Name1(a5),d1
move.l (sp),a6
jsr _LVOLoadSeg(a6)
move.l d0,Prg_Runned(a5) Les segments
beq.s .Err
lsl.l #2,d0
move.l d0,a0
addq.l #4,a0
move.l 2(a0),d2 Les flags
move.l 2+6(a0),d3
bset #FHead_PRun,d2 C'est un PRUN!
bset #FHead_Run,d2 C'est egalement un RUN!
bset #FPrg_DefRunAcc+16,d2 DEFRUNACC pour le programme
jsr 6+6(a0) On y va!
; Retour du programme suivant!
.Back move.l (sp),a6
move.l d0,(sp)
move.l Prg_Runned(a5),d1 Libere le programme
beq.s .Nolib
jsr _LVOUnLoadSeg(a6)
.Nolib move.l Prg_Run(a5),a0 Recopie les donnees
move.l a0,a1
movem.l (a0)+,a3-a6/d6/d7
lea DosBase(a5),a2
move.l #(DataLong-DosBase)/2-1,d0
.Copy2 move.w (a0)+,(a2)+ Recopie les donnees
dbra d0,.Copy2
move.l #L_DSave,d0 Libere le buffer
SyCall MemFree
; Remet les banques
Rjsr L_Bnk.Change
; Met le PARAM
move.l (sp)+,ParamE(a5)
rts
; Out of memory
.Err moveq #24,d0
bra.s .Back
; Effacement du programme suivant
.NextQuit
movem.l a0/d0,-(sp) Sauve les erreurs
lea Sys_DefaultRoutines(a5),a1
SyCall CallRoutines
lea Sys_EndRoutines(a5),a1 Appelle les routines de fin
SyCall CallRoutines
SyCall MemFlush Enleve les routines flush
Rjsr L_Bnk.EffAll
Rbsr L_CmpClearVar
Rbsr L_CmpLibrariesStop
Rbsr L_CmpLibClose
Rbsr L_CmpEffVarBuf
; Retourne a l'appellant (le header du deuxieme)
movem.l (sp)+,a0/d0
move.l BasSp(a5),sp
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ASK EDITOR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InAskEditor1
; - - - - - - - - - - - - -
move.l d3,-(a3)
move.l #EntNul,d3
move.l d3,-(a3)
Rbra L_InAskEditor3
; - - - - - - - - - - - - -
Lib_Cmp InAskEditor1CLI
; - - - - - - - - - - - - -
Rbra L_FonCall
; - - - - - - - - - - - - -
Lib_Cmp InAskEditor2
; - - - - - - - - - - - - -
move.l d3,-(a3)
move.l #EntNul,d3
Rbra L_InAskEditor3
; - - - - - - - - - - - - -
Lib_Cmp InAskEditor2CLI
; - - - - - - - - - - - - -
Rbra L_FonCall
; - - - - - - - - - - - - -
Lib_Cmp InAskEditor3
; - - - - - - - - - - - - -
Rbsr L_Ed_Par
tst.l Edit_Segment(a5)
Rbeq L_FonCall
JJsr L_Ed_ZapFonction
move.l d0,ParamE(a5)
move.l ChVide(a5),ParamC(a5)
tst.w d2
beq.s .Skip
Rjsr L_A0ToChaine
move.l a0,ParamC(a5)
.Skip rts
; - - - - - - - - - - - - -
Lib_Cmp InAskEditor3CLI
; - - - - - - - - - - - - -
Rbra L_FonCall
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ZAPPEUSE D'EDITEUR!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InCallEditor1
; - - - - - - - - - - - - -
move.l d3,-(a3)
move.l #EntNul,d3
move.l d3,-(a3)
Rbra L_InCallEditor3
; - - - - - - - - - - - - -
Lib_Cmp InCallEditor1CLI
; - - - - - - - - - - - - -
Rbra L_FonCall
; - - - - - - - - - - - - -
Lib_Cmp InCallEditor2
; - - - - - - - - - - - - -
move.l d3,-(a3)
move.l #EntNul,d3
Rbra L_InCallEditor3
; - - - - - - - - - - - - -
Lib_Cmp InCallEditor2CLI
; - - - - - - - - - - - - -
Rbra L_FonCall
; - - - - - - - - - - - - -
Lib_Cmp InCallEditor3
; - - - - - - - - - - - - -
Rbsr L_Ed_Par Recupere les parametres
tst.l Edit_Segment(a5) Editeur present?
Rbeq L_FonCall
move.l BasSp(a5),-(sp) Sauve le bas de la pile
movem.l a3-a6/d6/d7,-(sp) Pousse tout
move.l sp,BasSp(a5)
subq.l #4,BasSp(a5) Change le bas de la pile
JJsr L_Ed_ZapIn Appel de l'editeur, avec ADTOKENS
movem.l (sp)+,a3-a6/d6/d7 Recupere tout
move.l (sp)+,BasSp(a5) Remet BasSp!
Rbra L_ZapReturn
; - - - - - - - - - - - - -
Lib_Cmp InCallEditor3CLI
; - - - - - - - - - - - - -
Rbra L_FonCall
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MET LES BANQUES DU PROGRAMME PRECEDENT, SI DEFINI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Bnk.PrevProgram
; - - - - - - - - - - - - - Si programme AMOS
move.l a4,-(sp)
move.l AdTokens(a5),a4
Ijsr L_Bnk.PrevProgram
move.l (sp)+,a4
rts
; - - - - - - - - - - - - -
Lib_Cmp Bnk.PrevProgramCLI
; - - - - - - - - - - - - - Si Programme CLI
moveq #0,d0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MET LES BANQUES DU PROGRAMME COURANT, SI DEFINI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Bnk.CurProgram
; - - - - - - - - - - - - - Si programme AMOS
move.l a4,-(sp)
move.l AdTokens(a5),a4
Ijsr L_Bnk.CurProgram
move.l (sp)+,a4
rts
; - - - - - - - - - - - - -
Lib_Cmp Bnk.CurProgramCLI
; - - - - - - - - - - - - - Si programme CLI
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =Prg Under
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnPrgUnder
; - - - - - - - - - - - - - Si sous AMOS
move.l a4,-(sp)
move.l AdTokens(a5),a4
Ijsr L_FnPrgUnder
move.l (sp)+,a4
rts
; - - - - - - - - - - - - -
Lib_Cmp FnPrgUnderCLI
; - - - - - - - - - - - - - Si programme CLI
tst.l Prg_Runned(a5)
sne d3
ext.w d3
ext.l d3
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; CLOSE EDITOR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InCloseEditor
; - - - - - - - - - - - - -
move.l a4,-(sp)
move.l AdTokens(a5),a4
Ijsr L_InCloseEditor
move.l (sp)+,a4
rts
; - - - - - - - - - - - - -
Lib_Cmp InCloseEditorCLI
; - - - - - - - - - - - - -
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; KILL EDITOR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InKillEditor
; - - - - - - - - - - - - -
move.l a4,-(sp)
move.l AdTokens(a5),a4
Ijsr L_InKillEditor
move.l (sp)+,a4
rts
; - - - - - - - - - - - - -
Lib_Cmp InKillEditorCLI
; - - - - - - - - - - - - -
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MONITOR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InMonitor
; - - - - - - - - - - - - -
rts
; - - - - - - - - - - - - -
Lib_Cmp InMonitorCLI
; - - - - - - - - - - - - -
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FIN DES ROUTINES AMOS / CLI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; VERIFICATION DU FICHIER RUN / PRUN CLI
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp RunName
; - - - - - - - - - - - - -
move.l d3,a2
Rbsr L_NomDisc
move.l Name1(a5),a0
.Run0 tst.b (a0)+
bne.s .Run0
subq.l #1,a0
lea Suffix(pc),a1
.Run1 move.b -(a0),d0
cmp.b #"a",d0
bcs.s .Run1a
cmp.b #"z",d0
bhi.s .Run1a
sub.b #32,d0
.Run1a move.b (a1)+,d1
beq.s .Run2
cmp.b d0,d1
bne.s .Run3
beq.s .Run1
.Run2 clr.b 1(a0)
; Ouvre le fichier (si present)
.Run3 move.l #1005,d2
Rbsr L_D_Open
Rbeq L_DiskError
; Charge l'entete
move.l Name2(a5),d2
moveq #5*4,d3
Rbsr L_D_Read
Rbne L_DiskError
; Un programme?
move.l d2,a2
add.l d3,d2
cmp.l #$3F3,(a2)
Rbne L_DiskError
; Ok, on peut fermer
Rbsr L_D_Close
rts
.NoF moveq #81,d0 Erreur normale!
Rbra L_Error
Suffix dc.b "SOMA.",0
even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Recupere les parametres
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Ed_Par
; - - - - - - - - - - - - -
move.l Name1(a5),a0
move.l Name2(a5),a1
clr.w (a1)
move.l d3,d0
beq.s .Skip
move.l d0,a2
move.w (a2)+,d2
move.w d2,(a1)
Rjsr L_ChVerBuf2
.Skip move.l (a3)+,d1
move.l (a3)+,d0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Retour de zappeuse
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp ZapReturn
; - - - - - - - - - - - - -
move.l ChVide(a5),ParamC(a5)
ext.l d0
move.l d0,ParamE(a5)
beq.s .Skip
Rjsr L_A0ToChaine
move.l a0,ParamC(a5)
.Skip rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =Prg State
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnPrgState
; - - - - - - - - - - - - -
move.w T_AMOState(a5),d3
ext.l d3
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TROUVE LE DEBUT DE L'INSTRUCTION ACTUELLE >>> A1 / A2
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp GetInstruction
; - - - - - - - - - - - - -
move.l Cmp_LowPile(a5),a1
move.l -4(a1),a1 Adresse de retour
subq.l #2,a1 Au milieu du jsr
Rbra L_GetInstruction2
; - - - - - - - - - - - - -
Lib_Cmp GetInstruction2
; - - - - - - - - - - - - -
movem.l a0/d0-d3,-(sp)
move.l Cmp_ListInst(a5),a0
move.l (a0)+,d3
move.w (a0)+,d1 Nombre d'instructions
sub.l d3,a1 En relatif
lsr.w #1,d1
move.w d1,d2
; Boucle de recherche
.Loop move.w d1,d0
lsl.w #2,d0
cmp.l -4(a0,d0.w),a1
bcs.s .Prev
cmp.l 0(a0,d0.w),a1
bcs.s .Found
lsr.w #1,d2
beq.s .Pas
add.w d2,d1
bra.s .Loop
.Prev lsr.w #1,d2
beq.s .Pas
subx.w d2,d1
bra.s .Loop
; Pas trouve, cherche au dessus
.Pas lea 0(a0,d0.w),a2
.Find cmp.l (a2)+,a1
bcc.s .Find
subq.l #8,a2
bra.s .Return
.Found lea -4(a0,d0.w),a2
.Return move.l (a2)+,a1
move.l (a2),a2
add.l d3,a1
add.l d3,a2
movem.l (sp)+,a0/d0-d3
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SYSTEM
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InSystem
; - - - - - - - - - - - - -
move.w #1002,d0
Rbra L_GoError
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; EDIT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InEdit
; - - - - - - - - - - - - -
move.w #1000,d0
Rbra L_GoError
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; DIRECT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InDirect
; - - - - - - - - - - - - -
move.w #1001,d0
Rbra L_GoError
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; BREAK ON / OFF
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InBreakOn
; - - - - - - - - - - - - -
bset #BitControl,ActuMask(a5)
clr.l OnBreak(a5)
rts
; - - - - - - - - - - - - -
Lib_Cmp InBreakOff
; - - - - - - - - - - - - -
bclr #BitControl,ActuMask(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ON BREAK PROC
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InOnBreak
; - - - - - - - - - - - - -
move.l a0,OnBreak(a5)
bclr #BitControl,ActuMask(a5)
Rlea L_OnBreakGo,0 La routine de branchement
move.l a0,GoTest_OnBreak(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ON ERROR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InOnError
; - - - - - - - - - - - - -
tst.w ErrorOn(a5)
Rbne L_NoResume
clr.l OnErrLine(a5)
clr.l ErrorChr(a5)
rts
; - - - - - - - - - - - - -
Lib_Cmp InOnErrorGoto
; - - - - - - - - - - - - -
tst.w ErrorOn(a5)
Rbne L_NoResume
move.l a0,OnErrLine(a5)
clr.l ErrorChr(a5)
rts
; - - - - - - - - - - - - -
Lib_Cmp InOnErrorProc
; - - - - - - - - - - - - -
tst.w ErrorOn(a5)
Rbne L_NoResume
move.l a0,OnErrLine(a5)
clr.l ErrorChr(a5)
bset #7,ErrorChr(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RESUME LABEL
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InResumeLabel
; - - - - - - - - - - - - -
tst.w ErrorOn(a5)
Rbeq L_NoErr
Rbsr L_PopP
clr.w ErrorOn(a5)
move.l ErrorChr(a5),d0
bclr #31,d0
Rbeq L_NoOnErr
tst.l d0
Rbeq L_ResLNo
move.l d0,a0
jmp (a0)
; - - - - - - - - - - - - -
Lib_Cmp InResumeLabel1
; - - - - - - - - - - - - -
tst.l OnErrLine(a5)
Rbeq L_NoOnErr
tst.w ErrorChr(a5)
Rbpl L_NoOnErr
move.l a0,d0
bset #31,d0
move.l d0,ErrorChr(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RESUME [label]
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InResume
; - - - - - - - - - - - - -
Rbsr L_Test_PaSaut
tst.w ErrorOn(a5)
Rbeq L_NoErr
move.l ErrorChr(a5),d0
bmi.s L985a
move.l d0,a0
clr.w ErrorOn(a5)
jmp (a0)
L985a Rbsr L_PopP
clr.w ErrorOn(a5)
jmp (a0)
; - - - - - - - - - - - - -
Lib_Cmp InResume1
; - - - - - - - - - - - - -
move.l a0,-(sp)
Rbsr L_Test_PaSaut
move.l (sp)+,a0
tst.w ErrorOn(a5)
Rbeq L_NoErr
clr.w ErrorOn(a5)
tst.w ErrorChr(a5)
Rbmi L_ResPLab
jmp (a0)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RESUME NEXT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InResumeNext
; - - - - - - - - - - - - -
Rbsr L_Test_PaSaut
tst.w ErrorOn(a5)
Rbeq L_NoErr
move.l ErrorChr(a5),d0 Une procedure?
bpl.s .Skip
Rbsr L_PopP
subq.l #4,sp Pour le depilage!
move.l a0,d0
.Skip move.l d0,a1 Cherche l'instruction suivante
Rbsr L_GetInstruction2
clr.w ErrorOn(a5)
addq.l #4,sp Depile la fonction
jmp (a2) Branche
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TRAP
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InTrap
; - - - - - - - - - - - - -
move.l (sp),TrapAdr(a5) L'adresse de retour!
clr.w TrapErr(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =TRAPERR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnErrTrap
; - - - - - - - - - - - - -
moveq #0,d3
move.w TrapErr(a5),d3
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; EVERY GOSUB
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InEveryGosub
; - - - - - - - - - - - - -
clr.w EveType(a5)
Rbra L_InEvery
; - - - - - - - - - - - - -
Lib_Cmp InEveryProc
; - - - - - - - - - - - - -
move.w #-1,EveType(a5)
Rbra L_InEvery
; - - - - - - - - - - - - -
Lib_Cmp InEvery
; - - - - - - - - - - - - -
bclr #BitEvery,ActuMask(a5)
move.l a0,EveLabel(a5)
Rlea L_EveJump,0 Routine de branchement
move.l a0,GoTest_Every(a5)
move.l (a3)+,d0
Rbeq L_FonCall
cmp.l #32767,d0
Rbcc L_FonCall
move.w d0,EveCharge(a5)
move.w d0,T_EveCpt(a5)
bset #BitEvery,ActuMask(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; EVERY OFF
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InEveryOff
; - - - - - - - - - - - - -
bclr #BitEvery,ActuMask(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; EVERY ON
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InEveryOn
; - - - - - - - - - - - - -
bset #BitEvery,ActuMask(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; NEXT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InNext
; - - - - - - - - - - - - -
move.l (a2)+,d4
move.l (a2)+,d5
move.l (a2),a2
add.l d4,(a2)
tst.l d4
bmi.s L51a
cmp.l (a2),d5
blt.s L51b
addq.l #4,sp
jmp (a1)
L51a cmp.l (a2),d5
bgt.s L51b
addq.l #4,sp
jmp (a1)
L51b rts
; - - - - - - - - - - - - -
Lib_Cmp InNextF
; - - - - - - - - - - - - -
move.l a6,-(sp)
move.l (a2)+,d4
move.l (a2)+,d5
move.l (a2),a2
move.l FloatBase(a5),a6
move.l d4,d1
jsr SPTst(a6)
move.l d0,d6
move.l d4,d0
move.l (a2),d1
jsr SPAdd(a6)
move.l d0,(a2)
move.l d5,d1
jsr SPCmp(a6)
move.l (sp)+,a6
blt.s NxtF1
tst.l d6
bpl.s NxtS
bmi.s NxtR
NxtF1 tst.l d6
bpl.s NxtR
bmi.s NxtS
NxtR addq.l #4,sp
jmp (a1)
NxtS rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RETURN
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InReturn
; - - - - - - - - - - - - -
cmp.l Cmp_LowPileP(a5),sp
beq.s .err
addq.l #4,Cmp_LowPile(a5)
rts
.err moveq #1,d0
Rbra L_Error
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; POP
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InPop
; - - - - - - - - - - - - -
move.l (sp)+,a0
cmp.l Cmp_LowPileP(a5),sp
beq.s .err
addq.l #4,sp
move.l sp,Cmp_LowPile(a5)
jmp (a0)
.err moveq #2,d0
Rbra L_GoError
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Procedure
; D0= ErrorOn
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp DProc1
; - - - - - - - - - - - - -
move.l (sp)+,a2
; Empile les params
; Adresse de retour -(sp) RTS
move.l a6,-(sp) 0
move.l Cmp_AdLabels(a5),-(sp) 1
; move.l VarLoc(a5),-(sp) 2= A6!
move.l Cmp_AForNext(a5),-(sp) 3
move.l Cmp_ListInst(a5),-(sp) !
move.l TabBas(a5),-(sp) 4
move.l OnErrLine(a5),-(sp) 5
move.l ErrorChr(a5),-(sp) 6
move.w ErrorOn(a5),-(sp) 7
move.l PData(a5),-(sp) 8
move.l AData(a5),-(sp) 9
move.l Cmp_LowPile(a5),-(sp) 10
move.l Cmp_LowPileP(a5),-(sp) 11
move.l sp,Cmp_LowPileP(a5)
move.l sp,Cmp_LowPile(a5)
clr.l OnErrLine(a5)
move.w d0,ErrorOn(a5)
jmp (a2)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Debut procedure 2: affect les variables / Float
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp DProc2F
; - - - - - - - - - - - - -
move.w d3,d2
beq.s .Nopar
lsl.w #2,d2
lea 0(a3,d2.w),a2 Pointeur sur les parametres
subq.w #1,d3 Compteur
.Loop move.l (a2)+,d0
lsr.l #1,d4 Flags variables
bcs.s .Flt
; On veut un entier
lsr.l #1,d5 Flags parametres
bcc.s .Loke
move.l a6,-(sp)
move.l FloatBase(a5),a6
jsr _LVOSPFix(a6)
move.l (sp)+,a6
bra.s .Loke
; On veut un float
.Flt lsr.l #1,d5
bcs.s .Loke
move.l a6,-(sp)
move.l FloatBase(a5),a6
jsr _LVOSPFlt(a6)
move.l (sp)+,a6
; Affecte la variable
.Loke move.l (a3)+,a0
move.l d0,(a0)
dbra d3,.Loop
move.l a2,a3
.Nopar rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Debut procedure 2: affect les variables / Double
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp DProc2D
; - - - - - - - - - - - - -
move.w d3,d2
beq.s .Nopar
lsl.w #2,d2
lea 0(a3,d2.w),a2 Pointeur sur les parametres
subq.w #1,d3 Compteur
.Loop lsr.l #1,d4
bcs.s .Flt
; On veut un entier
lsr.l #1,d5
bcc.s .Loke1
movem.l (a2)+,d0-d1
move.l a6,-(sp)
move.l DFloatBase(a5),a6
jsr _LVOIEEEDPFix(a6)
move.l (sp)+,a6
move.l (a3)+,a0
move.l d0,(a0)
bra.s .Next
.Loke1 move.l (a3)+,a0
move.l (a2)+,(a0)
bra.s .Next
; On veut un double
.Flt lsr.l #1,d5
bcs.s .Loke2
move.l (a2)+,d0
move.l a6,-(sp)
move.l DFloatBase(a5),a6
jsr _LVOIEEEDPFlt(a6)
move.l (sp)+,a6
move.l (a3)+,a0
movem.l d0-d1,(a0)
bra.s .Next
.Loke2 move.l (a3)+,a0
movem.l (a2)+,d0-d1
movem.l d0-d1,(a0)
.Next dbra d3,.Loop
move.l a2,a3
.Nopar rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FIN PROCEDURE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FProc
; - - - - - - - - - - - - -
tst.w ErrorOn(a5)
Rbne L_EProErr
move.l Cmp_LowPileP(a5),sp
move.l (sp)+,Cmp_LowPileP(a5) 11
move.l (sp)+,Cmp_LowPile(a5) 10
move.l (sp)+,AData(a5) 9
move.l (sp)+,PData(a5) 8
move.w (sp)+,ErrorOn(a5) 7
move.l (sp)+,ErrorChr(a5) 6
move.l (sp)+,OnErrLine(a5) 5
move.l (sp)+,TabBas(a5) 4
move.l (sp)+,Cmp_ListInst(a5) !
move.l (sp)+,Cmp_AForNext(a5) 3
; move.l (sp)+,VarLoc(a5) 2= A6!
move.l (sp)+,Cmp_AdLabels(a5) 1
move.l (sp)+,a6 0
rts RTS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ENTREE PROGRAMME : RESERVE / INIT L'ESPACE VARIABLES / FLOAT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PrgInF
; - - - - - - - - - - - - -
move.l d0,Cmp_AdLabels(a5)
move.l a0,Cmp_ListInst(a5)
move.l (sp),(a0)
move.l a2,AData(a5)
move.l a2,PData(a5)
move.l TabBas(a5),a0
; Verifie la taille
move.l a6,-(a0) Debut des prochaines vlocales
move.w #$FFFF,-(a0)
moveq #0,d0
move.w (a1)+,d1 Taille du buffer FOR-NEXT
move.w (a1)+,d0 Taille des VARLOC
add.w d1,d0
sub.l d0,a0
lea -8(a0),a2 Adresse minimale, avec securite
cmp.l HiChaine(a5),a2
bls.s .Outb
move.l a0,Cmp_AForNext(a5) Buffer for/next
move.l a0,TabBas(a5) Haut des tableaux
lea 0(a0,d1.w),a6 A6= Varloc= Debut Variables locales
moveq #1,d6 Pour les erreurs
; Cree la table
moveq #0,d0
move.b (a1)+,d0 Une table?
bpl.s .Table
rts
.Table or.w #$0400,d0
move.l ChVide(a5),d1
move.l a6,a0
.Loop move.w d0,(a0)+ Met le flag
cmp.b #2,d0
bne.s .Ent
move.l d1,(a0)+ Chaine
bra.s .Next
.Ent clr.l (a0)+ Entier / Float / Tableau
.Next move.b (a1)+,d0
bpl.s .Loop
rts
; Erreur, pas assez de place dans le buffer!
.Outb move.l d0,d3 Demande TROP
add.w #32,d3
Rbsr L_PopP
move.l a0,-(sp) Adresse d'appel de la procedure
Rbra L_Demande Pour forcer le menage
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ENTREE PROGRAMME : RESERVE / INIT L'ESPACE VARIABLES / DOUBLE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PrgInD
; - - - - - - - - - - - - -
move.l d0,Cmp_AdLabels(a5)
move.l a0,Cmp_ListInst(a5)
move.l (sp),(a0)
move.l a2,AData(a5)
move.l a2,PData(a5)
move.l TabBas(a5),a0
; Verifie la taille
move.l a6,-(a0) Debut des prochaines vlocales
move.w #$FFFF,-(a0)
moveq #0,d0
move.w (a1)+,d1 Taille du buffer FOR-NEXT
move.w (a1)+,d0 Taille des VARLOC
add.w d1,d0
sub.l d0,a0
lea -8(a0),a2 Adresse minimale, avec securite
cmp.l HiChaine(a5),a2
bls.s .Outb
move.l a0,Cmp_AForNext(a5) Buffer for/next
move.l a0,TabBas(a5) Haut des tableaux
lea 0(a0,d1.w),a6 A6= Varloc= Debut Variables locales
moveq #1,d6 Pour les erreurs
; Cree la table
moveq #0,d0
move.b (a1)+,d0 Une table?
bpl.s .Table
rts
.Table or.w #$0400,d0
move.l ChVide(a5),d1
move.l a6,a0
.Loop cmp.b #1,d0
beq.s .Dbl
cmp.b #2,d0
bne.s .Ent
move.w d0,(a0)+
move.l d1,(a0)+ Chaine
bra.s .Next
.Dbl move.w #$0801,(a0)+ Flag Double
clr.l (a0)+ Double
clr.l (a0)+
bra.s .Next
.Ent move.w d0,(a0)+ Entier
clr.l (a0)+
.Next move.b (a1)+,d0
beq.s .Ent
bpl.s .Loop
rts
; Erreur, pas assez de place dans le buffer!
.Outb move.l d0,d3 Demande TROP
add.w #32,d3
Rbsr L_PopP
move.l a0,-(sp) Adresse d'appel de la procedure
Rbra L_Demande Pour forcer le menage
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ROUTINE POP PROC
; A0--> Adresse de retour
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PopP
; - - - - - - - - - - - - -
move.l (sp)+,a1
move.l Cmp_LowPileP(a5),sp
move.l (sp)+,Cmp_LowPileP(a5) 11
move.l (sp)+,Cmp_LowPile(a5) 10
move.l (sp)+,AData(a5) 9
move.l (sp)+,PData(a5) 8
move.w (sp)+,ErrorOn(a5) 7
move.l (sp)+,ErrorChr(a5) 6
move.l (sp)+,OnErrLine(a5) 5
move.l (sp)+,TabBas(a5) 4
move.l (sp)+,Cmp_ListInst(a5) !
move.l (sp)+,Cmp_AForNext(a5) 3
; move.l (sp)+,VarLoc(a5) 2= A6
move.l (sp)+,Cmp_AdLabels(a5) 1
move.l (sp)+,a6 0
move.l (sp)+,a0 RTS
jmp (a1)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; GET LABEL expression
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp GetLabelE
; - - - - - - - - - - - - -
move.l d3,d0
move.l BufLabel(a5),a0
move.l a0,a2
Rjsr L_LongToDec
move.l a0,d2
sub.l a2,d2
Rbra L_GetLabel
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; GET LABEL alphanumerique
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp GetLabelA
; - - - - - - - - - - - - -
move.l d3,a1
move.w (a1)+,d2
Rbeq L_FonCall
cmp.w #32,d2
Rbcc L_FonCall
move.w d2,d1
subq.w #1,d1
move.l BufLabel(a5),a0
move.l a0,a2
L58a move.b (a1)+,d0
cmp.b #"A",d0
bcs.s L58b
cmp.b #"Z",d0
bhi.s L58b
add.b #32,d0
L58b move.b d0,(a0)+
dbra d1,L58a
Rbra L_GetLabel
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; GET LABEL
; D5= Numero de procedure
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp GetLabel
; - - - - - - - - - - - - -
btst #0,d2
beq.s L59a
clr.b (a0)+
addq.w #1,d2
* Trouve le label
L59a move.w d5,(a0)+
move.w d2,d3
lsr.w #1,d3
addq.w #2,d2
move.l Cmp_AdLabels(a5),a1
move.l a2,d4
L59b move.w (a1),d1
Rbeq L_FonCall
cmp.w d2,d1
bne.s L59n
move.l d4,a2
lea 6(a1),a0
move.w d3,d0
L59c cmp.w (a0)+,(a2)+
bne.s L59n
dbra d0,L59c
* Trouve!
move.l 2(a1),a0
rts
* Label suivant
L59n lea 6(a1,d1.w),a1
bra.s L59b
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; DIM
; A0= Adresse variable
; D0= Nombre params
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InDim
; - - - - - - - - - - - - -
tst.l (a0) Already dimensionned
bne EAlrDim
; Recupere et compte les params
moveq #0,d5
moveq #2,d4 Taille des variables
move.b -1(a0),d5 Le flag
and.w #$000F,d5
cmp.b #1,d5 Float?
bne.s .Skip
tst.b MathFlags(a5) Double?
bpl.s .Skip
moveq #3,d4 Variables sur 8 octets!
.Skip moveq #1,d3
move.w d0,d2
move.l Buffer(a5),a2
move.b d0,(a2)+ Nombre de dimensions
move.b d4,(a2)+ Taille des variables
Dim1: move.l (a3)+,d1 Fabrique l'entete
cmp.l #$FFFF,d1
Rbcc L_FonCall
move.w d1,(a2)+
move.w d3,(a2)+
addq.w #1,d1
mulu d1,d3
cmp.l #$10000,d3
Rbcc L_FonCall
subq.w #1,d0
bne.s Dim1
lsl.l d4,d3 Taille du tableau
move.l d3,d4
Rbeq L_FonCall
lsr.l #2,d4 Nombre de mots long a nettoyer
add.l a2,d3
sub.l Buffer(a5),d3 Plus taille du header
move.l TabBas(a5),a2 Descend le bas tableaux
sub.l d3,a2
cmp.l HiChaine(a5),a2
bcc.s DimM1
movem.l a0-a1/d0-d1,-(sp)
Rbsr L_Menage
movem.l (sp)+,a0-a1/d0-d1
cmp.l HiChaine(a5),a2
Rbcs L_OOfBuf
DimM1 move.l a2,(a0) Stocke l'adresse du tableau
move.l a2,TabBas(a5)
move.l Buffer(a5),a0 Copie l'entete
move.w (a0)+,(a2)+
DimM2 move.l (a0)+,(a2)+
subq.w #1,d2
bne.s DimM2
* Nettoie le tableau
moveq #0,d0
cmp.w #2,d5
bne.s Dim5
move.l ChVide(a5),d0
Dim5: move.l d0,(a2)+
subq.l #1,d4
bne.s Dim5
rts
EAlrDim moveq #28,d0
Rbra L_GoError
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Trouve un element de tableau
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp GetTablo
; - - - - - - - - - - - - -
move.l (a0),d0 Base du tableau
Rbeq L_NonDim
move.l d0,a0
move.b (a0)+,d3 Nombre de dims
move.b (a0)+,d4 Taille des variables
moveq #0,d0
moveq #0,d2
GetT1 move.w (a0)+,d0
move.l (a3)+,d1
cmp.l d0,d1
Rbhi L_FonCall
mulu (a0)+,d1
add.l d1,d2
subq.b #1,d3
bne.s GetT1
lsl.l d4,d2
add.l d2,a0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =ARRAY$(a$(0))
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnArray
; - - - - - - - - - - - - -
move.l (a0),d3
Rbeq L_NonDim
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =FN
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnFn
; - - - - - - - - - - - - -
move.l (a0),d1 Adresse de la routine
beq EFnNDef
move.l d1,a2
move.w d0,-(sp) Nombre de parametres
beq.s L955e
L955a jsr (a2) Appel du parametres
cmp.w (a3)+,d2 Compare avec le type demande
beq.s L955d
move.l a0,-(sp)
tst.b d2
bne.s L955b
Rjsrt L_FlToInt2
bra.s L955c
L955b Rjsrt L_IntToFl2
L955c move.l (sp)+,a0
L955d cmp.b #1,d2
bne.s .Ent
tst.b MathFlags(a5) Double
bpl.s .Ent
movem.l (a3)+,d3/d4
move.l d3,(a0)+ Egalisation
move.l d4,(a0)
bra.s .Next
.Ent move.l (a3)+,(a0)
.Next subq.w #1,(sp) Encore un parametre
bne.s L955a
L955e addq.l #2,sp
jmp (a2) Branche a la routine
EFnNDef moveq #15,d0
Rbra L_GoError
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SWAP
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InSwap
; - - - - - - - - - - - - -
move.l (a3)+,a1 En entier/float/chaine
move.l (a0),d0
move.l (a1),(a0)
move.l d0,(a1)
rts
; - - - - - - - - - - - - -
Lib_Cmp InSwapD
; - - - - - - - - - - - - -
move.l (a3)+,a1
move.l (a0),d0
move.l (a1),(a0)+
move.l d0,(a1)+
move.l (a0),d0
move.l (a1),(a0)
move.l d0,(a1)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MAX / MIN
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnMax
; - - - - - - - - - - - - - - - -
cmp.l (a3),d3
bge.s .Skip
move.l (a3),d3
.Skip addq.l #4,a3
rts
; - - - - - - - - - - - - -
Lib_Cmp FnMaxS
; - - - - - - - - - - - - -
move.l (a3),-(a3)
Rbsr L_Chaine_Compare
ble.s .Skip
move.l (a3),d3
.Skip addq.l #4,a3
rts
; - - - - - - - - - - - - - - - -
Lib_Cmp FnMin
; - - - - - - - - - - - - - - - -
cmp.l (a3),d3
ble.s .Skip
move.l (a3),d3
.Skip addq.l #4,a3
rts
; - - - - - - - - - - - - -
Lib_Cmp FnMinS
; - - - - - - - - - - - - -
move.l (a3),-(a3)
Rbsr L_Chaine_Compare
ble.s .Skip
move.l (a3),d3
.Skip addq.l #4,a3
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INC + DEC
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InAdd4
; - - - - - - - - - - - - - - - -
move.l (a0),d0
move.l (a3)+,d2
move.l (a3)+,d1
add.l (a3)+,d0
cmp.l d1,d0
blt.s IAdd4m
cmp.l d2,d0
bgt.s IAdd4p
move.l d0,(a0)
rts
IAdd4m: move.l d2,(a0)
rts
IAdd4p: move.l d1,(a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SORT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InSort
; - - - - - - - - - - - - - - - -
Rbsr L_GTablo ;va chercher les caracteristiques du tableau
move.l d6,d3
or4: lsr.l #1,d3 ;E=d3
beq XSort
moveq #1,d5 ;NA=d5
or5: move.l d5,d4 ;NR=d4 -> NR=NA
or6: movem.l d3-d6/a1,-(sp)
move.l a1,a0
subq.l #1,d4
move.l d4,d0
move.l d3,d1
Rbsr L_AdSort
movem.l a0/a1/d2,-(sp)
movem.l (a0),d0-d1
movem.l (a1),d3-d4
Rbsr L_CpBis
movem.l (sp)+,a0/a1/d2
bge.s or8
; fait le swap
move.l (a0),d0
move.l (a1),(a0)
move.l d0,(a1)
cmp.b #3,d7
bne.s .Skip
move.l 4(a0),d0
move.l 4(a1),4(a0)
move.l d0,4(a1)
.Skip movem.l (sp)+,d3-d6/a1
sub.l d3,d4 ;NR=NR-E
beq.s or9
bcc.s or6
bra.s or9
or8: movem.l (sp)+,d3-d6/a1
or9: addq.l #1,d5 ;NA=NA+1
move.l d6,d0
sub.l d3,d0
cmp.l d0,d5
bls.s or5
bra.s or4
XSort Rjsr L_LoadRegs
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =MATCH
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnMatch
; - - - - - - - - - - - - - - - -
Rbsr L_GTablo
cmp.b #3,d7
beq.s .Dble
move.l (a3)+,d3
bra.s di3
.Dble movem.l (a3)+,d3/d4
; recherche!
di3: moveq #0,d5
move.l d6,d1
lsr.l #1,d6
di4: movem.l a1/d1-d7,-(sp)
add.l d6,d5
move.l d5,d1
move.l a1,a0
moveq #0,d0
Rbsr L_AdSort
movem.l (a1),d0-d1
Rbsr L_CpBis
movem.l (sp)+,a1/d1-d7
beq.s di11
blt.s di5
add.l d6,d5
di5: tst.l d6
beq.s di7
lsr.l #1,d6
bra.s di4
; pas trouve: cherche le premier element superieur
di7: cmp.l d1,d5
bcc.s di8
movem.l a1/d1-d7,-(sp)
move.l d5,d1
move.l a1,a0
moveq #0,d0
Rbsr L_AdSort
movem.l (a1),d0-d1
Rbsr L_CpBis
movem.l (sp)+,a1/d1-d7
beq.s di11
blt.s di8
addq.l #1,d5
bra.s di7
di8: move.l d5,d3
addq.l #1,d3
neg.l d3
bra.s di12
; trouve!
di11: move.l d5,d3
add.l d6,d3
; Sortie
di12 Rjsr L_LoadRegs
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Trouve les parametres tableau pour SORT et FIND
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp GTablo
; - - - - - - - - - - - - -
GTablo Rjsr L_SaveRegs
move.l (a0),d0
Rbeq L_NonDim
move.l d0,a0
move.b (a0)+,d0 Nombre de dims
move.b (a0)+,d7 Taille des variables
moveq #0,d1
moveq #1,d6
L957a addq.l #4,a3
move.w (a0)+,d1
addq.w #1,d1
mulu d1,d6
addq.l #2,a0
subq.b #1,d0
bne.s L957a
move.l a0,a1
rts
* Trouve l'adresse D0/D1 >>> A0/A1
; - - - - - - - - - - - - -
Lib_Cmp AdSort
; - - - - - - - - - - - - -
lsl.l d7,d0
add.l d0,a0
move.l a0,a1
lsl.l d7,d1
add.l d1,a1
rts
* Comparaison pour SORT/FIND
; - - - - - - - - - - - - -
Lib_Cmp CpBis
; - - - - - - - - - - - - -
cmp.b #1,d2
beq.s .Flt
bcs.s .Ent
move.l d0,-(a3) Chaine
Rbra L_Chaine_Compare
.Ent cmp.l d0,d3 Entier
rts
.Flt cmp.b #3,d7
beq.s .Dble
move.l d0,-(a3)
Rjmp L_Float_Compare
.Dble movem.l d0-d1,-(a3)
Rjmp L_Float_Compare
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; READ
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InRead
; - - - - - - - - - - - - -
move.l a0,-(sp) Read ENTIERS
move.l PData(a5),a2
jsr (a2)
Rbmi L_OOfData
cmp.l #EntNul,d3
beq.s L975a
subq.b #1,d2
bmi.s L975b
Rbne L_TypeMis
Rjsrt L_FlToInt1
bra.s L975b
L975a moveq #0,d3
L975b move.l (sp)+,a0
move.l d3,(a0)
move.l a2,PData(a5)
rts
; - - - - - - - - - - - - -
Lib_Cmp InReadF
; - - - - - - - - - - - - -
move.l a0,-(sp) Pour les float
move.l PData(a5),a2
jsr (a2)
Rbmi L_OOfData
cmp.l #EntNul,d3
beq.s L976a
subq.b #1,d2
beq.s L976b
Rbpl L_TypeMis
Rjsrt L_IntToFl1
bra.s L976b
L976a moveq #0,d3
moveq #0,d4
L976b move.l (sp)+,a0
move.l d3,(a0)+
tst.b MathFlags(a5)
bpl.s .Skip
move.l d4,(a0)
.Skip move.l a2,PData(a5)
rts
; - - - - - - - - - - - - -
Lib_Cmp InReadS
; - - - - - - - - - - - - -
move.l a0,-(sp) Pour les chaines
move.l PData(a5),a2
jsr (a2)
Rbmi L_OOfData
cmp.l #EntNul,d3
beq.s L977a
cmp.b #2,d2
beq.s L977b
Rbra L_TypeMis
L977a move.l ChVide(a5),d3
L977b move.l (sp)+,a0
move.l d3,(a0)
move.l a2,PData(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RESTORE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InRestore
; - - - - - - - - - - - - -
move.l AData(a5),PData(a5)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRestore1
; - - - - - - - - - - - - -
lea 4(a0),a0
cmp.w #$4E71,(a0) * (NOP)
bne.s .Err
move.l a0,PData(a5)
rts
.Err moveq #41,d0 No data
Rbra L_GoError
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Source: Diskio.s
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FIELD
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InField
; - - - - - - - - - - - - -
exg d0,d3
Rbsr L_GetFile
Rbeq L_FilNO
; Reserve la memoire necessaire
move.w d3,d0
mulu #6,d0
addq.l #8,d0
SyCall MemFastClear
Rbeq L_OOfMem
move.l a0,FhF(a2)
move.l a0,a1
move.w d3,d0
lsl.w #3,d0
add.w d0,a3
move.l a3,-(sp)
lea 8(a1),a0
move.w d3,(a1)
subq.w #1,d3
moveq #0,d2
Fld2 move.l -(a3),d0
beq FldFonc
add.l d0,d2
cmp.l #String_Max,d2
bcc FldFonc
move.w d0,(a0)+
move.l -(a3),(a0)+
dbra d3,Fld2
move.w d2,2(a1)
* Taille du fichier
move.l (sp)+,a3
move.l a1,-(sp)
move.l FhA(a2),d1
moveq #0,d2
moveq #1,d3
DosCall _LVOSeek
move.l FhA(a2),d1
moveq #0,d2
moveq #-1,d3
DosCall _LVOSeek
move.l (sp)+,a1
move.l d0,4(a1)
rts
; FonCall field!
FldFonc Rjsr L_Cloa1
Rbra L_FonCall
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; LINE INPUT FICHIER
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InLineInputH
; - - - - - - - - - - - - -
clr.w -(sp)
move.l d3,d0
Rbsr L_GetFile
Rbeq L_FilNO
move.l a2,PrintFile(a5)
moveq #0,d3
Rbra L_Input
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INPUT FICHIER
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InInputH
; - - - - - - - - - - - - -
move.w #",",-(sp)
move.l d3,d0
Rbsr L_GetFile
Rbeq L_FilNO
move.l a2,PrintFile(a5)
moveq #0,d3
Rbra L_Input
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INPUT CLAVIER
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InInput
; - - - - - - - - - - - - -
tst.w ScOn(a5)
Rbeq L_ScNOp
move.w #",",-(sp)
clr.l PrintFile(a5)
Rbra L_Input
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; LINE INPUT CLAVIER
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InLineInput
; - - - - - - - - - - - - -
tst.w ScOn(a5)
Rbeq L_ScNOp
clr.w -(sp)
clr.l PrintFile(a5)
Rbra L_Input
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INPUT!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Input
; - - - - - - - - - - - - -
move.l d3,-(sp) Chaine a imprimer
move.w d5,d0 Nombre de variables
mulu #6,d0
add.w d0,a3
clr.l DeFloat(a5)
IInp0 movem.l a3/d5,-(sp)
move.l Buffer(a5),a0
clr.b (a0)
tst.l PrintFile(a5)
bne.s ReDInp
; Imprimer la chaine
move.l 8(sp),d0
beq.s L111a
move.l d0,a2
move.w (a2)+,d2
beq.s ReInp
move.b 0(a2,d2.w),d3
clr.b 0(a2,d2.w)
move.l a2,a1
WiCall Print
move.b d3,0(a2,d2.w)
bra.s ReInp
; Imprime le ?
L111a moveq #"?",d1
WiCall ChrOut
moveq #" ",d1
WiCall ChrOut
; Rempli le buffer!
ReInp:
* Clavier
lea Es_LEd(a5),a0
move.l Buffer(a5),a1
clr.b (a1)
move.l a1,a2
move.w #(1<<LEd_FCursor)|(1<<LEd_FTests)|(1<<LEd_FMulti),d0
moveq #0,d1 Curseur <EFBFBD> zero
move.w #256,d2 256 caracteres maxi
moveq #-1,d3 Largeur maxi
Rjsr L_LEd_Init
Rbne L_FonCall Trop <EFBFBD> droite...
Rjsr L_LEd_Loop
move.l d0,d3
tst.w d2
bpl.s InnPut
Rbra L_InStop
* Fichier!
ReDInp:
move.l PrintFile(a5),a2
move.l Buffer(a5),a1
clr.b (a1)
moveq #0,d1
move.w 12(sp),d2
move.b ChrInp+1(a5),d3
move.b ChrInp(a5),d4
bra.s InpD1
InpD0 move.b d0,(a1)+
addq.w #1,d1
cmp.w #1000,d1
Rbcc L_InpTL
InpD1 Rbsr L_GetByte
cmp.b d0,d2 * Stop aux virgules
beq.s InpD2
cmp.b d0,d3 * Premier caractere?
bne.s InpD0
tst.b d4 * Sauter le deuxieme?
bmi.s InpD2
Rbsr L_GetByte
InpD2 clr.b (a1)
move.l a1,d3
sub.l Buffer(a5),d3 * Nombre de caracteres -> D3
; INPUT/LINE INPUT: interprete le buffer!
InnPut: move.l Buffer(a5),a2
Inn1: move.w -2(a3),d2
cmp.b #2,d2
bne.s Inn5
* Variable alphanumerique
move.l -6(a3),a0
move.l ChVide(a5),(a0) * Libere la memoire!
tst.l d3
beq Inn10
Rbsr L_DDemande
addq.l #2,a0
move.b 12+1(sp),d1
Inn2: move.b (a2)+,d0
move.b d0,(a0)+
beq.s Inn3
cmp.b d0,d1
bne.s Inn2
Inn3: subq.l #1,a0
subq.l #1,a2
move.l a0,d0
sub.l a1,d0
subq.l #2,d0
move.w d0,(a1)
btst #0,d0
beq.s Inn4
addq.l #1,a0
Inn4: move.l a0,HiChaine(a5)
move.l -6(a3),a0
move.l a1,(a0)
bra.s Inn10
* Variable numerique
Inn5: move.l a2,a0
moveq #1,d0 Tenir compte du signe
move.w -2(a3),d2 Le type desire
Rjsr L_ValRout
move.l a0,a2
move.b (a2),d0 Caractere de fin
beq.s Inn6 Zero=> ok
cmp.b 12+1(sp),d0 Ou stop
bne InnRedo
Inn6 move.l -6(a3),a0 Adresse de la variable
move.l d3,(a0) Poke!
move.w -2(a3),d0 Type= float?
beq.s Inn10
tst.b MathFlags(a5) Double?
bpl.s Inn10
move.l d4,4(a0) Oui, poke double!
; Encore une variable a prendre???
Inn10: subq.l #6,a3
subq.w #1,d5
beq.s Inn11
cmp.b #",",(a2)+
beq Inn1
* ??
tst.l PrintFile(a5)
bne ReDInp
WiCalA Print,InnEnc(pc)
move.l Buffer(a5),a0
clr.b (a0)
bra ReInp
* Fini!
Inn11: movem.l (sp)+,a3/d5
addq.l #6,sp
Rbsr L_EndByte
rts
* Redo from start
InnRedo
Rbsr L_EndByte
tst.l PrintFile(a5)
Rbne L_TypeMis
Rbsr L_CRet
moveq #15,d0
Rjsr L_Def_GetMessage
move.l a0,a1
WiCall Print
Rbsr L_CRet
movem.l (sp)+,a3/d5
bra IInp0
InnEnc: dc.b 13,10,"?? ",0
even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Retour chariot
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CRet
; - - - - - - - - - - - - -
WiCalA Print,InnRet(pc)
rts
InnRet: dc.b 13,10,0,0
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; DEBUT PRINT H
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InPrintH
; - - - - - - - - - - - - -
move.l d3,d0
Rbsr L_GetFile
tst.l FhA(a2)
Rbeq L_FilNO
btst #0,FhT(a2)
Rbeq L_FilTM
cmp.w #1,d0
Rbeq L_FilTM
move.l a2,PrintFile(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; IMPRESSION d'un chiffre ENTIER
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PrintE
; - - - - - - - - - - - - -
move.l d3,d0
moveq #-1,d3 ;proportionnel
moveq #1,d4 ;avec signe
move.l Buffer(a5),a0
Rjsr L_LongToAsc
clr.b (a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; IMPRESSION d'un chiffre FLOAT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PrintF
; - - - - - - - - - - - - -
move.l Buffer(a5),a0
Rjsr L_Float2Ascii
clr.b (a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; IMPRESSION d'une chaine
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PrintS
; - - - - - - - - - - - - -
move.l d3,a2
move.w (a2)+,d2
L35r: move.l Buffer(a5),a0
beq.s L35c
move.w #255,d0
L35a: move.b (a2)+,(a0)+
subq.w #1,d2
beq.s L35c
dbra d0,L35a
L35b movem.l a2/d2,-(sp)
Rbsr L_PrintX
movem.l (sp)+,a2/d2
tst.w d2
bra.s L35r
L35c clr.b (a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FIN IMPRESSION NORMALE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PrintX
; - - - - - - - - - - - - -
move.l Buffer(a5),a1
WiCall Print
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FIN IMPRESSION NORMALE IMPRIMANTE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp LPrintX
; - - - - - - - - - - - - -
move.l Buffer(a5),a0
Rbra L_PRT_Print
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRINT seul
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CRPrint
; - - - - - - - - - - - - -
move.l Buffer(a5),a0
move.l #$0D0A0000,(a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; IMPRESSION d'une chaine dans un fichier
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp HPrintS
; - - - - - - - - - - - - -
move.l d3,a0
moveq #0,d3
move.w (a0)+,d3
beq.s L825x
move.l a0,d2
move.l PrintFile(a5),a0
move.l FhA(a0),d1
DosCall _LVOWrite
cmp.l d0,d3
Rbne L_DiskError
L825x move.l Buffer(a5),a0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRINT RETOUR CHARIOT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PrtRet
; - - - - - - - - - - - - -
move.b #13,(a0)+
move.b #10,(a0)+
clr.b (a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PRINT VIRGULE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp PrtVir
; - - - - - - - - - - - - -
move.b #9,(a0)+
clr.b (a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FIN IMPRESSION NORMALE dans un fichier
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp HPrintX
; - - - - - - - - - - - - -
move.l PrintFile(a5),a1
move.l FhA(a1),d1
move.l Buffer(a5),d2
move.l a0,d3
sub.l d2,d3
DosCall DosWrite
cmp.l d0,d3
Rbne L_DiskError
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; USING CHIFFRES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp UsingC
; - - - - - - - - - - - - -
move.l (a3)+,a0 Chaine de formattage
movem.l a3/d6/d7,-(sp)
move.l Buffer(a5),a1
lea 256(a1),a1
move.w (a0)+,d0
beq.s l41a3
cmp.w #127,d0
bcs.s l41a1
moveq #127,d0
l41a1: subq.w #1,d0
l41a2: move.b (a0)+,(a1)+
dbra d0,l41a2
l41a3: clr.b (a1)
; USING pour les CHIFFRES
move.l Buffer(a5),a1
lea 128(a1),a2
moveq #127,d0
us2: move.b (a1),(a2)+ ;recopie la chaine, et fait le menage!!!
move.b #32,(a1)+
dbra d0,us2
move.l Buffer(a5),a0
lea 128(a0),a1 ;a1 pointe la chaine
move.l a1,d6 ;debut chaine a formatter
move.l Buffer(a5),a2
lea 256(a2),a2 ;a2 pointe la chaine de definition
move.l a2,d7 ;debut chaine de format
us3: move.b (a2),d0
beq.s us5
cmp.b #".",d0 ;cherche la fin du format de chiffre
beq.s us5
cmp.b #";",d0
beq.s us5
cmp.b #"^",d0
beq.s us5
addq.l #1,a0
addq.l #1,a2
bra.s us3
us5: move.b (a1),d0
beq.s us6
cmp.b #".",d0 ;trouve le point de la chaine a formatter
beq.s us6 ;ou la fin
cmp.b #"E",d0
beq.s us6
addq.l #1,a1
bra.s us5
us6: movem.l a0-a2,-(sp)
; ecris la gauche du chiffre
us7: cmp.l d7,a2 ;fini a gauche???
beq us15
move.b -(a2),d0
cmp.b #"#",d0
beq.s us8
cmp.b #"-",d0
beq.s us11
cmp.b #"+",d0
beq.s us12
move.b d0,-(a0) ;aucun signe reserve: le met simplement!
bra.s us7
us8: cmp.l d6,a1 ;-----> "#"
bne.s us10
us9: move.b #" ",-(a0) ;arrive au debut du chiffre!
bra.s us7
us10: move.b -(a1),d0
cmp.b #"0",d0 ;pas un chiffre (signe)
bcs.s us9
cmp.b #"9",d0
bhi.s us9
move.b d0,-(a0) ;OK, chiffre: poke!
bra.s us7
us11: move.l d6,a3 ;-----> "-"
move.b (a3),-(a0) ;met le "signe": 32 ou "-"
bra.s us7
us12: move.l d6,a3
move.b (a3),d0
cmp.b #"-",d0
beq.s us13
move.b #"+",d0
us13: move.b d0,-(a0) ;-----> "+"
bra us7
; ecrit la droite du chiffre
us15: movem.l (sp)+,a0-a2 ;recupere les adresses pivot
clr.l d2 ;flag puissance
cmp.b #".",(a1) ;saute le point dans le chiffre a afficher
bne.s us16
addq.l #1,a1
us16: move.b (a2)+,d0
beq finus ;fini OUF!
cmp.b #";",d0 ;";" marque la virgule sans l'ecrire!
beq.s us18z
cmp.b #"#",d0
beq.s us17
cmp.b #"^",d0
beq.s us20
move.b d0,(a0)+ ;ne correspond a rien: POKE!
bra.s us16
us17: move.b (a1),d0 ;-----> "#"
bne.s us19
us18: tst d2
beq.s us18a
us18z: move.b #" ",(a0)+ ;si puissance passee: met des espaces
bra.s us16
us18a: move.b #"0",(a0)+ ;fin du chiffre: met un zero apres la virgule
bra.s us16
us19: cmp.b #"0",d0
bcs.s us18
cmp.b #"9",d0
bhi.s us18
addq.l #1,a1
move.b d0,(a0)+
bra us16
us20: tst d2 ;-----> "^"
bmi.s us24
bne.s us25
us21: move.b (a1),d0
beq.s us22
cmp.b #"E",d0
beq.s us23
addq.l #1,a1
bra.s us21
us22: moveq #1,d2 ;pas de puissance: en fabrique une!
bra.s us25
us23: moveq #-1,d2
us24: move.b (a1),d0 ;si fin du chiffre: met des espaces
beq us18
addq.l #1,a1
cmp.b #32,d0 ;saute l'espace entre E et +/-
beq.s us24
move.b d0,(a0)+
bra us16
us25: lea usip(pc),a3
move.b -1(a3,d2.w),(a0)+ ;met une fausse puissance!
cmp.b #6,d2
beq us16
addq #1,d2
bra us16
finus: movem.l (sp)+,a3/d6/d7
clr.b (a0)
rts
usip: dc.b "E+000 "
even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; USING CHAINES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp UsingS
; - - - - - - - - - - - - -
move.l d3,a0 Chaine <EFBFBD> formater
move.l Buffer(a5),a1
lea 128(a1),a1
move.w (a0)+,d0
beq.s l42c
cmp.w #127,d0
bcs.s l42a
moveq #127,d0
l42a subq.w #1,d0
l42b move.b (a0)+,(a1)+
dbra d0,l42b
l42c clr.b (a1)
move.l (a3)+,a0 * Chaine de formatage
move.l Buffer(a5),a1
lea 256(a1),a1
move.w (a0)+,d0
beq.s l42a3
cmp.w #127,d0
bcs.s l42a1
moveq #127,d0
l42a1: subq.w #1,d0
l42a2: move.b (a0)+,(a1)+
dbra d0,l42a2
l42a3: clr.b (a1)
move.l Buffer(a5),a0
lea 128(a0),a1
lea 128(a1),a2
; ecris la chaine dans le buffer
us52: move.b (a2)+,d0
beq.s fnusc
cmp.b #"~",d0
beq.s us53
move.b d0,(a0)+
bra.s us52
us53: move.b (a1),d0 ;----> "~"
bne.s us54
move.b #32,(a0)+
bra.s us52
us54: addq.l #1,a1
move.b d0,(a0)+
bra.s us52
fnusc: clr.b (a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Source: Ecrans.s
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; DEFAULT PALETTE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InDefaultPalette
; - - - - - - - - - - - - -
lea DefPal(a5),a0
Rbra L_Plt
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PALETTE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InPalette
; - - - - - - - - - - - - -
tst.w ScOn(a5)
Rbeq L_ScNOp
moveq #15,d1
move.l Buffer(a5),a0
move.l a0,a1
Pal1: move.l #-1,(a1)+
dbra d1,Pal1
Rbsr L_Plt
EcCall SPal
Rbne L_EcWiErr
rts
; - - - - - - - - - - - - -
Lib_Cmp Plt
; - - - - - - - - - - - - -
move.w d0,d1
lsl.w #2,d1
add.w d1,a3
move.l a3,a2
subq.w #1,d0
Plt1: move.l -(a2),d2
bmi.s Plt2
and.w #$FFF,d2
move.w d2,(a0)
Plt2: addq.l #2,a0
dbra d0,Plt1
move.l Buffer(a5),a1
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FADE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InFade1
; - - - - - - - - - - - - -
move.l Buffer(a5),a0
move.l a0,a1
moveq #31,d0
.Loop clr.w (a0)+
dbra d0,.Loop
Rbra L_InFade
; - - - - - - - - - - - - -
Lib_Cmp InFade2
; - - - - - - - - - - - - -
moveq #-1,d3
Rbra L_InFade3
; - - - - - - - - - - - - -
Lib_Cmp InFade3
; - - - - - - - - - - - - -
move.l (a3)+,d1
bpl.s IFat1
Rjsr L_Bnk.GetBobs <0 -->> sprite palette
Rbeq L_BkNoRes
move.w (a0)+,d0
lsl.w #3,d0
lea 0(a0,d0.w),a0
bra.s IFat2
IFat1 Rjsr L_GetEc
lea EcPal(a0),a0
IFat2 Rbsr L_PalRout
Rbra L_InFade
; - - - - - - - - - - - - - Fade a,b,c,d
Lib_Cmp InFadePal
; - - - - - - - - - - - - -
moveq #15,d1
move.l Buffer(a5),a0
move.l a0,a1
IFap move.l #-1,(a1)+
dbra d1,IFap
Rbsr L_Plt
Rbra L_InFade
; - - - - - - - - - - - - -
Lib_Cmp InFade
; - - - - - - - - - - - - - Lance le fade
tst.w ScOn(a5)
Rbeq L_ScNOp
move.l (a3)+,d1
Rbls L_FonCall
EcCall FadeOn
Rbne L_FonCall
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; POLYLINE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InPolyline
; - - - - - - - - - - - - -
tst.w ScOn(a5)
Rbeq L_ScNOp
move.w d0,d3
lsl.w #3,d0
add.w d0,a3
move.l a3,a2
move.l T_RastPort(a5),a1
move.l Buffer(a5),a0
moveq #0,d0
tst.w d1
bne.s L315a
move.w 36(a1),d1
move.w 38(a1),d2
addq.w #1,d3
bra.s L315b
L315a move.l -(a2),d1
move.l -(a2),d2
L315b move.w d1,(a0)+
move.w d2,(a0)+
addq.w #1,d0
subq.w #1,d3
bne.s L315a
move.l Buffer(a5),a0
move.w (a0),36(a1)
move.w 2(a0),38(a1)
move.w #PolyDraw,d5
Rjmp L_GfxFunc
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; POLYGON
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InPolygon
; - - - - - - - - - - - - -
tst.w ScOn(a5)
Rbeq L_ScNOp
move.w d0,d5
move.w d1,d4
; Initialise le buffer AREADRAW
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea AAreaInfo(a5),a0
lea AAreaBuf(a5),a1
moveq #AAreaSize,d0
move.l T_RastPort(a5),a2
move.l a0,16(a2)
GfxCa5 InitArea
move.w d5,d0
lsl.w #3,d0
add.w d0,a3
move.l a3,a0
move.l T_RastPort(a5),a1
move.l Buffer(a5),a2
tst.w d4
beq.s L341a
move.l -(a0),d0
move.l -(a0),d1
subq.w #1,d5
bra.s L341b
L341a move.w 36(a1),d0
move.w 38(a1),d1
L341b GfxCa5 AreaMove
L341c move.l -(a0),d0
move.l -(a0),d1
GfxCa5 AreaDraw
subq.w #1,d5
bne.s L341c
Rjsr L_GetRas
GfxCa5 AreaEnd
Rjmp L_FreeRas
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; CHANNEL x TO SPRITE x
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp ChannelToSprite
; - - - - - - - - - - - - -
moveq #0,d0
moveq #64,d1
Rbra L_InChannel
; - - - - - - - - - - - - -
Lib_Cmp ChannelToBob
; - - - - - - - - - - - - -
moveq #1,d0
moveq #64,d1
Rbra L_InChannel
; - - - - - - - - - - - - -
Lib_Cmp ChannelToSDisplay
; - - - - - - - - - - - - -
moveq #2,d0
moveq #8,d1
Rbra L_InChannel
; - - - - - - - - - - - - -
Lib_Cmp ChannelToSSize
; - - - - - - - - - - - - -
moveq #3,d0
moveq #8,d1
Rbra L_InChannel
; - - - - - - - - - - - - -
Lib_Cmp ChannelToSOffset
; - - - - - - - - - - - - -
moveq #4,d0
moveq #8,d1
Rbra L_InChannel
; - - - - - - - - - - - - -
Lib_Cmp ChannelToRainbow
; - - - - - - - - - - - - -
moveq #6,d0
moveq #4,d1
Rbra L_InChannel
; - - - - - - - - - - - - -
Lib_Cmp InChannel
; - - - - - - - - - - - - -
move.l (a3)+,d4
cmp.l #64,d4
Rbcc L_FonCall
cmp.l d1,d3
Rbcc L_FonCall
lsl.w #1,d4
lea AnCanaux(a5),a0
move.b d0,0(a0,d4.w) * 1 => TYPE
move.b d3,1(a0,d4.w) * 2 => NUMERO
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; BSETBCLRBCHGBTSTROLROR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InBset
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.l (a0),d1
bset d0,d1
move.l d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InBset1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
bset d0,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InBclr
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.l (a0),d1
bclr d0,d1
move.l d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InBclr1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
bclr d0,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InBchg
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.l (a0),d1
bchg d0,d1
move.l d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InBchg1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
bchg d0,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp FnBtst
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.l (a0),d1
btst d0,d1
Rbne L_FnTrue
Rbra L_FnFalse
; - - - - - - - - - - - - -
Lib_Cmp FnBtst1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
btst d0,(a0)
Rbne L_FnTrue
Rbra L_FnFalse
; - - - - - - - - - - - - -
Lib_Cmp InRorB
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.b 3(a0),d1
ror.b d0,d1
move.b d1,3(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRorB1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
move.b (a0),d1
ror.b d0,d1
move.b d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRorW
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.w 2(a0),d1
ror.w d0,d1
move.w d1,2(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRorW1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
move.w (a0),d1
ror.w d0,d1
move.w d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRorL
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.l (a0),d1
ror.l d0,d1
move.l d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRorL1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
move.l (a0),d1
ror.l d0,d1
move.l d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRolB
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.b 3(a0),d1
rol.b d0,d1
move.b d1,3(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRolB1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
move.b (a0),d1
rol.b d0,d1
move.b d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRolW
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.w 2(a0),d1
rol.w d0,d1
move.w d1,2(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRolW1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
move.w (a0),d1
rol.w d0,d1
move.w d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRolL
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.l (a0),d1
rol.l d0,d1
move.l d1,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp InRolL1
; - - - - - - - - - - - - -
move.l d3,a0
move.l (a3)+,d0
move.l (a0),d1
rol.l d0,d1
move.l d1,(a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; CALL
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InCall
; - - - - - - - - - - - - -
move.l d3,d0
Rjsr L_Bnk.OrAdr
movem.l d6-d7/a3-a6,-(sp)
move.l a0,a4
lea CallReg(a5),a6
move.l a6,-(sp)
movem.l (a6),d0-d7/a0-a2
jsr (a4)
.Return move.l (sp)+,a6
movem.l d0-d7/a0-a2,(a6)
movem.l (sp)+,d6-d7/a3-a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =STRUC=
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InStruc
; - - - - - - - - - - - - -
move.l (a3)+,a0
move.l a0,d1
jmp .Jmp(pc,d0.w)
.Jmp bra.s .Byte
bra.s .Word
bra.s .Long
bra.s .Byte
bra.s .Word
bra.s .Long
bra.s .Long
.Byte move.b d0,(a0)
rts
.Word btst #0,d1
Rbne L_AdrErr
move.w d3,(a0)
rts
.Long btst #0,d1
Rbne L_AdrErr
move.l d3,(a0)
rts
; - - - - - - - - - - - - -
Lib_Cmp FnStruc
; - - - - - - - - - - - - -
move.l d3,a0
move.l d3,d1
moveq #0,d3
jmp .Jmp(pc,d0.w)
.Jmp bra.s .Byte
bra.s .Word
bra.s .Long
bra.s .UByte
bra.s .UWord
bra.s .ULong
bra.s .ULong
.Byte move.b (a0),d3
ext.w d3
ext.l d3
rts
.Word btst #0,d1
Rbne L_AdrErr
move.w (a0),d3
ext.l d3
rts
.Long btst #0,d1
Rbne L_AdrErr
move.l (a0),d3
rts
.UByte move.b (a0),d3
rts
.UWord btst #0,d1
Rbne L_AdrErr
move.w (a0),d3
rts
.ULong btst #0,d1
Rbne L_AdrErr
move.l (a0),d3
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =STRUC$=
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InStrucD
; - - - - - - - - - - - - -
move.l (a3)+,a0
move.l a0,d1
btst #0,d1
Rbne L_AdrErr
clr.l (a0)
move.l d3,a2
move.w (a2)+,d2
cmp.l #"|00|",(a2)
beq.s .Skp
moveq #2,d3
add.w d2,d3
Rjsr L_Demande
lea 2(a0,d3.w),a0
move.w a0,d0
and.w #1,d0
add.w d0,a0
move.l a0,HiChaine(a5)
move.l (sp)+,a0
move.l a1,(a0)
move.w d2,(a1)
addq.w #1,(a1)+
subq.w #1,d2
bmi.s .Skp
.Lop move.b (a2)+,(a1)+
dbra d2,.Lop
clr.b (a1)
.Skp rts
; - - - - - - - - - - - - -
Lib_Cmp FnStrucD
; - - - - - - - - - - - - -
move.l d3,a0
btst #0,d3
Rbne L_AdrErr
move.l (a0),d0
Rbeq L_Ret_ChVide
move.l d0,a0
Rjsr L_A0ToChaine
move.l a0,d3
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Source: String.s
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Demande de l'espace pour les chaines
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Demande
; - - - - - - - - - - - - -
dem0 move.l HiChaine(a5),a0
move.l a0,a1
add.l d3,a1
addq.l #4,a1
cmp.l TabBas(a5),a1
bcc.s dem1
move.l a0,a1
rts
; Va faire le menage, si revient: OK!
dem1: tst.b ErrorRegs(a5) Recharger les registres?
beq.s .NoReg
movem.l ErrorSave(a5),d6-d7
.NoReg Rbsr L_Menage Va faire le menage
; Ca marche maintenant?
move.l HiChaine(a5),a1 Ca marche maintenant?
add.l d3,a1
addq.l #4,a1
cmp.l TabBas(a5),a1
bcc FinMenE
; Ca a marche, un patch?
tst.l Patch_Menage(a5)
bne.s dem3
; Que faire?
tst.l d6
beq.s FinMenE Plus de memoire
cmp.l #-1,d6 Menage simple: revient a l'appelant
beq.s dem0
; On vient de le faire?
Rbsr L_GetInstruction Pointe l'instruction
cmp.l d6,a1 La meme que la derniere fois?
beq FinMenE
move.l a1,d6 On stocke
move.l Cmp_LowPile(a5),sp
move.l BasA3(a5),a3
jmp (a1) On rebranche a l'instruction!
; Branche au patch
dem3 move.l Patch_Menage(a5),a0
jmp (a0)
; Erreur!
FinMenE moveq #11,d0 Out of buffer space
Rbra L_Error
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Demande chaine sans erreur
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp DDemande
; - - - - - - - - - - - - -
move.l #-1,d6 Flag pour le menage
Rbsr L_Demande Va demander
moveq #1,d6 Empeche les erreurs
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MENAGE ALPHANUMERIQUE
; Taille maximum chaine: 65472 ($FFC0)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Menage
; - - - - - - - - - - - - -
movem.l d1-d7/a2-a6,-(sp)
; IFNE Debug>1
; movem.l d0-d7/a0-a6,-(sp)
; moveq #70,d3
; JJsrIns L_InBell1,1
; movem.l (sp)+,d0-d7/a0-a6
; ENDC
; IFNE Debug>2
; Rjsr L_PreBug
; ENDC
move.l a6,VarLoc(a5)
; Essaie de proceder <20> un FAST-MENAGE!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l HiChaine(a5),d7
move.l LoChaine(a5),d6
move.l d7,d0
sub.l d6,d0
cmp.l #$3FFFFE*2,d0 8 Megas maximum!
bcc SLOW_MENAGE
move.l d0,d5
SyCall MemFast
beq SLOW_MENAGE
FAST_MENAGE
move.l a0,a4
move.l a0,a2
clr.w (a2)+
FfMen0 move.l VarLoc(a5),a6 ;Debut des variables
moveq #-1,d2 ;Maxi dans le tableau
; Rempli la table intermediaire
FfMen1 moveq #0,d4
.Loop move.w (a6)+,d0 Prend le flag
beq.s .Loop Nul: non initialise!
bmi.s .Proc Negatif: fin de chunk
.Var btst #1,d0 Une chaine?
bne.s .Alpha
lsr.w #8,d0 Recupere la taille
add.w d0,a6
move.w (a6)+,d0 Suivante
beq.s .Loop
bpl.s .Var
.Proc move.l (a6),d0 Chunk suivant
beq FfMenX Le dernier?
move.l d0,a6 Non, on boucle!
bra.s .Loop
; Variable alphanumerique
.Alpha move.l a6,a3
move.l (a6)+,d1
beq.s .Loop Non initialise!
btst #6,d0 Un tableau?
beq.s FfMen4
move.l d1,a3 Un tableau!
moveq #0,d0
move.b (a3)+,d0 Nombre de dimensions
addq.l #1,a3 Taille des variables
subq.w #1,d0
moveq #1,d4
FfMen2 move.w (a3)+,d1 Calcule nombre de variable
addq.l #2,a3
addq.w #1,d1
mulu d1,d4
dbra d0,FfMen2
subq.l #1,d4
; Recopie la chaine dans le buffer intermediaire
FfMen4 move.l (a3),a0
cmp.l d6,a0 Dans le buffer?
bcs.s FfMenN
cmp.l d7,a0
bcc.s FfMenN
move.w (a0),d0 Chaine vide?
beq.s FfMenV
move.w d0,d1
and.w #$FFC0,d1 Chaine deja copiee?
cmp.w #$FFC0,d1
beq.s FfMenD Deja fait!
move.l a2,d2
sub.l a4,d2
move.l d2,d1
add.l d6,d1
move.l d1,(a3)+ Change le pointeur
move.w d0,(a2)+
addq.w #1,d0
lsr.w #1,d0
subq.w #1,d0
lea 2(a0),a1
FfMen5 move.w (a1)+,(a2)+
dbra d0,FfMen5
lsr.l #1,d2 / 2 car pair
or.l #$FFC00000,d2 Masque
move.l d2,(a0) Marque la chaine...
FfSuiv subq.l #1,d4
bpl.s FfMen4
bmi FfMen1
; Chaine deja copiee
FfMenD move.l (a0),d0
and.l #$003FFFFF,d0
lsl.l #1,d0
add.l d6,d0
move.l d0,(a3)+
bra.s FfSuiv
; Chaine vide
FfMenV move.l ChVide(a5),(a3)+
bra.s FfSuiv
; Chaine en dehors du buffer
FfMenN addq.l #4,a3
bra.s FfSuiv
; Recopie le tout dans le buffer
FfMenX move.l a4,a0
move.l d6,a1
FfMenX1 move.w (a0)+,(a1)+
cmp.l a2,a0
bcs.s FfMenX1
move.l a1,HiChaine(a5)
; Libere le buffer temporaire
move.l a4,a1
move.l d5,d0
SyCall MemFree
bra FinMenS
; ------------------------------------------------------------------------
SLOW_MENAGE
* Reserve la memoire, ou prend le BUFFER si rien du tout!!!
move.l #TMenage+16,d0
SyCall MemFast
bne.s L47a
move.l #-1,BMenage(a5)
move.l Buffer(a5),d5
bra.s L47b
L47a move.l a0,BMenage(a5)
move.l a0,d5
* Menage
L47b move.l d5,d6
add.l #TMenage,d6 ;Fin TI
move.l LoChaine(a5),d7 ;Ad mini de recopie
move.l HiChaine(a5),a4 ;Ad maxi des chaines!
addq.l #2,d7 ;Chaine vide
move.l d7,a1 ;Si ya pas de variable!
Men0: move.l VarLoc(a5),a6 ;Debut des variables
moveq #-1,d2 ;Maxi dans le tableau
moveq #0,d4 ;Cpt tableau---> 0
move.l d5,d3 ;Rien dans la TI
move.l d3,a0
move.l #$7fffffff,(a0)
; Rempli la table intermediaire
Men1
.Loop move.w (a6)+,d0 Prend le flag
beq.s .Loop Nul: non initialise!
bmi.s .Proc Negatif: fin de chunk
.Var btst #1,d0 Une chaine?
bne.s .Alpha
lsr.w #8,d0 Recupere la taille
add.w d0,a6
move.w (a6)+,d0 Suivante
beq.s .Loop
bpl.s .Var
.Proc move.l (a6),d0 Chunk suivant
beq Men20 Le dernier?
move.l d0,a6 Non, on boucle!
bra.s .Loop
; Variable alphanumerique
.Alpha move.l a6,a3
move.l (a6)+,d1 Initialise?
beq.s Men1
btst #6,d0
beq.s Men4
move.l d1,a3
moveq #0,d0
move.b (a3)+,d0
addq.l #1,a3
subq.w #1,d0
moveq #1,d4
Men2: move.w (a3)+,d1 Calcule nombre de variable
addq.l #2,a3
addq.w #1,d1
mulu d1,d4
dbra d0,Men2
Men3: subq.l #1,d4
; Essai de poker dans la TI
Men4: move.l (a3),d0
cmp.l d7,d0 ;< au minimum?
bcs.s Men10
cmp.l a4,d0 ;Dans le source?
bcc.s Men10
cmp.l d2,d0 ;>= au maximum?
bcc.s Men10
move.l d5,a0
Men6: cmp.l (a0),d0
lea 8(a0),a0
bcc.s Men6
cmp.l d6,a0
bne.s Men7
move.l d0,d2 ;C'est le dernier element!
move.l d6,d3
bra.s Men9
Men7: move.l d3,a1 ;Decale les adresses au dessus
cmp.l d6,d3
bcs.s Men7a
lea -8(a1),a1
move.l -8(a1),d2 ;Remonte la limite haute
bra.s Men8
Men7a: addq.l #8,d3
move.l #$7fffffff,8(a1)
Men8: move.l -(a1),8(a1)
move.l -(a1),8(a1)
cmp.l a0,a1
bcc.s Men8
Men9: move.l a3,-(a0) ;Poke dans la table
move.l d0,-(a0)
Men10: addq.l #4,a3
tst.l d4
bne.s Men3
beq Men1
; Recopie toutes les chaines du buffer
Men20: move.l d5,a3 ;Adresse TI
move.l d7,a1 ;Adresse de recopie
moveq #0,d7
Men21: cmp.l d3,a3 ;Fini-ni?
bcc.s Men26
move.l (a3),a0 ;Adresse de la chaine
lea 8(a3),a3
cmp.l a0,d7 ;Chaine deja bougee?
beq.s Men25
move.l a0,d7
cmp.l a0,a1 ;Au meme endroit?
bne.s Men22
; Les 2 chaines sont au meme endroit!
move.l a1,d1
moveq #0,d0
move.w (a1)+,d0
add.l d0,a1
move.w a1,d0
btst #0,d0
beq.s Men21
addq.l #1,a1
bra.s Men21
; Recopie la chaine
Men22: move.l -4(a3),a2 ;Change la variable
move.l a1,(a2)
move.l a1,d1
move.w (a0)+,d0 ;Recopie la chaine
beq.s Men24
move.w d0,(a1)+
subq.w #1,d0
lsr.w #1,d0
Men23: move.w (a0)+,(a1)+
dbra d0,Men23
bra.s Men21
; Chaine vide au milieu: pointe la vraie
Men24: move.l ChVide(a5),d1
move.l d1,(a2)
bra.s Men21
; La variable pointait la meme chaine que la precedente
Men25: move.l -4(a3),a2
move.l d1,(a2)
bra.s Men21
; Est-ce completement fini?
Men26: cmp.l d6,d3 ;Buffer TI rempli?
bcs.s FinMen ;NON---> c'est fini!
;-----> Reexplore les variables a la recherche de la DERNIERE CHAINE
move.l VarLoc(a5),a6 ;Table des ad strings
moveq #0,d4 ;Cpt tableau---> 0
move.l d1,d2 ;Feneant!
; Rempli la table intermediaire
Men31:
.Loop move.w (a6)+,d0 Prend le flag
beq.s .Loop Nul: non initialise!
bmi.s .Proc Negatif: fin de chunk
.Var btst #1,d0 Une chaine?
bne.s .Alpha
lsr.w #8,d0 Recupere la taille
add.w d0,a6
move.w (a6)+,d0 Suivante
beq.s .Loop
bpl.s .Var
.Proc move.l (a6),d0 Chunk suivant
beq Men40 Le dernier?
move.l d0,a6 Non, on boucle!
bra.s .Loop
; Variable alphanumerique
.Alpha move.l a6,a3
move.l (a6)+,d1
beq.s Men31
btst #6,d0
beq.s Men34
move.l d1,a3
moveq #0,d0
move.b (a3)+,d0
addq.l #1,a3
subq.w #1,d0
moveq #1,d4
Men32: move.w (a3)+,d1 ;Calcule nombre de variable
addq.l #2,a3
addq.w #1,d1
mulu d1,d4
dbra d0,Men32
Men33: subq.l #1,d4
; La variable pointe elle la meme chaine?
Men34: cmp.l (a3)+,d7
beq.s Men36
tst.l d4
bne.s Men33
beq.s Men31
Men36: move.l d2,-4(a3)
tst.l d4
bne.s Men33
beq.s Men31
;-----> Refait un tour!
Men40: move.l a1,d7 ;Monte la limite <
bra Men0
;-----> Menage fini!
FinMen move.l a1,HiChaine(a5)
; Libere la m<>moire
move.l BMenage(a5),d0
bmi.s Finm1
move.l d0,a1
move.l #TMenage+16,d0
SyCall MemFree
Finm1 clr.l BMenage(a5)
;-----> FIN DES DEUX MENAGES : ca marche maintenant?
FinMenS movem.l (sp)+,d1-d7/a2-a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; LEFT$=
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InLeft
; - - - - - - - - - - - - -
Rbsr L_RInMid
move.l (a3)+,d4
moveq #0,d5
Rbra L_RInMid2
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fonction LEFT$
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnLeft
; - - - - - - - - - - - - -
move.l d3,d4
move.l (a3)+,a2
moveq #0,d2
move.w (a2)+,d2
moveq #0,d5
Rbra L_RFnMid
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =RIGHT$=
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InRight
; - - - - - - - - - - - - -
Rbsr L_RInMid
move.l (a3)+,d4
Rbmi L_FonCall
moveq #0,d5
cmp.l d3,d4
Rbcc L_RInMid2
move.l d3,d5
sub.l d4,d5
addq.l #1,d5
Rbra L_RInMid2
; - - - - - - - - - - - - -
Lib_Cmp FnRight
; - - - - - - - - - - - - -
move.l d3,d5
Rbmi L_FonCall
move.l (a3)+,a2
moveq #0,d2
move.w (a2)+,d2
move.l #$ffff,d4
cmp.l d2,d5
bcs L73c
move.l d2,d5
L73c: neg.l d5
add.l d2,d5
addq.l #1,d5
Rbra L_RFnMid
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MID$=
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InMid2
; - - - - - - - - - - - - -
Rbsr L_RInMid
move.l (a3)+,d5
move.l #$FFFF,d4
Rbra L_RInMid2
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnMid2
; - - - - - - - - - - - - -
move.l d3,d5
move.l (a3)+,a2
moveq #0,d2
move.w (a2)+,d2
move.l #$FFFF,d4
Rbra L_RFnMid
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =MID$() 3 params
; - - - - - - - - - - - - -
Lib_Cmp InMid3
; - - - - - - - - - - - - -
Rbsr L_RInMid
move.l (a3)+,d4
move.l (a3)+,d5
Rbra L_RInMid2
; - - - - - - - - - - - - -
Lib_Cmp FnMid3
; - - - - - - - - - - - - -
move.l d3,d4
move.l (a3)+,d5
move.l (a3)+,a2
moveq #0,d2
move.w (a2)+,d2
Rbra L_RFnMid
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Commun LEFT MID RIGHT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp RFnMid
; - - - - - - - - - - - - -
tst.l d5 ;pointe au milieu de la chaine
Rbmi L_FonCall
beq.s mi2
subq.l #1,d5
mi2: add.l d5,a2
cmp.l d2,d5 ;pas pointe trop loin??
bcc.s RVide ;si! chaine vide
mi3: tst.l d4
beq.s RVide
Rbmi L_FonCall
mi4: add.l d5,d4
cmp.l d2,d4
bls.s mi5
move.l d2,d4
mi5: sub.l d5,d4
mi6: move.l d4,d3
Rjsr L_Demande
move d4,(a0)+ ;poke la longueur
subq.l #1,d4
bmi.s mi8
mi7: move.b (a2)+,(a0)+
dbra d4,mi7
move a0,d0 ;rend pair
btst #0,d0
beq.s mi8
addq.l #1,a0
mi8: move.l a0,HiChaine(a5)
move.l a1,d3
rts
RVide: move.l ChVide(a5),d3 ;ramene la chaine vide
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Commun MID LEFT RIGHT = / A0= adresse variable
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp RInMid
; - - - - - - - - - - - - -
moveq #0,d3
move.l a0,a2
move.l (a2),a1
move.w (a1)+,d3
Rbsr L_Demande
move.l (a2),d0
move.l a0,(a2) ;Change la variable
move.l d0,a2
move.w d3,d2
move.w d2,(a0)+ ;Longueur
subq.w #1,d2
lsr.w #2,d2
addq.l #2,a2
L77b: move.l (a2)+,(a0)+
dbra d2,L77b
move.l a0,HiChaine(a5)
addq.l #2,a1
moveq #0,d2 ;A1/D3= destination
move.l (a3)+,a2 ;A2/D2= source
move.w (a2)+,d2
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Commun LEFT MID RIGHT II
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp RInMid2
; - - - - - - - - - - - - -
tst.l d5
Rbmi L_FonCall
beq.s mdst2
subq.l #1,d5
mdst2: add.l d5,a1 ;situe dans la chaine a changer
cmp.l d3,d5
bcc.s mdst10 ;trop loin: ne change rien
tst.l d4
Rbmi L_FonCall
beq.s mdst10
add.l d5,d4
cmp.l d3,d4
bls.s mdst3
move.l d3,d4
mdst3: sub.l d5,d4
cmp.l d2,d4 ;limite par la taille de la chaine source
bls.s mdst4
move.l d2,d4
mdst4: subq.l #1,d4 ;la chaine source est nulle!
bmi.s mdst10
mdst5: move.b (a2)+,(a1)+
dbra d4,mdst5
mdst10: rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =VAL / D2= type desire
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnVal
; - - - - - - - - - - - - -
move.w d2,d4
move.l d3,a2
move.w (a2)+,d2
beq.s .Vide
Rjsr L_ChVerBuf Recopie la chaine dans le buffer
move.l Buffer(a5),a0
moveq #1,d0 Tenir compte du signe
move.w d4,d2 Type desire
Rjmp L_ValRout
.Vide moveq #0,d3 Retourne un 0 entier / float / double
moveq #0,d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; =RESOURCE$(n)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnResource
; - - - - - - - - - - - - -
; Un message normal?
move.l d3,d0
ble.s .Skip1
Rbsr L_Dia_GetPuzzle
move.l a2,a0
move.l d3,d0
Rjsr L_GetMessage
bra .Fin
; Le path du systeme? (0)
.Skip1 neg.l d0
bne.s .Skip2
Rbsr L_Sys_GetPath Va chercher le pathname
lea Sys_Pathname(a5),a0 Additionne!
bra.s .Fin
; Un message systeme? (-1)
.Skip2 cmp.l #1001,d0
bcc.s .Skip3
move.l Sys_Messages(a5),a0
bra.s .Fin0
; Un message systeme editeur? (-1000)
.Skip3 sub.l #1000,d0
cmp.l #1001,d0
bcc.s .Skip4
move.l Ed_Systeme(a5),a0
bra.s .Fin0
; Un message de menu editeur? (-2000)
.Skip4 sub.l #1000,d0
cmp.l #1001,d0
bcc.s .Skip5
move.l EdM_Messages(a5),a0
bra.s .Fin0
; Un message editeur? (-3000)
.Skip5 sub.l #1000,d0
cmp.l #1001,d0
bcc.s .Skip6
move.l Ed_Messages(a5),a0
bra.s .Fin0
; Un message de test? (-4000)
.Skip6 sub.l #1000,d0
cmp.l #1001,d0
bcc.s .Skip7
move.l Ed_TstMessages(a5),a0
bra.s .Fin0
; Un message run-time? (-5000)
.Skip7 sub.l #1000,d0
cmp.l #1001,d0
Rbcc L_FonCall
move.l Ed_RunMessages(a5),a0
; Retourne la chaine
.Fin0 Rjsr L_GetMessage
.Fin move.l a0,a2
Rbra L_Str2Chaine
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Source: Menus.s
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MENU KEY
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InMenuKey
; - - - - - - - - - - - - -
Rbsr L_MnDim
tst.l MnLat(a2)
Rbne L_FonCall
clr.b MnKFlag(a2)
rts
; - - - - - - - - - - - - -
Lib_Cmp InMenuKey1
; - - - - - - - - - - - - -
Rbsr L_MnDim
tst.l MnLat(a2)
Rbne L_FonCall
move.l (a3)+,a0
tst.w (a0)+
Rbeq L_FonCall
move.b (a0),MnKAsc(a2)
move.b #1,MnKFlag(a2)
rts
; - - - - - - - - - - - - -
Lib_Cmp InMenuKey2
; - - - - - - - - - - - - -
Rbsr L_MnDim
tst.l MnLat(a2)
Rbne L_FonCall
move.l (a3)+,d2
moveq #0,d3
Rbra L_MnKy
; - - - - - - - - - - - - -
Lib_Cmp InMenuKey3
; - - - - - - - - - - - - -
Rbsr L_MnDim
tst.l MnLat(a2)
Rbne L_FonCall
move.l (a3)+,d3
move.l (a3)+,d2
Rbra L_MnKy
; - - - - - - - - - - - - -
Lib_Cmp MnKy
; - - - - - - - - - - - - -
L966 cmp.l #256,d3
Rbcc L_FonCall
move.b d3,MnKSh(a2)
cmp.l #128,d2
Rbcc L_FonCall
move.b d2,MnKSc(a2)
move.b #-1,MnKFlag(a2)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INSTRUCTION ON MENU
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InOnMenu
; - - - - - - - - - - - - -
Rjsr L_OMnEff
Rlea L_GoMenu,0 Branche la routine au test
move.l a0,GoTest_GoMenu(a5)
move.w d0,OMnType(a5)
ext.l d1
move.w d1,OMnNb(a5)
move.w d1,d2 * Nb de labesl*4
lsl.w #2,d1
move.l d1,d0
SyCall MemFast
Rbeq L_OOfMem
move.l a0,OMnBase(a5)
add.l d1,a0
* Poke les jumps
subq.w #1,d2
OnMn2 move.l (a3)+,-(a0)
dbra d2,OnMn2
* Plus de branchements
bclr #BitJump,ActuMask(a5)
* Branche la routine Clearvar
lea .Struc(pc),a1
lea Sys_ClearRoutines(a5),a2
SyCall AddRoutine
rts
; Structure clearvar
; ~~~~~~~~~~~~~~~~~~
.Struc dc.l 0
Rbra L_OMnEff
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MENU$(,,,)=
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InMenu
; - - - - - - - - - - - - -
move.l #EntNul,d3
move.l d3,-(a3)
move.l d3,-(a3)
move.l d3,-(a3)
Rbra L_InMenu4
; - - - - - - - - - - - - -
Lib_Cmp InMenu2
; - - - - - - - - - - - - -
move.l #EntNul,d3
move.l d3,-(a3)
move.l d3,-(a3)
Rbra L_InMenu4
; - - - - - - - - - - - - -
Lib_Cmp InMenu3
; - - - - - - - - - - - - -
move.l #EntNul,-(a3)
Rbra L_InMenu4
; - - - - - - - - - - - - -
Lib_Cmp InMenu4
; - - - - - - - - - - - - -
Rjsr L_MnClearVar Routine pour ClearVar
move.l a3,-(sp)
lea 4*4(a3),a3 Pointe les dimensions
move.w d5,d0
lsl.w #2,d0
pea 0(a3,d0.w) Position par defaut de la pile
Rjsr L_MnFind
bne.s IMenA
Rjsr L_MnIns
IMenA move.l 4(sp),a3 Repointe les chaines
* Parametres par defaut
move.l ScOnAd(a5),a0
cmp.l MnAdEc(a5),a0
beq.s IMen6
tst.l MnAdEc(a5)
Rbne L_ScNOp
move.l a0,MnAdEc(a5)
IMen6: move.l EcWindow(a0),a0
move.b WiPaper+1(a0),d0
move.b WiPen+1(a0),d1
move.b d0,MnInkA1(a2)
move.b d1,MnInkB1(a2)
move.b d0,MnInkC1(a2)
move.b d1,MnInkA2(a2)
move.b d0,MnInkB2(a2)
move.b d0,MnInkC2(a2)
* Prend la chaine OBF
lea MnObF(a2),a0
bsr MnOob
* Prend la chaine OBOFF
lea MnOb3(a2),a0
bsr MnOob
* Prend la chaine OB2
lea MnOb2(a2),a0
bsr MnOob
* Prend la chaine OB1
lea MnOb1(a2),a0
bsr MnOob
* Ca y est!!!
IMenX: addq.w #1,MnChange(a5)
move.l (sp)+,a3
addq.l #4,sp
rts
; Petite routine de creation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MnOob move.l (a3)+,d3
cmp.l #EntNul,d3
beq MnOob0
move.l d3,a1
tst.w (a1)
bne MnOob1
* Efface la chaine
MnOobE move.l (a0),d0
beq.s MnOob0
clr.l (a0)
move.l d0,a1
moveq #0,d0
move.w (a1),d0
SyCall MemFree
MnOob0 rts
* Une chaine!
MnOob1 movem.l a0/a1,-(sp) * Efface l'ancienne
bsr.s MnOobE
movem.l (sp)+,a0/a1
Rjsr L_MnObjet * Cree la nouvelle
Rbeq L_OOfMem
Rbmi L_FonCall
move.l d0,(a0)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MENU DEL
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InMenuDel
; - - - - - - - - - - - - -
Rjmp L_MnRaz
; - - - - - - - - - - - - -
Lib_Cmp InMenuDel1
; - - - - - - - - - - - - -
Rbsr L_MnDim
move.l a2,d0
moveq #0,d5
addq.w #1,MnChange(a5)
Rjsr L_MnEff
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SET MENU
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp InSetMenu
; - - - - - - - - - - - - -
Rbsr L_MnDim
move.l (a3)+,d3
move.l #EntNul,d0
cmp.l d0,d3
beq.s ISMn1
move.w d3,MnY(a2)
bset #MnFixed,MnFlag(a2)
ISMn1 move.l (a3)+,d1
cmp.l d0,d1
beq.s ISMn2
move.w d1,MnX(a2)
bset #MnFixed,MnFlag(a2)
ISMn2 rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Trouve l'adresse d'un objet de menu
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp MnDim
; - - - - - - - - - - - - -
tst.w d5
bne.s MnDim1
tst.l d3
Rbeq L_FonCall
cmp.l #MnNDim,d3
Rbhi L_FonCall
lea MnDFlags(a5),a0
lea -1(a0,d3.w),a0
rts
* Cherche l'adresse D'UN objet
MnDim1 Rjsr L_MnFind
lsl.w #2,d5
add.w d5,a3 Saute les parametres
tst.w d0
beq.s .Nd
lea MnFlag(a2),a0
rts
.Nd moveq #39,d0 Menu item not defined
Rbra L_GoError
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Entree procedure menu *** illegal
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp MenuProcedure
; - - - - - - - - - - - - -
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SOUS PROGRAMME UTILISE PAR VAL ET INPUT
; D0= Tenir compte du signe (TRUE)
; D2= Type voulu: 0= Entier / 1= Float / -1= le mieux
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp ValRout
; - - - - - - - - - - - - -
movem.l a1-a2/d5-d7,-(sp)
move.w d2,-(sp)
move.l a0,d7
moveq #0,d4
move.l a0,a2
tst.w d0
beq.s val1c
; y-a-t'il un signe devant?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
val1: move.b (a0)+,d0
beq val10
cmp.b #32,d0
beq.s val1
move.l a0,a2
subq.l #1,a2
cmp.b #"-",d0
bne.s val1a
not d4
bra.s val1c
val1a: cmp.b #"+",d0
beq.s val1c
val1b: subq.l #1,a0
val1c
; Explore le debut du chiffre
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.b (a0)+,d0
beq val10
cmp.b #32,d0
beq.s val1c
cmp.b #"$",d0 ;chiffre HEXA
beq CHexa
cmp.b #"%",d0 ;chiffre BINAIRE
beq CBin
cmp.b #".",d0
beq.s val2
cmp.b #"0",d0
bcs val10
cmp.b #"9",d0
bhi val10
; Copie le chiffre dans BuFloat
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
val2: subq.l #1,a0
move.l a0,a1 Si float: trouve la fin du chiffre
clr.w d3 Les flags
lea BuFloat(a5),a2
moveq #60,d2 Taille maxi du buffer
val3: move.b (a1)+,d0
cmp.b #32,d0
beq.s val3
move.b d0,(a2)+
beq.s val4
subq.w #1,d2 Au bout du buffer?
beq.s val4
cmp.b #"0",d0
bcs.s val3z
cmp.b #"9",d0
bls.s val3
val3z: cmp.b #".",d0 Cherche une "virgule"
bne.s val3a
bset #0,d3 Si deux virgules: fin du chiffre
beq.s val3
bne.s val4
val3a: cmp.b #"e",d0 Cherche un exposant
beq.s val3b
cmp.b #"E",d0 Autre caractere: fin du chiffre
bne.s val4
val3ab: move.b #"e",-1(a2) Met un E minuscule!!!
val3b: move.b (a1)+,d0 Apres un E, accepte -/+ et chiffres
cmp.b #32,d0
beq.s val3b
cmp.b #"+",d0
beq.s val3c
cmp.b #"-",d0
bne.s val3e
val3c: bset #1,d3 + ou -: c'est un float!
move.b d0,(a2)+
val3d: subq.w #1,d2 Au bout du buffer?
beq.s val4
move.b (a1)+,d0 Puis cherche la fin de l'exposant
cmp.b #32,d0
beq.s val3d
val3e: move.b d0,(a2)+
subq.w #1,d2 Au bout du buffer?
beq.s val4
cmp.b #"0",d0
bcs.s val4
cmp.b #"9",d0 Chiffre! c'est un float
bls.s val3c
val4: clr.b (a2)
clr.b -(a2) Recule d'un > fin du float
subq.l #1,a1 Reste sur la fin du chiffre
lea BuFloat(a5),a0 Le buffer de conversion
tst.w (sp) Un entier quoi qu'il arrive
beq.s CEntier
bpl.s .Float
btst #0,MathFlags(a5) Si indifferent,
beq.s CEntier Entier, si pas de math
; Conversion ASCII ---> FLOAT
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Float move.l a1,-(sp)
Rjsr L_Ascii2Float
move.l d0,d3
move.l d1,d4
move.l (sp)+,a0 Pointe la fin du chiffre
moveq #1,d2 Un float
moveq #0,d0 Pas d'erreur
bra.s ValOut La sortie
; Converti vers un chiffre entier
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; chiffre entier
CEntier move.l a1,-(sp)
bsr declong Conversion a partir de BuFloat
move.l (sp)+,a0 Pointe la fin du chiffre
bra.s CFin
; chiffre hexa
CHexa: bsr hexalong
bra.s CFin
; chiffre binaire
CBin bsr binlong
; Test du signe
CFin move.l d0,d3 Retourne en D3
tst.w d1 Conversion valide?
beq.s .Ok
moveq #0,d3 Si probleme: ramene zero!
.Ok tst.w d4
beq.s ECheck
neg.l d3
; Verification du type
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
ECheck moveq #0,d0 Pas d'erreur
moveq #0,d2 Entier
tst.w (sp) Que veut-on?
beq.s .Ent Un entier
bpl.s .Flt Un float!
btst #0,MathFlags(a5) On sait pas, si float present...
beq.s .Ent ...retourne un float
.Flt movem.l d0-d1/a0,-(sp)
Rjsrt L_IntToFl1
movem.l (sp)+,d0-d1/a0
moveq #1,d2
.Ent bra.s ValOut
; Erreur, ramene zero
; ~~~~~~~~~~~~~~~~~~~~~~~~~
val10: moveq #0,d3
moveq #1,d0
move.l d7,a0 Repointe le debut
bra.s ECheck
; Sortie
ValOut addq.l #2,sp
movem.l (sp)+,a1-a2/d5-d7
tst.l d0
rts
; MINI CHRGET POUR LES CONVERSIONS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
minichr move.b (a0)+,d2
beq.s mc1
cmp.b #32,d2
beq.s minichr
cmp.b #"a",d2 ;si minuscule: majuscule
bcs.s mc0
sub.b #"a"-"A",d2
mc0 sub.b #48,d2
rts
mc1 move.b #-1,d2
rts
; Minichr pour hexa
; ~~~~~~~~~~~~~~~~~
minichr2
move.b (a0)+,d2
beq.s .mc1
cmp.b #"a",d2 ;si minuscule: majuscule
bcs.s .mc0
sub.b #"a"-"A",d2
.mc0: sub.b #48,d2
rts
.mc1: move.b #-1,d2
rts
; CONVERSION DECIMAL->HEXA SUR QUATRE OCTETS, SIGNE!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
declong moveq #0,d0
moveq #0,d2
moveq #0,d3
move.l a0,-(sp)
ddh1: bsr minichr
ddh1a: cmp.b #10,d2
bcc.s ddh5
move d0,d1
mulu #10,d1
swap d0
mulu #10,d0
swap d0
tst d0
bne.s ddh2
add.l d1,d0
bcs.s ddh2
add.l d2,d0
bmi.s ddh2
addq #1,d3
bra.s ddh1
ddh2: move.l (sp)+,a0
moveq #1,d1 ;out of range: bpl, et recupere l'adresse
rts
ddh5: subq.l #1,a0
addq.l #4,sp
tst d3
beq.s ddh7
moveq #0,d1 ;OK: chiffre en d0, et beq
rts
ddh7: moveq #-1,d1 ;pas de chiffre: bmi
rts
; CONVERSION HEXA-ASCII EN HEXA-HEXA
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
hexalong
moveq #0,d0
moveq #0,d2
moveq #0,d3
move.l a0,-(sp)
hh1: bsr minichr2
cmp.b #10,d2
bcs.s hh2
cmp.b #17,d2
bcs.s ddh5
subq.w #7,d2
hh2: cmp.b #16,d2
bcc.s ddh5
lsl.l #4,d0
or.b d2,d0
addq.w #1,d3
cmp #9,d3
bne.s hh1
beq.s ddh2
; CONVERSION BINAIRE ASCII ---> HEXA SUR QUATRE OCTETS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
binlong moveq #0,d0
moveq #0,d2
moveq #0,d3
move.l a0,-(sp)
bh1: bsr minichr
cmp.b #2,d2
bcc.s ddh5
roxr #1,d2
roxl.l #1,d0
bcs.s ddh2
addq.w #1,d3
cmp.w #33,d3
bne.s bh1
beq ddh1
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; DEBUT DES SWAP FLOAT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Ouverture des libraries mathematiques
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp CmpInitFloat
; - - - - - - - - - - - - -
move.b d0,MathFlags(a5) Stocke les flags
move.l a6,-(sp)
move.l $4.w,a6
move.l #$c90fd942,ValPi(a5) Simple precision
move.l #$b4000048,Val180(a5)
; Init float.library
moveq #0,d0
lea FloatName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,FloatBase(a5)
beq.s .Err
; Init mathffp.library
btst #1,MathFlags(a5) Des maths?
beq.s .Ok
moveq #0,d0
lea MathName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,MathBase(a5)
beq.s .Err
.Ok moveq #0,d0
bra.s .Out
.Err moveq #1,d0
.Out move.l (sp)+,a6
rts
FloatName
dc.b "mathffp.library",0
MathName
dc.b "mathtrans.library",0
even
; - - - - - - - - - - - - -
Lib_Cmp CmpInitDouble
; - - - - - - - - - - - - -
move.l a6,-(sp)
move.b d0,MathFlags(a5) Stocke les flags
move.l $4.w,a6
; Init float.library
moveq #0,d0
lea .FloatName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,FloatBase(a5)
beq.s .Err
; Init mathffp.library
moveq #0,d0
lea .MathName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,MathBase(a5)
beq.s .Err
; Pi / 180
move.l #$40668000,Val180(a5)
move.l #$00000000,Val180+4(a5)
move.l #$400921fb,ValPi(a5)
move.l #$54442eea,ValPi+4(a5)
; Init Dfloat
moveq #0,d0
lea .DFloatName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,DFloatBase(a5)
beq.s .Err
; Init DMath
moveq #0,d0
lea .DMathName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,DMathBase(a5)
beq.s .Err
; OK!
.Ok moveq #0,d0
bra.s .Out
.Err moveq #1,d0
.Out move.l (sp)+,a6
rts
.FloatName
dc.b "mathffp.library",0
.MathName
dc.b "mathtrans.library",0
.DFloatName
dc.b "mathieeedoubbas.library",0
.DMathName
dc.b "mathieeedoubtrans.library",0
even
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ENTIER >>> FLOAT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Conversion entier >>> float dans le dernier operateur
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp IntToFl1
; - - - - - - - - - - - - -
move.l d3,d0
move.l a6,d3
move.l FloatBase(a5),a6
jsr _LVOSPFlt(a6)
move.l d3,a6
move.l d0,d3
rts
; - - - - - - - - - - - - -
Lib_Cmp DIntToFl1
; - - - - - - - - - - - - -
move.l d3,d0
move.l a6,d3
move.l DFloatBase(a5),a6
jsr _LVOIEEEDPFlt(a6)
move.l d3,a6
move.l d0,d3
move.l d1,d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ENTIER >>> FLOAT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Conversion entier >>> float dans la pile
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp IntToFl2
; - - - - - - - - - - - - -
move.l (a3),d0
move.l a6,d4
move.l FloatBase(a5),a6
jsr _LVOSPFlt(a6)
move.l d4,a6
move.l d0,(a3)
rts
; - - - - - - - - - - - - -
Lib_Cmp DIntToFl2
; - - - - - - - - - - - - -
movem.l (a3),d0-d1
move.l a6,d2
move.l DFloatBase(a5),a6
jsr _LVOIEEEDPFlt(a6)
move.l d2,a6
movem.l d0-d1,(a3)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FLOAT >>> ENTIER
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Conversion float >>> entier dans le dernier operateur
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FlToInt1
; - - - - - - - - - - - - -
move.l d3,d0
move.l a6,d3
move.l FloatBase(a5),a6
jsr _LVOSPFix(a6)
move.l d3,a6
move.l d0,d3
rts
; - - - - - - - - - - - - -
Lib_Cmp DFlToInt1
; - - - - - - - - - - - - -
move.l d3,d0
move.l d4,d1
move.l a6,d3
move.l DFloatBase(a5),a6
jsr _LVOIEEEDPFix(a6)
move.l d3,a6
move.l d0,d3
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FLOAT >>> ENTIER
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Conversion float >>> entier dans la pile
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FlToInt2
; - - - - - - - - - - - - -
move.l (a3),d0
move.l a6,d4
move.l FloatBase(a5),a6
jsr _LVOSPFix(a6)
move.l d4,a6
move.l d0,(a3)
rts
; - - - - - - - - - - - - -
Lib_Cmp DFlToInt2
; - - - - - - - - - - - - -
movem.l (a3),d0-d1
move.l a6,d2
move.l DFloatBase(a5),a6
jsr _LVOIEEEDPFix(a6)
move.l d2,a6
movem.l d0-d1,(a3)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FONCTION MATHEMATIQUE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait une fonction mathematique
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Math_Fonction
; - - - - - - - - - - - - -
move.l d3,d0
move.l a6,d3
move.l MathBase(a5),a6
jsr 0(a6,d2.w)
move.l d3,a6
move.l d0,d3
rts
; - - - - - - - - - - - - -
Lib_Cmp DMath_Fonction
; - - - - - - - - - - - - -
move.l d3,d0
move.l d4,d1
move.l a6,d3
move.l DMathBase(a5),a6
jsr 0(a6,d2.w)
move.l d3,a6
move.l d0,d3
move.l d1,d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; COMPARAISONS FLOAT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait une comparaison float
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Float_Compare
; - - - - - - - - - - - - -
move.l d3,d0
move.l (a3)+,d1
move.l a6,d3
move.l FloatBase(a5),a6
jsr _LVOSPCmp(a6)
move.l d3,a6
rts
; - - - - - - - - - - - - -
Lib_Cmp DFloat_Compare
; - - - - - - - - - - - - -
move.l d3,d0
move.l d4,d1
movem.l (a3)+,d2-d3
move.l a6,d5
move.l DFloatBase(a5),a6
jsr _LVOIEEEDPCmp(a6)
move.l d5,a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Operation FLOAT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait une operation float
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Float_Operation
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.l d3,d1
move.l a6,d4
move.l FloatBase(a5),a6
jsr 0(a6,d2.w)
move.l d4,a6
move.l d0,d3
rts
; - - - - - - - - - - - - -
Lib_Cmp DFloat_Operation
; - - - - - - - - - - - - -
movem.l (a3)+,d0-d1
exg d3,d2
exg d4,d3
move.l a6,d5
move.l DFloatBase(a5),a6
jsr 0(a6,d4.w)
move.l d5,a6
move.l d0,d3
move.l d1,d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FLOAT= ZERO?
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait un TST sur le float D3
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Float_Test
; - - - - - - - - - - - - -
move.l d3,d1
move.l a6,d4
move.l FloatBase(a5),a6
jsr _LVOSPTst(a6)
move.l d4,a6
rts
; - - - - - - - - - - - - -
Lib_Cmp Float_TestF
; - - - - - - - - - - - - -
move.l d3,d0
move.l d4,d1
move.l a6,d2
move.l DFloatBase(a5),a6
jsr _LVOIEEEDPTst(a6)
move.l d2,a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Operation MATH
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait une operation Math
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Math_Operation
; - - - - - - - - - - - - -
move.l (a3)+,d0
move.l d3,d1
move.l a6,d4
move.l MathBase(a5),a6
jsr 0(a6,d2.w)
move.l d4,a6
move.l d0,d3
rts
; - - - - - - - - - - - - -
Lib_Cmp DMath_Operation
; - - - - - - - - - - - - -
movem.l (a3)+,d0-d1
exg d3,d2
exg d4,d3
move.l a6,d5
move.l DMathBase(a5),a6
jsr 0(a6,d4.w)
move.l d5,a6
move.l d0,d3
move.l d1,d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FONCTION FLOAT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait une fonction float
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Float_Fonction
; - - - - - - - - - - - - -
move.l d3,d0
move.l a6,d3
move.l FloatBase(a5),a6
jsr 0(a6,d2.w)
move.l d3,a6
move.l d0,d3
rts
; - - - - - - - - - - - - -
Lib_Cmp DFloat_Fonction
; - - - - - - - - - - - - -
move.l d3,d0
move.l d4,d1
move.l a6,d5
move.l DFloatBase(a5),a6
jsr 0(a6,d2.w)
move.l d5,a6
move.l d0,d3
move.l d1,d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Verifie que le float est positif
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FlPos Simple precision
; - - - - - - - - - - - - -
btst #7,d3
Rbne L_FonCall
rts
; - - - - - - - - - - - - -
Lib_Cmp FlPosD Double precision
; - - - - - - - - - - - - -
btst #31,d3
Rbne L_FonCall
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RETOURNE UN ANGLE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp AAngle SFloat
; - - - - - - - - - - - - -
move.l d3,d0 Appel de la fonction
move.l a6,d3
move.l MathBase(a5),a6
jsr 0(a6,d2.w)
tst.w Angle(a5)
beq.s .AAnX
move.l FloatBase(a5),a6
move.l ValPi(a5),d1
jsr _LVOSPDiv(a6)
move.l Val180(a5),d1
jsr _LVOSPMul(a6)
.AAnX move.l d3,a6
move.l d0,d3
rts
; - - - - - - - - - - - - -
Lib_Cmp AAngleD DFloat
; - - - - - - - - - - - - -
move.l d3,d0 Appel de la fonction
move.l d4,d1
move.l a6,d5
move.l DMathBase(a5),a6
jsr 0(a6,d2.w)
tst.w Angle(a5)
beq.s .AAnY
move.l DFloatBase(a5),a6
move.l ValPi(a5),d2
move.l ValPi+4(a5),d3
jsr _LVOSPDiv(a6)
move.l Val180(a5),d2
move.l Val180+4(a5),d3
jsr _LVOSPMul(a6)
.AAnY move.l d5,a6
move.l d0,d3
move.l d1,d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; TRANSFORME EN ANGLE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FFAngle SFloat
; - - - - - - - - - - - - -
tst.w Angle(a5)
bne.s .Conv
rts
; Conversion--> radian
.Conv move.l d3,d0
move.l a6,d3
move.l FloatBase(a5),a6
move.l Val180(a5),d1
jsr _LVOSPDiv(a6)
move.l ValPi(a5),d1
jsr _LVOSPMul(a6)
move.l d3,a6
move.l d0,d3
rts
; - - - - - - - - - - - - -
Lib_Cmp FAngleD DFloat
; - - - - - - - - - - - - -
tst.w Angle(a5)
bne.s .Conv
rts
; Conversion--> radian
.Conv move.l d3,d0
move.l d4,d1
move.l a6,d5
move.l DFloatBase(a5),a6
move.l Val180(a5),d2
move.l Val180+4(a5),d3
jsr _LVOSPDiv(a6)
move.l ValPi(a5),d2
move.l ValPi+4(a5),d3
jsr _LVOSPMul(a6)
move.l d5,a6
move.l d0,d3
move.l d1,d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; PARAM FLOAT (!)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnParamF SFloat
; - - - - - - - - - - - - -
move.l ParamF(a5),d3
rts
; - - - - - - - - - - - - -
Lib_Cmp FnParamD DFloat
; - - - - - - - - - - - - -
move.l ParamF(a5),d3
move.l ParamF2(a5),d4
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ASCII Vers Float
; A0 Buffer
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Ascii2Float
; - - - - - - - - - - - - -
move.l a0,-(sp)
Rjsr L_AscToFloat
addq.l #4,sp
rts
; - - - - - - - - - - - - -
Lib_Cmp Ascii2FloatD
; - - - - - - - - - - - - -
move.l a0,-(sp)
Rjsr L_AscToDouble
addq.l #4,sp
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Float vers ascii
; D3/D4 Float
; A0 Buffer
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp Float2Ascii
; - - - - - - - - - - - - -
move.l d3,d0 Simple precision
move.w FixFlg(a5),d4
move.w ExpFlg(a5),d5
bclr #31,d4
Rjmp L_FloatToAsc
; - - - - - - - - - - - - -
Lib_Cmp Float2AsciiD
; - - - - - - - - - - - - -
moveq #2,d0 Double precision
moveq #15,d1
tst.w FixFlg(a5)
bmi.s .Ok
move.w FixFlg(a5),d1 Nombre de chiffres
tst.w ExpFlg(a5)
beq.s .Ok
moveq #0,d0
.Ok movem.l a0-a1,-(sp)
btst #31,d3 Si positif
bne.s .Neg
move.b #" ",(a0)+ Un espace devant
.Neg move.l d0,-(sp)
move.l d1,-(sp)
move.l a0,-(sp)
move.l d4,-(sp)
move.l d3,-(sp)
Rjsr L_DoubleToAsc
lea 20(sp),sp
movem.l (sp)+,a0/a1
.Lop tst.b (a0)+ Pointe la fin
bne.s .Lop
subq.l #1,a0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MAX en simple/double precision
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnMaxF
; - - - - - - - - - - - - -
move.l (a3),-(a3)
Rjsrt L_Float_Compare
ble.s .Skip
move.l (a3),d3
.Skip addq.l #4,a3
rts
; - - - - - - - - - - - - -
Lib_Cmp FnMaxD
; - - - - - - - - - - - - -
movem.l (a3),d0-d1
movem.l d0-d1,-(sp)
movem.l d3-d4,-(sp)
Rjsrt L_Float_Compare
ble.s .Skip
movem.l (sp),d3-d4
bra.s .Out
.Skip movem.l 8(sp),d3-d4
.Out lea 16(sp),sp
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MIN en simple/double precision
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Cmp FnMinF
; - - - - - - - - - - - - -
move.l (a3),-(a3)
Rjsrt L_Float_Compare
bge.s .Skip
move.l (a3),d3
.Skip addq.l #4,a3
rts
; - - - - - - - - - - - - -
Lib_Cmp FnMinD
; - - - - - - - - - - - - -
movem.l (a3),d0-d1
movem.l d0-d1,-(sp)
movem.l d3-d4,-(sp)
Rjsrt L_Float_Compare
bge.s .Skip
movem.l (sp),d3-d4
bra.s .Out
.Skip movem.l 8(sp),d3-d4
.Out lea 16(sp),sp
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Espace pour le compilateur!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_Pos 500
; - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Finish the library
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Lib_End
; - - - - - - - - - - - - -
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; END OF THE EXTENSION
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
C_End dc.w 0
even