From: ol.sc
Date: Sat, 29 Jan 2011 21:43:26 +0000 (+0000)
Subject: Introduced constructor to raise the ProDOS 8 file level - and extended the destructor...
X-Git-Tag: V2.13.3~505
X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=110f911ccb9d79dab573afd73db9d6a26f7e2cd9;p=cc65
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
---
diff --git a/libsrc/apple2/mli.inc b/libsrc/apple2/mli.inc
index 26b40fdd7..5463a29fd 100644
--- a/libsrc/apple2/mli.inc
+++ b/libsrc/apple2/mli.inc
@@ -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
diff --git a/libsrc/apple2/open.s b/libsrc/apple2/open.s
index e7f603aa5..078cfdd48 100644
--- a/libsrc/apple2/open.s
+++ b/libsrc/apple2/open.s
@@ -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