Files
open-roms/c64/kernal/iec_tx_byte.s
T

88 lines
1.8 KiB
ArmAsm

iec_tx_byte:
pha
jsr iec_assert_clk_release_data
;; Give devices time to respond
jsr wait1ms
;; Did a device respond? (DATA will be pulled if so)
lda $DD00
bpl +
;; No devices present, so we can immediately return with device not found
pla
jmp kernalerror_DEVICE_NOT_FOUND
*
;; Release CLK and wait for DATA to release.
jsr iec_release_clk_and_data
;; Wait for DATA to be released
;; Listener is allowed to hold DATA for as long as they want.
;; i.e., this is the part of the protocol where the listener indicates
;; that they are busy doing something, like processing the previous
;; character.
jsr iec_wait_for_data_release
;; We then wait for 60 usec (less than 200usec so we don't
;; signal EOI), before asserting CLK again.
jsr iec_wait60us
;; Do the actual transmission of 8 bits of data
ldx #7
pla
iec_tx_byte_nextbit:
;; Is next bit 0 or 1?
lsr
pha
bcs +
;; Setup 0
jsr iec_assert_clk_and_data
jmp iec_tx_byte_l1
*
;; Setup 1
jsr iec_assert_clk_release_data
iec_tx_byte_l1:
;; Clock bit out
jsr iec_wait20us
jsr iec_release_clk
jsr iec_wait20us
;; More bits to send?
pla
dex
bpl iec_tx_byte_nextbit
;; Done sending bits. Assert CLK and wait for acknowledgement
jsr iec_assert_clk_release_data
;; Acknowledgement must happen within 1ms, else it
;; is DEVICE NOT PRESENT
;; Acknowledgement consists of the DATA line being pulled
;; by the listener.
;; We can't easily count rasters here, so we just
;; try a set number of times
ldx #$ff
* lda $DD00
;; BPL here is checking that bit 7 of $DD00 clears,
;; i.e, that the DATA line is asserted.
bpl +
dex
bne -
;; Timeout - DEVICE NOT PRESENT
jmp kernalerror_DEVICE_NOT_FOUND
*
;; All done.
;; End state is TALKER is asserting CLK, and listener is asserting DATA
;; until they are ready for the next byte.
clc
rts