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
|