mirror of
https://github.com/a2-4am/4cade.git
synced 2026-10-24 10:02:31 +00:00
142 lines
3.7 KiB
Plaintext
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
|