1607 lines
34 KiB
ArmAsm
1607 lines
34 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.2200002....220002...22.....200002..0000000000002...................
|
|||
|
; ...220000..222000002...20000..........200000......2222........................
|
|||
|
; ...000000000000000000..200000..........00002..................................
|
|||
|
; ..220000000022020000002.200002.........22.......______________________________
|
|||
|
; ..0000002........2000000220022.................|
|
|||
|
; .200000............2002........................| AMOS Compiler Extension
|
|||
|
; .200002........................................| For AMOSPro 2.0 and over
|
|||
|
; 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 the files automatically calculated by
|
|||
|
; Library_Digest.AMOS
|
|||
|
;---------------------------------------------------------------------
|
|||
|
Include "+AMOS_Includes.s"
|
|||
|
Include "+Version.s"
|
|||
|
Include "+Compext_Size.s"
|
|||
|
Include "+Compext_Labels.s"
|
|||
|
|
|||
|
INCDIR "Work:Includes/i/"
|
|||
|
Include "pp/powerpacker_lib.i"
|
|||
|
Include "pp/ppbase.i"
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; Initialisation stuff
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
|
|||
|
ExtNb equ 5-1
|
|||
|
|
|||
|
Dlea MACRO
|
|||
|
move.l ExtAdr+ExtNb*16(a5),\2
|
|||
|
add.w #\1-DT,\2
|
|||
|
ENDM
|
|||
|
Dload MACRO
|
|||
|
move.l ExtAdr+ExtNb*16(a5),\1
|
|||
|
ENDM
|
|||
|
|
|||
|
Cmp_Magic equ "Gaga"
|
|||
|
|
|||
|
dc.l C_Tk-C_Off
|
|||
|
dc.l C_Lib-C_Tk
|
|||
|
dc.l C_Title-C_Lib
|
|||
|
dc.l C_End-C_Title
|
|||
|
dc.w 0
|
|||
|
dc.b "AP20"
|
|||
|
|
|||
|
;---------------------------------------------------------------------
|
|||
|
; Creates the pointers to functions
|
|||
|
;---------------------------------------------------------------------
|
|||
|
MCInit
|
|||
|
C_Off
|
|||
|
REPT Lib_Size
|
|||
|
MC
|
|||
|
ENDR
|
|||
|
|
|||
|
;---------------------------------------------------------------------
|
|||
|
; TOKEN TABLE
|
|||
|
;---------------------------------------------------------------------
|
|||
|
; TOKEN_START
|
|||
|
C_Tk
|
|||
|
dc.w L_Nul,L_Nul
|
|||
|
dc.b $80,-1
|
|||
|
TkCmp dc.w L_CmpCall,L_Nul
|
|||
|
dc.b "cmpcal","l"+$80,"I",-1
|
|||
|
TkCOp dc.w L_CmpOpt,L_Nul
|
|||
|
dc.b "comp option","s"+$80,"I2",-1
|
|||
|
TkTston dc.w L_Rien,L_Nul
|
|||
|
dc.b "comp test o","n"+$80,"I",-1
|
|||
|
TkTstof dc.w L_Rien,L_Nul
|
|||
|
dc.b "comp test of","f"+$80,"I",-1
|
|||
|
TkTst dc.w L_Rien,L_Nul
|
|||
|
dc.b "comp tes","t"+$80,"I",-1
|
|||
|
dc.w L_Compile1,L_Nul
|
|||
|
dc.b "!compil","e"+$80,"I2",-2
|
|||
|
dc.w L_Compile2,L_Nul
|
|||
|
dc.b $80,"I2,0",-1
|
|||
|
dc.w L_Nul,L_CompErr
|
|||
|
dc.b "comp err","$"+$80,"2",-1
|
|||
|
dc.w L_CompLoad0,L_Nul
|
|||
|
dc.b "!comp loa","d"+$80,"I",-2
|
|||
|
dc.w L_CompLoad1,L_Nul
|
|||
|
dc.b $80,"I2",-1
|
|||
|
dc.w L_CompDel,L_Nul
|
|||
|
dc.b "comp de","l"+$80,"I",-1
|
|||
|
dc.w L_Nul,L_CompHere
|
|||
|
dc.b "comp her","e"+$80,"0",-1
|
|||
|
dc.w L_Nul,L_CompSize
|
|||
|
dc.b "comp siz","e"+$80,"0",-1
|
|||
|
dc.w L_Nul,L_Squash
|
|||
|
dc.b "squas","h"+$80,"00,0,0,0,0",-1
|
|||
|
dc.w L_Nul,L_UnSquash
|
|||
|
dc.b "unsquas","h"+$80,"00,0",-1
|
|||
|
dc.w L_InppSave2,L_Nul
|
|||
|
dc.b "!ppsav","e"+$80,"I2,0",-2
|
|||
|
dc.w L_InppSave3,L_Nul
|
|||
|
dc.b $80,"I2,0,0",-1
|
|||
|
dc.w L_InppLoad1,L_Nul
|
|||
|
dc.b "!pploa","d"+$80,"I2",-2
|
|||
|
dc.w L_InppLoad2,L_Nul
|
|||
|
dc.b $80,"I2,0",-1
|
|||
|
|
|||
|
; TOKEN_END
|
|||
|
dc.w 0
|
|||
|
dc.l 0
|
|||
|
|
|||
|
|
|||
|
;---------------------------------------------------------------------
|
|||
|
Lib_Ini 0
|
|||
|
;---------------------------------------------------------------------
|
|||
|
|
|||
|
C_Lib
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; COLD START
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def Cmp_Cold
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
cmp.l #"APex",d1 V1.10 or over?
|
|||
|
bne.s .BadVer
|
|||
|
* Poke les adresses
|
|||
|
lea CD(pc),a0
|
|||
|
move.l a0,ExtAdr+ExtNb*16(a5)
|
|||
|
lea CmpEnd(pc),a0
|
|||
|
move.l a0,ExtAdr+ExtNb*16+8(a5)
|
|||
|
* Termin<EFBFBD>!
|
|||
|
.NoCom moveq #ExtNb,d0 Numero extension
|
|||
|
move.w #VerNumber,d1 Current AMOSPro Version
|
|||
|
rts
|
|||
|
* Bad version
|
|||
|
.BadVer sub.l a0,a0
|
|||
|
moveq #-1,d0 Retour a l'envoyeur!
|
|||
|
rts
|
|||
|
|
|||
|
******* Routine END
|
|||
|
CmpEnd: Rbra L_CompDel
|
|||
|
|
|||
|
; ---------------------------------------------------------------------
|
|||
|
; DATA ZONE
|
|||
|
CD
|
|||
|
Cmp_Vect dc.l 0
|
|||
|
Cmp_Jump dc.l 0
|
|||
|
Cmp_NSteps dc.l 0
|
|||
|
Cmp_Config dc.l 0
|
|||
|
pp_Base dc.l 0
|
|||
|
pp_Color dc.l 0
|
|||
|
pp_Flash dc.l 0
|
|||
|
pp_CrunchInfo dc.l 0
|
|||
|
|
|||
|
Cmp_Name1 dc.b "C:"
|
|||
|
Cmp_Name2 dc.b "APCmp",0
|
|||
|
CSize dc.l 0
|
|||
|
CNumb dc.l 0
|
|||
|
LErreur dc.w 0
|
|||
|
Erreur ds.b 80
|
|||
|
pp_Name dc.b "powerpacker.library",0
|
|||
|
|
|||
|
even
|
|||
|
; ---------------------------------------------------------------------
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; COMPCALL: appel du programme compile!
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par CmpCall
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
moveq #0,d0
|
|||
|
Rbra L_Custom
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; COMP OPTIONS "command line"
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par CmpOpt
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; COMPILE "command string"
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par Compile1
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
move.l d3,-(a3)
|
|||
|
Dload a2
|
|||
|
Rbsr L_CompLoad0
|
|||
|
move.l (a3)+,a0
|
|||
|
moveq #0,d0
|
|||
|
move.w (a0)+,d0
|
|||
|
move.l Cmp_Jump-CD(a2),a1
|
|||
|
jsr 4(a1)
|
|||
|
Rbra L_FinComp
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; COMPILE "Command line",magic
|
|||
|
; Special COMPILER.AMOS
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par Compile2
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Dload a2
|
|||
|
move.l (a3)+,a0
|
|||
|
moveq #0,d0
|
|||
|
move.w (a0)+,d0
|
|||
|
cmp.w #4,d0
|
|||
|
bne.s .Start
|
|||
|
cmp.l #"Step",(a0)
|
|||
|
beq.s .Step
|
|||
|
cmp.l #"Conf",(a0)
|
|||
|
beq.s .Conf
|
|||
|
cmp.l #"Cont",(a0)
|
|||
|
beq.s .Cont
|
|||
|
cmp.l #"Stop",(a0)
|
|||
|
beq.s .Stop
|
|||
|
Rbra L_FCall
|
|||
|
; Stocke le nombre de pas
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
.Step move.l d3,Cmp_NSteps-CD(a2)
|
|||
|
rts
|
|||
|
; Stocke l'adresse de la config
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
.Conf move.l d3,Cmp_Config-CD(a2)
|
|||
|
rts
|
|||
|
; Premier appel du compilateur
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
.Start cmp.l #Cmp_Magic,d3 Veut un magic!
|
|||
|
Rbne L_FCall
|
|||
|
move.l Cmp_NSteps-CD(a2),d1
|
|||
|
move.l Cmp_Config-CD(a2),d2
|
|||
|
tst.l Cmp_Vect-CD(a2)
|
|||
|
Rbeq L_FCall
|
|||
|
move.l Cmp_Jump-CD(a2),a1
|
|||
|
jsr 8(a1)
|
|||
|
bra.s .Fin
|
|||
|
; Arret du compilateur
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~
|
|||
|
.Stop cmp.l #Cmp_Magic,d3
|
|||
|
Rbne L_FCall
|
|||
|
move.l Cmp_Jump-CD(a2),a1
|
|||
|
jsr 16(a1)
|
|||
|
bra.s .Fin
|
|||
|
; Appels suivants
|
|||
|
; ~~~~~~~~~~~~~~~
|
|||
|
.Cont cmp.l #Cmp_Magic,d3
|
|||
|
Rbne L_FCall
|
|||
|
move.l Cmp_Jump-CD(a2),a1
|
|||
|
jsr 12(a1)
|
|||
|
; Retour de APCmp
|
|||
|
; ~~~~~~~~~~~~~~~
|
|||
|
.Fin clr.l ParamE(a5) Zero si termine!
|
|||
|
tst.l d0 D0>0 : message normal
|
|||
|
Rbpl L_FinComp
|
|||
|
cmp.w #-1,d0
|
|||
|
Rbne L_OOMem Out of memory!
|
|||
|
move.l d1,ParamE(a5) Position dans PARAM
|
|||
|
rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; =COMP ERR$
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par CompErr
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Dload a2
|
|||
|
moveq #0,d3
|
|||
|
move.w LErreur-CD(a2),d3
|
|||
|
beq.s .Vide
|
|||
|
Rjsr L_Demande
|
|||
|
move.w d3,d0
|
|||
|
move.l a0,d3
|
|||
|
move.w d0,(a1)+
|
|||
|
subq.w #1,d0
|
|||
|
lea Erreur-CD(a2),a0
|
|||
|
.Loop1 move.b (a0)+,(a1)+
|
|||
|
dbra d0,.Loop1
|
|||
|
move.w a1,d1
|
|||
|
and.w #$0001,d1
|
|||
|
add.w d1,a1
|
|||
|
move.l a1,HiChaine(a5)
|
|||
|
moveq #2,d2
|
|||
|
rts
|
|||
|
.Vide move.l ChVide(a5),d3
|
|||
|
moveq #2,d2
|
|||
|
rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; COMP TEST ON/OFF-> RIEN!
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par Rien
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; COMP LOAD
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par CompLoad0
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Dload a2
|
|||
|
lea Cmp_Name2-CD(a2),a0 APCMP
|
|||
|
Rjsr L_Sys_AddPath + path systeme
|
|||
|
Rbra L_CLoad = nom complet!
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; COMP LOAD "nom"
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par CompLoad1
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
move.l d3,a2
|
|||
|
Rjsr L_NomDisc Compute le nom >>> name1
|
|||
|
Rbra L_CLoad
|
|||
|
|
|||
|
; Charge le compilateur, nom= NAME1
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
Lib_Def CLoad
|
|||
|
movem.l a0-a2/d0-d2,-(sp)
|
|||
|
Dload a2
|
|||
|
tst.l Cmp_Vect-CD(a2)
|
|||
|
bne.s .Loaded
|
|||
|
move.l Name1(a5),d1
|
|||
|
move.l a6,-(sp)
|
|||
|
move.l DosBase(a5),a6
|
|||
|
jsr -150(a6)
|
|||
|
move.l (sp)+,a6
|
|||
|
move.l d0,Cmp_Vect-CD(a2)
|
|||
|
Rbeq L_NFound
|
|||
|
lsl.l #2,d0
|
|||
|
addq.l #4,d0
|
|||
|
move.l d0,a0
|
|||
|
cmp.l #"APcp",20(a0)
|
|||
|
bne.s .Error
|
|||
|
move.l a0,Cmp_Jump-CD(a2)
|
|||
|
.Loaded movem.l (sp)+,a0-a2/d0-d2
|
|||
|
rts
|
|||
|
.Error Rbsr L_CompDel
|
|||
|
moveq #95,d0
|
|||
|
Rjmp L_Error
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; EFFACE LE COMPILATEUR
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def CompDel
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
movem.l a0-a2/d0-d2,-(sp)
|
|||
|
Dload a2
|
|||
|
move.l Cmp_Vect-CD(a2),d1
|
|||
|
beq.s .skip
|
|||
|
clr.l Cmp_Vect-CD(a2)
|
|||
|
clr.l Cmp_Jump-CD(a2)
|
|||
|
move.l a6,-(sp)
|
|||
|
move.l DosBase(a5),a6
|
|||
|
jsr -156(a6)
|
|||
|
move.l (sp)+,a6
|
|||
|
.skip movem.l (sp)+,a0-a2/d0-d2
|
|||
|
rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; ERROR MESSAGES
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def FCall
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
moveq #23,d0
|
|||
|
Rjmp L_Error
|
|||
|
Lib_Def NFound
|
|||
|
moveq #81,d0
|
|||
|
Rjmp L_Error
|
|||
|
Lib_Def OOMem
|
|||
|
moveq #24,d0
|
|||
|
Rjmp L_Error
|
|||
|
Lib_Def Errdisc
|
|||
|
Rjmp L_DiskError
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; =COMPHERE
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par CompHere
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Dload a0
|
|||
|
moveq #0,d3
|
|||
|
tst.l Cmp_Vect-CD(a0)
|
|||
|
beq.s .skip
|
|||
|
moveq #-1,d3
|
|||
|
.skip Ret_Int
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; Fin de compilation
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def FinComp
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Dload a2
|
|||
|
move.l d1,CSize-CD(a2)
|
|||
|
move.l d2,CNumb-CD(a2)
|
|||
|
clr.w LErreur-CD(a2)
|
|||
|
tst.l d0
|
|||
|
beq.s Cmp3
|
|||
|
moveq #0,d2
|
|||
|
lea Erreur-CD(a2),a1
|
|||
|
Cmp2 cmp.w #80,d2
|
|||
|
bcc.s .Long
|
|||
|
addq.w #1,d2
|
|||
|
move.b (a0)+,(a1)+
|
|||
|
bne.s Cmp2
|
|||
|
.Long subq.w #1,d2
|
|||
|
move.w d2,LErreur-CD(a2)
|
|||
|
Cmp3 rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; =COMP SIZE
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par CompSize
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Dload a0
|
|||
|
move.l CSize-CD(a0),d3
|
|||
|
move.l CNumb-CD(a0),CSize-CD(a0)
|
|||
|
clr.l CNumb-CD(a0)
|
|||
|
Ret_Int
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; PPLOAD "bank"
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par InppLoad1
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
move.l d3,-(a3)
|
|||
|
move.l #EntNul,d3
|
|||
|
Rbra L_ppLoad
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Lib_Par InppLoad2
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
cmp.l #$10000,d3
|
|||
|
Rbge L_FCall
|
|||
|
Rbra L_ppLoad
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Lib_Def ppLoad
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
; illegal
|
|||
|
move.l (a3)+,a2
|
|||
|
Rjsr L_NomDisc
|
|||
|
; Rbsr L_Openpplib
|
|||
|
; move.l d0,a6
|
|||
|
; lea -8(sp),sp
|
|||
|
; move.l Name1(a5),a0
|
|||
|
; moveq #0,d0
|
|||
|
; move.l #Public|Chip,d1
|
|||
|
; lea (sp),a1
|
|||
|
; lea 4(sp),a2
|
|||
|
; move.l #-1,a3
|
|||
|
; jsr _LVOppLoadData(a6)
|
|||
|
; illegal
|
|||
|
move.l #1005,d2
|
|||
|
Rjsr L_D_Open
|
|||
|
Rbeq L_Errdisc
|
|||
|
move.l d3,d0
|
|||
|
Rbsr L_ppBnk_Load
|
|||
|
Rjsr L_D_Close
|
|||
|
Rjsr L_Bnk.Change
|
|||
|
rts
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Lib_Def ppBnk_Load
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
movem.l d2-d5/a2-a3,-(sp)
|
|||
|
Rjsr L_SaveRegs
|
|||
|
move.l d0,d5
|
|||
|
moveq #0,d0
|
|||
|
Rjsr L_ResTempBuffer
|
|||
|
; Lis l'entete
|
|||
|
move.l Buffer(a5),d2
|
|||
|
moveq #4,d3
|
|||
|
Rjsr L_D_Read
|
|||
|
Rbne L_Errdisc
|
|||
|
move.l d2,a2
|
|||
|
cmp.l #"PPbk",(a2)
|
|||
|
bne .Errbadformat
|
|||
|
moveq #12,d3
|
|||
|
Rjsr L_D_Read
|
|||
|
Rbne L_Errdisc
|
|||
|
move.w 2(a2),d2
|
|||
|
btst #Bnk_BitBob,d2
|
|||
|
bne.s .BbIc
|
|||
|
btst #Bnk_BitIcon,d2
|
|||
|
bne.s .BbIc
|
|||
|
; Une banque normale
|
|||
|
move.l 4(a2),d0 Longueur banque
|
|||
|
add.l #8+8,d0 + Flags + Header.lst
|
|||
|
move.l #Public,d1
|
|||
|
btst #Bnk_BitChip,d2
|
|||
|
beq.s .Skip
|
|||
|
move.l #Public|Chip,d1
|
|||
|
.Skip SyCall MemReserve Reserve le tempbuffer
|
|||
|
Rbeq L_OOMem
|
|||
|
subq.l #4,d0
|
|||
|
move.l d0,(a0)+
|
|||
|
move.l a0,TempBuffer(a5)
|
|||
|
addq.l #4,a0 Pointe au niveau des flags
|
|||
|
move.l a0,d2
|
|||
|
move.l 8(a2),d3 Longueur de la partie PP
|
|||
|
Rbsr L_LoadUncrunch
|
|||
|
; Efface la banque origine
|
|||
|
tst.l d5
|
|||
|
bpl.s .Skip3
|
|||
|
moveq #0,d5
|
|||
|
move.w (a2),d5
|
|||
|
.Skip3 move.l d5,d0
|
|||
|
Rjsr L_Bnk.Eff
|
|||
|
; Branche la banque dans la liste
|
|||
|
move.l Cur_Banks(a5),a0
|
|||
|
move.l TempBuffer(a5),a1
|
|||
|
clr.l TempBuffer(a5)
|
|||
|
move.l -(a1),d0
|
|||
|
subq.l #4,d0
|
|||
|
move.l d0,4(a1) Met la longueur en 2
|
|||
|
move.l (a0),(a1) Branche dans la liste
|
|||
|
move.l a1,(a0)
|
|||
|
addq.l #8,a1
|
|||
|
clr.w (a1)+
|
|||
|
move.w d5,(a1)+ Numero de la banque
|
|||
|
addq.l #2,a2
|
|||
|
move.w (a2)+,(a1)+ Flags
|
|||
|
clr.w (a1)+
|
|||
|
bra .Out
|
|||
|
; Une banque de sprites / icons
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
.BbIc move.l 4(a2),d0 Longueur tempbuffer
|
|||
|
addq.l #8,d0 + Securite pp
|
|||
|
Rjsr L_ResTempBuffer
|
|||
|
Rbeq L_OOMem
|
|||
|
move.l a0,d2 Adresse
|
|||
|
move.l 8(a2),d3 Longueur
|
|||
|
Rbsr L_LoadUncrunch Charge + Decompacte
|
|||
|
move.l TempBuffer(a5),a3
|
|||
|
addq.l #8,a3
|
|||
|
; Sprite / Icons / Load / Append
|
|||
|
move.w 2(a2),d0
|
|||
|
btst #Bnk_BitBob,d0
|
|||
|
beq.s .Icons
|
|||
|
; Bobs / Sprites
|
|||
|
move.w (a3)+,d6 Nombre de bobs
|
|||
|
tst.l d5 Overwrite?
|
|||
|
ble.s .Over
|
|||
|
Rjsr L_Bnk.GetBobs Demande le nombre de bobs
|
|||
|
beq.s .Over 0= overwrite
|
|||
|
moveq #1,d0 Append!
|
|||
|
move.w d6,d1
|
|||
|
move.w (a0),d5 Nombre actuel
|
|||
|
add.w d5,d1
|
|||
|
bra.s .Res
|
|||
|
.Over moveq #0,d0
|
|||
|
move.w d6,d1
|
|||
|
clr.w d5
|
|||
|
.Res Rjsr L_Bnk.ResBob Va reserve la place...
|
|||
|
Rbne L_OOMem
|
|||
|
bra.s .BB
|
|||
|
; Icons
|
|||
|
.Icons move.w (a3)+,d6 Nombre d'icons
|
|||
|
tst.l d5 Overwrite?
|
|||
|
ble.s .IOver
|
|||
|
Rjsr L_Bnk.GetIcons Demande le nombre de bobs
|
|||
|
beq.s .IOver 0= overwrite
|
|||
|
moveq #1,d0 Append!
|
|||
|
move.w d6,d1
|
|||
|
move.w (a0),d5 Nombre actuel
|
|||
|
add.w d5,d1
|
|||
|
bra.s .IRes
|
|||
|
.IOver moveq #0,d0
|
|||
|
move.w d6,d1
|
|||
|
clr.w d5
|
|||
|
.IRes Rjsr L_Bnk.ResIco Va reserve la place...
|
|||
|
Rbne L_OOMem
|
|||
|
; Partie commune
|
|||
|
; ~~~~~~~~~~~~~~
|
|||
|
.BB lsl.w #3,d5 Pointe le debut des nouveaux
|
|||
|
lea 2(a0,d5.w),a2
|
|||
|
subq.w #1,d6 D6= compteur
|
|||
|
bmi.s .Pal
|
|||
|
.LSLoop clr.l (a2)+ Raz
|
|||
|
clr.l (a2)+
|
|||
|
move.w (a3)+,d0 Prend les caracteristiques
|
|||
|
mulu (a3)+,d0
|
|||
|
mulu (a3)+,d0
|
|||
|
addq.l #4,a3
|
|||
|
lsl.l #1,d0 Vide?
|
|||
|
beq.s .Rien
|
|||
|
move.l d0,d3 Reserve la memoire
|
|||
|
add.l #10,d0
|
|||
|
SyCall MemChip
|
|||
|
Rbeq L_OOMem
|
|||
|
move.l a0,-8(a2) Poke le pointeur
|
|||
|
move.l -10(a3),(a0)+ TX/TY
|
|||
|
move.w -6(a3),(a0)+
|
|||
|
move.w -4(a3),(a0) Plus de FLAGS!
|
|||
|
and.w #$3FFF,(a0)+
|
|||
|
move.w -2(a3),(a0)+
|
|||
|
move.l a0,a1 Copie l'image
|
|||
|
move.l a3,a0
|
|||
|
move.l d3,d0
|
|||
|
Rjsr L_TransMem
|
|||
|
move.l a0,a3
|
|||
|
.Rien dbra d6,.LSLoop
|
|||
|
; Recopie la palette
|
|||
|
.Pal moveq #31,d0
|
|||
|
.PCopy move.w (a3)+,(a2)+
|
|||
|
dbra d0,.PCopy
|
|||
|
; Efface le tempbuffer
|
|||
|
moveq #0,d0
|
|||
|
Rjsr L_ResTempBuffer
|
|||
|
; Fini!
|
|||
|
.Out Rjsr L_LoadRegs
|
|||
|
movem.l (sp)+,a2-a3/d2-d5
|
|||
|
rts
|
|||
|
.Errbadformat
|
|||
|
moveq #2,d0
|
|||
|
Rbra L_Custom
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; Load + Uncrunch file
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def LoadUncrunch
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
movem.l d2-d3/a2,-(sp)
|
|||
|
; Ouvre la librairie
|
|||
|
Rbsr L_Openpplib
|
|||
|
; Charge le header >>> Buffer+16
|
|||
|
movem.l d2/d3,-(sp)
|
|||
|
move.l Buffer(a5),a2
|
|||
|
lea 16(a2),a2
|
|||
|
move.l a2,d2
|
|||
|
moveq #8,d3
|
|||
|
Rjsr L_D_Read
|
|||
|
Rbne L_Errdisc
|
|||
|
cmp.l #"PP20",(a2)+ A2 pointe sur efficiency
|
|||
|
Rbne L_Errdisc
|
|||
|
; Charge le fichier
|
|||
|
movem.l (sp)+,d2/d3
|
|||
|
Rjsr L_D_Read
|
|||
|
Rbne L_Errdisc
|
|||
|
; Decompacte le fichier
|
|||
|
move.l a6,-(sp)
|
|||
|
Dload a0
|
|||
|
move.l pp_Base-CD(a0),a6
|
|||
|
move.l d2,a0
|
|||
|
lea 8(a0),a1
|
|||
|
add.l d3,a0
|
|||
|
moveq #0,d0
|
|||
|
jsr _LVOppDecrunchBuffer(a6)
|
|||
|
move.l (sp)+,a6
|
|||
|
; Fini
|
|||
|
movem.l (sp)+,d2-d3/a2
|
|||
|
rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; PPSAVE "bank",number,efficiency
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par InppSave2
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
move.l d3,-(a3)
|
|||
|
moveq #2,d3
|
|||
|
Rbra L_InppSave3
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Lib_Par InppSave3
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
cmp.l #5,d3 Efficiency
|
|||
|
Rbcc L_FCall
|
|||
|
move.l d3,d5
|
|||
|
; Ouvre la librairie
|
|||
|
Rbsr L_Openpplib
|
|||
|
; Trouve les adresses de la banque
|
|||
|
move.l (a3)+,d0
|
|||
|
Rjsr L_Bnk.GetAdr
|
|||
|
beq .Errnotres
|
|||
|
move.l a1,a0
|
|||
|
move.l a1,-(sp) Adresse banque origine
|
|||
|
bsr B_Length Trouve la longueur totale
|
|||
|
; Fabrique le header
|
|||
|
move.l Buffer(a5),a2
|
|||
|
move.l #"PPbk",(a2)+ Reconnaissance
|
|||
|
move.w -8-6(a0),(a2)+ Le numero
|
|||
|
move.w -8-4(a0),(a2)+ Flags
|
|||
|
move.l d0,(a2)+ Longueur banque / buffer de crunch
|
|||
|
; Recopie la banque dans un buffer
|
|||
|
Rjsr L_ResTempBuffer
|
|||
|
Rbeq L_OOMem
|
|||
|
move.l a0,a1
|
|||
|
move.l (sp),a0
|
|||
|
bsr B_Copie2Buffer
|
|||
|
; Va cruncher
|
|||
|
move.l TempBuffer(a5),a0
|
|||
|
move.l -4(a0),d0
|
|||
|
move.l d3,d1
|
|||
|
Rbsr L_Crunche
|
|||
|
move.l d0,d4
|
|||
|
move.l d0,(a2)+ Longueur du buffer crunche
|
|||
|
; Ouvre le fichier / Mode NEW
|
|||
|
move.l (a3)+,a2
|
|||
|
Rjsr L_NomDisc
|
|||
|
move.l #1006,d2
|
|||
|
Rjsr L_D_Open
|
|||
|
beq.s .Errdisc
|
|||
|
; Sauve le header
|
|||
|
move.l Buffer(a5),d2
|
|||
|
moveq #16,d3
|
|||
|
Rjsr L_D_Write
|
|||
|
bne.s .Errdisc
|
|||
|
; Sauve le header pp
|
|||
|
Dload a2
|
|||
|
move.l Handle(a5),d0
|
|||
|
move.l d5,d1
|
|||
|
moveq #0,d2
|
|||
|
moveq #0,d3
|
|||
|
move.l a6,-(sp)
|
|||
|
move.l pp_Base-CD(a2),a6
|
|||
|
jsr _LVOppWriteDataHeader(a6)
|
|||
|
move.l (sp)+,a6
|
|||
|
tst.l d0
|
|||
|
beq.s .Errdisc
|
|||
|
Rbsr L_FreeCrunchInfo
|
|||
|
; Sauve la banque pp
|
|||
|
move.l TempBuffer(a5),a0
|
|||
|
move.l a0,d2
|
|||
|
move.l d4,d3
|
|||
|
Rjsr L_D_Write
|
|||
|
Rbne L_Errdisc
|
|||
|
; Ferme le fichier
|
|||
|
Rjsr L_D_Close
|
|||
|
; Libere les buffer
|
|||
|
Rbsr L_FreeCrunchInfo
|
|||
|
moveq #0,d0
|
|||
|
Rjsr L_ResTempBuffer
|
|||
|
addq.l #4,sp
|
|||
|
rts
|
|||
|
.Errdisc
|
|||
|
Rbsr L_FreeCrunchInfo
|
|||
|
Rjmp L_DiskError
|
|||
|
.Errnotres
|
|||
|
Rjmp L_BkNoRes
|
|||
|
|
|||
|
; Trouve la taille d'une banque de memoire quelconque, avec le nom
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
B_Length
|
|||
|
movem.l a0-a1/d1-d2,-(sp)
|
|||
|
move.w -8*2+4(a0),d0
|
|||
|
btst #Bnk_BitBob,d0
|
|||
|
bne.s .BB
|
|||
|
btst #Bnk_BitIcon,d0
|
|||
|
bne.s .BB
|
|||
|
move.l -8*3+4(a0),d0
|
|||
|
subq.l #8,d0 Moins les flags
|
|||
|
bra.s .Out
|
|||
|
; Une banque de bobs / icones
|
|||
|
.BB moveq #2+32*2,d0 Pas le nom
|
|||
|
move.w (a0)+,d1
|
|||
|
subq.w #1,d1
|
|||
|
bmi.s .Out
|
|||
|
.BBLoop move.l (a0),d2
|
|||
|
beq.s .BBNext
|
|||
|
move.l d2,a1
|
|||
|
move.w (a1)+,d2 SX
|
|||
|
mulu (a1)+,d2 SY
|
|||
|
mulu (a1)+,d2 NPlan
|
|||
|
lsl.l #1,d2 En mots
|
|||
|
add.l d2,d0
|
|||
|
.BBNext add.l #10,d0 Le header
|
|||
|
addq.l #8,a0
|
|||
|
dbra d1,.BBLoop
|
|||
|
.Out movem.l (sp)+,a0-a1/d1-d2
|
|||
|
rts
|
|||
|
; Recopie une banque memoire quelconque dans un buffer
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
B_Copie2Buffer
|
|||
|
movem.l a0-a2/d0-d3,-(sp)
|
|||
|
move.w -8*2+4(a0),d0
|
|||
|
btst #Bnk_BitBob,d0
|
|||
|
bne.s .BB
|
|||
|
btst #Bnk_BitIcon,d0
|
|||
|
bne.s .BB
|
|||
|
move.l -8*3+4(a0),d0
|
|||
|
subq.l #8,d0
|
|||
|
subq.l #8,a0
|
|||
|
Rjsr L_TransMem
|
|||
|
bra.s .Out
|
|||
|
; Une banque de bobs / icones
|
|||
|
.BB move.w (a0)+,d3 Nombre de bobs
|
|||
|
move.w d3,(a1)+
|
|||
|
subq.w #1,d3
|
|||
|
bmi.s .Out
|
|||
|
.BBLoop move.l (a0),d1
|
|||
|
beq.s .BBVide
|
|||
|
move.l d1,a2
|
|||
|
move.l (a2)+,(a1) SX/SY
|
|||
|
move.l (a2)+,4(a1) NPLAN/HX
|
|||
|
move.w (a2)+,8(a1) HY
|
|||
|
move.w (a1)+,d0 SX
|
|||
|
mulu (a1)+,d0 SY
|
|||
|
mulu (a1)+,d0 NPlan
|
|||
|
lsl.l #1,d0 En mots
|
|||
|
addq.l #4,a1
|
|||
|
exg a0,a2
|
|||
|
Rjsr L_TransMem Va copier
|
|||
|
exg a0,a2
|
|||
|
bra.s .BBNext
|
|||
|
.BBVide clr.l (a1)+
|
|||
|
clr.l (a1)+
|
|||
|
clr.w (a1)+
|
|||
|
.BBNext addq.l #8,a0
|
|||
|
dbra d3,.BBLoop
|
|||
|
; La palette
|
|||
|
moveq #31,d0
|
|||
|
.BBPal move.w (a0)+,(a1)+
|
|||
|
dbra d0,.BBPal
|
|||
|
; Fini
|
|||
|
.Out movem.l (sp)+,a0-a2/d0-d3
|
|||
|
rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; Crunche le buffer A0 / Longueur D0 / Efficiency D1
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def Crunche
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
movem.l a2/d2,-(sp)
|
|||
|
Dload a2
|
|||
|
movem.l a0/d0/d1,-(sp)
|
|||
|
; Quelle rapidite?
|
|||
|
moveq #2,d1
|
|||
|
move.l #256*1024,d0
|
|||
|
SyCall MemFast
|
|||
|
bne.s .Ok
|
|||
|
moveq #1,d1
|
|||
|
move.l #64*1024,d0
|
|||
|
SyCall MemFast
|
|||
|
bne.s .Ok
|
|||
|
moveq #0,d1
|
|||
|
bra.s .OMem
|
|||
|
.Ok move.l a0,a1
|
|||
|
SyCall MemFree
|
|||
|
.OMem
|
|||
|
; Reserve le Crunch info
|
|||
|
move.l 4(sp),d0 Efficiency
|
|||
|
move.l a5,a1 User data
|
|||
|
lea .Control(pc),a0 Control-C
|
|||
|
move.l a6,-(sp)
|
|||
|
move.l pp_Base-CD(a2),a6
|
|||
|
jsr _LVOppAllocCrunchInfo(a6)
|
|||
|
move.l (sp)+,a6
|
|||
|
move.l d0,pp_CrunchInfo-CD(a2)
|
|||
|
Rbeq L_OOMem
|
|||
|
; Crunche le buffer
|
|||
|
move.l d0,a0 CrunchInfo
|
|||
|
movem.l (sp)+,a1/d0-d1
|
|||
|
move.l a6,-(sp)
|
|||
|
move.l pp_Base-CD(a2),a6
|
|||
|
jsr _LVOppCrunchBuffer(a6)
|
|||
|
move.l (sp)+,a6
|
|||
|
tst.l d0
|
|||
|
beq.s .Erraborted
|
|||
|
bmi.s .Errnopack
|
|||
|
; Retourne la longueur en D0
|
|||
|
movem.l (sp)+,a2/d2
|
|||
|
rts
|
|||
|
.Erraborted
|
|||
|
moveq #9,d0
|
|||
|
Rjmp L_Error
|
|||
|
.Errnopack
|
|||
|
moveq #3,d0
|
|||
|
Rbra L_Custom
|
|||
|
|
|||
|
; Routine de test du control-c
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
.Control
|
|||
|
movem.l a0-a1/d1/a5,-(sp)
|
|||
|
move.l 4+4*4+3*4(sp),a5
|
|||
|
move.w T_Actualise(a5),d0
|
|||
|
bclr #BitControl,d0
|
|||
|
beq.s .Cont
|
|||
|
.Stop moveq #0,d0
|
|||
|
bra.s .Out
|
|||
|
.Cont moveq #1,d0
|
|||
|
.Out movem.l (sp)+,a0-a1/d1/a5
|
|||
|
rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; Libere le crunchinfo
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def FreeCrunchInfo
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Dload a0
|
|||
|
move.l pp_CrunchInfo-CD(a0),d0
|
|||
|
beq.s .Skip
|
|||
|
move.l a6,-(sp)
|
|||
|
clr.l pp_CrunchInfo-CD(a0)
|
|||
|
move.l pp_Base-CD(a0),a6
|
|||
|
move.l d0,a0
|
|||
|
jsr _LVOppFreeCrunchInfo(a6)
|
|||
|
move.l (sp)+,a6
|
|||
|
.Skip rts
|
|||
|
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; Ouvre la librairie pp
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def Openpplib
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
movem.l a2/a6,-(sp)
|
|||
|
Dload a2
|
|||
|
move.l pp_Base-CD(a2),d0
|
|||
|
bne.s .Open
|
|||
|
lea pp_Name-CD(a2),a1
|
|||
|
moveq #35,d0
|
|||
|
move.l $4.w,a6
|
|||
|
jsr _LVOOpenLibrary(a6)
|
|||
|
move.l d0,pp_Base-CD(a2)
|
|||
|
.Open movem.l (sp)+,a2/a6
|
|||
|
tst.l d0
|
|||
|
beq.s .Err
|
|||
|
rts
|
|||
|
.Err moveq #1,d0
|
|||
|
Rbra L_Custom
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; Ferme la librairie pp
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def Closepplib
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Rbsr L_FreeCrunchInfo
|
|||
|
Dload a0
|
|||
|
move.l pp_Base-CD(a0),d0
|
|||
|
beq.s .Skip
|
|||
|
clr.l pp_Base-CD(a0)
|
|||
|
move.l d0,a1
|
|||
|
move.l a6,-(sp)
|
|||
|
move.l $4.w,a6
|
|||
|
jsr _LVOCloseLibrary(a6)
|
|||
|
move.l (sp)+,a6
|
|||
|
.Skip rts
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; = SQUASH(address,length,fast,speed,colour)
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par Squash
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
Rjsr L_SaveRegs
|
|||
|
move.l d3,d6
|
|||
|
cmp.l #32,d6
|
|||
|
Rbcc L_FCall
|
|||
|
move.l (a3)+,d7
|
|||
|
cmp.l #256,d7
|
|||
|
Rbcs L_FCall
|
|||
|
cmp.l #4096,d7
|
|||
|
Rbcc L_FCall
|
|||
|
move.l (a3)+,d5
|
|||
|
move.l (a3)+,d1
|
|||
|
Rbls L_FCall
|
|||
|
move.l (a3)+,d3
|
|||
|
moveq #0,d0
|
|||
|
lea T_Actualise(a5),a0
|
|||
|
movem.l a3-a6/d6/d7,-(sp)
|
|||
|
Rbsr L_Sq
|
|||
|
movem.l (sp)+,a3-a6/d6/d7
|
|||
|
Rjsr L_LoadRegs
|
|||
|
Ret_Int
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; = UNSQUASH(address,lenght)
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Par UnSquash
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
move.l d3,d1
|
|||
|
Rbls L_FCall
|
|||
|
move.l (a3)+,d3
|
|||
|
moveq #1,d0
|
|||
|
movem.l a3-a6/d6/d7,-(sp)
|
|||
|
Rbsr L_Sq
|
|||
|
movem.l (sp)+,a3-a6/d6/d7
|
|||
|
Ret_Int
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; SQUASHER
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def Sq
|
|||
|
|
|||
|
Rdata
|
|||
|
*
|
|||
|
* Squasher II.
|
|||
|
*
|
|||
|
* Enhanced for varied speed (at a cost of very little inefficiency),
|
|||
|
* error checking and pre scan of memory for fast and efficient squashing!
|
|||
|
* Routine checks if enough memory is present for pre scan.You can
|
|||
|
* turn off pre scan if you want to test it in non scan but you have
|
|||
|
* enough memory for scan by setting d5 to -1.
|
|||
|
* This is totally compatible with the original ST Squasher.
|
|||
|
*
|
|||
|
*
|
|||
|
* Main Entry d0=0 for squash or d0<>0 for unsquash
|
|||
|
* (Check routines below for entry parameters)!
|
|||
|
*
|
|||
|
|
|||
|
Squasher:
|
|||
|
tst.l d0
|
|||
|
bne UnSquash
|
|||
|
********************************************************************
|
|||
|
*
|
|||
|
* Squash code from STOS!
|
|||
|
*
|
|||
|
*
|
|||
|
********************************************************************
|
|||
|
*Entry
|
|||
|
* D7 Search length $80 to $1024 (works in non scan only)
|
|||
|
* D5 -1 for enforced non scan
|
|||
|
* D3 Address
|
|||
|
* D1 Length
|
|||
|
* D0 0 Squash
|
|||
|
*
|
|||
|
*Exit
|
|||
|
* D3 Length positive
|
|||
|
* or
|
|||
|
* Error negative:-
|
|||
|
* -1 Squashed>=Normal
|
|||
|
|
|||
|
Squash:
|
|||
|
|
|||
|
* Change the addresses
|
|||
|
lea _Test1(pc),a1
|
|||
|
move.l a0,2(a1)
|
|||
|
lea _Test2(pc),a1
|
|||
|
move.l a0,4(a1)
|
|||
|
lea _Colour(pc),a1
|
|||
|
lsl.w #1,d6
|
|||
|
add.l #$DFF180,d6
|
|||
|
move.l d6,2(a1)
|
|||
|
* Load processor masks
|
|||
|
movem.l a0-a6/d0-d7,-(sp)
|
|||
|
move.l $4.w,a6
|
|||
|
sub.l a1,a1
|
|||
|
jsr FindTask(a6)
|
|||
|
movem.l (sp)+,a0-a6/d0-d7
|
|||
|
* Real squasher
|
|||
|
lea use_scan(pc),a0
|
|||
|
clr.l (a0)
|
|||
|
tst.l d5
|
|||
|
beq.b squash_entry
|
|||
|
pre_scan_mem:
|
|||
|
movem.l d0-d7,-(sp)
|
|||
|
|
|||
|
move.l d3,a0
|
|||
|
move.l d3,a1
|
|||
|
add.l d1,a1
|
|||
|
|
|||
|
move.l d1,d5
|
|||
|
|
|||
|
move.l #$10000*4,d0
|
|||
|
bsr allocate_mem
|
|||
|
lea use_scan(pc),a6
|
|||
|
move.l d0,(a6)
|
|||
|
beq.b exit_pre_scan_mem
|
|||
|
move.l d0,a4
|
|||
|
|
|||
|
move.l d5,d0
|
|||
|
lsl.l #1,d0
|
|||
|
move.l d0,4(a6)
|
|||
|
bsr allocate_mem
|
|||
|
move.l d0,(a6)
|
|||
|
beq.b exit_mem_clean_up
|
|||
|
|
|||
|
|
|||
|
move.l #$1024,d7
|
|||
|
move.l d0,a5
|
|||
|
scan_loop:
|
|||
|
move.b (a1),d0
|
|||
|
moveq.l #0,d1
|
|||
|
move.b -(a1),d1
|
|||
|
lsl.l #8,d1
|
|||
|
or.b d0,d1
|
|||
|
lsl.l #2,d1
|
|||
|
move.l (a4,d1.l),d2
|
|||
|
beq.b no_word_ahead
|
|||
|
sub.l a1,d2
|
|||
|
cmp.l d7,d2
|
|||
|
bhi.b no_word_ahead
|
|||
|
move.l a1,d4
|
|||
|
sub.l a0,d4
|
|||
|
lsl.l #1,d4
|
|||
|
move.w d2,(a5,d4.l)
|
|||
|
no_word_ahead:
|
|||
|
move.l a1,(a4,d1.l)
|
|||
|
cmp.l a0,a1
|
|||
|
bgt.b scan_loop
|
|||
|
|
|||
|
exit_mem_clean_up:
|
|||
|
move.l a4,d1
|
|||
|
move.l #$10000*4,d0
|
|||
|
bsr deallocate_mem
|
|||
|
|
|||
|
exit_pre_scan_mem:
|
|||
|
movem.l (sp)+,d0-d7
|
|||
|
|
|||
|
squash_entry:
|
|||
|
MOVE.L D3,D0
|
|||
|
ADD.L D0,D1
|
|||
|
lea scan_ahead_count2(pc),a0
|
|||
|
move.l d7,(a0)
|
|||
|
LEA start(PC),A0
|
|||
|
MOVE.L D0,(A0)
|
|||
|
MOVE.L D0,4(A0)
|
|||
|
MOVE.L D1,8(A0)
|
|||
|
BRA do_squash
|
|||
|
|
|||
|
|
|||
|
allocate_mem:
|
|||
|
movem.l d2-d7/a0-a6,-(sp)
|
|||
|
move.l #%10000000000000001,d1
|
|||
|
move.l 4,a6
|
|||
|
jsr -198(a6)
|
|||
|
movem.l (sp)+,d2-d7/a0-a6
|
|||
|
rts
|
|||
|
|
|||
|
deallocate_mem:
|
|||
|
movem.l d0-d7/a0-a6,-(sp)
|
|||
|
move.l d1,a1
|
|||
|
tst.l d1
|
|||
|
beq.b not_alloc
|
|||
|
move.l 4,a6
|
|||
|
jsr -210(a6)
|
|||
|
not_alloc:
|
|||
|
movem.l (sp)+,d0-d7/a0-a6
|
|||
|
rts
|
|||
|
|
|||
|
use_scan:
|
|||
|
dc.l 0
|
|||
|
use_scan_size:
|
|||
|
dc.l 0
|
|||
|
offset_for_msg:
|
|||
|
dc.l 0
|
|||
|
msg_length_code_index:
|
|||
|
dc.w 0
|
|||
|
code_table:
|
|||
|
o0 dc.w $0100
|
|||
|
o2 dc.w $0200
|
|||
|
o4 dc.w $0400
|
|||
|
o6 dc.w $1000
|
|||
|
|
|||
|
o8 dc.w 8
|
|||
|
oa dc.w 9
|
|||
|
oc dc.w $A
|
|||
|
oe dc.w $C
|
|||
|
|
|||
|
o10 dc.w 0
|
|||
|
o12 dc.w 0
|
|||
|
o14 dc.w 0
|
|||
|
o16 dc.w 8
|
|||
|
|
|||
|
o18 dc.w 2
|
|||
|
o1a dc.w 3
|
|||
|
o1c dc.w 3
|
|||
|
o1e dc.w 3
|
|||
|
|
|||
|
o20 dc.w 1
|
|||
|
o22 dc.w 4
|
|||
|
o24 dc.w 5
|
|||
|
o26 dc.w 6
|
|||
|
|
|||
|
final_reg_load:
|
|||
|
o28 dc.w 0
|
|||
|
o2a dc.w 0
|
|||
|
o2c dc.w 0
|
|||
|
o2e dc.w 0
|
|||
|
add_current_byte_count_tally:
|
|||
|
dc.w 0
|
|||
|
add_current_byte_large_count_tally:
|
|||
|
dc.w 0
|
|||
|
dc.w 0
|
|||
|
DC.B 0,0,0,0
|
|||
|
DC.B $4D,$B8,$FF,$FF
|
|||
|
DC.B 0,0,0,0
|
|||
|
DC.B 0,0,0,0
|
|||
|
start DC.l 0
|
|||
|
start2 DC.l 0
|
|||
|
finish DC.l 0
|
|||
|
DC.B 0,7,0,0
|
|||
|
DC.B 0,0,0,0
|
|||
|
DC.B 0,0,0,0
|
|||
|
DC.B 0,0
|
|||
|
scan_ahead_count:
|
|||
|
DC.l $1024
|
|||
|
DC.B 1,0
|
|||
|
end_address:
|
|||
|
dc.l 0
|
|||
|
scan_ahead_count2:
|
|||
|
DC.l 0
|
|||
|
|
|||
|
do_squash:
|
|||
|
MOVEA.L start(PC),A0
|
|||
|
MOVEA.L finish(PC),A1
|
|||
|
MOVEA.L start2(PC),A2
|
|||
|
MOVEQ #1,D2
|
|||
|
CLR.W D1
|
|||
|
CLR.L D7
|
|||
|
main_sq_loop:
|
|||
|
BSR main_sq_rtn
|
|||
|
TST.B D0
|
|||
|
BEQ.S exit_main_sq_loop
|
|||
|
ADDQ.W #1,D1
|
|||
|
CMPI.W #$108,D1
|
|||
|
BNE.S exit_main_sq_loop
|
|||
|
BSR add_current_byte_count
|
|||
|
exit_main_sq_loop:
|
|||
|
CMPA.L A0,A1
|
|||
|
BGT.S main_sq_loop
|
|||
|
BSR add_current_byte_count
|
|||
|
BSR insert_next_long
|
|||
|
|
|||
|
move.l use_scan_size(pc),d0
|
|||
|
move.l use_scan(pc),d1
|
|||
|
bsr deallocate_mem
|
|||
|
add.l #32,a2
|
|||
|
cmp.l a2,a1
|
|||
|
bhi.b ok_squash
|
|||
|
moveq.l #-1,d3
|
|||
|
rts
|
|||
|
ok_squash:
|
|||
|
sub.l #32,a2
|
|||
|
MOVE.L D7,(A2)+
|
|||
|
sub.l start(PC),a1
|
|||
|
MOVE.L A1,(A2)+
|
|||
|
MOVE.L A2,d3
|
|||
|
sub.l start(pc),d3
|
|||
|
RTS
|
|||
|
|
|||
|
; Routine de test CONTROL-C
|
|||
|
_Test2 bclr #BitControl,$800000
|
|||
|
bne squash_abort
|
|||
|
_Colour move.w a0,$DFF180
|
|||
|
bra.s EndIt
|
|||
|
|
|||
|
main_sq_rtn:
|
|||
|
_Test1 tst.b $800000
|
|||
|
bmi.s _Test2
|
|||
|
EndIt MOVEA.L A0,A3
|
|||
|
ADDA.L scan_ahead_count(PC),A3
|
|||
|
CMPA.L A1,A3
|
|||
|
BLE.S not_over_end
|
|||
|
MOVEA.L A1,A3
|
|||
|
not_over_end:
|
|||
|
move.l a0,a4
|
|||
|
add.l scan_ahead_count2(PC),a4
|
|||
|
CMPA.L A1,A4
|
|||
|
BLE.S not_over_end2
|
|||
|
MOVEA.L A1,A4
|
|||
|
not_over_end2:
|
|||
|
lea last_match(pc),a5
|
|||
|
move.l a0,(a5)
|
|||
|
lea end_address(pc),a5
|
|||
|
move.l a4,(a5)
|
|||
|
MOVEQ #1,D5
|
|||
|
MOVEA.L A0,A5
|
|||
|
addq.l #1,a5
|
|||
|
main_loop:
|
|||
|
|
|||
|
move.l use_scan(pc),d4
|
|||
|
beq.b no_scan
|
|||
|
move.l d4,a4
|
|||
|
move.l last_match(pc),d4
|
|||
|
sub.l start(pc),d4
|
|||
|
lsl.l #1,d4
|
|||
|
moveq.l #0,d3
|
|||
|
move.w (a4,d4.l),d3
|
|||
|
beq leave_sq_main_rtn
|
|||
|
add.l last_match(pc),d3
|
|||
|
move.l d3,a5
|
|||
|
bra.b move_ahead
|
|||
|
last_match:
|
|||
|
dc.l 0
|
|||
|
no_scan:
|
|||
|
MOVE.B (A0),D3
|
|||
|
MOVE.B 1(A0),D4
|
|||
|
move.l end_address(pc),a4
|
|||
|
L22431C CMP.B (A5)+,D3
|
|||
|
BEQ.S L22432C
|
|||
|
L224324 CMPA.L A5,A4
|
|||
|
BGT.S L22431C
|
|||
|
BRA leave_sq_main_rtn
|
|||
|
L22432C
|
|||
|
cmp.b (a5),d4
|
|||
|
bne.b L224324
|
|||
|
SUBQ.W #1,A5
|
|||
|
move_ahead:
|
|||
|
lea last_match(pc),a4
|
|||
|
move.l a5,(a4)
|
|||
|
MOVEA.L A0,A4
|
|||
|
move.b (a0),d3
|
|||
|
move.b 1(a0),d4
|
|||
|
L224330 cmp.b (a4)+,(a5)+
|
|||
|
BNE.S L22433A
|
|||
|
cmp.b (a5),d3
|
|||
|
bne.b no_match
|
|||
|
cmp.b 1(a5),d4
|
|||
|
bne.b no_match
|
|||
|
move.l a0,-(sp)
|
|||
|
lea last_match(pc),a0
|
|||
|
move.l a5,(a0)
|
|||
|
move.l (sp)+,a0
|
|||
|
no_match:
|
|||
|
CMPA.L A5,A3
|
|||
|
BGT.S L224330
|
|||
|
L22433A MOVE.L A4,D3
|
|||
|
SUB.L A0,D3
|
|||
|
SUBQ.L #1,D3
|
|||
|
CMP.L D3,D5
|
|||
|
BGE.S too_far
|
|||
|
MOVE.L A5,D4
|
|||
|
SUB.L A0,D4
|
|||
|
SUB.L D3,D4
|
|||
|
SUBQ.W #1,D4
|
|||
|
CMP.L #4,D3
|
|||
|
BLE.S less_than_5_bytes_long
|
|||
|
MOVEQ #6,D6
|
|||
|
CMP.L #$101,D3
|
|||
|
BLT.S less_than_257_bytes_long
|
|||
|
MOVE.W #$100,D3
|
|||
|
less_than_257_bytes_long:
|
|||
|
BRA.S L22436A
|
|||
|
less_than_5_bytes_long:
|
|||
|
MOVE.W D3,D6
|
|||
|
SUBQ.W #2,D6
|
|||
|
LSL.W #1,D6
|
|||
|
L22436A LEA code_table(PC),A6
|
|||
|
CMP.W 0(A6,D6.W),D4
|
|||
|
BGE.S too_far
|
|||
|
MOVE.L D3,D5
|
|||
|
MOVE.L A0,-(A7)
|
|||
|
LEA offset_for_msg(PC),A0
|
|||
|
MOVE.L D4,(A0)
|
|||
|
LEA msg_length_code_index(PC),A0
|
|||
|
MOVE.B D6,(A0)
|
|||
|
MOVEA.L (A7)+,A0
|
|||
|
too_far:
|
|||
|
CMPA.L A5,A3
|
|||
|
BGT main_loop
|
|||
|
leave_sq_main_rtn:
|
|||
|
CMP.L #1,D5
|
|||
|
BEQ.S byte_only
|
|||
|
BSR add_current_byte_count
|
|||
|
MOVE.B msg_length_code_index(PC),D6
|
|||
|
MOVE.L offset_for_msg(PC),D3
|
|||
|
MOVE.W 8(A6,D6.W),D0
|
|||
|
BSR add_d0_bits_from_d3
|
|||
|
MOVE.W $10(A6,D6.W),D0
|
|||
|
BEQ.S L2243B4
|
|||
|
MOVE.L D5,D3
|
|||
|
SUBQ.W #1,D3
|
|||
|
BSR add_d0_bits_from_d3
|
|||
|
L2243B4 MOVE.W $18(A6,D6.W),D0
|
|||
|
MOVE.W $20(A6,D6.W),D3
|
|||
|
BSR add_d0_bits_from_d3
|
|||
|
ADDI.W #1,$28(A6,D6.W)
|
|||
|
ADDA.L D5,A0
|
|||
|
CLR.B D0
|
|||
|
RTS
|
|||
|
|
|||
|
byte_only:
|
|||
|
MOVE.B (A0)+,D3
|
|||
|
MOVEQ #8,D0
|
|||
|
BSR add_d0_bits_from_d3
|
|||
|
MOVEQ #1,D0
|
|||
|
RTS
|
|||
|
|
|||
|
add_current_byte_count:
|
|||
|
TST.W D1
|
|||
|
BEQ.S add_current_byte_count_end
|
|||
|
MOVE.W D1,D3
|
|||
|
CLR.W D1
|
|||
|
CMP.W #9,D3
|
|||
|
BGE.S add_current_byte_large_count
|
|||
|
MOVE.L A0,-(A7)
|
|||
|
LEA add_current_byte_count_tally(PC),A0
|
|||
|
ADDQ.W #1,(A0)
|
|||
|
MOVEA.L (A7)+,A0
|
|||
|
SUBQ.W #1,D3
|
|||
|
MOVEQ #5,D0
|
|||
|
BRA add_d0_bits_from_d3
|
|||
|
add_current_byte_count_end:
|
|||
|
RTS
|
|||
|
|
|||
|
add_current_byte_large_count:
|
|||
|
MOVE.L A0,-(A7)
|
|||
|
LEA add_current_byte_large_count_tally(PC),A0
|
|||
|
ADDQ.W #1,(A0)
|
|||
|
MOVEA.L (A7)+,A0
|
|||
|
SUBI.W #9,D3
|
|||
|
ORI.W #$700,D3
|
|||
|
MOVEQ #$B,D0
|
|||
|
BRA add_d0_bits_from_d3
|
|||
|
|
|||
|
add_d0_bits_from_d3:
|
|||
|
SUBQ.W #1,D0
|
|||
|
add_bits_loop:
|
|||
|
LSR.L #1,D3
|
|||
|
ROXL.L #1,D2
|
|||
|
BCS.S insert_next_long2
|
|||
|
DBF D0,add_bits_loop
|
|||
|
RTS
|
|||
|
insert_next_long:
|
|||
|
CLR.W D0
|
|||
|
insert_next_long2:
|
|||
|
cmp.l a2,a1
|
|||
|
bls.b inefficient_compression
|
|||
|
MOVE.L D2,(A2)+
|
|||
|
EOR.L D2,D7
|
|||
|
MOVEQ #1,D2
|
|||
|
DBF D0,add_bits_loop
|
|||
|
RTS
|
|||
|
|
|||
|
inefficient_compression:
|
|||
|
move.l a1,a2
|
|||
|
moveq.l #-1,d0
|
|||
|
rts
|
|||
|
squash_abort:
|
|||
|
move.l use_scan_size(pc),d0
|
|||
|
move.l use_scan(pc),d1
|
|||
|
bsr deallocate_mem
|
|||
|
moveq #-2,d3
|
|||
|
addq.l #4,sp
|
|||
|
rts
|
|||
|
|
|||
|
**********************************
|
|||
|
*Entry
|
|||
|
*
|
|||
|
* D3 Address
|
|||
|
* D1 Length
|
|||
|
* D0 1 Unsquash
|
|||
|
*
|
|||
|
*Exit
|
|||
|
* D3 Unsquashed Length positive
|
|||
|
* or
|
|||
|
* Error negative:-
|
|||
|
* -1 Check on data bad!
|
|||
|
* -2 Unsquasher was going to overwrite
|
|||
|
* memory that was out of bounds!
|
|||
|
UnSquash:
|
|||
|
MOVE.L D3,D0
|
|||
|
ADD.L D0,D1
|
|||
|
MOVEA.L D1,A0
|
|||
|
MOVEA.L D0,A1
|
|||
|
MOVEA.L -(A0),A2
|
|||
|
move.l a2,d7
|
|||
|
ADDA.L A1,A2
|
|||
|
MOVE.L -(A0),D5
|
|||
|
MOVE.L -(A0),D0
|
|||
|
EOR.L D0,D5
|
|||
|
L22446E LSR.L #1,D0
|
|||
|
BNE.S L224476
|
|||
|
BSR L2244E8
|
|||
|
L224476 BCS.S L2244AE
|
|||
|
MOVEQ #8,D1
|
|||
|
MOVEQ #1,D3
|
|||
|
LSR.L #1,D0
|
|||
|
BNE.S L224484
|
|||
|
BSR L2244E8
|
|||
|
L224484 BCS.S L2244D4
|
|||
|
MOVEQ #3,D1
|
|||
|
CLR.W D4
|
|||
|
L22448A BSR L2244F4
|
|||
|
MOVE.W D2,D3
|
|||
|
ADD.W D4,D3
|
|||
|
L224492 MOVEQ #7,D1
|
|||
|
L224494 LSR.L #1,D0
|
|||
|
BNE.S L22449A
|
|||
|
BSR.S L2244E8
|
|||
|
L22449A ROXL.L #1,D2
|
|||
|
DBF D1,L224494
|
|||
|
cmp.l a1,a2
|
|||
|
ble.b bad_squash_mem
|
|||
|
MOVE.B D2,-(A2)
|
|||
|
DBF D3,L224492
|
|||
|
BRA.S L2244E0
|
|||
|
L2244A8 MOVEQ #8,D1
|
|||
|
MOVEQ #8,D4
|
|||
|
BRA.S L22448A
|
|||
|
L2244AE MOVEQ #2,D1
|
|||
|
BSR.S L2244F4
|
|||
|
CMP.B #2,D2
|
|||
|
BLT.S L2244CA
|
|||
|
CMP.B #3,D2
|
|||
|
BEQ.S L2244A8
|
|||
|
MOVEQ #8,D1
|
|||
|
BSR.S L2244F4
|
|||
|
MOVE.W D2,D3
|
|||
|
MOVE.W #$C,D1
|
|||
|
BRA.S L2244D4
|
|||
|
L2244CA MOVE.W #9,D1
|
|||
|
ADD.W D2,D1
|
|||
|
ADDQ.W #2,D2
|
|||
|
MOVE.W D2,D3
|
|||
|
L2244D4 BSR.S L2244F4
|
|||
|
L2244D6 SUBQ.W #1,A2
|
|||
|
cmp.l a1,a2
|
|||
|
blt.b bad_squash_mem
|
|||
|
MOVE.B 0(A2,D2.W),(A2)
|
|||
|
DBF D3,L2244D6
|
|||
|
L2244E0 CMPA.L A2,A1
|
|||
|
BLT.S L22446E
|
|||
|
tst.l d5
|
|||
|
beq.b check_ok
|
|||
|
moveq.l #-1,d3
|
|||
|
rts
|
|||
|
check_ok:
|
|||
|
move.l d7,d3
|
|||
|
RTS
|
|||
|
bad_squash_mem:
|
|||
|
moveq.l #-2,d3
|
|||
|
rts
|
|||
|
|
|||
|
L2244E8 MOVE.L -(A0),D0
|
|||
|
EOR.L D0,D5
|
|||
|
MOVE.B #$10,CCR
|
|||
|
ROXR.L #1,D0
|
|||
|
RTS
|
|||
|
|
|||
|
L2244F4 SUBQ.W #1,D1
|
|||
|
CLR.W D2
|
|||
|
L2244F8 LSR.L #1,D0
|
|||
|
BNE.S L224506
|
|||
|
MOVE.L -(A0),D0
|
|||
|
EOR.L D0,D5
|
|||
|
MOVE.B #$10,CCR
|
|||
|
ROXR.L #1,D0
|
|||
|
L224506 ROXL.L #1,D2
|
|||
|
DBF D1,L2244F8
|
|||
|
RTS
|
|||
|
|
|||
|
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; ERROR MESSAGES...
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_Def Custom
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
lea ErrMess(pc),a0
|
|||
|
moveq #0,d1 * Can be trapped
|
|||
|
moveq #ExtNb,d2 * Number of extension
|
|||
|
moveq #0,d3 * IMPORTANT!!!
|
|||
|
Rjmp L_ErrorExt * Jump to routine...
|
|||
|
ErrMess dc.b "Cannot run 1.3 compiled procedures under AMOSPro",0
|
|||
|
dc.b "Cannot open powerpacker.library (v35)",0
|
|||
|
dc.b "Not a powerpacked memory bank",0
|
|||
|
dc.b "Cannot pack this bank",0
|
|||
|
even
|
|||
|
|
|||
|
; "No errors" routine
|
|||
|
; ~~~~~~~~~~~~~~~~~~~~~~~~~
|
|||
|
Lib_Def NoErrors
|
|||
|
moveq #0,d1
|
|||
|
moveq #ExtNb,d2
|
|||
|
moveq #-1,d3
|
|||
|
Rjmp L_ErrorExt
|
|||
|
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; Welcome message
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
C_Title
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
dc.b "AMOSPro Compiler extension V "
|
|||
|
Version
|
|||
|
dc.b 0,"$VER: "
|
|||
|
Version
|
|||
|
dc.b 0
|
|||
|
Even
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
; Finish the library
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
Lib_End
|
|||
|
; - - - - - - - - - - - - -
|
|||
|
|
|||
|
; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
|
|||
|
C_End dc.w 0
|