From 9971d9841202bf714cd355e6b4da0c1d886bc37e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 17 Jan 2018 16:31:32 +0000 Subject: [PATCH] Kernel 0.9.1 : MemMgr, added SList related API Calls --- .Docs/KERNEL.md | 52 +++-- .Floppies/A2OSX.BUILD.po | Bin 819200 -> 819200 bytes .Floppies/A2OSX.SRC.po | Bin 819200 -> 819200 bytes INC/A2osX.I.txt | 4 +- SYS/KERNEL.S.JMP.txt | 14 +- SYS/KERNEL.S.MEM.txt | 489 +++++++++++++++++++++++++++++++-------- SYS/KERNEL.S.PS.txt | 5 +- SYS/KERNEL.S.STDIO.txt | 6 +- 8 files changed, 432 insertions(+), 138 deletions(-) diff --git a/.Docs/KERNEL.md b/.Docs/KERNEL.md index f6b2185a..f4a7b29d 100644 --- a/.Docs/KERNEL.md +++ b/.Docs/KERNEL.md @@ -212,20 +212,13 @@ Return Float rounded into a long + PUSHW = X (*Float) + Y,A = Dest (*long) -# GetMem +# GetMemStat.YA -## In: -+ PUSHW = Size Requested -+ PUSHB = Options - + S.MEM.F.INIT0 : init memory with 00 - + S.MEM.F.ALIGN : page aligned +## In: ++ Y,A = Ptr to 24 bytes buffer ## Out: -+ CC : success - + YA = PTR to Mem -* X = hMem -+ CS : - + A = EC ++ Buffer filled with memory stats # GetMem0.YA @@ -291,14 +284,6 @@ Create a new copy of this C-String + CS : error + A = SYS error code -# GetMemStat.YA - -## In: -+ Y,A = Ptr to 24 bytes buffer - -## Out: -+ Buffer filled with memory stats - # SListNew ## In: @@ -306,33 +291,50 @@ Create a new copy of this C-String ## Out: + A=hMem +# SListGetByID + +## In: ++ PUSHB = hSList ++ PUSHW = KeyID ++ PUSHW = Data Ptr + +## Out: + # SListAdd ## In: ++ PUSHB = hSList ++ PUSHW = Key ++ PUSHW = Data Ptr ## Out: -+ A=hMem ++ A=hSList -# SListGet +# SListLookup ## In: ++ PUSHB = hSList ++ PUSHW = Key ++ PUSHW = Data Ptr ## Out: -+ A=hMem ++ Data Ptr Updated -# SListPut +# SListUpdate ## In: ++ PUSHB = hSList ++ PUSHW = Key ++ PUSHW = Data Ptr ## Out: -+ A=hMem # SListFree ## In: ++ A=hSList ## Out: -+ A=hMem # LoadStkObj Load a file in AUX memory (Stock Objects) diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index 7e533d3ca75357f6016cd318b69f44be1c0880b5..edf3acb6d3d60923d1b9b1f653d6a74d35759f59 100644 GIT binary patch delta 4541 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 delta 4306 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 OwK4UzvBzo+hW`i4JF|ZP diff --git a/.Floppies/A2OSX.SRC.po b/.Floppies/A2OSX.SRC.po index 8f50f7fd39d5c6c3d0ca4fce842c3be403b1e295..8937f3111633e535382037e81e3056628483b12b 100644 GIT binary patch delta 16402 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 diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index e3d3d9f9..b01bae39 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -205,7 +205,7 @@ SYS.Tan .EQ $DA SYS.ATan .EQ $DC * .EQ $DF *-------------------------------------- -SYS.GetMem .EQ $E0 +SYS.GetMemStat.YA .EQ $E0 SYS.FreeMem.A .EQ $E2 SYS.GetMemPtr.A .EQ $E4 SYS.GetMemByID.A .EQ $E6 @@ -213,7 +213,7 @@ SYS.GetMemByID.A .EQ $E6 SYS.GetMem.YA .EQ $E8 SYS.GetMem0.YA .EQ $EA SYS.NewStr.YA .EQ $EC -SYS.GetMemStat.YA .EQ $EE +* .EQ $EE * .EQ $F0 * .EQ $F2 diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index f3769cac..356cee5d 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -136,20 +136,20 @@ K.SYSCALL.JMP .DA 0 $00 *-------------------------------------- * $E000 *-------------------------------------- - .DA K.GetMem $E0 + .DA K.GetMemStat.YA $E0 .DA K.FreeMem.A .DA K.GetMemPtr.A .DA K.GetMemByID.A .DA K.GetMem.YA .DA K.GetMem0.YA .DA K.NewStr.YA - .DA K.GetMemStat.YA + .DA K.SListNew *-------------------------------------- - .DA 0 $F0 - .DA 0 - .DA 0 - .DA 0 - .DA 0 + .DA K.SListGetByID $F0 + .DA K.SListAdd + .DA K.SListLookup + .DA K.SListUpdate + .DA K.SListFree.A .DA K.LoadStkObj .DA K.NewStkObj.YA .DA K.FreeStkObj.A diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index ec8b7154..93e26180 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -6,6 +6,11 @@ ZPMemMgrSPtr .EQ ZPMEMMGR Pointer To Slot selected ZPMemMgrTmp1 .EQ ZPMEMMGR+2 Mem.ReqSize .EQ ZPMEMMGR+4 store requested Size Mem.ReqFlags .EQ ZPMEMMGR+6 store requested Flags + +ZPSListBlock .EQ ZPMEMMGR+8 +ZPSListIndex .EQ ZPMEMMGR+10 +ZPSListKey .EQ ZPMEMMGR+12 +ZPSListData .EQ ZPMEMMGR+14 *-------------------------------------- * TODO : * - Create a 256 bytes table @@ -13,40 +18,46 @@ Mem.ReqFlags .EQ ZPMEMMGR+6 store requested Flags * Garbage collector move blocks * - mem.ID=0 always used! useful to test if hMem=0 *-------------------------------------- -* PUBLIC */-------------------------------------- -* # GetMem -* ## In: -* PUSHW = Size Requested -* PUSHB = Options -* S.MEM.F.INIT0 : init memory with 00 -* S.MEM.F.ALIGN : page aligned +* # GetMemStat.YA +* ## In: +* Y,A = Ptr to 24 bytes buffer * ## Out: -* CC : success -* YA = PTR to Mem -* X = hMem -* CS : -* A = EC +* Buffer filled with memory stats *\-------------------------------------- -K.GetMem >PULLB Mem.ReqFlags store requested flags - - >PULLYA get requested size - - bit Mem.ReqFlags S.MEM.F.AUX ? - bpl K.GetMem.I - .HS 2C bit abs +K.GetMemStat.YA >STYA ZPMemMgrTmp1 -K.GetMemAux.YA stz Mem.ReqFlags - - sta SETREADAUX Aux Mem requested,switch to AUX - sta SETWRITEAUX + ldy #6 - jsr K.GetMem.I +.1 lda Mem.Table,y + sta (ZPMemMgrTmp1),y + dey + bpl .1 + + + ldx #6 + ldy #14 + + sta SETREADAUX + +.2 lda Mem.Table,x + sta (ZPMemMgrTmp1),y + dey + dex + bpl .2 sta CLRREADAUX - sta CLRWRITEAUX - rts + ldx #6 + ldy #22 + +.3 lda DevMgr.Stat,x + sta (ZPMemMgrTmp1),y + dey + dex + bpl .3 + + rts */-------------------------------------- * # GetMem0.YA * ## In: @@ -57,9 +68,8 @@ K.GetMemAux.YA stz Mem.ReqFlags * X = hMem * CS : * A = EC -*\-------------------------------------- +*\-------------------------------------- K.GetMem0.YA ldx #S.MEM.F.INIT0 - stx Mem.ReqFlags .HS 2C bit abs */-------------------------------------- * # GetMem.YA @@ -72,9 +82,10 @@ K.GetMem0.YA ldx #S.MEM.F.INIT0 * CS : * A = EC *\-------------------------------------- -K.GetMem.YA stz Mem.ReqFlags +K.GetMem.YA ldx #0 -K.GetMem.I sta Mem.ReqSize+1 +MEM.GetMem.YAX stx Mem.ReqFlags + sta Mem.ReqSize+1 tya bit #$0F 16 bytes aligned ? @@ -439,8 +450,6 @@ K.GetMemByID.A sta ZPMemMgrSPtr K.NewStr.YA >STYA .1+1 >STYA .4+1 - stz Mem.ReqFlags - ldy #0 lda #0 @@ -456,7 +465,7 @@ K.NewStr.YA >STYA .1+1 bne .3 inc -.3 jsr K.GetMem.I +.3 jsr K.GetMem.YA bcs .9 >STYA .5+1 @@ -480,95 +489,379 @@ K.NewStr.YA >STYA .1+1 clc .9 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 Mem.Table,y - sta (ZPMemMgrTmp1),y - dey - bpl .1 - - - ldx #6 - ldy #14 - - sta SETREADAUX - -.2 lda Mem.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 -*-------------------------------------- -* SList : -* Block : -* 0 hMem of next Block (0=End) -* 1....255 data records -* Record : -* 0 Flags -* 1 KeyLen+Key -* n DataLen+Data -*/-------------------------------------- * # SListNew * ## In: * ## Out: * A=hMem *\-------------------------------------- -K.SListNew +K.SListNew >LDYAI 160 40k Max before out of memory!!! + jsr K.GetMem0.YA + bcs .9 + >STYA ZPSListIndex + stx .8+1 + + >LDYAI 256 + jsr K.GetMem0.YA + bcs .9 + txa + sta (ZPSListIndex) + +.8 lda #$ff SELF MODIFIED + +.9 rts +*/-------------------------------------- +* # SListGetByID +* ## In: +* PUSHB = hSList +* PUSHW = Key Ptr +* PUSHW = Data Ptr +* PUSHW = KeyID +* ## Out: +*\-------------------------------------- +K.SListGetByID >PULLW MEM.IndexOfs + + jsr MEM.GetSListParams + + ldy MEM.IndexOfs + lda (ZPSListIndex),y + beq .9 + + jsr K.GetMemPtr.A + >STYA ZPSListBlock + + clc + rts + +.9 sec + rts */-------------------------------------- * # SListAdd * ## In: +* PUSHB = hSList +* PUSHW = Key +* PUSHW = Data Ptr * ## Out: -* A=hMem +* A=hSList *\-------------------------------------- -K.SListAdd +K.SListAdd jsr K.SListLookup.I + bcc .9 Lookup succeeded...DUP + + sta SETWRITEAUX + + ldy #0 + +.1 jsr MEM.GetKeyCharY + iny + bcc .1 + + tya + + jsr MEM.AddBlockByte + bcs .99 + + ldy #0 + +.2 jsr MEM.GetKeyCharY + bcs .3 + + jsr MEM.AddBlockByte + bcs .99 + iny + bra .2 + +.3 sta CLRREADAUX + lda (ZPSListData) + sta SETREADAUX + tax + + jsr MEM.AddBlockByte + bcs .99 + + ldy #1 + +.4 sta CLRREADAUX + lda (ZPSListData),y + sta SETREADAUX + + jsr MEM.AddBlockByte + bcs .99 + + iny + dex + bne .4 + + clc + .HS B0 BCS + +.9 sec + +.99 sta CLRWRITEAUX + sta CLRREADAUX + rts */-------------------------------------- -* # SListGet +* # SListLookup * ## In: +* PUSHB = hSList +* PUSHW = Key +* PUSHW = Data Ptr * ## Out: -* A=hMem +* Data Ptr Updated *\-------------------------------------- -K.SListGet +K.SListLookup jsr K.SListLookup.I + bcs .9 + + jsr MEM.GetBlockByte + tax + sta (ZPSListData) + + ldy #0 + +.1 jsr MEM.GetBlockByte + iny + sta (ZPSListData),y + dex + bne .1 + + sta CLRREADAUX + clc +.9 rts +*-------------------------------------- +K.SListLookup.I jsr MEM.GetSListParams + + lda (ZPSListIndex) + beq .9 + + jsr K.GetMemPtr.A + >STYA ZPSListBlock + stz MEM.BlockOfs + + jsr MEM.GetBlockByte + beq .9 + + tax + +.1 ldy #0 + +.2 jsr MEM.GetKeyCharY + bcs .4 + iny + sta .3+1 + + jsr MEM.GetBlockByte +.3 cmp #$ff SELF MODIFIED + bne .4 + + dex + bne .2 + + clc + rts + +.4 jsr MEM.GetBlockByte skip remaining key chars + dex + bne .4 + + jsr MEM.GetBlockByte get Data Len + tax + +.5 jsr MEM.GetBlockByte skip data bytes + dex + bne .5 + + tax + bne .1 + +.9 sec + rts */-------------------------------------- -* # SListPut +* # SListUpdate * ## In: +* PUSHB = hSList +* PUSHW = Key +* PUSHW = Data Ptr * ## Out: -* A=hMem *\-------------------------------------- -K.SListPut +K.SListUpdate jsr K.SListLookup.I + bcs .9 + + ldy #0 + + sta CLRREADAUX + lda (ZPSListData) + sta SETREADAUX + tax + + jsr MEM.SetBlockByte + bcs .99 + + ldy #1 + +.4 sta CLRREADAUX + lda (ZPSListData),y + sta SETREADAUX + + jsr MEM.SetBlockByte + bcs .99 + + iny + dex + bne .4 + + clc + .HS B0 BCS + +.9 sec + +.99 sta CLRWRITEAUX + sta CLRREADAUX + rts */-------------------------------------- * # SListFree * ## In: +* A=hSList * ## Out: -* A=hMem *\-------------------------------------- -K.SListFree - - - +K.SListFree.A sta .8 + sta SETREADAUX + sta SETWRITEAUX + + jsr K.GetMemPtr.A + >STYA .1+1 + + ldx #0 + +.1 lda $ffff,x SELF MODIFIED + beq .8 + jsr K.FreeMem.A + inx + bra .1 + +.8 lda #$ff SELF MODIFIED + jsr K.FreeMem.A + sta CLRWRITEAUX + sta CLRREADAUX + rts *-------------------------------------- -MEM.SList.Next +MEM.GetSListParams + >PULLW ZPSListData + >PULLW ZPSListKey + >PULLA + + sta SETREADAUX + + jsr K.GetMemPtr.A + >STYA ZPSListIndex + rts +*-------------------------------------- +MEM.GetKeyCharY sta CLRREADAUX + lda (ZPSListKey),y + sta SETREADAUX + beq .9 + + cmp #'0' + bcc .9 + cmp #'9'+1 + bcc .8 + + cmp #'A' + bcc .9 + cmp #'Z'+1 + bcc .8 + + cmp #'a' + bcc .9 + cmp #'z'+1 + bcc .8 + + cmp #'.' + bne .9 + + cmp #'_' + bne .9 + +.8 clc + rts + +.9 sec + rts +*-------------------------------------- +MEM.GetBlockByte + phy + ldy MEM.BlockOfs + lda (ZPSListBlock),y + inc MEM.BlockOfs + bne .8 + + pha + ldy MEM.IndexOfs + lda (ZPSListIndex),y + beq .9 + + jsr K.GetMemPtr.A + >STYA ZPSListBlock +* stz MEM.BlockOfs + + pla + +.8 ply + clc + rts + +.9 pla + ply + sec + rts +*-------------------------------------- +MEM.AddBlockByte + phy + ldy MEM.BlockOfs + sta (ZPSListBlock),y + inc MEM.BlockOfs + bne .8 + + inc MEM.IndexOfs + + >LDYAI 256 + jsr K.GetMem0.YA + bcs .9 + >STYA ZPSListBlock + txa + ldy MEM.IndexOfs + sta (ZPSListIndex),y + +* stz MEM.BlockOfs + +.8 ply + clc + rts + +.9 ply + sec + rts +*-------------------------------------- +MEM.SetBlockByte + phy + ldy MEM.BlockOfs + sta (ZPSListBlock),y + inc MEM.BlockOfs + bne .8 + + inc MEM.IndexOfs + + ldy MEM.IndexOfs + lda (ZPSListIndex),y + + jsr K.GetMemPtr.A + >STYA ZPSListBlock +* stz MEM.BlockOfs + +.8 ply + clc + rts +*-------------------------------------- +MEM.IndexOfs .BS 1 +MEM.BlockOfs .BS 1 */-------------------------------------- * # LoadStkObj * Load a file in AUX memory (Stock Objects) @@ -587,7 +880,7 @@ K.LoadStkObj >SYSCALL LoadFile stx .8+1 Save MAIN hMem >STYA A2L Save LEN temporarly - jsr K.GetMemAux.YA + jsr K.NewStkObj.YA bcs .9 stx .80+1 >STYA A4L Save Destination Address in AUX diff --git a/SYS/KERNEL.S.PS.txt b/SYS/KERNEL.S.PS.txt index 29f94376..1d7fa792 100644 --- a/SYS/KERNEL.S.PS.txt +++ b/SYS/KERNEL.S.PS.txt @@ -315,9 +315,8 @@ PS.Init jsr BIN.Load.YA Y,A=filename full path .HS 2C bit abs .3 lda #0 - >PUSHYA - >PUSHBI S.MEM.F.ALIGN - jsr K.GetMem + ldx #S.MEM.F.ALIGN + jsr MEM.GetMem.YAX bcs .9 ldy #S.PS.ZP+5 diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index 17ef03f6..1e8f52f9 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -1049,9 +1049,9 @@ STDIO.SetMLIPathYA >STYA K.MLI.PARAMS+1 rts *-------------------------------------- -STDIO.SetIOBUF >PUSHWI 1024 get a ProDOS IOBUF - >PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE - jsr K.GetMem +STDIO.SetIOBUF >LDYAI 1024 get a ProDOS IOBUF + ldx #S.MEM.F.ALIGN+S.MEM.F.NOMOVE + jsr MEM.GetMem.YAX bcs .9 >STYA K.MLI.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call