From c32fbadc7c8823669b00a4abfe42255751f47ac1 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Thu, 31 Oct 2019 22:42:44 +0100 Subject: [PATCH] more work on tape support --- c64/kernal/assets/kernal_messages.s | 13 +++++ c64/kernal/init/fda3.ioinit.s | 5 +- c64/kernal/iostack/lvs_helpers.s | 11 ++++ c64/kernal/screen/screen_blank.s | 28 ++++++++++ c64/kernal/tape/load_tape_turbo.s | 42 ++------------ c64/kernal/tape/tape_common.s | 86 +++++++++++++++++++++++++++++ 6 files changed, 147 insertions(+), 38 deletions(-) create mode 100644 c64/kernal/screen/screen_blank.s create mode 100644 c64/kernal/tape/tape_common.s diff --git a/c64/kernal/assets/kernal_messages.s b/c64/kernal/assets/kernal_messages.s index 91d2ab11..642ee2bd 100644 --- a/c64/kernal/assets/kernal_messages.s +++ b/c64/kernal/assets/kernal_messages.s @@ -15,6 +15,10 @@ .label __MSG_KERNAL_FROM_HEX = __msg_kernalfrom_hex - __msg_kernal_first .label __MSG_KERNAL_TO_HEX = __msg_kernalto_hex - __msg_kernal_first +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO +.label __MSG_KERNAL_PRESS_PLAY = __msg_kernalplay - __msg_kernal_first +#endif + #if CONFIG_SHOW_PAL_NTSC .label __MSG_KERNAL_PAL = __msg_kernalpal - __msg_kernal_first .label __MSG_KERNAL_NTSC = __msg_kernalntsc - __msg_kernal_first @@ -59,6 +63,15 @@ __msg_kernalto_hex: .text " TO " .byte $80 + $24 // end of string mark + '$' +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + +__msg_kernalplay: + .byte $0D + .text "PRESS PLAY ON TAPE" + .byte $80 + $0D // end of string mark + return + +#endif + #if CONFIG_SHOW_PAL_NTSC __msg_kernalpal: diff --git a/c64/kernal/init/fda3.ioinit.s b/c64/kernal/init/fda3.ioinit.s index 594c9d07..23687e37 100644 --- a/c64/kernal/init/fda3.ioinit.s +++ b/c64/kernal/init/fda3.ioinit.s @@ -16,10 +16,11 @@ IOINIT: // (https://www.c64-wiki.com/wiki/Zeropage) // Work around for VICE bug: Writing $00 before $01 results in rubbish in $01 // after. https://sourceforge.net/p/vice-emu/bugs/1057/ + lda #$27 - ldx #$2F + ldx #$EF sta CPU_R6510 - stx CPU_D6510 + stx CPU_D6510 // [CM64] page 4 // Silence the SID chips, depending on the configuration diff --git a/c64/kernal/iostack/lvs_helpers.s b/c64/kernal/iostack/lvs_helpers.s index 58cf3d16..9298b6e3 100644 --- a/c64/kernal/iostack/lvs_helpers.s +++ b/c64/kernal/iostack/lvs_helpers.s @@ -91,7 +91,9 @@ lvs_advance_pointer: clc rts + lvs_display_searching_for: + lda MSGFLG bpl lvs_display_end @@ -117,7 +119,9 @@ lvs_display_searching_for: lvs_display_end: rts + lvs_display_loading_verifying: + // Display LOADING / VERIFYING and start address lda MSGFLG bpl lvs_display_end @@ -132,6 +136,7 @@ lvs_display_loading_verifying: // FALLTHROUGH lvs_display_start_addr: + ldx #__MSG_KERNAL_FROM_HEX !: jsr print_kernal_message @@ -142,6 +147,7 @@ lvs_display_start_addr: jmp print_hex_byte lvs_display_done: + // Display end address lda MSGFLG bpl lvs_display_end @@ -150,14 +156,18 @@ lvs_display_done: jmp !- lvs_wrap_around_error: + // This error is probably not even detected by C64 Kernal; // report BASIC error code that looks the most sane lda #B_ERR_OVERFLOW + lvs_error_end: + sec rts lvs_return_last_address: + // Return last address - Compute's Mapping the 64 says without the '+1', // checked (short test program) on original ROMs that this is really the case ldx STAL+0 @@ -165,6 +175,7 @@ lvs_return_last_address: // FALLTHROUGH lvs_success_end: + clc rts diff --git a/c64/kernal/screen/screen_blank.s b/c64/kernal/screen/screen_blank.s new file mode 100644 index 00000000..a0c89883 --- /dev/null +++ b/c64/kernal/screen/screen_blank.s @@ -0,0 +1,28 @@ + +// +// Helper routines to blank/show screen +// + + +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + + +screen_blank: + + lda VIC_SCROLY + and #($FF - $10) + sta VIC_SCROLY + + rts + + +screen_show: + + lda VIC_SCROLY + ora #$10 + sta VIC_SCROLY + + rts + + +#endif diff --git a/c64/kernal/tape/load_tape_turbo.s b/c64/kernal/tape/load_tape_turbo.s index 89463a45..1e9fe9b9 100644 --- a/c64/kernal/tape/load_tape_turbo.s +++ b/c64/kernal/tape/load_tape_turbo.s @@ -10,53 +10,23 @@ #if CONFIG_TAPE_TURBO - - -tape_ask_play: - - sei // timing is critical for tape loading - - lda #$1D - sta CPU_R6510 // motor on XXX make it more system friendly - - ror VIC_SCROLY // screen blanked to VIC_EXTCOL color XXX make it more system friendly - - // XXX finish the implementation - - rts - -tape_load_success: - - rol VIC_SCROLY // screen back on - lda #$37 // default setting - sta CPU_R6510 - - // XXX finish this routine - - rts - -tape_load_error: - - // XXX finish this routine - - rts - - load_tape_turbo: - // XXX if VERIFY asked - error + jsr tape_ditch_verify // only LOAD is supported, no VERIFY ldy #$00 sty PRTY // initial checksum value - jsr tape_ask_play - - sty CIA2_TIMAHI // .Y still 0 + sty CIA2_TIMAHI lda #$FE // timer threshold for TurboTape sta CIA2_TIMALO + jsr tape_ask_play + // Read file header + ldy #$00 + jsr tape_turbo_sync // .X gets set to 0 stx STAL+0 // instead of a later lda, sta diff --git a/c64/kernal/tape/tape_common.s b/c64/kernal/tape/tape_common.s new file mode 100644 index 00000000..935915aa --- /dev/null +++ b/c64/kernal/tape/tape_common.s @@ -0,0 +1,86 @@ + +// +// Common routines for tape support +// + + +#if CONFIG_TAPE_NORMAL || CONFIG_TAPE_TURBO + + +tape_ditch_verify: + + lda VERCKK + bne !+ + rts +!: + pla + pla + jmp lvs_device_not_found_error + + +tape_motor_off: + + lda CPU_R6510 + ora #$20 + sta CPU_R6510 + + rts + + +tape_motor_on: + + lda CPU_R6510 + and #($FF - $20) + sta CPU_R6510 + + rts + + +tape_ask_play: + + sei // timing is critical for tape loading + + jsr tape_motor_off + + ldx #__MSG_KERNAL_PRESS_PLAY + jsr print_kernal_message + +tape_wait_button_loop: + + jsr udtim_keyboard + jsr STOP + bcc !+ + + // Stop key pressed + pla + pla + cli + jmp kernalerror_ROUTINE_TERMINATED +!: + lda CPU_R6510 + and #$10 // check for pressed button + bne tape_wait_button_loop + + jsr screen_blank + jsr tape_motor_on + + rts + + +tape_load_success: + + jsr screen_show + jsr tape_motor_off + + jmp lvs_success_end + + +tape_load_error: + + jsr screen_show + jsr tape_motor_off + + jmp lvs_load_verify_error + + +#endif