amos-professional/compiler/+Header.s
2020-04-26 02:58:13 +02:00

1262 lines
27 KiB
ArmAsm
Raw Permalink 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.
;
;---------------------------------------------------------------------
Include "+AMOS_Includes.s"
OPT P+
dc.w LInit
; Calcul de la taille des buffers de travail
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TBufParams equ 256
LDataWork equ 32+BbLong+12*2+(AAreaSize*5+6)+24+16+12+70*3+4+20+108+108+256+TBuffer+TBufParams
;---------------------------------------------------------------------
; *** *** ** ** **** **** ** ** ** ** ** *** ***
; ** ** ** *** *** ** ** ** ** ** **** *** *** ** ** **
; ** ** ** ** * ** ** ** ** ** ** ** ** ** * ** ** ** ***
; ** ** ** ** ** **** ** ** ****** ** ** ** ** **
; ** ** ** ** ** ** ** ** ** ** ** ** ** ** * **
; *** *** ** ** ** **** **** ** ** ** ** *** ***
;---------------------------------------------------------------------
; Entete programme objet
;---------------------------------------------------------------------
DebPrg move.l #0,d2 Les flags
move.l #0,d3 Decalage librairie
;-----> Debut normal
CliStart
lea DebPrg(pc),a4
move.l a4,Header_DebPrg-DebPrg(a4)
; Entree en cas de backstart
BackIn move.l sp,Header_Pile-DebPrg(a4)
movem.l a0/d0,-(sp)
moveq #0,d4 Pas de message!
moveq #0,d5
moveq #0,d6
move.l $4.w,a6
; Workbench?
; ~~~~~~~~~~
btst #FHead_PRun,d2 Pas si PRUN
bne.s .Cli
btst #FHead_Backed,d2 Backstart?
bne.s .Cli
sub.l a1,a1
jsr _LVOFindTask(a6)
move.l d0,a0
tst.l $ac(a0)
bne.s .Cli
lea $5c(a0),a0 Recupere le message
move.l a0,-(sp)
jsr -384(a6) WaitPort
move.l (sp)+,a0
jsr -372(a6) GetMsg
move.l d0,d4
.Cli
; Init dos.library
; ~~~~~~~~~~~~~~~~
moveq #0,d0
lea DosName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,d5
beq Abort_Panic
; Init INTUITION library
; ~~~~~~~~~~~~~~~~~~~~~~
moveq #0,d0
lea IntName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,d6
beq Abort_Panic
; Si workbench, change le directory >>> Directory du programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tst.l d4
beq.s .Cli2
move.l d4,a2
move.l $24(a2),d0
beq.s .Cli2
move.l d0,a0
move.l (a0),d1
beq.s .Cli2
move.l d5,a6
jsr _LVOCurrentDir(a6)
.Cli2
; Reserve une zone de donnees pour le header
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ReRun_Short
move.l #H_DZLong,d0 Longueur
move.l #Public|Clear,d1 Flags
lea Header_DZ(pc),a0
bsr A0_Reserve
beq Abort_Mem
move.l a0,a4
move.l d5,H_DosBase(a4)
move.l d6,H_IntBase(a4)
move.l d4,H_Message(a4)
; Preparation du programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ReRun_Normal
move.l d2,H_Flags(a4) Flags header
; 1 : programme
lea H_Load+0*8(a4),a6
bsr DecHunk
bmi Abort_Mem
move.l a1,a2 Programme >>> A2
move.l a1,H_Program(a4)
; 2 : librairies
lea H_Load+1*8(a4),a6
bsr DecHunk
bmi Abort_Mem
move.l a1,a3 Librairies >> A3
add.l a3,d3
move.l d3,H_Libraries(a4) Adresse absolue (a4)
; 3 : relocation
lea H_Load+2*8(a4),a6
bsr DecHunk
bmi Abort_Mem
bsr H_Reloc
bsr EffLastLoad
; 4-5 : amos.library + datazone + mouse.abk
btst #FHead_PRun,Head_Flags(a4) PRun?
bne .PRunne
btst #FHead_Run,Head_Flags(a4) Run?
bne .Runne
lea H_Load+3*8(a4),a6
bsr DecHunk
bmi Abort_Mem
tst.l (a1) Une librairie?
bne.s .Libhere
bsr EffLastLoad Non, on enleve de la memoire
move.l a6,-(sp) Et on charge du disque
move.l H_DosBase(a4),a6
lea LibName2(pc),a0 APSystem/amos.library
move.l a0,d1
jsr _LVOLoadSeg(a6)
tst.l d0
bne.s .Ok
lea LibName3(pc),a0 libs/amos.library
move.l a0,d1
jsr _LVOLoadSeg(a6)
tst.l d0
bne.s .Ok
lea LibName1(pc),a0 libs:amos.library
move.l a0,d1
jsr _LVOLoadSeg(a6)
.Ok move.l (sp)+,a6
move.l d0,H_WSegment(a4) Adresse du segment
lsl.l #2,d0
beq Abort_Lib
addq.l #4,d0
move.l d0,a1
.Libhere
move.l a1,a3
move.l a3,H_WAddress(a4) Adresse amos.library
; Reserve la zone de datas...
move.l #LDataWork+DataLong,d0 Longueur buffers travail
add.l 8(a3),d0 + Longueur datas W
move.l d0,d2
lea H_DataZone(a4),a0
move.l #Public|Clear,d1 Flags
bsr A0_Reserve
beq Abort_Mem
lea LDataWork(a0),a5
move.l a5,a0
add.l 8(a3),a5
move.l a5,H_DataA5(a4)
; Trouve toutes les adresses de buffers de travail
lea -32(a0),a0
move.l a0,BufLabel(a5) Buffer label expression
lea -BbLong(a0),a0
move.l a0,BufBob(a5) Buffer dessin d'un bob
lea -12*2(a0),a0
move.l a0,MnTDraw(a5) Buffer outline menus
lea -(AAreaSize*5+6)(a0),a0
move.l a0,AAreaBuf(a5) Zone pour les AREAFILL
lea -24(a0),a0
move.l a0,AAreaInfo(a5)
lea -16(a0),a0
move.l a0,BufAMSC(a5) Buffers chargement IFF
lea -12(a0),a0
move.l a0,BufCCRT(a5)
lea -70*3(a0),a0
move.l a0,BufCMAP(a5)
lea -4(a0),a0
move.l a0,BufCAMG(a5)
lea -20(a0),a0
move.l a0,BufBMHD(a5)
lea -108(a0),a0
move.l a0,DirFNeg(a5) Filtre negatif directory
lea -108(a0),a0
move.l a0,Name2(a5) Buffers nom disque
lea -256(a0),a0
move.l a0,Name1(a5)
lea -TBuffer(a0),a0
move.l a0,Buffer(a5)
move.l a0,BasA3(a5) Buffer parametres
move.l #256,d0
lea PathAct(a5),a0 Buffer du pathact
move.l #Public|Clear,d1
bsr A0_Reserve
beq Abort_Mem
; Start system function of the amos.library
move.l #"V2.0",d0 Magic
move.w #$0200,d1 Version
jsr 12(a3)
cmp.l #"W2.0",d0 Bonne version?
bne Abort_Lib
; 5 : MOUSE.ABK
lea H_Load+4*8(a4),a6
move.l #Public|Chip,d1
bsr DecHunk
bmi Abort_Mem
tst.l (a1)
bne.s .Mouse
bsr EffLastLoad
bra.s .FMouse
.Mouse move.l a1,PI_AdMouse(a5)
.FMouse bra.s .Fin45
; 4-5: RUN, on ne charge rien
.Runne bsr EffHunk Saute AMOS.library
bsr EffHunk Saute mouse.abk
.Fin45
; 6 : Recopie l'environement systeme
lea H_Load+5*8(a4),a6
bsr DecHunk Environment interpreter
bmi Abort_Mem
move.l (a1)+,d0 Taille des PI_
subq.l #1,d0
lea PI_Start(a5),a0
.Cop1 move.b (a1)+,(a0)+
dbra d0,.Cop1
move.l (a1)+,d0
lea Sys_Messages(a5),a0 Reserve les messages
move.l #Public,d1
bsr A0_Reserve
subq.l #1,d0
.Cop2 move.b (a1)+,(a0)+
dbra d0,.Cop2
bsr EffLastLoad
bra.s .PaPRun
; 4-5-6: PRUN, on saute tout!
.PRunne bsr EffHunk amos.library
bsr EffHunk mouse.abk
bsr EffHunk environment systeme
move.b #1,H_PRun(a4) Met le flag PRUN
.PaPRun
; 7 : Banque de dialogues par defaut
lea H_Load+6*8(a4),a6
bsr DecHunk
bmi Abort_Mem
; Une banque?
cmp.l #-1,(a1)
bne.s .Bk
bsr EffLastLoad
bra.s .Nobk
; Fabrique et branche la banque
.Bk lea Sys_Banks(a5),a0
move.l a0,Cur_Banks(a5)
IFNE Debug
moveq #0,d0 Si debug, empeche la copie
ENDC
bsr Get_Bank
move.l a0,Sys_Resource(a5)
.Nobk
; 8 : les messages d'erreur
lea H_Load+7*8(a4),a6
bsr DecHunk
bmi Abort_Mem
; Des messages?
move.l (a1)+,d0
beq.s .Noerr
lea Ed_RunMessages(a5),a0
move.l #Public,d1
bsr A0_Reserve
subq.w #1,d0
.Cope move.b (a1)+,(a0)+
dbra d0,.Cope
.Noerr bsr EffLastLoad
; Short-Mem run, ou first run?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
btst #FHead_Short,Head_Flags(a4)
bne.s .Short
btst #FHead_Run,Head_Flags(a4)
bne .RunMes
; First run: saisie de la ligne de commande
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
movem.l (sp)+,a0/d0
move.l Buffer(a5),a1
lea TBuffer-256-6(a1),a1
move.l #"CmdL",(a1)+
move.l a1,a2
clr.w (a1)+
; Prend le message du CLI
move.l H_Message(a4),d1
bne.s .PaCli
moveq #0,d2
subq.w #1,d0
bmi.s .FinMes
.Cl1 move.b (a0)+,d1
cmp.b #32,d1
bcs.s .Cl2
bne.s .Cl0
tst.b d2
beq.s .Cl2
.Cl0 move.b d1,(a1)+
addq.w #1,d2
.Cl2 dbra d0,.Cl1
bra.s .FinMes
.PaCli
; Prend le message du WB
move.l d1,a0
cmp.l #2,$1c(a0)
bne.s .FinMes
move.l $24(a0),d0
beq.s .FinMes
move.l d0,a0
move.l 12(a0),d0
beq.s .FinMes
move.l d0,a0
.WbL1 move.b (a0)+,(a1)+
bne.s .WbL1
subq.l #1,a1
bra.s .FinMes
; Short-mem: repoke les donn<6E>es sauvees dans la pile
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Short clr.b H_Short(a4)
; Le pathact
lea Short_Path(sp),a0
move.l PathAct(a5),a1
.Cp1 move.b (a0)+,(a1)+
bne.s .Cp1
; La ligne de commande
lea Short_Command(sp),a0
move.l Buffer(a5),a1
lea TBuffer-256-6(a1),a1
move.l #"CmdL",(a1)+
move.l a1,a2
move.w (a0)+,d0
move.w d0,(a1)+
beq.s .FinMes
subq.w #1,d0
.Cp2 move.b (a0)+,(a1)+
dbra d0,.Cp2
lea Short_Save(sp),sp Restore la pile
; Termine le message
.FinMes sub.l a2,a1
subq.l #2,a1
move.w a1,(a2)
.RunMes
; Vide les caches du 68030 / 68040
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Sys_ClearCache
; Init amos.library
; ~~~~~~~~~~~~~~~~~
btst #FHead_Run,Head_Flags(a4)
bne.s .NoAMOS
move.l $4.w,a6 Open graphics.library
moveq #0,d0
lea GfxName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,T_GfxBase(a5)
beq Abort_Mem
move.l H_IntBase(a4),T_IntBase(a5)
moveq #3,d0
bsr Sys_GetMessage
move.l a0,a3 A3= Fonte / 0
lea PI_DefEPa(a5),a2 A2= Default Palette
move.l PI_AdMouse(a5),a1 A1= Mouse.Abk
lea PI_ParaTrap(a5),a0 A0= Parametres start
move.l PI_DefAmigA(a5),d1 A1= Amiga-A
moveq #0,d0 D0= Pas d'ecran
move.l H_WAddress(a4),a6
jsr (a6)
tst.l d0
bne Abort_Mem
move.b #-1,H_WStarted(a4)
.NoAMOS
; HUNKS 9 ... : les BANQUES
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea Cmp_CurBanks(a5),a0 Banques courantes
move.l a0,Cur_Banks(a5)
lea Cmp_CurDialogs(a5),a0 Dialogues courants
move.l a0,Cur_Dialogs(a5)
move.w Prg_Flags(a4),d2 Partie haute des flags
lea H_Load+8*8(a4),a6
.Loop bsr DecHunk
bmi.s .Mem
beq.s .LoopX
IFNE Debug
moveq #1,d0 Si Debug, force la copie
ENDC
bsr Get_Bank
beq.s .Loop
.Mem bset #15,d2 Flag ABORT pour le programme!
.LoopX
; Fin de RUN
; ~~~~~~~~~~~~~~~~
move.l H_DosBase(a4),DosBase(a5)
move.l sp,BasSp(a5) Niveau FIN
subq.l #4,BasSp(a5)
move.l H_Program(a4),a0 Debut du programme
move.l BasA3(a5),a3 Buffer parametres
move.l H_Libraries(a4),a4 Base jsr(a4)
jsr (a0)
bra Abort Fin normale
bra Run_Normal Run Normal
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RUN SHORT MEMORY
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Run_Short
move.l Header_DZ(pc),a4
lea -Short_Save(sp),sp
; Sauve le nom du programme
move.l Name1(a5),a0
lea Short_Name(sp),a1
.Copy move.b (a0)+,(a1)+
bne.s .Copy
; Sauve le pathname courant
move.l PathAct(a5),a0
lea Short_Path(sp),a1
.Cop2 move.b (a0)+,(a1)+
bne.s .Cop2
; Sauve la ligne de commande
move.l Buffer(a5),a0
lea TBuffer-256-6(a0),a0
lea Short_Command(sp),a1
clr.b (a1)
cmp.l #"CmdL",(a0)+
bne.s .Cop4
move.w (a0)+,d0
move.w d0,(a1)+
beq.s .Cop4
subq.w #1,d0
.Cop3 move.b (a0)+,(a1)+
dbra d0,.Cop3
.Cop4
; Effacement de toute la m<>moire
bsr Abort_All Tout AMOS!
move.l H_Message(a4),d4 Le header
move.l H_DosBase(a4),d5
move.l H_IntBase(a4),d6
lea Header_DZ(pc),a0 La datazone!
bsr A0_Free
; Fait un flush!
moveq #4,d2 4 fois!!!
.Flush move.l #80000000,d0 Fait un flush!
move.l #Public,d1 80 megas en public!
bsr H_Ram
dbra d2,.Flush
; Charge tout le programme
lea Short_Name(sp),a0 Charge les hunks
bsr Load_Run
beq Abort_Mem
bset #FHead_Short,d2 Flags RUN-SHORT
bra ReRun_Short
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RUN NORMAL
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Run_Normal
move.l Header_DZ(pc),a4
; Enleve le programme precedent
lea H_Load+16(a4),a6
bsr EffLastLoad Les librairies
bsr EffLastLoad Le programmme
bsr Abort_Run Les banques + buffers
lea Sys_Messages(a5),a0 + les messages systeme
bsr A0_Free
; Charge le suivant
move.l Name1(a5),a0
move.l DosBase(a5),d5
bsr Load_Run
beq Abort_Mem
bset #FHead_Run,d2 Change le flag
bset #FPrg_DefRunAcc+16,d2 DEFRUNACC pour le programme
bra ReRun_Normal
; Charge tout le programme suivant, le branche sur le precedent
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Load_Run
move.l a0,d1
move.l d5,a6
jsr -150(a6)
tst.l d0
beq.s .Err
; Enleve le premier hunk (header), en recuperant les flags
lsl.l #2,d0
move.l d0,a2
move.l a2,a1
move.l -(a1),d0
move.l Header_DebPrg(pc),a0
move.l (a2)+,-4(a0) Branche apres celui-ci
move.l 2(a2),d2 Flags programme + Flags hader
move.l 2+6(a2),d3 Prend les flags
bsr H_Free
moveq #-1,d0 VRAI
.Err rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SORTIE DU PROGRAMME
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Messages d'erreur!
; ~~~~~~~~~~~~~~~~~~~~~~~~
Abort_Panic
moveq #20,d0 Rien n'est ouvert!
bra Abort_Finish
Abort_Mem
moveq #-2,d0 Out of mem
bra.s Abort
Abort_Lib
moveq #-3,d0 Cannot open amos.library
; Trouve / Copie le message d'erreur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Abort move.l d0,-(sp) Message d'erreur reel
sub.l a2,a2
move.l d0,d2
beq.s .Push
moveq #20,d2 Message d'erreur CLI= 20
cmp.w #-2,d0 Out of memory
beq.s .Mem
cmp.w #-3,d0 Cannot open amos.library
bne.s .Mess
.Lib lea NoAMOSlib(pc),a0
bra.s .Mess
.Mem lea OOfMem(pc),a0
.Mess move.l a0,d1 Un message?
beq.s .Push
tst.b (a0) Vraiment un message?
beq.s .Push
lea -256(sp),sp Copie dans la pile
move.l sp,a2
move.l sp,a1
.Copy move.b (a0)+,(a1)+
bne.s .Copy
.Push movem.l a2/d2,-(sp)
; Quelquechose d'ouvert?
move.l Header_DZ(pc),d0 Adresse de la datazone
beq.s .PMess Rien de demarre!
move.l d0,a4
; Un PRUN?
tst.b H_PRun(a4)
bne.s Abort_PRun
bsr Abort_All Va tout fermer
; Efface la zone de donnees du header
move.l H_Message(a4),d4 Prend les donnees essentielles!
move.l H_DosBase(a4),d5
move.l H_IntBase(a4),d6
lea Header_DZ(pc),a0
bsr A0_Free
; Imprime l'eventuel message d'erreur
.PMess move.l 4(sp),a0
bsr Print_Message
move.l (sp),d0
; Ferme toutes les librairies restantes
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Abort_Finish
move.l d0,d2
move.l $4.w,a6
tst.l d5 Ferme dos.library
beq.s .Skip1
move.l d5,a1
jsr _LVOCloseLibrary(a6)
.Skip1 tst.l d6
beq.s .Skip2
move.l d6,a6 Rouvre le workbench
jsr -210(a6)
move.l $4.w,a6 Ferme la librairie
move.l d6,a1
jsr _LVOCloseLibrary(a6)
.Skip2 tst.l d4
beq.s .PaMe
move.l $4.w,a6
jsr _LVOForbid(a6)
move.l d4,a1
jsr -378(a6)
.PaMe move.l d2,d0
; On sort!
move.l Header_Pile(pc),sp
rts
; Sort d'un PRUN
; ~~~~~~~~~~~~~~
Abort_PRun
bsr Abort_Run Les banques + buffers
moveq #H_NLoad,d2 Toutes les donnees chargees
lea H_Load(a4),a2
bsr Free_Memories
moveq #0,d4 Pas de message
move.l H_DosBase(a4),d5
move.l H_IntBase(a4),d6
lea Header_DZ(pc),a0 La zone de donnee header
bsr A0_Free
move.l 8(sp),d0 Reprend le message d'erreur
bra.s Abort_Finish On sort!
; Ferme toute la datazone AMOS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Abort_All
; Arrete amos.library si demarree
tst.b H_WStarted(a4)
beq.s .Pas
move.l H_WAddress(a4),a0 Stop amos.library
jsr 4(a0)
.Pas
; Enleve tout (a5) si defini
move.l H_DataA5(a4),d0
beq.s .NoDZ
move.l d0,a5
bsr Abort_Run Tout run
lea Sys_Messages(a5),a0 + messages systeme
bsr A0_Free
lea PathAct(a5),a0 + pathact
bsr A0_Free
lea H_DataZone(a4),a0 + datazone
bsr A0_Free
.NoDZ
; Enleve toutes les donnees chargee
moveq #H_NLoad,d2 Enleve tout!
lea H_Load(a4),a2
bsr Free_Memories
; Enleve amos.library si chargee
move.l H_WAddress(a4),d0
beq.s .noLib
move.l d0,a0 Stop system
jsr 16(a0)
move.l H_DosBase(a4),a6 Unloadsegment
move.l H_WSegment(a4),d1
beq.s .noLib
jsr _LVOUnLoadSeg(a6)
.noLib
; Enleve la graphics.library
move.l $4.w,a6
move.l T_GfxBase(a5),d0
beq.s .NoGFX
move.l d0,a1
jsr _LVOCloseLibrary(a6)
.NoGFX
rts
; Libere les buffers recharges par RUN
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Abort_Run
lea Ed_RunMessages(a5),a0
bsr A0_Free
move.l Sys_Resource(a5),d0
beq.s .NoRes
move.l d0,a1
lea -8*3(a1),a1
move.l 4(a1),d0
addq.l #8,d0
bsr H_Free
clr.l Sys_Resource(a5)
.NoRes rts
; Imprime le message d'erreur dans l'entree courante
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Message
; D4= WB Message
; D5= DosBase
; D6= IntBase
Print_Message
move.l a0,d7 Un message?
beq.s .Exit
tst.l d4 Wb ou CLI?
bne.s .Wb
; Sous DOS-> Message dans la fenetre courante
move.l d5,a6 Handle courant
jsr -60(a6)
move.l d0,d1
beq.s .Exit
move.l d7,a1
.Copy tst.b (a1)+
bne.s .Copy
move.b #10,-1(a1)
clr.b (a1)
move.l a1,d3
sub.l d7,d3
move.l d7,d2
jsr _LVOWrite(a6)
.Exit rts
; Sous WB-> ouvre une tchote fenetre
.Wb move.l d6,a6 IntBase
lea H_Click(pc),a0
lea H_AutoBody(pc),a1
move.l d7,12(a1)
lea H_AutoClick(pc),a3
move.l a0,12(a3)
sub.l a2,a2
sub.l a0,a0
moveq #0,d0
moveq #0,d1
move.l #560,d2
moveq #50,d3
jsr -348(a6)
rts
; Clear CPU Caches, quel que soit le systeme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sys_ClearCache
movem.l a0-a1/a6/d0-d1,-(sp)
move.l $4.w,a6
cmp.w #36,$14(a6) Si systeme 2.0
bcs.s .Exit
jsr -$27c(a6) CacheClearU
.Exit movem.l (sp)+,a0-a1/a6/d0-d1
rts
; Trouve un message configuration
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sys_GetMessage
move.l Sys_Messages(a5),a0
GetMessage
clr.w d1
addq.l #1,a0
bra.s .In
.Loop move.b (a0),d1
lea 2(a0,d1.w),a0
.In subq.w #1,d0
bgt.s .Loop
.Out move.b (a0)+,d0
rts
; Reservation memoire
; ~~~~~~~~~~~~~~~~~~~~~~~~~
H_Ram movem.l a0-a1/a6/d1,-(sp)
move.l $4.w,a6
jsr -198(a6)
movem.l (sp)+,a0-a1/a6/d1
tst.l d0
rts
H_Free movem.l a0-a1/a6/d0-d1,-(sp)
move.l $4.w,a6
jsr FreeMem(a6)
movem.l (sp)+,a0-a1/a6/d0-d1
rts
H_Copy movem.l d0-d1/a0-a1/a6,-(sp)
move.l $4.w,a6
jsr -$270(a6)
movem.l (sp)+,d0-d1/a0-a1/a6
rts
; Reserve un espace m<>moire sur (a0)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Adresse dans (a5)
; D0= Longueur
; D1= Flags
A0_Reserve
movem.l a1/d0/d2,-(sp)
move.l a0,a1
move.l d0,d2
addq.l #4,d0
bsr H_Ram
beq.s .Out
move.l d0,a0
move.l d2,(a0)+
move.l a0,(a1)
.Out movem.l (sp)+,a1/d0/d2
rts
; Efface un espace m<>moire sur (a5)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Adresse dans (a5)
A0_Free
movem.l a0/a1/d0,-(sp)
move.l (a0),d0
beq.s .Skip
clr.l (a0)
move.l d0,a1
move.l -(a1),d0
addq.l #4,d0
bsr H_Free
.Skip movem.l (sp)+,a0/a1/d0
rts
; Reloge le programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~
; A1= Table de relocation
; A2= Debut programme
; A3= Debut librairies
H_Reloc moveq #-1,d0
move.l a2,a0
.Loop moveq #0,d1
move.b (a1)+,d1
beq.s .Zero
cmp.b #1,d1
bne.s .Relo
lea 508(a0),a0
bra.s .Loop
.Zero move.l a3,a0
addq.l #1,d0
beq.s .Loop
rts
.Relo lsl.w #1,d1
add.l d1,a0
move.l (a0),d2
bmi.s .Lib
add.l a2,d2
move.l d2,(a0)
bra.s .Loop
.Lib bclr #31,d2
add.l a3,d2
move.l d2,(a0)
bra.s .Loop
;-----> Gestion des banques, A1= adresse banque
; D0 (si debug)=
Get_Bank
movem.l a2/d2-d4,-(sp)
; Une banque de sprites / icons?
cmp.l #"AmSp",(a1)
beq.s .Spr
cmp.l #"AmIc",(a1)
beq.s .Ico
; Banque simple: branche dans la liste
IFNE Debug
tst.w d0
bne.s .Debug
ENDC
; Mode normal: simple changement dans la liste
move.l Cur_Banks(a5),a0
subq.l #8,a1 Pointe le header
move.l (a1),4(a1) Longueur
subq.l #8,4(a1) Moins header Listes
move.l (a0),(a1)
move.l a1,(a0)
bsr ClrLastLoad Banque debranchee des hunks
bra .Ok
; Mode debug: recopie la banque dans une zone reservee par amos.library
IFNE Debug
.Debug move.l -8(a6),a1 Adresse banque
movem.l a0-a1/a6/d1-d2,-(sp) TypeOfMem
move.l $4.w,a6
jsr -$216(a6)
movem.l (sp)+,a0-a1/a6/d1-d2
btst #1,d0 CHIP?
bne.s .Chip
move.l -4(a6),d0
SyCall MemFast
bra.s .Suit
.Chip move.l -4(a6),d0
SyCall MemChip
.Suit beq .Error
exg.l a0,a1 Va copier la banque origine
bsr H_Copy
move.l Cur_Banks(a5),a0
move.l (a1),4(a1) Longueur
subq.l #8,4(a1)
move.l (a0),(a1)
move.l a1,(a0)
bsr EffLastLoad Efface l'origine
bra .Ok
ENDC
; Banque de sprites
.Spr moveq #1,d3
lea Head_Sprite(pc),a0
moveq #1<<Bnk_BitBob+1<<Bnk_BitData,d4
bra.s .SprIco
; Banque d'icones
.Ico moveq #2,d3
lea Head_Icon(pc),a0
moveq #1<<Bnk_BitIcon+1<<Bnk_BitData,d4
; Cree la banque
.SprIco move.l a0,-(sp)
addq.l #4,a1
move.w (a1)+,d2 Nombre de sprites
move.w d2,d0
lsl.w #3,d0 * 8
add.w #24+2+32*2,d0 + header + Palette
ext.l d0
SyCall MemFastClear
beq.s .Error
move.l a0,a2
move.l Cur_Banks(a5),a0 Branche la banque
move.l (a0),(a2)
move.l a2,(a0)
subq.l #8,d0 Moins header listes
move.l d0,4(a2)
lea 8(a2),a2 Met le header
move.l d3,(a2)+
move.w d4,(a2)+
clr.w (a2)+
move.l (sp)+,a0
move.l (a0)+,(a2)+ Copie le nom
move.l (a0)+,(a2)+
move.w d2,(a2)+ Nombre de sprites
bra.s .SIn
.SLoop move.w (a1),d0 Taille d'un sprite
mulu 2(a1),d0
mulu 4(a1),d0
beq.s .SNext
lsl.l #1,d0
add.l #10,d0
SyCall MemChip
beq.s .Error
move.l a0,(a2)
exg a0,a1
bsr H_Copy
exg a0,a1
lea -10(a1,d0.l),a1
.SNext lea 10(a1),a1
addq.l #8,a2
.SIn dbra d2,.SLoop
moveq #32-1,d0
.Pal move.w (a1)+,(a2)+
dbra d0,.Pal
bsr EffLastLoad Debranche des hunks
; Retourne l'adresse de la banque
.Ok move.l Cur_Banks(a5),a0 Retourne Start(b)
move.l (a0),a0
lea 8*3(a0),a0
moveq #0,d0
bra.s .Out
; Out of mem pendant la copie de la banque
.Error moveq #1,d0 Laisse le HUNK sur A6!
; Sortie
.Out movem.l (sp)+,a2/d2-d4
rts
; Enleve le dernier hunk de la liste
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EffHunk move.l Header_DebPrg(pc),a0
move.l -4(a0),d0
lsl.l #2,d0
move.l d0,a1 Adresse
move.l (a1),-4(a0) Detache de la liste
move.l -(a1),d0 Longueur
bra H_Free
; Decompacte et enleve de la liste le HUNK suivant le header
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A6> Liste des zones reservees
DecHunk movem.l a0/a2-a5/d2-d7,-(sp)
move.l Header_DebPrg(pc),a4
move.l -4(a4),d0
lsl.l #2,d0
beq DecEnd
move.l d0,a2
; Compacte ou non?
cmp.l #$78566467,4(a2)
beq.s DecHC
; Non compacte, met directement dans la liste delete
move.l (a2),-4(a4) Detache de la liste
move.l -(a2),d1
move.l a2,(a6)+ Poke l'adresse REELLE dans la liste
move.l d1,(a6)+ La longueur REELLE
lea 8(a2),a1
subq.l #8,d1
moveq #1,d0
bra.s DecEnd
; Hunk compacte..
DecHC move.l a2,a1
movem.l a0-a1/a6/d1-d2,-(sp) TypeOfMem
move.l $4.w,a6
jsr -$216(a6)
movem.l (sp)+,a0-a1/a6/d1-d2
and.l #$0003,d0 Enleve le flag FAST!
or.w #$0001,d0 Public mem
move.l d0,d1
move.l 8(a2),d2
move.l d2,d0
addq.l #8,d0 + Header de banque!
bsr H_Ram
bne.s .Skip
moveq #-1,d0
bra.s DecEnd
.Skip addq.l #8,d0 Saute le header
move.l d0,a1
movem.l a1/d2,-(sp) Adresses banque
movem.l a2/a4,-(sp) Infos hunks
move.l d0,d3
move.l 12(a2),d1 Longueur a decompater
move.l d1,d0
lea 16(a2),a0 Origine des data
bsr H_Copy Copie
bsr UnSquash Va decompacter
movem.l (sp)+,a1/a4 Enleve le hunk de la liste
move.l (a1),-4(a4) Detache de la liste
move.l -(a1),d0
bsr H_Free
movem.l (sp)+,a1/d1
lea -8(a1),a0
move.l d1,d0
addq.l #8,d0
move.l a0,(a6)+ Adresse reelle dans la liste
move.l d0,(a6)+ Longueur reelle
move.l d0,(a0)
clr.l 4(a0) Faux header de chunk
moveq #1,d0 Pas d'erreur!
DecEnd movem.l (sp)+,a0/a2-a5/d2-d7
tst.l d0 1= Ok existe / 0= termine / -1= out of mem!
rts
; Enleve le dernier pointeur de la liste (a6)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EffLastLoad
movem.l a1/d0,-(sp)
move.l -(a6),d0
clr.l (a6)
move.l -(a6),a1
clr.l (a6)
bsr H_Free
movem.l (sp)+,a1/d0
rts
; Efface de la liste le dernier pointeur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ClrLastLoad
clr.l -(a6)
clr.l -(a6)
rts
; Libere les buffers de chargement
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Free_Memories
subq.w #1,d2
.Loop move.l (a2),d0
beq.s .Skip
move.l d0,a1
move.l 4(a2),d0
beq.s .Skip
bsr H_Free
.Skip addq.l #8,a2
dbra d2,.Loop
rts
**********************************
*Entry
*
* D3 Address
* D1 Length
* D0 1 Unsquash
*
*Exit
* D3 Unsquashed Length positive
* or
* Error negative:-
* -1 Check on data bad!
* -2 Unsquasher was going to overwrite
* memory that was out of bounds!
UnSquash:
MOVE.L D3,D0
ADD.L D0,D1
MOVEA.L D1,A0
MOVEA.L D0,A1
MOVEA.L -(A0),A2
move.l a2,d7
ADDA.L A1,A2
MOVE.L -(A0),D5
MOVE.L -(A0),D0
EOR.L D0,D5
L22446E
;Flish nop Place pour le FLASH
; nop
; nop
LSR.L #1,D0
BNE.S L224476
BSR L2244E8
L224476 BCS.S L2244AE
MOVEQ #8,D1
MOVEQ #1,D3
LSR.L #1,D0
BNE.S L224484
BSR L2244E8
L224484 BCS.S L2244D4
MOVEQ #3,D1
CLR.W D4
L22448A BSR L2244F4
MOVE.W D2,D3
ADD.W D4,D3
L224492 MOVEQ #7,D1
L224494 LSR.L #1,D0
BNE.S L22449A
BSR.S L2244E8
L22449A ROXL.L #1,D2
DBF D1,L224494
cmp.l a1,a2
ble.b bad_squash_mem
MOVE.B D2,-(A2)
DBF D3,L224492
BRA.S L2244E0
L2244A8 MOVEQ #8,D1
MOVEQ #8,D4
BRA.S L22448A
L2244AE MOVEQ #2,D1
BSR.S L2244F4
CMP.B #2,D2
BLT.S L2244CA
CMP.B #3,D2
BEQ.S L2244A8
MOVEQ #8,D1
BSR.S L2244F4
MOVE.W D2,D3
MOVE.W #$C,D1
BRA.S L2244D4
L2244CA MOVE.W #9,D1
ADD.W D2,D1
ADDQ.W #2,D2
MOVE.W D2,D3
L2244D4 BSR.S L2244F4
L2244D6 SUBQ.W #1,A2
cmp.l a1,a2
blt.b bad_squash_mem
MOVE.B 0(A2,D2.W),(A2)
DBF D3,L2244D6
L2244E0 CMPA.L A2,A1
BLT L22446E
tst.l d5
beq.b check_ok
moveq.l #-1,d3
rts
check_ok:
move.l d7,d3
RTS
bad_squash_mem:
moveq.l #-2,d3
rts
L2244E8 MOVE.L -(A0),D0
EOR.L D0,D5
MOVE.B #$10,CCR
ROXR.L #1,D0
RTS
L2244F4 SUBQ.W #1,D1
CLR.W D2
L2244F8 LSR.L #1,D0
BNE.S L224506
MOVE.L -(A0),D0
EOR.L D0,D5
MOVE.B #$10,CCR
ROXR.L #1,D0
L224506 ROXL.L #1,D2
DBF D1,L2244F8
RTS
Header_DZ dc.l 0
Header_DebPrg dc.l 0
Header_Pile dc.l 0
RsReset
H_Flags rs.l 1
Prg_Flags equ H_Flags
Head_Flags equ H_Flags+3
H_DosBase rs.l 1
H_IntBase rs.l 1
H_WAddress rs.l 1
H_WSegment rs.l 1
H_Message rs.l 1
H_Program rs.l 1
H_Libraries rs.l 1
H_DataZone rs.l 1
H_DataA5 rs.l 1
H_WStarted rs.b 1
H_Short rs.b 1
H_PRun rs.b 1
rs.b 1
H_Load rs.l 12*2
H_DZLong equ __RS
H_NLoad equ 12
; Definition du petit requester
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
H_AutoBody dc.b 2,0
dc.w 1
dc.w 8,7
dc.l 0
dc.l 0
dc.l 0
H_AutoClick dc.b 0,1
dc.w 1
dc.w 5,4
dc.l 0
dc.l 0
dc.l 0
H_Click dc.b " Cancel ",0
even
DosName dc.b "dos.library",0
IntName dc.b "intuition.library",0
GfxName dc.b "graphics.library",0
OOfMem dc.b "Out of memory.",0
NoAMOSlib dc.b "Cannot open AMOS.library (V2.00 or over).",0
LibName1 dc.b "Libs:AMOS.library",0
LibName2 dc.b "APSystem/AMOS.library",0
LibName3 dc.b "Libs/AMOS.library",0
even
Head_Sprite dc.b "Sprites ",0
Head_Icon dc.b "Icons ",0
even
FInit
LInit equ FInit-DebPrg