From 2d5d81935486a7a9bb70b4b31add4877a5b1c796 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Thu, 20 Dec 2018 17:23:43 +0100 Subject: [PATCH] Kernel 0.92 --- .Floppies/A2OSX.BUILD.po | Bin 33553920 -> 33553920 bytes BIN/SHELL.S.CMD.txt | 6 +- BIN/X.FILEENUM.S.txt | 4 +- DRV/DHGR.DRV.G.txt | 33 ++--- DRV/DHGR.DRV.S.txt | 30 ++++- DRV/MOUSE.DRV.S.txt | 273 ++++++++++++++++++++------------------- INC/A2osX.I.txt | 4 +- INC/GFX.I.txt | 3 +- LIB/LIBTCPIP.S.DNS.txt | 2 +- SYS/KERNEL.S.BIN.txt | 88 +++++-------- SYS/KERNEL.S.DEV.txt | 2 +- SYS/KERNEL.S.ENV.txt | 4 +- SYS/KERNEL.S.JMP.txt | 4 +- SYS/KERNEL.S.MEM.txt | 101 +++++---------- SYS/KERNEL.S.PS.txt | 92 ++++++------- SYS/KERNEL.S.STAT.txt | 2 +- SYS/KERNEL.S.STDIO.txt | 39 ++---- SYS/KERNEL.S.STDLIB.txt | 3 +- SYS/KERNEL.S.STRING.txt | 71 ++++++++-- SYS/KERNEL.S.TERM.txt | 2 +- 20 files changed, 371 insertions(+), 392 deletions(-) diff --git a/.Floppies/A2OSX.BUILD.po b/.Floppies/A2OSX.BUILD.po index a7ea23de020818387b6c09bf6e16d944e22281bc..4d5900fb9dac9fe59448f4ec7d728af2907af7b3 100644 GIT binary patch delta 47516 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 delta 47514 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 diff --git a/BIN/SHELL.S.CMD.txt b/BIN/SHELL.S.CMD.txt index 8a8eb868..d2938bba 100644 --- a/BIN/SHELL.S.CMD.txt +++ b/BIN/SHELL.S.CMD.txt @@ -112,7 +112,7 @@ Cmd.INT.PUSHD >LDA.G PUSHD.STACK ldy #S.PS.hPREFIX lda (pPs),y >SYSCALL GetMemPtr - >SYSCALL NewStr + >SYSCALL strdup bcs Cmd.INT.POPD.CSYN >INC.G PUSHD.STACK @@ -210,7 +210,7 @@ Cmd.INT.CD.1 >STYA ZPPtr1 sta (ZPPtr1),y .8 >LDYA ZPPtr1 - >SYSCALL NewStr + >SYSCALL strdup bcs .90 txa @@ -510,7 +510,7 @@ Cmd.INT.READ lda #1 bcs .99 bra .7 -.4 >SYSCALL newstr +.4 >SYSCALL strdup txa >STA.G hVarName diff --git a/BIN/X.FILEENUM.S.txt b/BIN/X.FILEENUM.S.txt index 02903af4..ee216619 100644 --- a/BIN/X.FILEENUM.S.txt +++ b/BIN/X.FILEENUM.S.txt @@ -152,7 +152,7 @@ InitSrcDirYA >SYSCALL RealPath adc #0 sta ZPPtr2+1 - >SYSCALL Newstr + >SYSCALL strdup bcs .9 txa >STA.G hFilter @@ -252,7 +252,7 @@ InitDstDirYA >SYSCALL RealPath adc #0 sta ZPPtr2+1 - >SYSCALL NewStr + >SYSCALL strdup bcs .9 txa >STA.G hDstFileName diff --git a/DRV/DHGR.DRV.G.txt b/DRV/DHGR.DRV.G.txt index 28b7d719..c1a111b6 100644 --- a/DRV/DHGR.DRV.G.txt +++ b/DRV/DHGR.DRV.G.txt @@ -4,13 +4,14 @@ AUTO 4,1 .LIST OFF *-------------------------------------- Mask7BitsH .DA #%01111111 Useless - .DA #%01111110 +C2.MASK .DA #%01111110 .DA #%01111100 .DA #%01111000 .DA #%01110000 .DA #%01100000 .DA #%01000000 - +* .DA #%00000000 +C1.MASK Mask7BitsL .DA #%00000000 Useless .DA #%00000001 .DA #%00000011 @@ -35,13 +36,13 @@ Shift7BitsCol2 .DA #%00000000 Useless .DA #%01111100 .DA #%01111110 *-------------------------------------- -C1.MASK .DA #%00000000 Clear (AND) Col 1 bits - .DA #%00000001 - .DA #%00000011 - .DA #%00000111 - .DA #%00001111 - .DA #%00011111 - .DA #%00111111 +*C1.MASK .DA #%00000000 Clear (AND) Col 1 bits +* .DA #%00000001 +* .DA #%00000011 +* .DA #%00000111 +* .DA #%00001111 +* .DA #%00011111 +* .DA #%00111111 C1.DATA .DA #%11111111 set (ORA) COL 1 bits .DA #%11111110 @@ -51,13 +52,13 @@ C1.DATA .DA #%11111111 set (ORA) COL 1 bits .DA #%11100000 .DA #%11000000 *-------------------------------------- -C2.MASK .DA #%01111110 Clear (AND) Col 2 bits - .DA #%01111100 - .DA #%01111000 - .DA #%01110000 - .DA #%01100000 - .DA #%01000000 - .DA #%00000000 +*C2.MASK .DA #%01111110 Clear (AND) Col 2 bits +* .DA #%01111100 +* .DA #%01111000 +* .DA #%01110000 +* .DA #%01100000 +* .DA #%01000000 +* .DA #%00000000 C2.DATA .DA #%10000001 set (ORA) COL 2 bits .DA #%10000011 diff --git a/DRV/DHGR.DRV.S.txt b/DRV/DHGR.DRV.S.txt index 3ae1817b..e61ef89d 100644 --- a/DRV/DHGR.DRV.S.txt +++ b/DRV/DHGR.DRV.S.txt @@ -228,8 +228,25 @@ STATUS.9 lda #MLI.E.BADCTL sec rts *-------------------------------------- -OPEN sta A2osX.SCRNDEVS+2 DEV.ID in A +OPEN ldx #0 DEV.ID in A +.10 ldy A2osX.SCRNDEVS,x + beq .20 + + inx + cpx #K.SCR.MAX + bne .10 + + lda #E.OOH + sec + rts + +.20 sta A2osX.SCRNDEVS,x + sta DCB+S.DCB.GFX.DEVID + + lda #S.DIB.S.OPENED + tsb DIB+S.DIB.S + ldx #0 ldy #1 @@ -272,7 +289,7 @@ CONTROL ldy #0 iny bra .1 -.8 lda #3 +.8 lda DCB+S.DCB.GFX.DEVID sta A2osX.ASCREEN clc @@ -281,7 +298,7 @@ CONTROL ldy #0 CLOSE clc rts *-------------------------------------- -WRITE >STYA ZPIOCTL +WRITE >STYA ZPIOCTL NON STANDARD lda (ZPIOCTL) Get Cmd @@ -470,12 +487,17 @@ DIB .DA #0 .DA K.VER *-------------------------------------- DCB .DA #S.DCB.T.GFX + .BS 1 DEV.ID + .BS 1 STATUS .DA #S.CB.M.MONO+S.CB.M.C16 F - .DA 0 S .DA 560 W .DA 192 H *-------------------------------------- DRV.END + .LI ON +DRV.CS.SIZE .EQ DRV.CS.END-DRV.CS.START +DRV.SIZE .EQ DRV.END-DRV.CS.START + .LI OFF MAN SAVE USR/SRC/DRV/DHGR.DRV.S ASM diff --git a/DRV/MOUSE.DRV.S.txt b/DRV/MOUSE.DRV.S.txt index b8c8ebe4..fec3a007 100644 --- a/DRV/MOUSE.DRV.S.txt +++ b/DRV/MOUSE.DRV.S.txt @@ -119,22 +119,23 @@ FD.DEV.NAME .AZ "MOU7" * Driver Code *-------------------------------------- ZPIOCTL .EQ ZPDRV +ZPBufPtr .EQ ZPDRV+2 *-------------------------------------- DRV.CS.START cld jmp (.1,x) .1 .DA STATUS - .DA READBLOCK + .DA A2osX.BADCALL .DA A2osX.BADCALL .DA A2osX.BADCALL .DA CONTROL .DA A2osX.BADCALL .DA OPEN .DA CLOSE - .DA A2osX.BADCALL + .DA READ .DA A2osX.BADCALL .DA 0 end or relocation *-------------------------------------- -STATUS >STYA ZPIOCTL +STATUS jsr GETIOCTL ldy #S.IOCTL.STATCODE lda (ZPIOCTL),y @@ -143,20 +144,13 @@ STATUS >STYA ZPIOCTL cmp #S.IOCTL.STATCODE.GETDIB bne STATUS.DCB - ldx #S.DIB-1 + ldy #S.DIB-1 .HS 2C bit abs -.1 ldx #3 - - ldy #S.IOCTL.BUFPTR - lda (ZPIOCTL),y - sta .3+1 - iny - lda (ZPIOCTL),y - sta .3+2 +.1 ldy #3 -.2 lda DIB,x -.3 sta $ffff,x SELF MODIFIED - dex +.2 lda DIB,y + sta (ZPBufPtr),y + dey bpl .2 clc @@ -168,121 +162,7 @@ STATUS.9 lda #MLI.E.BADCTL sec rts *-------------------------------------- -READBLOCK >STYA ZPIOCTL - - stz READBLOCK.S+1 Reset Flags - - php - sei - -* ldy #READMOUSE DONE BY IRQ MANAGER -* jsr GOMOUSE - - ldx DEVSLOT0n - - lda MOUSESTSx,x - and #MOUSESTSx.MOVED - beq .1 - - ldy #S.MOUSE.X1 - - lda MOUSEXLOx,x - sta (ZPIOCTL),y - - iny - lda MOUSEXHIx,x - sta (ZPIOCTL),y - - iny - lda MOUSEYLOx,x - sta (ZPIOCTL),y - - iny - lda MOUSEYHIx,x - sta (ZPIOCTL),y - - lda #S.MOUSE.S.MOVE - tsb READBLOCK.S+1 - - stz bDblClick Reset DblClick flag - -.1 lda MOUSESTSx,x - and #MOUSESTSx.DOWN+MOUSESTSx.LDOWN - beq .8 no button state change:up & previously up - - cmp #MOUSESTSx.DOWN+MOUSESTSx.LDOWN - beq .8 no button state change:down & previously down - - asl if CS, down & previously up - bcc .2 - - lda #S.MOUSE.S.DOWN - tsb READBLOCK.S+1 button has been pressed, start drag... - - lda MOUSEXLOx,x - sta SrcDrag - - lda MOUSEXHIx,x - sta SrcDrag+1 - - lda MOUSEYLOx,x - sta SrcDrag+2 - - lda MOUSEYHIx,x - sta SrcDrag+3 - - bra .8 - -.2 lda READBLOCK.S+1 - - pha save move state - - ora #S.MOUSE.S.UP - sta READBLOCK.S+1 - - pla get back move state - - bne .4 no move...click! - - lda #S.MOUSE.S.CLK - bit bDblClick - bpl .3 - - lda #S.MOUSE.S.DCLK - - ldy #1 - sty bDblClick - -.3 dec bDblClick - - tsb READBLOCK.S+1 - bra .8 - -.4 lda #S.MOUSE.S.DRAG - tsb READBLOCK.S+1 - - ldy #S.MOUSE.X2+3 - -.5 lda SrcDrag-S.MOUSE.X2,y - sta (ZPIOCTL),y - dey - bpl .5 - -.8 plp - -READBLOCK.S lda #$ff SELF MODIFIED - beq .9 - - ldy #S.MOUSE.S - sta (ZPIOCTL),y - clc - rts - -.9 lda #MLI.E.EOF - sec - rts -*-------------------------------------- -CONTROL >STYA ZPIOCTL +CONTROL jsr GETIOCTL php sei @@ -331,21 +211,146 @@ CLOSE php clc rts *-------------------------------------- +READ >STYA ZPBufPtr NON STANDARD + + stz READ.S+1 Reset Flags + + php + sei + +* ldy #READMOUSE DONE BY IRQ MANAGER +* jsr GOMOUSE + + ldx DEVSLOT0n + + lda MOUSESTSx,x + and #MOUSESTSx.MOVED + beq .1 + + ldy #S.MOUSE.X1 + + lda MOUSEXLOx,x + sta (ZPBufPtr),y + + iny + lda MOUSEXHIx,x + sta (ZPBufPtr),y + + iny + lda MOUSEYLOx,x + sta (ZPBufPtr),y + + iny + lda MOUSEYHIx,x + sta (ZPBufPtr),y + + lda #S.MOUSE.S.MOVE + tsb READ.S+1 + + stz bDblClick Reset DblClick flag + +.1 lda MOUSESTSx,x + and #MOUSESTSx.DOWN+MOUSESTSx.LDOWN + beq .8 no button state change:up & previously up + + cmp #MOUSESTSx.DOWN+MOUSESTSx.LDOWN + beq .8 no button state change:down & previously down + + asl if CS, down & previously up + bcc .2 + + lda #S.MOUSE.S.DOWN + tsb READ.S+1 button has been pressed, start drag... + + lda MOUSEXLOx,x + sta SrcDrag + + lda MOUSEXHIx,x + sta SrcDrag+1 + + lda MOUSEYLOx,x + sta SrcDrag+2 + + lda MOUSEYHIx,x + sta SrcDrag+3 + + bra .8 + +.2 lda READ.S+1 + + pha save move state + + ora #S.MOUSE.S.UP + sta READ.S+1 + + pla get back move state + + bne .4 no move...click! + + lda #S.MOUSE.S.CLK + bit bDblClick + bpl .3 + + lda #S.MOUSE.S.DCLK + + ldy #1 + sty bDblClick + +.3 dec bDblClick + + tsb READ.S+1 + bra .8 + +.4 lda #S.MOUSE.S.DRAG + tsb READ.S+1 + + ldy #S.MOUSE.X2+3 + +.5 lda SrcDrag-S.MOUSE.X2,y + sta (ZPBufPtr),y + dey + bpl .5 + +.8 plp + +READ.S lda #$ff SELF MODIFIED + beq .9 + + ldy #S.MOUSE.S + sta (ZPBufPtr),y + clc + rts + +.9 lda #MLI.E.EOF + sec + rts +*-------------------------------------- * PRIVATE *-------------------------------------- -SETCLAMP lda (ZPIOCTL),y +GETIOCTL >STYA ZPIOCTL + + ldy #S.IOCTL.BUFPTR + lda (ZPIOCTL),y + sta ZPBufPtr + iny + lda (ZPIOCTL),y + sta ZPBufPtr+1 + + rts +*-------------------------------------- +SETCLAMP lda (ZPBufPtr),y sta LOCLAMPLO iny - lda (ZPIOCTL),y + lda (ZPBufPtr),y sta LOCLAMPHI iny - lda (ZPIOCTL),y + lda (ZPBufPtr),y sta HICLAMPLO iny - lda (ZPIOCTL),y + lda (ZPBufPtr),y sta HICLAMPHI txa diff --git a/INC/A2osX.I.txt b/INC/A2osX.I.txt index c0d2fa46..461bc9a0 100644 --- a/INC/A2osX.I.txt +++ b/INC/A2osX.I.txt @@ -206,7 +206,7 @@ SYS.RealPath .EQ $7C SYS.StrLen .EQ $80 SYS.StrCpy .EQ $82 SYS.StrCat .EQ $84 -* .EQ $86 +SYS.StrDup .EQ $86 SYS.StrUpr .EQ $88 SYS.StrLwr .EQ $8A SYS.StrCmp .EQ $8C @@ -269,7 +269,7 @@ SYS.GetMemByID .EQ $E6 SYS.GetMem .EQ $E8 SYS.GetMem0 .EQ $EA -SYS.NewStr .EQ $EC +* .EQ $EC SYS.SListAdd .EQ $EE SYS.SListLookup .EQ $F0 diff --git a/INC/GFX.I.txt b/INC/GFX.I.txt index b25dff90..caadf336 100644 --- a/INC/GFX.I.txt +++ b/INC/GFX.I.txt @@ -5,8 +5,9 @@ AUTO 4,1 *-------------------------------------- * GFX Devices *-------------------------------------- -S.DCB.GFX.F .EQ 1 +S.DCB.GFX.DEVID .EQ 1 S.DCB.GFX.S .EQ 2 +S.DCB.GFX.F .EQ 3 S.DCB.GFX.W .EQ 4 S.DCB.GFX.H .EQ 6 * diff --git a/LIB/LIBTCPIP.S.DNS.txt b/LIB/LIBTCPIP.S.DNS.txt index 82a422a2..a1dd30d3 100644 --- a/LIB/LIBTCPIP.S.DNS.txt +++ b/LIB/LIBTCPIP.S.DNS.txt @@ -219,7 +219,7 @@ DNS.ADD.I sta DNS.TmpCache jsr DNS.FIND.FREE >LDYA ZPPtrDNS - >SYSCALL newstr + >SYSCALL strdup bcs .9 txa ldy #S.DNSCACHE.hNAME diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index 4fcd64cf..c987dfec 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -41,26 +41,17 @@ K.LoadLib jsr BIN.FindLIB * out : *-------------------------------------- K.UnloadLib pha - jsr K.GetMemByID - >STYA ZPPtr1 - ldy #S.MEM.REFCNT - lda (ZPPtr1),y Get count of those referencing this lib - dec only one left ? + jsr K.GetMemPtr + >STYA .2+1 + + jsr MEM.decREFCNT beq .1 - sta (ZPPtr1),y + pla clc rts -.1 ldy #S.MEM.PTR - lda (ZPPtr1),y - sta .2+1 - - iny - lda (ZPPtr1),y - sta .2+2 - - ldx #LIBMGR.UNLOAD +.1 ldx #LIBMGR.UNLOAD .2 jsr $ffff Self Modified, Call LIB.UNLOAD function pla jmp K.FreeMem @@ -114,7 +105,7 @@ K.LoadDrv >STYA .2+1 Save "BIN\0ARGS\0\0" rts *-------------------------------------- BIN.FindLIB clc - .HS B0 bcs + .HS B0 BCS BIN.FindDRV sec >STYA BIN.CmdLine @@ -149,29 +140,22 @@ BIN.Find.ENV.LIB .AZ "LIB" *-------------------------------------- BIN.Load >STYA BIN.CmdLine >STYA .2+1 - - >LDYAI Mem.Table - >STYA ZPPtr1 - ldx #0 we will skip Slot 0... + ldx #0 .1 cpx Mem.LastSlot beq BIN.Load.1 - inx + inx we will skip Slot 0... - lda ZPPtr1 - clc - adc #S.MEM - sta ZPPtr1 - bcc .11 - inc ZPPtr1+1 + txa + jsr K.GetMemPtr -.11 lda (ZPPtr1) + lda (ZPMemMgrSPtr) bpl .1 In Use? ldy #S.MEM.BIN any BIN PATH in this slot? - lda (ZPPtr1),y + lda (ZPMemMgrSPtr),y beq .1 jsr K.GetMemPtr X unmodified, get pathname @@ -186,20 +170,14 @@ BIN.Load >STYA BIN.CmdLine ora #0 bne .2 - ldy #S.MEM.REFCNT - lda (ZPPtr1),y - inc - sta (ZPPtr1),y - - ldy #S.MEM.PTR - lda (ZPPtr1),y - pha - iny - lda (ZPPtr1),y - ply + txa + jsr K.GetMemPtr + + jsr MEM.IncREFCNT clc - rts X=hMem, Y,A=Ptr + jmp K.GetMemPtr.ZPMemMgrSPtr +* X=hMem, Y,A=Ptr *-------------------------------------- BIN.Load.1 * >PUSHWI K.S.STAT @@ -258,24 +236,23 @@ BIN.Load.1 jsr BIN.RelExe >LDYA BIN.CmdLine get back bin path - jsr K.NewStr make a copy of this string + >SYSCALL StrDup make a copy of this string bcs .98 lda BIN.hMem Keep X=hMem jsr K.GetMemByID X unmodified - >STYA ZPPtr1 - lda (ZPPtr1) + lda (ZPMemMgrSPtr) ora #S.MEM.F.CODE This is a code segment - sta (ZPPtr1) + sta (ZPMemMgrSPtr) - txa Get Back hMem + txa Get Back Cmd line hMem ldy #S.MEM.BIN - sta (ZPPtr1),y + sta (ZPMemMgrSPtr),y - lda BIN.hMem - tax return hMEM to Caller... - jmp K.GetMemPtr ...and Y,A=PTR to CS + ldx BIN.hMem return hMEM to Caller... + clc + jmp K.GetMemPtr.ZPMemMgrSPtr ...and Y,A=PTR to CS .98 pha lda BIN.hMem @@ -460,14 +437,9 @@ BIN.RelDrv ldy #H.BIN.DRV.REL.TABLE bra .1 *-------------------------------------- -.2 tya add current offset in Y to Ptr - - sec + 1 to skip last 00 from beq .2 - - adc ZPPtr1 - sta ZPPtr1 - bcc .3 - inc ZPPtr1+1 ZPPtr1=Current Code PTR +.2 jsr MEM.AddYp1ToPtr1 add current offset in Y to Ptr +* + 1 to skip last 00 from beq .2 +* ZPPtr1=Current Code PTR .3 lda BIN.R.CS.End compute new CS.END to stop relocating clc diff --git a/SYS/KERNEL.S.DEV.txt b/SYS/KERNEL.S.DEV.txt index 337273e5..00c9e23d 100644 --- a/SYS/KERNEL.S.DEV.txt +++ b/SYS/KERNEL.S.DEV.txt @@ -131,7 +131,7 @@ K.MKDev jsr MEM.SPtr1PPtr2 ptr1=fd, ptr2=name sta IRQ.Vectors+1,x .8 >LDYA ZPPtr2 - jsr K.NewStr + >SYSCALL StrDup bcs .99 txa diff --git a/SYS/KERNEL.S.ENV.txt b/SYS/KERNEL.S.ENV.txt index 0a302a85..55a3ca66 100644 --- a/SYS/KERNEL.S.ENV.txt +++ b/SYS/KERNEL.S.ENV.txt @@ -109,7 +109,7 @@ K.ExpandStr stz .88+1 Reset Intermediate string... stz K.Buf256,x >LDYAI K.Buf256 - jsr K.NewStr + >SYSCALL StrDup bcs .9 stx .88+1 save this as temp string, in case of recurse @@ -118,7 +118,7 @@ K.ExpandStr stz .88+1 Reset Intermediate string... jmp .1 Yes, start over with hPStr .88 ldx #$ff SELF MODIFIED -* or exit with Y,A from K.NewStrYA +* or exit with Y,A from STRDUP .9 rts */-------------------------------------- diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index 6c89c992..d773222c 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -83,7 +83,7 @@ K.SYSCALL.JMP .DA 0 $00 .DA K.StrLen $80 .DA K.StrCpy .DA K.StrCat - .DA 0 + .DA K.StrDup .DA K.StrUpr .DA K.StrLwr .DA K.StrCmp @@ -142,7 +142,7 @@ K.SYSCALL.JMP .DA 0 $00 .DA K.GetMemByID .DA K.GetMem .DA K.GetMem0 - .DA K.NewStr + .DA 0 .DA K.SListAdd *-------------------------------------- .DA K.SListLookup $F0 diff --git a/SYS/KERNEL.S.MEM.txt b/SYS/KERNEL.S.MEM.txt index dbfa599e..5cfe09e3 100644 --- a/SYS/KERNEL.S.MEM.txt +++ b/SYS/KERNEL.S.MEM.txt @@ -158,14 +158,9 @@ MEM.GetMem.YAX stx Mem.ReqFlags 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 + clc + jmp K.GetMemPtr.ZPMemMgrSPtr +* A = HI PTR,Y = LO PTR,X = Current hMem .9 rts *-------------------------------------- @@ -222,7 +217,19 @@ Mem.AddSlot >STYA ZPMemMgrTmp1 save req size sec rts *-------------------------------------- -Mem.NextSlot lda ZPMemMgrSPtr +MEM.IncREFCNT ldy #S.MEM.REFCNT + lda (ZPMemMgrSPtr),y + inc + sta (ZPMemMgrSPtr),y + rts +*-------------------------------------- +MEM.decREFCNT ldy #S.MEM.REFCNT + lda (ZPMemMgrSPtr),y + dec + sta (ZPMemMgrSPtr),y + rts +*-------------------------------------- +MEM.NextSlot lda ZPMemMgrSPtr clc adc #S.MEM sta ZPMemMgrSPtr @@ -236,8 +243,8 @@ Mem.NextSlot lda ZPMemMgrSPtr * none. * (X unmodified) *\-------------------------------------- -K.FreeMem.ERRBAD .AZ "FreeMem:$%h=Bad hMem,BIN=%s\r\n" -K.FreeMem.ERRFREED .AZ "FreeMem:$%h=already freed,BIN=%s\r\n" +K.FreeMem.ERRBAD .AZ "FreeMem:$%h=Bad,%s\r\n" +K.FreeMem.ERRFREED .AZ "FreeMem:$%h=free,%s\r\n" *-------------------------------------- K.FreeMem.BAD sec .HS 90 BCC @@ -265,7 +272,7 @@ K.FreeMem.FREED clc .1 >SYSCALL printf plx - >DEBUG + sec rts *-------------------------------------- @@ -286,10 +293,7 @@ K.FreeMem tay .11 pla - ldy #S.MEM.REFCNT - lda (ZPMemMgrSPtr),y Get count of those referencing this hMem - dec only one left ? - sta (ZPMemMgrSPtr),y + jsr MEM.decREFCNT only one left ? bne .8 no, must be a code segment loaded several times lda (ZPMemMgrSPtr) @@ -365,7 +369,7 @@ K.GetMemPtr sta ZPMemMgrSPtr asl ZPMemMgrSPtr rol sta ZPMemMgrSPtr+1 - +K.GetMemPtr.ZPMemMgrSPtr ldy #S.MEM.PTR lda (ZPMemMgrSPtr),y pha @@ -427,58 +431,6 @@ K.GetMemStat >STYA ZPMemMgrTmp1 bpl .3 rts */-------------------------------------- -* # NewStr -* Create a new copy of this C-String -* Y,A = Ptr to source C-String -* ## RETURN VALUE -* 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 * PUSHB = hSList * PUSHW = KeyID @@ -743,6 +695,17 @@ MEM.NextCharPtr1 MEM.GetCharPtr1.8 rts *-------------------------------------- +MEM.AddYp1ToPtr1 + sec + .HS 90 BCC +MEM.AddYToPtr1 clc + tya + adc ZPPtr1 + sta ZPPtr1 + bcc .8 + inc ZPPtr1+1 +.8 rts +*-------------------------------------- MEM.PutCharPtr2 sta (ZPPtr2) inc ZPPtr2 bne .8 diff --git a/SYS/KERNEL.S.PS.txt b/SYS/KERNEL.S.PS.txt index e872bbe6..841eef40 100644 --- a/SYS/KERNEL.S.PS.txt +++ b/SYS/KERNEL.S.PS.txt @@ -32,7 +32,7 @@ K.ExecL sty .1+1 jsr K.Args2ArgV bcs .9 - + jsr PS.Exec .9 php @@ -85,7 +85,7 @@ PS.Exec jsr PS.CreateChild A=PID,Child S.PS at ZPPtr3,PS.Load.hMem * out : * A = PSID * we cannot use ZPPtrs1 & 2 -* because of calling K.NewStr & PS.DupEnv +* because of calling K.StrDup & PS.DupEnv *-------------------------------------- PS.CreateChild ldx CORE.PSCount beq .3 @@ -140,7 +140,7 @@ PS.CreateChild ldx CORE.PSCount ldy #S.PS.hPREFIX copy hPREFIX... lda (pPs),y jsr K.GetMemPtr - jsr K.NewStr + >SYSCALL StrDup bcs .9 jsr PS.SetMemOwner Set Ownership @@ -389,6 +389,33 @@ PS.Load.HEADER .AZ "#!/" PS.Load.ArgSize .BS 2 PS.Load.hMem .BS 1 *-------------------------------------- +* PS.DupEnv +* In: +* A = ENV hMem To Duplicate +* Out: +* A = hMem to new ENV +* X = Count +*-------------------------------------- +PS.DupEnv jsr K.GetMemPtr + >STYA ZPPtr1 + + >LDYAI K.ENV.SIZE + + jsr K.GetMem + bcs .9 + + >STYA ZPPtr2 Target Buffer + phx save hMem + + jsr PS.SetMemOwner Set Ownership + + jsr PS.AddPtr1ToStrVUntil0 + + pla hMem + + clc +.9 rts +*-------------------------------------- * hBIN + PS.ArgV -> #S.PS.hARGV *-------------------------------------- PS.AddArgV stz PS.Load.ArgSize @@ -427,7 +454,7 @@ PS.AddArgV stz PS.Load.ArgSize inc PS.Load.ArgSize+1 -.3 jsr PS.AddYp1ToPtr1 +.3 jsr MEM.AddYp1ToPtr1 bra .1 .4 txa @@ -440,7 +467,7 @@ PS.AddArgV stz PS.Load.ArgSize inc .5 jsr K.GetMem - bcs PS.LoadGetHeader.RTS + bcs PS.AddPtr1ToStrV.8 >STYA ZPPtr2 Target Buffer txa @@ -456,48 +483,14 @@ PS.AddArgV stz PS.Load.ArgSize .6 >LDYA PS.ArgV >STYA ZPPtr1 - -.7 lda (ZPPtr1) - sta (ZPPtr2) - beq .8 Ending \0 - - jsr PS.AddPtr1ToStrV - bra .7 - -.8 clc -.9 rts *-------------------------------------- -* PS.DupEnv -* In: -* A = ENV hMem To Duplicate -* Out: -* A = hMem to new ENV -* X = Count -*-------------------------------------- -PS.DupEnv jsr K.GetMemPtr - >STYA ZPPtr1 - - >LDYAI K.ENV.SIZE - - jsr K.GetMem - bcs .9 - - >STYA ZPPtr2 Target Buffer - phx save hMem - - jsr PS.SetMemOwner Set Ownership - +PS.AddPtr1ToStrVUntil0 .1 lda (ZPPtr1) sta (ZPPtr2) - beq .8 Ending \0 + beq PS.AddPtr1ToStrV.8 Ending \0 jsr PS.AddPtr1ToStrV bra .1 - -.8 pla hMem - - clc -.9 rts *-------------------------------------- PS.AddPtr1ToStrV ldy #$ff @@ -507,26 +500,17 @@ PS.AddPtr1ToStrV sta (ZPPtr2),y bne .2 - jsr PS.AddYp1ToPtr1 + jsr MEM.AddYp1ToPtr1 tya sec adc ZPPtr2 sta ZPPtr2 - bcc .8 + bcc PS.AddPtr1ToStrV.8 inc ZPPtr2+1 -.8 rts -*-------------------------------------- -PS.AddYp1ToPtr1 tya - sec - adc ZPPtr1 - sta ZPPtr1 - bcc .8 - - inc ZPPtr1+1 - -.8 rts +PS.AddPtr1ToStrV.8 + rts *-------------------------------------- PS.SetMemOwner lda CORE.LastPSID ldy #S.MEM.OWNERPID diff --git a/SYS/KERNEL.S.STAT.txt b/SYS/KERNEL.S.STAT.txt index 8c8ac33e..ace4ba4a 100644 --- a/SYS/KERNEL.S.STAT.txt +++ b/SYS/KERNEL.S.STAT.txt @@ -275,7 +275,7 @@ STAT.NewhNodeYAX .2 stx .3+1 Store hFILE pla - jsr K.NewStr + >SYSCALL StrDup bcs .9 txa diff --git a/SYS/KERNEL.S.STDIO.txt b/SYS/KERNEL.S.STDIO.txt index 1385ad75..dbdebe03 100644 --- a/SYS/KERNEL.S.STDIO.txt +++ b/SYS/KERNEL.S.STDIO.txt @@ -709,17 +709,17 @@ PrintF.Cnt .BS 2 K.FGetS jsr PFT.CheckNodeA bcs .90 - >PULLW ZPPtr1 s + jsr MEM.SPtr1PPtr2 - >PULLA + lda ZPPtr1 sec sbc #2 eor #$ff - sta ZPPtr2 !n - >PULLA + sta ZPPtr1 !n + lda ZPPtr1+1 sbc #0 eor #$ff - sta ZPPtr2+1 !n + sta ZPPtr1+1 !n jsr K.GetC.I bcs .9 @@ -728,14 +728,9 @@ K.FGetS jsr PFT.CheckNodeA cmp #C.CR beq .8 - sta (ZPPtr1) - inc ZPPtr1 - bne .2 - inc ZPPtr1+1 + jsr MEM.PutCharPtr2 -.2 inc ZPPtr2 - bne .3 - inc ZPPtr2+1 + jsr MEM.NextCharPtr1 beq .8 .3 jsr K.GetC.I @@ -745,7 +740,7 @@ K.FGetS jsr PFT.CheckNodeA .9 pha lda #0 - sta (ZPPtr1) + sta (ZPPtr2) pla .99 rts @@ -819,14 +814,10 @@ K.SScanF >STYA ZPPtr2 String to Scan stz .5+1 reset LStack Ptr stz .80+1 rest Arg processed -.1 lda (ZPPtr1) End Of format? +.1 jsr MEM.GetCharPtr1 End Of format? beq .8 - inc ZPPtr1 - bne .11 - inc ZPPtr1+1 - -.11 cmp #'%' Escape ? + cmp #'%' Escape ? beq .2 cmp #' ' Space ? @@ -848,14 +839,10 @@ K.SScanF >STYA ZPPtr2 String to Scan beq .12 bne .1 -.2 lda (ZPPtr1) Get specifier after % +.2 jsr MEM.GetCharPtr1 Get specifier after % beq .9 unexpected End of format after "%" ? - inc ZPPtr1 - bne .21 - inc ZPPtr1+1 - -.21 ldx #K.SScanFJMP-K.SScanFTBL-2 + ldx #K.SScanFJMP-K.SScanFTBL-2 .3 cmp K.SScanFTBL,x beq .4 @@ -1311,7 +1298,7 @@ STDIO.NewHFileYAX .2 stx .3+1 Store hFILE pla - jsr K.NewStr + >SYSCALL StrDup bcs .9 txa diff --git a/SYS/KERNEL.S.STDLIB.txt b/SYS/KERNEL.S.STDLIB.txt index 28601b20..9fa31c95 100644 --- a/SYS/KERNEL.S.STDLIB.txt +++ b/SYS/KERNEL.S.STDLIB.txt @@ -411,7 +411,8 @@ K.realpath.I clc .89 lda #$ff SELF MODIFIED bpl .98 >LDYAI K.Buf256 - jmp K.NewStr + >SYSCALL StrDup + rts .90 lda #E.BADPATH sec diff --git a/SYS/KERNEL.S.STRING.txt b/SYS/KERNEL.S.STRING.txt index a6c3d4c6..76cf15fd 100644 --- a/SYS/KERNEL.S.STRING.txt +++ b/SYS/KERNEL.S.STRING.txt @@ -62,14 +62,9 @@ K.StrCpy clc bcc .2 -.1 lda (ZPPtr1) - beq .2 - - inc ZPPtr1 +.1 jsr MEM.GetCharPtr1 bne .1 - inc ZPPtr1+1 - bra .1 - + .2 ldy #0 .3 lda (ZPPtr2),y @@ -83,7 +78,59 @@ K.StrCpy clc .8 ply pla - rts +K.StrCpy.RTS rts +*/-------------------------------------- +* # StrDup +* Create a new copy of this C-String +* Y,A = Ptr to source C-String +* ## RETURN VALUE +* CC : success +* Y,A = PTR to String +* X = hMem (PSTR) +* CS : error +* A = SYS error code +*\-------------------------------------- +K.StrDup >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 K.StrCpy.RTS + >STYA .5+1 + + phy + pha + + ldy #0 + +.4 lda $ffff,y +.5 sta $ffff,y + beq K.StrDup.8 + iny + bne .4 + + inc .4+2 + inc .5+2 + bne .4 + +K.StrDup.8 pla + ply +* clc + rts */-------------------------------------- * # StrUpr/StrLwr * Convert string to UPPERCASE/lowercase @@ -104,13 +151,13 @@ K.StrUpr ldx #0 K.StrLwr ldx #2 >STYA ZPPtr1 - pha save Y,A to restore them at exit phy + pha save Y,A to restore them at exit ldy #0 .1 lda (ZPPtr1),y - beq .8 + beq K.StrDup.8 cmp .9,x bcc .2 @@ -122,10 +169,6 @@ K.StrLwr ldx #2 bne .1 inc ZPPtr1+1 bra .1 - -.8 ply - pla - rts *-------------------------------------- .9 .AS "azAZ" */-------------------------------------- diff --git a/SYS/KERNEL.S.TERM.txt b/SYS/KERNEL.S.TERM.txt index 46587030..d172528c 100644 --- a/SYS/KERNEL.S.TERM.txt +++ b/SYS/KERNEL.S.TERM.txt @@ -78,7 +78,7 @@ DRV.TERM.OPEN ldx #0 DEV.ID in A sec rts -.9 lda #MLI.E.OPEN +.9 lda #MLI.E.OPEN sec rts