diff --git a/c64/kernal/iec_rx_byte.s b/c64/kernal/iec_rx_byte.s new file mode 100644 index 00000000..5e8b9a0b --- /dev/null +++ b/c64/kernal/iec_rx_byte.s @@ -0,0 +1,27 @@ + ;; Receive a byte from the IEC bus. + ;; reference http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf + ;; page 11. + + +iec_rx_byte: + + ;; First, we wait for the talker to release the CLK line. + jsr iec_wait_for_clock_release + + ;; We then release the data line + + ;; Wait for talker to assert CLK. + ;; If >200usec, then it is EOI and we have to assert the + ;; DATA line for 60 usec to tell the TALKER that we have + ;; acknowledged the EOI. + + + ;; CLK is now low. Latch input bits in on rising edge + ;; of CLK, eight times for eight bits. + + ;; Then we must within 1000usec acknowledge the frame by + ;; asserting DATA. At this point, CLK is asserted by the + ;; talker and DATA by us, i.e., we are ready to receive + ;; the next byte. (p11). + + diff --git a/c64/kernal/iec_wait_for_clock_release.s b/c64/kernal/iec_wait_for_clock_release.s new file mode 100644 index 00000000..c7a4ce1b --- /dev/null +++ b/c64/kernal/iec_wait_for_clock_release.s @@ -0,0 +1,5 @@ +iec_wait_for_clock_release: + LDA $DD00 + and #$80 + beq iec_wait_for_clock_release + rts diff --git a/c64/kernal/load.s b/c64/kernal/load.s index c23de916..d2714f3b 100644 --- a/c64/kernal/load.s +++ b/c64/kernal/load.s @@ -37,30 +37,47 @@ load: jsr iec_tx_byte bcs load_error jsr iec_release_atn + + inc $0608 ;; Now command device to talk (p16) jsr iec_assert_atn lda #$48 jsr iec_tx_byte bcs load_error + + inc $0609 + lda #$60 ; open channel / data (p3) , required according to p13 jsr iec_tx_byte bcs load_error jsr iec_release_atn + inc $060a + ;; We are currently talker, so do the IEC turn around so that we ;; are the listener (p16) jsr iec_turnaround_to_listen bcs load_error + + inc $060b ;; We are now ready to receive bytes - ;; jsr iec_rx_byte - ;; bcs load_done - +* jsr iec_rx_byte + php + ;; Write read data to screen for now + inc $ff + ldx $ff + sta $0400,x + plp + bcs load_done + bcc - load_done: ;; Close file on drive + inc $060c + ;; Command drive to listen and to close the file jsr iec_assert_atn @@ -70,15 +87,22 @@ load_done: jsr iec_tx_byte jsr iec_release_atn + inc $060d + ;; Tell drive to unlisten jsr iec_assert_atn lda #$3f jsr iec_tx_byte jsr iec_release_atn + + inc $060e ;; FALL THROUGH load_error: + + inc $060f + ;; Re-enable interrupts and return cli ;; (iec_tx_byte will have set/cleared C flag and put result code