A2osX/SYS/KERNEL.S.STAT.txt
2019-04-15 06:40:13 +01:00

337 lines
6.1 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
PREFIX
AUTO 4,1
*/--------------------------------------
* # GetMemStat
* **In:**
* Y,A = Ptr to 24 bytes buffer
* ## RETURN VALUE
* Buffer filled with memory stats
*\--------------------------------------
K.GetMemStat >STYA ZPPtr1
ldy #23
ldx #7
.1 lda DevMgr.Stat,x
sta (ZPPtr1),y
dey
dex
bpl .1
sta SETREADAUX
jsr .2
sta CLRREADAUX
.2 ldx #7
.3 lda Mem.Table,x
sta (ZPPtr1),y
dey
dex
bpl .3
rts
*--------------------------------------
* # FStat
* Return information about a hFILE
* ## C
* `int fstat(short int hFILE, struct stat *statbuf);`
* ## ASM
* **In:**
* `>PUSHW statbuf`
* `lda hFILE`
* `>SYSCALL fstat`
* ## RETURN VALUE
*--------------------------------------
K.FStat jsr PFT.CheckNodeA
bcs K.FStat.9
tax
lda OF.Table.hPath-1,x
jsr K.GetMemPtr
jsr PFT.YAToMLIPATH
jsr K.Stat.I
bcs K.Stat.9
lda (pFD) #S.FD.T
bne K.Stat.BLK2SIZE
ldy #S.FD.REG.REF
lda (pFD),y
sta K.MLI.PARAMS+1
>MLICALL MLIGETEOF
bcs K.Stat.BLK2SIZE
ldy #S.STAT.SIZE+3
lda #0
sta (ZPPtr1),y
ldx #2
.1 lda K.MLI.PARAMS+2,x
dey
sta (ZPPtr1),y
dex
bpl .1
* clc
rts
K.FStat.9 >RET 2 discard statbuf
*/--------------------------------------
* # Stat
* Return information about a file
* ## C
* `int stat(const char *pathname, struct stat *statbuf);`
* ## ASM
* **In:**
* `>PUSHW statbuf`
* `>LDYA pathname`
* `>SYSCALL stat`
* ## RETURN VALUE
*\--------------------------------------
K.Stat jsr PFT.CheckPathYA
bcs K.FStat.9 go discard statbuf
jsr K.Stat.I
bcs K.Stat.9
K.Stat.BLK2SIZE
ldy #S.STAT.SIZE
lda #0
sta (ZPPtr1),y
iny
lda K.MLI.PARAMS+S.FI.UBLKS
asl
sta (ZPPtr1),y
iny
lda K.MLI.PARAMS+S.FI.UBLKS+1
rol
sta (ZPPtr1),y
iny
lda #0
rol
sta (ZPPtr1),y
* clc
K.Stat.9 rts
K.Stat.I >PULLW ZPPtr1 Get StatBuf
>MLICALL MLIGETFILEINFO
bcs .9
lda K.MLI.PARAMS+S.FI.A
jsr STAT.Access2Mode
.2 phy
ldy #S.STAT.MODE+1
sta (ZPPtr1),y
dey
pla
sta (ZPPtr1),y
ldx #K.Stat.DST-K.Stat.SRC
.3 ldy K.Stat.SRC-1,x
lda K.MLI.PARAMS,y
ldy K.Stat.DST-1,x
sta (ZPPtr1),y
dex
bne .3
clc
.9 rts
*--------------------------------------
K.Stat.SRC .DA #S.FI.T
.DA #S.FI.AUXTYPE,#S.FI.AUXTYPE+1
.DA #S.FI.UBLKS,#S.FI.UBLKS+1
K.Stat.DST .DA #S.STAT.P.TYPE
.DA #S.STAT.P.AUXTYPE,#S.STAT.P.AUXTYPE+1
.DA #S.STAT.BLOCKS,#S.STAT.BLOCKS+1
*--------------------------------------
STAT.Access2Mode
and #S.FI.A.FULL
cmp #S.FI.A.FULL
bne .1
ldy #S.STAT.MODE.FO+S.STAT.MODE.FG+S.STAT.MODE.FU
lda /S.STAT.MODE.FO+S.STAT.MODE.FG+S.STAT.MODE.FU
rts
.1 ldy #S.STAT.MODE.FO+S.STAT.MODE.FG+S.STAT.MODE.XU+S.STAT.MODE.RU
lda /S.STAT.MODE.FO+S.STAT.MODE.FG+S.STAT.MODE.XU+S.STAT.MODE.RU
rts
*/-------------------------------------
* # MKDir
* create a directory
* ## C
* `int mkdir(const char *pathname, int mode);`
* ## ASM
* **In:**
* `>PUSHW mode`
* `>LDYA pathname`
* `>SYSCALL mkdir`
* ## RETURN VALUE
* CC : success
* CS : error
* A = EC
*\-------------------------------------
K.MKDir jsr PFT.CheckPathYA
bcs K.Stat.9
lda #S.FI.T.DIR
sta K.MLI.PARAMS+4
stz K.MLI.PARAMS+5
stz K.MLI.PARAMS+6
lda #S.FI.ST.DIR
jmp IO.MLI.CREATE
*/--------------------------------------
* # MkNod
* Create a special or ordinary file.
* (CDEV, BDEV, DSOCKS, SSOCK, PIPE)
* ## C
* `hFILE mknod(const char *pathname, int mode, hFD fd);`
* ## ASM
* **In:**
* `>PUSHB fd`
* `>PUSHW mode`
* `>LDYA pathname`
* `>SYSCALL mknod`
* ## RETURN VALUE
* CC = OK, CS = ERROR
* A = hFILE
*\--------------------------------------
K.MkNod >STYA ZPPtr1 pathname
>PULLW K.S.STAT+S.STAT.MODE
>PULLB K.S.STAT+S.STAT.DEV
K.MkNod.I ldx #2
.1 lda Nod.Table.hPath-2,x
beq .2
inx
cpx #K.Nod.MAX+2
bne .1
lda #E.OOH
* sec
rts
.2 stx .3+1 Store hFILE
>LDYA ZPPtr1
>SYSCALL StrDup
bcs .9
txa
.3 ldx #$ff SELF MODIFIED
sta Nod.Table.hPath-2,x
lda K.S.STAT+S.STAT.DEV
sta Nod.Table.hFD-2,x
txa hNODE
clc
.9 rts
*/--------------------------------------
* # MKFIFO
* return a hFILE to a new FIFO
* ## C
* `hFILE mkfifo();`
* ## ASM
* **In:**
* `>SYSCALL mkfifo`
* ## RETURN VALUE
* CC = OK, CS = ERROR
* A = hFILE
*\--------------------------------------
K.MKFIFO
* jsr K.pipe
* bcs .9
* sta IO.hFD
* stz K.S.STAT+S.STAT.MODE
* stz K.S.STAT+S.STAT.MODE+1
* >LDYA STAT.PipeFn
* >STYA ZPPtr1
* jsr K.MkNod.I
* bcc .9
* jmp IO.OPEN.ERR
sec
rts
*/--------------------------------------
* # pipe
* ## C
* `hFD pipe();`
* ## ASM
* `>SYSCALL pipe`
* ## RETURN VALUE
* CC = OK, CS = ERROR
* A = hFD
*\--------------------------------------
K.Pipe >LDYAI K.PIPE.SIZE
jsr K.GetMem
bcs .99
stx .1+1 save PIPE buffer
>LDYAI S.FD.PIPE
ldx #S.MEM.F.INIT0+S.MEM.F.FD
jsr MEM.GetMem.YAX
bcs .9
>STYA pFD
lda #S.FD.T.PIPE
sta (pFD)
ldy #S.FD.PIPE.Free
lda #K.PIPE.SIZE
sta (pFD),y
iny
lda /K.PIPE.SIZE
sta (pFD),y
* ldy #S.FD.PIPE.S
* lda #1
* sta (pFD),y
ldy #S.FD.PIPE.hMem
.1 lda #$ff Self Modified
sta (pFD),y
txa
* clc
rts
.9 pha save error code
lda .1+1 get back PIPE buffer
jsr K.FreeMem
pla
sec
.99 rts
*--------------------------------------
*STAT.PipeFn .AZ "/DEV/PIPE00"
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.STAT
LOAD USR/SRC/SYS/KERNEL.S
ASM