diff --git a/c64/kernal/iec_tx_byte.s b/c64/kernal/iec_tx_byte.s index c422f270..d7e2e183 100644 --- a/c64/kernal/iec_tx_byte.s +++ b/c64/kernal/iec_tx_byte.s @@ -1,9 +1,12 @@ ;; Implemented based on https://www.pagetable.com/?p=1135, https://github.com/mist64/cbmbus_doc +;; Carry flag set = signal EOI + iec_tx_byte: pha + php ;; Notify all devices that we are going to send a byte ;; and it is going to be a data byte (released ATN) @@ -12,6 +15,7 @@ iec_tx_byte: ;; Common part of iec_txbyte and iec_tx_common - waits for devices ;; and transmits a byte + plp pla jsr iec_tx_common diff --git a/c64/kernal/iec_tx_command.s b/c64/kernal/iec_tx_command.s index 526ae80a..f68764e5 100644 --- a/c64/kernal/iec_tx_command.s +++ b/c64/kernal/iec_tx_command.s @@ -36,6 +36,7 @@ iec_tx_command: ;; Common part of iec_txbyte and iec_tx_common - waits for devices ;; and transmits a byte + clc ; Carry flag set is used for EOI mark pla jsr iec_tx_common diff --git a/c64/kernal/iec_tx_common.s b/c64/kernal/iec_tx_common.s index a9652d6b..eb1ba991 100644 --- a/c64/kernal/iec_tx_common.s +++ b/c64/kernal/iec_tx_common.s @@ -5,19 +5,38 @@ iec_tx_common: - ;; Store the bye to send on a stack + ;; Store the byte to send on a stack pha + ;; Store the status register - carry flag is used to determine whether + ;; this is the last byte of the stream + php + ;; Wait till all receivers are ready, they should all release DATA jsr iec_wait_for_data_release + ;; At this point a delay 256 usec or more is considered EOI - add waits if necessary + plp + bcc + + jsr iec_wait100us + jsr iec_wait100us + jsr iec_wait60us + + ;; XXX waits above should be enough - why do we need more waits??? + jsr iec_wait100us + jsr iec_wait100us + jsr iec_wait100us + + ;; Receiver should now acknowledge EOI by pulling data for at least 60 usec + jsr iec_wait60us + jsr iec_wait_for_data_release +* ;; Pull CLK back to indicate that DATA is not valid, keep it for 60us ;; We can use this routine as we don't hold DATA anyway (and its state doesn't even matter) - ;; Don't wait too long, as 200us or more is considered EOI jsr iec_pull_clk_release_data jsr iec_wait60us - + ;; Now, we can start transmission of 8 bits of data ldx #7 pla @@ -39,7 +58,7 @@ iec_tx_common_bit_is_sent: ;; Wait 20us, so that device(s) can pick DATA jsr iec_wait20us - + ;; Pull CLK for 20us again, before sending the next bit ;; or performing any other action jsr iec_pull_clk_release_data diff --git a/c64/kernal/iec_tx_eoi.s b/c64/kernal/iec_tx_eoi.s deleted file mode 100644 index 5cae87f2..00000000 --- a/c64/kernal/iec_tx_eoi.s +++ /dev/null @@ -1,15 +0,0 @@ - -iec_tx_eoi: - - ;; Releasing ATN needed due to current iec_tx_command implementation - jsr iec_release_atn - - ;; Wait at least 256 usec - jsr iec_wait100us - jsr iec_wait100us - jsr iec_wait60us - - ;; Restore the bus to idle state - jsr iec_set_idle - - rts diff --git a/c64/kernal/iec_wait100us.s b/c64/kernal/iec_wait100us.s index 7ccfee98..b3101685 100644 --- a/c64/kernal/iec_wait100us.s +++ b/c64/kernal/iec_wait100us.s @@ -8,9 +8,6 @@ iec_wait100us: ;; NTSC: ;; - CPU frequency 1.022727 MHZ, we need to waste at least 103 cycles - ;; Waste cycles by reading some unimportant memory location - ;; (in a loop) in order not to clutter VICE debug logs - ;; Waste cycles in a loop ldy #$12 ; 2 cycles diff --git a/c64/kernal/load.s b/c64/kernal/load.s index edf2c453..b7d68db9 100644 --- a/c64/kernal/load.s +++ b/c64/kernal/load.s @@ -76,21 +76,28 @@ send_filename: ldx #