2986 lines
68 KiB
ArmAsm
2986 lines
68 KiB
ArmAsm
|
; ______________________________________________________________________________
|
|||
|
; ..............................................................................
|
|||
|
; ...................................................................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"
|