mirror of
https://github.com/A2osX/A2osX.git
synced 2024-09-10 22:54:59 +00:00
720 lines
15 KiB
Plaintext
720 lines
15 KiB
Plaintext
NEW
|
||
PREFIX /A2OSX.BUILD
|
||
AUTO 4,1
|
||
*--------------------------------------
|
||
ZPMemMgrSPtr .EQ ZPMEMMGR Pointer To Slot selected
|
||
ZPMemMgrTmp1 .EQ ZPMEMMGR+2
|
||
ZPMemMgrSize .EQ ZPMEMMGR+4
|
||
ZPSListID .EQ ZPMEMMGR+6
|
||
ZPSListIBlkPtr .EQ ZPMEMMGR+8
|
||
ZPSListDBlkPtr .EQ ZPMEMMGR+10
|
||
ZPSListKeyPtr .EQ ZPMEMMGR+12
|
||
ZPSListDataPtr .EQ ZPMEMMGR+14
|
||
*/--------------------------------------
|
||
* # GetMem0
|
||
* **In:**
|
||
* Y,A = Size Requested
|
||
* **Out:**
|
||
* CC : success
|
||
* YA = PTR to Mem (ZERO Initialised)
|
||
* X = hMem
|
||
* CS :
|
||
* A = EC
|
||
*\--------------------------------------
|
||
K.GetMem0 ldx #S.MEM.F.INIT0
|
||
.HS 2C bit abs
|
||
*/--------------------------------------
|
||
* # GetMem
|
||
* **In:**
|
||
* Y,A = Size Requested
|
||
* **Out:**
|
||
* CC : success
|
||
* YA = PTR to Mem (Uninitialised)
|
||
* X = hMem
|
||
* CS :
|
||
* A = EC
|
||
*\--------------------------------------
|
||
K.GetMem ldx #0
|
||
|
||
MEM.GetMem.YAX stx Mem.ReqFlags
|
||
sta ZPMemMgrSize+1
|
||
|
||
tya
|
||
bit #$0F 16 bytes aligned ?
|
||
beq .10 yes, request it
|
||
|
||
and #$F0 align on 16 bytes
|
||
clc
|
||
adc #$10
|
||
bcc .10
|
||
inc ZPMemMgrSize+1
|
||
|
||
.10 sta ZPMemMgrSize
|
||
|
||
>LDYAI Mem.Table
|
||
>STYA ZPMemMgrSPtr
|
||
|
||
ldx #0 Current slot=0
|
||
|
||
bra .4 skip slot 0, Check if some free slot to reuse first
|
||
|
||
.1 inx move to next slot
|
||
jsr Mem.NextSlot
|
||
lda (ZPMemMgrSPtr) Get Flags
|
||
bmi .4 in use ?
|
||
|
||
.2 lda Mem.ReqFlags Found an empty slot
|
||
and #S.MEM.F.ALIGN is request needs a page align ?
|
||
beq .3
|
||
|
||
ldy #S.MEM.PTR
|
||
lda (ZPMemMgrSPtr),y get LO of PTR
|
||
bne .4 not page-aligned
|
||
|
||
.3 ldy #S.MEM.LEN
|
||
lda (ZPMemMgrSPtr),y get LEN of this block
|
||
cmp ZPMemMgrSize compare with requested size
|
||
bne .4
|
||
|
||
iny
|
||
lda (ZPMemMgrSPtr),y
|
||
cmp ZPMemMgrSize+1
|
||
beq .7 requested size matches slot size !!!
|
||
|
||
.4 cpx Mem.LastSlot any other slot to check?
|
||
bne .1 last one, create a new slot
|
||
|
||
*-------------- Create a New SLOT
|
||
lda Mem.ReqFlags
|
||
and #S.MEM.F.ALIGN is request needs a page align ?
|
||
beq .6
|
||
|
||
lda Mem.Free target PTR will be page aligned ?
|
||
sec
|
||
sbc ZPMemMgrSize
|
||
beq .6 yes, allocate
|
||
|
||
tay no, reserve a free slot to fill gap
|
||
lda #0
|
||
jsr Mem.AddSlot X = new slot
|
||
bcs .9
|
||
|
||
.6 >LDYA ZPMemMgrSize
|
||
jsr Mem.AddSlot X = new slot
|
||
bcs .9
|
||
|
||
*-------------- Reuse this SLOT
|
||
|
||
.7 lda Mem.ReqFlags get requested flags
|
||
ora #S.MEM.F.INUSE mark as in use
|
||
sta (ZPMemMgrSPtr)
|
||
|
||
and #S.MEM.F.INIT0
|
||
beq .8
|
||
|
||
ldy #S.MEM.PTR
|
||
lda (ZPMemMgrSPtr),y ZPMemMgrSPtr already set
|
||
sta .12+1
|
||
iny
|
||
lda (ZPMemMgrSPtr),y
|
||
sta .12+2
|
||
|
||
lda ZPMemMgrSize
|
||
eor #$ff
|
||
tay y=not lo count
|
||
|
||
lda ZPMemMgrSize+1
|
||
eor #$ff a=not hi count
|
||
|
||
phx
|
||
|
||
ldx #0
|
||
|
||
.11 iny
|
||
bne .12
|
||
inc
|
||
beq .13
|
||
|
||
.12 stz $ffff,x
|
||
inx
|
||
bne .11
|
||
|
||
inc .12+2
|
||
bra .11
|
||
|
||
.13 plx
|
||
|
||
.8 lda #0
|
||
ldy #S.MEM.BIN
|
||
sta (ZPMemMgrSPtr),y
|
||
|
||
inc Mark this slot used by one process
|
||
ldy #S.MEM.REFCNT
|
||
sta (ZPMemMgrSPtr),y
|
||
|
||
ldy #S.PS.PID
|
||
lda (pPs),y
|
||
ldy #S.MEM.OWNERPID
|
||
sta (ZPMemMgrSPtr),y
|
||
|
||
ldy #S.MEM.PTR
|
||
lda (ZPMemMgrSPtr),y
|
||
pha
|
||
iny
|
||
lda (ZPMemMgrSPtr),y A = HI PTR
|
||
ply Y = LO PTR
|
||
clc X = Current hMem
|
||
|
||
.9 rts
|
||
*--------------------------------------
|
||
Mem.ReqFlags .BS 1 store requested Flags
|
||
*--------------------------------------
|
||
* Mem.AddSlot
|
||
* In:
|
||
* Y,A = Requested size
|
||
* Out:
|
||
*--------------------------------------
|
||
Mem.AddSlot >STYA ZPMemMgrTmp1 save req size
|
||
ldx Mem.LastSlot
|
||
inx
|
||
beq .99 > 255 ERR:OUT OF SLOT
|
||
|
||
lda Mem.Free Compute base PTR=FREE-REQ size
|
||
sec
|
||
sbc ZPMemMgrTmp1
|
||
tay save new Mem.Free LO
|
||
lda Mem.Free+1
|
||
sbc ZPMemMgrTmp1+1
|
||
pha save new Mem.Free HI
|
||
|
||
cpy Mem.LoMem
|
||
sbc Mem.LoMem+1
|
||
bcc .98 ERR out of mem
|
||
|
||
jsr Mem.NextSlot X,Y unmodified
|
||
|
||
tya get back Mem.Free LO
|
||
|
||
ldy #S.MEM.PTR
|
||
sta Mem.Free set as system Mem.Free value
|
||
sta (ZPMemMgrSPtr),y store is as base address of new slot
|
||
iny
|
||
pla get back Mem.Free HI
|
||
sta Mem.Free+1
|
||
sta (ZPMemMgrSPtr),y
|
||
|
||
iny
|
||
lda ZPMemMgrTmp1 get requested size
|
||
sta (ZPMemMgrSPtr),y setup slot LEN
|
||
iny
|
||
lda ZPMemMgrTmp1+1
|
||
sta (ZPMemMgrSPtr),y
|
||
|
||
stx Mem.LastSlot mark this slot allocated
|
||
clc
|
||
rts
|
||
|
||
.98 pla discard new Mem.Free HI
|
||
|
||
.99 lda #K.E.OOM
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
Mem.NextSlot lda ZPMemMgrSPtr
|
||
clc
|
||
adc #S.MEM
|
||
sta ZPMemMgrSPtr
|
||
bcc .8
|
||
inc ZPMemMgrSPtr+1
|
||
.8 rts
|
||
*/--------------------------------------
|
||
* # FreeMem
|
||
* **In:**
|
||
* A = hMem To Free
|
||
* **Out:**
|
||
* none.
|
||
* (X,Y unmodified)
|
||
*\--------------------------------------
|
||
K.FreeMem phy
|
||
tay
|
||
|
||
beq * Slot=0, reserved by Kernel
|
||
|
||
jsr K.GetMemByID X unmodified
|
||
lda (ZPMemMgrSPtr)
|
||
bpl .9 In use ?
|
||
|
||
ldy #S.MEM.REFCNT
|
||
lda (ZPMemMgrSPtr),y Get count of those referencing this hMem
|
||
dec only one left ?
|
||
sta (ZPMemMgrSPtr),y
|
||
bne .8 no, must be a code segment loaded several times
|
||
|
||
lda #0 mark this slot as free
|
||
sta (ZPMemMgrSPtr)
|
||
|
||
ldy #S.MEM.BIN
|
||
lda (ZPMemMgrSPtr),y Any BINPATH to discard ?
|
||
beq .1
|
||
|
||
jsr K.GetMemByID X unmodified
|
||
lda (ZPMemMgrSPtr)
|
||
bpl * ***MUST BE ALLOCATED***
|
||
|
||
lda #0 mark BINPATH slot as free
|
||
sta (ZPMemMgrSPtr)
|
||
|
||
.1 lda Mem.LastSlot
|
||
beq .8
|
||
|
||
jsr K.GetMemByID X unmodified
|
||
lda (ZPMemMgrSPtr)
|
||
bmi .8 used, exit
|
||
|
||
.2 dec Mem.LastSlot free! get previous....
|
||
beq .3 empty list: go set Mem.Free=Mem.HiMem
|
||
|
||
lda Mem.LastSlot
|
||
jsr K.GetMemByID X unmodified
|
||
lda (ZPMemMgrSPtr)
|
||
bpl .2 free again! loop
|
||
|
||
ldy #S.MEM.PTR
|
||
lda (ZPMemMgrSPtr),y set Mem.Free...
|
||
sta Mem.Free
|
||
iny
|
||
lda (ZPMemMgrSPtr),y
|
||
sta Mem.Free+1
|
||
|
||
.8 ply
|
||
clc
|
||
rts
|
||
|
||
.3 >LDYA Mem.HiMem
|
||
>STYA Mem.Free
|
||
bra .8
|
||
*--------------------------------------
|
||
.9 ply discard saved Y
|
||
|
||
lda $D000
|
||
sta .91+1
|
||
bit RRAMWRAMBNK2
|
||
bit RRAMWRAMBNK2
|
||
|
||
jsr CORE.PSSelect0 Select PS0 for proper I/O devices
|
||
|
||
jsr DRV.SYS.Control
|
||
|
||
pla Get PC and sub 2 for calling address
|
||
sec
|
||
sbc #2
|
||
tay
|
||
pla
|
||
sbc #0
|
||
|
||
>PUSHYA
|
||
|
||
>LDYAI K.FreeMem.ERR
|
||
>SYSCALL printf
|
||
|
||
.91 ldx #$ff
|
||
bit $C000,x
|
||
bit $C000,x
|
||
bra *
|
||
*--------------------------------------
|
||
K.FreeMem.ERR .AZ "FreeMem:%H:hMem already freed."
|
||
*/--------------------------------------
|
||
* # GetMemPtr
|
||
* **In:**
|
||
* A = hMem
|
||
* **Out:**
|
||
* Y,A = PTR to MemBlock
|
||
* (X unmodified)
|
||
*\--------------------------------------
|
||
K.GetMemPtr jsr K.GetMemByID
|
||
ldy #S.MEM.PTR
|
||
lda (ZPMemMgrSPtr),y
|
||
pha
|
||
iny
|
||
lda (ZPMemMgrSPtr),y
|
||
ply
|
||
rts
|
||
*/--------------------------------------
|
||
* # GetMemByID
|
||
* **In:**
|
||
* A = hMem
|
||
* **Out:**
|
||
* Y,A = ZPMemMgrSPtr = PTR to S.MEM
|
||
* X unmodified
|
||
*\--------------------------------------
|
||
* Optimized for :
|
||
* Mem.Table is page aligned at $1800
|
||
* S.MEM is 8 bytes
|
||
*--------------------------------------
|
||
.DO Mem.Table=$1800
|
||
.ELSE
|
||
!!!!!WARNING!!!!!
|
||
.FIN
|
||
.DO S.MEM=8
|
||
.ELSE
|
||
!!!!!WARNING!!!!!
|
||
.FIN
|
||
*--------------------------------------
|
||
K.GetMemByID sta ZPMemMgrSPtr
|
||
lda /Mem.Table/8
|
||
asl ZPMemMgrSPtr
|
||
rol
|
||
asl ZPMemMgrSPtr
|
||
rol
|
||
asl ZPMemMgrSPtr
|
||
rol
|
||
sta ZPMemMgrSPtr+1
|
||
ldy ZPMemMgrSPtr
|
||
rts
|
||
*--------------------------------------
|
||
* OLD CODE
|
||
*--------------------------------------
|
||
* stz ZPMemMgrSPtr+1
|
||
* asl
|
||
* rol ZPMemMgrSPtr+1
|
||
* asl
|
||
* rol ZPMemMgrSPtr+1
|
||
* asl
|
||
* rol ZPMemMgrSPtr+1
|
||
** clc IMPLICIT
|
||
* adc #Mem.Table
|
||
* tay
|
||
* lda ZPMemMgrSPtr+1
|
||
* adc /Mem.Table
|
||
* sty ZPMemMgrSPtr
|
||
* sta ZPMemMgrSPtr+1
|
||
* rts
|
||
*/--------------------------------------
|
||
* # NewStr
|
||
* Create a new copy of this C-String
|
||
* **In:**
|
||
* Y,A = Ptr to source C-String
|
||
* **Out:**
|
||
* CC : success
|
||
* Y,A = PTR to String
|
||
* X = hMem (PSTR)
|
||
* CS : error
|
||
* A = SYS error code
|
||
*\--------------------------------------
|
||
K.NewStr >STYA .1+1
|
||
>STYA .4+1
|
||
|
||
ldy #0
|
||
lda #0
|
||
|
||
.1 ldx $ffff,y
|
||
beq .2
|
||
iny
|
||
bne .1
|
||
inc
|
||
inc .1+2
|
||
bne .1
|
||
|
||
.2 iny Add one for ending 0
|
||
bne .3
|
||
inc
|
||
|
||
.3 jsr K.GetMem
|
||
bcs .9
|
||
>STYA .5+1
|
||
|
||
phy
|
||
pha
|
||
|
||
ldy #0
|
||
|
||
.4 lda $ffff,y
|
||
.5 sta $ffff,y
|
||
beq .8
|
||
iny
|
||
bne .4
|
||
|
||
inc .4+2
|
||
inc .5+2
|
||
bne .4
|
||
|
||
.8 pla
|
||
ply
|
||
clc
|
||
.9 rts
|
||
*/--------------------------------------
|
||
* # SListGetByID
|
||
* **In:**
|
||
* PUSHB = hSList
|
||
* PUSHW = KeyID
|
||
* PUSHW = Data Ptr
|
||
* PUSHW = Key Ptr
|
||
* **Out:**
|
||
* X,Y = Next KeyID
|
||
*\--------------------------------------
|
||
K.SListGetByID >PULLW ZPSListKeyPtr
|
||
*/--------------------------------------
|
||
* # SListUpdateByID
|
||
* **In:**
|
||
* PUSHB = hSList
|
||
* PUSHW = KeyID
|
||
* PUSHW = Data Ptr
|
||
* **Out:**
|
||
* A = Key Length
|
||
* X,Y = KeyID
|
||
*\--------------------------------------
|
||
K.SListUpdateByID
|
||
>PULLW ZPSListDataPtr
|
||
>PULLW ZPSListID
|
||
bra K.SListPullH
|
||
*/--------------------------------------
|
||
* # SListAdd
|
||
* **In:**
|
||
* PUSHB = hSList
|
||
* PUSHW = Key Ptr
|
||
* PUSHW = Data Ptr
|
||
* **Out:**
|
||
* A = Key Length
|
||
* X,Y = KeyID
|
||
*\--------------------------------------
|
||
K.SListAdd
|
||
*/--------------------------------------
|
||
* # SListLookup
|
||
* **In:**
|
||
* PUSHB = hSList
|
||
* PUSHW = Key Ptr
|
||
* PUSHW = Data Ptr
|
||
* **Out:**
|
||
* A = Key Length
|
||
* X,Y = KeyID
|
||
*\--------------------------------------
|
||
K.SListLookup
|
||
*--------------------------------------
|
||
>PULLW ZPSListDataPtr
|
||
>PULLW ZPSListKeyPtr
|
||
K.SListPullH >PULLA
|
||
*/--------------------------------------
|
||
* # SListNew
|
||
* **In:**
|
||
* **Out:**
|
||
* A=hSList
|
||
*\--------------------------------------
|
||
K.SListNew
|
||
*/--------------------------------------
|
||
* # SListFree
|
||
* **In:**
|
||
* A=hSList
|
||
* **Out:**
|
||
*\--------------------------------------
|
||
K.SListFree
|
||
*--------------------------------------
|
||
sta SETREADAUX
|
||
sta SETWRITEAUX
|
||
jsr X.SLIST
|
||
sta CLRREADAUX
|
||
sta CLRWRITEAUX
|
||
rts
|
||
*/--------------------------------------
|
||
* # GetStkObjProp
|
||
* **In:**
|
||
* A = hObject (AUX Memory)
|
||
* Y = Property Index
|
||
* **Out:**
|
||
* Y,A = Property Value
|
||
*\--------------------------------------
|
||
K.GetStkObjProp phy
|
||
sta SETREADAUX
|
||
jsr K.GetMemPtr
|
||
>STYA ZPMemMgrTmp1
|
||
|
||
ply
|
||
lda (ZPMemMgrTmp1),y
|
||
pha
|
||
iny
|
||
lda (ZPMemMgrTmp1),y
|
||
ply
|
||
sta CLRREADAUX
|
||
rts
|
||
*/--------------------------------------
|
||
* # NewStkObj
|
||
* **In:**
|
||
* Y,A = Size Requested
|
||
* **Out:**
|
||
* CC : success
|
||
* YA = PTR to Mem (Uninitialised)
|
||
* X = hMem
|
||
* CS :
|
||
* A = EC
|
||
*\--------------------------------------
|
||
K.NewStkObj ldx #SYS.GetMem
|
||
.HS 2C BIT ABS
|
||
*/--------------------------------------
|
||
* # FreeStkObj
|
||
* **In:**
|
||
* A = hMem To Free (AUX Memory)
|
||
* **Out:**
|
||
* none.
|
||
* (X,Y unmodified)
|
||
*\--------------------------------------
|
||
K.FreeStkObj ldx #SYS.FreeMem
|
||
|
||
MEM.GoStkObj sta SETREADAUX
|
||
sta SETWRITEAUX
|
||
|
||
jsr .1
|
||
|
||
sta CLRREADAUX
|
||
sta CLRWRITEAUX
|
||
rts
|
||
|
||
.1 jmp (SYS.Kernel.JMP,x)
|
||
*/--------------------------------------
|
||
* # LoadStkObj
|
||
* Load a file in AUX memory (Stock Objects)
|
||
* **In:**
|
||
* PUSHW = AUXTYPE (Handled by....
|
||
* PUSHB = TYPE ...
|
||
* PUSHB = MODE ...
|
||
* PUSHW = PATH ...FOpen)
|
||
* **Out:**
|
||
* Y,A = File Length
|
||
* X = hMem of Loaded Object in AUX mem
|
||
*\--------------------------------------
|
||
K.LoadStkObj >SYSCALL LoadFile
|
||
bcs .99
|
||
|
||
stx .8+1 Save MAIN hMem
|
||
>STYA A2L Save LEN temporarly
|
||
|
||
jsr K.NewStkObj
|
||
bcs .9
|
||
stx .80+1
|
||
>STYA A4L Save Destination Address in AUX
|
||
|
||
lda .8+1
|
||
jsr K.GetMemPtr
|
||
|
||
>STYA A1L Save MAIN base Ptr
|
||
|
||
pha Add Allocated LEN
|
||
tya
|
||
clc
|
||
adc A2L
|
||
sta A2L
|
||
pla
|
||
adc A2L+1
|
||
sta A2L+1 to get End address in A2L/H
|
||
|
||
sec Main To Aux
|
||
jsr AuxMove
|
||
|
||
.8 lda #$ff SELF MODIFIED
|
||
jsr K.FreeMem release MAIN memory
|
||
|
||
.80 lda #$ff Returns AUX hMem
|
||
rts
|
||
|
||
.9 pha
|
||
jsr .8
|
||
pla
|
||
sec
|
||
.99 rts
|
||
*--------------------------------------
|
||
MEM.GetKeyCharY sta CLRREADAUX
|
||
lda (ZPSListKeyPtr),y
|
||
sta SETREADAUX
|
||
beq MEM.IsDigit.9
|
||
|
||
MEM.IsIDValid cmp #'.'
|
||
beq MEM.IsDigit.8
|
||
|
||
cmp #'_'
|
||
beq MEM.IsDigit.8
|
||
|
||
MEM.IsDigitOrL cmp #'z'+1
|
||
bcs MEM.IsDigit.RTS
|
||
cmp #'a'
|
||
bcs MEM.IsDigit.8
|
||
|
||
MEM.IsDigitOrUC cmp #'Z'+1
|
||
bcs MEM.IsDigit.RTS
|
||
cmp #'A'
|
||
bcs MEM.IsDigit.8
|
||
|
||
MEM.IsDigit cmp #'9'+1
|
||
bcs MEM.IsDigit.RTS
|
||
cmp #'0'
|
||
bcs MEM.IsDigit.8
|
||
|
||
MEM.IsDigit.9 sec
|
||
|
||
MEM.IsDigit.RTS rts
|
||
|
||
MEM.IsDigit.8 clc
|
||
rts
|
||
*--------------------------------------
|
||
MEM.IsHexDigit jsr MEM.IsDigit
|
||
bcc .8
|
||
|
||
cmp #'A'
|
||
bcc MEM.IsDigit.9
|
||
cmp #'F'+1
|
||
bcc .1
|
||
|
||
cmp #'a'
|
||
bcc MEM.IsDigit.9
|
||
cmp #'f'+1
|
||
bcs MEM.IsDigit.RTS
|
||
|
||
eor #$20
|
||
.1
|
||
* clc
|
||
sbc #'A'-11 cc so A->10 (11-CC)
|
||
clc
|
||
|
||
.8 and #$0F
|
||
rts
|
||
*--------------------------------------
|
||
MEM.SetKeyCharY sta CLRWRITEAUX
|
||
sta (ZPSListKeyPtr),y
|
||
sta SETWRITEAUX
|
||
rts
|
||
*--------------------------------------
|
||
MEM.GetDataByte sta CLRREADAUX
|
||
lda (ZPSListDataPtr)
|
||
sta SETREADAUX
|
||
bra MEM.SetDataByte.1
|
||
*--------------------------------------
|
||
MEM.SetDataByte sta CLRWRITEAUX
|
||
sta (ZPSListDataPtr)
|
||
sta SETWRITEAUX
|
||
MEM.SetDataByte.1
|
||
inc ZPSListDataPtr
|
||
bne .8
|
||
inc ZPSListDataPtr+1
|
||
.8 rts
|
||
*--------------------------------------
|
||
MEM.TXTPTR.GetNext
|
||
sta CLRREADAUX
|
||
lda (TXTPTR)
|
||
sta SETREADAUX
|
||
beq .9
|
||
inc TXTPTR
|
||
bne .9
|
||
inc TXTPTR+1
|
||
.9 rts
|
||
*--------------------------------------
|
||
MEM.PullP1P2P3 sec
|
||
.HS 90 bcc
|
||
MEM.PullP1P2 clc
|
||
>PULLW ZPPtr1
|
||
>PULLW ZPPtr2
|
||
bcc .9
|
||
>PULLW ZPPtr3
|
||
.9 rts
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE /A2OSX.SRC/SYS/KERNEL.S.MEM
|
||
LOAD /A2OSX.SRC/SYS/KERNEL.S
|
||
ASM
|