1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
|
;
; Karri Kaksonen, 2010
;
; This function reads the directory entry for file "name".
;
; The name is actually plain ASCII string starting from
; "0", "1", up to "4095" which is the largest file number we can handle.
;
; open() does not take part in what kind of cart we have. If it is RAM
; you may also be able to write into it. Therefore we allow both reads
; and writes in this routine.
;
; int open(const char *name, int flags, ...)
;
; As helper functions we also provide.
; void openn(int fileno)
;
.importzp sreg, tmp3
.macpack longbranch
.import _atoi
.import _read
.import _lseek
.import addysp,popax,pushax,decsp6,pusha0,pusheax,ldaxysp
.import aslax3,axlong,tosaddeax,steaxysp,stax0sp,incsp8
.import ldax0sp
.import lynxskip0, lynxblock
.importzp _FileEntry
.importzp _FileStartBlock
.importzp _FileCurrBlock
.importzp _FileBlockOffset
.import __STARTOFDIRECTORY__
.export _open
.export _openn
.include "errno.inc"
.include "fcntl.inc"
.segment "DATA"
_startofdirectory:
.dword __STARTOFDIRECTORY__
; ---------------------------------------------------------------
; int __near__ open (__near__ const unsigned char*, int)
; ---------------------------------------------------------------
.segment "CODE"
.proc _open
.segment "CODE"
dey
dey
dey
dey
beq parmok
jsr addysp
parmok: jsr popax
sta tmp3
and #(O_RDWR | O_CREAT)
cmp #O_RDONLY
beq flagsok
cmp #(O_WRONLY | O_CREAT)
beq flagsok
jsr popax
lda #EINVAL
jmp __directerrno
flagsok:
jsr popax
jsr _atoi
jsr _openn
ldx #$00
lda #$01
stx __oserror
rts
.endproc
; ---------------------------------------------------------------
; void __near__ __fastcall__ openn (int)
; ---------------------------------------------------------------
.segment "CODE"
.proc _openn: near
.segment "CODE"
jsr pushax
jsr decsp6
lda #$01
jsr pusha0
lda _startofdirectory+3
sta sreg+1
lda _startofdirectory+2
sta sreg
ldx _startofdirectory+1
lda _startofdirectory
jsr pusheax
ldy #$0D
jsr ldaxysp
jsr aslax3
jsr axlong
jsr tosaddeax
jsr pusheax
ldx #$00
txa
jsr _lseek
ldy #$02
jsr steaxysp
lda #$01
jsr pusha0
lda #<_FileEntry
ldx #>_FileEntry
jsr pushax
ldx #$00
lda #$08
jsr _read
lda _FileStartBlock
sta _FileCurrBlock
jsr lynxblock
lda _FileBlockOffset+1
eor #$FF
tay
lda _FileBlockOffset
eor #$FF
tax
jsr lynxskip0
jsr stax0sp
jmp incsp8
.endproc
|