89 lines
1.5 KiB
ArmAsm
89 lines
1.5 KiB
ArmAsm
|
|
;;
|
|
;; Official Kernal routine, described in:
|
|
;;
|
|
;; - [RG64] C64 Programmer's Reference Guide - page 289
|
|
;; - [CM64] Compute's Mapping the Commodore 64 - page 230/231
|
|
;;
|
|
;; CPU registers that has to be preserved (see [RG64]): none
|
|
;;
|
|
|
|
|
|
open:
|
|
|
|
;; Reset status
|
|
jsr kernalstatus_reset
|
|
|
|
;; Check if the logical file number is unique
|
|
ldy LDTND
|
|
*
|
|
beq +
|
|
dey
|
|
lda LAT, y
|
|
cmp current_logical_filenum
|
|
beq kernalerror_FILE_ALREADY_OPEN
|
|
cpy #$00
|
|
jmp -
|
|
*
|
|
;; Check if we have space in tables
|
|
|
|
ldy LDTND
|
|
cpy #$0A
|
|
bcc open_has_space
|
|
*
|
|
;; Table is full
|
|
jmp kernalerror_TOO_MANY_OPEN_FILES
|
|
|
|
open_has_space:
|
|
|
|
;; Update the tables
|
|
|
|
;; LAT / FAT / SAT support implemented according to
|
|
;; 'Compute's Mapping the Commodore 64', page 52
|
|
|
|
lda current_logical_filenum
|
|
sta LAT, y
|
|
lda current_device_number
|
|
sta FAT, y
|
|
lda current_secondary_address
|
|
sta SAT, y
|
|
|
|
iny
|
|
sty LDTND
|
|
|
|
;; Check for command to send
|
|
lda FNLEN
|
|
beq open_done_success
|
|
|
|
;; Check for IEC device
|
|
lda current_device_number
|
|
jsr iec_check_devnum
|
|
bcc open_iec
|
|
|
|
;; FALLTROUGH
|
|
open_done_success:
|
|
|
|
clc
|
|
rts
|
|
|
|
open_iec:
|
|
|
|
;; We have a command to send to IEC device
|
|
jsr listen
|
|
bcc +
|
|
jmp kernalerror_DEVICE_NOT_FOUND
|
|
*
|
|
lda current_secondary_address
|
|
jsr iec_cmd_open
|
|
bcc +
|
|
jmp kernalerror_DEVICE_NOT_FOUND ; XXX find a better error message for wrong channel (create new one?)
|
|
*
|
|
|
|
;; We need our helpers to get to filenames under ROMs or IO area
|
|
jsr install_ram_routines
|
|
|
|
;; Send command ('file name')
|
|
jsr lvs_send_file_name
|
|
|
|
jmp open_done_success
|