From e53dcaf3453bf39f5e65695bed3336cf585c5bc2 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Wed, 9 Oct 2019 20:53:42 +0200 Subject: [PATCH] reached target granularity in screen code --- CONFIG.md | 6 +- c64/kernal/chrin_real.s | 2 +- c64/kernal/chrout_screen.s | 295 ------------------ c64/kernal/e50a.plot.s | 2 +- c64/kernal/f1ca.chrout.s | 27 ++ c64/kernal/screen/chrout_screen.s | 108 +++++++ c64/kernal/screen/chrout_screen_control.s | 10 +- c64/kernal/screen/chrout_screen_del.s | 6 +- c64/kernal/screen/chrout_screen_ins.s | 4 +- c64/kernal/screen/cursor.s | 2 +- c64/kernal/screen/cursor_home.s | 2 +- .../screen/screen_advance_to_next_line.s | 47 +++ .../screen/screen_calculate_line_pointer.s | 6 +- .../screen_get_current_line_logical_length.s | 11 + c64/kernal/screen/screen_grow_logical_line.s | 4 +- .../screen/screen_scroll_up_if_on_last_line.s | 115 +++++++ .../screen_set_pointer_to_current_line.s} | 11 +- 17 files changed, 335 insertions(+), 323 deletions(-) delete mode 100644 c64/kernal/chrout_screen.s create mode 100644 c64/kernal/screen/chrout_screen.s create mode 100644 c64/kernal/screen/screen_advance_to_next_line.s create mode 100644 c64/kernal/screen/screen_get_current_line_logical_length.s create mode 100644 c64/kernal/screen/screen_scroll_up_if_on_last_line.s rename c64/kernal/{set_pointer_to_current_screen_line.s => screen/screen_set_pointer_to_current_line.s} (85%) diff --git a/CONFIG.md b/CONFIG.md index 69dc2575..5d09de23 100644 --- a/CONFIG.md +++ b/CONFIG.md @@ -1,7 +1,7 @@ # Configuring the build -It's not possible to provide ROM builds that suit everyone needs - therefore configuration files were introduced, separately for each of the hardware targets: +It's not possible to provide ROM builds that suit everyone needs - therefore configuration files were introduced, few predefined configurations are provided with sane defaults: * [`c64/,,config_generic.s`](c64/,,config_generic.s) * [`c64/,,config_mega65.s`](c64/,,config_mega65.s) @@ -11,8 +11,6 @@ Just edit them and recompile the project. To enable particular option - uncommen Note however, that features do not came for free - enabling them needs some additional ROM space (in BASIC segment, in KERNAL segment, or in both), which is VERY limited on the target machines. Some options might be unavailable for speecific targets - read the comments in the configuration files. Some options might also carry compatibility and/or performance hit - so choose wisely. -Sane defaults are already present - different for each target. - ## Hardware platform and variant ### `CONFIG_PLATFORM_COMMODORE_64` @@ -136,4 +134,4 @@ Replaces `RTS` stubbed routines implementation with one causing a break. ### `CONFIG_DBG_PRINTF` -Makes 'printf' routine available. +Makes `printf` routine available. diff --git a/c64/kernal/chrin_real.s b/c64/kernal/chrin_real.s index 4d1a3a87..cf7f54f6 100644 --- a/c64/kernal/chrin_real.s +++ b/c64/kernal/chrin_real.s @@ -113,7 +113,7 @@ read_from_keyboard: sta LXSP+1 // Calculate length - jsr get_current_line_logical_length + jsr screen_get_current_line_logical_length tay iny !: dey diff --git a/c64/kernal/chrout_screen.s b/c64/kernal/chrout_screen.s deleted file mode 100644 index c516dcf4..00000000 --- a/c64/kernal/chrout_screen.s +++ /dev/null @@ -1,295 +0,0 @@ - -// -// CHROUT routine - screen support -// - - -chrout_screen: - - // Crude implementation of character output - sei // XXX why do we need to disable interrupts? - - jsr cursor_hide_if_visible - - lda SCHAR - tax - - // All the PETSCII control codes are within $0x, $1x, $8x, $9x, remaining - // ones are always printable characters; separate away control codes - - and #$60 - bne !+ - jmp chrout_screen_control -!: - txa - - // Literals - first convert PETSCII to screen code - - // Codes $C0-$DF become $40-$5F - cmp #$E0 - bcs !+ - cmp #$C0 - bcc !+ - - and #$7F - jmp output_literal_char // not high char - -!: - // Range $20-$3F is unchanged - cmp #$40 - bcc output_literal_char // not high char - - // Unshifted letters and symbols from $40-$5F - // all end up being -$40 - // (C64 PRG p376) - - // But anything >= $80 needs to be -$40 - // (C64 PRG p380-381) - // And bit 7 should be cleared, only to be - // set by reverse video - sec - sbc #$40 - - // Fix shifted chars by adding $20 again - cmp #$20 - bcc output_literal_char // not high char - cmp #$40 - bcs output_literal_char // not high char - clc - adc #$20 - -output_literal_char: - - // Write normal character on the screen - - pha - - ldy PNTR - ora RVS // Compute's Mapping the 64 p38 - sta (PNT),y - - // Decrement number of chars waiting to be inserted - lda INSRT - beq !+ - dec INSRT -!: - pla - cmp #$22 - bne not_quote - - // Toggle quote flag if required - lda QTSW - eor #$80 - sta QTSW - -not_quote: - - // Set colour - lda COLOR - sta (USER),y - - // Advance the column, and scroll screen down if we need - // to insert a 2nd line in this logical line. - // (eg Compute's Mapping the 64 p41) - ldx TBLX - iny - sty PNTR - cpy #40 - bne !+ - jsr screen_grow_logical_line - ldy PNTR -!: - cpy #80 - bcc no_screen_advance_to_next_line - lda #0 - sta PNTR - jmp screen_advance_to_next_line -no_screen_advance_to_next_line: - jmp chrout_done - - - - - -not_last_line: - rts - -scroll_up_if_on_last_line: - - // Colour RAM is always in fixed place, so is easiest - // to use to check if we are on the last line. - // The last line is at $D800 + 24*40 = $DBC0 - lda USER+1 - cmp #>$DBC0 - bne not_last_line - - lda USER+0 - cmp #<$DBC0 - beq is_last_line - - jsr get_current_line_logical_length - clc - adc USER+0 - cmp #<$DBE7-1 - bcc not_last_line - -is_last_line: - - dec TBLX - - // FALL THROUGH - -scroll_screen_up: - // Now scroll the whole screen up either one or two lines - // based on whether the first screen line is linked or not. - - // Get pointers to start of screen + colour RAM - lda HIBASE - sta PNT+1 - sta SAL+1 - lda #>$D800 - sta USER+1 - sta EAL+1 - lda #$00 - sta PNT+0 - sta USER+0 - - // Get pointers to screen/colour RAM source - lda LDTBL+0 - bmi !+ - lda #40 - .byte $2C // BIT $nnnn to skip next instruction -!: - lda #80 - sta SAL+0 - sta EAL+0 - - // Copy first three pages - ldy #$00 - ldx #3 -scroll_copy_loop: - lda (EAL),y - sta (USER),y - lda (SAL),y - sta (PNT),y - - iny - bne scroll_copy_loop - - inc SAL+1 - inc PNT+1 - inc EAL+1 - inc USER+1 - dex - bne scroll_copy_loop - - // Copy last partial page - // We need to copy 1000-(3*256)-line length - // = 232 - line length - lda SAL+0 - lda #232 - sec - sbc SAL+0 - tax -scroll_copy_loop2: - lda (EAL),y - sta (USER),y - lda (SAL),y - sta (PNT),y - iny - dex - bne scroll_copy_loop2 - - // Fill in scrolled up area - ldx SAL+0 -scroll_copy_loop3: - lda COLOR - sta (USER),y - lda #$20 - sta (PNT),y - iny - dex - bne scroll_copy_loop3 - - // Shift line linkage list - ldy #0 - ldx #24 -link_copy: - lda LDTBL+1,y - sta LDTBL+0,y - iny - dex - bne link_copy - // Clear line link flag of last line - stx LDTBL+24 - - // Restore correct line pointers - jsr calculate_screen_line_pointer - - rts - - - - - - - - - -get_current_line_logical_length: - ldy TBLX - lda LDTBL,y - bpl line_not_linked_del - lda #79 - .byte $2c // BIT absolute mode, which we use to skip the next two instruction bytes -line_not_linked_del: - lda #39 - sta LNMX - rts - -screen_advance_to_next_line: - - // jsr cursor_hide_if_visible - - // Go to start of line - lda #0 - sta PNTR - // Advance line number - ldy TBLX - - // Do quick fix to line pointer to work out if it is off - // the bottom of the screen. - ldx #40 - lda LDTBL,y - bmi !+ - .byte $2c -!: ldx #80 - txa - clc - adc PNT+0 - sta PNT+0 - lda PNT+1 - adc #0 - sta PNT+1 - - inc TBLX - - // Check if it will trigger scrolling - // Work out if we have gone off the bottom of the screen? - // 1040 > 1024, so if high byte of screen pointer is >= (HIBASE+4), - // then we are off the bottom of the screen - lda PNT+1 - sec - sbc HIBASE - cmp #3 - bcc !+ - lda PNT+0 - cmp #$e7 - bcc !+ - - // Off the bottom of the screen - jsr scroll_screen_up -!: - - jsr calculate_screen_line_pointer - jmp chrout_done diff --git a/c64/kernal/e50a.plot.s b/c64/kernal/e50a.plot.s index dbf08d43..ae9d32ff 100644 --- a/c64/kernal/e50a.plot.s +++ b/c64/kernal/e50a.plot.s @@ -20,7 +20,7 @@ plot_set: sty PNTR stx TBLX - jsr calculate_screen_line_pointer + jsr screen_calculate_line_pointer // XXX cursor blink might need to be handled too diff --git a/c64/kernal/f1ca.chrout.s b/c64/kernal/f1ca.chrout.s index 6c37056a..4e84808e 100644 --- a/c64/kernal/f1ca.chrout.s +++ b/c64/kernal/f1ca.chrout.s @@ -16,10 +16,17 @@ CHROUT: // (Confirmed by writing a test program that X and Y // don't get modified, in agreement with C64 PRG's // description of CHROUT) + +#if CONFIG_CPU_MOS_6502 txa pha tya pha +#else + phx + phy +#endif + php // Determine the device number @@ -46,10 +53,17 @@ chrout_done_fail: plp // Restore X and Y + +#if CONFIG_CPU_MOS_6502 pla tay pla tax +#else + ply + plx +#endif + sec // indicate failure rts @@ -59,10 +73,16 @@ chrout_done_unknown_device: plp // Restore X and Y + +#if CONFIG_CPU_MOS_6502 pla tay pla tax +#else + ply + plx +#endif // End wioth error jmp lvs_device_not_found_error @@ -73,10 +93,17 @@ chrout_done: plp // Restore X and Y + +#if CONFIG_CPU_MOS_6502 pla tay pla tax +#else + ply + plx +#endif + lda SCHAR clc // indicate success rts diff --git a/c64/kernal/screen/chrout_screen.s b/c64/kernal/screen/chrout_screen.s new file mode 100644 index 00000000..9025040e --- /dev/null +++ b/c64/kernal/screen/chrout_screen.s @@ -0,0 +1,108 @@ + +// +// CHROUT routine - screen support (character output) +// + + +chrout_screen: + + sei // XXX why do we need to disable interrupts? + + jsr cursor_hide_if_visible + + lda SCHAR + tax + + // All the PETSCII control codes are within $0x, $1x, $8x, $9x, remaining + // ones are always printable characters; separate away control codes + + and #$60 + bne !+ + jmp chrout_screen_control +!: + txa + + // Literals - first convert PETSCII to screen code + + // Codes $C0-$DF become $40-$5F + cmp #$E0 + bcs !+ + cmp #$C0 + bcc !+ + + and #$7F + jmp output_literal_char // not high char + +!: + // Range $20-$3F is unchanged + cmp #$40 + bcc output_literal_char // not high char + + // Unshifted letters and symbols from $40-$5F + // all end up being -$40 + // (C64 PRG p376) + + // But anything >= $80 needs to be -$40 + // (C64 PRG p380-381) + // And bit 7 should be cleared, only to be + // set by reverse video + sec + sbc #$40 + + // Fix shifted chars by adding $20 again + cmp #$20 + bcc output_literal_char // not high char + cmp #$40 + bcs output_literal_char // not high char + clc + adc #$20 + +output_literal_char: + + // Write normal character on the screen + + pha + + ldy PNTR + ora RVS // Compute's Mapping the 64 p38 + sta (PNT),y + + // Decrement number of chars waiting to be inserted + lda INSRT + beq !+ + dec INSRT +!: + pla + cmp #$22 + bne not_quote + + // Toggle quote flag if required + lda QTSW + eor #$80 + sta QTSW + +not_quote: + + // Set colour + lda COLOR + sta (USER),y + + // Advance the column, and scroll screen down if we need + // to insert a 2nd line in this logical line. + // (eg Compute's Mapping the 64 p41) + ldx TBLX + iny + sty PNTR + cpy #40 + bne !+ + jsr screen_grow_logical_line + ldy PNTR +!: + cpy #80 + bcc no_screen_advance_to_next_line + lda #0 + sta PNTR + jmp screen_advance_to_next_line + +no_screen_advance_to_next_line: + jmp chrout_done diff --git a/c64/kernal/screen/chrout_screen_control.s b/c64/kernal/screen/chrout_screen_control.s index 11bb2608..6b300daa 100644 --- a/c64/kernal/screen/chrout_screen_control.s +++ b/c64/kernal/screen/chrout_screen_control.s @@ -49,7 +49,7 @@ chrout_try_CRSR_UP: sec sbc #40 sta PNTR - jsr calculate_screen_line_pointer + jsr screen_calculate_line_pointer jmp chrout_done !: chrout_try_CRSR_DOWN: @@ -65,8 +65,8 @@ chrout_try_CRSR_DOWN: // now will break things. The pointer update is required // so that we can tell if we really are on the bottom phys // screen line or not - jsr scroll_up_if_on_last_line - jsr calculate_screen_line_pointer + jsr screen_scroll_up_if_on_last_line + jsr screen_calculate_line_pointer jmp chrout_done !: chrout_try_CRSR_LEFT: @@ -86,7 +86,7 @@ chrout_try_CRSR_RIGHT: bne !+ inc PNTR - jsr calculate_screen_line_pointer + jsr screen_calculate_line_pointer jmp chrout_done !: chrout_try_RVS_ON: @@ -202,5 +202,5 @@ chrout_screen_control_done: // unknown, LF, or no more actions required // XXX chrout_screen_control_calcptr_done: // XXX to !csc_calcptr_done - jsr calculate_screen_line_pointer + jsr screen_calculate_line_pointer jmp chrout_done diff --git a/c64/kernal/screen/chrout_screen_del.s b/c64/kernal/screen/chrout_screen_del.s index 7ef44b8b..e1362ea3 100644 --- a/c64/kernal/screen/chrout_screen_del.s +++ b/c64/kernal/screen/chrout_screen_del.s @@ -24,7 +24,7 @@ chrout_screen_del_column_0: // previous line, without actually deleting anything dec TBLX - jsr get_current_line_logical_length + jsr screen_get_current_line_logical_length lda LNMX sta PNTR @@ -33,7 +33,7 @@ chrout_screen_del_column_0: chrout_screen_del_column_non_0: // Copy rest of line down - jsr get_current_line_logical_length + jsr screen_get_current_line_logical_length ldy PNTR cpy LNMX beq !++ @@ -52,7 +52,7 @@ chrout_screen_del_column_non_0: bne !- // Clear char at end of line - jsr get_current_line_logical_length + jsr screen_get_current_line_logical_length tay lda #$20 sta (PNT),y diff --git a/c64/kernal/screen/chrout_screen_ins.s b/c64/kernal/screen/chrout_screen_ins.s index a56b6a80..04899d13 100644 --- a/c64/kernal/screen/chrout_screen_ins.s +++ b/c64/kernal/screen/chrout_screen_ins.s @@ -8,7 +8,7 @@ chrout_screen_ins: // Insert (shift-DELETE) // Abort if line already max length, ie 79th char is not a space - jsr get_current_line_logical_length + jsr screen_get_current_line_logical_length cmp #79 bne !+ tay @@ -30,7 +30,7 @@ chrout_screen_ins: !: // Shuffle chars towards end of line - jsr get_current_line_logical_length + jsr screen_get_current_line_logical_length tay !: // Note: While the following routine is obvious to any skilled diff --git a/c64/kernal/screen/cursor.s b/c64/kernal/screen/cursor.s index 59cae342..69364edd 100644 --- a/c64/kernal/screen/cursor.s +++ b/c64/kernal/screen/cursor.s @@ -28,7 +28,7 @@ cursor_blink: // FALLTROUGH cursor_draw: - jsr calculate_screen_line_pointer // XXX make sure this is not needed and remove the call + jsr screen_calculate_line_pointer // XXX make sure this is not needed and remove the call ldy PNTR lda (PNT),y diff --git a/c64/kernal/screen/cursor_home.s b/c64/kernal/screen/cursor_home.s index 42718ce1..7d8549a6 100644 --- a/c64/kernal/screen/cursor_home.s +++ b/c64/kernal/screen/cursor_home.s @@ -9,4 +9,4 @@ cursor_home: sta PNTR // x position sta TBLX // y position - jmp set_pointer_to_current_screen_line + jmp screen_set_pointer_to_current_line diff --git a/c64/kernal/screen/screen_advance_to_next_line.s b/c64/kernal/screen/screen_advance_to_next_line.s new file mode 100644 index 00000000..7aff572d --- /dev/null +++ b/c64/kernal/screen/screen_advance_to_next_line.s @@ -0,0 +1,47 @@ + +screen_advance_to_next_line: + + // jsr cursor_hide_if_visible + + // Go to start of line + lda #0 + sta PNTR + // Advance line number + ldy TBLX + + // Do quick fix to line pointer to work out if it is off + // the bottom of the screen. + ldx #40 + lda LDTBL,y + bmi !+ + .byte $2c +!: ldx #80 + txa + clc + adc PNT+0 + sta PNT+0 + lda PNT+1 + adc #0 + sta PNT+1 + + inc TBLX + + // Check if it will trigger scrolling + // Work out if we have gone off the bottom of the screen? + // 1040 > 1024, so if high byte of screen pointer is >= (HIBASE+4), + // then we are off the bottom of the screen + lda PNT+1 + sec + sbc HIBASE + cmp #3 + bcc !+ + lda PNT+0 + cmp #$e7 + bcc !+ + + // Off the bottom of the screen + jsr scroll_screen_up +!: + + jsr screen_calculate_line_pointer + jmp chrout_done diff --git a/c64/kernal/screen/screen_calculate_line_pointer.s b/c64/kernal/screen/screen_calculate_line_pointer.s index de1aa1d3..d982a38d 100644 --- a/c64/kernal/screen/screen_calculate_line_pointer.s +++ b/c64/kernal/screen/screen_calculate_line_pointer.s @@ -1,5 +1,5 @@ -calculate_screen_line_pointer: // XXX rename to screen_calculate_line_pointer +screen_calculate_line_pointer: jsr screen_normalize_xy // Reset pointer to start of screen @@ -21,9 +21,9 @@ calculate_screen_line_pointer: // XXX rename to screen_calculate_line_pointer // -1 offset is because we count down from N to 1, not // N-1 to 0. lda LDTBL-1,x - bpl cslp_l1 + bpl sclp_l1 ldy #80 -cslp_l1: +sclp_l1: // Add computed line length to pointer value tya clc diff --git a/c64/kernal/screen/screen_get_current_line_logical_length.s b/c64/kernal/screen/screen_get_current_line_logical_length.s new file mode 100644 index 00000000..9d8aafc1 --- /dev/null +++ b/c64/kernal/screen/screen_get_current_line_logical_length.s @@ -0,0 +1,11 @@ + +screen_get_current_line_logical_length: + ldy TBLX + lda LDTBL,y + bpl !+ + lda #79 + .byte $2c // BIT absolute mode, which we use to skip the next two instruction bytes +!: + lda #39 + sta LNMX + rts \ No newline at end of file diff --git a/c64/kernal/screen/screen_grow_logical_line.s b/c64/kernal/screen/screen_grow_logical_line.s index 26bd5ac9..d2995b3c 100644 --- a/c64/kernal/screen/screen_grow_logical_line.s +++ b/c64/kernal/screen/screen_grow_logical_line.s @@ -12,7 +12,7 @@ screen_grow_logical_line: // Now make space for the extra line added. // If we are on the last physical line of the screen, // Then we need to scroll the screen up - jsr scroll_up_if_on_last_line + jsr screen_scroll_up_if_on_last_line // Scroll screen down to make space // As we are scrolling down, we start from the end, @@ -106,7 +106,7 @@ cl_inner: bne copy_line_down_loop no_copy_down: - jsr calculate_screen_line_pointer + jsr screen_calculate_line_pointer // Erase newly inserted line ldy #79 diff --git a/c64/kernal/screen/screen_scroll_up_if_on_last_line.s b/c64/kernal/screen/screen_scroll_up_if_on_last_line.s new file mode 100644 index 00000000..8f8281b9 --- /dev/null +++ b/c64/kernal/screen/screen_scroll_up_if_on_last_line.s @@ -0,0 +1,115 @@ + +not_last_line: + rts + +screen_scroll_up_if_on_last_line: + + // Colour RAM is always in fixed place, so is easiest + // to use to check if we are on the last line. + // The last line is at $D800 + 24*40 = $DBC0 + lda USER+1 + cmp #>$DBC0 + bne not_last_line + + lda USER+0 + cmp #<$DBC0 + beq is_last_line + + jsr screen_get_current_line_logical_length + clc + adc USER+0 + cmp #<$DBE7-1 + bcc not_last_line + +is_last_line: + + dec TBLX + + // FALLTHROUGH + +scroll_screen_up: + // Now scroll the whole screen up either one or two lines + // based on whether the first screen line is linked or not. + + // Get pointers to start of screen + colour RAM + lda HIBASE + sta PNT+1 + sta SAL+1 + lda #>$D800 + sta USER+1 + sta EAL+1 + lda #$00 + sta PNT+0 + sta USER+0 + + // Get pointers to screen/colour RAM source + lda LDTBL+0 + bmi !+ + lda #40 + .byte $2C // BIT $nnnn to skip next instruction +!: + lda #80 + sta SAL+0 + sta EAL+0 + + // Copy first three pages + ldy #$00 + ldx #3 +scroll_copy_loop: + lda (EAL),y + sta (USER),y + lda (SAL),y + sta (PNT),y + + iny + bne scroll_copy_loop + + inc SAL+1 + inc PNT+1 + inc EAL+1 + inc USER+1 + dex + bne scroll_copy_loop + + // Copy last partial page + // We need to copy 1000-(3*256)-line length + // = 232 - line length + lda SAL+0 + lda #232 + sec + sbc SAL+0 + tax +scroll_copy_loop2: + lda (EAL),y + sta (USER),y + lda (SAL),y + sta (PNT),y + iny + dex + bne scroll_copy_loop2 + + // Fill in scrolled up area + ldx SAL+0 +scroll_copy_loop3: + lda COLOR + sta (USER),y + lda #$20 + sta (PNT),y + iny + dex + bne scroll_copy_loop3 + + // Shift line linkage list + ldy #0 + ldx #24 +link_copy: + lda LDTBL+1,y + sta LDTBL+0,y + iny + dex + bne link_copy + // Clear line link flag of last line + stx LDTBL+24 + + // Restore correct line pointers + jmp screen_calculate_line_pointer diff --git a/c64/kernal/set_pointer_to_current_screen_line.s b/c64/kernal/screen/screen_set_pointer_to_current_line.s similarity index 85% rename from c64/kernal/set_pointer_to_current_screen_line.s rename to c64/kernal/screen/screen_set_pointer_to_current_line.s index a6edef4c..e6beecfc 100644 --- a/c64/kernal/set_pointer_to_current_screen_line.s +++ b/c64/kernal/screen/screen_set_pointer_to_current_line.s @@ -2,7 +2,8 @@ // into the pointer at $D1 (PNT). // It must take into account the screen line link table // (Compute's Mapping the 64 p216) -set_pointer_to_current_screen_line: + +screen_set_pointer_to_current_line: // Get pointer to start of the screen lda HIBASE sta PNT+1 @@ -12,15 +13,15 @@ set_pointer_to_current_screen_line: // Now advance for the number of lines ldx TBLX -sptcsl_l2: +sptcl_l2: // XXX - Should we read the columns per line from // somewhere? ldy #<40 // Double line length if line is linked lda LDTBL,x - bpl sptcsl_l1 + bpl sptcl_l1 ldy #<80 -sptcsl_l1: +sptcl_l1: tya clc adc PNT+0 @@ -29,6 +30,6 @@ sptcsl_l1: sta PNT+1 dex - bpl sptcsl_l2 + bpl sptcl_l2 rts