A2osX/SYS/KERNEL.S.MEM.txt

695 lines
14 KiB
Plaintext
Raw Permalink Normal View History

2017-12-22 21:24:30 +00:00
NEW
2019-05-25 19:24:07 +00:00
AUTO 3,1
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
ZPMemMgrSize .EQ ZPMEMMGR+4
2020-05-17 17:34:32 +00:00
MEM.ReqFlags .EQ ZPMEMMGR+6 store requested Flags
MEM.BestSlot .EQ ZPMEMMGR+7
2019-02-01 20:01:54 +00:00
MEM.BestScore .EQ ZPMemMgrTmp1
2020-01-31 16:12:25 +00:00
*/--------------------------------------
* # Realloc
* ## C
* `void *realloc(short int hMem, int size);`
* ## ASM
* `>PUSHB hMem`
* `>PUSHW size`
* `>SYSCALL realloc`
* ## RETURN VALUE
* YA = ptr
* X = hMem
*\--------------------------------------
2023-10-18 05:41:12 +00:00
K.Realloc >PULLA
sta .1+1 New Size LO
2023-10-18 05:41:12 +00:00
>PULLA
sta .2+1 New Size HI
2020-02-03 15:17:34 +00:00
2020-03-05 16:55:02 +00:00
>PULLA Src hMem
2020-08-12 19:31:36 +00:00
tax
2020-01-31 16:12:25 +00:00
jsr MEM.GetMemByID
ldy #S.MEM.LEN
lda (ZPMemMgrSPtr),y
pha
iny
lda (ZPMemMgrSPtr),y
ply
2020-02-02 14:58:01 +00:00
2020-02-12 14:42:07 +00:00
jsr MEM.MoveToAux x = Src hMem, YA = Old size
2020-01-31 16:12:25 +00:00
bcs .99
2020-02-12 14:42:07 +00:00
stx .7+1 Aux hMem
2020-01-31 16:12:25 +00:00
2023-10-18 05:41:12 +00:00
.1 ldy #$FF SELF MODIFIED
.2 lda #$FF SELF MODIFIED
2020-02-12 14:42:07 +00:00
>STYA A2L size for MoveSetupA1A2
2020-01-31 16:12:25 +00:00
jsr K.getmem
bcs .99
2020-02-12 14:42:07 +00:00
stx .8+1 new main hMem to return
>STYA A4L Save MAIN Ptr
lda .7+1
2023-11-04 14:42:28 +00:00
sta IO.SETREADAUX
2020-12-15 13:23:22 +00:00
jsr MEM.SetA1A2 Setup AUX base & End Ptrs
2023-11-04 14:42:28 +00:00
sta IO.CLRREADAUX
2020-09-10 10:43:37 +00:00
2020-02-12 14:42:07 +00:00
clc Aux To Main
2020-12-15 13:23:22 +00:00
jsr XMov
2020-01-31 16:12:25 +00:00
2020-02-12 14:42:07 +00:00
.7 lda #$ff SELF MODIFIED
>SYSCALL2 FreeStkObj
2020-01-31 16:12:25 +00:00
.8 lda #$ff SELF MODIFIED
2020-02-12 14:42:07 +00:00
tax X = new hMem
2020-02-03 15:17:34 +00:00
jmp k.GetMemPtr YA = new ptr
2020-01-31 16:12:25 +00:00
2020-02-03 15:17:34 +00:00
.99 rts
*/--------------------------------------
2018-06-18 06:22:50 +00:00
* # GetMem
* Y,A = Size Requested
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
* CC : success
* YA = PTR to Mem (Uninitialised)
* X = hMem
* CS :
* A = EC
*\--------------------------------------
2020-01-31 16:12:25 +00:00
K.GetMem0 ldx #S.MEM.F.INIT0
.HS 2C BIT ABS
2018-06-18 06:22:50 +00:00
K.GetMem ldx #0
2019-01-21 14:51:10 +00:00
MEM.GetMem.YAX stx MEM.ReqFlags
sta ZPMemMgrSize+1
tya
2019-01-17 20:43:29 +00:00
bit #K.MEM.ALIGN-1 aligned ?
beq .10 yes, request it
2019-11-15 14:40:48 +00:00
2019-01-17 20:43:29 +00:00
and #K.MEM.nALIGNm1 align on boundary
clc
2019-01-17 20:43:29 +00:00
adc #K.MEM.ALIGN
bcc .10
2019-11-15 14:40:48 +00:00
inc ZPMemMgrSize+1
2019-11-15 14:40:48 +00:00
.10 sta ZPMemMgrSize
>LDYAI Mem.Table
2015-06-03 18:30:57 +00:00
>STYA ZPMemMgrSPtr
2019-01-21 14:51:10 +00:00
stz MEM.BestSlot
ldx #$ff
stx MEM.BestScore
stx MEM.BestScore+1
2015-06-03 18:30:57 +00:00
ldx #0 Current slot=0
bra .4 skip slot 0, Check if some free slot to reuse first
2019-11-15 14:40:48 +00:00
2015-06-03 18:30:57 +00:00
.1 inx move to next slot
jsr Mem.NextSlot
2015-03-14 21:48:35 +00:00
lda (ZPMemMgrSPtr) Get Flags
bmi .4 in use ?
2019-11-15 14:40:48 +00:00
2019-01-21 14:51:10 +00:00
.2 lda MEM.ReqFlags Found an empty slot
2019-11-15 14:40:48 +00:00
bit #S.MEM.F.NOCROSS
beq .21
ldy ZPMemMgrSize+1 > 255, not applicable
bne .22 Align to page if $100
2015-03-14 21:48:35 +00:00
ldy #S.MEM.PTR
2019-11-15 14:40:48 +00:00
lda (ZPMemMgrSPtr),y get LO of PTR
clc
adc ZPMemMgrSize
bcs .4 cross page boundary....
lda MEM.ReqFlags get back flags to test if match
.21 bit #S.MEM.F.ALIGN is request needs a page align ?
beq .3
.22 ldy #S.MEM.PTR
2015-03-14 21:48:35 +00:00
lda (ZPMemMgrSPtr),y get LO of PTR
bne .4 not page-aligned
2019-11-15 14:40:48 +00:00
2015-03-14 21:48:35 +00:00
.3 ldy #S.MEM.LEN
2019-01-21 14:51:10 +00:00
sec
2015-03-14 21:48:35 +00:00
lda (ZPMemMgrSPtr),y get LEN of this block
2019-01-21 14:51:10 +00:00
sbc ZPMemMgrSize compare with requested size
pha
2015-03-14 21:48:35 +00:00
iny
lda (ZPMemMgrSPtr),y
2019-01-21 14:51:10 +00:00
sbc ZPMemMgrSize+1
ply Y,A = SlotLen - ReqSize
bcc .4 req size > slot size
cpy MEM.BestScore
pha
sbc MEM.BestScore+1
pla
bcs .4 Delta is >= BestScore
bne .4 Delta is > 255...
2019-11-15 14:40:48 +00:00
2019-01-21 14:51:10 +00:00
sty MEM.BestScore
sta MEM.BestScore+1
stx MEM.BestSlot
.4 cpx Mem.LastSlot any other slot to check?
2015-06-03 18:30:57 +00:00
bne .1 last one, create a new slot
2019-07-31 15:10:59 +00:00
2019-01-21 14:51:10 +00:00
lda MEM.BestSlot
beq .5
tax
2019-01-30 06:20:13 +00:00
jsr MEM.GetMemByID
2019-01-21 14:51:10 +00:00
bra .7
2015-06-03 18:30:57 +00:00
*-------------- Create a New SLOT
2018-08-20 15:15:37 +00:00
2019-01-21 14:51:10 +00:00
.5 lda MEM.ReqFlags
2019-11-15 14:40:48 +00:00
bit #S.MEM.F.NOCROSS
beq .51
lda ZPMemMgrSize+1 > 255, not applicable
bne .52 Align to page if $100
2019-11-20 10:08:49 +00:00
2019-11-15 14:40:48 +00:00
lda Mem.Free target PTR will be in same page ?
2020-01-18 19:37:32 +00:00
beq .6 Memfree is xx00, will be in same page
2019-11-15 14:40:48 +00:00
cmp ZPMemMgrSize
bcs .6 yes, allocate
tay no, reserve a free slot to fill gap
lda #0
jsr Mem.AddSlot X = new slot
bcs .9
lda #S.MEM.F.NOCROSS Make sure marked FREE
sta (ZPMemMgrSPtr)
bra .6
.51 bit #S.MEM.F.ALIGN is request needs a page align ?
2015-06-03 18:30:57 +00:00
beq .6
2019-11-15 14:40:48 +00:00
.52 lda Mem.Free target PTR will be page aligned ?
2015-06-03 18:30:57 +00:00
sec
sbc ZPMemMgrSize
2015-06-03 18:30:57 +00:00
beq .6 yes, allocate
2019-11-15 14:40:48 +00:00
2015-06-03 18:30:57 +00:00
tay no, reserve a free slot to fill gap
lda #0
jsr Mem.AddSlot X = new slot
2015-06-03 18:30:57 +00:00
bcs .9
2019-11-15 14:40:48 +00:00
2018-08-21 13:12:47 +00:00
lda #S.MEM.F.ALIGN Make sure marked FREE
sta (ZPMemMgrSPtr)
2019-11-15 14:40:48 +00:00
.6 >LDYA ZPMemMgrSize
jsr Mem.AddSlot X = new slot
2015-06-03 18:30:57 +00:00
bcs .9
2015-03-14 21:48:35 +00:00
*-------------- Reuse this SLOT
2019-01-21 14:51:10 +00:00
.7 lda MEM.ReqFlags get requested flags
2015-03-14 21:48:35 +00:00
ora #S.MEM.F.INUSE mark as in use
sta (ZPMemMgrSPtr)
2015-06-03 18:30:57 +00:00
and #S.MEM.F.INIT0
beq .8
2019-11-15 14:40:48 +00:00
jsr MEM.Init0
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
2020-03-04 16:38:32 +00:00
2023-11-04 14:42:28 +00:00
lda IO.RDREADAUX
2020-03-04 16:38:32 +00:00
pha
2023-11-04 14:42:28 +00:00
sta IO.CLRREADAUX
2020-03-04 16:38:32 +00:00
ldy #S.PS.PID
2020-02-28 07:21:46 +00:00
lda (pPS),y
2020-03-04 16:38:32 +00:00
2015-03-14 21:48:35 +00:00
ldy #S.MEM.OWNERPID
sta (ZPMemMgrSPtr),y
2020-03-04 16:38:32 +00:00
pla
bpl .80
2023-11-04 14:42:28 +00:00
sta IO.SETREADAUX
2020-03-04 16:38:32 +00:00
.80 clc
2019-02-03 21:58:26 +00:00
jmp MEM.GetMEMPTR
2018-12-20 16:23:43 +00:00
* A = HI PTR,Y = LO PTR,X = Current hMem
2019-10-03 06:25:27 +00:00
.9 rts
2015-06-03 18:30:57 +00:00
*--------------------------------------
* Mem.AddSlot
2015-06-03 18:30:57 +00:00
* In:
* Y,A = Requested size
* Out:
*--------------------------------------
2017-10-27 14:56:46 +00:00
Mem.AddSlot >STYA ZPMemMgrTmp1 save req size
2018-08-11 10:57:57 +00:00
ldx Mem.LastSlot
2015-06-03 18:30:57 +00:00
inx
beq .99 > 255 ERR:OUT OF SLOT
2019-11-15 14:40:48 +00:00
lda Mem.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 Mem.Free LO
lda Mem.Free+1
2015-06-03 18:30:57 +00:00
sbc ZPMemMgrTmp1+1
2019-10-03 06:25:27 +00:00
pha save new Mem.Free HI
cpy Mem.LoMem
sbc Mem.LoMem+1
2015-06-03 18:30:57 +00:00
bcc .98 ERR out of mem
jsr Mem.NextSlot X,Y unmodified
tya get back Mem.Free LO
2015-06-03 18:30:57 +00:00
ldy #S.MEM.PTR
sta Mem.Free set as system Mem.Free value
2018-08-11 10:57:57 +00:00
sta (ZPMemMgrSPtr),y store it as base address of new slot
2015-06-03 18:30:57 +00:00
iny
pla get back Mem.Free HI
sta Mem.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 Mem.LastSlot mark this slot allocated
2015-03-14 21:48:35 +00:00
clc
rts
.98 pla discard new Mem.Free HI
2019-11-15 14:40:48 +00:00
2018-10-21 20:54:07 +00:00
.99 lda #E.OOM
2015-06-03 18:30:57 +00:00
sec
rts
*--------------------------------------
2018-12-20 16:23:43 +00:00
MEM.NextSlot lda ZPMemMgrSPtr
2015-06-03 18:30:57 +00:00
clc
adc #S.MEM
2015-06-03 18:30:57 +00:00
sta ZPMemMgrSPtr
bcc .8
2015-06-03 18:30:57 +00:00
inc ZPMemMgrSPtr+1
2019-11-15 14:40:48 +00:00
.8 rts
*--------------------------------------
MEM.Init0 phx
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
ldx #0
.11 iny
bne .12
inc
beq .13
.12 stz $ffff,x
inx
bne .11
inc .12+2
bra .11
.13 plx
rts
2023-10-18 05:41:12 +00:00
*--------------------------------------
DEV.FreeFD.8 clc
rts
DEV.FreeFD ldx IO.hFD
lda FDs.pHI-1,x
cmp #$C0
bcs DEV.FreeFD.8
stz FDs.pHI-1,x
ldy FDs.pLO-1,x
*/--------------------------------------
* # Free
* Y,A = Ptr To Free
* ## RETURN VALUE
* none.
* (X unmodified)
*\--------------------------------------
K.Free >STYA ZPMemMgrTmp1
ldx Mem.LastSlot
.1 txa
jsr MEM.GetMemByID
ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y
cmp ZPMemMgrTmp1
bne .2
iny
lda (ZPMemMgrSPtr),y
cmp ZPMemMgrTmp1+1
beq MEM.FreeMem
.2 dex
bne .1
sec
rts
*/--------------------------------------
2018-06-18 06:22:50 +00:00
* # FreeMem
2015-03-14 21:48:35 +00:00
* A = hMem To Free
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
* none.
2018-08-21 13:12:47 +00:00
* (X unmodified)
*\--------------------------------------
2021-07-10 19:09:43 +00:00
K.FreeMem.ERR >PUSHWI .1
2020-02-16 20:45:16 +00:00
tya hMem n Y
>PUSHA
2023-01-17 06:31:23 +00:00
2019-02-11 16:44:56 +00:00
ldy #S.PS.PID
2018-11-26 16:36:55 +00:00
lda (pPS),y
2019-02-11 16:44:56 +00:00
>PUSHA
>PUSHBI 2
2020-02-16 20:45:16 +00:00
>SYSCALL2 PrintF
2023-10-18 05:41:12 +00:00
* >DEBUG
2019-06-07 15:02:51 +00:00
lda #E.INVH
2018-11-26 16:36:55 +00:00
sec
rts
2021-07-10 19:09:43 +00:00
.1 .CZ "Free(%h),PID=%d\r\n"
2018-11-26 16:36:55 +00:00
*--------------------------------------
K.FreeMem tay
2019-02-11 16:44:56 +00:00
beq K.FreeMem.ERR Slot=0, reserved by Kernel
2018-08-20 15:15:37 +00:00
cmp Mem.LastSlot
bcc .1
2020-02-16 20:45:16 +00:00
2019-02-11 16:44:56 +00:00
bne K.FreeMem.ERR
2020-02-16 20:45:16 +00:00
.1 jsr MEM.GetMemByID X,Y unmodified
*--------------------------------------
MEM.FreeMem lda (ZPMemMgrSPtr) In use ?
2019-02-11 16:44:56 +00:00
bpl K.FreeMem.ERR
2021-05-15 14:35:24 +00:00
ldy #S.MEM.REFCNT
lda (ZPMemMgrSPtr),y
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
2020-02-16 20:45:16 +00:00
2018-08-21 13:12:47 +00:00
lda (ZPMemMgrSPtr)
2020-03-06 16:20:29 +00:00
and #$7f keep flags for memdump
2018-08-21 13:12:47 +00:00
sta (ZPMemMgrSPtr) Mark as FREE
2020-03-06 16:20:29 +00:00
and #S.MEM.F.CODE CS: Any BINPATH to discard ?
2015-06-03 18:30:57 +00:00
beq .1
2020-02-16 20:45:16 +00:00
2018-08-21 13:12:47 +00:00
ldy #S.MEM.BIN
lda (ZPMemMgrSPtr),y
2019-01-30 06:20:13 +00:00
jsr MEM.GetMemByID X unmodified
2019-07-18 15:55:43 +00:00
* lda (ZPMemMgrSPtr)
* bpl * ***MUST BE ALLOCATED***
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)
2020-03-04 16:38:32 +00:00
.1 lda Mem.LastSlot
2015-06-03 18:30:57 +00:00
beq .8
2020-02-16 20:45:16 +00:00
2019-01-30 06:20:13 +00:00
jsr MEM.GetMemByID X unmodified
2015-03-14 21:48:35 +00:00
lda (ZPMemMgrSPtr)
bmi .8 used, exit
.2 dec Mem.LastSlot free! get previous....
2018-08-21 13:12:47 +00:00
beq .80 empty list: go set Mem.Free=Mem.HiMem
2020-02-16 20:45:16 +00:00
lda Mem.LastSlot
2019-01-30 06:20:13 +00:00
jsr MEM.GetMemByID X unmodified
lda (ZPMemMgrSPtr)
bpl .2 free again! loop
2020-02-16 20:45:16 +00:00
ldy #S.MEM.PTR
lda (ZPMemMgrSPtr),y set Mem.Free...
sta Mem.Free
2015-03-14 21:48:35 +00:00
iny
lda (ZPMemMgrSPtr),y
sta Mem.Free+1
2015-06-03 18:30:57 +00:00
2018-08-21 13:12:47 +00:00
.8 clc
2015-03-14 21:48:35 +00:00
rts
2020-03-04 16:38:32 +00:00
2018-08-21 13:12:47 +00:00
.80 >LDYA Mem.HiMem
>STYA Mem.Free
2018-08-21 13:12:47 +00:00
clc
rts
*/--------------------------------------
2018-06-18 06:22:50 +00:00
* # GetMemPtr
2018-08-21 13:12:47 +00:00
* A = hMem
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
2018-08-21 13:12:47 +00:00
* Y,A = PTR to MemBlock
* (X unmodified)
*\--------------------------------------
* Optimized for :
2019-03-14 16:51:02 +00:00
* Mem.Table is page aligned at $800
* S.MEM is 8 bytes
2015-03-14 21:48:35 +00:00
*--------------------------------------
2018-12-17 07:02:03 +00:00
.DO Mem.Table=$800
.ELSE
!!!!!WARNING!!!!!
.FIN
.DO S.MEM=8
.ELSE
!!!!!WARNING!!!!!
.FIN
*--------------------------------------
2019-02-01 20:01:54 +00:00
K.GetMemPtr jsr MEM.GetMemByID
2019-02-03 21:58:26 +00:00
MEM.GetMEMPTR ldy #S.MEM.PTR
2018-08-21 13:12:47 +00:00
lda (ZPMemMgrSPtr),y
pha
iny
lda (ZPMemMgrSPtr),y
ply
rts
2019-02-01 20:01:54 +00:00
*--------------------------------------
2019-01-30 06:20:13 +00:00
MEM.GetMemByID sta ZPMemMgrSPtr
lda /Mem.Table/8
asl ZPMemMgrSPtr
rol
asl ZPMemMgrSPtr
rol
asl ZPMemMgrSPtr
rol
2015-03-14 21:48:35 +00:00
sta ZPMemMgrSPtr+1
rts
2019-03-15 16:20:28 +00:00
*--------------------------------------
2020-09-05 18:44:58 +00:00
Mem.SetOwner lda CORE.LastPSID
2020-09-06 12:24:04 +00:00
.HS 2C BIT ABS
Mem.SetOwnerPS0 lda #0
2020-09-05 18:44:58 +00:00
ldy #S.MEM.OWNERPID
2019-07-18 15:55:43 +00:00
sta (ZPMemMgrSPtr),y
rts
*--------------------------------------
Mem.IncRefCnt ldy #S.MEM.REFCNT
lda (ZPMemMgrSPtr),y
inc
sta (ZPMemMgrSPtr),y
rts
*/--------------------------------------
2018-06-18 06:22:50 +00:00
* # NewStkObj
* Y,A = Size Requested
2018-10-11 15:23:06 +00:00
* ## RETURN VALUE
* CC : success
* YA = PTR to Mem (Uninitialised)
* X = hMem
* CS :
* A = EC
*\--------------------------------------
*/--------------------------------------
2019-06-19 15:56:59 +00:00
* # GetStkObjPtr
2019-03-15 16:20:28 +00:00
* ## ASM
* `lda hStkObj`
2019-06-19 15:56:59 +00:00
* `>SYSCALL GetStkObjPtr`
2019-03-15 16:20:28 +00:00
* ## RETURN VALUE
*\--------------------------------------
2019-06-19 15:56:59 +00:00
*/--------------------------------------
* # FreeStkObj
* A = hMem To Free (AUX Memory)
* ## RETURN VALUE
* none.
* (X,Y unmodified)
*\--------------------------------------
2020-02-03 16:05:54 +00:00
*--------------------------------------
2023-11-04 14:42:28 +00:00
MEM.DupX sta IO.SETREADAUX
sta IO.SETWRITEAUX
2020-02-03 16:05:54 +00:00
jsr MEM.Dup
2023-11-04 14:42:28 +00:00
sta IO.CLRREADAUX
sta IO.CLRWRITEAUX
2020-02-03 16:05:54 +00:00
rts
*--------------------------------------
MEM.Dup jsr K.GetMemPtr
>STYA A1L
ldy #S.MEM.LEN
lda (ZPMemMgrSPtr),y
pha
eor #$ff
sta A4L
iny
lda (ZPMemMgrSPtr),y
eor #$ff
sta A4L+1
eor #$ff
ply
2020-08-12 19:31:36 +00:00
MEM.DupA1LnA4L jsr K.GetMem
bcs MEM.Dup.RTS
2020-02-03 16:05:54 +00:00
>STYA A2L
ldy #0
.1 inc A4L
bne .2
inc A4L+1
beq .8
.2 lda (A1L),y
sta (A2L),y
iny
bne .1
inc A1L+1
inc A2L+1
bra .1
.8 txa
2020-08-12 19:31:36 +00:00
* clc
2020-02-16 20:45:16 +00:00
MEM.Dup.RTS rts
2020-02-03 16:05:54 +00:00
*--------------------------------------
2020-02-02 14:58:01 +00:00
MEM.CopyToMain clc
.HS B0 BCS
MEM.MoveToMain sec
ror .1+1
stx .2+1 Save AUX hMem
>STYA A2L Save LEN to copy/move
2020-01-31 16:12:25 +00:00
2023-11-04 14:42:28 +00:00
sta IO.CLRREADAUX Make sure MAIN !!!!
sta IO.CLRWRITEAUX
2020-02-10 16:24:49 +00:00
jsr K.GetMem
2020-02-16 20:45:16 +00:00
bcs MEM.Dup.RTS
2020-01-31 16:12:25 +00:00
stx .8+1 Save MAIN hMem
>STYA A4L Save MAIN Ptr
2020-09-10 10:43:37 +00:00
lda .2+1 Get AUX mem Ptr
2023-11-04 14:42:28 +00:00
sta IO.SETREADAUX
2020-12-15 13:23:22 +00:00
jsr MEM.SetA1A2 Setup AUX base & End Ptrs
2023-11-04 14:42:28 +00:00
sta IO.CLRREADAUX
2020-01-31 16:12:25 +00:00
clc Aux To Main
2020-12-15 13:23:22 +00:00
jsr XMov
2020-01-31 16:12:25 +00:00
.1 lda #$ff SELF MODIFIED
2020-09-10 10:43:37 +00:00
bpl .8 Copy : dont discard AUX mem
2020-02-02 14:58:01 +00:00
.2 lda #$ff SELF MODIFIED
2020-09-10 10:43:37 +00:00
>SYSCALL2 FreeStkObj release AUX mem
2020-01-31 16:12:25 +00:00
.8 ldx #$ff Returns MAIN hMem
2020-02-02 14:58:01 +00:00
txa
jmp K.GetMemPtr Y,A = Ptr
2020-01-31 16:12:25 +00:00
*--------------------------------------
MEM.MoveToAux stx .1+1 Save MAIN hMem
>STYA A2L Save LEN to move
>SYSCALL2 NewStkObj
bcs .9
stx .8+1 Save AUX hMem
>STYA A4L Save AUX Ptr
lda .1+1
2020-12-15 13:23:22 +00:00
jsr MEM.SetA1A2 Setup MAIN base & End Ptrs
2020-01-31 16:12:25 +00:00
sec Main To Aux
2020-12-15 13:23:22 +00:00
jsr XMov
2020-01-31 16:12:25 +00:00
.1 lda #$ff SELF MODIFIED
jsr K.FreeMem release MAIN memory
.8 ldx #$ff Returns AUX hMem
* clc
.9 rts
*--------------------------------------
2020-12-15 13:23:22 +00:00
MEM.SetA1A2 jsr K.GetMemPtr
2020-09-10 10:43:37 +00:00
2020-02-11 16:32:33 +00:00
>STYA A1L Start Address
pha
tya
clc
adc A2L
tay
pla
adc A2L+1
sta A2L+1
tya
bne .1
dec A2L+1
.1 dey
sty A2L
rts
*--------------------------------------
2023-10-18 05:41:12 +00:00
MEM.GetKBuf pha
tya
clc
adc DevMgr.Free
tax
pla
adc DevMgr.Free+1
bcs .99 we crossed $FFFF, out of mem
cpx #DevMgr.HiMem
pha
sbc /DevMgr.HiMem
pla
bcs .99 No More Room...
ldy DevMgr.Free
stx DevMgr.Free
ldx DevMgr.Free+1
sta DevMgr.Free+1
txa
* clc
rts
.99 lda #E.OOM
* sec
rts
*--------------------------------------
2015-03-14 21:48:35 +00:00
MAN
2020-12-15 13:23:22 +00:00
SAVE usr/src/sys/kernel.s.mem
LOAD usr/src/sys/kernel.s
2015-03-14 21:48:35 +00:00
ASM