Files
open-roms/c64/kernal/iec_fast/dolphindos_load.s
T

123 lines
2.1 KiB
ArmAsm

// #LAYOUT# STD * #TAKE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// DolphinDOS protocol support for IEC - optimized load loop
//
#if CONFIG_IEC_DOLPHINDOS && !CONFIG_MEMORY_MODEL_60K
dolphindos_load:
// Timing is critical for some parts, do not allow interrupts
sei
// A trick to shorten EAL update time
ldy #$00
#if CONFIG_IEC_DOLPHINDOS_FAST
// Another trick: prepare values for quickly setting/releasing DATA
lda CIA2_PRA
and #$FF - BIT_CIA2_PRA_DAT_OUT - BIT_CIA2_PRA_CLK_OUT - BIT_CIA2_PRA_ATN_OUT
sta IECPROTO // release DATA
ora #BIT_CIA2_PRA_DAT_OUT
sta TBTCNT // pull DATA
#endif
// FALLTROUGH
dolphindos_load_loop:
#if !CONFIG_IEC_DOLPHINDOS_FAST
// Check if this was EOI
bit IOSTATUS
bvs dolphindos_load_end
#endif
// Wait for the talker to release the CLK line
!:
bit CIA2_PRA
bvc !-
// Release the DATA to signal we are ready
#if !CONFIG_IEC_DOLPHINDOS_FAST
lda CIA2_PRA
and #$FF - BIT_CIA2_PRA_DAT_OUT // release
#else
lda IECPROTO
#endif
sta CIA2_PRA
#if !CONFIG_IEC_DOLPHINDOS_FAST
// Check if EOI
jsr iec_rx_check_eoi // can damage .X, but this is safe
#else
// Check if EOI - inlined code to avoid wasting cycles on RTS
ldx #$13
!:
bit CIA2_PRA
bvc dolphindos_load_no_eoi
dex
bne !-
// EOI - mark it and retrieve the last byte
jsr iec_rx_check_eoi_confirm
lda CIA2_PRB
sta (EAL),y
// Update EAL for the last time
sec
jsr iec_update_EAL_by_Y
// Restore proper IECPROTO value
lda #$02
sta IECPROTO
// End of load loop
jmp load_iec_loop_end
dolphindos_load_no_eoi:
#endif
// Retrieve and store byte
lda CIA2_PRB
sta (EAL),y
// Pull DATA to acknowledge
#if !CONFIG_IEC_DOLPHINDOS_FAST
lda CIA2_PRA
ora #BIT_CIA2_PRA_DAT_OUT
#else
lda TBTCNT
#endif
sta CIA2_PRA
// Handle EAL
iny
bne dolphindos_load_loop
inc EAL+1
jmp dolphindos_load_loop
#if !CONFIG_IEC_DOLPHINDOS_FAST
dolphindos_load_end:
// Update EAL
clc
jsr iec_update_EAL_by_Y
// End of load loop
jmp load_iec_loop_end
#endif
#endif // CONFIG_IEC_DOLPHINDOS and not CONFIG_MEMORY_MODEL_60K