183 lines
2.8 KiB
ArmAsm
183 lines
2.8 KiB
ArmAsm
|
|
;
|
|
; Implementation of ACPTR command. For detailed description see 'm65dos_bridge.s' file.
|
|
;
|
|
|
|
|
|
msg_ACPTR:
|
|
|
|
jsr dos_ENTER
|
|
|
|
; Check if there is a talker active
|
|
|
|
ldx IDX1_TALKER
|
|
+bmi msg_ACPTR_fail_no_talker
|
|
|
|
; Check if active channel is status one
|
|
|
|
lda XX_CHANNEL, X
|
|
cmp #$0F
|
|
+beq msg_ACPTR_status
|
|
|
|
; XXX add support for read contexts (multiple channels)
|
|
|
|
; Not a status channel - check if we have something to read out
|
|
|
|
ldx IDX2_TALKER
|
|
lda XX_ACPTR_LEN+0,x
|
|
ora XX_ACPTR_LEN+1,x
|
|
+beq msg_ACPTR_fail_no_data
|
|
|
|
; Read a byte of data from the buffer
|
|
|
|
jmp (msg_ACPTR_read_vectab, X)
|
|
|
|
msg_ACPTR_read_SD:
|
|
|
|
; Read and return one byte
|
|
|
|
jsr SD_ACPTR_helper
|
|
sta TBTCNT
|
|
sta REG_A
|
|
|
|
; Increment pointer, decrement length
|
|
|
|
inc SD_ACPTR_PTR+0
|
|
bne @1
|
|
inc SD_ACPTR_PTR+1
|
|
@1:
|
|
dec SD_ACPTR_LEN+0
|
|
lda SD_ACPTR_LEN+0
|
|
cmp #$FF
|
|
bne @2
|
|
dec SD_ACPTR_LEN+1
|
|
@2:
|
|
; If new length is 0, try to read next block of data
|
|
|
|
ora SD_ACPTR_LEN+1
|
|
bne @3
|
|
jsr unit_sd_cmd_READ
|
|
bcc @3
|
|
jsr kernalstatus_EOI
|
|
@3:
|
|
jmp dos_EXIT_CLC
|
|
|
|
msg_ACPTR_read_FD:
|
|
|
|
; Read and return one byte
|
|
|
|
jsr FD_ACPTR_helper
|
|
sta TBTCNT
|
|
sta REG_A
|
|
|
|
; Increment pointer, decrement length
|
|
|
|
inc FD_ACPTR_PTR+0
|
|
bne @1
|
|
inc FD_ACPTR_PTR+1
|
|
@1:
|
|
dec FD_ACPTR_LEN+0
|
|
lda FD_ACPTR_LEN+0
|
|
cmp #$FF
|
|
bne @2
|
|
dec FD_ACPTR_LEN+1
|
|
@2:
|
|
; If new length is 0, try to read next block of data
|
|
|
|
ora FD_ACPTR_LEN+1
|
|
bne @3
|
|
jsr unit_fd_cmd_READ
|
|
bcc @3
|
|
jsr kernalstatus_EOI
|
|
@3:
|
|
jmp dos_EXIT_CLC
|
|
|
|
msg_ACPTR_read_RD:
|
|
|
|
; XXX provide implementation
|
|
|
|
|
|
msg_ACPTR_fail_no_data:
|
|
|
|
; XXX What should be the reaction when trying to read and no data is present?
|
|
|
|
sta TBTCNT
|
|
sta REG_A
|
|
bra msg_ACPTR_EOI
|
|
|
|
msg_ACPTR_status:
|
|
|
|
ldx IDX2_TALKER
|
|
jmp (msg_ACPTR_status_vectab, X)
|
|
|
|
msg_ACPTR_status_SD: ; get next byte of status - SD card
|
|
|
|
ldx SD_STATUS_IDX
|
|
inc SD_STATUS_IDX
|
|
lda SD_STATUS_BUF,x
|
|
bra msg_ACPTR_status_got
|
|
|
|
msg_ACPTR_status_FD: ; get next byte of status - floppy
|
|
|
|
ldx FD_STATUS_IDX
|
|
inc FD_STATUS_IDX
|
|
lda FD_STATUS_BUF,x
|
|
bra msg_ACPTR_status_got
|
|
|
|
msg_ACPTR_status_RD: ; get next byte of status - ram disk
|
|
|
|
ldx RD_STATUS_IDX
|
|
inc RD_STATUS_IDX
|
|
lda RD_STATUS_BUF,x
|
|
|
|
; FALLTROUGH
|
|
|
|
msg_ACPTR_status_got:
|
|
|
|
sta TBTCNT ; byte return
|
|
beq msg_ACPTR_reset_status
|
|
|
|
jmp dos_EXIT_CLC_A
|
|
|
|
msg_ACPTR_fail_no_talker:
|
|
|
|
; XXX set error code
|
|
|
|
jmp dos_EXIT_SEC
|
|
|
|
msg_ACPTR_reset_status:
|
|
|
|
ldx IDX2_TALKER
|
|
lda #$00
|
|
sta PAR_TRACK
|
|
sta PAR_SECTOR
|
|
jsr (msg_ACPTR_set_status_vectab, x)
|
|
|
|
; FALLTROUGH
|
|
|
|
msg_ACPTR_EOI:
|
|
|
|
jsr kernalstatus_EOI
|
|
jmp dos_EXIT_CLC
|
|
|
|
|
|
; Vector tables for jumps
|
|
|
|
msg_ACPTR_status_vectab:
|
|
|
|
!word msg_ACPTR_status_SD
|
|
!word msg_ACPTR_status_FD
|
|
!word msg_ACPTR_status_RD
|
|
|
|
msg_ACPTR_read_vectab:
|
|
|
|
!word msg_ACPTR_read_SD
|
|
!word msg_ACPTR_read_FD
|
|
!word msg_ACPTR_read_RD
|
|
|
|
msg_ACPTR_set_status_vectab:
|
|
|
|
!word util_status_SD
|
|
!word util_status_FD
|
|
!word util_status_RD
|