4cade/src/fx/fx.hgr.precomputed.1bit.a

183 lines
5.3 KiB
Plaintext
Raw Normal View History

;license:MIT
;(c) 2019 by 4am
;
2019-10-23 00:14:30 +00:00
src3 = $E8 ; word
dest3 = $EA ; word
src4 = $EC ; word
dest4 = $EE ; word
src1 = $F0 ; word
dest1 = $F2 ; word
src2 = $F4 ; word
dest2 = $F6 ; word
input = $FE ; word
copymasks = $0200 ; $100 bytes but sparse, index is 0..6 but in high 3 bits, so $00, $20, $40, $60, $80, $A0, $C0
sourcemasks = $0201 ; same as copymasks
mirror_copymasks = $0202
mirror_sourcemasks = $0203
hgrlo = $0300 ; $C0 bytes
2019-10-23 05:15:33 +00:00
hgrlomirror = $BD40 ; $C0 bytes
mirror_cols = $BE00 ; $28 bytes
hgr1hi = $BE40 ; $C0 bytes
2019-10-23 05:15:33 +00:00
hgr1himirror = $BF40 ; $C0 bytes
!source "src/fx/macros.a"
2019-10-23 00:54:51 +00:00
!macro COPY_BIT .src1, .dest1, .sourcemasks, .copymasks {
lda (.dest1),y
2019-10-23 17:59:08 +00:00
eor (.src1),y ; merge source and destination bits
and .copymasks,x ; isolate the bits to replace, zero the rest
eor (.dest1),y ; unmerge source and destination bits, leaves "to keep" destination bits intact
sta (.dest1),y ; write the result
2019-10-23 00:54:51 +00:00
}
!macro FX_PRECOMPUTED_1BIT .coords {
; build lookup tables for base address of HGR rows
+BUILD_HGR_LOOKUP_TABLES hgrlo, hgr1hi
2019-10-23 05:15:33 +00:00
+BUILD_HGR_MIRROR_LOOKUP_TABLES hgrlomirror, hgr1himirror
; build lookup table to get $27-y for y in $00..$27
ldx #$27
ldy #$00
- tya
sta mirror_cols,x
iny
dex
bpl -
; build sparse lookup tables for bitmasks
lda #%10000001
sta copymasks
sta mirror_copymasks+$C0
eor #%11111111
sta sourcemasks
sta mirror_sourcemasks+$C0
lda #%10000010
sta copymasks+$20
sta mirror_copymasks+$A0
eor #%11111111
sta sourcemasks+$20
sta mirror_sourcemasks+$A0
lda #%10000100
sta copymasks+$40
sta mirror_copymasks+$80
eor #%11111111
sta sourcemasks+$40
sta mirror_sourcemasks+$80
lda #%10001000
sta copymasks+$60
sta mirror_copymasks+$60
eor #%11111111
sta sourcemasks+$60
sta mirror_sourcemasks+$60
lda #%10010000
sta copymasks+$80
sta mirror_copymasks+$40
eor #%11111111
sta sourcemasks+$80
sta mirror_sourcemasks+$40
lda #%10100000
sta copymasks+$A0
sta mirror_copymasks+$20
eor #%11111111
sta sourcemasks+$A0
sta mirror_sourcemasks+$20
lda #%11000000
sta copymasks+$C0
sta mirror_copymasks
eor #%11111111
sta sourcemasks+$C0
sta mirror_sourcemasks
; set up pointer to input data
lda #<.coords
sta input
lda #>.coords
sta input+1
InputLoop
ldy #0
lda (input),y ; first value: HGR row (only 0..95 will be in input array)
bmi Exit1 ; if > 127 then we're done
tax
lda hgrlo,x
sta dest1
sta src1
lda hgr1hi,x
sta dest1+1
2019-10-23 05:15:33 +00:00
Exit1 = * + 1
eor #$60 ; ahem. doubles as RTS
sta src1+1
2019-10-23 00:14:30 +00:00
lda hgrlo+1,x
sta dest2
sta src2
2019-10-23 00:14:30 +00:00
lda hgr1hi+1,x
sta dest2+1
eor #$60
sta src2+1
2019-10-23 00:14:30 +00:00
2019-10-23 05:15:33 +00:00
lda hgrlomirror,x
2019-10-23 00:14:30 +00:00
sta dest3
sta src3
2019-10-23 05:15:33 +00:00
lda hgr1himirror,x
2019-10-23 00:14:30 +00:00
sta dest3+1
eor #$60
sta src3+1
2019-10-23 05:15:33 +00:00
lda hgrlomirror+1,x
2019-10-23 00:14:30 +00:00
sta dest4
sta src4
2019-10-23 05:15:33 +00:00
lda hgr1himirror+1,x
2019-10-23 00:14:30 +00:00
sta dest4+1
eor #$60
sta src4+1
2019-10-23 06:03:25 +00:00
inc input
lda (input),y
and #%11100000 ; second value: high 3 bits = index into tables to find bitmasks
tax
2019-10-23 00:14:30 +00:00
eor (input),y ; second value: low 5 bits = byte offset within the row (implicitly "and #%00011111")
tay
; main 1x2 block in top-left quadrant
2019-10-23 00:54:51 +00:00
+COPY_BIT src1, dest1, sourcemasks, copymasks
+COPY_BIT src2, dest2, sourcemasks, copymasks
; corresponding 1x2 block in top-right quadrant (same row, opposite column)
lda mirror_cols,y
tay
2019-10-23 00:54:51 +00:00
+COPY_BIT src1, dest1, mirror_sourcemasks, mirror_copymasks
+COPY_BIT src2, dest2, mirror_sourcemasks, mirror_copymasks
; corresponding 1x2 block in bottom-right quadrant (opposite row, opposite column)
2019-10-23 00:54:51 +00:00
+COPY_BIT src3, dest3, mirror_sourcemasks, mirror_copymasks
+COPY_BIT src4, dest4, mirror_sourcemasks, mirror_copymasks
; corresponding 1x2 block in bottom-left quadrant (opposite row, original column)
lda mirror_cols,y
tay
2019-10-23 00:54:51 +00:00
+COPY_BIT src3, dest3, sourcemasks, copymasks
+COPY_BIT src4, dest4, sourcemasks, copymasks
2019-10-23 05:15:33 +00:00
inc input
beq +
jmp InputLoop
+ bit $c000
bmi Exit2
inc input+1
2019-10-23 05:15:33 +00:00
jmp InputLoop
2019-10-23 12:16:47 +00:00
Exit2 rts
2019-10-23 17:59:08 +00:00
!if * and 1 {
!byte 0 ;align 2 but avoids the fake allocation bug if it was aligned already
2019-10-23 12:16:47 +00:00
}
}