.import pushname, popname
.import errnoexit, oserrexit
- .import __aligned_malloc, _free
- .import addysp, incsp4, pushax, popax
+ .import iobuf_alloc, iobuf_free
+ .import addysp, incsp4, incaxy, pushax, popax
.include "zeropage.inc"
.include "errno.inc"
: lda fdtab + FD::REF_NUM,y
beq found
- .if .sizeof(FD) = 4
-
; Advance to next fdtab slot
+ .assert .sizeof(FD) = 4, error
iny
iny
iny
iny
- .else
- .error "Assertion failed"
- .endif
-
; Check for end of fdtab
cpy #MAX_FDS * .sizeof(FD)
bcc :-
- ; Load errno codes
- lda #ENOMEM ^ EMFILE
-enomem: eor #ENOMEM
+ ; Load errno code
+ lda #EMFILE
; Cleanup stack
- jsr incsp4 ; Preserves A
+errno: jsr incsp4 ; Preserves A
; Return errno
jmp errnoexit
pha
; Alloc I/O buffer
+ lda #<(fdtab + FD::BUFFER)
+ ldx #>(fdtab + FD::BUFFER)
+ jsr incaxy
+ jsr pushax
lda #$00
- ldx #>$0400
- jsr pushax ; Preserves A
ldx #>$0100
- jsr __aligned_malloc
+ jsr pushax ; Preserves A
+ ldx #>$0400
+ jsr iobuf_alloc
+ tay ; Save errno code
; Restore fdtab slot
pla
- tay
-
- ; Get and check I/O buffer high byte
- txa
- beq enomem
-
- ; Set I/O buffer high byte (low byte remains zero)
- sta fdtab + FD::BUFFER+1,y
+ sta tmp2 ; Save fdtab slot
- sty tmp2 ; Save fdtab slot
+ ; Check for error
+ tya ; Restore errno code
+ bne errno
; Get and save flags
jsr popax
and #O_CREAT
beq open
- .if MLI::CREATE::PATHNAME = MLI::OPEN::PATHNAME
-
; PATHNAME already set
-
- .else
- .error "Assertion failed"
- .endif
+ .assert MLI::CREATE::PATHNAME = MLI::OPEN::PATHNAME, error
; Set all other parameters from template
ldx #(MLI::CREATE::CREATE_TIME+1) - (MLI::CREATE::PATHNAME+1) - 1
beq open
lda #$47 ; "Duplicate filename"
-
+
; Cleanup name
oserr2: jsr popname ; Preserves A
pha ; Save oserror code
jsr freebuffer
pla ; Restore oserror code
-
+
; Return oserror
jmp oserrexit
done: lda tmp1 ; Restore fd
sta fdtab + FD::REF_NUM,y
- .if .sizeof(FD) = 4
-
; Convert fdtab slot to handle
+ .assert .sizeof(FD) = 4, error
tya
lsr
lsr
- .else
- .error "Assertion failed"
- .endif
-
; Cleanup name
jsr popname ; Preserves A
-
+
; Return success
ldx #$00
rts
; Free I/O buffer
lda #$00
ldx fdtab + FD::BUFFER+1,y
- jmp _free
+ jmp iobuf_free
closeallfiles:
; All open files