Files
open-roms/src/dos_m65/pseudoiec/msg_acptr.s
T
2021-03-06 20:57:56 +01:00

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