iec_tx_byte and iec_tx_command released CLK and only then disabled IRQs. An IRQ in between took about 500 cycles, longer than a listener's EOI wait and acknowledgement, so the talker waited for an acknowledgement that had come and gone, and a LOAD over the bus hung after its file name. Which byte an IRQ hit depended on where the build placed the code.
51 lines
1.4 KiB
ArmAsm
51 lines
1.4 KiB
ArmAsm
;; #LAYOUT# STD * #TAKE
|
|
;; #LAYOUT# * KERNAL_0 #TAKE
|
|
;; #LAYOUT# * * #IGNORE
|
|
|
|
; Implemented based on https://www.pagetable.com/?p=1135, https://github.com/mist64/cbmbus_doc
|
|
|
|
; Expects byte to send in TBTCNT ($A4 is a byte buffer according to http://sta.c64.org/cbm64mem.html)
|
|
; Carry flag set = signal EOI
|
|
;
|
|
; Preserves .X and .Y registers
|
|
|
|
|
|
!ifdef CONFIG_IEC {
|
|
|
|
|
|
iec_tx_command:
|
|
|
|
; Store .X and .Y on the stack - preserve them
|
|
+phx_trash_a
|
|
+phy_trash_a
|
|
|
|
; Notify all devices that we are going to send a byte
|
|
; and it is going to be a command (pulled ATN)
|
|
jsr iec_pull_atn_clk_release_data
|
|
|
|
; Give devices time to respond (response is mandatory!) by pulling DATA
|
|
jsr iec_wait1ms
|
|
lda CIA2_PRA ; pulled DATA = highest bit 0 = 'plus'
|
|
+bmi iec_return_DEVICE_NOT_FOUND
|
|
|
|
; At least one device responded, but they are still allowed to stall
|
|
; (can be busy processing something), we have to wait till they are all
|
|
; ready (or bored with DOS attack...)
|
|
; Release back CLK, keep DATA released - to ask devices for status.
|
|
; From here on IRQs are disabled, as in iec_tx_byte: a listener takes a
|
|
; talker that waits too long after the release for EOI
|
|
|
|
sei
|
|
jsr iec_release_clk_data
|
|
|
|
; Common part of iec_txbyte and iec_tx_common - waits for devices
|
|
; and transmits a byte
|
|
|
|
!ifdef CONFIG_MB_M65 {
|
|
; Ensure 1 Mhz mode and disabled badlines
|
|
jsr m65_speed_iec
|
|
}
|
|
clc ; Carry flag set is used for EOI mark
|
|
jmp iec_tx_common
|
|
}
|