amos-professional/AMOS/Tutorial/Extensions/__uae____compact_s

718 lines
16 KiB
Plaintext

;---------------------------------------------------------------------
; ** ** ** *** *** **** ** *** ** ****
; **** *** *** ** ** ** ** ** **** ** ** ** **
; ** ** ** * ** ** ** *** ***** ** ** *** ** **
; ****** ** ** ** ** ** ** ** ****** ** ** **
; ** ** ** ** ** ** * ** ** ** ** ** * ** ** ** **
; ** ** ** ** *** *** ***** ** ** *** ** ****
;---------------------------------------------------------------------
; AMOSPro Picture compactor extension source code,
; By François Lionet
; AMOS, AMOSPro and AMOS Compiler (c) Europress Software 1990-1992
; To be used with AMOS1.3 and over
;---------------------------------------------------------------------
; This file is public domain
;---------------------------------------------------------------------
; Please refer to the _Music.s file for more informations
;---------------------------------------------------------------------
*
Version MACRO
dc.b "1.0"
ENDM
*
*
ExtNb equ 2-1
*
Include "|AMOS_Includes.s"
*
Start 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
***********************************************************
* OFFSETS TO FUNCTIONS
C_Off dc.w (L1-L0)/2,(L2-L1)/2,(L3-L2)/2,(L4-L3)/2
dc.w (L5-L4)/2,(L6-L5)/2,(L7-L6)/2,(L8-L7)/2
dc.w (L9-L8)/2,(L10-L9)/2,(L11-L10)/2,(L12-L11)/2
dc.w (L13-L12)/2,(L14-L13)/2,(L15-L14)/2,(L16-L15)/2
dc.w (L17-L16)/2,(L18-L17)/2,(L19-L18)/2,(L20-L19)/2
dc.w (L21-L20)/2,(L22-L21)/2,(L23-L22)/2
***********************************************************
* COMPACTOR TOKENS
C_Tk dc.w 1,0
dc.b $80,-1
dc.w L_Pack2,-1
dc.b "!pac","k"+$80,"I0t0",-2
dc.w L_Pack6,-1
dc.b $80,"I0t0,0,0,0,0",-1
dc.w L_SPack2,-1
dc.b "!spac","k"+$80,"I0t0",-2
dc.w L_SPack6,-1
dc.b $80,"I0t0,0,0,0,0",-1
dc.w L_UPack1,-1
dc.b "!unpac","k"+$80,"I0",-2
dc.w L_UPack2,-1
dc.b $80,"I0t0",-2
dc.w L_UPack3,-1
dc.b $80,"I0,0,0",-1
dc.w 0
******************************************************************
* Start of library
C_Lib
******************************************************************
* COLD START
L0 moveq #ExtNb,d0
rts
******************************************************************
*
L1
******************************************************************
*
L2
******************************************************************
* PACK Screen,Bank#
L_Pack2 equ 3
L3 clr.l -(a3)
clr.l -(a3)
move.l #10000,-(a3)
move.l (a3),-(a3)
RBra L_Pack6
******************************************************************
* PACK Screen,Bank#
L_Pack6 equ 4
L4 Rbsr L_PacPar
Rbsr L_GetSize
Rbsr L_ResBank
Rbsr L_Pack
rts
*******************************************************************
* SPACK Screen,Bank#
L_SPack2 equ 5
L5 clr.l -(a3)
clr.l -(a3)
move.l #10000,-(a3)
move.l (a3),-(a3)
Rbra L_SPack6
*******************************************************************
* SPACK Screen,Bank#,X1,Y1 TO X2,Y2
L_SPack6 equ 6
L6 Rbsr L_PacPar
Rbsr L_GetSize
add.l #PsLong,d0
Rbsr L_ResBank
* Screen definition header
move.l #SCCode,(a1)
move.w EcTx(a0),PsTx(a1)
move.w EcTy(a0),PsTy(a1)
move.w EcNbCol(a0),PsNbCol(a1)
move.w EcNPlan(a0),PsNPlan(a1)
move.w EcCon0(a0),PsCon0(a1)
move.w EcAWX(a0),PsAWX(a1)
move.w EcAWY(a0),PsAWY(a1)
move.w EcAWTX(a0),PsAWTX(a1)
move.w EcAWTY(a0),PsAWTY(a1)
move.w EcAVX(a0),PsAVX(a1)
move.w EcAVY(a0),PsAVY(a1)
movem.l a0/a1,-(sp)
moveq #31,d0
lea EcPal(a0),a0
lea PsPal(a1),a1
SPac1 move.w (a0)+,(a1)+
dbra d0,SPac1
movem.l (sp)+,a0/a1
lea PsLong(a1),a1
* Finish packing!
Rbsr L_Pack
rts
*************************************************************************
* UNPACK Bank# -> To current screen
L_UPack1 equ 7
L7 move.l ScOnAd(a5),d0
Rbeq L_JFonCall
move.l d0,a1
moveq #-1,d1
moveq #-1,d2
Rbra L_UPack
*************************************************************************
* UNPACK Bank#,X,Y -> To current screen
L_UPack3 equ 8
L8 move.l ScOnAd(a5),d0
Rbeq L_JFonCall
move.l d0,a1
move.l (a3)+,d2
move.l (a3)+,d1
lsr.l #3,d1
Rbra L_UPack
L_UPack equ 9
L9 movem.l d1/a1,-(sp)
move.l (a3)+,d0
RJsr L_Bnk.OrAdr
movem.l (sp)+,d1/a1
* Autoback
tst.w EcAuto(a1) * Is screen autobacked?
Rbeq L_UnPack * NOPE! Do simple unpack
movem.l d0-d7/a0-a2,-(sp) * YEP! First step
EcCall AutoBack1
movem.l (sp),d0-d7/a0-a2
btst #BitDble,EcFlags(a1) * DOUBLE BUFFER?
beq.s ABPac1
Rbsr L_UnPack
EcCall AutoBack2 * Second step
movem.l (sp),d0-d7/a0-a2
Rbsr L_UnPack
EcCall AutoBack3 * Third step
bra.s ABPac2
ABPac1 Rbsr L_UnPack * SINGLE BUFFER autobacked
EcCall AutoBack4
ABPac2 movem.l (sp)+,d0-d7/a0-a2
rts
*************************************************************************
* UNPACK Bank# TO screen -> Creates/Erases screen!
L_UPack2 equ 10
L10 move.l (a3)+,d1
cmp.l #8,d1
Rbcc L_JFoncall
* Creates new screen
move.l d1,-(sp)
move.l (a3)+,d0
RJsr L_Bnk.OrAdr
move.l (sp)+,d1
cmp.l #SCCode,PsCode(a0)
Rbne L_NoScr
moveq #0,d2
moveq #0,d3
moveq #0,d4
moveq #0,d5
move.w PsTx(a0),d2
move.w PsTy(a0),d3
move.w PsNPlan(a0),d4
move.w PsCon0(a0),d5
move.w PsNbCol(a0),d6
lea PsPal(a0),a1
move.l a0,-(sp)
EcCall Cree
Rbne L_JOOfMem
move.l a0,a1
move.l (sp)+,a0
move.l a1,ScOnAd(a5)
move.w EcNumber(a1),ScOn(a5)
addq.w #1,ScOn(a5)
* Enleve le curseur
movem.l a0-a6/d0-d7,-(sp)
lea CuCuOff(pc),a1
WiCall Print
movem.l (sp)+,a0-a6/d0-d7
* Change View/Offset
move.w PsAWX(a0),EcAWX(a1)
move.w PsAWY(a0),EcAWY(a1)
move.w PsAWTx(a0),EcAWTx(a1)
move.w PsAWTy(a0),EcAWTy(a1)
move.w PsAVX(a0),EcAVX(a1)
move.w PsAVY(a0),EcAVY(a1)
move.b #%110,EcAW(a1)
move.b #%110,EcAWT(a1)
move.b #%110,EcAV(a1)
* Unpack!
lea PsLong(a0),a0
moveq #0,d1
moveq #0,d2
Rbra L_UnPack
CuCuOff dc.b 27,"C0",0
even
***********************************************************
* Reserves memory bank, A1= number
L_ResBank equ 11
L11 movem.l a0/d1/d2,-(sp)
move.l d0,d2
moveq #(1<<Bnk_BitData),d1
move.l a1,d0
lea BkPac(pc),a0
Rjsr L_Bnk.Reserve
Rbeq L_JOOfMem
move.l a0,a1
movem.l (sp)+,a0/d1/d2
rts
******* Definition banque de samples
BkPac: dc.b "Pac.Pic."
even
***********************************************************
* Unpile parameters
L_PacPar equ 12
L12 move.l (a3)+,d5
move.l (a3)+,d4
move.l (a3)+,d3
move.l (a3)+,d2
lsr.w #3,d4
lsr.w #3,d2
* Screen
move.l 4(a3),d1
RJsr L_GetEc
move.l d0,a2
cmp.w EcTLigne(a0),d4
bls.s PacP1
move.w EcTLigne(a0),d4
PacP1 cmp.w EcTy(a0),d5
bls.s PacP2
move.w EcTy(a0),d5
PacP2 sub.w d2,d4
Rble L_JFoncall
sub.w d3,d5
Rble L_JFoncall
; Number of memory bank
move.l (a3)+,a1
cmp.l #$10000,a1
Rbcc L_JFoncall
addq.l #4,a3
rts
***************************************************************************
*
* BITMAP COMPACTOR
* A0: Origin screen datas
* A1: Destination zone
* A2: Origin screen bitmap
* D2: DX in BYTES
* D3: DY in LINES
* D4: TX in BYTES
* D5: TY in LINES
*
***************************************************************************
* ESTIMATE THE SIZE OF A PICTURE
******* Makes differents tries
* And finds the best square size in D1
L_GetSize equ 13
L13 movem.l a1-a3,-(sp)
lea TSize(pc),a3
move.l Buffer(a5),a1
moveq #0,d7
move.w d5,d7
clr.w -(sp)
move.l #$10000000,-(sp)
GSize1 move.l d7,d5
move.w (a3)+,d1
beq.s GSize2
divu d1,d5
swap d5
tst.w d5
bne.s GSize1
swap d5
bsr PacSize
cmp.l (sp),d0
bcc.s GSize1
move.l d0,(sp)
move.w d1,4(sp)
bra.s GSize1
GSize2 move.l (sp)+,d0
move.w (sp)+,d1
move.l d7,d5
divu d1,d5
movem.l (sp)+,a1-a3
rts
******* Simulate a packing
PacSize movem.l d1-d7/a0-a6,-(sp)
* Fake data zone
move.w d2,Pkdx(a1)
move.w d3,Pkdy(a1)
move.w d4,Pktx(a1)
move.w d5,Pkty(a1)
move.w d1,Pktcar(a1)
* Reserve intermediate table space
move.w d1,d0
mulu d4,d0
mulu d5,d0
mulu EcNPlan(a0),d0
lsr.l #3,d0
addq.l #2,d0
move.l d0,-(sp)
move.l a0,-(sp)
Rjsr L_RamFast
Rbeq L_JOofMem
move.l (sp)+,a0
move.l d0,a6
move.l d0,-(sp)
* Prepare registers
move.l a2,a4 ;a4--> picture address
lea PkDatas1(a1),a5 ;a5--> main datas
move.w EcTLigne(a0),d7
move.w d7,d5
mulu d1,d5 ;d5--> SY line of square
move.w Pkdy(a1),d3
mulu d7,d3
move.w Pkdx(a1),d0
ext.l d0
add.l d0,d3
move.w EcNPlan(a0),-(sp)
* Main packing
moveq #7,d1 * Bit pointer
moveq #0,d0
Iplan: move.l (a4)+,a3
add.l d3,a3
move.w Pkty(a1),d6
subq.w #1,d6
Iligne: move.l a3,a2
move.w Pktx(a1),d4
subq.w #1,d4
Icarre: move.l a2,a0
move.w Pktcar(a1),d2
subq.w #1,d2
Ioct0: cmp.b (a0),d0 * Compactage d'un carre
beq.s Ioct1
move.b (a0),d0
addq.l #1,a5
bset d1,(a6)
Ioct1: dbra d1,Ioct2
moveq #7,d1
addq.l #1,a6
clr.b (a6)
Ioct2: add.w d7,a0
dbra d2,Ioct0
addq.l #1,a2
dbra d4,Icarre
add.l d5,a3
dbra d6,Iligne
subq.w #1,(sp)
bne.s IPlan
addq.l #2,sp
addq.l #1,a5
* Packing of first pointers table
move.l a5,a6
move.l 4(sp),d2
move.l d2,d0
subq.w #1,d2
lsr.w #3,d0
addq.w #2,d0
add.w d0,a5
move.l (sp),a0
moveq #0,d0
moveq #7,d1
Icomp2 cmp.b (a0)+,d0
beq.s Icomp2a
move.b -1(a0),d0
addq.l #1,a5
Icomp2a dbra d2,Icomp2
* Final size (EVEN!)
move.l a5,d2
sub.l a1,d2
addq.l #3,d2
and.l #$FFFFFFFE,d2
* Free intermediate memory
move.l (sp)+,a1
move.l (sp)+,d0
Rjsr L_RamFree
* Finished!
move.l d2,d0
movem.l (sp)+,d1-d7/a0-a6
rts
******* Packing methods
TSize dc.w 1,2,3,4,5,6,7,8,12,16,24,32,48,64,0
***********************************************************
* REAL PACKING!!!
L_Pack equ 14
L14
* Header of the packed bitmap
movem.l d1-d7/a0-a6,-(sp)
* Packed bitmap header
move.l #BMCode,PkCode(a1)
move.w d2,Pkdx(a1)
move.w d3,Pkdy(a1)
move.w d4,Pktx(a1)
move.w d5,Pkty(a1)
move.w d1,Pktcar(a1)
move.w EcNPlan(a0),PkNPlan(a1)
* Reserve intermediate table space
move.w d1,d0
mulu d4,d0
mulu d5,d0
mulu EcNPlan(a0),d0
lsr.l #3,d0
addq.l #2,d0
move.l d0,-(sp)
move.l a0,-(sp)
Rjsr L_RamFast
Rbeq L_JOofMem
move.l (sp)+,a0
move.l d0,a6
move.l d0,-(sp)
* Prepare registers
move.l a2,a4 ;a4--> picture address
lea PkDatas1(a1),a5 ;a5--> main datas
move.w EcTLigne(a0),d7
move.w d7,d5
mulu d1,d5 ;d5--> SY line of square
move.w Pkdy(a1),d3
mulu d7,d3
move.w Pkdx(a1),d0
ext.l d0
add.l d0,d3
move.w EcNPlan(a0),-(sp)
* Main packing
moveq #7,d1 * Bit pointer
moveq #0,d0
clr.b (a5) * First byte to zero
clr.b (a6)
plan: move.l (a4)+,a3
add.l d3,a3
move.w Pkty(a1),d6
subq.w #1,d6
ligne: move.l a3,a2
move.w Pktx(a1),d4
subq.w #1,d4
carre: move.l a2,a0
move.w Pktcar(a1),d2
subq.w #1,d2
oct0: cmp.b (a0),d0 * Compactage d'un carre
beq.s oct1
move.b (a0),d0
addq.l #1,a5
move.b d0,(a5)
bset d1,(a6)
oct1: dbra d1,oct2
moveq #7,d1
addq.l #1,a6
clr.b (a6)
oct2: add.w d7,a0
dbra d2,oct0
addq.l #1,a2 * Carre suivant en X
dbra d4,carre
add.l d5,a3 * Ligne suivante
dbra d6,ligne
subq.w #1,(sp) * Plan couleur suivant
bne.s Plan
addq.l #2,sp
addq.l #1,a5
; Packing of first pointers table
move.l a5,d0
sub.l a1,d0
move.l d0,PkPoint2(a1)
move.l a5,a6
move.l 4(sp),d0
move.l d0,d2
subq.w #1,d2
lsr.w #3,d0
addq.w #2,d0
add.w d0,a5
move.l a5,d0
sub.l a1,d0
move.l d0,PkDatas2(a1)
move.l (sp),a0
moveq #0,d0
moveq #7,d1
clr.b (a5)
clr.b (a6)
comp2: cmp.b (a0)+,d0
beq.s comp2a
move.b -1(a0),d0
addq.l #1,a5
move.b d0,(a5)
bset d1,(a6)
comp2a: dbra d1,comp2b
moveq #7,d1
addq.l #1,a6
clr.b (a6)
comp2b: dbra d2,Comp2
* Free intermediate memory
move.l (sp)+,a1
move.l (sp)+,d0
RJsr L_RamFree
movem.l (sp)+,d1-d7/a0-a6
rts
***********************************************************
* Bitmap unpacker
* A0-> packed picture
* A1-> Destination screen
* D1.L Start in X
* D2.L Start in Y
UAEc: equ 0
UDEc: equ 4
UITy: equ 8
UTy: equ 10
UTLine: equ 12
UNPlan: equ 14
UPile: equ 16
L_UnPack equ 15
L15 movem.l a0-a6/d1-d7,-(sp)
* Jump over SCREEN DEFINITION
cmp.l #SCCode,(a0)
bne.s dec0
lea PsLong(a0),a0
* Is it a packed bitmap?
dec0 cmp.l #BMCode,(a0)
Rbne L_NoPac
* Parameter preparation
lea -UPile(sp),sp * Space to work
lea EcCurrent(a1),a2
move.l a2,UAEc(sp) * Bitmaps address
move.w EcTLigne(a1),d7 * d7--> line size
move.w EcNPlan(a1),d0 * How many bitplanes
cmp.w PkNPlan(a0),d0
Rbne L_JFoncall
move.w d0,UNPlan(sp)
move.w Pktcar(a0),d6 * d6--> SY square
tst.l d1 * Screen address in X
bpl.s dec1
move.w Pkdx(a0),d1
dec1: tst.l d2 * In Y
bpl.s dec2
move.w Pkdy(a0),d2
dec2: move.w Pktx(a0),d0
add.w d1,d0
cmp.w d7,d0
Rbhi L_JFoncall
move.w Pkty(a0),d0
mulu d6,d0
add.w d2,d0
cmp.w EcTy(a1),d0
Rbhi L_JFoncall
mulu d7,d2 * Screen address
ext.l d1
add.l d2,d1
move.l d1,UDEc(sp)
move.w d6,d0 * Size of one line
mulu d7,d0
move d0,UTLine(sp)
move.w Pktx(a0),a3 * Size in X
subq.w #1,a3
move.w Pkty(a0),UITy(sp) * in Y
lea PkDatas1(a0),a4 * a4--> bytes table 1
move.l a0,a5
move.l a0,a6
add.l PkDatas2(a0),a5 * a5--> bytes table 2
add.l PkPoint2(a0),a6 * a6--> pointer table
moveq #7,d0
moveq #7,d1
move.b (a5)+,d2
move.b (a4)+,d3
btst d1,(a6)
beq.s prep
move.b (a5)+,d2
prep: subq.w #1,d1
* Unpack!
dplan: move.l UAEc(sp),a2
addq.l #4,UAEc(sp)
move.l (a2),a2
add.l UDEc(sp),a2
move.w UITy(sp),UTy(sp) * Y Heigth counter
dligne: move.l a2,a1
move.w a3,d4
dcarre: move.l a1,a0
move.w d6,d5 * Square height
doctet1:subq.w #1,d5
bmi.s doct3
btst d0,d2
beq.s doct1
move.b (a4)+,d3
doct1: move.b d3,(a0)
add.w d7,a0
dbra d0,doctet1
moveq #7,d0
btst d1,(a6)
beq.s doct2
move.b (a5)+,d2
doct2: dbra d1,doctet1
moveq #7,d1
addq.l #1,a6
bra.s doctet1
doct3: addq.l #1,a1 * Other squares?
dbra d4,Dcarre
add.w UTLine(sp),a2 * Other square line?
subq.w #1,UTy(sp)
bne.s Dligne
subq.w #1,UNPlan(sp)
bne.s Dplan
lea UPile(sp),sp * Restore the pile
* Finished!
movem.l (sp)+,a0-a6/d1-d7
rts
***********************************************************
* JUMP TO ERROR MESSAGES
L_JFoncall equ 16
L16 moveq #23,d0
RJmp L_Error
L_JScnop equ 17
L17 moveq #47,d0
RJmp L_Error
L_JOOfmem equ 18
L18 moveq #24,d0
RJmp L_Error
***********************************************************
* ERROR HANDLING
L_NoPac equ 19
L19 moveq #0,d0
RBra L_Custom
L_NoScr equ 20
L20 moveq #1,d0
RBra L_Custom
***********************************************************
* ERROR MESSAGES
******* First routine
L_Custom equ 21
L21 lea ErrMes(pc),a0
moveq #0,d1
moveq #ExtNb,d2
moveq #0,d3
RJmp L_ErrorExt
ErrMes dc.b "Not a packed bitmap",0
dc.b "Not a packed screen",0
even
******* Second routine
L22 moveq #0,d1
moveq #ExtNb,d2
moveq #0,d3
RJmp L_ErrorExt
L23
***********************************************************
* Welcome message
C_Title dc.b "AMOSPro Picture Compactor V "
Version
dc.b 0,"$VER: "
Version
dc.b 0
Even
***********************************************************
C_End dc.w 0