A2osX/SYS/KERNEL.S.DEV.txt

367 lines
5.9 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
AUTO 3,1
*/--------------------------------------
* # GetDevByName
* Y,A = Ptr to device name (C-String)
* ## RETURN VALUE
* CC = OK, CS = ERROR
* Y,A = FD
* X = hDev
*\--------------------------------------
K.GetDevByName >STYA ZPPtr1 requested dev name
ldx #1
.1 lda Dev.Table,x
beq .4
sta pFD+1
pha
lda Dev.Table-1,x
sta pFD
clc
adc #S.FD.DEV
tay
pla
adc /S.FD.DEV
jsr .8
bcs .3
jsr DEV.GetPDrv
>LDYA pFD X = hDevNod
* clc
rts
.3 inx no....loop
inx
cpx #K.DEV.MAX*2+1
bne .1
.4 ldx #2
.5 lda Nod.Table.hFD-2,x
beq .7
lda Nod.Table.hName-2,x
beq .7
jsr K.GetMemPtr
jsr .8
bcs .7
lda Nod.Table.hFD-2,x
jmp K.GetMemPtr Y,A = pPD, X = hDevNod
.7 inx
inx
cpx #K.NOD.MAX*2+2
bne .5
lda #MLI.E.NODEV
* sec
rts
*--------------------------------------
.8 >STYA ZPPtr2
ldy #$ff
.80 iny
lda (ZPPtr1),y
cmp (ZPPtr2),y
bne .89
eor #0
bne .80
clc
rts
.89 sec
K.GetDev.9 rts
*/--------------------------------------
* # GetDevStatus
* ## C
* `int getdevstatus(short int DevID, S.DIB *dstat);`
* ## ASM
* `>PUSHB DevID`
* `>PUSHW S.DIB`
* `>SYSCALL GetDevStatus`
* ## RETURN VALUE
*\--------------------------------------
K.GetDevStatus >PULLW K.S.IOCTL+S.IOCTL.BUFPTR
>PULLA
jsr DEV.GetPFD
bcs K.GetDev.9
lda #S.IOCTL.S.GETDIB
.HS 2C BIT ABS
*--------------------------------------
DEV.EOF lda #S.IOCTL.S.EOF
*--------------------------------------
DEV.GetStatus sta K.S.IOCTL+S.IOCTL.S
ldy #S.FD.DEV.DEVID
lda (pFD),y
sta K.S.IOCTL+S.IOCTL.UNITNUM
>LDYAI K.S.IOCTL
ldx #IOCTL.STATUS
*--------------------------------------
DEV.pDrvJmp jmp (pDrv)
*--------------------------------------
DEV.OPEN ldx #IOCTL.OPEN
lda IO.hDevNod
jsr DEV.pDrvJmp
bcs .9
lda IO.hDevNod
.9 rts
*--------------------------------------
DEV.CLOSE ldx #IOCTL.CLOSE
lda IO.hDevNod
jmp (pDrv)
*--------------------------------------
DEV.READ ldx #IOCTL.READ
.HS 2C BIT ABS
*--------------------------------------
DEV.WRITE ldx #IOCTL.WRITE
>PULLW K.S.IOCTL+S.IOCTL.BYTECNT
>PULLW K.S.IOCTL+S.IOCTL.BUFPTR
inc pStack pop hFD
>LDYAI K.S.IOCTL
jsr DEV.pDrvJmp
bcs .9
>LDYA K.S.IOCTL+S.IOCTL.BYTECNT
.9 rts
*/--------------------------------------
* # MKDev
* Create a hDEV
* ## C
* `hDEV mkdev (S.FD *fd, const char *devname)`
* ## ASM
* `>PUSHW fd`
* `>PUSHW devname`
* `>SYSCALL mkdev`
* ## RETURN VALUE
* A = hDEV
*\--------------------------------------
K.MKDev jsr SHARED.PullP2P1 ptr2=name,tr1=fd
ldx #1
.10 lda Dev.Table,x
beq .11
inx
inx
cpx #K.DEV.MAX*2+1
bne .10
bra .9
.11 stx IO.hDevNod
ldy #$ff
ldx #S.FD.DEV
.1 iny Get DEV name length
inx compute FD+NAME+\0 in X
lda (ZPPtr2),y
bne .1
txa
tay
lda #0
jsr MEM.GetKrnlBuf
bcs .99
>STYA pFD
>STYA .4+1
ldx IO.hDevNod
sta Dev.Table,x
tya
sta Dev.Table-1,x
ldy #S.FD.DEV-1
.2 lda (ZPPtr1),y
sta (pFD),y
dey
bpl .2
ldy #$ff
ldx #S.FD.DEV-1
.3 iny
inx
lda (ZPPtr2),y
.4 sta $ffff,x
bne .3
>LDYAI K.IOBuf
>STYA K.S.IOCTL+S.IOCTL.BUFPTR
jsr DEV.GetPDrv
lda #S.IOCTL.S.STATUS
jsr DEV.GetStatus
bcs .99
lda K.IOBuf Get Status byte
bit #S.DIB.S.IRQ
beq .8
ldx #0
.5 lda IRQ.Vectors+1,x
beq .7
inx
inx
cpx #K.IRQDEV.MAX*2+1
bne .5
.9 lda #E.OOH
* sec
.99 rts
.7 ldy #IOCTL.IRQ+4
lda (pDRV),y
sta IRQ.Vectors,x
iny
lda (pDRV),y
sta IRQ.Vectors+1,x
.8 lda IO.hDevNod
* clc
rts
*/--------------------------------------
* # IOCTL
* ## C
* `int ioctl(short int DevID, short int request, void *param);`
* ## ASM
* `>PUSHB hDEV`
* `>PUSHB request`
* `>PUSHW param`
* `>SYSCALL IOCTL`
* ## RETURN VALUE
* Y,A = ...
*\--------------------------------------
K.IOCTL ldy #3 hDev
lda (pStack),y
jsr DEV.GetPFD
bcs .9
ldy #2 request
lda (pStack),y
tax
>PULLYA param
inc pStack
inc pStack
jmp (pDrv)
.9 >RET 4
*--------------------------------------
DEV.GetPFD sta IO.hDevNod
tax
lsr
bcs .1
lda Nod.Table.hFD-2,x empty slot ?
beq DEV.GetPFD.9
sta IO.hFD
jsr K.GetMemPtr
>STYA pFD
* clc
rts
.1 stz IO.hFD
ldy Dev.Table-1,x
lda Dev.Table,x
beq DEV.GetPFD.9
>STYA pFD
DEV.GetPDrv ldy #S.FD.DEV.DRVPTR
lda (pFD),y
sta pDRV
iny
lda (pFD),y
sta pDRV+1
clc
rts
DEV.GetPFD.9 lda #E.INVH
sec
rts
*--------------------------------------
* X = 0 > REG
* X = 1 > DIR
* X = 2 > PIPE
*--------------------------------------
DEV.MkFD stx .8+1
ldy DEV.MkFD.Y,x
lda #0
ldx #S.MEM.F.INIT0+S.MEM.F.FD
jsr MEM.GetMem.YAX
bcs .9
>STYA pFD
stx IO.hFD
.8 ldx #$ff SELF MODIFIED
lda DEV.MkFD.T,x
sta (pFD) X = hFD, A = T
* clc
.9 rts
DEV.MkFD.Y .DA #S.FD.REG,#S.FD.DIR,#S.FD.PIPE
DEV.MkFD.T .DA #S.FD.T.REG,#S.FD.T.DIR,#S.FD.T.PIPE
*--------------------------------------
DEV.Destroy ldx IO.hDevNod
lda Nod.Table.hName-2,x
beq .1
stz Nod.Table.hName-2,x
jsr K.FreeMem
ldx IO.hDevNod
.1 lda Nod.Table.hFD-2,x
stz Nod.Table.hFD-2,x
jmp K.FreeMem
*--------------------------------------
MAN
SAVE usr/src/sys/kernel.s.dev
LOAD usr/src/sys/kernel.s
ASM