UNLSN ended through iec_set_idle, which pulls CLK, so the C64 kept holding CLK after UNLISTEN. UNTLK waited for the talker to pull CLK, which no device does after UNTALK, timed out, and left CLK pulled with carry set. And a serial routine that found no device also left CLK pulled. A fastloader that waits for the drive to pull CLK after the KERNAL's UNLSN (Turrican's) then went on too early. The contract (Michael Steil, "Commodore Peripheral Bus: Part 4", https://www.pagetable.com/?p=1135): at the end of a transmission the sender releases CLK and the receivers release DATA, so the bus is idle again, and the controller releases ATN after each command; after UNTALK "the current talker will then release the bus" (Part 2, https://www.pagetable.com/?p=1031). UNLSN and UNTLK now share their end and release CLK and DATA; the device-not-present exit releases ATN, CLK, and DATA. Commodore's ROMs leave the same lines in the same scenarios, as differential tests in arnitech show. Not reported upstream (https://github.com/MEGA65/open-roms).
63 lines
1.6 KiB
ArmAsm
63 lines
1.6 KiB
ArmAsm
;; #LAYOUT# STD * #TAKE
|
|
;; #LAYOUT# * KERNAL_0 #TAKE
|
|
;; #LAYOUT# * * #IGNORE
|
|
|
|
;
|
|
; Official Kernal routine, described in:
|
|
;
|
|
; - [RG64] C64 Programmers Reference Guide - page 304
|
|
; - [CM64] Computes Mapping the Commodore 64 - page 224
|
|
; - https://www.pagetable.com/?p=1031, , https://github.com/mist64/cbmbus_doc
|
|
; - http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf
|
|
;
|
|
; CPU registers that has to be preserved (see [RG64]): .X, .Y
|
|
;
|
|
|
|
|
|
UNTLK:
|
|
|
|
!ifdef CONFIG_MB_M65 {
|
|
|
|
; According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer
|
|
jsr iec_tx_flush
|
|
|
|
jsr m65dos_check
|
|
+bcc m65dos_untlk ; branch if device is handeld by internal DOS
|
|
|
|
} else ifdef CONFIG_IEC {
|
|
|
|
; According to serial-bus.pdf (page 15) this routine flushes the IEC out buffer
|
|
jsr iec_tx_flush
|
|
}
|
|
|
|
|
|
!ifdef CONFIG_IEC {
|
|
|
|
!ifdef CONFIG_IEC_JIFFYDOS_OR_DOLPHINDOS {
|
|
|
|
lda #$FF ; do not use JiffyDOS / DolphinDOS anymore, trigger JiffyDOS detection
|
|
sta IECPROTO
|
|
}
|
|
|
|
; Buffer empty, send the command; the talker releases the bus - see https://www.pagetable.com/?p=1031
|
|
lda #$5F
|
|
jmp common_unlsn_untlk
|
|
|
|
common_untlk_tksa: ; the rest of TKSA
|
|
|
|
; XXX - for TKSA, is it really the right place to do a turnaround? I have some doubts
|
|
; (it forces us to send the TKSA command 'manually' sometimes), but
|
|
; Luigi Di Fraia (https://luigidifraia.wordpress.com/2017/06/27/codebase64-on-the-kernal-behaviour/)
|
|
; claims TKSA Kernal routine actually does the turnaround
|
|
|
|
sta TBTCNT
|
|
jsr iec_tx_command
|
|
+bcc iec_turnaround_to_listen
|
|
|
|
rts
|
|
|
|
} else {
|
|
|
|
jmp kernalerror_ILLEGAL_DEVICE_NUMBER
|
|
}
|