amiga-gloom/planar.s

365 lines
5.3 KiB
ArmAsm

;offset 0:
bra initc2p
;offset 4:
bra doc2p_1X1X8
;offset 8:
bra doc2p_1X1X6
;offset 12:
dc.l 0
;offset 16:
dc.l 0
initc2p ;create 2 tables for Gloom
;
;a0=columns buffer to fill in (array of longs)
;d0=how many columns (multiple of 32)
;
;create d0 long offsets for each column offset of chunky buffer
;this allows for scrambling of buffer
;
;a1=palette remapping array (array of bytes)
;
;this allows for scrambled bitplanes.
;
;do palette remapping first...
;
move #$ff,d1 ;#colours
.loop ;
move.b d1,0(a1,d1)
;
dbf d1,.loop
;
;column offsets...
;
;0,2,4,6,8,10,12,14
;1,3,5,7,9,11,13,15
;16,18,20...
;
lsr #4,d0
subq #1,d0
moveq #0,d1
;
.loop2 moveq #7,d2
;
.loop3 move.l d1,(a0)+
addq.l #2,d1
dbf d2,.loop3
;
sub.l #15,d1
moveq #7,d2
;
.loop4 move.l d1,(a0)+
addq.l #2,d1
dbf d2,.loop4
;
subq.l #1,d1
;
dbf d0,.loop2
;
rts
rotbits macro ;macro for rotating/merging bits.
;
;rotbits reg1,reg2,shift
;
move.l \1,d4
and.l d6,\1
eor.l \1,d4
lsl.l #\3,\1
;
move.l \2,d5
and.l d6,d5
eor.l d5,\2
lsr.l #\3,\2
or.l d4,\2
or.l d5,\1
;
endm
doc2p_1X1X8 ;
;inputs:
;a0.l=src chunky buffer
;a1.l=dest chipmem bitmap
;d0.w=width (in pixels - multiple of 32) to convert
;d1.w=height (in pixels - even)
;d2.l=modulo from one bitplane to next (copmod-ish)
;d3.l=modulo from start of one line to start of next (linemod)
;
;internal:
;d6=current and reg.
;d7=loop counter
;a2=4 bit and
;a3=2 bit and
;a4=1 bit and
;a5=bitplane modulo, 1 bp to next
;a6=subtract at end of one loop
;
move.l #$0f0f0f0f,a2
move.l #$33333333,a3
move.l #$5555aaaa,a4
move.l d2,a5 ;one bp to next.
;
lsl.l #3,d2 ;8 bitplanes
move.l d2,a6
sub.l a5,a6 ;7 * bpmod
subq.l #2,a6 ;to next word
;
lsr #4,d0 ;16 pixels at a time
move d0,d2
ext.l d2
add.l d2,d2
add.l a6,d2
sub.l d2,d3
move.l d3,-(a7)
;
subq #1,d1
move d1,d7 ;hite dbf
swap d7
subq #1,d0
move d0,d7
subq #2,a7 ;long align
move d7,-(a7)
;
movem.l (a0)+,d0-d3 ;next 16 pixels.
move.l a2,d6 ;4 bit and
bra.s .here
;
.loop2 swap d7
bra.s .here
;
.loop movem.l (a0)+,d0-d3 ;next 16 pixels.
move.l a2,d6 ;4 bit and
;
swap d4
move d4,(a1) ;plane 7
sub.l a6,a1 ;back to start of next pixel.
;
.here rotbits d0,d2,4
rotbits d1,d3,4
;
move.l a3,d6 ;2 bit and
rotbits d0,d1,2
move.l a4,d6 ;1 bit and
;
move.l d0,d4
and.l d6,d4
eor.l d4,d0
lsr #1,d4
swap d4
add d4,d4
or.l d4,d0
;
move d0,(a1) ;plane 0
add.l a5,a1
;
move.l d1,d4
and.l d6,d4
eor.l d4,d1
;
swap d0
move d0,(a1)
add.l a5,a1
;
lsr #1,d4
swap d4
add d4,d4
or.l d4,d1
;
move d1,(a1) ;plane 2
add.l a5,a1
;
move.l a3,d6 ;2 bit and
rotbits d2,d3,2
move.l a4,d6 ;1 bit and
;
move.l d2,d4
and.l d6,d4
eor.l d4,d2
;
swap d1
move d1,(a1) ;plane 3
add.l a5,a1
;
lsr #1,d4
swap d4
add d4,d4
or.l d4,d2
;
move d2,(a1) ;plane 4
add.l a5,a1
;
move.l d3,d4
and.l d6,d4
eor.l d4,d3
;
swap d2
move d2,(a1) ;plane 5
add.l a5,a1
;
lsr #1,d4
swap d4
add d4,d4
or.l d3,d4
;
move d4,(a1) ;plane 6
add.l a5,a1
;
dbf d7,.loop ;end of width?
move (a7),d7
swap d7
;
movem.l (a0)+,d0-d3 ;get next 16 pixels.
move.l a2,d6 ;4 bit and
;
swap d4
move d4,(a1) ;plane 7.
add.l 4(a7),a1 ;start of next line
;
dbf d7,.loop2
;
list
.check set *-.loop2 ;loop size (<256?)
nolist
;
addq #8,a7
;
rts
doc2p_1X1X6 ;
;inputs:
;a0.l=src chunky buffer
;a1.l=dest chipmem bitmap
;d0.w=width (in pixels - multiple of 32) to convert
;d1.w=height (in pixels - even)
;d2.l=modulo from one bitplane to next (copmod-ish)
;d3.l=modulo from start of one line to start of next (linemod)
;
;internal:
;d6=current and reg.
;d7=loop counter
;a2=4 bit and
;a3=2 bit and
;a4=1 bit and
;a5=bitplane modulo, 1 bp to next
;a6=subtract at end of one loop
;
move.l #$0f0f0f0f,a2
move.l #$33333333,a3
move.l #$5555aaaa,a4
move.l d2,a5 ;one bp to next.
;
lsl.l #3,d2 ;8 bitplanes
move.l d2,a6
sub.l a5,a6 ;7 * bpmod
subq.l #2,a6 ;to next word
;
lsr #4,d0 ;16 pixels at a time
move d0,d2
ext.l d2
add.l d2,d2
add.l a6,d2
sub.l d2,d3
move.l d3,-(a7)
;
subq #1,d1
move d1,d7 ;hite dbf
swap d7
subq #1,d0
move d0,d7
subq #2,a7 ;long align
move d7,-(a7)
;
movem.l (a0)+,d0-d3 ;next 16 pixels.
move.l a2,d6 ;4 bit and
bra.s .here
;
.loop2 swap d7
bra.s .here
;
.loop movem.l (a0)+,d0-d3 ;next 16 pixels.
move.l a2,d6 ;4 bit and
;
swap d4
move d4,(a1) ;plane 7
sub.l a6,a1 ;back to start of next pixel.
;
.here rotbits d0,d2,4
rotbits d1,d3,4
;
move.l a3,d6 ;2 bit and
rotbits d0,d1,2
move.l a4,d6 ;1 bit and
;
move.l d0,d4
and.l d6,d4
eor.l d4,d0
lsr #1,d4
swap d4
add d4,d4
or.l d4,d0
;
move d0,(a1) ;plane 0
add.l a5,a1
;
move.l d1,d4
and.l d6,d4
eor.l d4,d1
;
swap d0
move d0,(a1) ;plane 1
add.l a5,a1
;
lsr #1,d4
swap d4
add d4,d4
or.l d4,d1
;
move d1,(a1) ;plane 2
add.l a5,a1
;
move.l a3,d6 ;2 bit and
rotbits d2,d3,2
move.l a4,d6 ;1 bit and
;
move.l d2,d4
and.l d6,d4
eor.l d4,d2
;
swap d1
move d1,(a1) ;plane 3
add.l a5,a1
;
lsr #1,d4
swap d4
add d4,d4
or.l d2,d4
;
move d4,(a1) ;plane 4
add.l a5,a1
;
dbf d7,.loop ;end of width?
move (a7),d7
swap d7
;
movem.l (a0)+,d0-d3 ;get next 16 pixels.
move.l a2,d6 ;4 bit and
;
swap d4
move d4,(a1) ;plane 7.
add.l 4(a7),a1 ;start of next line
;
dbf d7,.loop2
;
list
.check set *-.loop2 ;loop size (<256?)
nolist
;
addq #8,a7
;
rts