amos-professional/+B.s

2986 lines
68 KiB
ArmAsm
Raw Permalink Blame History

; ______________________________________________________________________________
; ..............................................................................
; ...................................................................2222222....
; ................................................................22222222220...
; ...................................................222........222222.....222..
; ..............................................2202222222222..22000............
; ..................................22000.....20222222222200000200002...........
; .................................2002202...2222200222.220000000200000000022...
; ....................220002......22222200..2200002.......2200000...20000000000.
; ....................22222202....2220000022200000..........200002........200000
; .....200000.........2222200000222200220000000002..........200002........20000.
; .....00222202........2220022000000002200002000002........2000002000020000000..
; ....2222200000.......220002200000002.2000000000000222222000000..2000000002....
; ....220000200002......20000..200002..220000200000000000000002.......22........
; ...2220002.220000 2....220002...22.....200002..0000000000002...................
; ...220000..222000002...20000..........200000......2222........................
; ...000000000000000000..200000..........00002..................................
; ..220000000022020000002.200002.........22.......______________________________
; ..0000002........2000000220022.................|
; .200000............2002........................| AMOSPro Version 2
; .200002........................................| Loader general
; 220002.........................................|______________________________
; ______________________________________________________________________________
;
; Published under the MIT Licence
;
; Copyright (c) 1992 Europress Software
; Copyright (c) 2020 Francois Lionet
;
; Permission is hereby granted, free of charge, to any person
; obtaining a copy of this software and associated documentation
; files (the "Software"), to deal in the Software without
; restriction, including without limitation the rights to use,
; copy, modify, merge, publish, distribute, sublicense, and/or
; sell copies of the Software, and to permit persons to whom the
; Software is furnished to do so, subject to the following
; conditions:
;
; The above copyright notice and this permission notice shall be
; included in all copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
; EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
; OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
; NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
; HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
; WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
; ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
; THE USE OR OTHER DEALINGS IN THE SOFTWARE.
;
; ______________________________________________________________________________
;
Include "+AMOS_Includes.s"
Include "+Version.s"
; ______________________________________________________________________________
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ROUTINES DE FIN / ROUTINES INTERNES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SECTION "E",CODE
; - - - - - - - - - - - - -
Hunk_1 jmp Cold_Start
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; FIN DE L'INITIALISATION : ENLEVE LE HUNK INIT!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Init_Fin
; - - - - - - - - - - - - -
; Enleve le hunk init
; ~~~~~~~~~~~~~~~~~~~
lea Hunk_1-8(pc),a0
lea Hunk_2-8,a1
move.l 4(a1),4(a0) Deconnecte le hunk 2
move.l (a1),d0 Libere la memoire
move.l $4.w,a6
jsr _LVOFreeMem(a6)
; Ouvre une structure programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l PI_DefSize(a5),d0 Structure programme
JJsr L_Prg_NewStructure
move.l d0,a6
beq TheEnd_OOMem
; Charge AUTOEXEC.AMOS ou le programme voulu
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
moveq #-2,d0 Pas d'ecran de fond
JJsr L_Prg_New
moveq #-1,d0 Toujours adapter
JJsr L_Prg_Load
bne .NoProg
moveq #-1,d0 Semi Init Graphique
lea RunErr_RunOnly,a1 En cas d'erreur
sub.l a2,a2
JJsr L_Prg_RunIt Revient si out of memory!
; Pas de programme: on se branche <20> l'editeur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.NoProg jsr Sys_VerInstall Verification de l'installation
beq TheEnd_Install
jsr Edit_Load Charge l'editeur
bne.s TheEnd_Editor
moveq #-1,d0 DefRun normal
JJsr L_Prg_New
moveq #-1,d0 Titre
JJsr L_Ed_Cold
bne.s TheEnd_Editor
jsr WOption Affiche ou non!
JJsr L_Ed_Title Le titre
JJmp L_Ed_Loop Branche <EFBFBD> la boucle
; Message d'erreur panique residents
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TheEnd_Editor
lea Panic_Editor(pc),a0 Cannot load editor
bra TheEndMm
TheEnd_OOMem
lea Panic_OOMem(pc),a0 Out of memory
bra TheEndMm
TheEnd_Install
lea Panic_Install(pc),a0
bra TheEndMm
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; SORTIE GENERALE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TheEndMm
move.l a0,Panic
TheEnd
tst.b Sys_LibStarted(a5)
beq .Nolib
; Les librairies sont demarrees
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea Sys_EndRoutines(a5),a1 Les routines ajoutees
SyCall CallRoutines
JJsr L_CloAll Fichiers, imprimante
JJsr L_PRT_Close
JJsr L_Equ_Free
JJsr L_Includes_Clear Les includes du dernier programme
tst.l Edit_Segment(a5) Arrete l'editeur
beq.s .NEd
JJsr L_Ed_End
.NEd
move.l Edt_List(a5),d1 Les structures EDT restantes
beq.s .EdtX en cas de KILL editor
.ExtL move.l d1,a1
move.l Edt_Next(a1),d1
move.l #Edt_Long,d0
SyCall MemFree
tst.l d1
bne.s .ExtL
.EdtX move.l Prg_List(a5),d0 Les structure PRG restantes
beq.s .PrgX
.PrgL move.l d0,a6
JJsr L_Prg_DelStructure
move.l Prg_List(a5),d0
bne.s .PrgL
.PrgX
bsr Edit_Free Enleve l'editeur
bsr Mon_Free Enleve le moniteur + banque
bsr EffFSel Enleve la resource file selector
bsr EffMouse Enleve la souris
JJsr L_WB_Open Ouvre le WB en fond
bsr Libraries_Stop STOP les librairies
.Nolib
; Partie non dependantes des librairies
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr D_Close Ferme le dernier fichier...
tst.b Sys_WStarted(a5) Arrete W.Lib
beq.s .Skip0
move.l Sys_WAd(a5),a0
jsr 4(a0)
.Skip0
lea Sys_Messages(a5),a0 Enleve config interpreteur
jsr A5_Free
lea PathAct(a5),a0 Enleve pathact
jsr A5_Free
move.l AdrIcon(a5),d0 Enleve l'icone
beq.s .SkipI
move.l d0,a0
move.l IconBase(a5),a6
jsr -90(a6)
.SkipI
move.l $4.w,a6 Ferme icon.library
move.l IconBase(a5),d0
beq.s .Skip1
move.l d0,a1
jsr _LVOCloseLibrary(a6)
.Skip1
move.l FloatBase(a5),d0 Ferme les librairies mathematiques
beq.s .SkipM1
move.l d0,a1
jsr _LVOCloseLibrary(a6)
.SkipM1 bsr Math_Close
bsr Libraries_Free Libere les librairies
move.l Sys_WAd(a5),a0 Enleve AMOS.Library
jsr 16(a0)
move.l DosBase(a5),a6
move.l Sys_WSegment(a5),d1
jsr _LVOUnLoadSeg(a6)
move.l DosBase(a5),a3 Affiche le message d'erreur
move.l T_IntBase(a5),a4
move.l Sys_Message(a5),d7
bsr Panic_Message
move.l $4.w,a6 Ferme graphics.library
move.l T_GfxBase(a5),d0
beq.s .SkipG
move.l d0,a1
jsr _LVOCloseLibrary(a6)
.SkipG
move.l DosBase(a5),a1 dos
jsr _LVOCloseLibrary(a6)
move.l T_IntBase(a5),a1 Intuition
jsr _LVOCloseLibrary(a6)
move.l Sys_Message(a5),d7 Plus de datazone
move.l Sys_AData(a5),a1
move.l Sys_LData(a5),d0
move.l $4.w,a6 Liberation directe!
jsr _LVOFreeMem(a6)
; Sortie d'AMOSPro!
; ~~~~~~~~~~~~~~~~~
Get_Out move.l SaveSp(pc),a7
tst.l d7
beq.s .PaMe
move.l $4.w,a6
jsr _LVOForbid(a6)
move.l d7,a1
jsr -378(a6)
.PaMe moveq #0,d0
rts
; Fermeture des librairies mathematiques
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Math_Close
move.l a6,-(sp)
move.l $4.w,a6
move.l MathBase(a5),d0
beq.s .SkipM2
move.l d0,a1
jsr _LVOCloseLibrary(a6)
clr.l MathBase(a5)
.SkipM2 move.l DFloatBase(a5),d0
beq.s .SkipM3
move.l d0,a1
jsr _LVOCloseLibrary(a6)
clr.l DFloatBase(a5)
.SkipM3 move.l DMathBase(a5),d0
beq.s .SkipM4
move.l d0,a1
jsr _LVOCloseLibrary(a6)
clr.l DMathBase(a5)
.SkipM4 move.l (sp)+,a6
rts
; Imprime le message d'erreur dans l'entree courante
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A3= DosBase
; A4= IntBase
; D7= Message
Panic_Message
move.l Panic(pc),d6 Un message?
beq.s .Exit
tst.l d7 Sous WB?
bne.s .Wb
; Sous DOS-> Message dans la fenetre courante
move.l a3,a6 Handle courant
jsr -60(a6)
move.l d0,d1
beq.s .Exit
lea -128(sp),sp Buffer de travail
move.l sp,d2
move.l d6,a0
move.l d2,a1
.Copy move.b (a0)+,(a1)+
bne.s .Copy
move.b #10,-1(a1)
clr.b (a1)
move.l a1,d3
sub.l d2,d3
jsr _LVOWrite(a6)
lea 128(sp),sp
.Exit rts
; Sous WB-> ouvre une tchote fenetre
.Wb move.l a4,a6 IntBase
lea H_Click(pc),a0
lea H_AutoBody(pc),a1
move.l d6,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)
bra.s .Exit
; 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
; Ne pas changer la position du nom, apres dos.library!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
even
dc.l UserSecu-DosName
DosName dc.b "dos.library",0
UserReg dc.w 14
dc.b "R"^$73 0
dc.b "E"^$73 1
dc.b "G"^$73 2
dc.b "I"^$73 3
dc.b "S"^$73 4
dc.b "T"^$73 5
dc.b "R"^$73 6
dc.b "A"^$73 7
dc.b "T"^$73 8
dc.b "I"^$73 9
dc.b "O"^$73 10
dc.b "N"^$73 11
dc.b " "^$73 12
dc.b "#"^$73 13
UserName dc.w 14
dc.b "N"^$A5 0
dc.b "o"^$A5 1
dc.b "t"^$A5 2
dc.b " "^$A5 3
dc.b "I"^$A5 4
dc.b "n"^$A5 5
dc.b "s"^$A5 6
dc.b "t"^$A5 7
dc.b "a"^$A5 8
dc.b "l"^$A5 9
dc.b "l"^$A5 10
dc.b "e"^$A5 11
dc.b "d"^$A5 12
dc.b "!"^$A5 13
ds.b 32-14+4
even
; Noms des Librairies
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SaveSp dc.l 0
Panic dc.l 0
; Marqueur de version
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
VersionN: dc.b " Version "
Version
dc.b 0,"$VER: "
Version
; Messages d'erreur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Panic_OOMem dc.b "Not enough free memory",0
Panic_Editor dc.b "Cannot load editor",0
Panic_Install dc.b 'Program not installed, start "Install.AMOS" first',0
; Charge l'editeur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Edit_Load
lea Edit_Segment(a5),a0
lea Edit_Debug(pc),a1
moveq #6,d0
moveq #L_Ed_Start,d1
bsr Program_Load
.Err rts
; Efface l'editeur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Edit_Free
lea Edit_Segment(a5),a0
bra Program_Free
; Charge le moniteur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mon_Load
move.l Cur_Banks(a5),-(sp)
; Le moniteur lui-meme
; ~~~~~~~~~~~~~~~~~~~~
lea Mon_Segment(a5),a0
lea Mon_Debug(pc),a1
moveq #10,d0
moveq #L_Mon_Start,d1
bsr Program_Load
; Charge la banque de resource, si necessaire
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Skip1 tst.l Mon_Banks(a5)
bne.s .Skip2
lea Mon_Banks(a5),a0
move.l a0,Cur_Banks(a5)
moveq #11,d0 Nom de la banque
bsr Sys_GetMessage
bsr Sys_AddPath + path systeme
move.l #1005,d2
bsr D_Open
beq.s .DErr
moveq #-1,d0
JJsr L_Bnk.Load
bne .Err
bsr D_Close
.Skip2
; Ok, pas d'erreur
; ~~~~~~~~~~~~~~~~
move.l (sp)+,Cur_Banks(a5)
moveq #0,d0
rts
; Erreur: efface tout!
; ~~~~~~~~~~~~~~~~~~~~
.DErr moveq #-2,d0 File not found
.Err move.l (sp)+,Cur_Banks(a5)
move.w d0,-(sp)
bsr Mon_Free
move.w (sp)+,d0
rts
; Efface le moniteur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Mon_Free
move.l Cur_Banks(a5),-(sp)
; Enleve le moniteur
; ~~~~~~~~~~~~~~~~~~
lea Mon_Segment(a5),a0
bsr Program_Free
; Enleve les banques
; ~~~~~~~~~~~~~~~~~~
.Skip1 tst.l Mon_Banks(a5)
beq.s .Skip2
lea Mon_Banks(a5),a0
move.l a0,Cur_Banks(a5)
JJsr L_Bnk.EffAll
.Skip2 move.l (sp)+,Cur_Banks(a5)
rts
; Charge le programme (a0) / Nom #D0 / Branchements D1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Program_Load
move.l a0,a2 Adresse du segment
move.l d1,d2 Numero de la premiere fonction
IFNE Debug=2
move.l a1,(a2)
ENDC
IFEQ Debug=2
tst.l (a2)
bne.s .Skip
bsr Sys_GetMessage Nom du programme
bsr Sys_AddPath + path systeme
move.l Name1(a5),d1
move.l a6,-(sp)
move.l DosBase(a5),a6
jsr _LVOLoadSeg(a6)
move.l (sp)+,a6
move.l d0,(a2)
beq.s .Err
ENDC
; Loke les adresses des routines dans les branchements
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.Skip move.l (a2),d0
IFEQ Debug=2
lsl.l #2,d0
addq.l #4,d0
ENDC
move.l d0,a0
move.l AdTokens(a5),a1
lsl.w #2,d2
add.w #LB_Size+4,d2
sub.w d2,a1
bra.s .In
.Loop add.l d0,d1
move.l d1,-(a1)
.In move.l (a0)+,d1
bne.s .Loop
; OK, pas d'erreur
; ~~~~~~~~~~~~~~~~
moveq #0,d0
rts
.Err moveq #1,d0
rts
; Efface le programme A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Program_Free
IFEQ Debug=2
move.l (a0),d1
beq.s .Skip
clr.l (a0)
move.l a6,-(sp)
move.l DosBase(a5),a6
jsr _LVOUnLoadSeg(a6)
move.l (sp)+,a6
ENDC
.Skip rts
; Effacement du buffer mouse
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
EffMouse
lea PI_AdMouse(a5),a0
jmp A5_Free
; Efface la banque de resource file-selector
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
EffFSel lea Sys_Banks(a5),a0
move.l a0,Cur_Banks(a5)
moveq #16,d0
JJsr L_Bnk.Eff
rts
; AddPath sur un nom+command line, retourne la command line en A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sys_AddPathCom
movem.l a1/d1,-(sp)
move.l a0,a1
.Lim1 move.b (a1)+,d1
beq.s .Lim2
cmp.b #" ",d1
bne. .Lim1
.Lim2 move.b -1(a1),d1
clr.b -1(a1)
bsr Sys_AddPath
move.b d1,-1(a1)
bne.s .Lim3
subq.l #1,a1
.Lim3 move.l a1,a0
movem.l (sp)+,a1/d1
rts
; Additionne le pathname du dossier AMOS_System, si pas de path defini!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sys_AddPath
movem.l a1/a2,-(sp)
move.l Name1(a5),a2
move.l a0,a1
.Ess move.b (a1)+,d0
cmp.b #":",d0
beq.s .Cop2
tst.b d0
bne.s .Ess
lea Sys_Pathname(a5),a1
.Cop1 move.b (a1)+,(a2)+
bne.s .Cop1
subq.l #1,a2
.Cop2 move.b (a0)+,(a2)+
bne.s .Cop2
movem.l (sp)+,a1/a2
rts
; Retourne le message default_resource D0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Def_GetMessage
move.l Sys_Resource(a5),a0
add.l 6(a0),a0
bra.s GetMessage
; Routine, retourne le message systeme D0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sys_GetMessage
move.l Sys_Messages(a5),a0
GetMessage
move.w d1,-(sp)
clr.w d1
cmp.l #0,a0
beq.s .Big
addq.l #1,a0
bra.s .In
.Loop move.b (a0),d1
cmp.b #$ff,d1
beq.s .Big
lea 2(a0,d1.w),a0
.In subq.w #1,d0
bgt.s .Loop
.Out move.w (sp)+,d1
move.b (a0)+,d0
rts
.Big lea .Fake(pc),a0
bra.s .Out
.Fake dc.b 0,0,0,0
; Verification de l'installation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sys_VerInstall
move.w d0,-(sp)
move.w UserName(pc),d0
beq.s .Skip
move.w UserReg(pc),d0
.Skip movem.w (sp)+,d0
rts
; Enleve le codage: D0=XOR
; ~~~~~~~~~~~~~~~~~~~~~~~~
Sys_UnCode
movem.l a0/a1/d1/d2/d3,-(sp)
moveq #0,d2
move.w (a0)+,d1
move.w d1,(a1)+
subq.w #1,d1
bmi.s .Skip
.Loop move.b (a0)+,d3
eor.b d0,d3
add.b d3,d2
move.b d3,(a1)+
dbra d1,.Loop
.Skip move.w d2,d0
movem.l (sp)+,a0/a1/d1/d2/d3
rts
******************************************************************
dc.b $17,$09,$19,$92
UserSecu ds.b 34
******************************************************************
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; 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 #37,WB2.0(a5) A partir de V37
bcc.s .Skip
jsr FindTask(a6)
bra.s .Exit
.Skip jsr _LVOCacheClearU(a6) CacheClearU
.Exit movem.l (sp)+,a0-a1/a6/d0-d1
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Wait vbl multi tache
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sys_WaitMul
; - - - - - - - - - - - - -
movem.l a0-a1/a6/d0-d1,-(sp)
; Inhibition
SyCall Test_Cyclique
; Attente multitache
move.l T_GfxBase(a5),a6
jsr -270(a6)
movem.l (sp)+,a0-a1/a6/d0-d1
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Force le recalcul des listes copper
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ReCop: SyCall WaitVbl
EcCall CopForce
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; ARRET DES LIBRAIRIES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Libraries_Stop
; - - - - - - - - - - - - - - - -
movem.l a2-a6/d2-d7,-(sp)
moveq #26-1,d2
lea ExtAdr+26*16-16(a5),a2
.Loop move.l 8(a2),d0
beq.s .Next
move.l d0,a0
movem.l a2/d2,-(sp)
jsr (a0)
movem.l (sp)+,a2/d2
.Next lea -16(a2),a2
dbra d2,.Loop
moveq #0,d0
bra Ll_Out2
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; EFFACEMENT DES LIBRARIES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Libraries_Free
; - - - - - - - - - - - - - - - -
bsr Libraries_FreeSizes
movem.l a2-a6/d2-d7,-(sp)
moveq #27-1,d2
lea AdTokens(a5),a2
.Loop move.l (a2),d0
beq.s .Next
move.l d0,a0 La library elle meme...
clr.l (a2)
move.l LB_MemAd(a0),a1
move.l LB_MemSize(a0),d0
SyCall MemFree
.Next addq.l #4,a2 Library suivante...
dbra d2,.Loop
moveq #0,d0
bra Ll_Out2
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; LIBERATION DE LA TABLE DES TAILLES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Libraries_FreeSizes
; - - - - - - - - - - - - - - - -
movem.l d2-d7/a2-a6,-(sp)
lea AdTokens(a5),a2
moveq #27-1,d2
.Loop move.l (a2)+,d0
beq.s .Skip
move.l d0,a0
move.l LB_LibSizes(a0),d0
beq.s .Skip
clr.l LB_LibSizes(a0)
move.l d0,a1
move.l -(a1),d0
addq.l #4,d0
jsr RamFree
.Skip dbra d2,.Loop
moveq #0,d0
Ll_Out2 movem.l (sp)+,d2-d7/a2-a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RESERVATION / LIBERATION MEMOIRE (ancienne!)
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Mise a zero!
; ~~~~~~~~~~~~~~~~~~
RamFast move.l a0,-(sp)
SyCall MemFastClear
move.l a0,d0
move.l (sp)+,a0
rts
RamChip move.l a0,-(sp)
SyCall MemChipClear
move.l a0,d0
move.l (sp)+,a0
rts
; NON mise a zero!
; ~~~~~~~~~~~~~~~~~~~~~~
RamFast2
move.l a0,-(sp)
SyCall MemFast
move.l a0,d0
move.l (sp)+,a0
rts
RamChip2
move.l a0,-(sp)
SyCall MemChip
move.l a0,d0
move.l (sp)+,a0
rts
; Liberation
; ~~~~~~~~~~~~~~~~
RamFree move.l a0,-(sp)
SyCall MemFree
move.l (sp)+,a0
rts
; Reserve / Libere le buffer temporaire
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
ResTempBuffer
movem.l d1/a1,-(sp)
move.l d0,d1
; Libere l'ancien buffer
move.l TempBuffer(a5),d0
beq.s .NoLib
move.l d0,a1
move.l -(a1),d0
addq.l #4,d0
bsr.s RamFree
clr.l TempBuffer(a5)
; Reserve le nouveau
.NoLib move.l d1,d0
beq.s .Exit
addq.l #4,d0
bsr RamFast
beq.s .Exit
move.l d0,a0
move.l d1,(a0)+
move.l a0,TempBuffer(a5)
move.l d1,d0
; Branche les routines de liberation automatique
movem.l a0-a2/d0-d1,-(sp)
lea .LibClr(pc),a1
lea Sys_ClearRoutines(a5),a2
SyCall AddRoutine
lea .LibErr(pc),a1
lea Sys_ErrorRoutines(a5),a2
SyCall AddRoutine
movem.l (sp)+,a0-a2/d0-d1
.Exit movem.l (sp)+,d1/a1
rts
; Structures liberation
; ~~~~~~~~~~~~~~~~~~~~~
.LibClr dc.l 0
moveq #0,d0
bra.s ResTempBuffer
.LibErr dc.l 0
moveq #0,d0
bra.s ResTempBuffer
; Reserve un espace m<>moire sur (a5)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Adresse dans (a5)
; D0= Longueur
; D1= Flags
A5_Reserve
move.l a1,-(sp)
move.l a0,a1
addq.l #4,d0
SyCall MemReserve
beq.s .Out
subq.l #4,d0
move.l d0,(a0)+
move.l a0,(a1)
.Out move.l (sp)+,a1
rts
; Efface un espace m<>moire sur (a5)
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; A0= Adresse dans (a5)
A5_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
SyCall MemFree
.Skip movem.l (sp)+,a0/a1/d0
rts
;
; NOUVELLE ROUTINES DISQUE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;
; OPEN: ouvre le fichier systeme (diskname1) access mode D2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
D_Open move.l Name1(a5),d1
D_OpenD1
move.l a6,-(sp)
move.l DosBase(a5),a6
jsr _LVOOpen(a6)
move.l (sp)+,a6
move.l d0,Handle(a5)
rts
; READ fichier systeme D3 octets dans D2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
D_Read movem.l d1/a0/a1/a6,-(sp)
move.l Handle(a5),d1
move.l DosBase(a5),a6
jsr _LVORead(a6)
movem.l (sp)+,d1/a0/a1/a6
cmp.l d0,d3
rts
; WRITE fichier systeme D3 octets de D2
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
D_Write
movem.l d1/a0/a1/a6,-(sp)
move.l Handle(a5),d1
move.l DosBase(a5),a6
jsr _LVOWrite(a6)
movem.l (sp)+,d1/a0/a1/a6
cmp.l d0,d3
rts
; SEEK fichier system D3 mode D2 deplacement
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
D_Seek move.l Handle(a5),d1
move.l a6,-(sp)
move.l DosBase(a5),a6
jsr _LVOSeek(a6)
move.l (sp)+,a6
tst.l d0
rts
; CLOSE fichier systeme
; ~~~~~~~~~~~~~~~~~~~~~
D_Close
movem.l d0/d1/a0/a1/a6,-(sp)
move.l Handle(a5),d1
beq.s .Skip
clr.l Handle(a5)
move.l DosBase(a5),a6
jsr _LVOClose(a6)
.Skip movem.l (sp)+,d0/d1/a0/a1/a6
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; MONITOR
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
InMonitor
; - - - - - - - - - - - - -
bsr Prg_FirstRun Autorise?
tst.l Edit_Segment(a5)
beq.s .ErrE
Ijsr L_Ed_CloseEditor
Ijsr L_Prg_ReSetBanks Remet les banques
bsr Mon_Load Charge le moniteur
bne.s .Err
Ijsr L_Mon_In_Program
bne.s .Mem
Ret_Inst
.ErrE moveq #13,d0
Ijmp L_Error
.Err cmp.w #-1,d0
beq.s .Mem
Ijmp L_DiskError
.Mem Ijmp L_OOfMem
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; KILL EDITOR
; KILL EDITOR: ne fonctionne que le pour le premier programme!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
InKillEditor
; - - - - - - - - - - - - -
bsr Prg_FirstRun Autorise?
tst.l Edit_Segment(a5) Deja ferme?
beq.s KEExit
; Fait un close editor d'abord
tst.b PI_CloseEd(a5) Autorise?
beq.s CloCloX
Ijsr L_Ed_CloseEditor
; Peut-on faire le KILL editor?
tst.b PI_KillEd(a5) Autorise?
beq.s CloCloX
tst.l Mon_Base(a5) Pas si moniteur en route!
bne.s CloCloX
Ijsr L_Ed_KillEditor
bsr Edit_Free Enleve de la memoire
bsr Mon_Free Tant qu'<EFBFBD> faire...
lea RunErr_NoEditor(pc),a0
move.l a0,Prg_JError(a5) Branchement en fin de programme
clr.w T_AMOState(a5) Mode RUN-ONLY
; Sortie commune
CloCloX lea Equ_Base(a5),a0 Libere les equates
bsr A5_Free
Ijsr L_Prg_ReSetBanks Remet les banques
move.w ScOn(a5),d1
beq.s KEExit
subq.w #1,d1
EcCall Active
KEExit Ret_Inst
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; CLOSE EDITOR
; ne fonctionne que pour le premier programme!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
InCloseEditor
; - - - - - - - - - - - - -
bsr Prg_FirstRun
tst.b PI_CloseEd(a5) Autorise?
beq.s KEExit
tst.l Edit_Segment(a5) Deja ferme?
beq.s KEExit
Ijsr L_Ed_CloseEditor
bra.s CloCloX
; Peut-on fermer l'editeur ?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
Prg_FirstRun
tst.w Direct(a5)
bne.s .Err
tst.b Prg_Accessory(a5)
bne.s .Non
move.l Prg_Runned(a5),a0 Un programme en dessous?
tst.l Prg_Previous(a0)
bne.s .Non
rts
.Non addq.l #4,sp
Ret_Inst
.Err moveq #17,d0 Illegal direct mode
Ijmp L_Error
; __________________________________________________________________________
;
; Erreurs RUN-ONLY
; __________________________________________________________________________
;
RunErr_RunOnly
move.w #-1,-(sp)
bra.s RunErr_Reload
; __________________________________________________________________________
;
; Erreurs editeur ferme...
; __________________________________________________________________________
;
RunErr_NoEditor
clr.w -(sp)
RunErr_Reload
movem.l a0-a1/d0-d1,-(sp)
move.l Cur_Banks(a5),-(sp) Donnees courantes...
move.l Cur_Dialogs(a5),-(sp)
cmp.w #1002,d0 System?
beq TheEnd
bsr Sys_VerInstall Si pas installe!
beq TheEnd
bsr Reset_Request Requester back to AMOS
bsr Edit_Load Charge l'editeur
bne .Again
JJsr L_Ed_Cold
beq.s .Ok
cmp.b #1,d0 Out of memory?
bne TheEnd_Editor Fichiers introuvables : tant pis!
; Efface au maximum la memoire
.Again move.l (sp),Cur_Dialogs(a5) Banques du programme
move.l 4(sp),Cur_Banks(a5)
bsr MemMaximum Grab as much memory as possible
bsr Edit_Load Charge eventuellement
bne.s .AAgain
JJsr L_Ed_Cold
beq.s .Ok
; Efface les banques du programme!
.AAgain tst.w 6*4(sp) Un run-only?
bne TheEnd Oui: on stoppe tout...
move.l (sp),Cur_Dialogs(a5) Banques du programme
move.l 4(sp),Cur_Banks(a5)
bsr MemDelBanks Peut-on effacer les banques?
beq TheEnd_OOMem
JJsr L_Bnk.EffAll Efface les banques!
JJsr L_Bnk.Change
bsr Edit_Load Essaye encore!
bne TheEnd_Editor
JJsr L_Ed_Cold
bne TheEnd_Editor Tant pis!
; Branche <20> l'editeur
.Ok tst.l Edt_Runned(a5) Pas de programme >>> coldcold
bne.s .Go
move.l Edt_List(a5),Edt_Runned(a5) Donc, un seul prg!
.Go bsr WOption AMOS en 1er!
move.l (sp)+,Cur_Dialogs(a5) Remet les banques
move.l (sp)+,Cur_Banks(a5)
movem.l (sp)+,a0-a1/d0-d1
tst.w (sp)+
JJmpR L_Ed_ErrRun,a2 Erreurs normales
bra TheEnd
; Requester back to AMOS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Reset_Request
move.l ExtAdr+2*16+4(a5),d0 Request= ext #2
beq.s .Skip
move.l d0,a0
jsr (a0)
.Skip rts
; Recupere autant de memoire que possible
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MemMaximum
JJsr L_ClearVar Plus de variable
move.w #-2,DefFlag(a5) Plus d'ecran
JJsr L_DefRun1
move.l PI_ParaTrap+16(a5),-(sp) Lignes sprites, MINI!
move.l #20,PI_ParaTrap+16(a5)
JJsr L_DefRun2
move.l (sp)+,PI_ParaTrap+16(a5)
move.l #10000*1024,d0 Demande 10 megas de CHIP!
SyCall MemChip
tst.l Mon_Base(a5) Libere le moniteur
bne.s .Skip
bsr Mon_Free
.Skip rts
; Ligne de confirmation de l'effacement du programme courant...
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
MemDelBanks
movem.l a2-a6/d2-d7,-(sp)
JJsr L_Bnk.GetLength Longueur des banques
add.l d2,d0
add.l d1,d0
beq .Tanpi Si zero: on ne fait rien!
bsr .Puzzle Ouvre l'ecran
move.l a1,a0
moveq #EcFsel,d0
move.l #640,d1
moveq #48,d2
moveq #0,d3
moveq #-1,d4
JJsrR L_Dia_RScOpen,a3
bne.s .Tanpi
bsr ReCop
bsr .Puzzle Demarre le DBL
moveq #0,d0
moveq #0,d1
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
move.l #512,d6 Taille du buffer
lea .DBL(pc),a0
JJsrR L_Dia_RunQuick,a3
movem.l d0/d1,-(sp)
EcCalD Del,EcFsel Efface l'ecran
movem.l (sp)+,d0/d1
tst.l d0
bne.s .Tanpi
cmp.w #2,d1
beq.s .Out
moveq #1,d0
bra.s .Out
.Tanpi moveq #0,d0
.Out movem.l (sp)+,d2-d7/a2-a6
rts
; Retourne les adresses dans la banque par defaut
.Puzzle move.l Sys_Resource(a5),a0
move.l a0,a1
add.l 2+0(a0),a1 Base des graphiques
move.l a0,a2
add.l 2+4(a0),a2 Base des messages
add.l 2+8(a0),a0 Base des programmes
rts
; Petit DBL de gestion de la ligne
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.DBL dc.w .Fin-.Debut
.Debut dc.b "SI SW,SH;"
dc.b "BA 0,0;"
dc.b "BO 0,0,1,SX,SY;"
dc.b "PO 21MECX,4,21ME,0,7;"
dc.b "PO 22MECX,14,22ME,2,3;"
dc.b "BU 1,16,SY22-,64,16,0,0,1;[UN 0,0,13BP+; PR 3MECXBP+,4,3ME,7;][BQ;]"
dc.b "KY 13,0;"
dc.b "BU 2,SX72-,YA,XBXA-,YBYA-,0,0,1;[UN 0,0,13BP+; PR 4MECXBP+,4,4ME,7;][BQ;]"
dc.b "KY 27,0;"
dc.b "BU 3,0,0,SX,SY,0,0,0;[][SM;]"
dc.b "RU 0,3;"
dc.b "EX;",0
.Fin even
; Fait passer l'AMOS en 1er juste avant le lancement du programme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WOption tst.b WBench(a5)
beq.s .Skip
EcCalD AMOS_WB,1
clr.b WBench(a5)
.Skip rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Trouve le directory courant >
; >>> Buffer + 384
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AskDir
; - - - - - - - - - - - - -
move.l Buffer(a5),a0
clr.w (a0)
clr.w 384(a0)
move.l a0,d1
moveq #-2,d2
DosCall _LVOLock
tst.l d0
bne.s AskDir2
rts
; - - - - - - - - - - - - -
AskDir2
; - - - - - - - - - - - - -
clr.l -(sp)
ADir0: move.l d0,-(sp)
move.l d0,d1
DosCall _LVOParentDir
tst.l d0
bne.s ADir0
* Redescend les LOCKS en demandant le NOM!
move.l Buffer(a5),a2
lea 384(a2),a2
clr.b (a2)
moveq #":",d2
ADir1: move.l (sp)+,d1
beq.s ADir4
move.l Buffer(a5),a1
movem.l d1/d2/a1/a2,-(sp)
move.l a1,d2
DosCall _LVOExamine
movem.l (sp)+,d1/d2/a1/a2
tst.l d0
beq.s ADir3
lea 8(a1),a1
ADir2: move.b (a1)+,(a2)+
bne.s ADir2
move.b d2,-1(a2)
clr.b (a2)
moveq #"/",d2
ADir3 DosCall _LVOUnLock
bra.s ADir1
ADir4 moveq #0,d0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Source: Memory.s
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Gestion de liste simple NEXT.l LONG.l
; Cree un element de liste en CHIP MEM
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lst.ChipNew
move.l #Chip|Clear|Public,d1
bra.s Lst.Cree
; Cree une element de liste en FAST MEM
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lst.New
move.l #Clear|Public,d1
; Cree un <20>l<EFBFBD>ment en tete de liste A0 / longueur D0 / Memoire D1
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lst.Cree
movem.l a0/d0,-(sp)
addq.l #8,d0
SyCall MemReserve
move.l a0,a1
movem.l (sp)+,a0/d1
beq.s .Out
move.l (a0),(a1)
move.l a1,(a0)
move.l d1,4(a1)
move.l a1,d0
.Out rts
; Efface une liste entiere A0
; ~~~~~~~~~~~~~~~~~~~~~~~~
Lst.DelAll
bra.s .In
.Loop move.l d0,a1
bsr Lst.Del
.In move.l (a0),d0
bne.s .Loop
rts
; Efface un <20>l<EFBFBD>ment de liste A1 / Debut liste A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lst.Del
movem.l a0/d0-d2,-(sp)
move.l a1,d0
move.l a0,a1
move.l (a1),d2
beq.s .NFound
.Loop move.l a1,d1
move.l d2,a1
cmp.l d0,a1
beq.s .Found
move.l (a1),d2
bne.s .Loop
bra.s .NFound
; Enleve de la liste
.Found move.l d1,a0
move.l (a1),(a0)
move.l 4(a1),d0
addq.l #8,d0
SyCall MemFree
.NFound movem.l (sp)+,a0/d0-d2
rts
; INSERE un <20>l<EFBFBD>ment A1 en tete de liste A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lst.Insert
move.l (a0),(a1)
move.l a1,(a0)
rts
; Enleve un <20>l<EFBFBD>ment de liste A1 / Debut liste A0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Lst.Remove
movem.l a0/a1/d0-d2,-(sp)
move.l a1,d0
move.l a0,a1
move.l (a1),d2
beq.s .NFound
.Loop move.l a1,d1
move.l d2,a1
cmp.l d0,a1
beq.s .Found
move.l (a1),d2
bne.s .Loop
bra.s .NFound
; Enleve de la liste
.Found move.l d1,a0
move.l (a1),(a0)
.NFound movem.l (sp)+,a0/a1/d0-d2
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; BANQUES PROGRAMME PRECEDENT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bnk.PrevProgram
; - - - - - - - - - - - - -
movem.l a0/a1/d0,-(sp)
tst.l Mon_Base(a5) Pas si moniteur!
bne.s .Non
tst.w Direct(a5) Pas en mode direct!
bne.s .Non
move.l Prg_Runned(a5),a0 Un programme en dessous
move.l Prg_Previous(a0),d0
bne.s .Ok
move.l Edt_Current(a5),d0 NON! Un programme edite?
beq.s .Non
move.l d0,a1
move.l Edt_Prg(a1),d0 Le meme???
cmp.l d0,a0
beq.s .Non
.Ok move.l d0,a0 On grabbe
lea Prg_Banks(a0),a0
move.l a0,Cur_Banks(a5)
bra.s .Exit
.Non moveq #0,d0
.Exit movem.l (sp)+,a0/a1/d0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; BANQUE DU PROGRAMME COURANT
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bnk.CurProgram
; - - - - - - - - - - - - -
movem.l a0/d0,-(sp)
move.l Prg_Runned(a5),a0
lea Prg_Banks(a0),a0
move.l a0,Cur_Banks(a5)
movem.l (sp)+,a0/d0
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; CHANGEMENT DANS LES BANQUES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Bnk.Change
; - - - - - - - - - - - - -
movem.l a0-a3/d0-d7,-(sp)
; Appelle les extensions
; ~~~~~~~~~~~~~~~~~~~~~~
lea ExtAdr(a5),a0
moveq #26-1,d0
.ELoop move.l 12(a0),d1
beq.s .ESkip
move.l d1,a1
movem.l a0/d0,-(sp)
move.l d1,a1
move.l Cur_Banks(a5),a0
move.l (a0),a0
jsr (a1)
movem.l (sp)+,a0/d0
.ESkip lea 16(a0),a0
dbra d0,.ELoop
; Recherche la banque de sprites
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
JJsr L_Bnk.GetBobs
SyCall SetSpBank
; Ok!
; ~~~
movem.l (sp)+,a0-a3/d0-d7
tst.w d0
rts
; IFNE Debug
PreBug btst #6,$BFE001
beq.s BugBug
rts
BugBug movem.l d0-d2/a0-a2,-(sp)
.Ll move.w #$FF0,$DFF180
btst #6,$BFE001
bne.s .Ll
move.w #20,d0
.L0 move.w #10000,d1
.L1 move.w d0,$DFF180
dbra d1,.L1
dbra d0,.L0
btst #6,$BFE001
beq.s .Ill
movem.l (sp)+,d0-d2/a0-a2
rts
.Ill EcCalD AMOS_WB,0
movem.l (sp)+,d0-d2/a0-a2
illegal
rts
; ENDC
; Inclusion de la verification
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Include "+Verif.s"
; Charge le moniteur et l'editeur en mode debug
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
IFNE Debug=2
Mon_Debug Include "+Monitor.s"
Edit_Debug Include "+Edit.s"
ENDC
IFEQ Debug=2
Mon_Debug
Edit_Debug
ENDC
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; CHARGEMENT / INITIALISATION - Partie amovible!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
SECTION "I",CODE
; - - - - - - - - - - - - -
Ext_Nb equ 5
Ext_TkCmp equ 6
Ext_TkCOp equ $14
Ext_TkTston equ $28
Ext_TkTstof equ $3a
Ext_TkTst equ $4e
; Calcul de la taille des buffers de travail
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LDataWork equ 32+BbLong+12*2+(AAreaSize*5+6)+24+16+12+70*3+4+20+108+108+256+TBuffer
; Buffer dans la pile pour debuter
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
RsReset
SP_Message rs.l 1
SP_AutoLock rs.l 1
SP_AutoName rs.b 128
SP_Config rs.b 128
SP_DefSize rs.l 1
SP_DosBase rs.l 1
SP_IntBase rs.l 1
SP_Command rs.l 2
SP_WSegment rs.l 1
SP_WBench rs.w 1
SP_CommandLine rs.l 1
SP_Buffer equ __RS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; DEMARRAGE A FROID
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Hunk_2
Cold_Start
; - - - - - - - - - - - - -
move.l sp,SaveSp
; Reserve un buffer dans la pile, pour travailler
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea -SP_Buffer(sp),sp
movem.l a0/d0,SP_Command(sp)
; Init dos.library
; ~~~~~~~~~~~~~~~~
moveq #0,d0
lea DosName,a1
move.l $4.w,a6
jsr _LVOOpenLibrary(a6)
move.l d0,SP_DosBase(sp)
; Init INTUITION library / Find version!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l $4.w,a6
moveq #0,d0
move.l d0,d3
lea IntName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,SP_IntBase(sp)
; CLI ou WORKBENCH?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
clr.l SP_WSegment(sp)
clr.l SP_Message(sp)
clr.l SP_AutoLock(sp)
clr.l SP_DefSize(sp)
clr.w SP_AutoName(sp)
clr.w SP_Config(sp)
clr.l SP_CommandLine(sp)
move.b #1,SP_WBench(sp)
; Workbench?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
sub.l a1,a1
move.l $4.w,a6
jsr _LVOFindTask(a6)
move.l d0,a0
tst.l $ac(a0)
bne.s FromCLI
; Recupere le message
; ~~~~~~~~~~~~~~~~~~~
move.l $4.w,a6
lea $5c(a0),a0
move.l a0,-(sp)
jsr -384(a6) WaitPort
move.l (sp)+,a0
jsr -372(a6) GetMsg
move.l d0,SP_Message(sp)
move.l d0,a2
moveq #-1,d2
; Change le directory >>> directory AMOS
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l $24(a2),d0
beq.s .PaLock
move.l d0,a0
move.l (a0),d2
beq.s .PaLock
move.l d2,d1
move.l SP_DosBase(sp),a6
jsr _LVOCurrentDir(a6)
.PaLock
; Un programme <20> charger?
; ~~~~~~~~~~~~~~~~~~~~~~~
cmp.l #2,$1c(a2)
bne.s .PaAuto
move.l $24(a2),d0
beq.s .PaAuto
move.l d0,a2
move.l 8(a2),SP_AutoLock(sp)
move.l 12(a2),d0
beq.s .PaAuto
move.l d0,a0
lea SP_AutoName(sp),a1
.Cop move.b (a0)+,(a1)+
bne.s .Cop
tst.l d2
bne.s .PaAuto
move.l SP_AutoLock(sp),d1
beq.s .PaAuto
move.l SP_DosBase(sp),a6
jsr _LVOCurrentDir(a6)
.PaAuto bra CommandX
; CLI!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
FromCLI movem.l SP_Command(sp),a0/d0
cmp.w #1,d0
bls CommandX
clr.b -1(a0,d0.w)
; Explore la ligne de commande
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; Saute le d<>but
.Cli0 move.b (a0)+,d0
beq CommandX
cmp.b #" ",d0
beq.s .Cli0
cmp.b #"-",d0
beq.s .CliO
; Nom du programme <20> charger?
subq.l #1,a0
lea SP_AutoName(sp),a1
bsr .CliNom
.Spc cmp.b #" ",(a0)+ Stocke le debut command line
beq.s .Spc
subq.l #1,a0
move.l a0,SP_CommandLine(sp)
bra CommandX
; Options
.CliO move.b (a0)+,d0
beq .CliE
cmp.b #"a",d0
bcs.s .PAm
cmp.b #"z",d0
bhi.s .PAm
sub.b #$20,d0
.PAm cmp.b #"C",d0
beq .ClioC
cmp.b #"W",d0
beq .ClioW
; Erreur dans la command line
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~
.CliE move.l #Panic_Command,Panic
bra Boot_Fatal
; Option -C "fichier config"
; ~~~~~~~~~~~~~~~~~~~~~~~~~~
.ClioC lea SP_Config(sp),a1
bsr .CliNom
bra.s .Cli0
; Option -W "workbench"
; ~~~~~~~~~~~~~~~~~~~~~
.ClioW clr.b SP_WBench(sp)
bra.s .Cli0
; Prend un nom dans la command line
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.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
; Fin de l'exploration des commandes
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CommandX
; Charge amos.library: differents essais si pas installe!
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l SP_DosBase(sp),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)
tst.l d0
bne.s .Ok
move.l #Panic_Lib,Panic Message d'erreur
bra Boot_Fatal
.Ok move.l d0,SP_WSegment(sp) Segment library pour fatal!
lsl.l #2,d0
addq.l #4,d0
move.l d0,a4
; Reserve la zone de datas...
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l #LDataWork,d0 ; Longueur buffers travail
add.l 8(a4),d0 ; + Longueur datas W
add.l #DataLong,d0 ; + Longueur datas BASIC
move.l d0,d2
move.l #Public|Clear,d1 Flags
move.l $4.w,a6 Using default system function!
jsr _LVOAllocMem(a6)
tst.l d0
beq .Mem
move.l d0,a5
lea LDataWork(a5),a5
move.l a5,a0
add.l 8(a4),a5
move.l d0,Sys_AData(a5)
move.l d2,Sys_LData(a5)
; 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.w a0,d0
and.w #$0003,d0
beq.s .Skipu
illegal
.Mem move.l #Panic_OOMem,Panic Message d'erreur panique
bra Boot_Fatal
.Skipu
; Poke les donn<6E>es contenues dans SP
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l SP_WSegment(sp),Sys_WSegment(a5)
move.l SP_Message(sp),Sys_Message(a5)
move.l SP_DosBase(sp),DosBase(a5)
move.l SP_IntBase(sp),T_IntBase(a5)
; Start system function of the amos.library
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l a4,Sys_WAd(a5)
move.l #"V2.0",d0 Magic!
move.w #$0200,d1 Version d'AMOSPro
jsr 12(a4)
cmp.l #"W2.0",d0 Verifie la version de la librairie
beq.s .Libok
move.l #Panic_Version,Panic
jmp TheEnd
.Libok
; Stocke la version du systeme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l $4.w,a0
cmp.w #36,$14(a0)
bcs.s .Pa20
move.w $14(a0),WB2.0(a5)
.Pa20
; Charge la configuration de l'interpreteur
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l #1005,d2
lea SP_Config(sp),a0 Option -C" "
tst.b (a0)
bne.s .Conf
lea NDatas1(pc),a0 AMOSPro_Interpretor_Config
move.l a0,d1
jsr D_OpenD1
bne.s .Open
lea NDatas3(pc),a0 s/AMOSPro_Interpretor_Config
move.l a0,d1
jsr D_OpenD1
bne.s .Open
lea NDatas2(pc),a0 s:AMOSPro_Interpretor_Config
.Conf move.l a0,d1
jsr D_OpenD1
bne.s .Open
move.l #Panic_Config,Panic Message d'erreur
jmp TheEnd
.Open move.l Buffer(a5),d2
move.l d2,a2
; Charge les donn<6E>es dc.w
; ~~~~~~~~~~~~~~~~~~~~~~~
moveq #8,d3
jsr D_Read
bne TheEnd_Cantread
cmp.l #"PId1",(a2)
bne TheEnd_Cantread
move.l 4(a2),d3
lea PI_Start(a5),a0
move.l a0,d2
jsr D_Read
bne TheEnd_Cantread
; Charge les donn<6E>es texte
; ~~~~~~~~~~~~~~~~~~~~~~~~
move.l a2,d2
moveq #8,d3
jsr D_Read
cmp.l #"PIt1",(a2)
bne TheEnd_Cantread
lea Sys_Messages(a5),a0
move.l 4(a2),d0
move.l d0,d3
move.l #Clear|Public,d1
jsr A5_Reserve
beq JTheEnd_OOMem
move.l a0,d2
jsr D_Read
jsr D_Close
; La taille du buffer specifiee efface la precedente
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l SP_DefSize(sp),d0
beq.s .Skop
move.l d0,PI_DefSize(a5)
.Skop
; Buffer de pathact
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l #256,d0
move.l #Public|Clear,d1
lea PathAct(a5),a0
jsr A5_Reserve
beq JTheEnd_OOMem
; Trouve le path complet du systeme
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
moveq #1,d0 Acces au path
jsr Sys_GetMessage
move.l a0,d1 Demande le lock
moveq #-2,d2
DosCall _LVOLock
tst.l d0
beq TheEnd_APSystem
jsr AskDir2 Demande le directory
move.l Buffer(a5),a0 Copie le directory
lea 384(a0),a0
lea Sys_Pathname(a5),a1
.CC move.b (a0)+,(a1)+
bne.s .CC
; Init FLOAT library
; ~~~~~~~~~~~~~~~~~~
move.l $4.w,a6
moveq #0,d0
lea FloatName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,FloatBase(a5)
; Init GRAPHICS Library
; ~~~~~~~~~~~~~~~~~~~~~
moveq #0,d0
lea GfxName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,T_GfxBase(a5)
beq TheEnd_Cantread
; Init ICON Library
; ~~~~~~~~~~~~~~~~~
tst.b PI_Icons(a5)
beq.s .PaIco
moveq #0,d0
lea IconName(pc),a1
jsr _LVOOpenLibrary(a6)
move.l d0,IconBase(a5)
beq.s .PaIco
move.l d0,a6
moveq #4,d0 Nom de Def_Icon
jsr Sys_GetMessage
jsr Sys_AddPath
move.l Name1(a5),a0
jsr -78(a6) Charge!
move.l d0,AdrIcon(a5)
beq.s .PaIco
move.l d0,a0
move.l #$80000000,d0 RAZ position ecran
move.l d0,$3a(a0)
move.l d0,$3e(a0)
.PaIco
; Charge les librairies
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Libraries_Load
bne TheEnd_Badext
bsr Library_Patch Insere les routines internes
bsr Libraries_Reloc
bne TheEnd_Badext
move.b #1,Sys_LibStarted(a5) Flag: les librairies sont demarrees!
; Charge le fichier MOUSE
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr LdMouse
; Charge la banque FSel_Resource
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr LdFSel
; Fait les ASSIGNS automatiques
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr AutoAssigns
; Demarrage des interruptions
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
moveq #3,d0 A3= fonte / 0
jsr Sys_GetMessage
move.l a0,a3
lea PI_ParaTrap(a5),a0 A0= parametre demarrage
move.l PI_AdMouse(a5),a1 A1= mouse.bak / 0
lea PI_DefEPa(a5),a2 A2= Palette par defaut
moveq #0,d0 D0= pas afficher les ecrans
move.l PI_DefAmigA(a5),d1 D1= default amiga-a
move.l Sys_WAd(a5),a6
jsr (a6)
tst.l d0
bne JTheEnd
move.b #-1,Sys_WStarted(a5)
; Demarre les librairies
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bsr Libraries_Init
bne TheEnd_Badext
; Raz du pathact!
; ~~~~~~~~~~~~~~~
move.l PathAct(a5),a0
clr.b (a0)
; Charger un programme?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l Name1(a5),a0
clr.w (a0)
move.l SP_AutoLock(sp),d1
beq.s .PaDir
move.l DosBase(a5),a6
jsr _LVOCurrentDir(a6)
.PaDir lea SP_AutoName(sp),a0 Un programme en commande?
tst.b (a0)
bne.s .CoLo
moveq #5,d0 Non, essaie AUTOEXEC.AMOS
jsr Sys_GetMessage
.CoLo move.l Name1(a5),a1
.CoCop move.b (a0)+,(a1)+
bne.s .CoCop
move.b SP_WBench(sp),WBench(a5) Flag pour test
; Poke la ligne de commande dans le buffer
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l SP_CommandLine(sp),d0
beq.s .Paco
move.l d0,a0
move.l Buffer(a5),a1
lea TBuffer-256-6(a1),a1
move.l #"CmdL",(a1)+
move.l a1,a2
clr.w (a1)+
.Cop move.b (a0)+,(a1)+
bne.s .Cop
subq.l #1,a0
sub.l d0,a0
move.w a0,(a2)
.Paco
; Depile
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
lea SP_Buffer(sp),sp
move.l sp,BasSp(a5)
; Recupere la taille memoire totale au depart
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l $4.w,a6
tst.w WB2.0(a5)
bne.s .M20
; En 1.3, demande simplement AVAILMEM>>> valeurs approximatives!
move.l #Public|Chip,d1
jsr _LVOAvailMem(a6)
add.l #38*1024,d0
move.l d0,d2
move.l #Public|Fast,d1
jsr _LVOAvailMem(a6)
tst.l d0
beq.s .QChp
add.l #256*1024,d0
bra.s .Mm
.QChp add.l #256*1024,d2
bra.s .Mm
; En 2.0, demande la taille totale
.M20 move.l #Public|Chip|Total,d1
jsr _LVOAvailMem(a6)
move.l d0,d2
move.l #Public|Fast|Total,d1
jsr _LVOAvailMem(a6)
.Mm move.l d0,MemFastTotal(a5)
move.l d2,MemChipTotal(a5)
; Prend le path de depart
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
JJsr L_AskDir
JJsr L_CopyPath
; Fermeture automatique du WB
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tst.b PI_AutoWB(a5)
beq.s .NoWB
jsr WOption
JJsr L_WB_Close
.NoWB
; Branchement <20> la fin de l'initialisation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jmp Init_Fin
; Relai de saut dans l'autre Hunk
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
JTheEnd_OOMem
jmp TheEnd_OOMem
JTheEnd jmp TheEnd
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Fait les assigns automatiquement!
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
AutoAssigns
; - - - - - - - - - - - - -
lea AssInst(pc),a0 ASSIGN present?
move.l Name1(a5),a1
.CoCop move.b (a0)+,(a1)+
bne.s .CoCop
JJsr L_RExist
beq.s .NoAss
; Fait les assigns...
JJsr L_AskDir
lea AssCon(pc),a0 Ouvre un NIL:
move.l a0,d1
move.l #1004,d2
DosCall _LVOOpen
tst.l d0
beq.s .NoAss
move.l d0,ParamE(a5)
moveq #0,d2
lea Ass1(pc),a0 Productivity1
bsr.s DoAssign
add.w d0,d2
lea Ass2(pc),a0 Productivity1
bsr.s DoAssign
add.w d0,d2
lea Ass3(pc),a0 Tutorial
bsr.s DoAssign
add.w d0,d2
lea Ass4(pc),a0 Examples
bsr.s DoAssign
add.w d0,d2
lea Ass5(pc),a0 Accessories
bsr.s DoAssign
add.w d0,d2
lea Ass6(pc),a0 Compiler
bsr.s DoAssign
add.w d0,d2
lea Ass7(pc),a0 Extras
bsr.s DoAssign
add.w d0,d2
beq.s .Skip sur les accessoires,
lea Ass0(pc),a0 On assigne AMOSPro_System:
bsr.s DoAssign
.Skip move.l ParamE(a5),d1
DosCall _LVOClose
.NoAss rts
* Routine, fait les assigns, si possible!
DoAssign
movem.l d1-d7/a0-a6,-(sp)
move.l a0,-(sp)
move.l Name1(a5),a1 * Regarde si existe deja!
.CoCop1 move.b (a0)+,(a1)+
bne.s .CoCop1
move.l a0,-(sp)
JJsr L_RExist
bne .NoAss
; move.l Buffer(a5),a0 * Fabrique le path normal
; lea 384(a0),a0
; move.l Name1(a5),a1
;.CoCop2 move.b (a0)+,(a1)+
; bne.s .CoCop2
; subq.l #1,a1
; move.l (sp),a0
;.CoCop3 move.b (a0)+,(a1)+
; bne.s .CoCop3
; JJsr L_RExist
; bne.s .DoAss
lea Sys_Pathname(a5),a0 * Essaie avec le directory APSystem!
move.l Name1(a5),a1
.CoCup2 move.b (a0)+,(a1)+
bne.s .CoCup2
move.b #"/",-1(a1) En arriere un directory!
move.l (sp),a0
.CoCup3 move.b (a0)+,(a1)+
bne.s .CoCup3
JJsr L_RExist
beq.s .NoAss
.DoAss lea AssCall(pc),a0 * Appelle la commande
move.l Buffer(a5),a1
.CoCop4 move.b (a0)+,(a1)+
bne.s .CoCop4
move.l 4(sp),a0
subq.l #1,a1
.CoCop5 move.b (a0)+,(a1)+
bne.s .CoCop5
move.b #32,-1(a1)
move.b #'"',(a1)+
move.l Name1(a5),a0
.CoCop6 move.b (a0)+,(a1)+
bne.s .CoCop6
move.b #'"',-1(a1)
clr.b (a1)
move.l Buffer(a5),d1
move.l ParamE(a5),d2
move.l ParamE(a5),d3
move.l DosBase(a5),a6
jsr -222(a6)
moveq #1,d0
bra.s .Quit
.NoAss moveq #0,d0
.Quit addq.l #8,sp
movem.l (sp)+,d1-d7/a0-a6
rts
; Charge / Efface la souris , fill patterns
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LdMouse
moveq #2,d0 Mouse.Abk
jsr Sys_GetMessage
tst.b (a0) Utiliser le defaut
beq.s .Skip
; Charge la banque
jsr Sys_AddPath
move.l #1005,d2
jsr D_Open
beq TheEnd_Cantread
moveq #0,d2 Demande la taille du fichier
moveq #1,d3
jsr D_Seek
moveq #0,d3
jsr D_Seek
move.l d0,d3
; Reserve un buffer de la taille des sprites
move.l #Chip|Public|Clear,d1
lea PI_AdMouse(a5),a0
jsr A5_Reserve
beq JTheEnd_OOMem
move.l a0,T_MouBank(a5)
; Lis le fichier dans le buffer
move.l a0,d2
move.l a0,a2
jsr D_Read
bne TheEnd_Cantread
cmp.l #"AmSp",(a2)
bne TheEnd_Cantread
cmp.w #4,(a2)+
bcs TheEnd_Cantread
; Ferme le fichier!
jsr D_Close
.Skip rts
; Charge/Efface la banque de resource file-selector
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
LdFSel moveq #8,d0
jsr Sys_GetMessage
jsr Sys_AddPath
lea Sys_Banks(a5),a0
move.l a0,Cur_Banks(a5)
move.l #1005,d2
jsr D_Open
beq TheEnd_Cantread
moveq #16,d0
JJsr L_Bnk.Load
bne JTheEnd_OOMem
jsr D_Close
; Met l'adresse de la banque de resource
moveq #16,d0
JJsr L_Bnk.GetAdr
cmp.l #"Reso",-8(a0)
bne TheEnd_Cantread
move.l a0,Sys_Resource(a5)
rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; CHARGEMENT DES LIBRARIES + EXTENSIONS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Libraries_Load
; - - - - - - - - - - - - - - - -
; Librairie principale AMOS
; ~~~~~~~~~~~~~~~~~~~~~~~~~
moveq #14,d0
jsr Sys_GetMessage
jsr Sys_AddPathCom
moveq #0,d0
bsr Library_Load
bne.s .Err
; Extensions
; ~~~~~~~~~~
moveq #1,d2
.Loop move.l d2,d0
add.w #16-1,d0
jsr Sys_GetMessage
tst.b (a0)
beq.s .Next
jsr Sys_AddPathCom
move.w d2,d0
bsr Library_Load
bne.s .Err
.Next addq.w #1,d2
cmp.w #27,d2
bne.s .Loop
moveq #0,d0
.Err rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RELOCATION DES LIBRAIRIES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Libraries_Reloc
; - - - - - - - - - - - - - - - -
moveq #0,d2
.Loop1 move.l d2,d0
bsr Library_Reloc
bne.s .Err
addq.w #1,d2
cmp.w #27,d2
bne.s .Loop1
jsr Libraries_FreeSizes
moveq #0,d2
.Loop2 move.l d2,d0
bsr Library_GetParams
bne.s .Err
addq.w #1,d2
cmp.w #27,d2
bne.s .Loop2
moveq #0,d0
.Err rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INITIALISATION DES LIBRAIRIES
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Libraries_Init
; - - - - - - - - - - - - - - - -
moveq #0,d2
.Loop move.l d2,d0
bsr Library_Init
bne.s .Err
addq.w #1,d2
cmp.w #27,d2
bne.s .Loop
moveq #0,d0
.Err rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; CHARGEMENT D'UNE LIBRAIRIE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Name1= Nom
; A0= Command line
; D0= Numero
; - - - - - - - - - - - - - - - -
Library_Load
; - - - - - - - - - - - - - - - -
movem.l d2-d7/a2-a6,-(sp)
move.l d0,d6
move.l a0,a4
lea AdTokens(a5),a6
lsl.w #2,d0
add.w d0,a6
; Ouvre le fichier
; ~~~~~~~~~~~~~~~~
move.l #1005,d2
jsr D_Open
beq Ll_Disc
; Lis l'entete dans le buffer
move.l Buffer(a5),d2
move.l #$20+18,d3
jsr D_Read
bne Ll_Disc
move.l d2,a3
lea $20(a3),a3
move.l (a3),d5
lsr.l #1,d5 D5= nombre de fonctions
; Reserve la zone memoire...
move.l d5,d4
lsl.l #2,d4 Taille des jumps
addq.l #4,d4 + Dernier jump (taille derniere routine)
moveq #LB_Size,d3 Data zone negative
add.l 4(a3),d3 + Tokens
add.l 8(a3),d3 + Librairie
add.l 12(a3),d3 + Titre
move.l d3,d0
add.l d4,d0
move.l d0,d1
SyCall MemFastClear
beq Ll_OMem
lea LB_Size(a0,d4.l),a2 Saute les jumps et la datazone
move.l a2,(a6) Extension chargee!!!
move.l d1,LB_MemSize(a2) Taille de la zone memoire
move.l a0,LB_MemAd(a2) Adresse de base
move.l (a3),d3 Buffer temporaire pour les tailles
move.l d3,d0
addq.l #4,d0
SyCall MemFastClear
beq Ll_OMem
move.l d3,(a0)+
move.l a0,LB_LibSizes(a2)
; Une nouvelle / ancienne librarie?
clr.w LB_Flags(a2) Flags
bset #LBF_20,LB_Flags(a2)
moveq #4,d3
move.l Buffer(a5),d2
jsr D_Read
bne Ll_Disc
move.l d2,a0
cmp.l #"AP20",(a0)
beq.s .Suit
bclr #LBF_20,LB_Flags(a2)
moveq #-4,d2
moveq #0,d3
jsr D_Seek
; Charge les tailles des routines
.Suit move.l LB_LibSizes(a2),a0
move.l -4(a0),d3
move.l a0,d2
jsr D_Read des routines
bne Ll_Disc
; Fabrique la table d'adresse des routines internes
move.w d5,d0
subq.w #1,d0
move.l a2,d1 Base des tokens
add.l 4(a3),d1 + Taille des tokens = Librairie
lea Ll_Rts(pc),a0 RTS pour les fonctions vides
move.l a0,d3
move.l LB_LibSizes(a2),a0 Liste des fonctions
lea -LB_Size(a2),a1 Debut des adresses
moveq #0,d2
.Loop1 move.l d1,-(a1)
move.w (a0)+,d2
bne.s .Skip1
move.l d3,(a1) Si routine vide>>> RTS
.Skip1 add.l d2,d1
add.l d2,d1
dbra d0,.Loop1
; Charge tout le reste
move.l 4(a3),d3 Tokens
add.l 8(a3),d3 + Librairie
add.l 12(a3),d3 + Titre
move.l a2,d2
jsr D_Read
bne Ll_Disc
; Ferme le fichier!
jsr D_Close
; Rempli la datazone
move.w d5,LB_NRout(a2) Nombre de routines
move.l 4(a3),d0
add.l 8(a3),d0
add.l a2,d0
move.l d0,LB_Title(a2) Adresse du titre
move.l a4,LB_Command(a2) Command line
; Pas d'erreur
moveq #0,d0
bra Ll_Out
Ll_Rts illegal RTS pour les fonctions vides...
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INTEGRATION DES LIBRAIRIES INTERNES AMOS
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
;
; - - - - - - - - - - - - - - - -
Library_Patch
; - - - - - - - - - - - - - - - -
movem.l a2-a6/d2-d7,-(sp)
move.l AdTokens(a5),a2
move.l LB_LibSizes(a2),a3
lea AMOSJmps,a1
move.w (a1)+,d0
.Loop lsl.w #1,d0 Plus de taille => plus de relocation
clr.w 0(a3,d0.w)
lsl.w #1,d0 Pointe dans la librarie
neg.w d0
lea -LB_Size-4(a2,d0.w),a0
move.l (a1)+,(a0)
move.w (a1)+,d0
bne.s .Loop
moveq #0,d0
bra Ll_Out
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; RELOCATION D'UNE LIBRAIRIE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; D0= Numero
; - - - - - - - - - - - - - - - -
Library_Reloc
; - - - - - - - - - - - - - - - -
movem.l d2-d7/a2-a6,-(sp)
move.l d0,d6
lea AdTokens(a5),a3
lsl.w #2,d0
move.l 0(a3,d0.w),d0
beq Ll_Out
move.l d0,a3
; Une librarie 2.0?
; ~~~~~~~~~~~~~~~~~~~~~~~
btst #LBF_20,LB_Flags(a3)
bne.s .20
; Ancienne extension: reloge la table de tokenisation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.l a3,a0
move.l a0,d1
lea 6(a0),a0
.Loop2 move.w (a0),d0
beq.s .Loop4
bmi.s .Loop3
lsl.w #2,d0
neg.w d0
move.l -LB_Size-4(a3,d0.w),d2
sub.l d1,d2
move.w d2,(a0)
.Loop3 move.w 2(a0),d0
beq.s .Loop4
bmi.s .Loop4
lsl.w #2,d0
neg.w d0
move.l -LB_Size-4(a3,d0.w),d2
sub.l d1,d2
move.w d2,2(a0)
.Loop4 addq.l #4,a0
.Loop5 tst.b (a0)+
bpl.s .Loop5
.Loop6 tst.b (a0)+
bpl.s .Loop6
move.w a0,d0
and.w #$0001,d0
add.w d0,a0
tst.w (a0)
bne.s .Loop2
bra .Fin20
; Nouvelle librarie: exploration de la table de tokens
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.20 move.l a3,a0
.RLoop move.w 2(a0),d1
move.w (a0),d0
beq .RExit
bmi.s .RFonc
cmp.w #1,d0
beq.s .RFonc
; Une Instruction / Instruction ET fonction
.RInst addq.w #1,d0 Instruction pointe direct
; bmi.s .INop Instruction NOP
lsl.w #2,d0
neg.w d0
move.w d0,(a0)
tst.w d1 Faire un flag?
bmi .RNext
moveq #0,d0
bset #6,d0 Une instruction
cmp.w #1,d1
ble.s .RSuit
bset #7,d0 Une instruction + fonction
bra.s .RSuit
;.INop move.w #1,(a0) Positif>>> Instruction NOP
; moveq #0,d0
; bra.s .RNext
; Une fonction / Fonction mathematique
.RFonc cmp.w #1,d1 1, ou 0>>> VIDE!!!
ble.s .RSuit
lsl.w #2,d1 Fonction, pointe AVANT
neg.w d1
move.w d1,(a0)
and.w #$FF00,d0 Fonction normale?
beq .RFn
and.w #%0111111100000000,d0 Faire un flag?
beq .RNext
.RFn bset #7,d0 Une fonction!
; Fabrication du flag parametres...
.RSuit lea 4(a0),a1
moveq #0,d1
.RNom tst.b (a1)+ Saute le nom
bpl.s .RNom
moveq #0,d2 Type de fonction
move.b (a1)+,d1 Definition fonction / instruciton
bmi.s .RDoke
cmp.b #"C",d1 Une constante
beq.s .RCst
cmp.b #"V",d1 Une variable reservee?
bne.s .RSkip1
move.b (a1)+,d1
bmi.s .RDoke
or.w #L_VRes,d0 Flag variable reservee
.RSkip1 move.b (a1)+,d1 Prend le parametre
bmi.s .RDoke Fini?
addq.w #1,d0 Un parametre de plus
sub.w #"0",d1 Pointeur
lsl.w #1,d1
jmp .Jmp(pc,d1.w)
.Jmp bra.s .RSkip2 0 Entier,
bra.s .Float 1 Float: veut un parametre float
bra.s .RSkip2 2 String,
bra.s .RSkip2 3 Indifferent, accepte par le test
bra.s .Math 4 Math, appelle la fonction parametre
.Angle or.w #L_FAngle,d0 5 Angle, veut un float en radian
bra.s .RSkip2
.Math or.w #L_FMath,d0
bra.s .RSkip2
.Float or.w #L_FFloat,d0
.RSkip2 move.b (a1)+,d1
bpl.s .RSkip1
.RDoke move.w d0,2(a0) Doke le flag parametres
move.l a1,d0 On est deja a la fin
addq.l #1,d0
and.w #$FFFE,d0
move.l d0,a0
bra .RLoop On peut donc reboucler
.RCst tst.b (a1)+ Une constante
bpl.s .RCst
bra.s .RDoke
.RNext clr.w 2(a0) Pas de flag
bsr Ll_TkNext Saute le token
bra .RLoop
.RExit
addq.l #2,a0
; Swapper les routines floats?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.l #"FSwp",(a0)
bne.s .NoFSwp
move.w 4(a0),LB_DFloatSwap(a3)
move.w 6(a0),LB_FFloatSwap(a3)
addq.l #8,a0
.NoFSwp
; Des donnees pour le compilateur?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.l #"ComP",(a0) Le code?
bne.s .NoComp
move.w 4(a0),d0
lea 4+2(a0,d0.w),a0 On les saute
.NoComp
; Une table de verification rapide?
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
cmp.l #"KwiK",(a0) Le code?
bne.s .NoKwik
lea 4(a0),a0
move.l a0,LB_Verif(a3) Poke l'adresse...
.NoKwik
.Fin20
; Relocation des routines...
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.w LB_NRout(a3),d3 Nombre de routines
move.w d3,d5 Pour comparer...
subq.w #1,d3
lea -LB_Size(a3),a2
move.l LB_LibSizes(a3),a4 Tailles des routines
GRou0 move.l -(a2),a0 Debut routine
moveq #0,d4
move.w (a4)+,d4
beq.s GRouN
lsl.l #1,d4
add.l a0,d4 Fin routine
GRou1 move.b (a0),d0
cmp.b #C_Code1,d0
beq GRou10
GRou2 addq.l #2,a0
cmp.l d4,a0
bcs.s GRou1
GRouN dbra d3,GRou0
bra GRouX
; Instruction speciale
GRou10 move.w (a0),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 GRouJ ; 0 - RJmp / Rjmptable
dc.w $4ef9 JMP
jmp (a0)
bra GRouJ ; 1 - RJsr / Rjsrtable
dc.w $4eb9 JSR
jsr (a0)
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 / Ret_Inst
GRouMve move.l 0(a4),a0
GRlea lea $0.l,a0
CJsr jsr 0(a4)
CRts rts
CNop nop
; RJMP / RJSR
GRouJ cmp.b #C_CodeJ,2(a0)
beq.s .Rjsr
cmp.b #C_CodeT,2(a0)
bne GRou2
; Rjsrt / Rjmpt
move.b 3(a0),d0
cmp.b #8,d0
bcc.s .Rlea
and.w #$0007,d0
move.w d0,d1
lsl.w #8,d1
lsl.w #1,d1
or.w GRouMve(pc),d1 Move.l X(a4),ax
move.w d1,(a0)+
move.w 2(a0),d1
lsl.w #2,d1
add.w #LB_Size+4,d1
neg.w d1
move.w d1,(a0)+
or.w 6(a1,d2.w),d0 Jsr/Jmp (ax)
move.w d0,(a0)+
bra GRou1
; Rlea
.Rlea subq.b #8,d0
cmp.b #8,d0
bcc GRou2
lsl.w #8,d0
lsl.w #1,d0
or.w GRlea(pc),d0
move.w d0,(a0)
move.w 4(a0),d0
moveq #0,d1
addq.l #6,a0
bra.s .Qq
; Rjsr / Rjmp direct
.Rjsr moveq #0,d1 Transforme en JSR direct
move.b 3(a0),d1
cmp.b #27,d1 Numero de l'extension
bcc GRou2
move.w 4(a1,d2.w),(a0)
move.w 4(a0),d0
addq.l #6,a0
ext.w d1
; Extension quelconque
.Qq lsl.w #2,d1
lea AdTokens(a5),a1
move.l 0(a1,d1.w),d1
beq Ll_BadExt
move.l d1,a1 Adresse des tokens de l'extension
btst #LBF_20,LB_Flags(a3)
bne.s .New
bsr Ext_OldLabel Converti en ancien label
bne.s .AA
bra Ll_BadExt
.New cmp.w LB_NRout(a1),d0 Superieur au maximum?
bcc Ll_BadExt
.AA lsl.w #2,d0
neg.w d0
move.l -LB_Size-4(a1,d0.w),-4(a0)
bra GRou1
; RBRA etc..
GRouB move.w 2(a0),d0
cmp.w d5,d0
bcc GRou2
lsl.w #2,d0
move.w 4(a1,d2.w),(a0)+
neg.w d0
move.l -LB_Size-4(a3,d0.w),d0
sub.l a0,d0
cmp.l #-32766,d0
ble Gfaux
cmp.l #32766,d0
bge Gfaux
move.w d0,(a0)+
bra GRou1
; Instruction RDATA / Ret_Inst
GRouD cmp.w #C_CodeD,2(a0)
bne GRou2
move.w CNop(pc),d0
move.w d0,(a0)+
move.w d0,(a0)+
bra GRouN
; Fini, pas d'erreur
GRouX jsr Sys_ClearCache Nettoie les caches
moveq #0,d0
bra Ll_Out
Gfaux illegal
; Sortie des chargements/relocation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ll_BadExt
moveq #2,d0
bra.s Ll_Err
Ll_Disc moveq #1,d0
bra.s Ll_Err
Ll_OMem moveq #2,d0
Ll_Err
Ll_Out movem.l (sp)+,d2-d7/a2-a6
rts
; Retrouve le nouveau label a partir des anciens
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ext_OldLabel
movem.l a0/d1,-(sp)
lea Ext_Convert(pc),a0
bra.s .In
.Loop cmp.w d0,d1
beq.s .Ok
addq.l #4,a0
.In move.w (a0),d1
bne.s .Loop
.Out movem.l (sp)+,a0/d1
rts
.Ok move.w 2(a0),d0
bra.s .Out
; Table de conversion des labels AMOSPro 1.0 >>> AMOSPro 2.0
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ext_Convert
dc.w 1024,L_Error
dc.w 1025,L_ErrorExt
dc.w 207,L_Test_PaSaut
dc.w 956,L_WaitRout
dc.w 287,L_GetEc
dc.w 46,L_Demande
dc.w 432,L_RamFast
dc.w 433,L_RamChip
dc.w 434,L_RamFast2
dc.w 435,L_RamChip2
dc.w 436,L_RamFree
dc.w 1100,L_Bnk.GetAdr
dc.w 1101,L_Bnk.GetBobs
dc.w 1102,L_Bnk.GetIcons
dc.w 1103,L_Bnk.Reserve
dc.w 1104,L_Bnk.Eff
dc.w 1105,L_Bnk.EffA0
dc.w 1106,L_Bnk.EffTemp
dc.w 1107,L_Bnk.EffAll
dc.w 1234,L_Bnk.Change
dc.w 1121,L_Bnk.OrAdr
dc.w 1119,L_Dsk.PathIt
dc.w 1120,L_Dsk.FileSelector
dc.w 1122,L_Dev.Open
dc.w 1123,L_Dev.Close
dc.w 1124,L_Dev.GetIO
dc.w 1125,L_Dev.AbortIO
dc.w 1126,L_Dev.DoIO
dc.w 1127,L_Dev.SendIO
dc.w 1128,L_Dev.CheckIO
dc.w 1129,L_Dev.Error
dc.w 0,0
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; Relocation des recoltes de parametres
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Library_GetParams
; - - - - - - - - - - - - -
movem.l d2-d7/a2-a6,-(sp)
moveq #0,d5
lsl.w #2,d0
beq.s .Skip
moveq #20,d5 Offset aux routines si ext
.Skip move.l AdTokens(a5,d0.w),d0
beq Ll_Out
move.l d0,a6 Base des tokens explores
btst #LBF_20,LB_Flags(a6) Une librarie 2.0???
beq .No20 NON!
move.l AdTokens(a5),a4 Base des routines principales
JLea L_Parameters,a3 Routines de recolte
move.l a6,a2
; Exploration de la table de tokens
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
move.w (a2),d3
.Loop
; move.l 4(a2),d0
; cmp.l #"x mo",d0
; bne.s .Skkk
; jsr BugBug
.Skkk
move.w 2(a2),d4
beq.s .Next
; Une instruction?
; ~~~~~~~~~~~~~~~~
move.w d4,d1
and.w #%0000000000111111,d1 Nombre de parametres
move.w d1,2(a2)
btst #6,d4
beq.s .NoIns
move.w d4,d2
lea -LB_Size(a6,d3.w),a1
moveq #0,d0
bsr .Rout
.NoIns
; Une fonction?
; ~~~~~~~~~~~~~
btst #7,d4
beq.s .NoFunc
move.w 2(a2),d1
move.w d4,d2
lea -LB_Size-4(a6,d3.w),a1
moveq #2,d0
bsr .Rout
.NoFunc
; Suivante
; ~~~~~~~~
.Next addq.l #4,a2
.Ins tst.b (a2)+
bpl.s .Ins
.Ins2 tst.b (a2)+
bpl.s .Ins2
move.l a2,d0
and.w #$0001,d0
add.w d0,a2
move.w (a2),d3
bne.s .Loop
.No20 moveq #0,d0
bra Ll_Out
; Branche la routine
; ~~~~~~~~~~~~~~~~~~~~~~~~
.Rout and.w #$7000,d2 Isole le code
rol.w #4,d2 Pointe la table
lsl.w #1,d2
jmp .Jmps(pc,d2.w) Branche a la routine
.Jmps bra.s .Entier 0
bra.s .Float 1
bra.s .FAngle 2
bra.s .FMath 3
bra.s .Var 4
.Float tst.w d1 Des parametres?
beq.s .Exit
addq.w #6,d1 Float
cmp.w #6+6,d1
bcs.s .Doke
moveq #6+5,d1
bra.s .Doke
.IVar add.w #12,d1 Variable reservee en instruction
cmp.w #12+6,d1
bcs.s .Doke
moveq #12+5,d1
bra.s .Doke
.FAngle moveq #0,d0
moveq #18,d1 Fonction angle
bra.s .Doke
.FMath moveq #0,d0
moveq #19,d1 Fonction math
bra.s .Doke
.Var tst.w d0 Variable reservee en fonction
beq.s .IVar
.Entier tst.w d1 Des parametres?
beq.s .Exit
cmp.w #6,d1 Entier
bcs.s .Doke
moveq #5,d1
; Doke l'adresse de la fonction
.Doke add.w d5,d1 Plus offset general aux routines
lsl.w #1,d1 Pointe la table des adresses
move.w 0(a3,d1.w),d1 Delta au debut
sub.w d0,d1 Moins ADDQ.L #2,a6 si fonction
ext.l d1
add.l a3,d1 Plus debut
sub.l a4,d1 Moins base
move.l (a1),a0 Adresse de la routine
move.w CJsr(pc),d0
cmp.l #"GetP",-(a0) Un espace pour parametres?
beq.s .Ok
cmp.w 4(a0),d0 Deja fait?
beq.s .Exit
illegal
.Ok move.w d0,(a0)+ Met le JSR
move.w d1,(a0)+ Doke le delta
subq.l #4,(a1) Recule la fonction
.Exit rts
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
; INITIALISATION D'UNE LIBRAIRIE
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Library_Init
; - - - - - - - - - - - - - - - -
movem.l d2-d7/a2-a6,-(sp)
lea AdTokens(a5),a3
move.w d0,d1
lsl.w #2,d0
move.l 0(a3,d0.w),d0
beq Ll_Out
move.l d0,a3
subq.w #1,d1 Extension= number-1
move.w d1,-(sp)
move.l -LB_Size-4(a3),a0 Adresse routine #0
move.l LB_Command(a3),a1 Command Line
move.l #"APex",d1 Magic
move.l #VerNumber,d2 Numero de version
jsr (a0)
move.w (sp)+,d3
tst.w d0 Refuse de charger...
bpl.s .Nomi
cmp.l #"Asci",d1 Un Message?
bne Ll_BadExt
move.l a0,d0 Un message?
bra Ll_Mess Oui,
.Nomi ext.w d0
cmp.w d0,d3 Bon numero d'extension?
bne Ll_BadExt
moveq #0,d0
bra Ll_Out
Ll_Mess bra Ll_BadExt Illegal
; Passe <20> le prochaine instruction
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Ll_TkNext
addq.l #4,a0
.Loop1 tst.b (a0)+
bpl.s .Loop1
.Loop2 tst.b (a0)+
bpl.s .Loop2
move.w a0,d0
and.w #$0001,d0
add.w d0,a0
rts
; Erreurs lors du chargement
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
TheEnd_Badext
lea Panic_Badext(pc),a0
bra.s TheEndM
TheEnd_APSystem
lea Panic_APSystem(pc),a0
bra.s TheEndM
TheEnd_Cantread
lea Panic_Cantread(pc),a0
TheEndM move.l a0,Panic
jmp TheEnd
; Erreur avec datazone non r<>serv<72>e
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Boot_Fatal
; Libere amos.library s'il faut
move.l SP_DosBase(sp),a6
move.l SP_WSegment(sp),d1
beq.s .Skip
jsr _LVOUnLoadSeg(a6)
; Affiche le message d'erreur
.Skip move.l SP_DosBase(sp),a3
move.l SP_IntBase(sp),a4
move.l SP_Message(sp),d7
jsr Panic_Message
; Ferme DOS / INTUITION
move.l $4.w,a6
move.l SP_DosBase(sp),a1
jsr _LVOCloseLibrary(a6)
move.l SP_IntBase(sp),a1
jsr _LVOCloseLibrary(a6)
; On peut maintenant sortir!
move.l SP_Message(sp),d7
; Va a la sortie generale!
jmp Get_Out
; Data initialisation
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Nom_W ds.b 32
NDatas2 dc.b "s:"
NDatas1 dc.b "AMOSPro_Interpreter_Config",0
NDatas3 dc.b "s/AMOSPro_Interpreter_Config",0
LibName1 dc.b "libs:amos.library",0
LibName2 dc.b "APSystem/amos.library",0
LibName3 dc.b "libs/amos.library",0
IconName: dc.b "icon.library",0
FloatName: dc.b "mathffp.library",0
IntName: dc.b "intuition.library",0
GfxName: dc.b "graphics.library",0
AssInst dc.b "c:assign",0
AssCall dc.b "c:assign ",0
Ass0 dc.b "AMOSPro_System:",0
dc.b 0
Ass1 dc.b "AMOSPro_Accessories:",0
dc.b "Accessories",0
Ass2 dc.b "AMOSPro_Productivity1:",0
dc.b "Productivity1",0
Ass3 dc.b "AMOSPro_Productivity2:",0
dc.b "Productivity2",0
Ass4 dc.b "AMOSPro_Tutorial:",0
dc.b "Tutorial",0
Ass5 dc.b "AMOSPro_Examples:",0
dc.b "Examples",0
Ass6 dc.b "AMOSPro_Compiler:",0
dc.b "Compiler",0
Ass7 dc.b "AMOSPro_Extras:",0
dc.b "Extras",0
AssCon dc.b "NIL:",0
; Messages d'erreur d'alerte
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Panic_APSystem dc.b "Cannot find APSystem folder.",0
Panic_Lib dc.b "Cannot find AMOS.library.",0
Panic_Config dc.b "Cannot find AMOSPro_Interpreter_Config.",0
Panic_Command dc.b "Bad command line.",0
Panic_Cantread dc.b "Cannot read system files: check APSystem folder.",0
Panic_Badext dc.b "Cannot load extension: use default interpreter config.",0
Panic_Version dc.b "I need AMOS.library V2.0 or over!",0
even
; Adresses des routines accessibles aux extensions
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
AMOSJmps Include "+Internal_Jumps.s"