mirror of https://github.com/earok/GloomAmiga.git
365 lines
5.3 KiB
ArmAsm
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
|