A2osX/SYS/KERNEL.S.MEM.txt

611 lines
12 KiB
Plaintext
Raw Normal View History

2015-03-14 21:48:35 +00:00
PR#3
PREFIX /A2OSX.BUILD
LOMEM $A00
2015-03-14 21:48:35 +00:00
INC 1
AUTO 6
*--------------------------------------
2017-01-12 17:43:45 +00:00
* !!!!!! DO NOT USE ZPPtrs !!!!!
2015-03-14 21:48:35 +00:00
*--------------------------------------
2016-08-17 06:25:58 +00:00
ZPMemMgrSPtr .EQ ZPMEMMGR Pointer To Slot selected
ZPMemMgrTmp1 .EQ ZPMEMMGR+2
MemMgr.ReqSize .EQ ZPMEMMGR+4 store requested Size
MemMgr.ReqFlags .EQ ZPMEMMGR+6 store requested Flags
2015-03-14 21:48:35 +00:00
*--------------------------------------
* TODO :
2015-06-03 18:30:57 +00:00
* - Create a 256 bytes table
2015-03-14 21:48:35 +00:00
* mapping hMem's to real memory blocks to help
* Garbage collector move blocks
2015-06-03 18:30:57 +00:00
* - mem.ID=0 always used! useful to test if hMem=0
2015-03-14 21:48:35 +00:00
*--------------------------------------
* PUBLIC
*/--------------------------------------
* # GetMem
* ## In:
* PUSHW = Size Requested
* PUSHB = Options
* S.MEM.F.INIT0 : init memory with 00
* S.MEM.F.ALIGN : page aligned
* ## Out:
* CC : success
2015-03-14 21:48:35 +00:00
* YA = PTR to Mem
* X = hMem
* CS :
* A = EC
*\--------------------------------------
2016-09-21 15:20:37 +00:00
K.GetMem >PULLB MemMgr.ReqFlags store requested flags
2015-06-03 18:30:57 +00:00
clc
>PULLA get requested size LO
bit #$0F 16 bytes aligned ?
beq .1 yes, request it
2015-06-03 18:30:57 +00:00
and #$F0 align on 16 bytes
2015-03-14 21:48:35 +00:00
adc #$10
2015-06-03 18:30:57 +00:00
.1 sta MemMgr.ReqSize
>PULLA get requested size HI
adc #0
sta MemMgr.ReqSize+1
bit MemMgr.ReqFlags S.MEM.F.AUX ?
bpl K.GetMem.I
and #S.MEM.F.AUX
beq .1
sta SETREADAUX Aux Mem requested,switch to AUX
sta SETWRITEAUX
jsr K.GetMem.I
sta CLRREADAUX
sta CLRWRITEAUX
.9 rts
*/--------------------------------------
* # GetMem0.YA
* ## In:
* Y,A = Size Requested
* ## Out:
* CC : success
* YA = PTR to Mem (ZERO Initialised)
* X = hMem
* CS :
* A = EC
*\--------------------------------------
K.GetMem0.YA ldx #S.MEM.F.INIT0
stx MemMgr.ReqFlags
.HS 2C bit abs
*/--------------------------------------
* # GetMem.YA
* ## In:
* Y,A = Size Requested
* ## Out:
* CC : success
* YA = PTR to Mem (Uninitialised)
* X = hMem
* CS :
* A = EC
*\--------------------------------------
K.GetMem.YA stz MemMgr.ReqFlags
sta MemMgr.ReqSize+1
tya
bit #$0F 16 bytes aligned ?
beq .1 yes, request it
and #$F0 align on 16 bytes
clc
adc #$10
bcc .1
inc MemMgr.ReqSize+1
.1 sta MemMgr.ReqSize
K.GetMem.I >LDYAI MemMgr.Table
2015-06-03 18:30:57 +00:00
>STYA ZPMemMgrSPtr
ldx #0 Current slot=0
2015-03-15 22:00:40 +00:00
bra .4 skip slot 0, Check if some free slot to reuse first
2015-06-03 18:30:57 +00:00
.1 inx move to next slot
jsr MemMgr.NextSlot
2015-03-14 21:48:35 +00:00
lda (ZPMemMgrSPtr) Get Flags
bmi .4 in use ?
2015-06-03 18:30:57 +00:00
.2 lda MemMgr.ReqFlags Found an empty slot
2015-03-14 21:48:35 +00:00
and #S.MEM.F.ALIGN is request needs a page align ?
beq .3
2015-06-03 18:30:57 +00:00
2015-03-14 21:48:35 +00:00
ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y get LO of PTR
bne .4 not page-aligned
2015-06-03 18:30:57 +00:00
2015-03-14 21:48:35 +00:00
.3 ldy #S.MEM.LEN
lda (ZPMemMgrSPtr),y get LEN of this block
2015-06-03 18:30:57 +00:00
cmp MemMgr.ReqSize compare with requested size
2015-03-14 21:48:35 +00:00
bne .4
2015-06-03 18:30:57 +00:00
2015-03-14 21:48:35 +00:00
iny
lda (ZPMemMgrSPtr),y
2015-06-03 18:30:57 +00:00
cmp MemMgr.ReqSize+1
beq .7 requested size matches slot size !!!
.4 cpx MemMgr.LastSlot any other slot to check?
2015-06-03 18:30:57 +00:00
bne .1 last one, create a new slot
2015-06-03 18:30:57 +00:00
*-------------- Create a New SLOT
lda MemMgr.ReqFlags
2015-06-03 18:30:57 +00:00
and #S.MEM.F.ALIGN is request needs a page align ?
beq .6
lda MemMgr.Free target PTR will be page aligned ?
sec
sbc MemMgr.ReqSize
beq .6 yes, allocate
tay no, reserve a free slot to fill gap
lda #0
jsr MemMgr.AddSlot X = new slot
bcs .9
.6 >LDYA MemMgr.ReqSize
jsr MemMgr.AddSlot X = new slot
bcs .9
2015-03-14 21:48:35 +00:00
*-------------- Reuse this SLOT
2015-06-03 18:30:57 +00:00
.7 lda MemMgr.ReqFlags get requested flags
2015-03-14 21:48:35 +00:00
ora #S.MEM.F.INUSE mark as in use
sta (ZPMemMgrSPtr)
2015-03-15 22:00:40 +00:00
2015-06-03 18:30:57 +00:00
and #S.MEM.F.INIT0
beq .8
jsr MemMgr.Init0 X not modified
2015-06-03 18:30:57 +00:00
.8 lda #0
2015-03-14 21:48:35 +00:00
ldy #S.MEM.BIN
sta (ZPMemMgrSPtr),y
2015-06-03 18:30:57 +00:00
inc Mark this slot used by one process
2015-03-14 21:48:35 +00:00
ldy #S.MEM.REFCNT
sta (ZPMemMgrSPtr),y
2015-03-15 22:00:40 +00:00
ldy #S.PS.PID
2015-06-03 18:30:57 +00:00
lda (pPs),y
2015-03-14 21:48:35 +00:00
ldy #S.MEM.OWNERPID
sta (ZPMemMgrSPtr),y
2015-03-15 22:00:40 +00:00
2015-03-14 21:48:35 +00:00
ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y
pha
iny
lda (ZPMemMgrSPtr),y A = HI PTR
ply Y = LO PTR
clc X = Current hMem
2015-03-15 22:00:40 +00:00
.9 rts
2015-06-03 18:30:57 +00:00
*--------------------------------------
* MemMgr.AddSlot
* In:
* Y,A = Requested size
* Out:
*--------------------------------------
MemMgr.AddSlot >STYA ZPMemMgrTmp1 save req size
ldx MemMgr.LastSlot
inx
beq .99 > 255 ERR:OUT OF SLOT
lda MemMgr.Free Compute base PTR=FREE-REQ size
2015-03-14 21:48:35 +00:00
sec
2015-06-03 18:30:57 +00:00
sbc ZPMemMgrTmp1
tay save new MemMgr.Free LO
2015-06-03 18:30:57 +00:00
lda MemMgr.Free+1
sbc ZPMemMgrTmp1+1
pha save new MemMgr.Free HI
2015-06-03 18:30:57 +00:00
cpy MemMgr.LoMem
2015-06-03 18:30:57 +00:00
sbc MemMgr.LoMem+1
bcc .98 ERR out of mem
jsr MemMgr.NextSlot X,Y unmodified
tya get back MemMgr.Free LO
2015-03-15 22:00:40 +00:00
2015-06-03 18:30:57 +00:00
ldy #S.MEM.PTR
sta MemMgr.Free set as system MemMgr.Free value
sta (ZPMemMgrSPtr),y store is as base address of new slot
iny
pla get back MemMgr.Free HI
2015-06-03 18:30:57 +00:00
sta MemMgr.Free+1
2015-03-14 21:48:35 +00:00
sta (ZPMemMgrSPtr),y
2015-06-03 18:30:57 +00:00
iny
lda ZPMemMgrTmp1 get requested size
sta (ZPMemMgrSPtr),y setup slot LEN
iny
lda ZPMemMgrTmp1+1
2015-03-14 21:48:35 +00:00
sta (ZPMemMgrSPtr),y
2015-06-03 18:30:57 +00:00
stx MemMgr.LastSlot mark this slot allocated
2015-03-14 21:48:35 +00:00
clc
rts
2015-06-03 18:30:57 +00:00
.98 pla discard new MemMgr.Free HI
lda #MemMgr.ERROOM
2015-06-03 18:30:57 +00:00
sec
2015-03-14 21:48:35 +00:00
rts
2015-06-03 18:30:57 +00:00
.99 lda #MemMgr.ERROOH
sec
rts
*--------------------------------------
MemMgr.NextSlot lda ZPMemMgrSPtr
clc
adc #S.MEM
2015-06-03 18:30:57 +00:00
sta ZPMemMgrSPtr
bcc .8
inc ZPMemMgrSPtr+1
.8 rts
*--------------------------------------
MemMgr.Init0 ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y ZPMemMgrSPtr already set
sta .2+1
2015-06-03 18:30:57 +00:00
iny
lda (ZPMemMgrSPtr),y
sta .2+2
2015-06-03 18:30:57 +00:00
ldy #S.MEM.LEN
lda (ZPMemMgrSPtr),y
eor #$ff
pha
2015-06-03 18:30:57 +00:00
iny
lda (ZPMemMgrSPtr),y
eor #$ff a=not hi count
ply y=not lo count
2015-06-03 18:30:57 +00:00
phx
ldx #0
.1 iny
2015-06-03 18:30:57 +00:00
bne .2
inc
beq .8
.2 stz $ffff,x
inx
bne .1
inc .2+2
2015-06-03 18:30:57 +00:00
bne .1
.8 plx
rts
*/--------------------------------------
* # FreeMem.A
* ## In:
2015-03-14 21:48:35 +00:00
* A = hMem To Free
* ## Out:
* none.
* (X,Y unmodified)
*\--------------------------------------
K.FreeMem.A phy
tay
beq * Slot=0, reserved by Kernel
2015-06-03 18:30:57 +00:00
jsr K.GetMemByID.A X unmodified
2015-03-14 21:48:35 +00:00
lda (ZPMemMgrSPtr)
bpl .9 In use ?
2015-03-14 21:48:35 +00:00
2015-03-15 22:00:40 +00:00
ldy #S.MEM.REFCNT
2015-03-14 21:48:35 +00:00
lda (ZPMemMgrSPtr),y Get count of those referencing this hMem
dec only one left ?
sta (ZPMemMgrSPtr),y
2015-06-03 18:30:57 +00:00
bne .8 no, must be a code segment loaded several times
2015-03-14 21:48:35 +00:00
lda #0 mark this slot as free
sta (ZPMemMgrSPtr)
2015-03-14 21:48:35 +00:00
ldy #S.MEM.BIN
lda (ZPMemMgrSPtr),y Any BINPATH to discard ?
2015-06-03 18:30:57 +00:00
beq .1
2015-03-14 21:48:35 +00:00
jsr K.GetMemByID.A X unmodified
2015-03-14 21:48:35 +00:00
lda (ZPMemMgrSPtr)
2015-06-03 18:30:57 +00:00
bpl * ***MUST BE ALLOCATED***
2015-03-14 21:48:35 +00:00
2015-06-03 18:30:57 +00:00
lda #0 mark BINPATH slot as free
2015-03-14 21:48:35 +00:00
sta (ZPMemMgrSPtr)
.1 lda MemMgr.LastSlot
2015-06-03 18:30:57 +00:00
beq .8
jsr K.GetMemByID.A X unmodified
2015-03-14 21:48:35 +00:00
lda (ZPMemMgrSPtr)
2015-06-03 18:30:57 +00:00
bmi .8
2015-03-14 21:48:35 +00:00
ldy #S.MEM.LEN
lda (ZPMemMgrSPtr),y give back LEN bytes
clc
2015-06-03 18:30:57 +00:00
adc MemMgr.Free to MemMgr.Free
sta MemMgr.Free
2015-03-14 21:48:35 +00:00
iny
lda (ZPMemMgrSPtr),y
2015-06-03 18:30:57 +00:00
adc MemMgr.Free+1
sta MemMgr.Free+1
dec MemMgr.LastSlot discard last slot
bne .1 no slot left, exit
2015-06-03 18:30:57 +00:00
.8 ply
2015-03-14 21:48:35 +00:00
clc
rts
*--------------------------------------
.9 ply discard saved Y
lda $D000
sta .91+1
bit RRAMWRAMBNK2
bit RRAMWRAMBNK2
jsr CORE.PSSelect0 Select PS0 for proper I/O devices
2017-01-12 17:43:45 +00:00
jsr DevMgr.SYS.Control
pla Get PC and sub 2 for calling address
sec
sbc #2
tay
pla
sbc #0
>PUSHYA
>LDYAI K.FreeMem.A.ERR
>SYSCALL PrintF.YA
.91 ldx #$ff
bit $C000,x
bit $C000,x
bra *
2015-03-14 21:48:35 +00:00
*--------------------------------------
K.FreeMem.A.ERR >CSTR "***MemMgr:Attempt to Free an already freed hMem at $%H"
*/--------------------------------------
* # GetMemPtr.A
* ## In:
* A = hMem
* ## Out:
* Y,A = PTR to MemBlock
* (X unmodified)
*\--------------------------------------
K.GetMemPtr.A jsr K.GetMemByID.A
2015-03-14 21:48:35 +00:00
ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y
2015-06-03 18:30:57 +00:00
pha
2015-03-14 21:48:35 +00:00
iny
lda (ZPMemMgrSPtr),y
2015-06-03 18:30:57 +00:00
ply
2015-03-14 21:48:35 +00:00
rts
*/--------------------------------------
* # GetMemByID.A
* ## In:
* A = hMem
* ## Out:
* Y,A = ZPMemMgrSPtr = PTR to S.MEM
* X unmodified
*\--------------------------------------
* Optimized for :
* MemMgr.Table is page aligned at $1800
* S.MEM is 8 bytes
2015-03-14 21:48:35 +00:00
*--------------------------------------
.DO MemMgr.Table=$1800
.ELSE
!!!!!WARNING!!!!!
.FIN
.DO S.MEM=8
.ELSE
!!!!!WARNING!!!!!
.FIN
*--------------------------------------
K.GetMemByID.A sta ZPMemMgrSPtr
lda /MemMgr.Table/8
asl ZPMemMgrSPtr
rol
asl ZPMemMgrSPtr
rol
asl ZPMemMgrSPtr
rol
2015-03-14 21:48:35 +00:00
sta ZPMemMgrSPtr+1
ldy ZPMemMgrSPtr
2015-03-14 21:48:35 +00:00
rts
*--------------------------------------
* OLD CODE
*--------------------------------------
* stz ZPMemMgrSPtr+1
* asl
* rol ZPMemMgrSPtr+1
* asl
* rol ZPMemMgrSPtr+1
* asl
* rol ZPMemMgrSPtr+1
** clc IMPLICIT
* adc #MemMgr.Table
* tay
* lda ZPMemMgrSPtr+1
* adc /MemMgr.Table
* sty ZPMemMgrSPtr
* sta ZPMemMgrSPtr+1
* rts
*/--------------------------------------
* # NewStr.YA
* 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.YA >STYA .1+1
>STYA .4+1
ldy #0
stz MemMgr.ReqFlags
stz MemMgr.ReqSize+1
.1 lda $ffff,y
beq .2
iny
bne .1
inc MemMgr.ReqSize+1
inc .1+2
bne .1
.2 iny
bne .3
inc MemMgr.ReqSize+1
.3 sty MemMgr.ReqSize
jsr K.GetMem.I
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
*--------------------------------------
K.LoadStkObj.YA
*--------------------------------------
K.GetStkObj.A
*--------------------------------------
K.FreeStkObj.A
*--------------------------------------
K.SetLoMem
clc
rts
*/--------------------------------------
* # GetMemStat.YA
* ## In:
* Y,A = Ptr to 24 bytes buffer
* ## Out:
* Buffer filled with memory stats
*\--------------------------------------
K.GetMemStat.YA >STYA ZPMemMgrTmp1
ldy #6
.1 lda MemMgr.Table,y
sta (ZPMemMgrTmp1),y
dey
bpl .1
ldx #6
ldy #14
sta SETREADAUX
.2 lda MemMgr.Table,x
sta (ZPMemMgrTmp1),y
dey
dex
bpl .2
sta CLRREADAUX
ldx #6
ldy #22
.3 lda DevMgr.Stat,x
sta (ZPMemMgrTmp1),y
dey
dex
bpl .3
rts
*--------------------------------------
2015-03-14 21:48:35 +00:00
* In:
* Y,A = BINPATH (C-String)
2015-03-14 21:48:35 +00:00
* Out:
* Y,A = ZPMemMgrSPtr = PTR to S.MEM
* X = hMem
*--------------------------------------
MEM.GetMemByNameYA
ldx MemMgr.LastSlot
beq .9
>STYA .2+1
>LDYAI MemMgr.Table
>STYA ZPMemMgrTmp1
2015-03-14 21:48:35 +00:00
ldx #0
2015-06-03 18:30:57 +00:00
.1 lda (ZPMemMgrTmp1)
2015-03-14 21:48:35 +00:00
bpl .6 In Use?
2015-06-03 18:30:57 +00:00
2015-03-14 21:48:35 +00:00
ldy #S.MEM.BIN any BIN PATH in this slot?
lda (ZPMemMgrTmp1),y
2015-03-14 21:48:35 +00:00
beq .6
2015-06-03 18:30:57 +00:00
jsr K.GetMemPtr.A get pathname
>STYA .3+1
ldy #0
2015-06-03 18:30:57 +00:00
.2 lda $ffff,y
.3 cmp $ffff,y
2015-03-14 21:48:35 +00:00
bne .6
iny
ora #0
2015-03-14 21:48:35 +00:00
bne .2
2015-06-03 18:30:57 +00:00
>LDYA ZPMemMgrTmp1
2015-03-14 21:48:35 +00:00
clc
rts
2015-06-03 18:30:57 +00:00
.6 lda ZPMemMgrTmp1
2015-03-14 21:48:35 +00:00
clc
adc #S.MEM
sta ZPMemMgrTmp1
bcc .7
inc ZPMemMgrTmp1+1
.7 inx
cpx MemMgr.LastSlot
bne .1
2015-06-03 18:30:57 +00:00
.9 sec
2015-03-14 21:48:35 +00:00
rts
*--------------------------------------
MEM.GarbageCollector
clc
rts
*--------------------------------------
2015-03-14 21:48:35 +00:00
MAN
SAVE /A2OSX.SRC/SYS/KERNEL.S.MEM
LOAD /A2OSX.SRC/SYS/KERNEL.S
2015-03-14 21:48:35 +00:00
ASM