6679 lines
121 KiB
ArmAsm
6679 lines
121 KiB
ArmAsm
;---------------------------------------------------------------------
|
||
;
|
||
; 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.
|
||
;
|
||
;---------------------------------------------------------------------
|
||
|
||
*
|
||
INCDIR ":AMOS.S/Common/"
|
||
Include "_Equ.s"
|
||
RsSet DataLong
|
||
Include "_Pointe.s"
|
||
*
|
||
Include "_WEqu.s"
|
||
Include "_CEqu.s"
|
||
Include "_LEqu.s"
|
||
*
|
||
CDebug set 0
|
||
*
|
||
F_Courant equ 0
|
||
F_Source equ 1
|
||
F_Objet equ 2
|
||
F_Libs equ 3
|
||
M_Libs equ 27
|
||
M_Fichiers equ F_Libs+M_Libs
|
||
Mes_Base equ 14+26
|
||
Mes_BaseCh equ 36
|
||
Mes_BaseNoms equ 46
|
||
*
|
||
Bra CliIn
|
||
Bra AMOSIn1
|
||
Bra AMOSIn2
|
||
dc.b "ACmp"
|
||
;---------------------------------------------------------------------
|
||
dc.b 0,"$VER: 1.36",0
|
||
even
|
||
; Modifs 1.34b / 1.34
|
||
; - Print # avec des ;
|
||
;
|
||
;---------------------------------------------------------------------
|
||
*
|
||
Ext_Nb equ 5
|
||
Ext_TkCmp equ 6
|
||
Ext_TkCOp equ $14
|
||
Ext_TkTston equ $28
|
||
Ext_TkTstof equ $3a
|
||
Ext_TkTst equ $4e
|
||
*
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Entree AMOS mode direct
|
||
;---------------------------------------------------------------------
|
||
AMOSIn1 move.l a5,a4
|
||
lea DZ(pc),a5
|
||
bsr ResetDZ
|
||
move.w #1,Flag_AMOS(a5)
|
||
bra.s AMOS_Suite
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Entree AMOS compiler.amos
|
||
;---------------------------------------------------------------------
|
||
AMOSIn2 lea AMOS_Save(pc),a1
|
||
movem.l a3-a6,(a1)
|
||
move.l a5,a4
|
||
lea DZ(pc),a5
|
||
bsr ResetDZ
|
||
move.w #-1,Flag_Quiet(a5)
|
||
move.w #-1,Flag_AMOS(a5)
|
||
AMOS_Suite
|
||
move.l IconBase(a4),C_IconBase(a5)
|
||
bne.s .skip
|
||
move.w #-1,IconAMOS(a5)
|
||
.skip move.l DosBase(a4),C_DosBase(a5)
|
||
move.l T_GfxBase(a4),C_GfxBase(a5)
|
||
move.l a4,AMOS_Dz(a5)
|
||
bra Go_On
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Entree CLI
|
||
;---------------------------------------------------------------------
|
||
CliIn lea DZ(pc),a5
|
||
bsr ResetDZ
|
||
clr.w Flag_AMOS(a5)
|
||
|
||
* Entree commune
|
||
Go_On move.l sp,C_Pile(a5)
|
||
move.l a0,a1
|
||
move.l d0,d1
|
||
* Buffer de travail
|
||
move.l #256,d0
|
||
bsr ResBuffer
|
||
beq OOfMem
|
||
move.l a0,B_Work(a5)
|
||
* Recopie la ligne de commande
|
||
subq.l #1,d1
|
||
bmi.s .loop3
|
||
.loop1 move.b (a1)+,d0
|
||
cmp.b #32,d0
|
||
bcs.s .loop2
|
||
move.b d0,(a0)+
|
||
.loop2 dbra d1,.loop1
|
||
.loop3 clr.b (a1)
|
||
* Init de l'amigados
|
||
bsr IniDisc
|
||
* Liste par defaut
|
||
lea Def_Liste(pc),a0
|
||
lea Nom_Liste(a5),a1
|
||
.Init0 move.b (a0)+,(a1)+
|
||
bne.s .Init0
|
||
|
||
moveq #3,d0
|
||
bsr GoPos
|
||
* Flash par defaut, aucun!
|
||
move.w #32,Flag_Flash(a5)
|
||
* Explore la ligne de commande (si option -C)
|
||
move.l B_Work(a5),a0
|
||
bsr CommandLine
|
||
* Charge la LIB LISTE / Explore sa ligne de commande (si option -E)
|
||
lea Nom_Liste(a5),a1
|
||
bsr LoadInBuffer
|
||
moveq #1,d3
|
||
bsr ListeNom
|
||
move.l B_DiskIn(a5),a0
|
||
bsr CommandLine
|
||
move.l d0,-(sp)
|
||
* Encore un coup la vraie...
|
||
move.l B_Work(a5),a0
|
||
bsr CommandLine
|
||
move.l d0,-(sp)
|
||
* Ca y est! On peut trouver les noms
|
||
bsr InitListe
|
||
* Des erreurs?
|
||
move.l (sp)+,d0
|
||
bne ErrCommand
|
||
move.l (sp)+,d0
|
||
bne ErrComList
|
||
* Imprime le titre
|
||
moveq #20,d0
|
||
bsr MesPrint
|
||
* Ouvre l'icon.library
|
||
bsr InitIcons
|
||
* Longueur des buffers
|
||
moveq #1,d0
|
||
bsr GetChiffre
|
||
move.l d0,L_Bso(a5)
|
||
moveq #2,d0
|
||
bsr GetChiffre
|
||
move.l d0,MaxBob(a5)
|
||
|
||
* 1ere phase terminee
|
||
moveq #6,d0
|
||
bsr GoPos
|
||
|
||
* Debut de compilation
|
||
Compile
|
||
* Initialisations
|
||
bsr IniSource
|
||
bsr IniNOb
|
||
moveq #9,d0
|
||
bsr GoPos
|
||
|
||
bsr IniObjet
|
||
moveq #12,d0
|
||
bsr GoPos
|
||
|
||
moveq #18,d0
|
||
bsr CompPos
|
||
bsr InitLibs
|
||
bsr FActualise
|
||
|
||
* Compilation
|
||
bsr Passe1
|
||
bsr Passe2
|
||
|
||
* Sauvegarde
|
||
bsr SObject
|
||
bsr SIcon
|
||
move.w #143,d0
|
||
bsr GoPos
|
||
bsr FActualise
|
||
|
||
* Nettoyage
|
||
CFin
|
||
moveq #29,d0
|
||
bsr MesPrint
|
||
move.l MaxMem(a5),d0
|
||
bsr Digit
|
||
moveq #31,d0
|
||
bsr MesPrint
|
||
*
|
||
moveq #30,d0
|
||
bsr MesPrint
|
||
move.l L_Objet(a5),d0
|
||
bsr Digit
|
||
moveq #31,d0
|
||
bsr MesPrint
|
||
*
|
||
moveq #32,d0
|
||
bsr MesPrint
|
||
|
||
IFNE CDebug
|
||
bsr Print_Buffers
|
||
ENDC
|
||
|
||
moveq #0,d0
|
||
move.l L_Objet(a5),d1
|
||
moveq #0,d2
|
||
move.w NbInstr(a5),d2
|
||
bra CFini
|
||
|
||
******* Re-initialisation Datazone
|
||
ResetDZ
|
||
movem.l a0/d0,-(sp)
|
||
move.l a5,a0
|
||
move.w #LDZ-1,d0
|
||
Rdz clr.b (a0)+
|
||
dbra d0,Rdz
|
||
movem.l (sp)+,a0/d0
|
||
rts
|
||
|
||
******* Exploration d'une ligne de commande...
|
||
|
||
CommandLine:
|
||
|
||
; Saute le d<>but
|
||
.Cli0 move.b (a0)+,d0
|
||
beq .CliX
|
||
cmp.b #" ",d0
|
||
beq.s .Cli0
|
||
subq.l #1,a0
|
||
; Nom du programme SOURCE?
|
||
cmp.b #"-",(a0)
|
||
beq.s .CliO
|
||
lea Nom_Source(a5),a1
|
||
move.l a1,d2
|
||
bsr .CliNom
|
||
; Options
|
||
.CliO move.b (a0)+,d0
|
||
beq .CliX
|
||
cmp.b #" ",d0
|
||
beq.s .CliO
|
||
cmp.b #"-",d0
|
||
bne .CliE
|
||
move.b (a0)+,d0
|
||
beq .CliE
|
||
bsr D0Maj
|
||
cmp.b #"D",d0
|
||
beq .ClioD
|
||
cmp.b #"O",d0
|
||
beq .ClioO
|
||
cmp.b #"C",d0
|
||
beq .ClioC
|
||
cmp.b #"F",d0
|
||
beq .ClioF
|
||
cmp.b #"E",d0
|
||
beq .ClioE
|
||
cmp.b #"S",d0
|
||
beq .ClioS
|
||
cmp.b #"T",d0
|
||
beq .ClioT
|
||
cmp.b #"W",d0
|
||
beq .ClioW
|
||
cmp.b #"Q",d0
|
||
beq .ClioQ
|
||
cmp.b #"L",d0
|
||
beq .ClioL
|
||
cmp.b #"Z",d0
|
||
beq .ClioZ
|
||
** Erreur dans la commandline
|
||
.CliE moveq #-1,d0
|
||
rts
|
||
** OK!
|
||
.CliX moveq #0,d0
|
||
rts
|
||
** OPTION -D<source><sbjet>
|
||
.ClioD bsr .Cli01
|
||
move.w d0,Flag_Source(a5)
|
||
bsr .Cli01
|
||
move.w d0,Flag_Objet(a5)
|
||
bra .CliO
|
||
** OPTION -Errors
|
||
.ClioE bsr .Cli01
|
||
move.w d0,Flag_Errors(a5)
|
||
bra .CliO
|
||
** OPTION -L
|
||
.ClioL move.w #1,Flag_Long(a5)
|
||
bra .CliO
|
||
** OPTION -Screen
|
||
.ClioS bsr .Cli01
|
||
move.w d0,Flag_Default(a5)
|
||
bra .CliO
|
||
** OPTION -Object
|
||
.ClioO lea Nom_Objet(a5),a1
|
||
bsr .CliNom
|
||
bra .CliO
|
||
** OPTION -Configuration
|
||
.ClioC lea Nom_Liste(a5),a1
|
||
bsr .CliNom
|
||
bra .CliO
|
||
** OPTION -FromDEVICE:
|
||
.ClioF lea Nom_From(a5),a1
|
||
bsr .CliNom
|
||
bra .CliO
|
||
** OPTION Type : 0=WB / 1=CLI / 2=Backstart / 3=AMOS
|
||
.ClioT bsr .CliDigit
|
||
move.w d0,Flag_Type(a5)
|
||
bra .CliO
|
||
** OPTION Wb01 : 0= AMOS / 1= WB
|
||
.ClioW bsr .Cli01
|
||
move.w d0,Flag_WB(a5)
|
||
bra .CliO
|
||
** OPTION Quiet
|
||
.ClioQ or.w #1,Flag_Quiet(a5)
|
||
bra .CliO
|
||
** OPTION Z
|
||
.ClioZ bsr .CliDigit
|
||
move.w d0,d1
|
||
mulu #10,d1
|
||
bsr .CliDigit
|
||
add.b d0,d1
|
||
move.w d1,Flag_Flash(a5)
|
||
bra .CliO
|
||
** Routines
|
||
.CliNom move.b #" ",d1
|
||
move.b (a0),d0
|
||
beq.s .Clin1
|
||
cmp.b #'"',d0
|
||
beq.s .ClinB
|
||
cmp.b #"'",d0
|
||
bne.s .Clin0
|
||
.ClinB move.b d0,d1
|
||
addq.l #1,a0
|
||
.Clin0 move.b (a0),d0
|
||
beq.s .Clin1
|
||
addq.l #1,a0
|
||
cmp.b d0,d1
|
||
beq.s .Clin1
|
||
move.b d0,(a1)+
|
||
bra.s .Clin0
|
||
.Clin1 clr.b (a1)
|
||
rts
|
||
.Cli01 move.b (a0)+,d1
|
||
beq .CliE
|
||
clr.w d0
|
||
cmp.b #"0",d1
|
||
beq.s .Cli01x
|
||
cmp.b #"1",d1
|
||
bne .CliE
|
||
subq.w #1,d0
|
||
.Cli01x rts
|
||
.CliDigit
|
||
moveq #0,d0
|
||
move.b (a0)+,d0
|
||
beq .CliE
|
||
sub.b #"0",d0
|
||
bcs .CliE
|
||
rts
|
||
D0Maj cmp.b #"a",d0
|
||
bcs.s D0mx
|
||
cmp.b #"z",d0
|
||
bhi.s D0mx
|
||
sub.b #$20,d0
|
||
D0mx rts
|
||
******* Fabrique le nom du programme OBJET, si NOM.AMOS!
|
||
IniNOb tst.b Nom_Objet(a5)
|
||
bne.s NObX
|
||
lea Nom_Source(a5),a1
|
||
move.l a1,d2
|
||
.Nob tst.b (a1)+
|
||
bne.s .Nob
|
||
subq.l #1,a1
|
||
lea SOMA(pc),a2
|
||
.Cli2 cmp.l d2,a1
|
||
bls.s NObx
|
||
move.b (a2)+,d1
|
||
beq.s .Cli3
|
||
move.b -(a1),d0
|
||
bsr D0Maj
|
||
cmp.b d0,d1
|
||
beq.s .Cli2
|
||
bne.s NObx
|
||
.Cli3 exg d2,a1
|
||
lea Nom_Objet(a5),a2
|
||
.Cli4 move.b (a1)+,(a2)+
|
||
cmp.l d2,a1
|
||
bcs.s .Cli4
|
||
; Si type=4, nom= nom_C.AMOS
|
||
cmp.w #3,Flag_Type(a5)
|
||
bne.s .Cli6
|
||
lea _C.AMOS(pc),a1
|
||
.Cli5 move.b (a1)+,(a2)+
|
||
bne.s .Cli5
|
||
.Cli6 clr.b (a2)
|
||
NObX rts
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; SORTIE compilation
|
||
;---------------------------------------------------------------------
|
||
|
||
******* Actualisation position compilateur
|
||
Actualise
|
||
tst.w Flag_AMOS(a5)
|
||
bpl.s .End
|
||
move.l AMOS_Dz(a5),a0
|
||
tst.b T_Actualise(a0)
|
||
bne.s DoVbl
|
||
.End rts
|
||
* Un VBL!
|
||
DoVbl movem.l a1-a6/d1-d7,-(sp)
|
||
lea AMOS_Save(pc),a0
|
||
movem.l (a0),a3-a6
|
||
* Actualise
|
||
SyCall Synchro
|
||
* Break
|
||
move.w T_Actualise(a5),d7
|
||
clr.w T_Actualise(a5)
|
||
bclr #BitControl,d7
|
||
beq.s .cont
|
||
movem.l (sp)+,a1-a6/d1-d7
|
||
bra ErrAbort
|
||
* Affiche le bob?
|
||
.cont bclr #BitBobs,d7
|
||
beq.s .skip
|
||
SyCall ActBob
|
||
SyCall AffBob
|
||
.skip movem.l (sp)+,a1-a6/d1-d7
|
||
rts
|
||
|
||
******* Set compiler position...
|
||
GoPos bsr CompPos
|
||
bra FActualise
|
||
CompPos tst.w Flag_AMOS(a5)
|
||
bmi.s .Yes
|
||
rts
|
||
.Yes movem.l d0-d7/a1-a6,-(sp)
|
||
move.l AMOS_Dz(a5),a5
|
||
moveq #-1,d1
|
||
moveq #0,d2
|
||
moveq #0,d3
|
||
SyCall AMALReg
|
||
movem.l (sp)+,d0-d7/a1-a6
|
||
move.w d0,(a0)
|
||
move.w d0,Pour_Pos(a5)
|
||
rts
|
||
|
||
******* Fait progresser la fleche -> fin
|
||
FActualise
|
||
tst.w Flag_AMOS(a5)
|
||
bmi.s .Loop
|
||
rts
|
||
.Loop bsr Actualise
|
||
movem.l d1-d7/a1-a2/a5,-(sp)
|
||
move.l AMOS_Dz(a5),a5
|
||
moveq #-1,d1
|
||
moveq #0,d2
|
||
moveq #1,d3
|
||
SyCall AMALReg
|
||
movem.l (sp)+,d1-d7/a1-a2/a5
|
||
move.w (a0),d0
|
||
cmp.w Pour_Pos(a5),d0
|
||
bcs.s .loop
|
||
rts
|
||
|
||
******* Set pourcentage
|
||
* D0= largeur alouee
|
||
* D1= nombre de pas
|
||
SetPour divu d0,d1
|
||
tst.w d1
|
||
bne.s .skip
|
||
moveq #1,d1
|
||
.skip move.w d1,Pour_Base(a5)
|
||
move.w d1,Pour_Cpt(a5)
|
||
add.w Pour_Pos(a5),d0
|
||
bra CompPos
|
||
******* Un pas d'affichage...
|
||
AffPour tst.w Flag_AMOS(a5)
|
||
bpl.s .Skip
|
||
subq.w #1,Pour_Cpt(a5)
|
||
bne.s .Skip
|
||
move.w Pour_Base(a5),Pour_Cpt(a5)
|
||
bsr DoVBL
|
||
.Skip rts
|
||
|
||
******* Print un chiffre!
|
||
Digit movem.l d1-d7/a0-a2,-(sp)
|
||
move.l B_Work(a5),a0
|
||
bsr LongDec
|
||
clr.b (a0)
|
||
move.l B_Work(a5),a0
|
||
bsr StrPrint
|
||
movem.l (sp)+,d1-d7/a0-a2
|
||
rts
|
||
|
||
******* Syntax error!
|
||
Synt
|
||
moveq #7,d0
|
||
NoQuiet
|
||
move.w Flag_Quiet(a5),-(sp)
|
||
bmi.s .skip
|
||
clr.w Flag_Quiet(a5)
|
||
bsr MesPrint
|
||
bsr FindL
|
||
bsr Digit
|
||
bsr Return
|
||
.skip
|
||
move.w (sp)+,Flag_Quiet(a5)
|
||
moveq #12,d0
|
||
bra SyntOut
|
||
******* Compilation aborted!
|
||
ErrAbort
|
||
moveq #9,d0
|
||
bra.s ErrPrint
|
||
******* Erreur: program not tested!
|
||
ErrNotest
|
||
moveq #12,d0
|
||
bra.s ErrPrint
|
||
******* Erreur: not an AMOS program!
|
||
ErrNoAMOS
|
||
moveq #13,d0
|
||
bra.s ErrPrint
|
||
******* Erreur: label not defined
|
||
ErrLabel
|
||
bclr #31,d0
|
||
move.l d0,a6
|
||
moveq #14,d0
|
||
bra.s NoQuiet
|
||
******* Erreur program already compiled
|
||
ErrAlready
|
||
moveq #15,d0
|
||
bra.s ErrPrint
|
||
******* Erreur: use the -l option
|
||
ErrDoLong
|
||
moveq #16,d0
|
||
bra.s ErrPrint
|
||
******* Erreur: nothing to compile!
|
||
ErrNothing
|
||
moveq #10,d0
|
||
bra.s ErrPrint
|
||
******* Erreur: bad list!
|
||
ErrListe
|
||
moveq #4,d0
|
||
bra.s ErrPrint
|
||
******* Erreur: cannot uncode procedure
|
||
NoCode
|
||
moveq #8,d0
|
||
bra.s ErrPrint
|
||
******* Erreur: extension not loaded.
|
||
ErrExt
|
||
moveq #3,d0
|
||
bra.s ErrPrint
|
||
******* Syntax error dans la ligne de commande
|
||
ErrCommand
|
||
moveq #1,d0
|
||
bra.s ErrPrint
|
||
******* Syntax error dans la ligne de commande LISTE
|
||
ErrComList
|
||
moveq #2,d0
|
||
bra.s ErrPrint
|
||
******* Syntax error dans la configuration
|
||
ErrConfig
|
||
moveq #11,d0
|
||
bra.s ErrPrint
|
||
******* Erreur disque
|
||
DError
|
||
moveq #5,d0
|
||
bra.s ErrPrint
|
||
******* Erreur icons
|
||
NoIcons
|
||
moveq #4,d0
|
||
bra.s ErrPrint
|
||
******* Out of mem
|
||
Oofmem
|
||
moveq #6,d0
|
||
|
||
******* Sortie avec erreur!
|
||
ErrPrint
|
||
move.w d0,-(sp)
|
||
move.w Flag_Quiet(a5),-(sp)
|
||
bmi.s .skip
|
||
clr.w Flag_Quiet(a5)
|
||
bsr MesPrint
|
||
.skip
|
||
move.w (sp)+,Flag_Quiet(a5)
|
||
move.w (sp)+,d0
|
||
SyntOut
|
||
add.w #Mes_BaseNoms,d0
|
||
bsr GetNom
|
||
lea Nom_Source(a5),a1
|
||
.loop move.b (a0)+,(a1)+
|
||
beq.s .loop1
|
||
cmp.b #32,-1(a1)
|
||
bcc.s .loop
|
||
subq.l #1,a1
|
||
bra.s .loop
|
||
.loop1 tst.l B_Noms(a5)
|
||
beq.s .loop2
|
||
moveq #32,d0
|
||
bsr MesPrint
|
||
.loop2
|
||
; Efface l'objet, si cree
|
||
bsr KObject
|
||
; Retour de parametres
|
||
moveq #10,d0
|
||
moveq #0,d1
|
||
moveq #0,d2
|
||
|
||
******* Abort general!
|
||
CFini movem.l d0/d1/d2,-(sp)
|
||
bsr EraBuffer
|
||
bsr FinIcons
|
||
bsr FinDisc
|
||
movem.l (sp)+,d0/d1/d2
|
||
CFini2 lea Nom_Source(a5),a0
|
||
move.l C_Pile(a5),sp
|
||
rts
|
||
|
||
IFNE CDebug
|
||
******* Imprime l'etat des buffers
|
||
Print_Buffers:
|
||
lea Mes_Buffers(pc),a4
|
||
lea B_Work(a5),a3
|
||
.Loop0 move.l a4,a0
|
||
bsr StrPrint
|
||
move.l (a3),d0
|
||
beq.s .Loop3
|
||
move.l d0,a2
|
||
move.l -4(a2),d6
|
||
subq.l #4,d6
|
||
lea 0(a2,d6.l),a1
|
||
.Loop1 tst.l -(a1)
|
||
bne.s .Loop2
|
||
cmp.l a2,a1
|
||
bhi.s .Loop1
|
||
.Loop2 addq.l #4,a1
|
||
move.l a1,d7
|
||
sub.l a2,d7
|
||
move.l d7,d0
|
||
bsr Digit
|
||
lea Mes_Bufs2(pc),a0
|
||
bsr StrPrint
|
||
move.l d6,d0
|
||
bsr Digit
|
||
lea Mes_Bufs3(pc),a0
|
||
bsr StrPrint
|
||
move.l d6,d0
|
||
sub.l d7,d0
|
||
bsr Digit
|
||
bsr Return
|
||
.Loop3 tst.b (a4)+
|
||
bne.s .Loop3
|
||
addq.l #4,a3
|
||
tst.b (a4)
|
||
bne.s .Loop0
|
||
bsr Return
|
||
rts
|
||
ENDC
|
||
|
||
******* Trouve le num<EFBFBD>ro de la ligne pointee par A6->D0
|
||
FindL move.l a6,d2
|
||
move.l #20,a6
|
||
moveq #0,d1
|
||
.Loop0 addq.l #1,d1
|
||
bsr GetWord
|
||
lsr.w #8,d0
|
||
beq.s .Loop2
|
||
lsl.w #1,d0
|
||
lea -2(a6,d0.w),a6
|
||
cmp.l d2,a6
|
||
bcs.s .Loop0
|
||
* Trouve!
|
||
.Loop1 move.l d1,d0
|
||
rts
|
||
* Pas trouve!
|
||
.Loop2 moveq #-1,d0
|
||
rts
|
||
|
||
******* Imprime le message D0
|
||
MesPrint
|
||
tst.w Flag_Quiet(a5)
|
||
bne.s PrintXXX
|
||
* Imprime le message...
|
||
movem.l a0-a6/d0-d7,-(sp)
|
||
add.w #Mes_BaseNoms,d0
|
||
bsr GetNom
|
||
tst.w Flag_Amos(a5)
|
||
bne.s AMOSPrint
|
||
move.l d0,d3
|
||
move.l a0,d2
|
||
move.l C_DosBase(a5),a6
|
||
jsr -60(a6)
|
||
move.l d0,d1
|
||
jsr DosWrite(a6)
|
||
movem.l (sp)+,a0-a6/d0-d7
|
||
PrintXXX
|
||
rts
|
||
AMOSPrint
|
||
move.l B_DiskIn(a5),a1
|
||
.Loop1 move.b (a0)+,(a1)+
|
||
beq.s .Loop2
|
||
cmp.b #10,-1(a1)
|
||
bne.s .Loop1
|
||
move.b #13,-1(a1)
|
||
move.b #10,(a1)+
|
||
bra.s .Loop1
|
||
.Loop2 clr.b (a1)
|
||
move.l B_DiskIn(a5),a1
|
||
move.l AMOS_Dz(a5),a5
|
||
WiCall Print
|
||
movem.l (sp)+,a0-a6/d0-d7
|
||
rts
|
||
|
||
******* Imprime la chaine A0 sur l'output standart
|
||
StrPrint
|
||
tst.w Flag_Quiet(a5)
|
||
bne.s Clip1
|
||
movem.l a0-a6/d0-d7,-(sp)
|
||
tst.w Flag_AMOS(a5)
|
||
bne.s AMOSPrint
|
||
move.l a0,-(sp)
|
||
move.l C_DosBase(a5),a6
|
||
jsr -60(a6)
|
||
move.l d0,d1
|
||
move.l (sp)+,d2
|
||
move.l d2,a0
|
||
Clip0 tst.b (a0)+
|
||
bne.s Clip0
|
||
move.l a0,d3
|
||
sub.l d2,d3
|
||
subq.l #1,d3
|
||
jsr DosWrite(a6)
|
||
movem.l (sp)+,a0-a6/d0-d7
|
||
Clip1 rts
|
||
|
||
******* Return
|
||
Return
|
||
lea Mes_return(pc),a0
|
||
bra.s StrPrint
|
||
|
||
|
||
; CONVERSION HEXA--->DECIMAL SUR QUATRE OCTETS
|
||
longdec1: move #-1,d3 ;proportionnel
|
||
moveq #1,d4 ;avec signe
|
||
bra.s longent
|
||
longdec: clr.l d4 ;proportionnel, sans espace si positif!
|
||
move.l #-1,d3
|
||
; conversion proprement dite: LONG-->ENTIER
|
||
longent: move.l a1,-(sp)
|
||
tst.l d0 ;test du signe!
|
||
bpl.s hexy
|
||
move.b #"-",(a0)+
|
||
neg.l d0
|
||
bra.s hexz
|
||
hexy: tst d4
|
||
beq.s hexz
|
||
move.b #32,(a0)+
|
||
hexz: tst.l d3
|
||
bmi.s hexv
|
||
neg.l d3
|
||
add.l #10,d3
|
||
hexv: move.l #9,d4
|
||
lea multdix(pc),a1
|
||
hxx0: move.l (a1)+,d1 ;table des multiples de dix
|
||
move.b #$ff,d2
|
||
hxx1: addq.b #1,d2
|
||
sub.l d1,d0
|
||
bcc.s hxx1
|
||
add.l d1,d0
|
||
tst.l d3
|
||
beq.s hxx4
|
||
bpl.s hxx3
|
||
btst #31,d4
|
||
bne.s hxx4
|
||
tst d4
|
||
beq.s hxx4
|
||
tst.b d2
|
||
beq.s hxx5
|
||
bset #31,d4
|
||
bra.s hxx4
|
||
hxx3: subq.l #1,d3
|
||
bra.s hxx5
|
||
hxx4: add #48,d2
|
||
move.b d2,(a0)+
|
||
hxx5: dbra d4,hxx0
|
||
move.l (sp)+,a1
|
||
rts
|
||
* TABLE DES MULTIPLES DE DIX
|
||
multdix: dc.l 1000000000,100000000,10000000,1000000
|
||
dc.l 100000,10000,1000,100,10,1,0
|
||
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; PASSE 1-> Fabrication du code
|
||
;---------------------------------------------------------------------
|
||
|
||
Passe1
|
||
* Reservation des buffers
|
||
moveq #8,d0
|
||
bsr GetChiffre
|
||
bsr ResBuffer
|
||
move.l a0,B_FlagVarL(a5)
|
||
moveq #7,d0
|
||
bsr GetChiffre
|
||
bsr ResBuffer
|
||
move.l a0,B_FlagVarG(a5)
|
||
move.l a0,A_FlagVarL(a5)
|
||
moveq #5,d0
|
||
bsr GetChiffre
|
||
bsr ResBuffer
|
||
move.l a0,B_Chaines(a5)
|
||
move.l a0,A_Chaines(a5)
|
||
moveq #8,d0
|
||
bsr GetChiffre
|
||
bsr ResBuffer
|
||
move.l a0,B_Lea(a5)
|
||
move.l a0,A_Lea(a5)
|
||
move.l #$7FFFFFFF,(a0)
|
||
moveq #6,d0
|
||
bsr GetChiffre
|
||
bsr ResBuffer
|
||
move.l a0,B_Labels(a5)
|
||
moveq #7,d0
|
||
bsr GetChiffre
|
||
bsr ResBuffer
|
||
move.l a0,B_Bcles(a5)
|
||
move.l a0,A_Bcles(a5)
|
||
move.l #128,d0
|
||
bsr ResBuffer
|
||
move.l a0,B_Stock(a5)
|
||
move.l a0,A_Stock(a5)
|
||
* Longueur du buffer par default
|
||
move.l #8,L_Buf(a5)
|
||
* Relocation
|
||
bsr InitRel
|
||
* Adresses SORTIE / ENTREE
|
||
sub.l a4,a4
|
||
lea 20,a6
|
||
|
||
******* Message
|
||
moveq #22,d0
|
||
bsr MesPrint
|
||
moveq #36,d0
|
||
moveq #0,d1
|
||
move.w NL_Source(a5),d1
|
||
bsr SetPour
|
||
|
||
******* Va fabriquer le header
|
||
bsr Header
|
||
|
||
;-----> Debut du hunk programme
|
||
moveq #NH_Prog,d1
|
||
moveq #Hunk_Public,d2
|
||
bsr DebHunk
|
||
|
||
;-----> Debut de la relocation
|
||
move.l a4,DebRel(a5)
|
||
move.l a4,OldRel(a5)
|
||
|
||
;-----> NO DATAS
|
||
bsr CreNoData
|
||
|
||
;-----> Appel des routines d'init
|
||
bsr CreeInits
|
||
|
||
;-----> Code bug
|
||
IFNE CDebug
|
||
lea BugCode(pc),a0
|
||
bsr OutCode
|
||
ENDC
|
||
|
||
;--------------------------------------> Programme principal
|
||
bsr PrgIn
|
||
moveq #L_PrgIn,d0
|
||
bsr CreFonc
|
||
ChrGet bsr AffPour
|
||
cmp.l A_Banks(a5),a6
|
||
beq.s ChrEnd
|
||
bsr GetWord
|
||
beq.s ChrEnd
|
||
; Regarde la table des branchements en avant
|
||
Chr0 move.l B_Lea(a5),a0
|
||
cmp.l (a0),a6
|
||
bcs.s Chr1
|
||
bsr PokeAd
|
||
bra.s Chr0
|
||
; Appelle l'instruction
|
||
Chr1 bsr GetWord
|
||
beq.s ChrGet
|
||
addq.w #1,NbInstr(a5)
|
||
lea Tk(pc),a0
|
||
move.w 0(a0,d0.w),d1
|
||
bne.s Chr2
|
||
bsr IStandard
|
||
bra.s Chr0
|
||
Chr2 jsr 0(a0,d1.w) * Une autre instruction
|
||
bra.s Chr0
|
||
* Appelle la routine de fin
|
||
ChrEnd move.w #L_End,d0
|
||
bsr CreJmp
|
||
move.l AdAdress(a5),AdAdAdress(a5)
|
||
move.w Flag_Labels(a5),OFlag_Labels(a5)
|
||
move.w Flag_Procs(a5),OFlag_Procs(a5)
|
||
move.l B_FlagVarL(a5),A_FlagVarL(a5)
|
||
move.l A_Datas(a5),A_ADatas(a5)
|
||
move.w M_ForNext(a5),MM_ForNext(a5)
|
||
* Quelque chose <EFBFBD> compiler???
|
||
tst.w NbInstr(a5)
|
||
beq ErrNothing
|
||
|
||
;--------------------------------------> Procedures
|
||
move.l B_Labels(a5),A_Proc(a5)
|
||
PChr1 move.l A_Proc(a5),a0
|
||
moveq #-6,d0
|
||
PChr2 lea 6(a0,d0.w),a0
|
||
move.w (a0),d0
|
||
beq PChrX
|
||
move.l 2(a0),d1
|
||
bclr #30,d1
|
||
beq.s PChr2
|
||
move.l d1,a6
|
||
move.l a4,2(a0)
|
||
* Adresse de la fin de la procedure
|
||
bsr GetLong
|
||
subq.l #4,a6
|
||
lea 10-2(a6,d0.l),a0
|
||
move.l a0,F_Proc(a5)
|
||
* Stockage position actuelle
|
||
move.w CMvqd0(pc),d0
|
||
bsr OutWord
|
||
moveq #L_DProc1,d0
|
||
bsr CreFonc
|
||
bsr PrgIn
|
||
moveq #L_PrgIn,d0
|
||
bsr CreFonc
|
||
* Adresse des variables
|
||
lea 10(a6),a6
|
||
bsr Sovar
|
||
moveq #0,d7
|
||
moveq #0,d6
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
cmp.w #TkBra1-Tk,d0
|
||
bne.s DPro6
|
||
addq.l #2,a6
|
||
DPro0 addq.l #2,a6
|
||
lsl.l #1,d6
|
||
addq.l #1,d7
|
||
movem.l d6/d7,-(sp)
|
||
bsr VarAdr
|
||
movem.l (sp)+,d6/d7
|
||
cmp.b #1,d2
|
||
bne.s DPro1
|
||
bset #0,d6
|
||
DPro1 tst.w d1
|
||
bmi.s DPro4
|
||
beq.s DPro2
|
||
; Variable GLOBALE
|
||
move.w CLea2a0a0(pc),d0
|
||
bra.s DPro3
|
||
; Variable LOCALE
|
||
DPro2 move.w CLea2a6a0(pc),d0
|
||
DPro3 bsr OutWord
|
||
move.w d3,d0
|
||
bsr OutWord
|
||
bra.s DPro5
|
||
; Variable TABLEAU
|
||
DPro4 moveq #L_GetTablo,d0
|
||
bsr CreFonc
|
||
DPro5 move.w Cmva0ma3(pc),d0
|
||
bsr OutWord
|
||
; Encore un param?
|
||
bsr GetWord
|
||
cmp.w #TkBra2-Tk,d0
|
||
bne.s DPro0
|
||
* Entete de la procedure
|
||
move.w Cmvqd4(pc),d0 * N params
|
||
move.b d7,d0
|
||
bsr OutWord
|
||
move.w Cmvid5(pc),d0 * Flags des params
|
||
bsr OutWord
|
||
move.l d6,d0
|
||
bsr OutLong
|
||
moveq #L_DProc2,d0 * Routine d'egalisation
|
||
bsr CreFonc
|
||
* Pas de melange des labels!
|
||
DPro6 addq.w #1,N_Proc(a5)
|
||
|
||
* CHRGET!
|
||
addq.l #2,a6
|
||
ProChr bsr AffPour
|
||
bsr GetWord
|
||
beq Synt
|
||
;
|
||
ProChr0 move.l B_Lea(a5),a0
|
||
cmp.l (a0),a6
|
||
bcs.s ProChr1
|
||
bsr PokeAd
|
||
bra.s ProChr0
|
||
;
|
||
ProChr1 bsr GetWord
|
||
beq.s ProChr
|
||
addq.w #1,NbInstr(a5)
|
||
lea Tk(pc),a0
|
||
move.w 0(a0,d0.w),d1
|
||
bne.s ProChr2
|
||
bsr IStandard
|
||
bra.s ProChr0
|
||
ProChr2 jsr 0(a0,d1.w) * Une autre instruction
|
||
bra.s ProChr0
|
||
; Fin procedure
|
||
CEProc addq.l #4,sp
|
||
bsr GetWord * Un parametre???
|
||
subq.w #2,a6
|
||
cmp.w #TkBra1-Tk,d0
|
||
bne.s CEpr2
|
||
bsr FnEval
|
||
addq.l #2,a6
|
||
move.l CdEProE(pc),d0
|
||
and.b #$0F,d2
|
||
subq.b #1,d2
|
||
bmi.s CEpr1
|
||
move.l CdEProF(pc),d0
|
||
tst.b d2
|
||
beq.s CEpr1
|
||
move.l CdEProS(pc),d0
|
||
CEpr1 bsr OutLong
|
||
CEpr2 moveq #L_FProc,d0
|
||
bsr CreJmp
|
||
move.l A_FlagVarL(a5),a0
|
||
bsr PrgOut
|
||
bra PChr1
|
||
PChrX
|
||
|
||
;-----> Variables globales
|
||
move.l AdAdAdress(a5),AdAdress(a5)
|
||
move.l B_FlagVarG(a5),a0
|
||
move.l A_ADatas(a5),A_Datas(a5)
|
||
move.w OFlag_Labels(a5),Flag_Labels(a5)
|
||
move.w OFlag_Procs(a5),Flag_Procs(a5)
|
||
move.w MM_ForNext(a5),M_ForNext(a5)
|
||
clr.w N_Proc(a5)
|
||
bsr PrgOut
|
||
|
||
;------------------------------------> COPIE LES ROUTINES LIBRAIRIE
|
||
moveq #23,d0
|
||
bsr MesPrint
|
||
bsr FActualise
|
||
moveq #36,d0
|
||
move.l #36*12,d1
|
||
bsr SetPour
|
||
|
||
move.l B_Bcles(a5),a6
|
||
CLib0 lea BufLibs(a5),a2
|
||
moveq #-1,d6
|
||
CLib1 addq.l #1,d6
|
||
move.l (a2)+,d0
|
||
bne.s CLib2
|
||
cmp.w #M_Libs-1,d6
|
||
bne.s CLib1
|
||
tst.l d6
|
||
bmi.s CLib0
|
||
moveq #0,d0
|
||
bsr OutRel
|
||
bsr OutRel
|
||
bra CLibFin
|
||
|
||
; Une librairie chargee
|
||
CLib2 move.l d0,a1
|
||
tst.w (a1)
|
||
bne.s CLib3
|
||
; Pas appel<65>e: met un RTS!
|
||
move.l a4,4(a1)
|
||
move.w CRts(pc),d0
|
||
bsr OutWord
|
||
bra.s CLib1
|
||
; Appell<6C>e
|
||
CLib3 lea 4-10(a1),a1
|
||
moveq #-10,d5
|
||
CLib4 add.l #10,d5
|
||
lea 10(a1),a1
|
||
move.l (a1),d0
|
||
beq.s CLib4
|
||
bmi.s CLib1
|
||
subq.l #1,d0
|
||
bne.s CLib4
|
||
movem.l a1/a2,-(sp)
|
||
bsr GetRout
|
||
movem.l (sp)+,a1/a2
|
||
bset #31,d6
|
||
bra.s CLib4
|
||
|
||
******* Routine recursive de copie d'une routine
|
||
* D6= # librairie
|
||
* D5= # routine
|
||
GetRout movem.l d5/d6,-(sp)
|
||
|
||
* Actions particulieres sur librairie principale...
|
||
tst.w d6
|
||
bne.s PaPrin
|
||
; Copie les routines FLOAT?
|
||
cmp.w #L_FlRout*10,d5
|
||
bne.s .PaFl
|
||
btst #0,Flag_Math(a5)
|
||
bne.s .PaFl
|
||
move.w #L_FoFloat*10,d5
|
||
.PaFl
|
||
; Copie des RUN et ERROR (.AMOS)
|
||
cmp.w #3,Flag_Type(a5)
|
||
bne.s PaPrin
|
||
cmp.w #L_Error*10,d5
|
||
bne.s PaPrin
|
||
move.w #L_ErrorAMOS*10,d5
|
||
PaPrin
|
||
; Pointe la librairie
|
||
move.w d6,d0
|
||
lsl.w #2,d0
|
||
lea BufLibs(a5),a2
|
||
move.l 0(a2,d0.w),d0
|
||
beq DError
|
||
move.l d0,a2
|
||
move.w 2(a2),d1
|
||
move.w d1,MaxCLibs(a5)
|
||
addq.l #4,a2
|
||
; Est-ce la routine d'erreur d'une extension???
|
||
tst.w d6 ; Librairie extension?
|
||
beq.s .skip
|
||
mulu #10,d1
|
||
move.w d5,d0
|
||
add.w #20,d0
|
||
cmp.w d0,d1 ; Avant derniere routine?
|
||
bne.s .skip
|
||
tst.w Flag_Errors(a5) ; Erreurs a charger?
|
||
bne.s .skip
|
||
add.w #10,d5 ; PAS D'ERREURS!!!
|
||
.skip
|
||
; Continue
|
||
move.w d5,d0
|
||
add.w d0,a2
|
||
move.l (a2),d0
|
||
cmp.l #1,d0
|
||
bhi GRouX
|
||
; Charge la routine dans le buffer
|
||
moveq #24,d0
|
||
bsr MesPrint
|
||
bsr AffPour
|
||
move.l a4,(a2) ; Poke l'adresse de la routine
|
||
move.l a4,-(sp)
|
||
move.w #-1,(a6)+
|
||
** Init recopie routine
|
||
move.l 4(a2),P_Clib(a5)
|
||
moveq #0,d0
|
||
move.w 8(a2),d0
|
||
lsl.l #1,d0
|
||
move.l d0,T_Clib(a5)
|
||
moveq #0,d4 * P_CLIB-> D4
|
||
** Boucle de recopie, D3 octets
|
||
GRou0 bsr LdClib
|
||
GRou1 move.b (a2),d0
|
||
cmp.b #C_Code1,d0
|
||
beq GRou10
|
||
GRou2 move.w (a2)+,d0
|
||
bsr OutWord
|
||
addq.l #2,d4
|
||
GRouR cmp.l d3,d4
|
||
bcs.s GRou1
|
||
cmp.l T_Clib(a5),d4
|
||
bcs.s GRou0
|
||
; Branche les routines demandees
|
||
GRou4 move.w -(a6),d0
|
||
bmi.s GRou6
|
||
move.w d0,d5
|
||
bsr GetRout
|
||
move.l a4,d2
|
||
move.l -(a6),a4
|
||
move.l d0,d1
|
||
sub.l a4,d0
|
||
cmp.l #-32760,d0
|
||
ble.s GRou5
|
||
cmp.l #+32760,d0
|
||
bge.s GRou5
|
||
; Saut relatif OK!
|
||
bsr OutWord
|
||
move.l d2,a4
|
||
bra.s GRou4
|
||
; Saut en ARRIERE trop long: BRA-> JMP
|
||
GRou5 move.l d2,d0 * 1-> BRA sur le JMP
|
||
sub.l a4,d0
|
||
cmp.l #-32760,d0
|
||
ble DError
|
||
cmp.l #+32760,d0
|
||
bge DError
|
||
bsr OutWord
|
||
move.l d2,a4 * 2-> JMP sur la routine
|
||
move.w CJmp(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
move.l d1,d0
|
||
bsr OutLong
|
||
bra.s GRou4
|
||
; Ramene l'adresse de la routine
|
||
GRou6 move.l (sp)+,d0
|
||
;-----> Fin copie routine
|
||
GRouX movem.l (sp)+,d5/d6
|
||
rts
|
||
|
||
******* Charge la routine dans le buffer
|
||
LdClib move.w d6,d1
|
||
addq.w #F_Libs,d1
|
||
move.l d4,d2
|
||
add.l P_Clib(a5),d2
|
||
moveq #-1,d3
|
||
bsr FSeek
|
||
move.w d6,d1
|
||
addq.w #F_Libs,d1
|
||
move.l B_DiskIn(a5),d2
|
||
move.l T_Clib(a5),d3
|
||
sub.l d4,d3
|
||
clr.l -(sp)
|
||
cmp.l #L_DiscIn,d3
|
||
bcs.s Ldcl1
|
||
move.l #L_DiscIn,d3
|
||
move.l #8,(sp)
|
||
Ldcl1 bsr FRead
|
||
beq DError
|
||
move.l d2,a2
|
||
add.l d4,d3
|
||
sub.l (sp)+,d3
|
||
rts
|
||
|
||
;-----> Instruction speciale
|
||
GRou10 move.w (a2),d0
|
||
move.b d0,d2
|
||
and.b #$0F,d0
|
||
cmp.b #C_Code2,d0
|
||
bne GRou2
|
||
and.w #$00F0,d2
|
||
lsr.w #1,d2
|
||
lea GRout(pc),a1
|
||
jmp 0(a1,d2.w)
|
||
;-----> Table des sauts
|
||
GRout bra.s GRouJ ; 0 - RJmp
|
||
jmp $FFFFF0
|
||
bra.s GRouJ ; 1 - RJsr
|
||
jsr $FFFFF0
|
||
bra GRouB ; 2 - RBra
|
||
bra GRout
|
||
bra GRouB ; 3 - RBsr
|
||
bsr GRout
|
||
bra GRouB ; 4 - RBeq
|
||
beq GRout
|
||
bra GRouB ; 5 - RBne
|
||
bne GRout
|
||
bra GRouB ; 6 - RBcs
|
||
bcs GRout
|
||
bra GRouB ; 7 - RBcc
|
||
bcc GRout
|
||
bra GRouB ; 8 - RBlt
|
||
blt GRout
|
||
bra GRouB ; 9 - RBge
|
||
bge GRout
|
||
bra GRouB ; 10- RBls
|
||
bls GRout
|
||
bra GRouB ; 11- RBhi
|
||
bhi GRout
|
||
bra GRouB ; 12- RBle
|
||
ble GRout
|
||
bra GRouB ; 13- RBpl
|
||
bpl GRout
|
||
bra GRouB ; 14- RBmi
|
||
bmi GRout
|
||
bra GRouD ; 15- RData
|
||
;-----> RJMP / RJSR
|
||
GRouJ cmp.b #C_CodeJ,2(a2)
|
||
bne GRou2
|
||
moveq #0,d1
|
||
move.b 3(a2),d1
|
||
cmp.b #27,d1
|
||
bcc GRou2
|
||
move.w 4(a2),d0
|
||
; Poke l'appel
|
||
move.w 2(a1,d2.w),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
move.w 4(a2),d0
|
||
mulu #10,d0
|
||
swap d0
|
||
lsl.w #2,d1
|
||
move.w d1,d0
|
||
swap d0
|
||
bset #BitLib,d0
|
||
bsr OutLong
|
||
addq.l #6,a2
|
||
addq.l #6,d4
|
||
; Marque la librairie
|
||
lea BufLibs(a5),a0
|
||
move.l 0(a0,d1.w),d2
|
||
beq DError
|
||
move.l d2,a0
|
||
tst.l 4(a0,d0.w)
|
||
bne GRou1
|
||
move.l #1,4(a0,d0.w)
|
||
bra GRouR
|
||
;-----> RBRA etc..
|
||
GRouB move.w 2(a2),d1
|
||
cmp.w MaxClibs(a5),d1
|
||
bcc GRou2
|
||
mulu #10,d1
|
||
move.w 4(a1,d2.w),d0
|
||
bsr OutWord
|
||
move.l a4,(a6)+
|
||
move.w d1,(a6)+
|
||
addq.l #4,a2
|
||
addq.l #4,d4
|
||
addq.l #2,a4
|
||
bra GRouR
|
||
;-----> Instruction RDATA
|
||
GRouD cmp.w #C_CodeD,2(a2)
|
||
bne GRou2
|
||
addq.l #4,a2
|
||
addq.l #4,d4
|
||
move.w CNop(pc),d0
|
||
bsr OutWord
|
||
bsr OutWord
|
||
GRouD1 cmp.l d3,d4
|
||
bcc GRouD2
|
||
move.w (a2)+,d0
|
||
bsr OutWord
|
||
addq.l #2,d4
|
||
bra.s GRouD1
|
||
GRouD2 cmp.l T_Clib(a5),d4
|
||
bcc GRou4
|
||
bsr LdClib
|
||
bra.s GRouD1
|
||
CLibFin
|
||
; lea Protect(pc),a0
|
||
; bsr OutCode
|
||
bsr Return
|
||
|
||
;-----> Copie les constantes alphanumeriques
|
||
move.l B_Chaines(a5),a1
|
||
bra.s c_ch5
|
||
c_ch1 move.l d0,a6
|
||
move.l a4,(a1)
|
||
bsr GetWord
|
||
move.w d0,d1
|
||
bsr OutWord
|
||
addq.w #1,d1
|
||
lsr.w #1,d1
|
||
subq.w #1,d1
|
||
bmi.s c_ch4
|
||
c_ch3 bsr GetWord
|
||
bsr OutWord
|
||
dbra d1,c_ch3
|
||
c_ch4 addq.l #4,a1
|
||
c_ch5 move.l (a1),d0
|
||
bne.s c_ch1
|
||
; Securite un mot long
|
||
moveq #0,d0
|
||
bsr OutLong
|
||
|
||
;-----> Fin du hunk programme
|
||
moveq #NH_Prog,d1
|
||
bsr FinHunk
|
||
bsr FActualise
|
||
|
||
******* HUNK 2: Table de relocation
|
||
moveq #NH_Reloc,d1
|
||
moveq #Hunk_Public,d2 * En PUBLIC Mem
|
||
bsr DebHunk
|
||
move.l a4,AA_Reloc(a5)
|
||
; Copie
|
||
move.l B_Reloc(a5),a1
|
||
CRel1 move.b (a1)+,d0
|
||
bsr OutByte
|
||
tst.b d0
|
||
bne.s CRel1
|
||
sub.l B_Reloc(a5),a1
|
||
move.w a1,L_Reloc(a5)
|
||
; Fin du hunk reloc
|
||
moveq #NH_Reloc,d1
|
||
bsr FinHunk
|
||
moveq #93,d0
|
||
bsr GoPos
|
||
|
||
******* Copie du systeme?
|
||
cmp.w #3,Flag_Type(a5)
|
||
bne CSystem
|
||
* AMOS: Copie la fin de la procedure
|
||
moveq #0,d0
|
||
bsr OutWord
|
||
move.l a4,AA_EProc(a5)
|
||
move.w #$0301,d0
|
||
bsr OutWord
|
||
move.w #TkEndP-Tk,d0
|
||
bsr OutWord
|
||
clr.w d0
|
||
bsr OutWord
|
||
moveq #108,d0
|
||
bsr GoPos
|
||
bra NoSystem
|
||
|
||
******* HUNK 2: W.Lib
|
||
CSystem moveq #25,d0
|
||
bsr MesPrint
|
||
moveq #NH_W.Lib,d1
|
||
moveq #Hunk_Public,d2 * PUBLIC mem
|
||
moveq #$20,d3 * Pas d'entete
|
||
moveq #4,d4
|
||
moveq #4-1,d0
|
||
bsr GetNom
|
||
move.l a0,a1
|
||
bsr CopyHunk
|
||
moveq #96,d0
|
||
bsr GoPos
|
||
|
||
******* HUNK 4: .Env
|
||
moveq #NH_Env,d1
|
||
moveq #Hunk_Public,d2
|
||
bsr DebHunk
|
||
moveq #0,d0 * Mot vide!!!
|
||
bsr OutLong
|
||
moveq #1,d0
|
||
bsr GetNom
|
||
move.l a0,a1
|
||
moveq #F_Courant,d1
|
||
bsr FOpenOld
|
||
beq DError
|
||
moveq #F_Courant,d1
|
||
bsr FLof
|
||
move.l d0,d6
|
||
moveq #F_Courant,d1
|
||
move.l B_Work(a5),d2 * Longueur DATAZONE
|
||
moveq #$24,d3
|
||
bsr FRead
|
||
beq DError
|
||
move.l d2,a0
|
||
move.l $20(a0),d0
|
||
bsr OutLong
|
||
sub.l #$24,d6
|
||
move.l d6,d0 * Longueur donnees
|
||
bsr OutLong
|
||
moveq #F_Courant,d1
|
||
move.l d6,d3 * Charge
|
||
bsr OutFRead
|
||
moveq #F_Courant,d1
|
||
bsr FClose
|
||
moveq #NH_Env,d1
|
||
bsr FinHunk
|
||
moveq #99,d0
|
||
bsr GoPos
|
||
|
||
******* HUNK 5: Mouse.Abk
|
||
moveq #NH_Mouse,d1
|
||
move.l #Hunk_Chip,d2 * CHIP mem
|
||
bsr DebHunk
|
||
move.l a4,-(sp)
|
||
lea 16*2(a4),a4 * Place pour la palette
|
||
moveq #9-1,d0
|
||
bsr GetNom
|
||
move.l a0,a1
|
||
moveq #F_Courant,d1
|
||
bsr FOpenOld
|
||
beq DError
|
||
moveq #F_Courant,d1
|
||
moveq #6,d2
|
||
moveq #-1,d3
|
||
bsr FSeek
|
||
moveq #F_Courant,d1
|
||
bsr FLof
|
||
moveq #F_Courant,d1
|
||
move.l d0,d3 * Tout sauf la palette
|
||
sub.l #32*2+6,d3
|
||
bsr OutFRead
|
||
moveq #-1,d0 * Marque la fin
|
||
bsr OutWord
|
||
moveq #F_Courant,d1
|
||
moveq #16*2,d2 * Saute 1ere moitie palette
|
||
moveq #0,d3
|
||
bsr FSeek
|
||
move.l (sp)+,d0
|
||
move.l a4,-(sp)
|
||
move.l d0,a4
|
||
moveq #16*2,d3
|
||
moveq #F_Courant,d1
|
||
bsr OutFRead
|
||
moveq #F_Courant,d1
|
||
bsr FClose
|
||
move.l (sp)+,a4
|
||
moveq #NH_Mouse,d1
|
||
bsr FinHunk
|
||
moveq #102,d0
|
||
bsr GoPos
|
||
|
||
******* HUNK 6: Default.Font
|
||
moveq #NH_Font,d1 * Numero 5
|
||
moveq #Hunk_Public,d2 * PUBLIC mem
|
||
moveq #0,d3
|
||
moveq #0,d4
|
||
moveq #10-1,d0
|
||
bsr GetNom
|
||
move.l a0,a1
|
||
bsr CopyHunk
|
||
moveq #105,d0
|
||
bsr GoPos
|
||
|
||
******* HUNK 7: Default.Key
|
||
moveq #NH_Key,d1 * Numero 6
|
||
moveq #Hunk_Public,d2 * PUBLIC mem
|
||
moveq #0,d3
|
||
moveq #0,d4
|
||
moveq #11-1,d0
|
||
bsr GetNom
|
||
move.l a0,a1
|
||
bsr CopyHunk
|
||
moveq #108,d0
|
||
bsr GoPos
|
||
NoSystem:
|
||
|
||
******* HUNK 8 - 25 : Banques
|
||
moveq #26,d0
|
||
bsr MesPrint
|
||
moveq #16,d0
|
||
moveq #16,d1
|
||
bsr SetPour
|
||
move.l A_Banks(a5),a6
|
||
cmp.w #3,Flag_Type(a5)
|
||
beq BankAMOS
|
||
|
||
* Copie les banques NORMALE
|
||
addq.l #4,a6
|
||
bsr GetWord
|
||
move.w d0,d6
|
||
beq P1Finie
|
||
moveq #N_HunkSys,d5
|
||
BkLoop bsr AffPour
|
||
bsr GetLong
|
||
cmp.l #"AmSp",d0
|
||
beq.s BklS
|
||
cmp.l #"AmIc",d0
|
||
beq.s BklI
|
||
* Banque normale
|
||
bsr GetWord * Numero banque
|
||
move.w d0,-(sp)
|
||
bsr GetWord
|
||
moveq #Hunk_Public,d2
|
||
move.w d0,-(sp)
|
||
bne.s Bkl1
|
||
move.l #Hunk_Chip,d2
|
||
Bkl1 move.l d5,d1
|
||
bsr DebHunk
|
||
move.l a4,d7
|
||
bsr GetLong
|
||
move.l d0,d3 0-> Longueur reelle
|
||
and.l #$FFFFFFF,d3 avec flags: 31-> DATA, 30-> CHIP
|
||
tst.w (sp)+
|
||
bne.s Bkl1a
|
||
bset #30,d0
|
||
Bkl1a bsr OutLong
|
||
move.w (sp)+,d0 4-> Numero
|
||
bsr OutWord
|
||
clr.w d0 6-> 0
|
||
bsr OutWord
|
||
bsr CopySrce
|
||
bra BklEnd
|
||
* Banque de sprites/Icones
|
||
BklS pea Nom_Spr(pc)
|
||
move.w #-1,-(sp)
|
||
bra.s Bkl2
|
||
BklI pea Nom_Ico(pc)
|
||
move.w #-2,-(sp)
|
||
Bkl2 move.l d5,d1
|
||
move.l #Hunk_Chip,d2
|
||
bsr DebHunk
|
||
move.l a4,d7
|
||
bsr GetWord 0-> Nombre sprite/icones
|
||
ext.l d0
|
||
bsr OutLong
|
||
move.w d0,d4
|
||
move.w (sp)+,d0 4-> -1 sprites / -2 icones
|
||
bsr OutWord
|
||
clr.w d0 6-> 0
|
||
bsr OutWord
|
||
* Place pour la table d'entete
|
||
move.l (sp)+,a1
|
||
move.l (a1)+,d0
|
||
bsr OutLong
|
||
move.l (a1)+,d0
|
||
bsr OutLong
|
||
move.l a4,a3
|
||
move.w d4,d0
|
||
lsl.w #3,d0
|
||
lea 2+64+6(a4,d0.w),a4
|
||
move.w d4,d2
|
||
subq.w #1,d2
|
||
bmi.s Bkl4
|
||
move.l B_Lea(a5),a2
|
||
* Copie les bobs
|
||
Bkl3 move.l a4,d7
|
||
bsr GetWord TX
|
||
move.w d0,d3
|
||
bsr OutWord
|
||
bsr GetWord TY
|
||
mulu d0,d3
|
||
bsr OutWord
|
||
bsr GetWord NPlan
|
||
mulu d0,d3
|
||
bsr OutWord
|
||
bsr GetLong
|
||
bsr OutLong
|
||
lsl.l #1,d3
|
||
beq.s Bkl3a
|
||
bsr CopySrce
|
||
bra.s Bkl3c
|
||
Bkl3a lea -10(a4),a4
|
||
Bkl3c bsr Mult8
|
||
move.l a4,d0
|
||
sub.l d7,d0
|
||
move.l d0,(a2)+
|
||
dbra d2,Bkl3
|
||
* Refait l'entete
|
||
Bkl4 exg a4,a3
|
||
move.w d4,d0
|
||
bsr OutWord
|
||
subq.w #1,d4
|
||
bmi.s Bkl4b
|
||
move.l B_Lea(a5),a2
|
||
Bkl4a move.l (a2)+,d0
|
||
bsr OutLong
|
||
moveq #0,d0
|
||
bsr OutLong
|
||
dbra d4,Bkl4a
|
||
Bkl4b moveq #64,d3
|
||
bsr CopySrce
|
||
exg a4,a3
|
||
move.l a4,d7
|
||
* Fin de la banque
|
||
BklEnd bsr Mult8
|
||
move.l d5,d1
|
||
bsr FinHunk
|
||
addq.w #1,d5
|
||
subq.w #1,d6
|
||
bne BkLoop
|
||
bra P1Finie
|
||
|
||
******* Copie les banques / AMOS
|
||
BankAMOS
|
||
move.l L_Source(a5),d3 FACILE!
|
||
sub.l a6,d3
|
||
bsr CopySrce
|
||
|
||
******* Fin de la passe 1
|
||
P1Finie bsr FActualise
|
||
move.l a4,L_Objet(a5)
|
||
rts
|
||
|
||
* ROUTINE: rend multiple de 8
|
||
Mult8 move.l a4,d0
|
||
sub.l d7,d0
|
||
and.l #7,d0
|
||
beq.s Mu8.2
|
||
moveq #8,d1
|
||
sub.l d0,d1
|
||
beq.s Mu8.2
|
||
lsr.w #1,d1
|
||
Mu8.1 moveq #0,d0
|
||
bsr OutWord
|
||
subq.w #1,d1
|
||
bne.s Mu8.1
|
||
Mu8.2 rts
|
||
|
||
* ROUTINE: Entree programme/procedure
|
||
PrgIn move.l a4,AdAdress(a5)
|
||
move.w Cleaa0(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
addq.l #4,a4
|
||
move.w Cleaa1(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
addq.l #4,a4
|
||
move.w Cleaa2(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
addq.l #4,a4
|
||
move.l A_FlagVarL(a5),a0
|
||
clr.w (a0)
|
||
clr.l A_Datas(a5)
|
||
clr.w Flag_Labels(a5)
|
||
clr.w Flag_Procs(a5)
|
||
clr.w M_ForNext(a5)
|
||
rts
|
||
* ROUTINE -> Sortie programme/procedures
|
||
* A0-> Buffer a copier
|
||
PrgOut move.l a4,-(sp)
|
||
move.l a0,-(sp)
|
||
tst.w Flag_Labels(a5)
|
||
beq.s PaClb
|
||
move.w N_Proc(a5),d7
|
||
move.l B_Labels(a5),a2
|
||
move.w (a2),d2
|
||
beq.s ClbX
|
||
Clb1 cmp.w -2+6(a2,d2.w),d7
|
||
beq.s Clb0
|
||
tst.w Flag_Procs(a5) * Pour le moment PROC a$, interdit!
|
||
beq.s Clb3
|
||
tst.w -2+6(a2,d2.w)
|
||
bpl.s Clb3
|
||
Clb0 move.w d2,d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
move.l 2(a2),d0
|
||
bsr OutLong
|
||
lea 6(a2),a1
|
||
move.w d2,d1
|
||
lsr.w #1,d1
|
||
subq.w #1,d1
|
||
Clb2 move.w (a1)+,d0
|
||
bsr OutWord
|
||
dbra d1,Clb2
|
||
Clb3 lea 6(a2,d2.w),a2
|
||
move.w (a2),d2
|
||
bne.s Clb1
|
||
ClbX moveq #0,d0
|
||
bsr OutWord
|
||
clr.w Flag_Labels(a5)
|
||
* Copie la table des flags variable
|
||
PaClb move.l (sp),a1
|
||
move.l a4,(sp)
|
||
move.w M_ForNext(a5),d0
|
||
bsr OutWord
|
||
move.w (a1)+,d0
|
||
moveq #0,d1
|
||
move.w d0,d1
|
||
neg.w d0
|
||
bsr OutWord
|
||
divu #6,d1
|
||
subq.w #1,d1
|
||
bmi.s CFg2
|
||
CFg1 move.b (a1)+,d0
|
||
bsr OutByte
|
||
dbra d1,CFg1
|
||
CFg2 moveq #-1,d0
|
||
bsr OutByte
|
||
bsr A4Pair
|
||
* Change les adresses au debut de la procedure
|
||
move.l a4,-(sp)
|
||
move.l AdAdress(a5),a4
|
||
addq.l #2,a4
|
||
move.l 8(sp),d0
|
||
bsr OutLong
|
||
addq.l #2,a4
|
||
move.l 4(sp),d0
|
||
bsr OutLong
|
||
addq.l #2,a4
|
||
move.l A_Datas(a5),d0
|
||
bne.s CFg3
|
||
move.l A_EDatas(a5),d0
|
||
CFg3 bsr OutLong
|
||
move.l (sp)+,a4
|
||
addq.l #8,sp
|
||
rts
|
||
|
||
*********************************************************************
|
||
* Fabrique le header...
|
||
Header cmp.w #3,Flag_Type(a5)
|
||
beq HeaderAMOS
|
||
|
||
******* Programme NORMAL
|
||
* Fabrique le HUNK entete
|
||
move.l #$3F3,d0 * AmigaDos
|
||
bsr OutLong
|
||
moveq #0,d0 * Pas de nom
|
||
bsr OutLong
|
||
move.w N_Banks(a5),d1
|
||
ext.l d1
|
||
addq.w #N_HunkSys,d1
|
||
move.l d1,d0
|
||
bsr OutLong
|
||
moveq #0,d0 * Debut=0
|
||
bsr OutLong
|
||
move.l d1,d0
|
||
subq.l #1,d0
|
||
bsr OutLong
|
||
lsl.w #2,d1 * Saute les tailles
|
||
lea 0(a4,d1.w),a4
|
||
* Fabrique le hunk header
|
||
moveq #NH_Header,d1
|
||
moveq #Hunk_Public,d2
|
||
bsr DebHunk
|
||
moveq #5-1,d0
|
||
cmp.w #2,Flag_Type(a5)
|
||
bne.s .Skip
|
||
moveq #6-1,d0
|
||
.Skip bsr GetNom
|
||
move.l a0,a1
|
||
moveq #F_Courant,d1
|
||
bsr FOpenOld
|
||
beq DError
|
||
moveq #F_Courant,d1
|
||
move.l B_Work(a5),d2
|
||
moveq #$20+2+4,d3
|
||
bsr FRead
|
||
beq DError
|
||
move.l d2,a1
|
||
; Envoie le BRA
|
||
move.w $22(a1),d0
|
||
bsr Outword
|
||
; Envoie les FLAGS
|
||
moveq #0,d0
|
||
move.w Flag_Flash(a5),d0 Couleur a flasher
|
||
lsl.w #8,d0
|
||
tst.w Flag_WB(a5) Workbench???
|
||
bne.s .Skip1
|
||
bset #0,d0
|
||
.Skip1 bsr OutWord
|
||
; Envoie le reste
|
||
moveq #0,d3
|
||
move.w $20(a1),d3
|
||
sub.w #4,d3
|
||
moveq #F_Courant,d1
|
||
bsr OutFRead
|
||
moveq #F_Courant,d1
|
||
bsr FClose
|
||
moveq #NH_Header,d1
|
||
bsr FinHunk
|
||
rts
|
||
|
||
******* Programme AMOS
|
||
HeaderAMOS
|
||
moveq #7-1,d0
|
||
bsr GetNom
|
||
move.l a0,a1
|
||
bsr LoadInBuffer
|
||
move.l d5,a1
|
||
* Recopie le header AMOS Basic
|
||
moveq #3,d1
|
||
.loop0 move.l (a1)+,d0
|
||
bsr OutLong
|
||
dbra d1,.loop0
|
||
move.l a4,AA_Long(a5)
|
||
* Recopie en cherchant le SET BUFFER
|
||
.loop1 move.w (a1)+,d0
|
||
bsr OutWord
|
||
cmp.w #TkSBu-Tk,d0
|
||
bne.s .loop1
|
||
move.l a4,AA_SBuf(a5)
|
||
* Cherche maintenant le PROCEDURE
|
||
.loop2 move.w (a1)+,d0
|
||
bsr OutWord
|
||
cmp.w #TkProc-Tk,d0
|
||
bne.s .loop2
|
||
move.l a4,AA_Proc(a5)
|
||
move.l (a1)+,d0
|
||
bsr OutLong
|
||
move.l (a1)+,d0
|
||
or.w #%0101000000000000,d0
|
||
bsr OutLong
|
||
* Cherche maintenant le CMPCALL
|
||
.loop3 move.w (a1)+,d0
|
||
bsr OutWord
|
||
cmp.w #TkExt-Tk,d0
|
||
bne.s .loop3
|
||
cmp.w #Ext_Nb*256,(a1)
|
||
bne.s .loop3
|
||
cmp.w #Ext_TkCmp,2(a1)
|
||
bne.s .loop3
|
||
move.l (a1)+,d0
|
||
bsr OutLong
|
||
* Sort des zeros
|
||
move.l a4,A_InitMath(a5)
|
||
moveq #0,d0
|
||
bsr OutWord
|
||
bsr OutLong
|
||
bsr OutLong
|
||
* Efface le programme
|
||
bsr EraInBuffer
|
||
* Debut du programme proprement dit!
|
||
rts
|
||
|
||
***********************************************************************
|
||
* Fabrique les routines d'init
|
||
CreeInits
|
||
cmp.w #3,Flag_Type(a5)
|
||
beq InitAMOS
|
||
|
||
******* Programme normal
|
||
move.l a4,A_InitMath(a5)
|
||
move.w CMvqd0(pc),d0 * Flags
|
||
bsr OutWord
|
||
move.w CMvid1(pc),d0 * Taille du buffer
|
||
bsr OutWord
|
||
moveq #0,d0
|
||
bsr OutLong
|
||
moveq #L_Init1,d0
|
||
bsr CreFonc
|
||
lea BufLibs+4(a5),a1
|
||
moveq #1,d1
|
||
IInit0 move.l (a1)+,d0
|
||
beq.s IInit1
|
||
move.l d0,a0
|
||
move.w (a0),-(sp)
|
||
movem.l d1/a0/a1,-(sp)
|
||
moveq #0,d0
|
||
bsr CreFoncExt
|
||
movem.l (sp)+,d1/a0/a1
|
||
move.w (sp)+,(a0)
|
||
IInit1 addq.w #1,d1
|
||
cmp.w #26,d1
|
||
bls.s IInit0
|
||
moveq #L_Init2,d0
|
||
bsr CreFonc
|
||
rts
|
||
|
||
******* Programme .AMOS
|
||
InitAMOS
|
||
move.w #L_AMOSIn,d0
|
||
bsr CreFonc
|
||
rts
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; PASSE 2-> Relocation
|
||
;---------------------------------------------------------------------
|
||
Passe2
|
||
cmp.w #3,Flag_Type(a5)
|
||
beq P2AMOS
|
||
|
||
******* Copie toutes les longueurs de HUNKS dans l'entete
|
||
sub.l a4,a4
|
||
lea 20(a4),a4
|
||
moveq #N_HunkSys-1,d4
|
||
add.w N_Banks(a5),d4
|
||
lea T_Hunks(a5),a1
|
||
CLhu1 move.l 4(a1),d0
|
||
bsr OutLong
|
||
addq.l #8,a1
|
||
dbra d4,CLhu1
|
||
|
||
******* Longueur du hunk programme
|
||
moveq #NH_Header,d1
|
||
bsr MarkHunk
|
||
moveq #NH_Prog,d1
|
||
bsr MarkHunk
|
||
|
||
******* Flags ouverture...
|
||
move.l A_InitMath(a5),a4
|
||
move.w CMvqd0(pc),d0
|
||
move.b Flag_Math(a5),d0
|
||
tst.w Flag_Default(a5)
|
||
beq.s .Label
|
||
bset #2,d0
|
||
.Label bsr OutWord
|
||
addq.l #2,a4
|
||
move.l L_Buf(a5),d0
|
||
mulu #1024,d0
|
||
add.l #512,d0
|
||
bsr OutLong
|
||
bra P2Reloc
|
||
|
||
******* Programme .AMOS, fabrique l'entete
|
||
P2AMOS move.l AA_Long(a5),a4 * Longueur du source
|
||
move.l AA_EProc(a5),d0
|
||
add.l #6-4,d0
|
||
sub.l a4,d0
|
||
bsr OutLong
|
||
move.l AA_SBuf(a5),a4 * Instruction Set Buffer
|
||
addq.l #2,a4
|
||
move.l L_Buf(a5),d0
|
||
* add.l #512,d0
|
||
bsr OutLong
|
||
move.l AA_Proc(a5),a4
|
||
move.l AA_EProc(a5),d0
|
||
sub.l a4,d0
|
||
subq.l #4,d0
|
||
bsr OutLong
|
||
move.l A_InitMath(a5),a4 * Flags maths
|
||
moveq #0,d0
|
||
move.b Flag_Math(a5),d0
|
||
bsr OutWord
|
||
move.l AA_Reloc(a5),d0 * Pointeur sur relocation
|
||
sub.l a4,d0
|
||
bsr OutLong
|
||
|
||
******* Reloge le programme
|
||
P2Reloc
|
||
moveq #10,d0
|
||
moveq #0,d1
|
||
move.w L_Reloc(a5),d1
|
||
bsr SetPour
|
||
|
||
move.l DebRel(a5),d7 ;Base de toute les adresses
|
||
move.l d7,a4 ;Debut de l'exploration
|
||
move.l B_Reloc(a5),a6 ;Table de relocation
|
||
P2a: bsr AffPour
|
||
move.b (a6)+,d0
|
||
beq.s P2Fin
|
||
cmp.b #1,d0
|
||
bne.s P2b
|
||
lea 508(a4),a4
|
||
bra.s P2a
|
||
; Affyche la position
|
||
P2b: and.w #$FF,d0
|
||
lsl.w #1,d0
|
||
add.w d0,a4
|
||
bsr GtoLong
|
||
subq.l #4,a4
|
||
bclr #BitLib,d0
|
||
bne.s P2L
|
||
bclr #BitChaine,d0
|
||
bne.s P2S
|
||
bclr #BitLabel,d0
|
||
bne.s P2G
|
||
; Simple JSR
|
||
sub.l d7,d0
|
||
bsr OutLong
|
||
subq.l #4,a4
|
||
bra.s P2a
|
||
; Trouve l'adresse d'une routine librairie
|
||
P2L move.w d0,d1
|
||
swap d0
|
||
lea BufLibs(a5),a0
|
||
move.l 0(a0,d0.w),a0
|
||
move.l 4(a0,d1.w),d0 ;Adresse absolue de la routine
|
||
sub.l d7,d0
|
||
bsr OutLong
|
||
subq.l #4,a4
|
||
bra.s P2a
|
||
; Trouve l'adresse d'une chaine
|
||
P2S move.l d0,a1
|
||
move.l (a1),d0
|
||
sub.l d7,d0
|
||
bsr OutLong
|
||
subq.l #4,a4
|
||
bra.s P2a
|
||
; Adresse d'un label
|
||
P2G move.l d0,a1
|
||
move.l 2(a1),d0
|
||
bmi ErrLabel
|
||
sub.l d7,d0
|
||
bsr OutLong
|
||
subq.l #4,a4
|
||
bra.s P2a
|
||
P2Fin
|
||
|
||
******* Marque les longueurs des HUNKS
|
||
cmp.w #3,Flag_Type(a5)
|
||
beq.s P2Finie
|
||
moveq #NH_Reloc,d2
|
||
move.w N_Banks(a5),d3
|
||
add.w #N_HunkSys-3,d3
|
||
P2hu move.w d2,d1
|
||
bsr MarkHunk
|
||
addq.w #1,d2
|
||
dbra d3,P2Hu
|
||
|
||
******* Fin passe 2
|
||
P2Finie bsr FActualise
|
||
rts
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Gestion des librairies / Relocation
|
||
;---------------------------------------------------------------------
|
||
|
||
******* Charge la LIB LIST et les datas. Fabrique la liste des noms.
|
||
InitListe
|
||
; Trouve le nom des datas
|
||
moveq #2,d3 PAL
|
||
move.l C_GfxBase(a5),a0
|
||
move.w 212(a0),d0
|
||
cmp.w #300,d0
|
||
bcc.s .skip
|
||
moveq #3,d3 NTSC
|
||
.skip tst.w Flag_Errors(a5)
|
||
bne.s .Init0
|
||
moveq #4,d3 NO ERRORS
|
||
.Init0 move.w d3,d7
|
||
bsr ListeNom
|
||
move.l B_DiskIn(a5),a3
|
||
lea 128(a3),a3
|
||
move.l a3,d3
|
||
moveq #-1,d2
|
||
bsr CopyNom
|
||
* Charge les datas
|
||
move.l d3,d1
|
||
move.l C_DosBase(a5),a6
|
||
jsr DosLoadSeg(a6)
|
||
tst.l d0
|
||
beq DError
|
||
move.l d0,d4
|
||
lsl.l #2,d0
|
||
addq.l #8,d0
|
||
move.l d0,a4
|
||
* Estimation de la taille
|
||
moveq #0,d2
|
||
move.w d7,d3
|
||
bsr InitNoms
|
||
* Reserve le buffer, recommence!
|
||
move.l d2,d0
|
||
addq.l #8,d0
|
||
bsr ResBuffer
|
||
move.l a0,a3
|
||
move.l a0,B_Noms(a5)
|
||
moveq #-1,d2
|
||
move.w d7,d3
|
||
bsr InitNoms
|
||
* Reserve le buffer des pointeurs
|
||
move.l d3,d0
|
||
lsl.w #1,d0
|
||
addq.w #8,d0
|
||
bsr ResBuffer
|
||
move.l a0,B_Pointeurs(a5)
|
||
move.l B_Noms(a5),a1
|
||
subq.w #1,d3
|
||
.Init1 move.l a1,d1
|
||
.Init2 tst.b (a1)+
|
||
bne.s .Init2
|
||
sub.l a1,d1
|
||
neg.l d1
|
||
move.w d1,(a0)+
|
||
dbra d3,.Init1
|
||
* Enleve le .Env
|
||
move.l C_DosBase(a5),a6
|
||
move.l d4,d1
|
||
jsr DosULoadSeg(a6)
|
||
* Enleve le buffer et revient.
|
||
bsr EraInBuffer
|
||
rts
|
||
|
||
** Charge le fichier dans un buffer...
|
||
LoadInBuffer
|
||
moveq #F_Courant,d1
|
||
bsr FOpenOld
|
||
beq DError
|
||
moveq #F_Courant,d1
|
||
bsr FLof
|
||
move.l d0,d6
|
||
bsr RamFast
|
||
move.l d0,d5
|
||
beq OOfMem
|
||
move.l d5,InBuf(a5)
|
||
move.l d6,InBufs(a5)
|
||
moveq #F_Courant,d1
|
||
move.l d5,d2
|
||
move.l d6,d3
|
||
bsr FRead
|
||
beq DError
|
||
moveq #F_Courant,d1
|
||
bsr FClose
|
||
rts
|
||
** Enleve le buffer
|
||
EraInBuffer
|
||
move.l InBuf(a5),d0
|
||
beq.s EraIb
|
||
clr.l InBuf(a5)
|
||
move.l d0,a1
|
||
move.l InBufs(a5),d0
|
||
bsr RamFree
|
||
EraIb rts
|
||
|
||
** Trouve les noms des librairies principales
|
||
InitNoms
|
||
* .Env
|
||
bsr ListeNom
|
||
bsr CopyNom
|
||
* Librairies principales
|
||
moveq #5,d3
|
||
.Init1 bsr ListeNom
|
||
bsr CopyNom
|
||
addq.w #1,d3
|
||
cmp.w #11,d3
|
||
bcs.s .Init1
|
||
* Trouve les noms des fichiers par defaut
|
||
bsr ListeNom
|
||
move.w #ANMouse,d0
|
||
bsr GetA1
|
||
bsr EnvOuListe
|
||
moveq #12,d3
|
||
bsr ListeNom
|
||
move.w #ANFonte,d0
|
||
bsr GetA1
|
||
bsr EnvOuListe
|
||
moveq #13,d3
|
||
bsr ListeNom
|
||
move.w #AKyNom,d0
|
||
bsr GetA1
|
||
bsr EnvOuListe
|
||
* Trouve les noms des extensions
|
||
moveq #14,d3
|
||
move.w #AExtNames,d0
|
||
bsr GetA1
|
||
move.l a1,a2
|
||
.Init2 bsr ListeNom
|
||
move.l a2,a1
|
||
bsr EnvOuListe
|
||
.Init3 tst.b (a2)+
|
||
bne.s .Init3
|
||
addq.w #1,d3
|
||
cmp.w #14+26,d3
|
||
bcs.s .Init2
|
||
* Trouve les messages du compilateur
|
||
moveq #Mes_Base,d3
|
||
.Init4 bsr ListeNom
|
||
bne.s .Init5
|
||
bsr Copy
|
||
addq.w #1,d3
|
||
bra.s .Init4
|
||
.Init5 move.w d3,d0
|
||
rts
|
||
** Routine: trouve le nom #D3 dans la liste
|
||
ListeNom
|
||
move.l d5,a0
|
||
bsr.s .Liste
|
||
bne.s .ListeE
|
||
move.w d3,d0
|
||
subq.w #2,d0
|
||
bmi.s .List1
|
||
.List0 bsr.s .Liste
|
||
bne.s .ListeE
|
||
dbra d0,.List0
|
||
.List1 move.l B_DiskIn(a5),a1
|
||
.List2 move.b (a0)+,(a1)
|
||
beq.s .ListeE
|
||
cmp.b #"}",(a1)+
|
||
bne.s .List2
|
||
clr.b -1(a1)
|
||
move.l B_DiskIn(a5),a0
|
||
moveq #0,d0
|
||
rts
|
||
.Liste tst.b (a0)
|
||
beq.s .ListeE
|
||
cmp.b #"{",(a0)+
|
||
bne.s .Liste
|
||
rts
|
||
.ListeE moveq #-1,d0
|
||
rts
|
||
** Routine: adresse string dans les datas
|
||
GetA1 sub.w -2(a4),d0
|
||
move.l a4,a1
|
||
sub.l -4(a4),a1
|
||
add.w 0(a4,d0.w),a1
|
||
rts
|
||
** Routine: copie ou nom dans la liste
|
||
EnvOuListe
|
||
exg a0,a1
|
||
tst.b (a1)
|
||
beq.s CopyNom
|
||
move.l a1,a0
|
||
cmp.w #$2E00,(a0)
|
||
bne.s CopyNom
|
||
clr.b (a0)
|
||
** Routine: copie dans les noms, inclus le NOM_PATH, si defini!
|
||
CopyNom tst.b (a0)
|
||
beq.s Copy
|
||
tst.b Nom_From(a5)
|
||
beq.s Copy
|
||
move.l a0,a1
|
||
.Copy1 tst.b (a1)+
|
||
bne.s .Copy1
|
||
.Copy2 move.b -(a1),d0
|
||
cmp.l a0,a1
|
||
bcs.s .Copy3
|
||
cmp.b #"/",d0
|
||
beq.s .Copy3
|
||
cmp.b #":",d0
|
||
bne.s .Copy2
|
||
.Copy3 lea Nom_From(a5),a0
|
||
bsr Copy
|
||
subq.l #1,a3
|
||
lea 1(a1),a0
|
||
* Routine de copie / comptage
|
||
Copy tst.l d2
|
||
bmi.s List4
|
||
; Compte la taille
|
||
List3 addq.l #1,d2
|
||
tst.b (a0)+
|
||
bne.s List3
|
||
rts
|
||
; Recopie
|
||
List4 move.b (a0)+,(a3)+
|
||
bne.s List4
|
||
rts
|
||
|
||
******* Trouve le nom #D0 dans la liste-> A0
|
||
GetNom tst.l B_Noms(a5)
|
||
beq.s .Nom2
|
||
move.l d1,-(sp)
|
||
move.l B_Pointeurs(a5),a0
|
||
moveq #0,d1
|
||
subq.w #2,d0
|
||
bmi.s .Nom1
|
||
.Nom0 add.w (a0)+,d1
|
||
dbra d0,.Nom0
|
||
.Nom1 moveq #0,d0
|
||
move.w (a0),d0
|
||
subq.w #1,d0
|
||
move.l B_Noms(a5),a0
|
||
lea 0(a0,d1.w),a0
|
||
move.l (sp)+,d1
|
||
tst.b (a0)
|
||
rts
|
||
* Si noms pas charg<EFBFBD>s: messages d'urgence!
|
||
.Nom2 lea Mes_OOfMem(pc),a0
|
||
cmp.w #Mes_BaseNoms+6,d0
|
||
beq.s .Nom3
|
||
lea Mes_DError(pc),a0
|
||
.Nom3 move.l a0,d0
|
||
.Nom4 tst.b (a0)+
|
||
bne.s .Nom4
|
||
sub.l d0,a0
|
||
exg d0,a0
|
||
rts
|
||
******* Trouve le chiffre #D dans la liste -> D0
|
||
GetChiffre
|
||
add.w #Mes_BaseCh,d0
|
||
bsr GetNom
|
||
moveq #0,d0
|
||
moveq #0,d2
|
||
ddh1: move.b (a0)+,d2
|
||
beq.s ddh2
|
||
cmp.b #32,d2
|
||
beq.s ddh1
|
||
sub.b #48,d2
|
||
cmp.b #10,d2
|
||
bcc ErrConfig
|
||
move d0,d1
|
||
mulu #10,d1
|
||
swap d0
|
||
mulu #10,d0
|
||
swap d0
|
||
tst d0
|
||
bne ErrConfig
|
||
add.l d1,d0
|
||
bcs ErrConfig
|
||
add.l d2,d0
|
||
bmi ErrConfig
|
||
addq #1,d3
|
||
bra.s ddh1
|
||
ddh2: rts ;OK: chiffre en d0, et beq
|
||
|
||
******* Initialisation de toutes les librairies
|
||
InitLibs
|
||
moveq #21,d0
|
||
bsr MesPrint
|
||
* Charge AMOS.Lib
|
||
moveq #3-1,d0
|
||
moveq #0,d1
|
||
bsr GetNom
|
||
bsr InitLib
|
||
* Charge les librairies!
|
||
moveq #12-1,d0
|
||
moveq #1,d1
|
||
Ilib5 movem.l d0/d1,-(sp)
|
||
bsr GetNom
|
||
movem.l (sp)+,d0/d1
|
||
beq.s Ilib6
|
||
bsr InitLib
|
||
Ilib6 addq.w #1,d0
|
||
addq.w #1,d1
|
||
cmp.w #27,d1
|
||
bcs.s ILib5
|
||
rts
|
||
******* Initialisation librairie D1, nom A0
|
||
InitLib movem.l a0-a6/d0-d7,-(sp)
|
||
move.l a0,a1
|
||
move.w d1,d0
|
||
lsl.w #2,d0
|
||
lea BufLibs(a5),a2
|
||
lea BufToks(a5),a3
|
||
add.w d0,a2 * A2-> Pointeur librairie
|
||
add.w d0,a3 * A3-> Pointeurs tokens/erreurs
|
||
addq.l #F_Libs,d1
|
||
move.l d1,d6
|
||
bsr FOpenOld
|
||
beq DError
|
||
move.l d6,d1
|
||
move.l B_DiskIn(a5),d2
|
||
moveq #$20+$12,d3
|
||
bsr FRead
|
||
beq DError
|
||
move.l d2,a0
|
||
* Charge le catalogue
|
||
move.l $20(a0),d3 * Longueur du catalogue
|
||
move.l d6,d1
|
||
add.l #$32,d2
|
||
bsr FRead
|
||
beq DError
|
||
move.l d2,a1
|
||
; Reserve le buffer
|
||
lsr.w #1,d3
|
||
move.w d3,d0
|
||
mulu #10,d0
|
||
add.l #16,d0
|
||
bsr ResBuffer
|
||
move.l a0,(a2)
|
||
; Calcule les offsets des routines
|
||
move.l B_DiskIn(a5),a2
|
||
move.w $20+$10(a2),(a0)+ * Compteur / Signal
|
||
move.w d3,(a0)+ * Nombre d'instructions
|
||
moveq #$20+$12,d1
|
||
add.l $20(a2),d1
|
||
add.l $24(a2),d1
|
||
subq.w #1,d3
|
||
ILib1 clr.l (a0)+
|
||
move.l d1,d0
|
||
move.l d0,(a0)+
|
||
moveq #0,d2
|
||
move.w (a1)+,d2
|
||
move.w d2,(a0)+
|
||
lsl.l #1,d2
|
||
add.l d2,d1
|
||
dbra d3,ILib1
|
||
move.l #-1,(a0)+
|
||
* Charge la table des tokens?
|
||
move.l B_DiskIn(a5),a2
|
||
move.l $20+4(a2),d3
|
||
beq.s ILib0
|
||
move.l d3,d0
|
||
bsr ResBuffer
|
||
move.l a0,(a3)
|
||
move.l a0,d2
|
||
move.l d6,d1
|
||
bsr FRead
|
||
beq DError
|
||
* Ca y est!
|
||
ILib0 bsr Actualise
|
||
movem.l (sp)+,a0-a6/d0-d7
|
||
rts
|
||
|
||
******* Relocation
|
||
|
||
;-----> Init relocation
|
||
InitRel moveq #4,d0
|
||
bsr GetChiffre
|
||
bsr ResBuffer
|
||
move.l a0,B_Reloc(a5)
|
||
move.l a0,a3
|
||
rts
|
||
;-----> Cree un appel a la routine #D0
|
||
CreJmp: mulu #10,d0
|
||
move.l d0,a0
|
||
move.w #CiJmp,d0
|
||
bra.s CreF
|
||
;-----> Cree un appel a un sous programme #D0
|
||
CreFonc:mulu #10,d0
|
||
move.l d0,a0
|
||
move.w #CiJsr,d0 ;Dans le source: JSR
|
||
CreF: bsr OutWord
|
||
bsr RelJsr ;Pointe la table de relocation ici
|
||
move.l a0,d0
|
||
bset #BitLib,d0
|
||
bsr OutLong ;#ROUTINE.L
|
||
; Met le flag dans buffer
|
||
move.l BufLibs(a5),a0
|
||
move.w #1,(a0)
|
||
move.l #1,4(a0,d0.w)
|
||
rts
|
||
;-----> Cree un appel a un sous programme #D0, librairie #D1
|
||
; Incrementer flag: D2=0 / D2=1
|
||
CreFoncExt
|
||
mulu #10,d0
|
||
move.l d0,a0
|
||
move.w #CiJsr,d0 ;Dans le source: JSR
|
||
bsr OutWord
|
||
bsr RelJsr ;Pointe la table de relocation ici
|
||
lsl.w #2,d1
|
||
move.w d1,d0
|
||
swap d0
|
||
move.w a0,d0
|
||
bset #BitLib,d0
|
||
bsr OutLong ;#ROUTINE.L
|
||
; Met le flag dans buffer
|
||
lea BufLibs(a5),a0
|
||
move.l 0(a0,d1.w),d1
|
||
beq Synt
|
||
move.l d1,a0
|
||
move.w #1,(a0)
|
||
move.l #1,4(a0,d0.w)
|
||
rts
|
||
|
||
;-----> Marque la table de relocation
|
||
RelJsr: move.l d0,-(sp)
|
||
move.l a4,d0
|
||
sub.l OldRel(a5),d0
|
||
.ReJ1: cmp.w #510,d0
|
||
beq.s .Rej2
|
||
cmp.w #508,d0
|
||
bls.s .ReJ2
|
||
bsr OutRel1
|
||
sub.w #508,d0
|
||
bra.s .ReJ1
|
||
.ReJ2: lsr.w #1,d0
|
||
bsr OutRel
|
||
move.l a4,OldRel(a5)
|
||
move.l (sp)+,d0
|
||
rts
|
||
; Poke un octet dans la table de relocation
|
||
OutRel move.b d0,(a3)+
|
||
rts
|
||
OutRel1 move.b #1,(a3)+
|
||
rts
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Routines compilateur
|
||
;---------------------------------------------------------------------
|
||
|
||
******* Reservation memoire
|
||
ResBuffer
|
||
movem.l d0/d1,-(sp)
|
||
addq.l #4,d0
|
||
move.l d0,d1
|
||
bsr RamFast
|
||
beq Oofmem
|
||
move.l d0,a0
|
||
move.l d1,(a0)+
|
||
add.l d1,MaxMem(a5)
|
||
movem.l (sp)+,d0/d1
|
||
rts
|
||
******* Effacement memoire
|
||
EraBuffer
|
||
lea D_Buffers(a5),a2
|
||
lea F_Buffers(a5),a0
|
||
move.l a0,d2
|
||
EBuf1 move.l (a2)+,d0
|
||
beq.s EBuf2
|
||
move.l d0,a1
|
||
move.l -(a1),d0
|
||
bsr RamFree
|
||
EBuf2 cmp.l d2,a2
|
||
bcs.s EBuf1
|
||
bsr EraInBuffer
|
||
bsr EraObjet
|
||
rts
|
||
|
||
******* Fabrication des hunks
|
||
|
||
;-----> Debut HUNK D1, type D2
|
||
DebHunk
|
||
cmp.w #3,Flag_Type(a5)
|
||
beq.s PasHunk
|
||
movem.l d0-d2/a0-a1,-(sp)
|
||
move.l #$3E9,d0
|
||
or.l d2,d0
|
||
bsr OutLong
|
||
moveq #0,d0
|
||
bsr OutLong
|
||
lsl.w #3,d1
|
||
lea T_Hunks(a5),a1
|
||
move.l a4,0(a1,d1.w)
|
||
move.l d2,4(a1,d1.w)
|
||
movem.l (sp)+,d0-d2/a0-a1
|
||
rts
|
||
;-----> Fin d'un hunk
|
||
FinHunk
|
||
cmp.w #3,Flag_Type(a5)
|
||
bne.s FHu0
|
||
; Rend pair...
|
||
PasHunk move.w a4,d0
|
||
and.w #$0001,d0
|
||
add.w d0,a4
|
||
rts
|
||
; Fait le HUNK
|
||
FHu0 movem.l d0-d2/a0-a1,-(sp)
|
||
lsl.w #3,d1
|
||
lea T_Hunks(a5),a1
|
||
move.l a4,d0
|
||
sub.l 0(a1,d1.w),d0
|
||
and.w #$0003,d0
|
||
beq.s FHu1
|
||
neg.w d0
|
||
addq.w #4,d0
|
||
add.w d0,a4
|
||
FHu1 move.l a4,d0
|
||
sub.l 0(a1,d1.w),d0
|
||
lsr.l #2,d0
|
||
or.l d0,4(a1,d1.w)
|
||
move.l #$3F2,d0
|
||
bsr OutLong
|
||
movem.l (sp)+,d0-d2/a0-a1
|
||
rts
|
||
;-----> Marque la longueur d'un hunk
|
||
MarkHunk
|
||
movem.l d0-d2/a0-a1,-(sp)
|
||
lsl.w #3,d1
|
||
lea T_Hunks(a5),a1
|
||
move.l 0(a1,d1.w),a4
|
||
subq.l #4,a4
|
||
move.l 4(a1,d1.w),d0
|
||
and.l #$00FFFFFF,d0
|
||
bsr OutLong
|
||
movem.l (sp)+,d0-d2/a0-a1
|
||
rts
|
||
;-----> Copie D3 octets, fichier D1 en (a4)
|
||
OutFRead
|
||
movem.l a0-a2/d0-d7,-(sp)
|
||
move.l d1,d5
|
||
move.l B_DiskIn(a5),d2
|
||
move.l d3,d6
|
||
Ofr0 move.l #L_DiscIn,d3
|
||
cmp.l d6,d3
|
||
bcs.s Ofr1
|
||
move.l d6,d3
|
||
Ofr1 move.l d5,d1
|
||
bsr FRead
|
||
beq DError
|
||
sub.l d3,d6
|
||
move.l d2,a2
|
||
move.w d3,d4
|
||
lsr.l #2,d3
|
||
beq.s Ofr3
|
||
sub.w #1,d3
|
||
Ofr2 move.l (a2)+,d0
|
||
bsr OutLong
|
||
dbra d3,Ofr2
|
||
Ofr3 and.w #$0003,d4
|
||
beq.s Ofr5
|
||
subq.w #1,d4
|
||
Ofr4 move.b (a2)+,d0
|
||
bsr OutByte
|
||
dbra d4,Ofr4
|
||
Ofr5 tst.l d6
|
||
bne.s Ofr0
|
||
movem.l (sp)+,a0-a2/d0-d7
|
||
rts
|
||
|
||
;-----> Copie D3 octets source->objet
|
||
CopySrce
|
||
tst.l d3
|
||
beq.s CpyS
|
||
CpyS1 bsr GetWord
|
||
bsr OutWord
|
||
subq.l #2,d3
|
||
bcs.s CpyS
|
||
bne.s CpyS1
|
||
CpyS rts
|
||
|
||
;-----> Copie d'un fichier
|
||
; A0= Nom du fichier
|
||
; D1/D2= definition hunk
|
||
; D3= Nombre d'octets <20> sauter au debut!
|
||
; D4= A sauter a la fin
|
||
CopyHunk
|
||
move.l d1,-(sp) * Cree le hunk
|
||
move.l d3,-(sp)
|
||
move.l d4,-(sp)
|
||
bsr DebHunk
|
||
moveq #F_Courant,d1
|
||
bsr FOpenOld * Ouvre le fichier
|
||
beq DError
|
||
moveq #F_Courant,d1
|
||
bsr FLof * Taille
|
||
sub.l (sp)+,d0
|
||
moveq #-1,d3
|
||
move.l (sp)+,d2
|
||
sub.l d2,d0
|
||
move.l d0,-(sp)
|
||
moveq #F_Courant,d1
|
||
bsr FSeek * Saute le debut
|
||
move.l (sp)+,d3 * Charge
|
||
moveq #F_Courant,d1
|
||
bsr OutFRead
|
||
moveq #F_Courant,d1
|
||
bsr FClose
|
||
move.l (sp)+,d1 * Fin du hunk
|
||
bsr FinHunk
|
||
rts
|
||
|
||
******* Initialisation disque
|
||
IniDisc movem.l a0-a2/d0-d7,-(sp)
|
||
move.l #$1000,L_DiscIn(a5) * Buffer disque
|
||
move.l #128,BordBso(a5) * Bordure source
|
||
move.l #768,BordBob(a5) * Bordure objet
|
||
tst.w Flag_AMOS(a5)
|
||
bne.s InidX
|
||
* Ouvre le DOS
|
||
moveq #0,d0
|
||
move.l $4,a6
|
||
lea Nom_Dos(pc),a1
|
||
jsr OpenLib(a6)
|
||
move.l d0,C_DosBase(a5)
|
||
beq CFini2
|
||
* Ouvre la graphics library
|
||
moveq #0,d0
|
||
lea Nom_Graphic(pc),a1
|
||
jsr OpenLib(a6)
|
||
move.l d0,C_GfxBase(a5)
|
||
beq DError
|
||
* Buffer disque
|
||
InidX move.l #L_DiscIn,d0
|
||
bsr ResBuffer
|
||
move.l a0,B_DiskIn(a5)
|
||
movem.l (sp)+,a0-a2/d0-d7
|
||
rts
|
||
|
||
******* FIN DISQUE
|
||
FinDisc
|
||
* Ferme tous les fichiers
|
||
bsr CloseAll
|
||
* Ferme les librairies, si pas AMOS
|
||
tst.w Flag_AMOS(a5)
|
||
bne.s FDi2
|
||
tst.l C_DosBase(a5)
|
||
beq.s FDi1
|
||
move.l C_DosBase(a5),a1
|
||
move.l $4.w,a6
|
||
jsr CloseLib(a6)
|
||
* Ferme la GFX
|
||
FDi1 move.l C_GfxBase(a5),d0
|
||
beq.s FDi2
|
||
move.l d0,a1
|
||
move.l $4.w,a6
|
||
jsr CloseLib(a6)
|
||
FDi2 rts
|
||
|
||
******* Initialisation des icones
|
||
InitIcons
|
||
tst.w Flag_Type(a5)
|
||
bne.s .Iicx
|
||
tst.l C_IconBase(a5)
|
||
bne.s .Iic1
|
||
moveq #0,d0
|
||
lea Nom_IconLib(pc),a1
|
||
move.l $4,a6
|
||
jsr OpenLib(a6)
|
||
move.l d0,C_IconBase(a5)
|
||
beq NoIcons
|
||
; Charge l'icone par defaut
|
||
.Iic1 move.l C_IconBase(a5),a6
|
||
moveq #8-1,d0
|
||
bsr GetNom
|
||
jsr -78(a6)
|
||
move.l d0,C_Icon(a5)
|
||
beq NoIcons
|
||
move.l d0,a0
|
||
move.l #$80000000,d0
|
||
move.l d0,$3a(a0)
|
||
move.l d0,$3e(a0)
|
||
; Ok!
|
||
.Iicx rts
|
||
|
||
******* Fin des icones
|
||
FinIcons
|
||
move.l C_IconBase(a5),d0
|
||
beq.s .FicX
|
||
move.l d0,a6
|
||
move.l C_Icon(a5),d0
|
||
beq.s .Fic1
|
||
move.l d0,a0
|
||
jsr -90(a6)
|
||
.Fic1
|
||
tst.w IconAMOS(a5)
|
||
bne.s .FicX
|
||
move.l a6,a1
|
||
move.l $4.w,a6
|
||
jsr CloseLib(a6)
|
||
.FicX rts
|
||
|
||
******* Sauve l'icone du programme
|
||
SIcon tst.w Flag_Type(a5)
|
||
bne.s .SicX
|
||
move.l a6,-(sp)
|
||
lea Nom_Objet(a5),a0
|
||
move.l C_Icon(a5),a1
|
||
move.l C_IconBase(a5),a6
|
||
jsr -84(a6)
|
||
move.l (sp)+,a6
|
||
tst.l d0
|
||
beq DError
|
||
.SicX rts
|
||
|
||
*********************************************************************
|
||
* GESTION SOURCE
|
||
|
||
******* Initilialisation SOURCE
|
||
IniSource
|
||
moveq #27,d0
|
||
bsr MesPrint
|
||
lea Nom_Source(a5),a0
|
||
bsr StrPrint
|
||
bsr Return
|
||
tst.w Flag_Source(a5)
|
||
bne.s IniS2
|
||
* Tout en RAM
|
||
lea Nom_Source(a5),a1
|
||
moveq #F_Source,d1
|
||
bsr FOpenOld
|
||
beq DError
|
||
moveq #F_Source,d1
|
||
bsr FLof
|
||
move.l d0,L_Source(a5)
|
||
move.l d0,d3
|
||
addq.l #8,d0
|
||
bsr ResBuffer
|
||
move.l a0,B_Source(a5)
|
||
move.l a0,d2
|
||
moveq #F_Source,d1
|
||
bsr FRead
|
||
moveq #F_Source,d1
|
||
bsr FClose
|
||
bra HVerif
|
||
******* Petit buffer
|
||
IniS2 move.l L_BSo(a5),d0
|
||
move.l d0,MaxBso(a5)
|
||
bsr ResBuffer
|
||
move.l a0,B_Source(a5)
|
||
lea Nom_Source(a5),a1
|
||
moveq #F_Source,d1
|
||
bsr FOpenOld
|
||
beq DError
|
||
moveq #F_Source,d1
|
||
bsr FLof
|
||
move.l d0,L_Source(a5)
|
||
; Charge le debut
|
||
clr.l DebBso(a5)
|
||
move.l d0,TopSou(a5)
|
||
move.l MaxBso(a5),FinBso(a5)
|
||
bsr LoadBso
|
||
* Verifie le HEADER
|
||
HVerif: move.l B_Source(a5),a0
|
||
lea HeadAMOS(pc),a1
|
||
moveq #10-1,d0
|
||
OpSo cmpm.b (a0)+,(a1)+
|
||
bne ErrNoAMOS
|
||
dbra d0,OpSo
|
||
* Si V>1.3, est-ce teste???
|
||
move.b 1(a0),d0
|
||
cmp.b #"v",d0
|
||
beq ErrNoTest
|
||
* Adresse des banques
|
||
move.l B_Source(a5),a0
|
||
move.l 16(a0),d0
|
||
lea 20(a0,d0.l),a0
|
||
sub.l B_Source(a5),a0
|
||
move.l a0,A_Banks(a5)
|
||
lea 4(a0),a6
|
||
bsr GetWord
|
||
move.w d0,N_Banks(a5)
|
||
* Estime le nombre de lignes
|
||
move.l L_Source(a5),d0
|
||
lsr.l #4,d0
|
||
mulu #584,d0
|
||
divu #19000,d0
|
||
lsl.w #4,d0
|
||
move.w d0,NL_Source(a5)
|
||
rts
|
||
|
||
;-----> Prend un MOT du programme (A6)
|
||
GetWord:tst.w Flag_Source(a5)
|
||
bne.s Gsw
|
||
add.l B_Source(a5),a6
|
||
move.w (a6)+,d0
|
||
sub.l B_Source(a5),a6
|
||
rts
|
||
Gsw move.l a0,-(sp)
|
||
bsr SoDisk
|
||
move.w (a0),d0
|
||
addq.l #2,a6
|
||
move.l (sp)+,a0
|
||
rts
|
||
|
||
;-----> Prend un MOTLONG du programme (A6)
|
||
GetLong:tst.w Flag_Source(a5)
|
||
bne.s Gsl
|
||
add.l B_Source(a5),a6
|
||
move.l (a6)+,d0
|
||
sub.l B_Source(a5),a6
|
||
rts
|
||
Gsl move.l a0,-(sp)
|
||
bsr SoDisk
|
||
move.l (a0),d0
|
||
addq.l #4,a6
|
||
move.l (sp)+,a0
|
||
rts
|
||
|
||
;-----> Gestion du buffer entree SOURCE
|
||
SoDisk: cmp.l DebBso(a5),a6
|
||
bcs.s SoDi1
|
||
lea 4(a6),a0
|
||
cmp.l FinBso(a5),a0
|
||
bcc.s SoDi1
|
||
; Adresse RELATIVE dans le buffer
|
||
move.l a6,a0
|
||
sub.l DebBso(a5),a0
|
||
add.l B_Source(a5),a0
|
||
rts
|
||
; Change la position du buffer
|
||
SoDi1: movem.l d0-d7/a1,-(sp)
|
||
; Bouge le bout
|
||
move.l DebBso(a5),d0
|
||
move.l FinBso(a5),d1
|
||
move.l MaxBso(a5),d2
|
||
sub.l BordBso(a5),d2
|
||
lea 4(a6),a0
|
||
SoDi3: cmp.l d0,a6
|
||
bcs.s SoDi4
|
||
cmp.l d1,a0
|
||
bcs.s SoDi5
|
||
; Monte le buffer
|
||
add.l d2,d0
|
||
add.l d2,d1
|
||
bra.s SoDi3
|
||
; Descend le buffer
|
||
SoDi4: sub.l d2,d0
|
||
sub.l d2,d1
|
||
bra.s SoDi3
|
||
SoDi5: move.l d0,DebBso(a5)
|
||
move.l d1,FinBso(a5)
|
||
bsr LoadBso
|
||
; Trouve l'adresse relative
|
||
movem.l (sp)+,d0-d7/a1
|
||
move.l a6,a0
|
||
sub.l DebBso(a5),a0
|
||
add.l B_Source(a5),a0
|
||
rts
|
||
|
||
;-----> Charge le buffer SOURCE
|
||
LoadBso:moveq #F_Source,d1
|
||
move.l DebBso(a5),d2
|
||
moveq #-1,d3
|
||
bsr FSeek
|
||
; Sauve l'ancien
|
||
moveq #F_Source,d1
|
||
move.l B_Source(a5),d2
|
||
move.l TopSou(a5),d3
|
||
sub.l DebBso(a5),d3
|
||
cmp.l MaxBso(a5),d3
|
||
bcs.s SoDi2
|
||
move.l FinBso(a5),d3
|
||
sub.l DebBso(a5),d3
|
||
SoDi2: bra FRead
|
||
|
||
|
||
*********************************************************************
|
||
* GESTION OBJET
|
||
|
||
******* Initialisation OBJET
|
||
IniObjet
|
||
tst.w Flag_Objet(a5)
|
||
bne.s IObdisc
|
||
* En m<EFBFBD>moire, reserve le 1er buffer
|
||
moveq #3,d0
|
||
bsr GetChiffre
|
||
move.l d0,L_Bob(a5)
|
||
add.l #16,d0
|
||
bsr ResBuffer
|
||
move.l a0,Bb_Objet_Base(a5)
|
||
move.l a0,Bb_OBjet(a5)
|
||
move.l #L_Bob,4(a0)
|
||
rts
|
||
* Sur disque
|
||
IObDisc move.l #L_Bob,d0
|
||
move.l d0,L_Bob(a5)
|
||
bsr ResBuffer
|
||
move.l a0,B_Objet(a5)
|
||
clr.l DebBob(a5)
|
||
move.l #L_Bob,FinBob(a5)
|
||
clr.l TopOb(a5)
|
||
lea Nom_Objet(a5),a1
|
||
moveq #F_Objet,d1
|
||
bsr FOpenNew
|
||
beq DError
|
||
rts
|
||
|
||
******* Efface tous les buffers objets
|
||
EraObjet
|
||
move.l Bb_Objet_Base(a5),d3
|
||
beq.s .skip
|
||
.loop move.l d3,a1
|
||
move.l 8(a1),d3
|
||
move.l -(a1),d0
|
||
bsr RamFree
|
||
tst.l d3
|
||
bne.s .loop
|
||
.skip rts
|
||
|
||
******* Sauve/Ferme le programme objet
|
||
SObject
|
||
moveq #28,d0
|
||
bsr MesPrint
|
||
lea Nom_Objet(a5),a0
|
||
bsr StrPrint
|
||
bsr Return
|
||
|
||
tst.w Flag_Objet(a5)
|
||
bne.s SObj1
|
||
lea Nom_Objet(a5),a1
|
||
moveq #F_Objet,d1
|
||
bsr FOpenNew
|
||
beq DError
|
||
move.l BB_Objet_Base(a5),d4
|
||
.loop move.l d4,a0
|
||
move.l (a0)+,d0
|
||
move.l (a0)+,d3
|
||
move.l (a0)+,d4
|
||
move.l a0,d2
|
||
add.l d3,d0
|
||
cmp.l L_Objet(a5),d0
|
||
bls.s .loop1
|
||
sub.l L_Objet(a5),d0
|
||
sub.l d0,d3
|
||
beq.s SObj2
|
||
.loop1 moveq #F_Objet,d1
|
||
bsr FWrite
|
||
beq DError
|
||
.loop2 tst.l d4
|
||
bne.s .loop
|
||
bra.s SObj2
|
||
* Sur disque: sauve le dernier buffer!
|
||
SObj1 bsr SaveBob
|
||
SObj2 moveq #F_Objet,d1
|
||
bsr FClose
|
||
rts
|
||
|
||
;-----> En cas d'erreur, KILL OBJECT!
|
||
KObject moveq #F_Objet,d1
|
||
bsr FHandle
|
||
beq.s KObx
|
||
; Ferme le fichier
|
||
clr.l (a0)
|
||
move.w #DosClose,d7
|
||
bsr DosCall
|
||
; Efface le fichier
|
||
lea Nom_Objet(a5),a0
|
||
move.l a0,d1
|
||
move.w #DosDel,d7
|
||
bsr DosCall
|
||
; Fini
|
||
KObX rts
|
||
|
||
;-----> Trouve le buffer objet contenant A4
|
||
GetBob movem.l a1/d0/d1,-(sp)
|
||
move.l Bb_Objet_Base(a5),a0
|
||
.loop move.l a0,a1
|
||
move.l (a0),d1
|
||
add.l 4(a0),d1
|
||
cmp.l d1,a4
|
||
bcs.s .loop2
|
||
move.l 8(a0),d0
|
||
move.l d0,a0
|
||
bne.s .loop
|
||
; Il faut en reserver un autre...
|
||
.loop1 move.l #L_Bob,d0
|
||
add.l #16,d0
|
||
bsr ResBuffer
|
||
move.l a0,8(a1)
|
||
; En reserver ENCORE un autre?
|
||
move.l d1,(a0)
|
||
move.l #L_Bob,4(a0)
|
||
move.l a0,a1
|
||
add.l #L_Bob,d1
|
||
cmp.l d1,a4
|
||
bcc.s .loop1
|
||
* Ok!
|
||
.loop2 move.l a1,Bb_Objet(a5)
|
||
movem.l (sp)+,a1/d0/d1
|
||
rts
|
||
|
||
;-----> Poke un BYTE dans l'objet
|
||
OutByte:tst.w Flag_Objet(a5)
|
||
bne.s OutbD
|
||
* En m<EFBFBD>moire
|
||
movem.l a0/a4,-(sp)
|
||
.Reskip move.l Bb_Objet(a5),a0
|
||
sub.l (a0),a4
|
||
cmp.l 4(a0),a4
|
||
bcc.s .skip
|
||
add.l a0,a4
|
||
move.b d0,12(a4)
|
||
movem.l (sp)+,a0/a4
|
||
addq.l #1,a4
|
||
rts
|
||
.skip movem.l (sp),a0/a4
|
||
bsr GetBob
|
||
bra.s .ReSkip
|
||
* Sur disque
|
||
OutbD move.l a0,-(sp)
|
||
bsr ObDisk
|
||
move.b d0,(a0)+
|
||
addq.l #1,a4
|
||
move.l (sp)+,a0
|
||
cmp.l TopOb(a5),a4
|
||
bcs.s PamB
|
||
move.l a4,TopOb(a5)
|
||
PamB: rts
|
||
|
||
;-----> Poke un MOT dans l'objet
|
||
OutWord:tst.w Flag_Objet(a5)
|
||
bne.s OutwD
|
||
* En m<EFBFBD>moire
|
||
OutW movem.l a0/a4,-(sp)
|
||
.Reskip move.l Bb_Objet(a5),a0
|
||
sub.l (a0),a4
|
||
cmp.l 4(a0),a4
|
||
bcc.s .skip
|
||
add.l a0,a4
|
||
move.w d0,12(a4)
|
||
movem.l (sp)+,a0/a4
|
||
addq.l #2,a4
|
||
rts
|
||
.skip movem.l (sp),a0/a4
|
||
bsr GetBob
|
||
bra.s .ReSkip
|
||
* Sur disque
|
||
OutwD move.l a0,-(sp)
|
||
bsr ObDisk
|
||
move.w d0,(a0)+
|
||
addq.l #2,a4
|
||
move.l (sp)+,a0
|
||
cmp.l TopOb(a5),a4
|
||
bcs.s PamW
|
||
move.l a4,TopOb(a5)
|
||
PamW: rts
|
||
|
||
;-----> Poke un MOT LONG dans l'objet
|
||
OutLong:tst.w Flag_Objet(a5)
|
||
bne.s OutlD
|
||
* En m<EFBFBD>moire
|
||
movem.l a0/a4,-(sp)
|
||
.Reskip move.l Bb_Objet(a5),a0
|
||
sub.l (a0),a4
|
||
cmp.l 4(a0),a4
|
||
bcc.s .skip
|
||
addq.l #4,a4
|
||
cmp.l 4(a0),a4
|
||
bhi.s .probleme
|
||
add.l a0,a4
|
||
move.l d0,12-4(a4)
|
||
movem.l (sp)+,a0/a4
|
||
addq.l #4,a4
|
||
rts
|
||
.skip movem.l (sp),a0/a4
|
||
bsr GetBob
|
||
bra.s .ReSkip
|
||
.probleme
|
||
movem.l (sp)+,a0/a4
|
||
swap d0
|
||
bsr OutW
|
||
swap d0
|
||
bra OutW
|
||
* Sur disque
|
||
OutlD move.l a0,-(sp)
|
||
bsr ObDisk
|
||
move.l d0,(a0)+
|
||
addq.l #4,a4
|
||
move.l (sp)+,a0
|
||
cmp.l TopOb(a5),a4
|
||
bcs.s PamL
|
||
move.l a4,TopOb(a5)
|
||
PamL: rts
|
||
|
||
;-----> Debuggage
|
||
;Protect
|
||
; move.l #0,-(sp)
|
||
; move.l #0,-(sp)
|
||
; move.l #0,-(sp)
|
||
; move.l #0,-(sp)
|
||
; bsr *+$212
|
||
; lea $10(sp),sp
|
||
; rts
|
||
; dc.w $4321
|
||
|
||
;-----> Prend un mot long dans l'objet
|
||
GtoLong:tst.w Flag_Objet(a5)
|
||
bne.s PaGL
|
||
* En memoire
|
||
bsr GtoW
|
||
swap d0
|
||
bsr GtoW
|
||
tst.l d0
|
||
rts
|
||
GtoW movem.l a0/a4,-(sp)
|
||
.Reskip move.l Bb_Objet(a5),a0
|
||
sub.l (a0),a4
|
||
cmp.l 4(a0),a4
|
||
bcc.s .skip
|
||
add.l a0,a4
|
||
move.w 12(a4),d0
|
||
movem.l (sp)+,a0/a4
|
||
addq.l #2,a4
|
||
rts
|
||
.skip movem.l (sp),a0/a4
|
||
bsr GetBob
|
||
bra.s .ReSkip
|
||
* Sur disque
|
||
PaGL move.l a0,-(sp)
|
||
bsr ObDisk
|
||
move.l (a0)+,d0
|
||
addq.l #4,a4
|
||
move.l (sp)+,a0
|
||
rts
|
||
|
||
;-----> Sortie de code
|
||
OutCode move.l d0,-(sp)
|
||
move.w (a0)+,d0
|
||
OutC1 bsr OutWord
|
||
move.w (a0)+,d0
|
||
cmp.w #$4321,d0
|
||
bne.s OutC1
|
||
move.l (sp)+,d0
|
||
rts
|
||
|
||
;-----> GESTION DU BUFFER OBJET DISQUE
|
||
ObDisk: cmp.l DebBob(a5),a4
|
||
bcs.s ObDi1
|
||
lea 4(a4),a0
|
||
cmp.l FinBob(a5),a0
|
||
bcc.s ObDi1
|
||
; Adresse RELATIVE dans le buffer
|
||
move.l a4,a0
|
||
sub.l DebBob(a5),a0
|
||
add.l B_Objet(a5),a0
|
||
rts
|
||
; Change la position du buffer
|
||
ObDi1: movem.l d0-d7/a0-a2,-(sp)
|
||
; Sauve le buffer
|
||
bsr SaveBob
|
||
; Bouge le bout
|
||
move.l DebBob(a5),d0
|
||
move.l FinBob(a5),d1
|
||
move.l #L_Bob,d2
|
||
sub.l BordBob(a5),d2
|
||
lea 4(a4),a0
|
||
ObDi3: cmp.l d0,a4
|
||
bcs.s ObDi4
|
||
cmp.l d1,a0
|
||
bcs.s ObDi5
|
||
; Monte le buffer
|
||
add.l d2,d0
|
||
add.l d2,d1
|
||
bra.s ObDi3
|
||
; Descend le buffer
|
||
ObDi4: sub.l d2,d0
|
||
sub.l d2,d1
|
||
bra.s ObDi3
|
||
ObDi5: move.l d0,DebBob(a5)
|
||
move.l d1,FinBob(a5)
|
||
; Charge le nouveau bout
|
||
moveq #F_Objet,d1
|
||
move.l DebBob(a5),d2
|
||
moveq #-1,d3
|
||
bsr FSeek
|
||
move.l FinBob(a5),d3
|
||
cmp.l TopOb(a5),d3
|
||
bcs.s ObDi6
|
||
move.l TopOb(a5),d3
|
||
ObDi6: sub.l DebBob(a5),d3
|
||
beq.s ObDi7
|
||
moveq #F_Objet,d1
|
||
move.l B_Objet(a5),d2
|
||
bsr FRead
|
||
; Trouve l'adresse relative
|
||
ObDi7: movem.l (sp)+,d0-d7/a0-a2
|
||
move.l a4,a0
|
||
sub.l DebBob(a5),a0
|
||
add.l B_Objet(a5),a0
|
||
rts
|
||
|
||
;-----> Sauve le buffer OBJET
|
||
SaveBob:moveq #F_Objet,d1
|
||
move.l DebBob(a5),d2
|
||
moveq #-1,d3
|
||
bsr FSeek
|
||
; Sauve l'ancien
|
||
moveq #F_Objet,d1
|
||
move.l B_Objet(a5),d2
|
||
move.l TopOb(a5),d3
|
||
sub.l DebBob(a5),d3
|
||
cmp.l #L_Bob,d3
|
||
bcs.s ObDi2
|
||
move.l FinBob(a5),d3
|
||
sub.l DebBob(a5),d3
|
||
ObDi2: bsr FWrite
|
||
rts
|
||
|
||
|
||
******* DOS CALL: appelle une routine DOS D7
|
||
DosCall
|
||
movem.l a5/a6,-(sp)
|
||
move.l C_DosBase(a5),a6
|
||
move.l a6,a5
|
||
add.w d7,a5
|
||
jsr (a5)
|
||
movem.l (sp)+,a5/a6
|
||
tst.l d0
|
||
rts
|
||
******* Trouve le handle #D1
|
||
FHandle move.w d1,d0
|
||
lsl.w #2,d0
|
||
lea T_Handles(a5),a0
|
||
add.w d0,a0
|
||
move.l (a0),d1
|
||
rts
|
||
|
||
******* OPEN: ouvre le fichier A0, # Handle D1, acces D2
|
||
FOpenOld
|
||
move.l #1005,d2
|
||
bra.s FOpen
|
||
FOpenNew
|
||
move.l #1006,d2
|
||
FOpen
|
||
bsr FHandle
|
||
bne DError
|
||
move.l a0,-(sp)
|
||
move.l a1,d1
|
||
move.w #DosOpen,d7
|
||
bsr DosCall
|
||
move.l (sp)+,a0
|
||
move.l d0,(a0)
|
||
rts
|
||
******* CLOSE fichier D1
|
||
FClose
|
||
bsr FHandle
|
||
beq PaFCl
|
||
clr.l (a0)
|
||
move.w #DosClose,d7
|
||
bsr DosCall
|
||
PaFCl: rts
|
||
******* CLOSE TOUS les fichiers
|
||
CloseAll
|
||
moveq #M_Fichiers-1,d6
|
||
ClAl move.l d6,d1
|
||
bsr FClose
|
||
dbra d6,ClAl
|
||
rts
|
||
******* READ fichier D1, D3 octets dans D2
|
||
FRead:
|
||
movem.l d1/a6,-(sp)
|
||
bsr FHandle
|
||
move.l C_DosBase(a5),a6
|
||
jsr DosRead(a6)
|
||
movem.l (sp)+,d1/a6
|
||
tst.l d0
|
||
beq.s ErdE
|
||
bmi.s ErdE
|
||
cmp.l d0,d3
|
||
bne.s ErdE
|
||
ErdB moveq #-1,d7
|
||
rts
|
||
ErdE moveq #0,d7
|
||
rts
|
||
******* WRITE fichier D1, D3 octets de D2
|
||
FWrite: movem.l d1/a6,-(sp)
|
||
bsr FHandle
|
||
move.l C_DosBase(a5),a6
|
||
jsr DosWrite(a6)
|
||
movem.l (sp)+,d1/a6
|
||
tst.l d0
|
||
beq.s ErdE
|
||
bmi.s ErdE
|
||
cmp.l d0,d3
|
||
bne.s ErdE
|
||
bra.s ErdB
|
||
|
||
******* SEEK fichier D1, D3 mode D2 deplacement
|
||
FSeek:
|
||
movem.l d1/a6,-(sp)
|
||
bsr FHandle
|
||
move.l C_DosBase(a5),a6
|
||
jsr DosSeek(a6)
|
||
movem.l (sp)+,d1/a6
|
||
tst.l d0
|
||
bmi.s ErdE
|
||
bra.s ErdB
|
||
******* LOF fichier D1
|
||
FLof
|
||
bsr FHandle
|
||
FLof2 move.l d1,-(sp)
|
||
moveq #0,d2 * Seek --> fin
|
||
moveq #1,d3
|
||
move.w #DosSeek,d7
|
||
bsr DosCall
|
||
move.l (sp)+,d1
|
||
move.l d0,d2 * Seek --> debut!
|
||
moveq #-1,d3
|
||
bra DosCall
|
||
*
|
||
A4Pair move.w a4,d0
|
||
btst #0,d0
|
||
beq.s A4p
|
||
addq.l #1,a4
|
||
A4p rts
|
||
|
||
|
||
******* Mise a zero!
|
||
RamFast movem.l d1-d2/a0-a2/a6,-(sp)
|
||
move.l #Public|Clear,d1
|
||
ExeCall AllocMem
|
||
movem.l (sp)+,d1-d2/a0-a2/a6
|
||
tst.l d0
|
||
rts
|
||
RamChip movem.l d1-d2/a0-a2/a6,-(sp)
|
||
move.l #Public|Chip|Clear,d1
|
||
ExeCall AllocMem
|
||
movem.l (sp)+,d1-d2/a0-a2/a6
|
||
tst.l d0
|
||
rts
|
||
******* Liberation
|
||
RamFree movem.l d0-d2/a0-a2/a6,-(sp)
|
||
ExeCall FreeMem
|
||
movem.l (sp)+,d0-d2/a0-a2/a6
|
||
rts
|
||
|
||
******* stocke la position dans l'objet
|
||
StockOut
|
||
move.l a0,-(sp)
|
||
move.l A_Stock(a5),a0
|
||
move.l a3,(a0)+
|
||
move.l a4,(a0)+
|
||
move.l OldRel(a5),(a0)+
|
||
move.l a0,A_Stock(a5)
|
||
move.l (sp)+,a0
|
||
rts
|
||
RestOut
|
||
move.l a0,-(sp)
|
||
move.l A_Stock(a5),a0
|
||
move.l -(a0),OldRel(a5)
|
||
move.l -(a0),a4
|
||
move.l -(a0),a3
|
||
move.l a0,A_Stock(a5)
|
||
move.l (sp)+,a0
|
||
rts
|
||
SautOut
|
||
sub.l #12,A_Stock(a5)
|
||
rts
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Instructions / Fonctions standart
|
||
;---------------------------------------------------------------------
|
||
|
||
;-----> CONTROLE COMPILATEUR
|
||
CTstOn clr.w Flag_NoTests(a5)
|
||
rts
|
||
CTstOf move.w #-1,Flag_NoTests(a5)
|
||
rts
|
||
CTst move.w #L_Tests,d0
|
||
bra CreFonc
|
||
COpt bsr StockOut
|
||
bsr Evalue
|
||
bra RestOut
|
||
|
||
;-----> Instruction etendue...
|
||
IExtension
|
||
bsr GetWord
|
||
lsr.w #8,d0
|
||
move.w d0,d2
|
||
lsl.w #2,d0
|
||
lea BufToks(a5),a2
|
||
move.l 0(a2,d0.w),d0
|
||
beq ErrExt
|
||
move.l d0,a2
|
||
bsr GetWord
|
||
move.w d0,d4
|
||
move.w 0(a2,d0.w),d1
|
||
lea 4(a2,d0.w),a2
|
||
* Est-ce un instruction de controle COMPILER?
|
||
cmp.w #Ext_Nb,d2
|
||
bne.s .PaCont
|
||
cmp.w #Ext_TkCmp,d0
|
||
beq ErrAlready
|
||
cmp.w #Ext_TkCOp,d0
|
||
beq COpt
|
||
cmp.w #Ext_TkTstOn,d0
|
||
beq CTstOn
|
||
cmp.w #Ext_TkTstOf,d0
|
||
beq CTstOf
|
||
cmp.w #Ext_TkTst,d0
|
||
beq CTst
|
||
.PaCont
|
||
* Est-ce un .AMOS?
|
||
moveq #-1,d3
|
||
cmp.w #3,Flag_Type(a5)
|
||
bne IStan
|
||
moveq #0,d3
|
||
bsr IStan
|
||
bra ExtCall
|
||
;-----> Fonction etendue
|
||
FExtension
|
||
bsr GetWord
|
||
lsr.w #8,d0
|
||
move.w d0,d2
|
||
lsl.w #2,d0
|
||
lea BufToks(a5),a2
|
||
move.l 0(a2,d0.w),d0
|
||
beq ErrExt
|
||
move.l d0,a2
|
||
bsr GetWord
|
||
move.w d0,d4
|
||
addq.w #2,d4
|
||
move.w 2(a2,d0.w),d1
|
||
lea 4(a2,d0.w),a2
|
||
; Est-ce un .AMOS?
|
||
cmp.w #3,Flag_Type(a5)
|
||
beq.s .Skip1
|
||
moveq #-1,d3
|
||
bsr FStan
|
||
bra.s .Skip2
|
||
.Skip1 moveq #0,d3
|
||
bsr FStan
|
||
bsr ExtCall
|
||
.Skip2
|
||
; Pousse le parametre dans la pile et revient...
|
||
move.w CMvd3ma3(pc),d0
|
||
bra OutWord
|
||
* Routine: appelle l'extension en .AMOS
|
||
ExtCall move.w Cmviwd0(pc),d0
|
||
bsr OutWord
|
||
move.w d1,d0
|
||
lsl.w #2,d0
|
||
bsr OutWord
|
||
move.w Cmviwd1(pc),d0
|
||
bsr OutWord
|
||
move.w d3,d0
|
||
bsr OutWord
|
||
move.w #L_ExtCall,d0
|
||
bra CreFonc
|
||
|
||
;-----> Instruction standard
|
||
IStandard
|
||
move.w 2(a0,d0.w),d1
|
||
moveq #0,d2
|
||
moveq #-1,d3
|
||
lea 4(a0,d0.w),a2
|
||
bra IStan
|
||
;-----> Fonction standard
|
||
FStandard
|
||
move.w 2(a0,d0.w),d1
|
||
FStand
|
||
moveq #0,d2
|
||
moveq #-1,d3
|
||
lea 4(a0,d0.w),a2
|
||
bra FStan
|
||
|
||
* Routine instruction
|
||
IStan movem.w d1/d2/d3/d4,-(sp)
|
||
IStan0 tst.b (a2)+
|
||
bpl.s IStan0
|
||
move.b (a2)+,d0
|
||
; Instruction
|
||
cmp.b #"I",d0
|
||
bne.s IStan1
|
||
bsr OutLea
|
||
bsr CParams
|
||
movem.w (sp)+,d0/d1/d2/d3
|
||
tst.w d2
|
||
bne CreFoncExt
|
||
rts
|
||
; Variable reservee en instruction
|
||
IStan1 cmp.b #"V",d0
|
||
bne Synt
|
||
move.b (a2)+,d0
|
||
sub.b #"0",d0
|
||
move.w d0,-(sp)
|
||
tst.b (a2) * Saute la parenthese!
|
||
bmi.s IStan1a
|
||
addq.l #2,a6
|
||
bsr CParams
|
||
IStan1a bsr GetWord
|
||
cmp.w #TkEg-Tk,d0
|
||
bne Synt
|
||
bsr Evalue
|
||
move.w (sp)+,d1
|
||
cmp.b d1,d2
|
||
beq.s IStan3
|
||
subq.b #1,d1
|
||
bmi.s IStan2
|
||
bne Synt
|
||
bsr IntToFl
|
||
bra.s IStan3
|
||
IStan2 bsr FlToInt
|
||
IStan3 movem.w (sp)+,d0/d1/d2/d3
|
||
tst.w d2
|
||
bne CreFoncExt
|
||
rts
|
||
* Routine fonction
|
||
FStan movem.w d1/d2/d3/d4,-(sp)
|
||
FStan0 tst.b (a2)+
|
||
bpl.s FStan0
|
||
move.b (a2)+,d0
|
||
; Fonction
|
||
cmp.b #"2",d0
|
||
bhi.s FStan2
|
||
FStand1 and.w #$00FF,d0
|
||
sub.b #"0",d0
|
||
move.w d0,-(sp)
|
||
tst.b (a2)
|
||
bmi.s FStan1a
|
||
addq.l #2,a6
|
||
bsr CParams
|
||
FStan1a move.w (sp)+,d4
|
||
cmp.b #1,d4
|
||
bne.s FStan1b
|
||
bset #0,Flag_Math(a5)
|
||
FStan1b movem.w (sp)+,d0/d1/d2/d3
|
||
exg d2,d4
|
||
tst.w d4
|
||
bne CreFoncExt
|
||
rts
|
||
; Variable reservee en fonction
|
||
FStan2 cmp.b #"V",d0
|
||
bne Synt
|
||
addq.w #1,(sp)
|
||
move.b (a2)+,d0
|
||
bra.s FStand1
|
||
|
||
* ROUTINE > recupere les parametres standards
|
||
CParams move.b (a2)+,d0
|
||
bmi.s CParX
|
||
CPar1 move.l a2,-(sp)
|
||
cmp.b #"3",d0
|
||
beq.s .Con
|
||
sub.b #48+1,d0
|
||
bmi.s CPar3
|
||
beq.s CPar2
|
||
; Une chaine
|
||
bsr Evalue
|
||
cmp.b #2,d2
|
||
beq.s CParL
|
||
bra Synt
|
||
; N'importe quoi (entier/float)
|
||
.Con bsr Evalue
|
||
cmp.b #1,d0
|
||
bne.s CParL
|
||
bsr FlToInt
|
||
bra.s CParL
|
||
; Un float
|
||
CPar2 bset #0,Flag_Math(a5)
|
||
bsr Evalue
|
||
subq.b #1,d2
|
||
beq.s CParL
|
||
bpl Synt
|
||
bsr IntToFl
|
||
bra.s CParL
|
||
; Entier
|
||
CPar3 bsr Evalue
|
||
subq.b #1,d2
|
||
bmi.s CParL
|
||
bne Synt
|
||
bsr FlToInt
|
||
; Encore un param?
|
||
CParL move.l (sp)+,a2
|
||
tst.b (a2)+
|
||
bmi.s CParX
|
||
addq.l #2,a6
|
||
move.b (a2)+,d0
|
||
bra.s CPar1
|
||
CParX rts
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Evaluations / Calculs
|
||
;---------------------------------------------------------------------
|
||
|
||
******* SET BUFFER
|
||
CSBuf addq.l #2,a6
|
||
bsr GetLong
|
||
move.l d0,L_Buf(a5)
|
||
rts
|
||
|
||
******* GLOBAL / SHARED -> saute les variables
|
||
CGlob
|
||
CShar addq.l #2,a6
|
||
bsr GetWord
|
||
move.w d0,d3
|
||
bsr GetWord
|
||
moveq #0,d2
|
||
move.b d0,d2
|
||
lsr.w #8,d0
|
||
add.w d0,a6
|
||
bsr VAdr0
|
||
CSh1 bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s CShar
|
||
cmp.w #TkPar1-Tk,d0
|
||
bne.s CSh2
|
||
addq.l #2,a6
|
||
bra.s CSh1
|
||
CSh2 subq.l #2,a6
|
||
rts
|
||
|
||
******* Prise d'une variable
|
||
IVar bsr OutLea
|
||
IVarBis move.l a6,-(sp)
|
||
bsr SoVar
|
||
move.w d2,-(sp)
|
||
bsr FnEval
|
||
move.b d2,d5
|
||
move.w (sp),d2
|
||
and.w #$07,d2
|
||
cmp.b #1,d2
|
||
bne.s .skip
|
||
bset #0,Flag_Math(a5)
|
||
.skip cmp.b d2,d5
|
||
beq.s IVr1
|
||
tst.b d2
|
||
bne.s IVr0
|
||
bsr FlToInt
|
||
bra.s IVr1
|
||
IVr0 bsr IntToFl
|
||
IVr1 addq.l #2,sp
|
||
move.l (sp),d0
|
||
move.l a6,(sp)
|
||
move.l d0,a6
|
||
bsr VarAdr
|
||
move.l (sp)+,a6
|
||
bmi.s IVrT
|
||
beq.s IVrL
|
||
* Variable GLOBALE
|
||
move.w CVrG(pc),d0
|
||
bra.s IVr2
|
||
CVrG move.l (a3)+,2(a0)
|
||
* Variable LOCALE
|
||
IVrL move.w CVrL(pc),d0
|
||
IVr2 bsr OutWord
|
||
move.w d3,d0
|
||
bra OutWord
|
||
CVrL move.l (a3)+,2(a6)
|
||
* Variable TABLEAU
|
||
IVrT moveq #L_GetTablo,d0
|
||
bsr CreFonc
|
||
move.w CVrT(pc),d0
|
||
bra OutWord
|
||
CVrT move.l (a3)+,(a0)
|
||
|
||
******* Met l'adresse de base d'une variable en A0
|
||
AdBase tst.w d1
|
||
beq.s AdA0L
|
||
bpl.s AdA0G
|
||
rts
|
||
* Variable GLOBALE
|
||
AdA0G move.w CLea2a0a0(pc),d0
|
||
bra.s IVr2
|
||
* Variable LOCALE
|
||
Ada0L move.w CLea2a6a0(pc),d0
|
||
bra.s IVr2
|
||
******* Met l'adresse d'une variable en A0
|
||
AdToA0 tst.w d1
|
||
beq.s AdA0L
|
||
bpl.s AdA0G
|
||
moveq #L_GetTablo,d0
|
||
bra CreFonc
|
||
|
||
******* Variable en fonction
|
||
FVar bsr VarAdr
|
||
and.w #$000F,d2
|
||
cmp.b #1,d2
|
||
bne.s .skip
|
||
bset #0,Flag_Math(a5)
|
||
.skip tst.w d1
|
||
bmi.s FVrT
|
||
beq.s FVrL
|
||
; Variable globale
|
||
move.w Cmv2a0Ma3(pc),d0 Globale
|
||
bra.s FVr
|
||
; Variable locale
|
||
FVrL move.w Cmv2a6Ma3(pc),d0 Locale
|
||
FVr bsr OutWord
|
||
move.w d3,d0
|
||
bra OutWord
|
||
; Variable tableau
|
||
FVrT moveq #L_GetTablo,d0
|
||
bsr CreFonc
|
||
move.w Cmvpa0Ma3(pc),d0
|
||
bra OutWord
|
||
|
||
** Saute une variable
|
||
SoVar bsr GetWord
|
||
bsr GetWord
|
||
move.b d0,d2
|
||
lsr.w #8,d0
|
||
add.w d0,a6
|
||
btst #6,d2
|
||
beq.s SoV3
|
||
; Saute les params du tableau
|
||
clr.w d1
|
||
SoV1 bsr GetWord
|
||
cmp.w #TkPar1-Tk,d0
|
||
bne.s SoV2
|
||
addq.w #1,d1
|
||
SoV2 cmp.w #TkPar2-Tk,d0
|
||
bne.s SoV1
|
||
subq.w #1,d1
|
||
bne.s SoV1
|
||
; Met le flag float!
|
||
SoV3 rts
|
||
** Trouve l'adresse d'une variable D2-D3
|
||
VarAdr bsr GetWord
|
||
move.w d0,d3
|
||
bsr GetWord
|
||
move.b d0,d2
|
||
lsr.w #8,d0
|
||
add.w d0,a6
|
||
btst #6,d2
|
||
bne VAdrT
|
||
VAdr0 moveq #0,d0
|
||
tst.w d3
|
||
bmi.s VAdrL
|
||
* >0: Variable LOCALE
|
||
move.w d3,d0
|
||
move.l A_FlagVarL(a5),a0
|
||
bsr VMark
|
||
addq.w #6,d3
|
||
neg.w d3
|
||
moveq #0,d1
|
||
rts
|
||
* <0: Variable GLOBALE
|
||
VAdrL addq.w #1,d3
|
||
move.w d3,d0
|
||
neg.w d0
|
||
move.l B_FlagVarG(a5),a0
|
||
bsr VMark
|
||
sub.w #12,d3
|
||
move.l CVarGlo(pc),d0
|
||
bsr OutLong
|
||
moveq #1,d1
|
||
rts
|
||
CVarGlo move.l VarGlo(a5),a0
|
||
* Variable tableau
|
||
VAdrT movem.w d2/d3,-(sp)
|
||
addq.l #2,a6
|
||
clr.w -(sp)
|
||
VAdrt1 addq.w #1,(sp)
|
||
bsr Expentier
|
||
cmp.w #TkPar2-Tk,d0
|
||
beq.s VAdrt2
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s VAdrt1
|
||
bra Synt
|
||
VAdrt2 move.w (sp)+,d7
|
||
movem.w (sp)+,d2/d3
|
||
bsr VAdr0
|
||
tst.w d1
|
||
beq.s VAtl
|
||
move.w Clea2a0a0(pc),d0
|
||
bra.s VAtt
|
||
VAtl move.w Clea2a6a0(pc),d0
|
||
VAtt bsr OutWord
|
||
move.w d3,d0
|
||
bsr OutWord
|
||
moveq #-1,d1
|
||
rts
|
||
* Marque le flag de la variable
|
||
VMark addq.w #6,d0
|
||
cmp.w (a0),d0
|
||
bcs.s Vml1
|
||
move.w d0,(a0)
|
||
Vml1 divu #6,d0
|
||
and.b #%01001111,d2
|
||
lea 2-1(a0,d0.w),a0
|
||
move.b d2,(a0)
|
||
rts
|
||
** Trouve l'adresse d'une variable D2-D3, SPECIAL FN
|
||
VarAdrFn
|
||
bsr GetWord
|
||
move.w d0,d3
|
||
bsr GetWord
|
||
move.b d0,d2
|
||
lsr.w #8,d0
|
||
add.w d0,a6
|
||
moveq #0,d0
|
||
tst.w d3
|
||
bmi.s .VAdrL
|
||
* >0: Variable LOCALE
|
||
move.w d3,d0
|
||
move.l A_FlagVarL(a5),a0
|
||
bsr .VMark
|
||
addq.w #6,d3
|
||
neg.w d3
|
||
moveq #0,d1
|
||
rts
|
||
* <0: Variable GLOBALE
|
||
.VAdrL addq.w #1,d3
|
||
move.w d3,d0
|
||
neg.w d0
|
||
move.l B_FlagVarG(a5),a0
|
||
bsr.s .VMark
|
||
sub.w #12,d3
|
||
move.l CVarGlo(pc),d0
|
||
bsr OutLong
|
||
moveq #1,d1
|
||
rts
|
||
* PREND le flag de la variable SPECIAL Def Fn
|
||
.VMark addq.w #6,d0
|
||
divu #6,d0
|
||
lea 2-1(a0,d0.w),a0
|
||
move.b (a0),d2
|
||
rts
|
||
|
||
******* DIM
|
||
CDim bsr OutLea
|
||
addq.l #2,a6
|
||
bsr VarAdr
|
||
move.w Cmvqd0(pc),d0
|
||
move.b d7,d0
|
||
bsr OutWord
|
||
moveq #L_Dim,d0
|
||
bsr CreFonc
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s CDim
|
||
subq.l #2,a6
|
||
rts
|
||
|
||
******* DEF FN
|
||
CDefFn bsr OutLea
|
||
addq.l #2,a6
|
||
bsr VarAdr
|
||
move.l a0,-(sp) Adresse du flag!
|
||
bsr AdBase
|
||
lea CdDfn1(pc),a0
|
||
bsr OutCode
|
||
move.l a4,-(sp)
|
||
bsr GetWord
|
||
cmp.w #TkPar1-Tk,d0
|
||
bne.s Cdfn2
|
||
* Prend les variables (<EFBFBD> l'envers)
|
||
clr.w N_Dfn(a5)
|
||
Cdfn0 addq.l #2,a6
|
||
move.l a6,-(sp)
|
||
addq.w #1,N_Dfn(a5)
|
||
bsr SoVar
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s Cdfn0
|
||
addq.l #2,a6
|
||
move.l a6,A_Dfn(a5)
|
||
Cdfn1 move.l (sp)+,a6
|
||
bsr VarAdr
|
||
bsr AdBase
|
||
move.w Cmvqd2(pc),d0
|
||
and.b #$03,d2
|
||
move.b d2,d0
|
||
bsr OutWord
|
||
lea CdDfn2(pc),a0
|
||
bsr OutCode
|
||
subq.w #1,N_Dfn(a5)
|
||
bne.s Cdfn1
|
||
move.l A_Dfn(a5),a6
|
||
* Fonction!
|
||
Cdfn2 bsr Evalue
|
||
move.l 4(sp),a0
|
||
and.b #%00000011,d2
|
||
bset #3,d2
|
||
move.b d2,(a0)
|
||
move.w CRts(pc),d0
|
||
bsr OutWord
|
||
* Saute le tout!
|
||
move.l a4,d0
|
||
move.l (sp),a4
|
||
move.l d0,(sp)
|
||
subq.l #2,a4
|
||
sub.l a4,d0
|
||
bsr OutWord
|
||
move.l (sp)+,a4
|
||
addq.l #4,sp
|
||
rts
|
||
CdDfn1 lea *+10(pc),a1
|
||
move.l a1,(a0)
|
||
bra CdDfn2
|
||
dc.w $4321
|
||
CdDfn2 lea *+6(pc),a2
|
||
rts
|
||
dc.w $4321
|
||
|
||
******* =FN
|
||
CFn addq.l #2,a6
|
||
move.l a6,-(sp)
|
||
bsr SoVar
|
||
clr.w -(sp)
|
||
bsr GetWord
|
||
cmp.w #TkPar1-Tk,d0
|
||
bne.s CFn2
|
||
* Prend les parametres
|
||
CFn1 addq.w #1,(sp)
|
||
bsr Evalue
|
||
move.w Cmvima3(pc),d0
|
||
bsr OutWord
|
||
and.w #$0F,d2
|
||
move.w d2,d0
|
||
bsr OutWord
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s CFn1
|
||
* Appelle la fonction
|
||
CFn2 subq.l #2,a6
|
||
move.l 2(sp),d0
|
||
move.l a6,2(sp)
|
||
move.l d0,a6
|
||
bsr VarAdrFn
|
||
bsr AdBase
|
||
move.w (sp)+,d1
|
||
move.w Cmvqd0(pc),d0
|
||
move.b d1,d0
|
||
bsr OutWord
|
||
move.l (sp)+,a6
|
||
move.w #L_FN,d0
|
||
bsr CreFonc
|
||
and.w #$03,d2
|
||
rts
|
||
|
||
******* SORT a()
|
||
CSort bsr OutLea
|
||
addq.l #2,a6
|
||
bsr VarAdr
|
||
bsr AdBase
|
||
move.w Cmvqd2(pc),d0
|
||
and.w #$03,d2
|
||
move.b d2,d0
|
||
bsr OutWord
|
||
move.w #L_Sort,d0
|
||
bra CreFonc
|
||
******* =MATCH(a(),b)
|
||
CMatch bsr OutLea
|
||
addq.l #4,a6
|
||
move.l a6,-(sp)
|
||
bsr SoVar
|
||
and.w #$0f,d2
|
||
move.w d2,-(sp)
|
||
addq.l #2,a6
|
||
bsr Evalue
|
||
move.w (sp)+,d1
|
||
bsr EqType
|
||
move.l (sp),d0
|
||
move.l a6,(sp)
|
||
move.l d0,a6
|
||
bsr VarAdr
|
||
bsr AdBase
|
||
move.w Cmvqd2(pc),d0
|
||
and.w #$0f,d2
|
||
move.b d2,d0
|
||
bsr OutWord
|
||
move.w #L_FFind,d0
|
||
bsr CreFonc
|
||
move.l (sp)+,a6
|
||
moveq #0,d2
|
||
rts
|
||
|
||
******* Evaluation d'expression
|
||
FnEval: addq.l #2,a6
|
||
Evalue: move.w #$7FFF,d0
|
||
bra.s Eva1
|
||
Eva0: move.w d2,-(sp)
|
||
Eva1: move.w d0,-(sp)
|
||
bsr Operande
|
||
Eva2: bsr GetWord
|
||
cmp.w (sp),d0
|
||
bhi.s Eva0
|
||
subq.l #2,a6
|
||
move.w (sp)+,d1
|
||
bpl.s Eva3
|
||
move.w (sp)+,d5
|
||
lea Tk(pc),a0
|
||
move.w 0(a0,d1.w),d1
|
||
beq Synt
|
||
addq.w #1,NbInstr(a5)
|
||
jsr 0(a0,d1.w)
|
||
clr.w Flag_Const(a5)
|
||
bra.s Eva2
|
||
Eva3: cmp.w #TkPar2-Tk,d0
|
||
bne.s Eva4
|
||
addq.l #2,a6
|
||
Eva4: rts
|
||
** Recupere un operande
|
||
Operande:
|
||
clr.w -(sp)
|
||
Ope0: addq.w #1,NbInstr(a5)
|
||
bsr GetWord
|
||
lea Tk(pc),a0
|
||
tst.w 0(a0,d0.w)
|
||
bne.s Ope0a
|
||
bsr FStandard
|
||
bra.s Ope0b
|
||
Ope0a move.w 2(a0,d0.w),d1
|
||
beq Synt
|
||
jsr 0(a0,d1.w)
|
||
Ope0b clr.w Flag_Const(a5)
|
||
* Changement de signe non effectue?
|
||
Const tst.w (sp)+
|
||
bne.s Chs0
|
||
rts
|
||
Chs0: tst.b d2
|
||
bne.s Chs1
|
||
move.w CChsI(pc),d0
|
||
bra OutWord
|
||
Chs1: moveq #L_NegFl,d0
|
||
bra CreFonc
|
||
CChsI neg.l (a3)
|
||
dc.w $4321
|
||
* Signe moins devant
|
||
OpeM: addq.l #4,sp
|
||
addq.w #1,(sp)
|
||
bra.s Ope0
|
||
|
||
;-----> VIRGULE / : / TO / THEN / ELSE ---> pas de parametre, entier
|
||
FNull lea CNull(pc),a0
|
||
bsr OutCode
|
||
moveq #0,d2
|
||
subq.l #2,a6
|
||
rts
|
||
CNull move.l #EntNul,-(a3)
|
||
dc.w $4321
|
||
|
||
;-----> CONSTANTE Entiere/Hex/Bin
|
||
FEnt move.w CCst(pc),d0
|
||
bsr OutWord
|
||
bsr GetLong
|
||
tst.w 4(sp)
|
||
beq FEnt1
|
||
clr.w 4(sp)
|
||
neg.l d0
|
||
FEnt1 move.l d0,d3
|
||
bsr OutLong
|
||
moveq #0,d2
|
||
bra.s DoConst
|
||
;-----> CONSTANTE Float
|
||
FFloat bset #0,Flag_Math(a5)
|
||
move.w CCst(pc),d0
|
||
bsr OutWord
|
||
bsr GetLong
|
||
tst.w 4(a7)
|
||
beq FFlo1
|
||
clr.w 4(a7)
|
||
; Change le signe!
|
||
tst.b d0
|
||
beq.s FFlo1
|
||
bchg #7,d0
|
||
FFlo1 bsr OutLong
|
||
moveq #1,d2
|
||
bra.s DoConst
|
||
CCst move.l #$55555555,-(a3)
|
||
;-----> CONSTANTE Chaine
|
||
FChaine move.w CCst(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
move.l A_Chaines(a5),d0
|
||
move.l d0,a1
|
||
bset #BitChaine,d0
|
||
bsr OutLong
|
||
move.l a6,(a1)
|
||
addq.l #4,A_Chaines(a5)
|
||
; Saute la constante
|
||
bsr GetWord
|
||
btst #0,d0
|
||
beq.s FCh1
|
||
addq.w #1,d0
|
||
FCh1 add.w d0,a6
|
||
moveq #2,d2
|
||
; Marque le flag CONSTANTE
|
||
DoConst lea Const(pc),a0
|
||
move.l a0,(sp)
|
||
rts
|
||
|
||
******* Fonctions compilo
|
||
FnExpentier
|
||
addq.l #2,a6
|
||
Expentier
|
||
bsr Evalue
|
||
DoEntier
|
||
tst.b d2
|
||
bne FlToInt
|
||
rts
|
||
Compat
|
||
cmp.b d2,d5
|
||
beq.s CptX
|
||
bsr QueFloat
|
||
CptX subq.w #1,d5
|
||
bne.s CptX1
|
||
bset #0,Flag_Math(a5)
|
||
CptX1 tst.b d5
|
||
rts
|
||
QuEntier
|
||
tst.b d2
|
||
beq.s Que1
|
||
moveq #L_FlToInt,d0
|
||
bsr CreFonc
|
||
moveq #0,d2
|
||
Que1 tst.b d5
|
||
beq.s Que2
|
||
move.w #L_FlToInt2,d0
|
||
bsr CreFonc
|
||
moveq #0,d5
|
||
Que2 rts
|
||
QueFloat
|
||
bset #0,Flag_Math(a5)
|
||
tst.b d2
|
||
bne.s QueF1
|
||
moveq #L_IntToFl,d0
|
||
bsr CreFonc
|
||
moveq #1,d2
|
||
QueF1 tst.b d5
|
||
bne.s QueF2
|
||
move.w #L_IntToFl2,d0
|
||
bsr CreFonc
|
||
moveq #1,d5
|
||
QueF2 rts
|
||
EqType
|
||
cmp.b d1,d2
|
||
bne.s Eqt1
|
||
rts
|
||
Eqt1 tst.b d1
|
||
bne.s IntToFl
|
||
beq.s FlToInt
|
||
FnFloat
|
||
bset #0,Flag_Math(a5)
|
||
bsr FnEval
|
||
tst.b d2
|
||
bne.s FnFl1
|
||
moveq #L_IntToFl,d0
|
||
bsr CreFonc
|
||
moveq #1,d2
|
||
FnFl1 rts
|
||
IntToFl
|
||
movem.l d0-d1/a0-a2,-(sp)
|
||
bset #0,Flag_Math(a5)
|
||
moveq #L_IntToFl,d0
|
||
bsr CreFonc
|
||
moveq #1,d2
|
||
movem.l (sp)+,d0-d1/a0-a2
|
||
rts
|
||
FlToInt
|
||
movem.l d0-d1/a0-a2,-(sp)
|
||
bset #0,Flag_Math(a5)
|
||
moveq #L_FlToInt,d0
|
||
bsr CreFonc
|
||
moveq #0,d2
|
||
movem.l (sp)+,d0-d1/a0-a2
|
||
rts
|
||
|
||
;-----> Operateur +
|
||
CPlus bsr Compat
|
||
bmi.s CPl2
|
||
beq.s CPl1
|
||
* Chaines
|
||
moveq #L_PlusC,d0
|
||
bsr CreFonc
|
||
moveq #2,d2
|
||
rts
|
||
* Float
|
||
CPl1 moveq #L_PlusF,d0
|
||
bsr CreFonc
|
||
bset #0,Flag_Math(a5)
|
||
moveq #1,d2
|
||
rts
|
||
* Entiere
|
||
CPl2 lea CcPlus(pc),a0
|
||
bra OutCode
|
||
CcPlus move.l (a3)+,d0
|
||
add.l d0,(a3)
|
||
dc.w $4321
|
||
;-----> Operateur -
|
||
CMoins bsr Compat
|
||
bmi.s CMn2
|
||
beq.s CMn1
|
||
* Chaines
|
||
moveq #L_MoinsC,d0
|
||
bsr CreFonc
|
||
moveq #2,d2
|
||
rts
|
||
* Float
|
||
CMn1 moveq #L_MoinsF,d0
|
||
bsr CreFonc
|
||
bset #0,Flag_Math(a5)
|
||
moveq #1,d2
|
||
rts
|
||
* Entiere
|
||
CMn2 lea CcMoins(pc),a0
|
||
bra OutCode
|
||
CcMoins move.l (a3)+,d0
|
||
sub.l d0,(a3)
|
||
dc.w $4321
|
||
;-----> Operateur *
|
||
CMult: moveq #L_Mult,d0
|
||
bsr COpe
|
||
move.w d1,d2
|
||
rts
|
||
;-----> Operateur /
|
||
CDiv moveq #L_Div,d0
|
||
bsr COpe
|
||
move.w d1,d2
|
||
rts
|
||
;-----> Operateur MODULO
|
||
CMod bsr Quentier
|
||
moveq #L_Mod,d0
|
||
bra CreFonc
|
||
;-----> Operateur PUISSANCE
|
||
CPuis: bsr QueFloat
|
||
bset #1,Flag_Math(a5)
|
||
moveq #L_Puis,d0
|
||
bra CreFonc
|
||
;-----> Operateur =
|
||
CEg: moveq #L_Eg,d0
|
||
bra.s COpe
|
||
;-----> Operateur <>
|
||
CDif: moveq #L_Dif,d0
|
||
bra.s COpe
|
||
;-----> Operateur <
|
||
CInf: moveq #L_Inf,d0
|
||
bra.s COpe
|
||
;-----> Operateur >
|
||
CSup: moveq #L_Sup,d0
|
||
bra.s COpe
|
||
;-----> Operateur <=
|
||
CInfEg moveq #L_InfEg,d0
|
||
bra.s COpe
|
||
;-----> Operateur >=
|
||
CSupEg moveq #L_SupEg,d0
|
||
COpe move.w d0,-(sp)
|
||
bsr Compat
|
||
bmi.s COp2
|
||
beq.s COp1
|
||
; Chaines
|
||
move.w (sp)+,d0
|
||
addq.w #2,d0
|
||
bsr CreFonc
|
||
moveq #0,d2
|
||
moveq #2,d1
|
||
rts
|
||
; Float
|
||
COp1 move.w (sp)+,d0
|
||
addq.w #1,d0
|
||
bsr CreFonc
|
||
bset #0,Flag_Math(a5)
|
||
moveq #0,d2
|
||
moveq #1,d1
|
||
rts
|
||
; Entier
|
||
COp2 move.w (sp)+,d0
|
||
bsr CreFonc
|
||
moveq #0,d2
|
||
moveq #0,d1
|
||
rts
|
||
|
||
;-----> Operateur OR
|
||
COr: bsr Quentier
|
||
lea COr2(pc),a0
|
||
COr1: bsr OutCode
|
||
moveq #0,d2
|
||
rts
|
||
COr2: move.l (a3)+,d0
|
||
or.l d0,(a3)
|
||
dc.w $4321
|
||
;-----> Operateur AND
|
||
CAnd: bsr Quentier
|
||
lea CAnd1(pc),a0
|
||
bra.s COr1
|
||
CAnd1: move.l (a3)+,d0
|
||
and.l d0,(a3)
|
||
dc.w $4321
|
||
;-----> Operateur XOR
|
||
CXor: bsr Quentier
|
||
lea CXor1(pc),a0
|
||
bra.s COr1
|
||
CXor1: move.l (a3)+,d0
|
||
eor.l d0,(a3)
|
||
dc.w $4321
|
||
;-----> Fonction NOT
|
||
CNot: bsr Expentier
|
||
lea CNt(pc),a0
|
||
bra.s COr1
|
||
CNt: not.l (a3)
|
||
dc.w $4321
|
||
;-----> FALSE / TRUE
|
||
CFalse moveq #0,d2
|
||
lea CdFal(pc),a0
|
||
bra OutCode
|
||
CTrue moveq #0,d2
|
||
lea CdTru(pc),a0
|
||
bra OutCode
|
||
CdFal clr.l -(a3)
|
||
dc.w $4321
|
||
CdTru move.l #-1,-(a3)
|
||
dc.w $4321
|
||
|
||
;-----> SWAP
|
||
CSwap bsr OutLea
|
||
addq.l #2,a6
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
move.w Cmva0ma3(pc),d0
|
||
bsr OutWord
|
||
addq.l #4,a6
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
move.w #L_Swap,d0
|
||
bra CreFonc
|
||
|
||
******* MIN + MAX
|
||
CMin move.w #L_MinE,-(sp)
|
||
bra.s CMinMax
|
||
CMax move.w #L_MaxE,-(sp)
|
||
CMinMax bsr FnEval
|
||
move.w d2,-(sp)
|
||
bsr FnEval
|
||
move.w (sp)+,d5
|
||
bsr Compat
|
||
bmi.s Cmm3
|
||
beq.s Cmm2
|
||
Cmm1 addq.w #1,(sp)
|
||
Cmm2 addq.w #1,(sp)
|
||
Cmm3 move.w (sp)+,d0
|
||
bra CreFonc
|
||
|
||
******* ABS
|
||
CInt bsr FnEval
|
||
tst.b d2
|
||
beq.s CInt2
|
||
move.w #L_IntF,d0
|
||
bsr CreFonc
|
||
moveq #1,d2
|
||
CInt2 rts
|
||
CAbs bsr FnEval
|
||
move.w #L_AbsE,d0
|
||
tst.b d2
|
||
beq CreFonc
|
||
addq.w #1,d0
|
||
bra CreFonc
|
||
CSgn bsr FnEval
|
||
move.w #L_SgnE,d0
|
||
tst.b d2
|
||
beq CreFonc
|
||
addq.w #1,d0
|
||
moveq #0,d2
|
||
bra CreFonc
|
||
CSqr move.w #L_Sqr,d0
|
||
bra.s CMath
|
||
CLog move.w #L_Log,d0
|
||
bra.s CMath
|
||
CLn move.w #L_Ln,d0
|
||
bra.s CMath
|
||
CExp move.w #L_Exp,d0
|
||
bra.s CMath
|
||
CSin move.w #L_Sin,d0
|
||
bra.s CMath
|
||
CCos move.w #L_Cos,d0
|
||
bra.s CMath
|
||
CTan move.w #L_Tan,d0
|
||
bra.s CMath
|
||
CASin move.w #L_ASin,d0
|
||
bra.s CMath
|
||
CACos move.w #L_ACos,d0
|
||
bra.s CMath
|
||
CATan move.w #L_ATan,d0
|
||
bra.s CMath
|
||
CHsin move.w #L_HSin,d0
|
||
bra.s CMath
|
||
CHCos move.w #L_HCos,d0
|
||
bra.s CMath
|
||
CHTan move.w #L_HTan,d0
|
||
* Appel de la fonction
|
||
CMath bset #0,Flag_Math(a5)
|
||
bset #1,Flag_Math(a5)
|
||
move.w d0,-(sp)
|
||
bsr FnFloat
|
||
move.w (sp)+,d0
|
||
moveq #1,d2
|
||
bra CreFonc
|
||
|
||
******* INC
|
||
CInc pea CdInc(pc)
|
||
bra.s CIncDec
|
||
CDec pea CdDec(pc)
|
||
CIncDec bsr OutLea
|
||
addq.l #2,a6
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
move.l (sp)+,a0
|
||
bra OutCode
|
||
CdInc addq.l #1,(a0)
|
||
dc.w $4321
|
||
CdDec subq.l #1,(a0)
|
||
dc.w $4321
|
||
******* ADD a,b
|
||
CAdd2 bsr OutLea
|
||
addq.l #2,a6
|
||
move.l a6,-(sp)
|
||
bsr SoVar
|
||
bsr FnExpentier
|
||
move.l (sp),d0
|
||
move.l a6,(sp)
|
||
move.l d0,a6
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
lea CdAdd1(pc),a0
|
||
bsr OutCode
|
||
move.l (sp)+,a6
|
||
rts
|
||
CdAdd1 move.l (a3)+,d0
|
||
add.l d0,(a0)
|
||
dc.w $4321
|
||
******* ADD a,b,c to d
|
||
CAdd4 bsr OutLea
|
||
addq.l #2,a6
|
||
move.l a6,-(sp)
|
||
bsr SoVar
|
||
bsr FnExpentier
|
||
bsr FnExpentier
|
||
bsr FnExpentier
|
||
move.l (sp),d0
|
||
move.l a6,(sp)
|
||
move.l d0,a6
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
move.l (sp)+,a6
|
||
move.w #L_Add4,d0
|
||
bra CreFonc
|
||
|
||
******* Instruction finie??
|
||
Finie: bsr GetWord
|
||
FinieB: beq.s Finy
|
||
cmp.w #TkDP-Tk,d0
|
||
beq.s Finy
|
||
cmp.w #TkThen-Tk,d0
|
||
beq.s Finy
|
||
cmp.w #TkElse-Tk,d0
|
||
Finy: rts
|
||
|
||
******* Appel de la routine de test
|
||
CTests tst.w Flag_NoTests(a5)
|
||
bne.s .skip
|
||
move.w #L_Tests,d0
|
||
bsr CreFonc
|
||
.skip rts
|
||
|
||
******* =PARAM
|
||
CparamE moveq #0,d2
|
||
move.l CdParE(pc),d0
|
||
bra OutLong
|
||
CparamF moveq #1,d2
|
||
bset #0,Flag_Math(a5)
|
||
move.l CdParF(pc),d0
|
||
bra OutLong
|
||
CparamC moveq #2,d2
|
||
move.l CdParS(pc),d0
|
||
bra OutLong
|
||
|
||
******* FOLLOW
|
||
CFollow bsr Finie
|
||
subq.l #2,a6
|
||
beq.s CFol3
|
||
CFol1 bsr Evalue
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s CFol1
|
||
CFol2 subq.l #2,a6
|
||
CFol3 rts
|
||
|
||
******* VARPTR
|
||
CVarptr addq.l #4,a6
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
addq.l #2,a6
|
||
and.w #$F,d2
|
||
subq.w #1,d2
|
||
bhi.s CVpt1
|
||
move.w Cmva0ma3(pc),d0
|
||
bsr OutWord
|
||
moveq #0,d2
|
||
rts
|
||
CVpt1 lea CVpt2(pc),a0
|
||
bsr OutCode
|
||
moveq #0,d2
|
||
rts
|
||
CVpt2 move.l (a0),-(a3)
|
||
addq.l #2,(a3)
|
||
dc.w $4321
|
||
|
||
******* DATA
|
||
CData addq.l #2,a6
|
||
move.l CBra(pc),d0
|
||
bsr OutLong
|
||
move.l a4,-(sp)
|
||
tst.l A_Datas(a5)
|
||
bne.s CDt1
|
||
move.l a4,A_Datas(a5)
|
||
bra.s CDt2
|
||
CDt1 move.l a4,-(sp)
|
||
move.l a4,d0
|
||
move.l A_JDatas(a5),a4
|
||
bsr OutLong
|
||
move.l (sp)+,a4
|
||
CDt2 move.w CNop(pc),d0 * Signal-> DATAS!
|
||
bsr OutWord
|
||
bsr Evalue
|
||
move.w Cmvqd2(pc),d0
|
||
and.w #$000F,d2
|
||
move.b d2,d0
|
||
bsr OutWord
|
||
move.w Cleaa2(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
move.l a4,A_JDatas(a5)
|
||
move.l A_EDatas(a5),d0
|
||
bsr OutLong
|
||
move.w CRts(pc),d0
|
||
bsr OutWord
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s CDt1
|
||
subq.l #2,a6
|
||
* Met le BRA
|
||
move.l a4,d0
|
||
move.l (sp),a4
|
||
move.l d0,(sp)
|
||
subq.l #2,a4
|
||
sub.l a4,d0
|
||
bsr OutWord
|
||
move.l (sp)+,a4
|
||
rts
|
||
CdDNul clr.l -(a3)
|
||
moveq #-1,d2
|
||
rts
|
||
dc.w $4321
|
||
|
||
******* Cree la routine NO DATA
|
||
CreNoData
|
||
tst.l A_EDatas(a5)
|
||
bne.s CnDtX
|
||
move.l a4,A_EDatas(a5)
|
||
addq.l #2,A_EDatas(a5)
|
||
lea Cd0Data(pc),a0
|
||
bsr OutCode
|
||
CnDtX rts
|
||
Cd0Data bra.s Cd1Data
|
||
moveq #-1,d0
|
||
moveq #-1,d2
|
||
rts
|
||
Cd1Data dc.w $4321
|
||
|
||
******* RESTORE
|
||
CRest bsr OutLea
|
||
move.w #L_Rest0,d1
|
||
bsr Finie
|
||
subq.l #2,a6
|
||
beq.s CRest1
|
||
move.w N_Proc(a5),d7
|
||
bsr GetLabel
|
||
move.w #L_Rest1,d1
|
||
CRest1 move.w d1,d0
|
||
bra CreFonc
|
||
|
||
******* READ
|
||
CRead bsr OutLea
|
||
addq.l #2,a6
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
and.w #$000F,d2
|
||
move.w #L_ReadE,d0
|
||
subq.b #1,d2
|
||
bmi.s Cread1
|
||
addq.w #1,d0
|
||
tst.b d2
|
||
beq.s Cread1
|
||
addq.w #1,d0
|
||
Cread1 bsr CreFonc
|
||
bsr GetWord
|
||
cmp.w #TkVir-TK,d0
|
||
beq.s Cread
|
||
subq.l #2,a6
|
||
rts
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; CHAINES / TEXTE
|
||
;---------------------------------------------------------------------
|
||
|
||
;------> MID en fonction
|
||
CFLeft move.w #L_FLeft,d1
|
||
bra FStand
|
||
CFRight move.w #L_FRight,d1
|
||
bra FStand
|
||
CFMid2 move.w #L_FMid2,d1
|
||
bra FStand
|
||
CFMid3 move.w #L_FMid3,d1
|
||
bra FStand
|
||
;------> MID en instruction
|
||
CIMid3 move.w #L_IMid3,-(sp)
|
||
bra.s CIMid
|
||
CIMid2 move.w #L_IMid2,-(sp)
|
||
bra.s CIMid
|
||
CILeft move.w #L_ILeft,-(sp)
|
||
bra.s CIMid
|
||
CIRight move.w #L_IRight,-(sp)
|
||
CIMid bsr OutLea
|
||
addq.l #4,a6
|
||
move.l a6,-(sp)
|
||
bsr SoVar
|
||
addq.l #2,a6
|
||
bsr Expentier
|
||
cmp.w #L_IMid3,4(sp)
|
||
bne.s CIMd
|
||
addq.l #2,a6
|
||
bsr Expentier
|
||
CIMd addq.l #2,a6
|
||
bsr Evalue
|
||
move.l a6,d0
|
||
move.l (sp)+,a6
|
||
move.l d0,-(sp)
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
move.l (sp)+,a6
|
||
move.w (sp)+,d0
|
||
bra CreFonc
|
||
;------> =STR$(n)
|
||
CStr bsr FnEval
|
||
moveq #L_StrE,d0
|
||
move.w d2,d1
|
||
moveq #2,d2
|
||
subq.w #1,d1
|
||
bmi CreFonc
|
||
moveq #L_StrF,d0
|
||
bra CreFonc
|
||
;------> =VAL(a$)
|
||
CVal bsr FnEval
|
||
moveq #L_Val,d0
|
||
moveq #0,d2
|
||
btst #0,Flag_Math(a5)
|
||
beq CreFonc
|
||
moveq #1,d2
|
||
bra CreFonc
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Boucles/Structure
|
||
;---------------------------------------------------------------------
|
||
|
||
******* REMs
|
||
CRem subq.w #1,NbInstr(a5)
|
||
bsr GetWord
|
||
add.w d0,a6
|
||
rts
|
||
|
||
;----------------------> TRAITEMENT DES ERREURS
|
||
OutLea move.l CLeapca4(pc),d0
|
||
bra OutLong
|
||
|
||
;----------------------> PROCEDURES
|
||
|
||
******* Codage / Decodage procedure LOCKEE
|
||
* A6---> "PROC"
|
||
ProCode movem.l d0-d7/a0-a6,-(sp)
|
||
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)
|
||
movem.l (sp)+,d0-d7/a0-a6
|
||
rts
|
||
|
||
******* Debut de procedure, premiere exploration
|
||
CProc subq.w #1,NbInstr(a5)
|
||
* Decode la procedure si codee...
|
||
move.l a6,-(sp)
|
||
addq.l #6,a6
|
||
bsr GetWord
|
||
btst #6+8,d0
|
||
beq.s VPr0
|
||
btst #5+8,d0
|
||
beq.s VPr0
|
||
tst.w Flag_Source(a5)
|
||
bne NoCode
|
||
move.l (sp),a6
|
||
subq.l #2,a6
|
||
add.l B_Source(a5),a6
|
||
bsr ProCode
|
||
VPr0 move.l (sp)+,a6
|
||
* Stocke le label et les types
|
||
bsr GetLong
|
||
subq.l #4,a6
|
||
pea 8(a6,d0.l)
|
||
pea (a6)
|
||
lea 8+2(a6),a6
|
||
moveq #-1,d7
|
||
bsr RLabel
|
||
move.l (sp)+,d0
|
||
bset #30,d0
|
||
move.l d0,2(a2)
|
||
move.l (sp)+,a6
|
||
rts
|
||
|
||
******* Proc
|
||
CPrc
|
||
addq.l #2,a6
|
||
******* Appel de procedure
|
||
CDoPro
|
||
bsr OutLea
|
||
subq.l #2,a6
|
||
move.l a6,-(sp)
|
||
bsr StockOut
|
||
moveq #-1,d7
|
||
bsr GetLabel
|
||
bsr RestOut
|
||
moveq #0,d7
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
cmp.w #TkBra1-Tk,d0
|
||
bne.s CDop3
|
||
addq.l #2,a6
|
||
CDop1 lsl.l #1,d7
|
||
move.l d7,-(sp)
|
||
bsr Evalue
|
||
move.l (sp)+,d7
|
||
cmp.b #1,d2
|
||
bne.s CDop2
|
||
bset #0,d7
|
||
CDop2 bsr GetWord
|
||
cmp.w #TkBra2-Tk,d0
|
||
bne.s CDop1
|
||
CDop3 move.l a6,d0
|
||
move.l (sp),a6
|
||
move.l d0,(sp)
|
||
move.l d7,-(sp)
|
||
moveq #-1,d7
|
||
bsr GetLabel
|
||
lea CdDop(pc),a0
|
||
move.w (a0)+,d0
|
||
bsr OutWord
|
||
addq.l #4,a0
|
||
move.l (sp)+,d0
|
||
bsr OutLong
|
||
bsr OutCode
|
||
move.l (sp)+,a6
|
||
rts
|
||
CdDop move.l #0,d6
|
||
jsr (a0)
|
||
dc.w $4321
|
||
******* POP PROC
|
||
CPopP moveq #L_FProc,d0
|
||
bra CreJmp
|
||
|
||
;----------------------> FOR / TO / NEXT
|
||
CFor
|
||
bsr OutLea
|
||
; Prend et egalise la variable
|
||
bsr GetWord ; Teste?
|
||
beq Synt
|
||
pea -2(a6,d0.w) ; Adresse du NEXT
|
||
addq.l #2,a6
|
||
move.l a6,-(sp)
|
||
bsr StockOut ; Saute la variable
|
||
bsr IVarBis
|
||
bsr RestOut
|
||
and.w #$0F,d2
|
||
move.w d2,-(sp) ; Sauve le type
|
||
; Compile le TO
|
||
addq.l #2,a6
|
||
bsr Evalue
|
||
move.w (sp),d1
|
||
bsr EqType ; Egalise les types
|
||
; Compile le STEP
|
||
move.w #-1,Flag_Const(a5)
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
cmp.w #TkStp-Tk,d0
|
||
bne.s CFor3
|
||
addq.l #2,a6
|
||
bsr Evalue ; va chercher le STEP
|
||
bra.s CFor4
|
||
CFor3 lea ForCd1(pc),a0
|
||
bsr OutCode
|
||
moveq #1,d3
|
||
moveq #0,d2
|
||
CFor4 move.w (sp),d1
|
||
bsr EqType ; Egalise les type TO / STEP
|
||
move.l d3,-(sp)
|
||
; Compile la variable
|
||
move.l 4+2(sp),d0
|
||
move.l a6,4+2(sp)
|
||
move.l d0,a6
|
||
bsr IVarBis
|
||
bsr AdToA0
|
||
move.l 4+2(sp),a6
|
||
; Adresse des adresses
|
||
move.w M_ForNext(a5),d1
|
||
lea forcd2(pc),a0
|
||
bsr RForNxt
|
||
bsr OutCode
|
||
; Fonction de demarrage de la boucle
|
||
moveq #0,d7
|
||
tst.w Flag_Const(a5)
|
||
beq.s CForPaR
|
||
tst.w 4(sp)
|
||
bne.s CForPar
|
||
moveq #-1,d7
|
||
CForPaR
|
||
; Poke les tables du compilateur
|
||
move.l A_Bcles(a5),a1
|
||
move.w d7,(a1)+ ; 0 Flag rapide
|
||
move.w 4(sp),(a1)+ ; 2 Type
|
||
move.l (sp),(a1)+ ; 4 Step
|
||
move.l a4,(a1)+ ; 8 -6 Adresse dans le programme
|
||
move.w M_ForNext(a5),(a1)+ ; 12 Position de la boucle
|
||
move.w #16,(a1)+ ; 14 -2 Taille FOR/NEXT
|
||
move.l a1,A_Bcles(a5)
|
||
; Un FOR/NEXT de plus!
|
||
add.w #12,M_ForNext(a5)
|
||
addq.w #1,N_Bcles(a5)
|
||
lea 14(sp),sp
|
||
rts
|
||
forcd1: move.l #$1,-(a3)
|
||
dc.w $4321
|
||
forcd2: move.l AForNext(a5),a2
|
||
lea 0(a2),a2
|
||
move.l (a3)+,(a2)+
|
||
move.l (a3)+,(a2)+
|
||
move.l a0,(a2)
|
||
dc.w $4321
|
||
|
||
;-----------------------------------> NEXT
|
||
CNext:
|
||
bsr OutLea
|
||
bsr CTests
|
||
; Saute la variable
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
cmp.w #TkVar-Tk,d0
|
||
bne.s CNx0
|
||
addq.l #2,a6
|
||
bsr SoVar
|
||
; Depile la boucle
|
||
CNx0 move.l A_Bcles(a5),a1
|
||
sub.w -2(a1),a1
|
||
move.w 12(a1),d1 * P_FORNEXT
|
||
tst.w (a1)
|
||
beq.s CNx2
|
||
; Une boucle "rapide"
|
||
lea CdNx(pc),a0
|
||
bsr RForNxt
|
||
bsr OutCode
|
||
move.w CBgtS(pc),d7
|
||
swap d7
|
||
move.w CBle(pc),d7
|
||
tst.l 4(a1)
|
||
bmi.s CNx1
|
||
move.w CBltS(pc),d7
|
||
swap d7
|
||
move.w CBge(pc),d7
|
||
CNx1 moveq #0,d5
|
||
move.l 8(a1),d6
|
||
bsr DoTest
|
||
bra.s CNxX
|
||
* Boucle lente
|
||
CNx2 lea CdNx(pc),a0
|
||
bsr RForNxt
|
||
move.w CLeaa1(pc),d7
|
||
swap d7
|
||
move.w CLeapca1(pc),d7
|
||
move.l 8(a1),d6
|
||
moveq #0,d5
|
||
bsr DoLea
|
||
moveq #L_NextE,d0
|
||
tst.w 2(a1)
|
||
beq.s CNx6
|
||
moveq #L_NextF,d0
|
||
CNx6 bsr CreFonc
|
||
* Fin de la boucle
|
||
CNxX bra UnPile
|
||
; Routine
|
||
RForNxt move.l (a0)+,d0
|
||
bsr OutLong
|
||
tst.w d1
|
||
beq.s .Skip1
|
||
move.w (a0),d0
|
||
bsr OutWord
|
||
move.w d1,d0
|
||
bsr OutWord
|
||
.Skip1 addq.l #4,a0
|
||
rts
|
||
; Code RAPIDE
|
||
CdNx move.l AForNext(a5),a2
|
||
lea 0(a2),a2
|
||
move.l (a2)+,d0
|
||
move.l (a2)+,d1
|
||
move.l (a2),a2
|
||
add.l d0,(a2)
|
||
cmp.l (a2),d1
|
||
dc.w $4321
|
||
|
||
;------------------------------> REPEAT / UNTIL
|
||
CDo
|
||
CRepeat move.l A_Bcles(a5),a1
|
||
move.l a4,(a1)+ ; 0 6 Adresse boucle
|
||
bsr GetWord
|
||
beq Synt
|
||
lea -2(a6,d0.w),a0
|
||
move.w #6,(a1)+
|
||
move.l a1,A_Bcles(a5)
|
||
addq.w #1,N_Bcles(a5)
|
||
rts
|
||
CUntil
|
||
bsr OutLea
|
||
bsr CTests
|
||
bsr Evalue
|
||
lea CdUntil(pc),a0
|
||
bsr OutCode
|
||
move.l A_Bcles(a5),a1
|
||
move.w CBne8(pc),d7
|
||
swap d7
|
||
move.w CBeq(pc),d7
|
||
move.l -6(a1),d6
|
||
moveq #0,d5
|
||
bsr DoTest
|
||
bra UnPile
|
||
CdWhile
|
||
CdUntil tst.l (a3)+
|
||
dc.w $4321
|
||
|
||
;------------------------------> LOOP
|
||
CLoop
|
||
bsr OutLea
|
||
bsr CTests
|
||
moveq #0,d5
|
||
move.l A_Bcles(a5),a1
|
||
move.l -6(a1),d6
|
||
bsr DoBra
|
||
bra UnPile
|
||
|
||
;------------------------------> WHILE / WEND
|
||
CWhile
|
||
bsr GetWord
|
||
beq Synt
|
||
; Retour du WEND
|
||
move.l A_Bcles(a5),a1
|
||
move.l a6,(a1)+
|
||
move.w CJmp(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
addq.l #4,a4
|
||
move.l a4,(a1)+
|
||
move.w #10,(a1)+
|
||
move.l a1,A_Bcles(a5)
|
||
addq.w #1,N_Bcles(a5)
|
||
; Saute l'expression
|
||
bsr StockOut
|
||
bsr Evalue
|
||
bsr RestOut
|
||
rts
|
||
|
||
CWend
|
||
bsr OutLea
|
||
bsr CTests
|
||
move.l A_Bcles(a5),a1
|
||
; Reloge le JMP du debut
|
||
move.l a4,-(sp)
|
||
move.l a4,d0
|
||
move.l -6(a1),a4
|
||
subq.l #4,a4
|
||
bsr OutLong
|
||
move.l (sp)+,a4
|
||
; Evalue l'expression
|
||
movem.l a1/a6,-(sp)
|
||
move.l -10(a1),a6
|
||
bsr Expentier
|
||
movem.l (sp)+,a1/a6
|
||
move.w Ctsta3p(pc),d0
|
||
bsr OutWord
|
||
; Met le branchement
|
||
moveq #0,d5
|
||
move.l -6(a1),d6
|
||
move.w CBeq8(pc),d7
|
||
swap d7
|
||
move.w CBne(pc),d7
|
||
bsr DoTest
|
||
bra UnPile
|
||
|
||
;------------------------------> EXIT / EXIT IF
|
||
CExitIf
|
||
bsr OutLea
|
||
bsr GetWord
|
||
move.w d0,d1
|
||
beq Synt
|
||
bsr GetWord
|
||
beq Synt
|
||
pea 0(a6,d1.w)
|
||
bsr Expentier
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
cmp.w #TkVir-Tk,d0
|
||
bne.s CEIf0
|
||
addq.l #2+6,a6
|
||
CEIf0 move.w Ctsta3p(pc),d0
|
||
bsr OutWord
|
||
move.l (sp)+,d5
|
||
moveq #0,d6
|
||
move.w Cbeq8(pc),d7
|
||
swap d7
|
||
move.w Cbne(pc),d7
|
||
bsr DoTest
|
||
rts
|
||
CExit
|
||
bsr GetWord
|
||
move.w d0,d1
|
||
beq Synt
|
||
bsr GetWord
|
||
beq Synt
|
||
lea 0(a6,d1.w),a0
|
||
move.l a0,d5
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
cmp.w #TkEnt-Tk,d0
|
||
bne.s Cexi1
|
||
addq.l #6,a6
|
||
Cexi1 moveq #0,d6
|
||
bsr DoBra
|
||
rts
|
||
|
||
;------------------------------> IF / THEN / ELSE
|
||
CIf
|
||
bsr OutLea
|
||
bsr GetWord
|
||
beq Synt
|
||
pea 0(a6,d0.w)
|
||
bsr Expentier
|
||
CIf0
|
||
move.w Ctsta3p(pc),d0
|
||
bsr OutWord
|
||
move.l (sp)+,d5
|
||
moveq #0,d6
|
||
move.w CBne8(pc),d7
|
||
swap d7
|
||
move.w CBeq(pc),d7
|
||
bsr DoTest
|
||
rts
|
||
|
||
CElse
|
||
bsr GetWord
|
||
beq Synt
|
||
lea 0(a6,d0.w),a0
|
||
move.l a0,d5
|
||
moveq #0,d6
|
||
bsr DoBra
|
||
rts
|
||
|
||
******* DEUX POINTS
|
||
CIDP subq.w #1,NbInstr(a5)
|
||
CINop rts
|
||
|
||
;-------------------------------------> GOTO / LABELS
|
||
|
||
;-----> LABEL:
|
||
CLabel
|
||
move.w N_Proc(a5),d7
|
||
bsr RLabel
|
||
tst.l 2(a2)
|
||
bpl Synt
|
||
move.l a4,2(a2)
|
||
rts
|
||
|
||
;-----> GOTO
|
||
CLGoto
|
||
subq.l #2,a6
|
||
CGoto
|
||
bsr OutLea
|
||
bsr CTests
|
||
move.w N_Proc(a5),d7
|
||
bsr GetLabel
|
||
CGoto1 move.w Cjmpa0(pc),d0
|
||
bra OutWord
|
||
;-----> THEN ligne
|
||
CGoto2
|
||
bsr OutLea
|
||
bsr CTests
|
||
bsr CGlab1
|
||
bra.s CGoto1
|
||
|
||
;-----> EVERY n GOSUB / PROC
|
||
CEvery
|
||
bsr Expentier
|
||
bsr GetWord
|
||
cmp.w #TkPrc-Tk,d0
|
||
beq.s CEv1
|
||
; Every GOSUB
|
||
move.w N_Proc(a5),d7
|
||
bsr GetLabel
|
||
move.w #L_EvGosub,d0
|
||
bra CreFonc
|
||
; Every PROC
|
||
CEv1 moveq #-1,d7
|
||
bsr GetLabel
|
||
move.w #L_EvProc,d0
|
||
bra CreFonc
|
||
|
||
;-----> GOSUB
|
||
CGosub
|
||
bsr OutLea
|
||
bsr CTests
|
||
move.w N_Proc(a5),d7
|
||
bsr GetLabel
|
||
lea CdGsb(pc),a0
|
||
bra OutCode
|
||
CdGsb: lea -4(sp),a1
|
||
move.l a1,LowPile(a5)
|
||
jsr (a0)
|
||
dc.w $4321
|
||
;-----> RETURN
|
||
CReturn
|
||
bsr OutLea
|
||
bsr CTests
|
||
moveq #L_Return,d0
|
||
bra CreJmp
|
||
;-----> POP
|
||
CPop
|
||
bsr OutLea
|
||
bsr CTests
|
||
moveq #L_Pop,d0
|
||
bra CreFonc
|
||
|
||
;-----> ON exp GOTO / GOSUB
|
||
COn
|
||
bsr OutLea
|
||
bsr CTests
|
||
bsr GetWord
|
||
beq Synt
|
||
lea 2(a6,d0.w),a1
|
||
bsr GetWord
|
||
move.w d0,-(sp)
|
||
beq Synt
|
||
move.l a1,-(sp)
|
||
bsr Expentier
|
||
bsr GetWord
|
||
move.w d0,-(sp)
|
||
lea CdOn(pc),a0
|
||
move.w (a0)+,d0
|
||
move.b 6+1(sp),d0
|
||
bsr OutWord
|
||
bsr OutCode
|
||
move.w N_Proc(a5),d7
|
||
move.w (sp)+,d0
|
||
cmp.w #TkGsb-Tk,d0
|
||
beq.s COn1
|
||
cmp.w #TkPrc-Tk,d0
|
||
beq.s COnP
|
||
; On...Goto
|
||
move.w Cjmpa0(pc),d0
|
||
bra.s COnP1
|
||
; On...Gosub
|
||
COn1 lea CdGsb(pc),a0
|
||
bsr OutCode
|
||
bra.s COn2
|
||
; On...Proc
|
||
COnP moveq #-1,d7
|
||
move.w Cjsra0(pc),d0
|
||
COnP1 bsr OutWord
|
||
move.w CNop(pc),d0
|
||
bsr OutWord
|
||
bsr OutWord
|
||
bsr OutWord
|
||
bsr OutWord
|
||
; Bra final
|
||
COn2 move.w CBra(pc),d0
|
||
move.l a4,d4
|
||
move.l (sp)+,d5
|
||
bsr OutWord
|
||
addq.l #2,a4
|
||
bsr MarkAd
|
||
; Met les labels
|
||
move.w (sp),d0
|
||
move.l a4,-(sp)
|
||
move.l a4,-(sp)
|
||
lsl.w #1,d0
|
||
add.w d0,a4
|
||
COn3 move.l a4,d0
|
||
move.l a4,d4
|
||
move.l (sp),a4
|
||
sub.l 4(sp),d0
|
||
bsr OutWord
|
||
addq.l #2,(sp)
|
||
move.l d4,a4
|
||
bsr GetLabel
|
||
move.w CRts(pc),d0
|
||
bsr OutWord
|
||
addq.l #2,a6
|
||
subq.w #1,8(sp)
|
||
bne.s COn3
|
||
; Ouf!
|
||
subq.l #2,a6
|
||
lea 10(sp),sp
|
||
rts
|
||
CdOn moveq #0,d1
|
||
move.l (a3)+,d0
|
||
beq.s CdOn1+10
|
||
cmp.l d1,d0
|
||
bhi.s CdOn1+10
|
||
lsl.w #1,d0
|
||
move.w CdOn1+10+4-2(pc,d0.w),d0
|
||
jsr CdOn1+10+4(pc,d0.w)
|
||
CdOn1 dc.w $4321
|
||
|
||
|
||
******* ON ERROR
|
||
COnErr bsr OutLea
|
||
move.w #L_OnErr0,d1
|
||
bsr GetWord
|
||
cmp.w #TkPrc-Tk,d0
|
||
beq.s CerP
|
||
cmp.w #TkGto-Tk,d0
|
||
bne.s Cer0
|
||
* On error GOTO
|
||
move.l a6,-(sp)
|
||
bsr GetWord
|
||
cmp.w #TkEnt-Tk,d0
|
||
bne.s CerG
|
||
bsr GetLong
|
||
tst.l d0
|
||
bne.s CerG
|
||
addq.l #4,sp
|
||
bra.s Cer1
|
||
CerG move.l (sp)+,a6
|
||
move.w N_Proc(a5),d7
|
||
bsr GetLabel
|
||
move.w #L_OnErr1,d0
|
||
bra CreFonc
|
||
* On error PROC
|
||
CerP moveq #-1,d7
|
||
bsr GetLabel
|
||
move.w #L_OnErr2,d0
|
||
bra CreFonc
|
||
* On error RIEN
|
||
Cer0 subq.l #2,a6
|
||
Cer1 move.w #L_OnErr0,d0
|
||
bra CreFonc
|
||
|
||
******* RESUME
|
||
CRes bsr OutLea
|
||
bsr Finie
|
||
subq.l #2,a6
|
||
beq.s CRes0
|
||
move.w N_Proc(a5),d7
|
||
bsr GetLabel
|
||
move.w #L_Res1,d0
|
||
bra CreJmp
|
||
CRes0 move.w #L_Res0,d0
|
||
bra CreJmp
|
||
|
||
******* RESUME LABEL
|
||
CResL bsr OutLea
|
||
bsr Finie
|
||
subq.l #2,a6
|
||
beq.s CResl0
|
||
move.w N_Proc(a5),d7
|
||
bsr GetLabel
|
||
move.w #L_Resl1,d0
|
||
bra CreFonc
|
||
Cresl0 move.w #L_Resl0,d0
|
||
bra CreFonc
|
||
|
||
* ROUTINE -> adresse d'un label
|
||
* OUT >>> lea label,a0
|
||
* Retour VRAI si FIXE / FAUX si variable
|
||
GetLabel
|
||
bsr GetWord
|
||
cmp.w #TkLGo-Tk,d0
|
||
beq Cglab1
|
||
cmp.w #TkPro-Tk,d0
|
||
beq Cglab1
|
||
; Expression
|
||
subq.w #2,a6
|
||
addq.w #1,Flag_Labels(a5) ; Copier la table!
|
||
move.w #-1,Flag_Const(a5)
|
||
bsr StockOut
|
||
move.w d7,-(sp)
|
||
bsr Evalue
|
||
move.w (sp)+,d7
|
||
moveq #L_GetLabA,d1
|
||
cmp.b #2,d2
|
||
beq Glab0a
|
||
tst.b d2
|
||
beq.s Glab0
|
||
bsr FlToInt
|
||
Glab0 moveq #L_GetLabE,d1
|
||
tst.w Flag_Const(a5)
|
||
bne.s Clab0b
|
||
; Expression variable!
|
||
Glab0a bsr SautOut
|
||
move.w Cmviwd6(pc),d0
|
||
bsr OutWord
|
||
move.w N_Proc(a5),d0
|
||
bsr OutWord
|
||
move.w d1,d0
|
||
bra CreFonc
|
||
; Numero de ligne FIXE
|
||
Clab0b subq.w #1,Flag_Labels(a5)
|
||
bsr RestOut
|
||
move.l d3,d0
|
||
moveq #-1,d3
|
||
moveq #0,d4
|
||
move.l B_Work(a5),a2
|
||
move.l a2,a0
|
||
bsr HexToAsc
|
||
move.l a0,a1
|
||
move.l a1,d6
|
||
btst #0,d6
|
||
beq.s Clab0c
|
||
clr.b (a1)+
|
||
addq.l #1,d6
|
||
Clab0c sub.l a2,d6
|
||
move.w d6,d5
|
||
lsr.w #1,d5
|
||
bsr CLabBis
|
||
bra.s Cglab0
|
||
; Label simple
|
||
Cglab1 bsr RLabel
|
||
Cglab0 move.w CLeaa0(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
move.l a2,d0
|
||
bset #BitLabel,d0
|
||
bra OutLong
|
||
|
||
* ROUTINE -> Trouve / Cree / Saute le label (a6)
|
||
* Entree D7= Numero procedure
|
||
* Retour A2= Label
|
||
RLabel
|
||
addq.l #2,a6
|
||
moveq #0,d0
|
||
bsr GetWord
|
||
lsr.w #8,d0
|
||
move.w d0,d6
|
||
lsr.w #1,d0
|
||
move.w d0,d5
|
||
move.w d0,d1
|
||
move.l B_Work(a5),a1
|
||
CLab1 bsr GetWord
|
||
move.w d0,(a1)+
|
||
subq.b #1,d1
|
||
bne.s CLab1
|
||
CLabBis move.w d7,(a1)+
|
||
addq.w #2,d6
|
||
* addq.w #1,d5 Pour DBRA!
|
||
; Recherche dans la table
|
||
move.l B_Labels(a5),a2
|
||
moveq #-6,d1
|
||
CLab3 lea 6(a2,d1.w),a2
|
||
move.w (a2),d1
|
||
beq.s CLab5
|
||
cmp.w d6,d1
|
||
bne.s CLab3
|
||
move.l B_Work(a5),a0
|
||
lea 6(a2),a1
|
||
move.w d5,d0
|
||
CLab4 cmp.w (a0)+,(a1)+
|
||
bne.s CLab3
|
||
dbra d0,CLab4
|
||
rts
|
||
; Cree le nouveau
|
||
CLab5 move.w d6,(a2)
|
||
move.l a6,d0
|
||
bset #31,d0
|
||
move.l d0,2(a2)
|
||
move.l B_Work(a5),a0
|
||
lea 6(a2),a1
|
||
CLab6 move.w (a0)+,(a1)+
|
||
dbra d5,CLab6
|
||
lea 6(a2,d6.w),a0
|
||
clr.w (a0)
|
||
rts
|
||
|
||
* ROUTINE -> Conversion HEX- > DEC
|
||
HexToAsc
|
||
tst.l d0
|
||
bpl.s Chexy
|
||
move.b #"-",(a0)+
|
||
neg.l d0
|
||
bra.s Chexz
|
||
Chexy: tst d4
|
||
beq.s Chexz
|
||
move.b #32,(a0)+
|
||
Chexz: tst.l d3
|
||
bmi.s Chexv
|
||
neg.l d3
|
||
add.l #10,d3
|
||
Chexv: move.l #9,d4
|
||
lea Cmdx(pc),a1
|
||
Chxx0: move.l (a1)+,d1 ;table des multiples de dix
|
||
move.b #$ff,d2
|
||
Chxx1: addq.b #1,d2
|
||
sub.l d1,d0
|
||
bcc.s Chxx1
|
||
add.l d1,d0
|
||
tst.l d3
|
||
beq.s Chxx4
|
||
bpl.s Chxx3
|
||
btst #31,d4
|
||
bne.s Chxx4
|
||
tst d4
|
||
beq.s Chxx4
|
||
tst.b d2
|
||
beq.s Chxx5
|
||
bset #31,d4
|
||
bra.s Chxx4
|
||
Chxx3: subq.l #1,d3
|
||
bra.s Chxx5
|
||
Chxx4: add #48,d2
|
||
move.b d2,(a0)+
|
||
Chxx5: dbra d4,Chxx0
|
||
rts
|
||
Cmdx: dc.l 1000000000,100000000,10000000,1000000
|
||
dc.l 100000,10000,1000,100,10,1,0
|
||
|
||
* ROUTINE -> BRA/JMP
|
||
* D5= adresse en AVANT
|
||
* D6= adresse en ARRIERE
|
||
DoBra move.w CJmp(pc),d7
|
||
swap d7
|
||
move.w CBra(pc),d7
|
||
* Entree pour LEA / LEA (pc)
|
||
DoLea tst.l d5
|
||
bne.s DBr2
|
||
* En arriere!
|
||
move.l d6,d1
|
||
sub.l a4,d1
|
||
subq.l #2,d1
|
||
cmp.l #32764,d1
|
||
bge.s Dbr1
|
||
cmp.l #-32764,d1
|
||
ble.s DBr1
|
||
; Ok, en SHORT!
|
||
DBr0 move.w d7,d0
|
||
bsr OutWord
|
||
move.w d1,d0
|
||
bra OutWord
|
||
; En LONG!
|
||
Dbr1 swap d7
|
||
move.w d7,d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
move.l d6,d0
|
||
bra OutLong
|
||
* En avant!
|
||
Dbr2 move.l a4,d4
|
||
tst.w Flag_Long(a5)
|
||
bne.s DBr3
|
||
; En short
|
||
Dbr4 move.w d7,d0
|
||
bsr OutWord
|
||
addq.l #2,a4
|
||
bra.s MarkAd
|
||
; En long
|
||
Dbr3 bset #31,d4
|
||
swap d7
|
||
move.w d7,d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
addq.l #4,a4
|
||
bra.s MarkAd
|
||
|
||
* ROUTINE -> TEST ET BRANCHEMENT
|
||
* D5= adresse en AVANT
|
||
* D6= adresse en ARRIERE
|
||
DoTest tst.l d5
|
||
bne.s DTst2
|
||
* En arriere!
|
||
move.l d6,d1
|
||
sub.l a4,d1
|
||
subq.l #2,d1
|
||
cmp.l #32764,d1
|
||
bge.s Dtst1
|
||
cmp.l #-32764,d1
|
||
bge.s Dbr0
|
||
; En LONG!
|
||
Dtst1 swap d7
|
||
move.w d7,d0
|
||
bsr OutWord
|
||
move.w CJmp(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
move.l d6,d0
|
||
bra OutLong
|
||
* En Avant!
|
||
DTst2 move.l a4,d4
|
||
tst.w Flag_Long(a5)
|
||
beq.s DBr4
|
||
; En long!
|
||
bset #31,d4
|
||
addq.l #2,d4
|
||
swap d7
|
||
move.w d7,d0
|
||
bsr OutWord
|
||
move.w CJmp(pc),d0
|
||
bsr OutWord
|
||
bsr RelJsr
|
||
addq.l #4,a4
|
||
|
||
* Marque la table des branch forward
|
||
MarkAd
|
||
movem.l a0/a1,-(sp)
|
||
move.l B_Lea(a5),a0
|
||
MAd1 cmp.l (a0),d5
|
||
addq.l #8,a0
|
||
bcc.s MAd1
|
||
subq.l #8,a0
|
||
; Fait une place
|
||
move.l A_Lea(a5),a1
|
||
MAd2 move.l (a1),8(a1)
|
||
move.l 4(a1),12(a1)
|
||
subq.l #8,a1
|
||
cmp.l a0,a1
|
||
bcc.s MAd2
|
||
; Poke le nouveau
|
||
move.l d5,(a0)+
|
||
move.l d4,(a0)
|
||
addq.l #8,A_Lea(a5)
|
||
movem.l (sp)+,a0/a1
|
||
rts
|
||
* ROUTINE -> Poke l'adresse d'une ligne
|
||
PokeAd move.l a4,-(sp)
|
||
move.l a4,d0
|
||
move.l B_Lea(a5),a2
|
||
move.l 4(a2),d1
|
||
bmi.s JAbs
|
||
; Branchement (pc)
|
||
addq.l #2,d1
|
||
move.l d1,a4
|
||
sub.l d1,d0
|
||
cmp.l #32764,d0
|
||
bgt ErrDoLong
|
||
cmp.l #-32764,d0
|
||
blt ErrDoLong
|
||
bsr OutWord
|
||
; Enleve de la table
|
||
ETable move.l A_Lea(a5),a1
|
||
PAd1 move.l 8(a2),(a2)+
|
||
move.l 8(a2),(a2)+
|
||
cmp.l a1,a2
|
||
bcs.s PAd1
|
||
subq.l #8,A_Lea(a5)
|
||
move.l (sp)+,a4
|
||
rts
|
||
; Branchement absolu
|
||
JAbs bclr #31,d1
|
||
addq.l #2,d1
|
||
move.l d1,a4
|
||
bsr OutLong
|
||
bra.s ETable
|
||
* ROUTINE -> Depile une boucle -> A1
|
||
UnPile move.l A_Bcles(a5),a1
|
||
sub.w -2(a1),a1
|
||
move.l a1,A_Bcles(a5)
|
||
subq.w #1,N_Bcles(a5)
|
||
rts
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Entree / Sortie
|
||
;---------------------------------------------------------------------
|
||
|
||
Lp1 lea Lp1(pc),a4 ; Debut expression
|
||
dc.w $4321
|
||
|
||
;-----> LPRINT
|
||
CLPrnt: move.w #1,-(sp)
|
||
bra.s Cp2
|
||
;-----> PRINT #
|
||
CHPrnt move.w #-1,-(sp)
|
||
bsr Expentier
|
||
addq.l #2,a6
|
||
move.w #L_HPrintD,d0
|
||
bsr CreFonc
|
||
bra.s Cp2
|
||
;-----> PRINT
|
||
CPrnt: clr.w -(sp)
|
||
; Prend les expressions
|
||
Cp2 bsr Finie
|
||
bne.s Cp3
|
||
subq.l #2,a6
|
||
moveq #L_CRPrint,d0
|
||
bsr CreFonc
|
||
bra Cp13
|
||
Cp3 lea Lp1(pc),a0
|
||
bsr OutCode
|
||
* USING: prend la chaine et marque le using
|
||
clr.w -(sp)
|
||
cmp.w #TkUsing-Tk,d0
|
||
bne.s Cp4
|
||
subq.w #1,(sp)
|
||
bsr Evalue
|
||
addq.l #4,a6
|
||
cmp.b #2,d2
|
||
bne Synt
|
||
; Prend l'expression
|
||
Cp4 subq.l #2,a6
|
||
bsr Evalue
|
||
subq.w #1,d2
|
||
bmi.s Cp5
|
||
beq.s Cp6
|
||
* Chaine
|
||
tst.w (sp)+
|
||
bne.s Cp4a
|
||
moveq #L_PrintS,d0 ; Pas using
|
||
tst.w (sp)
|
||
beq.s Cp7a
|
||
moveq #L_PrintS,d0 ; ILLEGAL!!
|
||
tst.w (sp)
|
||
bpl.s Cp7a
|
||
move.w #L_HPrintS,d0
|
||
bra.s Cp7a
|
||
cp4a moveq #L_UsingS,d0 ; Using
|
||
bra.s Cp7a
|
||
* Entier
|
||
cp5 bclr #6,2(sp)
|
||
move.w #L_PrintE,d0
|
||
bsr CreFonc
|
||
moveq #L_UsingC,d0
|
||
bra.s Cp7
|
||
* Float
|
||
cp6 bset #0,Flag_Math(a5)
|
||
bclr #6,2(sp)
|
||
moveq #L_PrintF,d0
|
||
bsr CreFonc
|
||
moveq #L_UsingC,d0
|
||
Cp7: and.w (sp)+,d0
|
||
beq.s Cp7b
|
||
Cp7a bsr CreFonc
|
||
Cp7b
|
||
; Prend le separateur
|
||
Cp8: bsr GetWord
|
||
cmp.w #TkPVir-Tk,d0
|
||
beq.s Cp13
|
||
bclr #6,(sp)
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s Cp11
|
||
subq.l #2,a6
|
||
moveq #L_PrtRet,d0
|
||
bra.s Cp12
|
||
Cp11: moveq #L_PrtVir,d0
|
||
Cp12: bsr CreFonc
|
||
|
||
; Imprime!
|
||
Cp13 moveq #L_PrintX,d0
|
||
tst.w (sp)
|
||
beq.s Cp14
|
||
moveq #L_LPrintX,d0
|
||
tst.w (sp)
|
||
bpl.s Cp14
|
||
bset #6,(sp)
|
||
bne.s Cp15
|
||
move.w #L_HPrintX,d0
|
||
Cp14 bsr CreFonc
|
||
Cp15
|
||
* Encore quelque chose a imprimer?
|
||
bsr Finie
|
||
bne Cp3
|
||
|
||
* Termine!
|
||
subq.l #2,a6
|
||
tst.w (sp)+
|
||
rts
|
||
|
||
;----------------------------------> INPUT #
|
||
CInputH
|
||
move.w #-1,-(sp)
|
||
move.w #L_InputH,-(sp)
|
||
bra.s CIn0
|
||
;----------------------------------> INPUT #
|
||
CLInputH
|
||
move.w #-1,-(sp)
|
||
move.w #L_LInputH,-(sp)
|
||
CIn0 bsr OutLea
|
||
bsr Stockout
|
||
move.l a6,-(sp)
|
||
bsr Expentier
|
||
bsr RestOut
|
||
addq.l #2,a6
|
||
bra.s CIn7
|
||
;----------------------------------> LINE INPUT
|
||
CLInput clr.w -(sp)
|
||
move.w #L_LInputC,-(sp)
|
||
bra.s CIn1
|
||
;----------------------------------> INPUT
|
||
CInput clr.w -(sp)
|
||
move.w #L_InputC,-(sp)
|
||
CIn1: bsr OutLea
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
; Saute la chaine alphanumerique
|
||
clr.l -(sp)
|
||
cmp.w #TkVar-Tk,d0
|
||
beq.s CIn7
|
||
move.l a6,(sp)
|
||
bsr Stockout
|
||
bsr Evalue
|
||
bsr RestOut
|
||
addq.l #2,a6
|
||
* Stocke la liste des variable ---> -(A3) / moveq #NB,d6
|
||
CIn7: clr.w -(sp)
|
||
CIn8: addq.l #2,a6
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
and.w #$000F,d2
|
||
lea CdInp(pc),a0
|
||
move.w (a0)+,d0
|
||
bsr OutWord
|
||
move.w d2,d0
|
||
bsr OutWord
|
||
addq.l #2,a0
|
||
move.w (a0)+,d0
|
||
bsr OutWord
|
||
addq.w #1,(sp)
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s CIn8
|
||
CIn9: subq.l #2,a6
|
||
******* Input clavier...
|
||
tst.w 8(sp)
|
||
bne.s CIn11
|
||
; Evalue la chaine
|
||
move.l 2(sp),d0
|
||
bne.s Cin10
|
||
move.w Cclrma3(pc),d0
|
||
bsr OutWord
|
||
bra.s CIn12
|
||
CIn10 move.l a6,2(sp)
|
||
move.l d0,a6
|
||
bsr Evalue
|
||
move.l 2(sp),a6
|
||
bra.s CIn12
|
||
; Evalue le fichier
|
||
CIn11 move.l 2(sp),d0
|
||
move.l a6,2(sp)
|
||
move.l d0,a6
|
||
bsr Expentier
|
||
move.l 2(sp),a6
|
||
; Moveq nombre de params
|
||
CIn12 move.w cmvqd6(pc),d0
|
||
move.w (sp)+,d1
|
||
move.b d1,d0
|
||
bsr Outword
|
||
addq.l #4,sp
|
||
; Appele la fonction
|
||
move.w (sp)+,d0
|
||
bsr CreFonc
|
||
; Un point virgule?
|
||
tst.w (sp)+
|
||
bne CInX
|
||
bsr GetWord
|
||
cmp.w #TkPVir-Tk,d0
|
||
beq.s CInX
|
||
moveq #L_CRet,d0
|
||
bsr CreFonc
|
||
subq.l #2,a6
|
||
CInX rts
|
||
|
||
CdInp move.w #$ffff,-(a3)
|
||
move.l a0,-(a3)
|
||
dc.w $4321
|
||
|
||
|
||
;-----> FIELD
|
||
CField bsr OutLea
|
||
bsr Stockout
|
||
move.l a6,-(sp)
|
||
bsr Expentier
|
||
bsr RestOut
|
||
addq.l #2,a6
|
||
clr.w -(sp)
|
||
Cfld1 addq.w #1,(sp)
|
||
bsr Expentier
|
||
addq.l #4,a6
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
move.w Cmva0ma3(pc),d0
|
||
bsr OutWord
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s CFld1
|
||
subq.l #2,a6
|
||
; Handle fichier
|
||
move.l 2(sp),d0
|
||
move.l a6,2(sp)
|
||
move.l d0,a6
|
||
bsr Expentier
|
||
move.l 2(sp),a6
|
||
; Nombre de champs
|
||
move.w Cmvqd0(pc),d0
|
||
move.w (sp)+,d1
|
||
move.b d1,d0
|
||
bsr OutWord
|
||
; Appelle la fontion
|
||
addq.l #4,sp
|
||
move.w #L_Field,d0
|
||
bra CreFonc
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; ECRANS / GRAPHIQUES
|
||
;---------------------------------------------------------------------
|
||
|
||
******* PALETTEs
|
||
CDPal move.w #L_DPal,-(sp)
|
||
bra.s CPal0
|
||
CPal move.w #L_Pal,-(sp)
|
||
CPal0 bsr OutLea
|
||
clr.w -(sp)
|
||
CPal1 addq.w #1,(sp)
|
||
bsr Expentier
|
||
bsr GetWord
|
||
cmp.w #TKVir-Tk,d0
|
||
beq.s CPal1
|
||
subq.l #2,a6
|
||
move.w CMvqd0(pc),d0
|
||
move.w (sp)+,d1
|
||
move.b d1,d0
|
||
bsr OutWord
|
||
move.w (sp)+,d0
|
||
bsr CreFonc
|
||
rts
|
||
|
||
******* FADE
|
||
CFade bsr OutLea
|
||
bsr Expentier
|
||
bsr GetWord
|
||
move.w #L_FadeN,-(sp)
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s CPal0
|
||
cmp.w #TkTo-Tk,d0
|
||
beq.s CFad1
|
||
subq.l #2,a6
|
||
move.w #L_Fade1,(sp)
|
||
bra CFadX
|
||
CFad1 move.w #L_Fade2,(sp)
|
||
bsr Expentier
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
cmp.w #TkVir-Tk,d0
|
||
bne.s CFadX
|
||
move.w #L_Fade3,(sp)
|
||
bsr FnExpentier
|
||
CFadX move.w (sp)+,d0
|
||
bra CreFonc
|
||
|
||
******* POLYLINE / POLYGON
|
||
CPoLine move.w #L_Polyl,-(sp)
|
||
bra.s CPol
|
||
CPoGone move.w #L_Pogo,-(sp)
|
||
CPol clr.l -(sp)
|
||
bsr OutLea
|
||
bsr GetWord
|
||
cmp.w #TkTo-Tk,d0
|
||
beq.s CPol1
|
||
subq.l #2,a6
|
||
move.w #-1,2(sp)
|
||
bsr Expentier
|
||
addq.l #2,a6
|
||
bsr Expentier
|
||
addq.w #1,(sp)
|
||
addq.l #2,a6
|
||
CPol1 addq.w #1,(sp)
|
||
bsr Expentier
|
||
addq.l #2,a6
|
||
bsr Expentier
|
||
bsr GetWord
|
||
cmp.w #TkTo-Tk,d0
|
||
beq.s CPol1
|
||
subq.l #2,a6
|
||
move.w Cmvqd0(pc),d0
|
||
move.w (sp)+,d1
|
||
move.b d1,d0
|
||
bsr OutWord
|
||
move.w CMvqd1(pc),d0
|
||
move.w (sp)+,d1
|
||
move.b d1,d0
|
||
bsr OutWord
|
||
move.w (sp)+,d0
|
||
bra CreFonc
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; MEMOIRE
|
||
;---------------------------------------------------------------------
|
||
|
||
******* BSET
|
||
CBset move.w #L_Bset,-(sp)
|
||
bra.s BsRout
|
||
CBclr move.w #L_Bclr,-(sp)
|
||
bra.s BsRout
|
||
CBchg move.w #L_Bchg,-(sp)
|
||
bra.s BsRout
|
||
CBtst addq.l #2,a6
|
||
move.w #L_BTst,-(sp)
|
||
bra.s BsRout
|
||
******* ROR / ROL
|
||
CRorb move.w #L_BRor,-(sp)
|
||
bra.s BsRout
|
||
CRorw move.w #L_WRor,-(sp)
|
||
bra.s BsRout
|
||
CRorl move.w #L_LRor,-(sp)
|
||
bra.s BsRout
|
||
CRolb move.w #L_BRol,-(sp)
|
||
bra.s BsRout
|
||
CRolw move.w #L_WRol,-(sp)
|
||
bra.s BsRout
|
||
CRoll move.w #L_LRol,-(sp)
|
||
******* Routine: ramene l'adresse a affecter!
|
||
BsRout bsr OutLea
|
||
move.l A_Stock(a5),-(sp)
|
||
bsr Expentier
|
||
addq.l #2,a6
|
||
bsr GetWord
|
||
cmp.w #TkVar-Tk,d0
|
||
bne.s BsR3
|
||
* Une variable
|
||
BsR1 bsr StockOut
|
||
move.l a6,-(sp)
|
||
bsr VarAdr
|
||
bsr AdToA0
|
||
bsr Finie
|
||
bne.s BsR2
|
||
subq.l #2,a6
|
||
BsR0 addq.l #4,sp
|
||
bra.s BsR4
|
||
BsR2 cmp.w #TkPar2-Tk,d0
|
||
beq.s BsR0
|
||
bsr RestOut
|
||
move.l (sp)+,a6
|
||
* Une adresse
|
||
BsR3 addq.w #1,4(sp)
|
||
subq.l #2,a6
|
||
bsr Expentier
|
||
* Fin...
|
||
BsR4 move.l (sp)+,A_Stock(a5)
|
||
move.w (sp)+,d0
|
||
bra CreFonc
|
||
|
||
******* CALL
|
||
CCall bsr OutLea
|
||
move.w Cmva3msp(pc),d0
|
||
bsr OutWord
|
||
move.l a6,-(sp)
|
||
bsr StockOut
|
||
bsr Expentier
|
||
bsr RestOut
|
||
CCal0 bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
bne.s CCal1
|
||
bsr Evalue
|
||
bra.s CCal0
|
||
CCal1 move.l (sp)+,d0
|
||
pea -2(a6)
|
||
move.l d0,a6
|
||
bsr Expentier
|
||
move.l (sp)+,a6
|
||
move.w #L_Call,d0
|
||
bsr CreFonc
|
||
move.w Cmvpspa3(pc),d0
|
||
bra OutWord
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; BOB/SPRITES et autres
|
||
;---------------------------------------------------------------------
|
||
|
||
******* Channel
|
||
CChannel
|
||
bsr OutLea
|
||
bsr Expentier
|
||
addq.l #2,a6
|
||
bsr GetWord
|
||
move.w #L_ChaSpr,d1
|
||
cmp.w #TkSpr-Tk,d0
|
||
beq.s CChaX
|
||
move.w #L_ChaBob,d1
|
||
cmp.w #TkBob-Tk,d0
|
||
beq.s CChaX
|
||
move.w #L_ChaScD,d1
|
||
cmp.w #TkScD-Tk,d0
|
||
beq.s CChaX
|
||
move.w #L_ChaScO,d1
|
||
cmp.w #TkScO-Tk,d0
|
||
beq.s CChaX
|
||
move.w #L_ChaScS,d1
|
||
cmp.w #TkScS-Tk,d0
|
||
beq.s CChaX
|
||
move.w #L_ChaRain,d1
|
||
CChaX move.w d1,-(sp)
|
||
bsr Expentier
|
||
move.w (sp)+,d0
|
||
bra CreFonc
|
||
|
||
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; MENUS
|
||
;---------------------------------------------------------------------
|
||
|
||
;-----> MENU$(,,)=
|
||
CMenu bsr OutLea
|
||
move.w #L_Imen1-1,-(sp)
|
||
bsr MPar
|
||
subq.l #2,a4
|
||
move.w d1,-(sp)
|
||
addq.l #2,a6
|
||
CMenL addq.w #1,2(sp)
|
||
bsr Evalue
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s CMenL
|
||
subq.l #2,a6
|
||
move.w Cmvqd7(pc),d0
|
||
move.w (sp)+,d1
|
||
move.b d1,d0
|
||
bsr OutWord
|
||
move.w (sp)+,d0
|
||
bra CreFonc
|
||
|
||
;-----> MENU DEL
|
||
CMnDel bsr OutLea
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
cmp.w #TkPar1-Tk,d0
|
||
beq.s CMnD1
|
||
move.w #L_MnDl0,d0
|
||
bra CreFonc
|
||
CMnD1 bsr MPar
|
||
move.w #L_MnDl1,d0
|
||
bra CreFonc
|
||
|
||
;-----> SET MENU
|
||
CSMenu bsr OutLea
|
||
move.l a6,-(sp)
|
||
bsr Stockout
|
||
bsr MPar
|
||
bsr Restout
|
||
addq.l #2,a6
|
||
bsr Expentier
|
||
addq.l #2,a6
|
||
bsr Expentier
|
||
move.l (sp),d0
|
||
move.l a6,(sp)
|
||
move.l d0,a6
|
||
bsr MPar
|
||
move.l (sp)+,a6
|
||
move.w #L_SMen,d0
|
||
bra CreFonc
|
||
|
||
;-----> Instruction flags
|
||
CXMenu
|
||
move.w #L_XMen,d0
|
||
bra.s GoFlag
|
||
CYMenu
|
||
move.w #L_YMen,d0
|
||
bra.s GoFlag
|
||
CmnBar
|
||
move.w #L_MnBa,d0
|
||
bra.s GoFlag
|
||
Cmnline
|
||
move.w #L_MnLi,d0
|
||
bra.s GoFlag
|
||
Cmntline
|
||
move.w #L_Mntl,d0
|
||
bra.s GoFlag
|
||
Cmnmove
|
||
move.w #L_Mnmv,d0
|
||
bra.s GoFlag
|
||
Cmnsta
|
||
move.w #L_Mnst,d0
|
||
bra.s GoFlag
|
||
Cmnimove
|
||
move.w #L_mnimv,d0
|
||
bra.s GoFlag
|
||
Cmnista
|
||
move.w #L_mnist,d0
|
||
bra.s GoFlag
|
||
Cmnact
|
||
move.w #L_Mnact,d0
|
||
bra.s GoFlag
|
||
Cmninact
|
||
move.w #L_Mnina,d0
|
||
bra.s GoFlag
|
||
Cmnsep
|
||
move.w #L_Mnsep,d0
|
||
bra.s GoFlag
|
||
CMnlink
|
||
move.w #L_Mnlnk,d0
|
||
bra.s GoFlag
|
||
CMnCall
|
||
move.w #L_MnCl,d0
|
||
bra.s GoFlag
|
||
CMnOnce
|
||
move.w #L_Mnncl,d0
|
||
;
|
||
GoFlag move.w d0,-(sp)
|
||
bsr OutLea
|
||
bsr MPar
|
||
move.w (sp)+,d0
|
||
bra CreFonc
|
||
|
||
;-----> MENU KEY
|
||
CMnKey bsr OutLea
|
||
move.l a6,-(sp)
|
||
bsr Stockout
|
||
bsr MPar
|
||
bsr GetWord
|
||
cmp.w #TkTo-Tk,d0
|
||
beq.s CMnk1
|
||
* MENU KEY (,,) seul
|
||
bsr SautOut
|
||
subq.l #2,a6
|
||
addq.l #4,sp
|
||
move.w #L_MnKey0,d0
|
||
bra CreFonc
|
||
* MENU KEY (,,) TO
|
||
Cmnk1 bsr RestOut
|
||
move.w #L_MnKey1,-(sp)
|
||
bsr Evalue
|
||
cmp.b #2,d2
|
||
beq.s Cmnk2
|
||
bsr DoEntier
|
||
move.w #L_MnKey2,(sp)
|
||
bsr GetWord
|
||
subq.l #2,a6
|
||
cmp.w #TkVir-Tk,d0
|
||
bne.s Cmnk2
|
||
move.w #L_MnKey3,(sp)
|
||
bsr FnExpentier
|
||
Cmnk2 move.l 2(sp),d0
|
||
move.l a6,2(sp)
|
||
move.l d0,a6
|
||
bsr MPar
|
||
move.w (sp)+,d0
|
||
bsr CreFonc
|
||
move.l (sp)+,a6
|
||
rts
|
||
|
||
;-----> ON MENU got/gosub/proc
|
||
Conmen bsr OutLea
|
||
bsr GetWord
|
||
moveq #-1,d1
|
||
move.w N_Proc(a5),d7
|
||
cmp.w #TkGto-Tk,d0
|
||
beq.s Com0
|
||
addq.l #1,d1
|
||
cmp.w #TkGsb-Tk,d0
|
||
beq.s Com0
|
||
addq.l #1,d1
|
||
moveq #-1,d7
|
||
Com0 move.w d1,-(sp)
|
||
clr.w -(sp)
|
||
Com1 addq.w #1,(sp)
|
||
bsr GetLabel
|
||
move.w Cmva0ma3(pc),d0
|
||
bsr OutWord
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s Com1
|
||
subq.l #2,a6
|
||
move.w Cmvqd0(pc),d0
|
||
move.b 3(sp),d0
|
||
bsr OutWord
|
||
move.w Cmvqd1(pc),d0
|
||
move.b 1(sp),d0
|
||
bsr OutWord
|
||
addq.l #4,sp
|
||
move.w #L_OnMen,d0
|
||
bra CreFonc
|
||
|
||
;-----> Prend les parametres menus
|
||
MPar bsr GetWord
|
||
cmp.w #TkPar1-Tk,d0
|
||
beq.s MPar1
|
||
; Une dimension
|
||
subq.l #2,a6
|
||
bsr Expentier
|
||
move.w Cmvqd7(pc),d0
|
||
bra OutWord
|
||
; Un objet de menu
|
||
MPar1 clr.w -(sp)
|
||
MPar2 addq.w #1,(sp)
|
||
bsr Expentier
|
||
bsr GetWord
|
||
cmp.w #TkVir-Tk,d0
|
||
beq.s MPar2
|
||
subq.l #2,a6
|
||
move.w Cmvqd7(pc),d0
|
||
move.w (sp)+,d1
|
||
move.b d1,d0
|
||
bra OutWord
|
||
|
||
|
||
;---------------------------------------------------------------------
|
||
BugCode btst #6,CiaaPra
|
||
bne.s BugCode1
|
||
illegal
|
||
BugCode1 dc.w $4321
|
||
|
||
* Endproc / Param
|
||
CdEproE move.l (a3)+,ParamE(a5)
|
||
CdEproF move.l (a3)+,ParamF(a5)
|
||
CdEproS move.l (a3)+,ParamC(a5)
|
||
CdParE move.l ParamE(a5),-(a3)
|
||
CdParF move.l ParamF(a5),-(a3)
|
||
CdParS move.l ParamC(a5),-(a3)
|
||
|
||
CJsr jsr $fffff0
|
||
CBsr bsr CBsr
|
||
CJmp jmp $fffff0
|
||
Cjmpa0 jmp (a0)
|
||
Cjsra0 jsr (a0)
|
||
CBra bra CBra
|
||
Cble ble Cble
|
||
Cbge bge Cbge
|
||
CbltS blt.s *+8
|
||
CbgtS bgt.s *+8
|
||
Cbeq beq CBeq
|
||
Cbeq8 beq.s *+8
|
||
Cbeq10 beq.s *+10
|
||
Cbeq12 beq.s *+12
|
||
Cbne bne CBne
|
||
Cbne8 bne.s *+8
|
||
Cbne10 bne.s *+10
|
||
Cbne12 bne.s *+12
|
||
CLea2a3a3 lea 2(a3),a3
|
||
Clea2a0a0 lea 2(a0),a0
|
||
Clea2a6a0 lea 2(a6),a0
|
||
Cleapca4 lea Cleapca4(pc),a4
|
||
CLeapca0 lea Cjsr(pc),a0
|
||
Cleapca1 lea Cjsr(pc),a1
|
||
Cleapca2 lea Cjsr(pc),a2
|
||
Cleaa0 lea $fffff0,a0
|
||
Cleaa1 lea $fffff0,a1
|
||
Cleaa2 lea $fffff0,a2
|
||
Cmv2a0ma3 move.l 2(a0),-(a3)
|
||
Cmv2a6Ma3 move.l 2(a6),-(a3)
|
||
Cmvpa0Ma3 move.l (a0),-(a3)
|
||
Cmva3msp move.l a3,-(sp)
|
||
Cmvpspa3 move.l (sp)+,a3
|
||
Cmva0ma3 move.l a0,-(a3)
|
||
Cmvi2a5 move.l #-1,2(a5)
|
||
Cmvd3ma3 move.l d3,-(a3)
|
||
Cmvima3 move.w #0,-(a3)
|
||
Cmvid1 move.l #0,d1
|
||
Cmvid5 move.l #0,d5
|
||
Cmviwd0 move.w #0,d0
|
||
Cmviwd1 move.w #0,d1
|
||
Cmviwd6 move.w #0,d6
|
||
Cmvqd0 moveq #0,d0
|
||
Cmvqd1 moveq #0,d1
|
||
Cmvqd2 moveq #0,d2
|
||
Cmvqd4 moveq #0,d4
|
||
Cmvqd6 moveq #0,d6
|
||
Cmvqd7 moveq #0,d7
|
||
CTsta3p tst.l (a3)+
|
||
Cillegal illegal
|
||
CRts rts
|
||
CClrma3 clr.l -(a3)
|
||
Cnop nop
|
||
;---------------------------------------------------------------------
|
||
Include "_TokTab.s"
|
||
;---------------------------------------------------------------------
|
||
; *** *** ** ** **** **** ** ** ** ** ** *** ***
|
||
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
|
||
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
|
||
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
|
||
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
|
||
; *** *** ** ** ** **** **** ** ** ** ** *** ***
|
||
;---------------------------------------------------------------------
|
||
; Zone de donnees
|
||
;---------------------------------------------------------------------
|
||
AMOS_Save ds.l 4
|
||
Nom_Dos dc.b "dos.library",0
|
||
Nom_Graphic dc.b "graphics.library",0
|
||
Nom_IconLib dc.b "icon.library",0
|
||
Def_Liste dc.b ":AMOS_System/Compiler_Configuration",0
|
||
HeadAMOS dc.b "AMOS Basic "
|
||
SOMA dc.b "SOMA.",0
|
||
_C.AMOS dc.b "_C.AMOS",0
|
||
Mes_DError dc.b "Could not load .ENV or Compiler_Configuration file.",10,0
|
||
Mes_OOfMem dc.b "Out of memory when loading Compiler_Configuration file.",10,0
|
||
even
|
||
Nom_Spr dc.b "Sprites "
|
||
Nom_Ico dc.b "Icons "
|
||
even
|
||
Mes_Return dc.b 13,10,0
|
||
|
||
IFNE CDebug
|
||
Mes_Buffers:
|
||
dc.b "Buffer work: ",0
|
||
dc.b "Buffer relocation: ",0
|
||
dc.b "Buffer object: ",0
|
||
dc.b "Buffer flags local: ",0
|
||
dc.b "Buffer flags global: ",0
|
||
dc.b "Buffer strings: ",0
|
||
dc.b "Buffer leas: ",0
|
||
dc.b "Buffer labels: ",0
|
||
dc.b "Buffer loops: ",0
|
||
dc.b "Buffer discin: ",0
|
||
dc.b "Buffer stock: ",0
|
||
dc.b 0
|
||
Mes_Bufs2 dc.b " / ",0
|
||
Mes_Bufs3 dc.b " - Free: ",0
|
||
ENDC
|
||
|
||
even
|
||
|
||
RsReset
|
||
Nom_Source rs.b 108
|
||
Nom_Objet rs.b 108
|
||
Nom_Liste rs.b 108
|
||
Nom_From rs.b 108
|
||
Nom_Messages rs.b 108
|
||
C_Pile rs.l 1
|
||
Flag_Source rs.w 1
|
||
Flag_Objet rs.w 1
|
||
Flag_AMOS rs.w 1
|
||
Flag_Errors rs.w 1
|
||
Flag_Default rs.w 1
|
||
Flag_Type rs.w 1
|
||
Flag_WB rs.w 1
|
||
Flag_Quiet rs.w 1
|
||
Flag_NoTests rs.w 1
|
||
Flag_Flash rs.w 1
|
||
PrintJSR rs.l 1
|
||
C_GfxBase rs.l 1
|
||
C_DosBase rs.l 1
|
||
C_IconBase rs.l 1
|
||
C_Icon rs.l 1
|
||
AMOS_Dz rs.l 1
|
||
|
||
OldRel rs.l 1
|
||
DebRel rs.l 1
|
||
Sa3 rs.l 1
|
||
Sa4 rs.l 1
|
||
SOldRel rs.l 1
|
||
A_Chaines rs.l 1
|
||
A_Bcles rs.l 1
|
||
A_Lea rs.l 1
|
||
A_Proc rs.l 1
|
||
N_Bcles rs.w 1
|
||
N_Proc rs.w 1
|
||
Flag_Const rs.w 1
|
||
Flag_Labels rs.w 1
|
||
Flag_Procs rs.w 1
|
||
OFlag_Labels rs.w 1
|
||
OFlag_Procs rs.w 1
|
||
Flag_Long rs.w 1
|
||
Flag_Val rs.w 1
|
||
Flag_Math rs.w 1
|
||
AdAdress rs.l 1
|
||
AdAdAdress rs.l 1
|
||
F_Proc rs.l 1
|
||
A_FlagVarL rs.l 1
|
||
L_Buf rs.l 1
|
||
P_Source rs.l 1
|
||
A_Banks rs.l 1
|
||
A_InitMath rs.l 1
|
||
A_Dfn rs.l 1
|
||
N_Dfn rs.w 1
|
||
A_Datas rs.l 1
|
||
A_ADatas rs.l 1
|
||
A_EDatas rs.l 1
|
||
A_JDatas rs.l 1
|
||
A_Stock rs.l 1
|
||
AA_Proc rs.l 1
|
||
AA_EProc rs.l 1
|
||
AA_SBuf rs.l 1
|
||
AA_Reloc rs.l 1
|
||
AA_Long rs.l 1
|
||
MaxMem rs.l 1
|
||
Pour_Cpt rs.w 1
|
||
Pour_Base rs.w 1
|
||
Pour_Pos rs.w 1
|
||
L_Reloc rs.w 1
|
||
M_ForNext rs.w 1
|
||
MM_ForNext rs.w 1
|
||
NbInstr rs.w 1
|
||
IconAMOS rs.w 1
|
||
|
||
* Source
|
||
L_Source rs.l 1
|
||
NL_Source rs.w 1
|
||
DebBso rs.l 1
|
||
FinBso rs.l 1
|
||
MaxBso rs.l 1
|
||
BordBso rs.l 1
|
||
TopSou rs.l 1
|
||
L_Bso rs.l 1
|
||
|
||
* Objet
|
||
L_Objet rs.l 1
|
||
DebBob rs.l 1
|
||
FinBob rs.l 1
|
||
MaxBob rs.l 1
|
||
TopOb rs.l 1
|
||
BordBob rs.l 1
|
||
BB_Objet_Base rs.l 1
|
||
BB_Objet rs.l 1
|
||
L_Bob rs.l 1
|
||
|
||
* Banques
|
||
N_Banks rs.w 1
|
||
|
||
* Disque
|
||
L_DiscIn rs.l 1
|
||
T_Handles rs.l M_Fichiers
|
||
P_Clib rs.l 1
|
||
T_Clib rs.l 1
|
||
MaxClibs rs.w 1
|
||
|
||
* Table des hunks
|
||
T_Hunks rs.l 24*2
|
||
|
||
* Buffers reserves
|
||
InBuf rs.l 1
|
||
InBufs rs.l 1
|
||
|
||
D_Buffers equ __Rs
|
||
B_Noms rs.l 1
|
||
B_Pointeurs rs.l 1
|
||
B_Work rs.l 1
|
||
B_Reloc rs.l 1
|
||
B_Objet rs.l 1
|
||
B_FlagVarL rs.l 1
|
||
B_FlagVarG rs.l 1
|
||
B_Chaines rs.l 1
|
||
B_Lea rs.l 1
|
||
B_Labels rs.l 1
|
||
B_Bcles rs.l 1
|
||
B_DiskIn rs.l 1
|
||
B_Stock rs.l 1
|
||
B_Source rs.l 1
|
||
BufLibs rs.l M_Libs
|
||
BufToks rs.l M_Libs
|
||
F_Buffers equ __Rs
|
||
|
||
LDZ equ __Rs
|
||
|
||
even
|
||
DZ ds.b LDZ
|
||
even
|