A2osX/SYS/KERNEL.S.DEV.txt

249 lines
4.9 KiB
Plaintext
Raw Normal View History

2015-03-08 21:45:23 +00:00
PR#3
PREFIX /DATA/A2OSX
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
*--------------------------------------
* S.DevMgrInit
*--------------------------------------
S.DevMgrInit ldx #S.DEV.SIZE*K.DEV.MAX
.1 stz DEVMGR.TABLE-1,x
dex
bne .1
ldy #5
.2 lda DEVMGR.TABLE.NUL,y
sta DEVMGR.TABLE,y
dey
bpl .2
ldy #5
ldx #S.DEV.SIZE+5
.3 lda DEVMGR.TABLE.KBD,y
sta DEVMGR.TABLE,x
dex
dey
bpl .3
lda #1 reserve #0=NUL, #1=KBD
sta DEVMGR.LASTID
clc
rts
*--------------------------------------
* S.GetDevByIDA
* IN:
* A = DevID
* OUT:
* CC = OK, CS = ERROR
* Y,A = devslot
* X Unmodified
*--------------------------------------
S.GetDevByIDA sta ZPQuickPtr1
lda #K.DEV.MAX
sta ZPQuickPtr1+1
>LDYAI DEVMGR.TABLE
>STYA ZPQuickPtr2
.1 lda (ZPQuickPtr2) get S.DEV.F
bpl .3 In use ?
ldy #S.DEV.ID
lda (ZPQuickPtr2),y
cmp ZPQuickPtr1
beq .8
.2 lda ZPQuickPtr2
clc
adc #S.DEV.SIZE
sta ZPQuickPtr2
bcc .3
inc ZPQuickPtr2+1
.3 dec ZPQuickPtr1+1
bne .1
sec
rts
.8 >LDYA ZPQuickPtr2
clc
rts
*--------------------------------------
* GetDevIDByNameA
* IN:
* A = hPStr
* OUT:
* CC = OK, CS = ERROR
* A = DEVID
* set DEVMGR.DEVPTR to devslot
*--------------------------------------
S.GetDevByNameA jsr S.GetMemPtrA
>STYA ZPQuickPtr1
>LDYAI DEVMGR.TABLE
>STYA DEVMGR.DEVPTR
ldx #K.DEV.MAX
.1 lda (DEVMGR.DEVPTR) get S.DEV.F
bpl .3 empty ?
lda DEVMGR.DEVPTR
clc
adc #S.DEV.NAME
sta ZPQuickPtr2
lda DEVMGR.DEVPTR+1
adc /S.DEV.NAME
sta ZPQuickPtr2+1
lda (ZPQuickPtr1)
cmp (ZPQuickPtr2)
bne .3
tay
.2 lda (ZPQuickPtr1),y
cmp (ZPQuickPtr2),y
bne .3
dey
bne .2
ldy #S.DEV.ID
lda (DEVMGR.DEVPTR),y
clc
rts
.3 lda DEVMGR.DEVPTR
clc
adc #S.DEV.SIZE
sta DEVMGR.DEVPTR
bcc .5
inc DEVMGR.DEVPTR+1
.5 dex
bne .1
lda #DEVMGR.ERRDNF
sec
rts
*--------------------------------------
* S.GetDevTable
* IN :
* OUT CC = OK, CS = ERROR
* Y,A = PTR to dev table
* X = LASTID
*--------------------------------------
S.GetDevTable >LDYAI DEVMGR.TABLE
ldx DEVMGR.LASTID
rts
*--------------------------------------
* S.DevOutA
* IN :
* A = hDev
*--------------------------------------
S.DevOutA ldx #DEVMGR.OUT
jmp S.DevCallFunc
*--------------------------------------
* S.GetDevInfoA
*--------------------------------------
S.GetDevInfoA ldx #DEVMGR.GETINFO
jmp S.DevCallFunc
*--------------------------------------
* PRIVATE
*--------------------------------------
* S.DevOpenA
* IN :
* A = hDev
* OUT CC = OK, CS = ERROR
*--------------------------------------
S.DevOpenA ldx #DEVMGR.OPEN
bra S.DevCallFunc
*--------------------------------------
* S.DevGetEventA
* IN :
* A = hDev
* OUT CC = OK, CS = ERROR
*--------------------------------------
S.DevGetEventA ldx #DEVMGR.GETEVENT
bra S.DevCallFunc
*--------------------------------------
* S.DevCloseA
*--------------------------------------
S.DevCloseA ldx #DEVMGR.CLOSE
bra S.DevCallFunc
*--------------------------------------
S.DevCallFunc jsr S.GetDevByIDA
bcs .9
>STYA pDevContext
ldy #S.DEV.hCS
lda (pDevContext),y
jsr S.GetMemPtrA X = unmodified
>STYA Kernel.JMP
>LDYA pDevContext
jsr Kernel.DRVCALL Call DRV function
.9 rts
*--------------------------------------
* S.CreateDevSlot
* IN : none
* OUT : A = DevID
* set DEVMGR.DEVPTR to freeslot
* init (DEVMGR.DEVPTR),S.DEV.ID with Dev.ID
*--------------------------------------
S.CreateDevice >LDYAI DEVMGR.TABLE
>STYA DEVMGR.DEVPTR
ldx #K.DEV.MAX
.1 lda (DEVMGR.DEVPTR)
bpl .3
lda DEVMGR.DEVPTR
clc
adc #S.DEV.SIZE
sta DEVMGR.DEVPTR
bcc .2
inc DEVMGR.DEVPTR+1
.2 dex
bne .1
lda #DEVMGR.ERROOS
sec
rts
.3 lda #0
tay
.4 sta (DEVMGR.DEVPTR),y
iny
cpy #S.DEV.SIZE
bne .4
inc DEVMGR.LASTID
lda DEVMGR.LASTID
ldy #S.DEV.ID
sta (DEVMGR.DEVPTR),y
clc
rts
*--------------------------------------
* S.DestroyDevSlot
* selected by (DEVMGR.DEVPTR)
*--------------------------------------
S.DestroyDevice ldy #S.DEV.hCS
lda (DEVMGR.DEVPTR),y
beq .1
jsr S.FreeMemA
.1 ldy #S.DEV.hDS
lda (DEVMGR.DEVPTR),y
beq .2
jsr S.FreeMemA
.2 ldy #S.DEV.hCMD
lda (DEVMGR.DEVPTR),y
beq .3
jsr S.FreeMemA
.3 ldy #S.DEV.hARGS
lda (DEVMGR.DEVPTR),y
beq .4
jsr S.FreeMemA
.4 rts
*--------------------------------------
DEVMGR.TABLE.NUL .DA #S.DEV.F.INUSE+S.DEV.F.CHAR+S.DEV.F.BLOCK
.HS 00 ID
>PSTRING "NUL" NAME
DEVMGR.TABLE.KBD .DA #S.DEV.F.INUSE+S.DEV.F.CHAR
.HS 01 ID
>PSTRING "KBD" NAME
DEVMGR.LASTID .BS 1
*--------------------------------------
MAN
SAVE SYS/KERNEL.S.DEV
LOAD SYS/KERNEL.S
ASM