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

6679 lines
121 KiB
ArmAsm
Raw Blame History

;---------------------------------------------------------------------
;
; 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