Introduced constructor to raise the ProDOS 8 file level - and extended the destructor to restore the file level again. This is a prerequisite to allow the upcoming exec() to open a file before the destructors run and continue reading from of it after the destructors have run.
git-svn-id: svn://svn.cc65.org/cc65/trunk@4955 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
9e31f7fb63
commit
110f911ccb
2 changed files with 43 additions and 10 deletions
|
@ -20,6 +20,9 @@ DESTROY_COUNT = 1
|
|||
RENAME_CALL = $C2
|
||||
RENAME_COUNT = 2
|
||||
|
||||
GET_INFO_CALL = $C4
|
||||
GET_INFO_COUNT = $A
|
||||
|
||||
ON_LINE_CALL = $C5
|
||||
ON_LINE_COUNT = 2
|
||||
|
||||
|
@ -72,6 +75,19 @@ EOF_COUNT = 2
|
|||
PATHNAME .addr
|
||||
NEW_PATHNAME .addr
|
||||
.endstruct
|
||||
.struct INFO
|
||||
PARAM_COUNT .byte
|
||||
PATHNAME .addr
|
||||
ACCESS .byte
|
||||
FILE_TYPE .byte
|
||||
AUX_TYPE .word
|
||||
STORAGE_TYPE .byte
|
||||
BLOCKS .word
|
||||
MODE_DATE .word
|
||||
MODE_TIME .word
|
||||
CREATE_DATE .word
|
||||
CREATE_TIME .word
|
||||
.endstruct
|
||||
.struct ON_LINE
|
||||
PARAM_COUNT .byte
|
||||
UNIT_NUM .byte
|
||||
|
@ -117,7 +133,8 @@ EOF_COUNT = 2
|
|||
DEVNUM := $BF30 ; Most recent accessed device
|
||||
DEVCNT := $BF31 ; Number of on-line devices (minus 1)
|
||||
DEVLST := $BF32 ; Up to 14 units may be active
|
||||
DATELO := $BF90 ; Bits 15-9 = Year, 8-5 = Month, 4-0 = Day
|
||||
TIMELO := $BF92 ; Bits 12-8 = Hour, 5-0 = Minute
|
||||
DATELO := $BF90 ; Bits 15-9 = year, 8-5 = month, 4-0 = day
|
||||
TIMELO := $BF92 ; Bits 12-8 = hour, 5-0 = minute
|
||||
LEVEL := $BF94 ; File level: used in open, flush, close
|
||||
PFIXPTR := $BF9A ; If = 0, no prefix active
|
||||
KVERSION:= $BFFF ; Kernel version number
|
||||
|
|
|
@ -3,15 +3,13 @@
|
|||
;
|
||||
; int open (const char* name, int flags, ...);
|
||||
;
|
||||
; Be sure to keep the value priority of closeallfiles lower than that of
|
||||
; closeallstreams (which is the high level C file I/O counterpart and must be
|
||||
; called before closeallfiles).
|
||||
|
||||
.export _open, closedirect, freebuffer
|
||||
.export __filetype, __auxtype
|
||||
.constructor raisefilelevel
|
||||
.destructor closeallfiles, 5
|
||||
|
||||
.import pushname, popname
|
||||
.import pushname, popname, __dos_type
|
||||
.import iobuf_alloc, iobuf_free
|
||||
.import addysp, incsp4, incaxy, pushax, popax
|
||||
|
||||
|
@ -21,6 +19,17 @@
|
|||
.include "mli.inc"
|
||||
.include "filedes.inc"
|
||||
|
||||
.segment "INIT"
|
||||
|
||||
raisefilelevel:
|
||||
; Raise file level
|
||||
lda __dos_type
|
||||
beq :+
|
||||
inc LEVEL
|
||||
: rts
|
||||
|
||||
.code
|
||||
|
||||
_open:
|
||||
; Throw away all parameters except name
|
||||
; and flags occupying together 4 bytes
|
||||
|
@ -209,10 +218,6 @@ freebuffer:
|
|||
ldx fdtab + FD::BUFFER+1,y
|
||||
jmp iobuf_free
|
||||
|
||||
closeallfiles:
|
||||
; All open files
|
||||
lda #$00
|
||||
|
||||
closedirect:
|
||||
; Set fd
|
||||
sta mliparam + MLI::CLOSE::REF_NUM
|
||||
|
@ -222,6 +227,17 @@ closedirect:
|
|||
ldx #CLOSE_COUNT
|
||||
jmp callmli
|
||||
|
||||
closeallfiles:
|
||||
; All open files with current level (or higher)
|
||||
lda #$00
|
||||
jsr closedirect
|
||||
|
||||
; Restore original file level
|
||||
lda __dos_type
|
||||
beq :+
|
||||
dec LEVEL
|
||||
: rts
|
||||
|
||||
.data
|
||||
|
||||
CREATE: .byte %11000011 ; ACCESS: Standard full access
|
||||
|
|
Loading…
Add table
Reference in a new issue