4cade/src/fx/fx.hgr.common.a

138 lines
3.0 KiB
Plaintext

;license:MIT
;(c) 2018-9 by 4am
;
!source "src/fx/macros.a"
!macro HGR_CALC_ROUTINES {
HGRCalc
; in: A = HGR row (0x00..0xBF)
; out: A/X clobbered
; Y preserved
; ($26) points to first byte of given HGR row on hi-res page 1
; ($3C) points to same byte on hi-res page 2
; based on 'Woz Recodes Hi-Res Address Calculations'
; Apple Assembly Line vol. 7 issue 3 (December 1986)
; http://www.txbobsc.com/aal/1986/aal8612.html#a9
+HGR_CALC
rts
}
!macro HGR_BLOCK_COPY_ROUTINES {
HGRBlockCopy
; in: A = HGR row / 8 (0x00..0x17)
; Y = HGR column (0x00..0x27)
; out: Y preserved
; X = #$00
; Z set
; C clear
; all other flags and registers clobbered
+HGR_ROW_CALC
HGRBlockCopyNoRecalc
clc
ldx #$08
@loop
lda ($3c),y
sta ($26),y
+HGR_INC_WITHIN_BLOCK
dex
bne @loop
rts
}
!macro HGR_HALF_BLOCK_COPY_ROUTINES {
HGRHalfBlockCopy
; in: A = HGR row / 4 (0x00..0x2F)
; Y = HGR column (0x00..0x27)
; out: Y preserved
; X = #$00
; Z set
; C clear
; all other flags and registers clobbered
asl
asl
+HGR_CALC
HGRStaggerCopy
clc
ldx #$04
@loop
lda ($3c),y
sta ($26),y
+HGR_INC_WITHIN_BLOCK
dex
bne @loop
rts
}
!macro HGR_WHITE_ROUTINES {
HGRBlockToWhite
; in: A = HGR row / 8 (0x00..0x17)
; Y = HGR column (0x00..0x27)
; out: Y preserved
; X = #$00
; Z set
; C clear
; all other flags and registers clobbered
+HGR_ROW_CALC
clc
ldx #$08
@loop
lda #$7F
sta ($26),y
+HGR_INC_WITHIN_BLOCK
dex
bne @loop
rts
HGRHalfBlockToWhite
; in: A = HGR row / 4 (0x00..0x2F)
; Y = HGR column (0x00..0x27)
; out: Y preserved
; X = #$00
; Z set
; C clear
; all other flags and registers clobbered
asl
asl
+HGR_CALC
HGRStaggerToWhite
clc
ldx #$04
@loop
lda #$7F
sta ($26),y
+HGR_INC_WITHIN_BLOCK
dex
bne @loop
rts
}
!macro HGR_COPY_MASK_ROUTINES {
SetCopyMask
; in: A/Y points to 8-byte array of bit masks used by HGRBlockCopyWithMask
+ST16 CopyMaskAddr
rts
HGRBlockCopyWithMask
; in: A = HGR row / 8 (0x00..0x17)
; Y = HGR column (0x00..0x27)
; must call SetCopyMask first
; out: Y preserved
; A/X clobbered
; $00 clobbered
+HGR_ROW_CALC
HGRBlockCopyWithMaskNoRecalc
ldx #7
HGRBlockCopyWithMasksLoop
lda ($26),y
eor ($3c),y
CopyMaskAddr=*+1
and $FDFD,x ; call SetCopyMask to set
eor ($26),y
sta ($26),y
clc
+HGR_INC_WITHIN_BLOCK
dex
bpl HGRBlockCopyWithMasksLoop
rts
}