// #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