4cade/src/fx/macros.a

166 lines
3.8 KiB
Plaintext
Raw Normal View History

!ifndef _FX_MACROS_ {
!source "src/macros.a"
2019-10-21 20:00:38 +00:00
; .hgrlo, .hgr1hi will each be filled with $C0 bytes
2019-10-20 00:30:48 +00:00
; based on routine by John Brooks
; posted on comp.sys.apple2 on 2018-07-11
; https://groups.google.com/d/msg/comp.sys.apple2/v2HOfHOmeNQ/zD76fJg_BAAJ
2019-10-21 20:00:38 +00:00
!macro BUILD_HGR_LOOKUP_TABLES .hgrlo, .hgr1hi {
2021-12-14 02:15:26 +00:00
; preserves Y
2019-10-20 00:30:48 +00:00
ldx #0
2020-10-26 04:38:16 +00:00
+BUILD_HGR_LOOKUP_TABLES_X_IS_ALREADY_0 .hgrlo, .hgr1hi
}
2020-11-20 06:18:39 +00:00
; use this macro instead if you know X is already 0 on entry, to save 2 bytes
2020-10-26 04:38:16 +00:00
!macro BUILD_HGR_LOOKUP_TABLES_X_IS_ALREADY_0 .hgrlo, .hgr1hi {
2021-12-14 02:15:26 +00:00
; preserves Y
2019-10-20 00:30:48 +00:00
- txa
and #$F8
bpl +
ora #5
+ asl
bpl +
ora #5
+ asl
asl
sta .hgrlo,x
txa
and #7
rol
asl .hgrlo,x
rol
2019-10-23 05:15:33 +00:00
ora #$20
2019-10-20 00:30:48 +00:00
sta .hgr1hi,x
inx
cpx #$C0
bne -
}
2019-10-23 05:15:33 +00:00
; .hgrlomirror, .hgr1himirror will each be filled with $C0 bytes
!macro BUILD_HGR_MIRROR_LOOKUP_TABLES .hgrlomirror, .hgr1himirror {
ldx #$C0
ldy #0
- tya
and #$F8
bpl +
ora #5
+ asl
bpl +
ora #5
+ asl
asl
sta .hgrlomirror-1,x
tya
and #7
rol
asl .hgrlomirror-1,x
rol
ora #$20
sta .hgr1himirror-1,x
iny
dex
bne -
}
2018-11-03 15:04:09 +00:00
!macro HGR_CALC {
2020-11-20 06:18:39 +00:00
; 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
2018-11-03 15:04:09 +00:00
asl
tax
and #$F0
bpl @calc1
ora #$05
@calc1 bcc @calc2
ora #$0A
@calc2 asl
asl
sta $26
txa
and #$0E
adc #$10
asl $26
rol
sta $27
eor #$60
sta $3d
lda $26
sta $3c
}
2019-10-20 03:44:08 +00:00
!macro HGR_ROW_CALC {
asl
asl
asl
+HGR_CALC
}
2019-10-18 22:06:24 +00:00
; /!\ C must be clear before using this macro
2018-11-03 15:04:09 +00:00
!macro HGR_INC_WITHIN_BLOCK {
lda $27
adc #$04
sta $27
eor #$60
sta $3d
}
!macro RESET_HGR_CALC {
lda $27
sec
sbc #$20
sta $27
eor #$60
sta $3d
}
2019-10-24 19:41:08 +00:00
!macro COPY_BIT .src1, .dest1, .copymasks {
2019-10-26 02:06:13 +00:00
lda (.src1),y
eor (.dest1),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-24 19:41:08 +00:00
}
!macro COPY_BIT_ZP .src1, .dest1, .zpcopymask {
lda (.src1),y
eor (.dest1),y ; merge source and destination bits
and <.zpcopymask ; 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-26 02:06:13 +00:00
!macro SWITCH_TO_MASKS .copy {
lda #<.copy
sta CopyMaskAddr
lda #>.copy
sta CopyMaskAddr+1
}
2020-11-21 05:35:20 +00:00
; must set N flag based on Y immediately before using these macros
2019-10-19 15:10:48 +00:00
; e.g. LDY, INY, DEY, TYA
!macro IS_Y_OFFSCREEN {
bpl +
sec
bcs ++
+ cpy #40
++
}
2020-11-21 05:35:20 +00:00
!macro BRANCH_IF_Y_IS_OFFSCREEN .target {
cpy #40
bcs .target
}
!macro LONG_BRANCH_IF_Y_IS_OFFSCREEN .target {
cpy #40
bcc +
jmp .target
+
2020-11-21 05:35:20 +00:00
}
2019-10-19 15:10:48 +00:00
_FX_MACROS_=*
2018-11-03 15:04:09 +00:00
}