From b182a53dfae595e4ce774111a24275cb3c9ed16a Mon Sep 17 00:00:00 2001 From: frankmilliron <34376619+frankmilliron@users.noreply.github.com> Date: Mon, 17 Jul 2023 08:11:30 -0700 Subject: [PATCH] The Cricket!: fix hang on Total Replay (#19) * The Cricket!: fix hang on Total Replay The Cricket reset command sends Total Replay into an endless loop when launched, presumably because of an interrupt situation (TR just does RTI on an interrupt). Toggling the COMMAND and CONTROL settings seems to allow TR to function properly, while also allowing the Cricket initialization code to silence any playing notes. * The Cricket!: Reset Cricket before probing Finds the Cricket every single time this way. Occasionally the driver would miss finding it due to it being in a wait state. Sending a reset first fixes that. * The Cricket!: make sure registers are toggled for TR --- clocks/cricket/cricket.system.s | 52 +++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 15 deletions(-) diff --git a/clocks/cricket/cricket.system.s b/clocks/cricket/cricket.system.s index 3bf9ecb..491487d 100644 --- a/clocks/cricket/cricket.system.s +++ b/clocks/cricket/cricket.system.s @@ -77,13 +77,17 @@ ssc_not_found: init_ssc: php sei + lda COMMAND ; save status of SSC registers + sta saved_command + lda CONTROL + sta saved_control - ;; Reset SSC - sta KBDSTRB ; Port 2 DSR line connected to KBDSTRB - lda #0 - sta COMMAND ; hardware reset all Port 2 ACIA registers - sta CONTROL - sta STATUS + ;; Reset the Cricket (stops any playing notes & ensures Cricket is listening) + jsr restore_cmd_ctl ; have to change registers for this to work + jsr reset_cricket + jsr restore_cmd_ctl + jsr reset_cricket ; does it twice in original Cricket driver + jsr restore_cmd_ctl ;; Configure SSC lda #%00001011 ; no parity/echo/interrupts, RTS low, DTR low @@ -91,15 +95,6 @@ init_ssc: lda #%10011110 ; 9600 baud, 8 data bits, 2 stop bits sta CONTROL - ;; Reset Cricket - jsr readbyte ; done on original disk - lda #HI(ASCII_CR) ; two carriage returns - jsr sendbyte - lda #HI(ASCII_CR) - jsr sendbyte - lda #HI('!') ; Reset Cricket (everything but time/date) - jsr sendbyte - ;; Read Cricket ID code: 00 ($00) lda #0 jsr sendbyte @@ -126,10 +121,12 @@ digit: cmp #HI('0') ; < '0' ? bcc :- cricket_found: + jsr restore_cmd_ctl plp jmp install_driver cricket_not_found: + jsr restore_cmd_ctl plp ;; fall through... @@ -145,6 +142,31 @@ not_found: sec ; failure rts + +reset_cricket: + lda #%00001011 ; no parity/echo/interrupts, RTS low, DTR low + sta COMMAND + lda #%10011110 ; 9600 baud, 8 data bits, 2 stop bits + sta CONTROL + + jsr readbyte ; done on original disk + lda #HI(ASCII_CR) ; two carriage returns + jsr sendbyte + lda #HI(ASCII_CR) + jsr sendbyte + lda #HI('!') ; Reset Cricket (everything but time/date) + jsr sendbyte + rts + +restore_cmd_ctl: + lda saved_control + sta CONTROL + lda saved_command + sta COMMAND + rts + +saved_command: .byte 0 +saved_control: .byte 0 .endproc ;; Write byte in A