W skrócie - robię własnego kernala (wyprzedzając szydercze pytania, odpowiedź: bo tak mi się podoba i bo mogę), korzystam ze źródeł z tej strony:
http://spiro.trikaliotis.net/cbmrom. Ponieważ chcę tam dodać parę rzeczy, wywaliłem całą część basicową, zaprogramowałem własny, dużo mniejszy, edytor ekranowy i CHROUT (z obsługą UTF8, wyprzedzając szydercze pytania, odpowiedź: bo tak mi się podoba i bo mogę).
Próbowałem teraz zrzucić katalog dyskietki posługując się odpowiednim kodem z sjLOAD, jednak LISTEN wpada w nieskończoną pętlę, sprawdzając, czy zmianie ulega $DD00, konkretnie tu:
@LED5A:
jsr IecGetDataClockIn
bcc @LED5A
IecGetDataClockIn:
lda IEC_REG_DATA_CLK_IN
cmp IEC_REG_DATA_CLK_IN
bne IecGetDataClockIn
asl a
rts
Ponieważ nie mam pojęcia, jak działa komunikacja ze stacją, nie bardzo wiem co tak naprawdę powinno się tu dziać. Czy ktoś ŻYCZLIWY i NIEZBYT PRZEMĄDRZAŁY jest w stanie pomóc? Może po objawie okaże się, że np. Gdzieś nie zainicjalizowałem czegoś w CIA? Dla przypomnienia część LISTEN z feralnym momentem, do którego dochodzi:
iLISTEN:
ora #IEEE_LISTEN ; create primary address for TALK
jsr LF0A4 ; TODO (assumed: Wait for RS232 transmission to stop)
IecOutputCommand:
pha ; remember byte to be output
bit zC3PO ; test: Is there already some character in the output buffer?
bpl @BufferByte ; no -> branch, do not output but put the byte into the buffer instead
; there is some byte in the output buffer.
; output it on the IEC bus.
sec
ror zTSFCNT ; set zTSFCNT.7, thus: Signal an EOI on output
jsr IecOutputByte ; output a byte on IEC bus
; IecOutputByte returns with C == 0
lsr zC3PO ; unset zC3PO.7, thus:
; mark: There is no byte in the buffer
lsr zTSFCNT ; unset zTSFCNT.7. Subsequent bytes will not be signalled with EOI
@BufferByte:
; here, zC3PO.7 is unset.
; Either we jumped here because of the bpl, or it was specifically unset two lines above
; Thus, the buffer is already marked as empty
pla ; get back the byte to be output
sta zBSOUR ; and store it into the output buffer
sei ; make sure the interrupt does not disturb our timing
; it is not completely clear if this command is missing
; on the VIC20, or if it is not critical there, as the VIC20
; does not have badlines, which might help the timing here.
; TODO: document
jsr IecDataClear
cmp #IEEE_UNLISTEN
bne @NotUNLISTEN
jsr IecClkClear
@NotUNLISTEN:
; set ATN state
lda IEC_REG_ATN_OUT
ora #IEC_B_ATN_OUT
sta IEC_REG_ATN_OUT
IecOutputByte2:
sei ; make sure the interrupt does not disturb our timing
; it is not completely clear if this command is missing
; on the VIC20, or if it is not critical there, as the VIC20
; does not have badlines, which might help the timing here.
jsr IecClkSet
jsr IecDataClear
jsr IecDelay1ms
IecOutputByte:
sei ; make sure the interrupt does not disturb our timing
jsr IecGetDataClockIn
bcs DeviceNotPresent
jsr IecClkClear
bit zTSFCNT
bpl @LED5A
@WaitDataInactive:
jsr IecGetDataClockIn
bcc @WaitDataInactive
@WaitDataActive:
jsr IecGetDataClockIn
bcs @WaitDataActive
; tu sie zapetla...
@LED5A:
jsr IecGetDataClockIn