diff --git a/c64/basic/cmd_unimplemented.s b/c64/basic/cmd_unimplemented.s index 00b93317..6dfa205d 100644 --- a/c64/basic/cmd_unimplemented.s +++ b/c64/basic/cmd_unimplemented.s @@ -84,8 +84,8 @@ cmd_unimplemented: ;; Dummy action while testing IEC support - ;; Try to open an IEC file - jsr $ffc0 + ;; Try to load an IEC file + jsr $ffd5 bcc + ;; A = KERNAL error code, which also almost match diff --git a/c64/kernal/iec_release_atn.s b/c64/kernal/iec_release_atn.s new file mode 100644 index 00000000..b10ac67a --- /dev/null +++ b/c64/kernal/iec_release_atn.s @@ -0,0 +1,5 @@ +iec_release_atn: + lda $dd00 + and #$f7 + sta $dd0 + rts diff --git a/c64/kernal/iec_turnaround_to_listen.s b/c64/kernal/iec_turnaround_to_listen.s new file mode 100644 index 00000000..5b2b5593 --- /dev/null +++ b/c64/kernal/iec_turnaround_to_listen.s @@ -0,0 +1,17 @@ + ;; According to http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf + ;; pages 7--8. + +iec_turnaround_to_listen: + ;; Assert data and release clock + lda $dd00 + and #$ef + ora #$08 + sta $dd00 + + ;; Wait for clock line to be asserted by the drive +* lda $dd00 + and #$10 + beq - + + rts + diff --git a/c64/kernal/load.s b/c64/kernal/load.s index 51542a72..c23de916 100644 --- a/c64/kernal/load.s +++ b/c64/kernal/load.s @@ -1,3 +1,86 @@ -; Function defined on pp272-273 of C64 Programmers Reference Guide + ; Function defined on pp272-273 of C64 Programmers Reference Guide + ;; IEC reference at http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf load: + + ;; Disable IRQs, since timing matters! + SEI + + ;; Begin sending under attention + jsr iec_assert_atn + + ;; XXX - Use default device number + ;; http://www.zimmers.net/anonftp/pub/cbm/programming/serial-bus.pdf + ;; p13, 16. + ;; also p16 tells us this routine doesn't mess with the file table in the C64, + ;; only in the drive. + + ;; Call device to LISTEN (p16) + lda #$28 + jsr iec_tx_byte + bcs load_error + + ;; Open channel #0 (p16) + lda #$f0 + jsr iec_tx_byte + bcs load_error + + ;; (p16) + jsr iec_release_atn + + ;; Send filename (p16) + lda #$24 ; $ = directory + jsr iec_tx_byte + + ;; Command device to unlisten to indicate end of file name. (p16) + jsr iec_assert_atn + lda #$3f + jsr iec_tx_byte + bcs load_error + jsr iec_release_atn + + ;; Now command device to talk (p16) + jsr iec_assert_atn + lda #$48 + jsr iec_tx_byte + bcs load_error + lda #$60 ; open channel / data (p3) , required according to p13 + jsr iec_tx_byte + bcs load_error + jsr iec_release_atn + + ;; 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 + + ;; We are now ready to receive bytes + ;; jsr iec_rx_byte + ;; bcs load_done + + +load_done: + ;; Close file on drive + + + ;; Command drive to listen and to close the file + jsr iec_assert_atn + lda #$28 + jsr iec_tx_byte + lda #$e0 + jsr iec_tx_byte + jsr iec_release_atn + + ;; Tell drive to unlisten + jsr iec_assert_atn + lda #$3f + jsr iec_tx_byte + jsr iec_release_atn + + ;; FALL THROUGH + +load_error: + ;; Re-enable interrupts and return + cli + ;; (iec_tx_byte will have set/cleared C flag and put result code + ;; in A if it was an error). rts