Files
4cade/src/fx/code.hgr.dither.precomputed.1bit.a
T

142 lines
3.7 KiB
Plaintext

!cpu 6502
!to "build/FXCODE/HGRDITHER1",plain
*=$6200
!source "src/fx/macros.a"
;HGRDitherPrecomputed1Bit
jsr iBuildHGRDitherMasks
jsr iBuildHGRTables
jsr iBuildHGRMirrorTables
jsr iBuildHGRMirrorCols
jsr iBuildHGRSparseBitmasks1Bit
; phase 1 - in reverse, with additional masking
+COPY_TO_0 .start, .end
; set up starting coordinate for reading coordinates in reverse order
+LDADDR EndCoordinates1Bit-2
sta <.input
sty <.input+1
; set up EOF marker to stop reading coordinates in reverse order
lda #$80
sta Coordinates1Bit-2
; set up logic to advance to next coordinates in reverse order
ldx #(.next2_end-.next2_start-1)
- lda .next2_start, x
sta <.next, x
dex
bpl -
jsr iReadyToPaint
jsr .InputLoop
bit KBD
bmi .start
; phase 2 - in order, without additional masking
+COPY_TO_0 .start, .end
; redirect additional masking pointers to an array that contains #$FFs (so no masking)
lda #<no_masks
sta <.evenrow_ptr
sta <.oddrow_ptr
jmp .InputLoop
.start
!pseudopc 0 {
.Exit1Bit rts
.evenrow_ptr
!word evenrow_masks
.oddrow_ptr
!word oddrow_masks
.InputLoop
ldy #0
.input=*+1
ldx Coordinates1Bit ; first value: HGR row (only 0..95 will be in input array)
bmi .Exit1Bit ; if > 127 then we're done
+ROW_X_TO_BASE_ADDRESSES .src1, .src2, .dest1, .dest2
+ROW_X_TO_MIRROR_ADDRESSES .mirror_src1, .mirror_src2, .mirror_dest1, .mirror_dest2
iny
lda (<.input), y
+HIGH_3_LOW_5 .input
; main 1x2 block in top-left quadrant
.src1=*+1
lda $FDFD, y
eor (<.dest1), y
and copymasks1bit, x
and (<.evenrow_ptr), y
eor (<.dest1), y
.dest1=*+1
sta $FDFD, y
.src2=*+1
lda $FDFD, y
eor (<.dest2), y
and copymasks1bit, x
and (<.oddrow_ptr), y
eor (<.dest2), y
.dest2=*+1
sta $FDFD, y
; corresponding 1x2 block in top-right quadrant (same row, opposite column)
lda mirror_cols, y
tay
+COPY_BIT_DITHER .src1, .dest1, mirror_copymasks1bit, .evenrow_ptr
+COPY_BIT_DITHER .src2, .dest2, mirror_copymasks1bit, .oddrow_ptr
; corresponding 1x2 block in bottom-right quadrant (opposite row, opposite column)
.mirror_src1=*+1
lda $FDFD, y
eor (<.mirror_dest1), y
and mirror_copymasks1bit, x
and (<.oddrow_ptr), y
eor (<.mirror_dest1), y
.mirror_dest1=*+1
sta $FDFD, y
.mirror_src2=*+1
lda $FDFD, y
eor (<.mirror_dest2), y
and mirror_copymasks1bit, x
and (<.evenrow_ptr), y
eor (<.mirror_dest2), y
.mirror_dest2=*+1
sta $FDFD, y
; corresponding 1x2 block in bottom-left quadrant (opposite row, original column)
lda mirror_cols, y
tay
+COPY_BIT_DITHER .mirror_src1, .mirror_dest1, copymasks1bit, .oddrow_ptr
+COPY_BIT_DITHER .mirror_src2, .mirror_dest2, copymasks1bit, .evenrow_ptr
.next
inc <.input
inc <.input
bne +
bit KBD
bmi ++
inc <.input+1
+ jmp .InputLoop
++ rts
}
.end
.next2_start
!pseudopc .next {
lda <.input
php
dec <.input
dec <.input
plp
bne +
dec <.input+1
bit KBD
bmi ++
+ jmp .InputLoop
++ rts
}
.next2_end