Files
open-roms/c64/kernal/tape/tape_head_align_gen_code.s
T

139 lines
2.4 KiB
ArmAsm

// #LAYOUT# STD * #TAKE
// #LAYOUT# M65 KERNAL_1 #TAKE
// #LAYOUT# * * #IGNORE
//
// Tape head alignemnt tool - helper code generator
//
#if CONFIG_TAPE_HEAD_ALIGN
// Helper variables - reuse BASIC numeric work area on zero page
.label __ha_lda_addr = TEMPF1 + 0; // 2 bytes, for code generator
.label __ha_sta_addr = TEMPF1 + 2; // 2 bytes, for code generator
tape_head_align_gen_code:
// Setup generated code start address
lda #<__ha_scroll
sta SAL+0
lda #>__ha_scroll
sta SAL+1
// Setup initial source and destination addresses
ldy #<(__ha_chart + __ha_rows * (8 * 40) + 6)
sty __ha_lda_addr + 0
iny
sty __ha_sta_addr + 0
ldy #>(__ha_chart + __ha_rows * (8 * 40) + 6)
sty __ha_lda_addr + 1
sty __ha_sta_addr + 1
// Emit code to move 7 rows of one 8x8 cell
!:
ldx #$07
!:
jsr tape_head_align_gen_code_emit_pair
dec __ha_lda_addr + 0
dec __ha_sta_addr + 0
dex
bne !-
// Emit code to fetch a top row from the cell above
inc __ha_lda_addr + 0
sec
lda __ha_lda_addr + 0
sbc #<(8 * 40 - 7)
sta __ha_lda_addr + 0
lda __ha_lda_addr + 1
sbc #>(8 * 40 - 7)
sta __ha_lda_addr + 1
jsr tape_head_align_gen_code_emit_pair
// Prepare addresses for the next iteration
lda __ha_lda_addr + 0
sta __ha_sta_addr + 0
lda __ha_lda_addr + 1
sta __ha_sta_addr + 1
dec __ha_lda_addr + 0
// Now, new iteration - if needed
lda __ha_sta_addr + 0
cmp #<(__ha_chart + 7)
bne !--
lda __ha_sta_addr + 1
cmp #>(__ha_chart + 7)
bne !--
// Last pair to be generated starts from LDA #$00
lda #$A9
jsr tape_head_align_gen_code_emit_byte
lda #$00
jsr tape_head_align_gen_code_emit_byte
jsr tape_head_align_gen_code_emit_sta
// Emit RTS and quit
lda #$60
jmp tape_head_align_gen_code_emit_byte
tape_head_align_gen_code_emit_pair:
lda #$BD // LDA absolute, x
jsr tape_head_align_gen_code_emit_byte
lda __ha_lda_addr + 0
jsr tape_head_align_gen_code_emit_byte
lda __ha_lda_addr + 1
jsr tape_head_align_gen_code_emit_byte
// FALLTROUGH
tape_head_align_gen_code_emit_sta:
lda #$9D // STA absolute, x
jsr tape_head_align_gen_code_emit_byte
lda __ha_sta_addr + 0
jsr tape_head_align_gen_code_emit_byte
lda __ha_sta_addr + 1
// FALLTROUGH
tape_head_align_gen_code_emit_byte:
ldy #$00
sta (SAL), y
#if HAS_OPCODES_65CE02
inw SAL
#else
inc SAL+0
bne !+
inc SAL+1
!:
#endif
rts
#endif // CONFIG_TAPE_HEAD_ALIGN