amos-professional/AMOS/Productivity2/Procedures/Bobs/Rmask.S
2020-04-26 02:58:13 +02:00

148 lines
2.8 KiB
ArmAsm

; ____________________________________________________________________________
;
; AMOS Complex mask calculation
;
; [Number,Colour0,Colour1]
; ____________________________________________________________________________
OPT P+
Include "|AMOS_Includes.s"
; ____________________________________________________________________________
; Look for the sprite bank
; ~~~~~~~~~~~~~~~~~~~~~~~~
bsr Bnk_GetBobs
beq Erreur
; Get the parameters back
; ~~~~~~~~~~~~~~~~~~~~~~~
move.l (a3)+,d2 Colour 2
move.l (a3)+,d1 Colour 1
move.l (a3)+,d0 Number of the bob
; Parameter check
; ~~~~~~~~~~~~~~~
tst.w d0
ble Erreur
cmp.w (a0)+,d0 > of available sprites
bhi Erreur
lsl.w #3,d0
lea -8(a0,d0.w),a5 Adress of the bobs
move.l (a5)+,d0
beq Erreur
move.l d0,a4 A4= SpriteBase
* Built up table
lea Table(pc),a0
cmp.l (a0),d1
bne.s DoTable
cmp.l 4(a0),d2
beq.s PaTable
DoTable move.l d1,(a0)+
move.l d2,(a0)+
moveq #64-1,d0
Table0 clr.b (a0)
lsr.l #1,d1
roxr.l #1,d2
bcc.s Table1
subq.b #1,(a0)
Table1 addq.l #1,a0
dbra d0,Table0
PaTable
* Calculation of mask size
move.w (a4),d7 TX
lsl.w #1,d7 En mots
mulu 2(a4),d7 fois TY
* Reserve memory (if needed)
move.l (a5),d0
beq.s Reserve
bpl.s DejaLa
Reserve move.l d7,d0
addq.l #4,d0
move.l d0,d2
move.l $4,a6
move.l #Chip|Public,d1 CHIP memory only
jsr _LVOAllocMem(a6)
move.l d0,(a5)
beq Erreur
move.l d0,a0
move.l d2,(a0)+ Loke the size
DejaLa move.l d0,a2
addq.l #4,a2
* Loop initialisation
move.l d7,d6 D6-> Size of one memory plane
subq.l #1,d7 D7-> Byte counter
move.w 4(a4),d5 Number of planes
subq.w #1,d5 D5-> Plane counter reload
lea 10(a4),a1 A1-> Bitmap base
; A2-> Mask address
lea Table+8(pc),a3 A3-> Mask table
* Calculation loop
.loop0 moveq #7,d3 D3-> Bit counter
.loop1 moveq #0,d0 D0-> Color calculation
moveq #0,d1 D1-> Bit position
move.w d5,d2 D2-> Plane counter
move.l a1,a0 A0-> Point to current byte
.loop2 btst d3,(a0)
beq.s .loop3
bset d1,d0
.loop3 add.l d6,a0 Next plane
addq.w #1,d1
dbra d2,.loop2
bset d3,(a2)
tst.b 0(a3,d0.w) Transparent colour?
beq.s .loop4
bclr d3,(a2)
.loop4
dbra d3,.loop1 Still one bit?
addq.l #1,a1
addq.l #1,a2
dbra d7,.loop0 Still one byte?
* All done, no errors
moveq #0,d0
rts
* An error
Erreur moveq #-1,d0
rts
; Finds a bank adress
; ~~~~~~~~~~~~~~~~~~~
Bnk_GetAdr
move.l Cur_Banks(a5),a0
move.l (a0),d1
beq.s .Nof
.Loop move.l d1,a1
cmp.l 8(a1),d0
beq.s .Fnd
move.l (a1),d1
bne.s .Loop
.Nof sub.l a1,a1
move.l a1,a0
rts
.Fnd move.w 8+4(a1),d0
lea 8*3(a1),a0
move.l a0,a1
move.w #%00000,CCR
rts
; Finds bob bank address
; ~~~~~~~~~~~~~~~~~~~~~~
; OUT BNE found A0/A1=address (D0/D1 unchanged)
Bnk_GetBobs
movem.l d0/d1,-(sp)
moveq #1,d0
bsr Bnk_GetAdr
beq.s .Nof
btst #Bnk_BitBob,d0
.Nof movem.l (sp)+,d0/d1
rts
******* Work table
even
Table ds.b 64+8
even