more work towards IEC bus support: Work on LOAD routine and the necessary IEC functions for it.

This commit is contained in:
Paul Gardner-Stephen committed 2019-05-03 21:30:32 +09:30
1 parent 148a285633
commit e5cdf77d50
4 files changed
+108 -3

No files matched your search

+2 -2
View File
@@ -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
+5
View File
@@ -0,0 +1,5 @@
iec_release_atn:
lda $dd00
and #$f7
sta $dd0
rts
+17
View File
@@ -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
+84 -1
View File
@@ -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