From 270098e108924a1f8fd407c40dd4981593d7ccb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20GIBERT?= Date: Wed, 28 Sep 2016 17:34:15 +0200 Subject: [PATCH] Kernel version 0.8 : API finalized and dispatched in LCBNK1/2, now fits in BNK1/BNK2 --- A2OSX.BOOT.po | Bin 143360 -> 143360 bytes A2OSX.SRC.po | Bin 819200 -> 819200 bytes SYS/KERNEL.S.BIN.txt | 338 ++++++++++++++++++++--------------------- SYS/KERNEL.S.FIO.txt | 3 - SYS/KERNEL.S.GP.txt | 2 +- SYS/KERNEL.S.INIT2.txt | 22 ++- SYS/KERNEL.S.JMP.txt | 4 +- SYS/KERNEL.S.LIB.txt | 6 +- SYS/KERNEL.S.STR.txt | 249 +++++++++++++++++++++++++++++- SYS/KERNEL.S.TIME.txt | 254 +------------------------------ SYS/KERNEL.S.txt | 5 +- 11 files changed, 438 insertions(+), 445 deletions(-) diff --git a/A2OSX.BOOT.po b/A2OSX.BOOT.po index a52b716c5b68bab81266acfaea1c6456a5a47db7..7afba83128ccb1e4190abed36e70716a66f721b8 100644 GIT binary patch delta 5663 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 AS^xk5 diff --git a/A2OSX.SRC.po b/A2OSX.SRC.po index 66d7b58931dfd07a3939dd4997a7aab4b5a6fe50..52ea72f070496c25777763c6867a785fe5e0569d 100644 GIT binary patch delta 18466 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 diff --git a/SYS/KERNEL.S.BIN.txt b/SYS/KERNEL.S.BIN.txt index 8235ea05..cfd8836e 100644 --- a/SYS/KERNEL.S.BIN.txt +++ b/SYS/KERNEL.S.BIN.txt @@ -13,11 +13,9 @@ AUTO 6 * X = hMem of Code Segment *-------------------------------------- BIN.LoadEXEYA >STYA BIN.LoadExe.Filename - jsr K.PStrUprYA - - >LDYA BIN.LoadExe.Filename + jsr K.PStrUprYA Y,A unmodified jsr K.GetMemByNameYA - bcs .1 not already loaded + bcs BIN.LoadEXEYA.1 not already loaded >STYA ZPQuickPtr1 Save base address ldy #S.MEM.REFCNT @@ -25,38 +23,56 @@ BIN.LoadEXEYA >STYA BIN.LoadExe.Filename inc sta (ZPQuickPtr1),y - ldy #S.MEM.PTR - lda (ZPQuickPtr1),y - pha Y,A = MEM PTR... - iny - lda (ZPQuickPtr1),y - ply X=hMem from K.GetMemByNameA - clc - rts - -.1 >PUSHWI KrnBuf256 + txa + jmp K.GetMemPtrA X=hMem from K.GetMemByNameA +*-------------------------------------- +BIN.LoadEXEYA.1 >PUSHWI KrnBuf256 >PUSHW BIN.LoadExe.Filename jsr K.STAT Look for AUXTYPE - bcs .99 + bcs .9 >LDYA KrnBuf256+S.STAT.AUXTYPE - >STYA BIN.LoadExe.OldBase + >STYA BIN.Relocate.Start - >PUSHYA + >PUSHYA Push AUXTYPE >PUSHBI 6 S.FILEINFO.TYPE.BIN >PUSHBI SYS.FOPEN.R >PUSHW BIN.LoadExe.Filename jsr K.LoadFile - bcs .99 Error Loading file +.9 bcs .99 Error Loading file - >STYA BIN.LoadExe.SegLen + >STYA BIN.Relocate.SegLen stx BIN.LoadExe.hMem save hMem txa jsr K.GetMemPtrA - >STYA BIN.LoadExe.NewBase - - jsr BIN.InstallEXE + >STYA ZPQuickPtr1 + ldy #H.BIN.CODE.LEN+1 get Code Len + lda (ZPQuickPtr1),y + tax + dey + lda (ZPQuickPtr1),y + jsr BIN.Relocate.SetCodeLenAX + + lda BIN.Relocate.Start Get AUXTYPE for actual Base Address + clc + adc BIN.Relocate.SegLen + sta BIN.Relocate.End compute Range End=AUXTYPE+FILELEN + + lda BIN.Relocate.Start+1 + adc BIN.Relocate.SegLen+1 + sta BIN.Relocate.End+1 + + lda ZPQuickPtr1 + sec + sbc BIN.Relocate.Start + sta BIN.Relocate.Offset Offset=ZPQuickPtr1-AUXTYPE + + lda ZPQuickPtr1+1 + sbc BIN.Relocate.Start+1 + sta BIN.Relocate.Offset+1 + + jsr Bin.RelocateEXE bcs .98 relocation error, dicard Code segment >LDYA BIN.LoadExe.Filename get back bin path @@ -92,78 +108,34 @@ BIN.LoadEXEYA >STYA BIN.LoadExe.Filename *-------------------------------------- BIN.LoadExe.Filename .BS 2 BIN.LoadExe.hMem .BS 1 -BIN.LoadExe.OldBase .BS 2 -BIN.LoadExe.NewBase .BS 2 -BIN.LoadExe.SegLen .BS 2 *-------------------------------------- -* BIN.InstallEXE -*-------------------------------------- -BIN.InstallEXE >LDYA BIN.LoadExe.NewBase - >STYA ZPQuickPtr1 - - ldy #H.BIN.CODE.LEN get Code Len - lda (ZPQuickPtr1),y - sta Rel.CodeLen - iny - lda (ZPQuickPtr1),y - sta Rel.CodeLen+1 - - lda BIN.LoadExe.OldBase - sta Rel.Start Get AUXTYPE for actual Base Address - clc - adc BIN.LoadExe.SegLen - sta Rel.End compute Range End=AUXTYPE+FILELEN - - lda BIN.LoadExe.OldBase+1 - sta Rel.Start+1 - adc BIN.LoadExe.SegLen+1 - sta Rel.End+1 - - lda ZPQuickPtr1 - sec - sbc BIN.LoadExe.OldBase - sta Rel.Offset Offset=ZPQuickPtr1-AUXTYPE - lda ZPQuickPtr1+1 - sbc BIN.LoadExe.OldBase+1 - sta Rel.Offset+1 - - jmp Bin.RelocateEXE -*-------------------------------------- -* K.InsDrv +* BIN.InstallDRV * pDrv = .DRV File Loaded Address *-------------------------------------- -BIN.InstallDRV ldy #H.BIN.DRV.CODE.LEN +BIN.InstallDRV ldy #H.BIN.DRV.CODE.LEN+1 lda (pDrv),y - sta Rel.CodeLen - iny + tax + dey lda (pDrv),y - sta Rel.CodeLen+1 + jsr BIN.Relocate.SetCodeLenAX ldy #H.BIN.DRV.CODE.O lda (pDrv),y clc - adc BIN.LoadExe.OldBase - sta Rel.Start + adc BIN.Relocate.Start Advance start From Bin code to DRV code + sta BIN.Relocate.Start iny lda (pDrv),y - adc BIN.LoadExe.OldBase+1 - sta Rel.Start+1 - - lda BIN.LoadExe.OldBase - clc - adc BIN.LoadExe.SegLen - sta Rel.End - lda BIN.LoadExe.OldBase+1 - adc BIN.LoadExe.SegLen+1 - sta Rel.End+1 + adc BIN.Relocate.Start+1 + sta BIN.Relocate.Start+1 ldy #H.BIN.DRV.CODE.O - lda BIN.LoadExe.SegLen + lda BIN.Relocate.SegLen sec sbc (pDrv),y sta K.InsDrv.DRVLen iny - lda BIN.LoadExe.SegLen+1 + lda BIN.Relocate.SegLen+1 sbc (pDrv),y sta K.InsDrv.DRVLen+1 Compute DRV Len @@ -178,8 +150,7 @@ BIN.InstallDRV ldy #H.BIN.DRV.CODE.LEN bcs .98 we crossed $FFFF, out of mem lda K.InsDrv.DRVEnd - sec - sbc #DevMgr.HiMem + cmp #DevMgr.HiMem lda K.InsDrv.DRVEnd+1 sbc /DevMgr.HiMem bcs .98 No More Room to load Driver.... @@ -206,11 +177,11 @@ BIN.InstallDRV ldy #H.BIN.DRV.CODE.LEN lda DevMgr.Free sec sbc (ZPQuickPtr1),y - sta Rel.Offset + sta BIN.Relocate.Offset lda DevMgr.Free+1 iny sbc (ZPQuickPtr1),y - sta Rel.Offset+1 + sta BIN.Relocate.Offset+1 ldy #H.BIN.DRV.CODE.O lda (pDrv),y @@ -253,11 +224,11 @@ BIN.MoveDRV ldy #H.BIN.DEV.HEADER.O ldy #S.DEV.JMP Relocate Main JMP lda (ZPQuickPtr1),y clc - adc Rel.Offset + adc BIN.Relocate.Offset sta (ZPQuickPtr1),y iny lda (ZPQuickPtr1),y - adc Rel.Offset+1 + adc BIN.Relocate.Offset+1 sta (ZPQuickPtr1),y lda DevMgr.LastDevID @@ -267,6 +238,7 @@ BIN.MoveDRV ldy #H.BIN.DEV.HEADER.O ldy #S.DEV.SIZE Make sure DevMgr.Table Ends with 0 lda #0 sta (pDev),y + dey .1 lda (ZPQuickPtr1),y Copy DRV.Header @@ -293,171 +265,183 @@ BIN.MoveDRV ldy #H.BIN.DEV.HEADER.O lda DevMgr.Free+1 sta ZPQuickPtr2+1 Make ZPQuickPtr2=Dest Ram Location - ldy K.InsDrv.DrvLen - ldx K.InsDrv.DrvLen+1 + lda K.InsDrv.DrvLen+1 + eor #$ff + pha + lda K.InsDrv.DrvLen + eor #$ff + tax -.2 lda (ZPQuickPtr1) - sta (ZPQuickPtr2) + ldy #0 - inc ZPQuickPtr1 +.2 inx bne .3 - inc ZPQuickPtr1+1 - -.3 inc ZPQuickPtr2 - bne .4 - inc ZPQuickPtr2+1 - -.4 tya - bne .5 - txa + pla + inc beq .8 - dex + pha -.5 dey - bra .2 -.8 rts +.3 lda (ZPQuickPtr1),y + sta (ZPQuickPtr2),y + iny + bne .2 + + inc ZPQuickPtr1+1 + inc ZPQuickPtr2+1 + bra .2 + +.8 rts CC from last ADC *-------------------------------------- K.InsDrv.DrvLen .BS 2 K.InsDrv.DrvEnd .BS 2 *-------------------------------------- +BIN.Relocate.SetCodeLenAX + eor #$ff + sta BIN.Relocate.nCodeLen + txa + eor #$ff + sta BIN.Relocate.nCodeLen+1 + rts +*-------------------------------------- * BIN.Relocate___ : -* ZPQuickPtr1 = Ptr to Code +* In : +* ZPQuickPtr1 = Ptr to Code +*-------------------------------------- +BIN.Relocate.SegLen .BS 2 Code+Data Len +BIN.Relocate.Start .BS 2 +BIN.Relocate.End .BS 2 +BIN.Relocate.Offset .BS 2 +BIN.Relocate.nCodeLen .BS 2 !Code length *-------------------------------------- BIN.RelocateEXE ldy #H.BIN.JMP relocate Main JMP lda (ZPQuickPtr1),y clc - adc Rel.Offset + adc BIN.Relocate.Offset sta (ZPQuickPtr1),y iny lda (ZPQuickPtr1),y - adc Rel.Offset+1 + adc BIN.Relocate.Offset+1 sta (ZPQuickPtr1),y ldy #H.BIN.RELOC.TABLE skip Header, CS.SIZE & DS.SIZE... (16 bytes) .HS 2C bit abs - +*-------------------------------------- BIN.RelocateDRV ldy #0 .1 lda (ZPQuickPtr1),y Start Relocate JMP table - tax + tax LO in X iny - ora (ZPQuickPtr1),y + ora (ZPQuickPtr1),y ORA with HI beq .2 $0000 = end of table dey - txa + txa get back LO clc - adc Rel.Offset + adc BIN.Relocate.Offset sta (ZPQuickPtr1),y iny lda (ZPQuickPtr1),y - adc Rel.Offset+1 + adc BIN.Relocate.Offset+1 sta (ZPQuickPtr1),y iny bra .1 +*-------------------------------------- +.2 tya add current offset in Y to Ptr + + sec + 1 to skip last 00 from beq .2 -.2 lda ZPQuickPtr1 - clc - adc Rel.CodeLen Make ZPQuickPtr2=End of code - sta ZPQuickPtr2 =ZPQuickPtr1+AX (code len) - lda ZPQuickPtr1+1 - adc Rel.CodeLen+1 - sta ZPQuickPtr2+1 - - iny - tya add current offset in Y to Ptr - clc adc ZPQuickPtr1 sta ZPQuickPtr1 - bcc .5 + bcc .3 inc ZPQuickPtr1+1 ZPQuickPtr1=Current Code PTR - clc -.5 lda (ZPQuickPtr1) get OPCODE +.3 inc BIN.Relocate.nCodeLen + bne .4 nCodeLen reached 0 ? + inc BIN.Relocate.nCodeLen+1 + beq .8 no, continue relocating + +.4 lda (ZPQuickPtr1) get OPCODE + lsr /2 tax lda BIN.OPCODES,x get OPCODE definition - bpl .7 abs addressing? + bcs .5 go get LO nibble + lsr + lsr move HI -> LO + lsr + lsr +.5 and #$0f - and #3 save Opcode length... + bit #$8 abs addressing? + beq .7 no.... + + and #7 save Opcode length... pha ldy #1 lda (ZPQuickPtr1),y Get LO - sec - sbc Rel.Start - iny - lda (ZPQuickPtr1),y Get HI - sbc Rel.Start+1 - bcc .6 addr < AX, out of range + tax save LO in X - dey - lda (ZPQuickPtr1),y Get LO - sec - sbc Rel.End - iny + iny make Y point to HI + + cpx BIN.Relocate.Start lda (ZPQuickPtr1),y Get HI - sbc Rel.End+1 - bcs .6 addr > CX, out of range + sbc BIN.Relocate.Start+1 + bcc .6 addr < BIN.Relocate.Start, out of range + txa Get back LO + cpx BIN.Relocate.End + lda (ZPQuickPtr1),y Get HI + sbc BIN.Relocate.End+1 + bcs .6 addr > BIN.Relocate.End, out of range + + txa Get back LO +* clc CC from bcs .6 + adc BIN.Relocate.Offset add Offset to abs address dey - lda (ZPQuickPtr1),y Get LO - clc - adc Rel.Offset add DX to abs address sta (ZPQuickPtr1),y store relocated addr LO iny lda (ZPQuickPtr1),y Get HI - adc Rel.Offset+1 + adc BIN.Relocate.Offset+1 sta (ZPQuickPtr1),y store relocated addr HI -.6 pla +.6 pla get back Opcode length... .7 clc A = OPCODE length adc ZPQuickPtr1 sta ZPQuickPtr1 - bcc .8 + bcc .3 inc ZPQuickPtr1+1 + bra .3 next opcode.... -.8 lda ZPQuickPtr1 is Current PTR < Code Limit ? - sec - sbc ZPQuickPtr2 - lda ZPQuickPtr1+1 - sbc ZPQuickPtr2+1 - bcc .5 yes, continue relocating - - clc +.8 clc rts *-------------------------------------- * 65C02 OPCODES -* Bit 7 : 1 absolute addressing -* Bit 1-0 : opcode + @ length +* Bit 3 : 1 = absolute addressing +* Bit 2-1-0 : opcode + @ length *-------------------------------------- -* x0.x1.x2.x3.x4.x5.x6.x7.x8.x9.xA.xB.xC.xD.xE.xF -BIN.OPCODES .HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 - .HS 83.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 - .HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03 - .HS 01.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.83.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.02.01.01.83.83.83.03 - .HS 02.02.02.01.02.02.02.02.01.83.01.01.01.83.83.03 -*-------------------------------------- -Rel.CodeLen .BS 2 -Rel.Start .BS 2 -Rel.End .BS 2 -Rel.Offset .BS 2 +* 0.1.2.3.4.5.6.7.8.9.A.B.C.D.E.F +BIN.OPCODES .HS 1.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 + .HS B.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 + .HS 1.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.B.1.1.1.B.B.3 + .HS 1.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.B.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.B.1.1.1.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.2.1.1.B.B.B.3 + .HS 2.2.2.1.2.2.2.2.1.B.1.1.1.B.B.3 *-------------------------------------- MAN SAVE SYS/KERNEL.S.BIN diff --git a/SYS/KERNEL.S.FIO.txt b/SYS/KERNEL.S.FIO.txt index fff2362f..db40b9fa 100644 --- a/SYS/KERNEL.S.FIO.txt +++ b/SYS/KERNEL.S.FIO.txt @@ -211,13 +211,10 @@ K.SaveFile >PULLW K.LoadFile.Mem .9 rts *-------------------------------------- -K.LoadFile.Filename .BS 2 K.LoadFile.hFile .BS 1 K.LoadFile.hMem .BS 1 K.LoadFile.Mem .BS 2 K.LoadFile.Len .BS 2 -K.LoadFile.hRef .BS 1 -K.LoadFile.hBuf .BS 1 *-------------------------------------- MAN SAVE SYS/KERNEL.S.FIO diff --git a/SYS/KERNEL.S.GP.txt b/SYS/KERNEL.S.GP.txt index 7e3af235..3acd12c7 100644 --- a/SYS/KERNEL.S.GP.txt +++ b/SYS/KERNEL.S.GP.txt @@ -131,7 +131,7 @@ GO.A2osX php sta CLRALTZP bra GO.EXIT -GO.A2osX.BNK ldx #$FF Self Modified +GO.A2osX.BNK ldx #RRAMWRAMBNK1 Self Modified, initialized to BNK1 for INIT3 bit $C000,x bit $C000,x diff --git a/SYS/KERNEL.S.INIT2.txt b/SYS/KERNEL.S.INIT2.txt index b8c54563..699c4112 100644 --- a/SYS/KERNEL.S.INIT2.txt +++ b/SYS/KERNEL.S.INIT2.txt @@ -56,7 +56,7 @@ Kernel.Init2 >LDAXI MSG.Init2 >STYA pStack init Soft Stack sta CLRALTZP Make MAIN ZP is enabled for X.PRINT.F - lda RROMBNK1 Make sure ROM is enabled for X.PRINT.F + bit RROMBNK1 Make sure ROM is enabled for X.PRINT.F cli lda #6 @@ -71,7 +71,9 @@ Kernel.Init2 >LDAXI MSG.Init2 >LDAXI MSG.Setup jsr PrintCStrAX - jsr GO.A2osX + sta SETALTZP + lda RRAMWRAMBNK1 + lda RRAMWRAMBNK1 jsr K.IrqMgrInit bcs * @@ -86,8 +88,8 @@ Kernel.Init2 >LDAXI MSG.Init2 jsr K.TskMgrInit bcs * - jsr GO.ProDOS Make sure MAIN ZP... - lda RROMBNK1 ... & ROM is enabled for X.PRINT.F + sta CLRALTZP Make MAIN ZP is enabled for X.PRINT.F + bit RROMBNK1 Make sure ROM is enabled for X.PRINT.F >LDAXI MSG.Init2.OK jsr PrintCStrAX @@ -391,6 +393,12 @@ K.EvtMgrInit lda #10 clc rts *-------------------------------------- +* K.FltMgrInit +*-------------------------------------- +K.FltMgrInit stz FltMgr.Table + clc + rts +*-------------------------------------- * K.TskMgrInit *-------------------------------------- K.TskMgrInit stz TSKMGR.LASTID @@ -430,6 +438,8 @@ K.TskMgrInit stz TSKMGR.LASTID ldy #S.PS.hERRDEV sta (pPs),y Make ERR DEV = SYS + >DEBUG + >SYSCALL SYS.GetDevByIDA >STYA pDev ldx #DEVMGR.OPEN @@ -474,10 +484,6 @@ K.TskMgrInit stz TSKMGR.LASTID >SYSCALL SYS.PutEnvYA .9 rts *-------------------------------------- -K.FltMgrInit stz FltMgr.Table - clc - rts -*-------------------------------------- I.ENV.A2osX >PSTRING "A2OSX" I.ENV.PATH >PSTRING "PATH=${A2OSX}SBIN/;${A2OSX}BIN/" I.ENV.LIB >PSTRING "LIB=${A2OSX}LIB/" diff --git a/SYS/KERNEL.S.JMP.txt b/SYS/KERNEL.S.JMP.txt index 4d71a0c8..75125a3c 100644 --- a/SYS/KERNEL.S.JMP.txt +++ b/SYS/KERNEL.S.JMP.txt @@ -26,7 +26,7 @@ KERNEL.SYSCALL .DA K.PStrMatch .DA K.PStrUprYA .DA K.PStrLwrYA - .DA 0 + .DA K.PStrFTime .DA K.PStr2StrArrayYA *-------------------------------------- .DA K.ExecProcessNewEnvYA $20 @@ -65,7 +65,7 @@ KERNEL.SYSCALL .DA K.TimeYA .DA K.CTime2Time .DA K.PTime2Time - .DA K.StrFTime + .DA 0 *-------------------------------------- .DA K.FOPEN $60 .DA K.FCLOSEA diff --git a/SYS/KERNEL.S.LIB.txt b/SYS/KERNEL.S.LIB.txt index 1f66adeb..f93d70f4 100644 --- a/SYS/KERNEL.S.LIB.txt +++ b/SYS/KERNEL.S.LIB.txt @@ -78,11 +78,11 @@ K.UnloadLibA pha .1 ldy #S.MEM.PTR lda (ZPQuickPtr1),y - pha + sta pLib + iny lda (ZPQuickPtr1),y - ply - >STYA pLib + sta pLib+1 ldx #LIBMGR.UNLOAD jsr pLibJmp Call LIB.UNLOAD function diff --git a/SYS/KERNEL.S.STR.txt b/SYS/KERNEL.S.STR.txt index bc0a1147..637332ab 100644 --- a/SYS/KERNEL.S.STR.txt +++ b/SYS/KERNEL.S.STR.txt @@ -178,7 +178,10 @@ K.PStrUprYA ldx #0 .HS 2C bit abs K.PStrLwrYA ldx #2 >STYA ZPQuickPtr1 - + + pha save Y,A to restore them at exit + phy + lda (ZPQuickPtr1) tay @@ -192,11 +195,255 @@ K.PStrLwrYA ldx #2 .2 dey bne .1 + ply + pla clc rts *-------------------------------------- K.PStrUprLwr .AS "azAZ" *-------------------------------------- +* K.PStrFTime +* In : +* PULLW = Src PTR To S.Time +* PULLW = Src PTR To Format String +* PULLW = Dst PTR To PSTR Buf +* %a Abbreviated weekday name : Thu +* %A Full weekday name : Thursday +* %b Abbreviated month name : Aug +* %B Full month name : August +* %d Day of the month, zero-padded (01-31) +* %H Hour in 24h format (00-23) 14 +* %I Hour in 12h format (01-12) 02 +* %m Month as a decimal number (01-12) 08 +* %M Minute (00-59) 55 +* %p AM or PM designation PM +* %S Second (00-61) 02 +* %w Weekday as a decimal number with Sunday as 0 (0-6) +* %y Year, last two digits (00-99) +* %Y Year four digits 2001 +* PULLW = Dst PSTR Buffer +*-------------------------------------- +K.PStrFTime >PULLW ZPQuickPtr1 + >PULLW ZPQuickPtr2 + >PULLW ZPQuickPtr3 + + lda #0 + sta (ZPQuickPtr3) Reset target PSTR length + + tay + +.1 iny + lda (ZPQuickPtr2),y + cmp #'%' + beq .2 + + phy + jsr K.PStrFTime.addChar + ply +.10 tya + cmp (ZPQuickPtr2) + bne .1 + rts + +.2 tya + cmp (ZPQuickPtr2) + beq .8 + + iny + ldx #K.PStrFTime.JMPL-K.PStrFTime.Tbl-1 + +.3 lda (ZPQuickPtr2),y + cmp K.PStrFTime.Tbl,x + beq .4 + dex + bpl .3 + beq .10 + +.4 lda K.PStrFTime.JMPL,x + sta .5+1 + lda K.PStrFTime.JMPH,x + sta .5+2 + phy +.5 jsr $ffff + ply + bra .10 + +.8 rts +*-------------------------------------- +K.PStrFTime.TBL .AS "aAbBdHImMpSwyY" +K.PStrFTime.JMPL .DA #K.PStrFTime.A + .DA #K.PStrFTime.AA + .DA #K.PStrFTime.B + .DA #K.PStrFTime.BB + .DA #K.PStrFTime.D + .DA #K.PStrFTime.HH + .DA #K.PStrFTime.II + .DA #K.PStrFTime.M + .DA #K.PStrFTime.MM + .DA #K.PStrFTime.P + .DA #K.PStrFTime.SS + .DA #K.PStrFTime.W + .DA #K.PStrFTime.Y + .DA #K.PStrFTime.YY +*-------------------------------------- +K.PStrFTime.JMPH .DA /K.PStrFTime.A + .DA /K.PStrFTime.AA + .DA /K.PStrFTime.B + .DA /K.PStrFTime.BB + .DA /K.PStrFTime.D + .DA /K.PStrFTime.HH + .DA /K.PStrFTime.II + .DA /K.PStrFTime.M + .DA /K.PStrFTime.MM + .DA /K.PStrFTime.P + .DA /K.PStrFTime.SS + .DA /K.PStrFTime.W + .DA /K.PStrFTime.Y + .DA /K.PStrFTime.YY +*-------------------------------------- +K.PStrFTime.A ldx #3 Max Len + .HS 2C Bit abs + +K.PStrFTime.AA ldx #15 + >LDYAI K.PStrFTime.DAY + >STYA ZPQuickPtr4 + ldy #S.Time.WDAY + bra K.PStrFTime.STR + +K.PStrFTime.B ldx #3 + .HS 2C Bit abs + +K.PStrFTime.BB ldx #15 + >LDYAI K.PStrFTime.MON + >STYA ZPQuickPtr4 + ldy #S.Time.MONTH + +K.PStrFTime.STR lda (ZPQuickPtr1),y get required S.Time field value + tay + beq .8 Illegal value + +.1 dey range 0..x + beq .2 + lda (ZPQuickPtr4) + sec + adc ZPQuickPtr4 + sta ZPQuickPtr4 + bcc .1 + inc ZPQuickPtr4+1 + bra .1 + +.2 ldy #0 + +.3 iny + lda (ZPQuickPtr4),y + phy + jsr K.PStrFTime.addChar + pla + cmp (ZPQuickPtr4) + beq .8 + + tay + dex + bne .3 + +.8 rts + +K.PStrFTime.D ldy #S.Time.DAY + bra K.PStrFTime.addDecPtr1Y +K.PStrFTime.HH ldy #S.Time.HOUR + bra K.PStrFTime.addDecPtr1Y +K.PStrFTime.II ldy #S.Time.HOUR + lda (ZPQuickPtr1),y + cmp #12 + bcc .1 + sbc #12 +.1 bra K.PStrFTime.addDecA +K.PStrFTime.M ldy #S.Time.MONTH + bra K.PStrFTime.addDecPtr1Y +K.PStrFTime.MM ldy #S.Time.MINUTE + bra K.PStrFTime.addDecPtr1Y +K.PStrFTime.P ldy #S.Time.HOUR + lda (ZPQuickPtr1),y + cmp #12 + bcc .1 + lda #'p' + .HS 2C bit abs +.1 lda #'a' + jsr K.PStrFTime.addChar + lda #'m' + bra K.PStrFTime.addChar +K.PStrFTime.SS ldy #S.Time.SECOND + bra K.PStrFTime.addDecPtr1Y +K.PStrFTime.W ldy #S.Time.WDAY + bra K.PStrFTime.addDecPtr1Y +K.PStrFTime.YY ldy #S.Time.CENTURY + jsr K.PStrFTime.addDecPtr1Y +K.PStrFTime.Y ldy #S.Time.YEAR +*-------------------------------------- +K.PStrFTime.addDecPtr1Y + lda (ZPQuickPtr1),y +K.PStrFTime.addDecA + sta K.PStrFTime.BIN + stz K.PStrFTime.DEC + sed + ldx #8 + +.1 asl K.PStrFTime.BIN + + lda K.PStrFTime.DEC + adc K.PStrFTime.DEC + sta K.PStrFTime.DEC + + dex + bne .1 + cld + +* lda K.PStrFTime.DEC already in A + + lsr + lsr + lsr + lsr + ora #$30 + jsr K.PStrFTime.addChar + lda K.PStrFTime.DEC + and #$0f + ora #$30 +*-------------------------------------- +K.PStrFTime.addChar + pha + lda (ZPQuickPtr3) + inc + sta (ZPQuickPtr3) + tay + pla + sta (ZPQuickPtr3),y + rts +*-------------------------------------- +K.PStrFTime.DAY >PSTRING "Monday" + >PSTRING "Tuesday" + >PSTRING "Wednesday" + >PSTRING "Thursday" + >PSTRING "Friday" + >PSTRING "Saturday" + >PSTRING "Sunday" +*-------------------------------------- +K.PStrFTime.MON >PSTRING "January" + >PSTRING "February" + >PSTRING "March" + >PSTRING "April" + >PSTRING "May" + >PSTRING "June" + >PSTRING "July" + >PSTRING "August" + >PSTRING "September" + >PSTRING "October" + >PSTRING "November" + >PSTRING "December" +*-------------------------------------- +K.PStrFTime.BIN .BS 1 +K.PStrFTime.DEC .BS 1 always < 100 +*-------------------------------------- * K.PStr2StrArrayYA * In : * Y,A = PTR to String diff --git a/SYS/KERNEL.S.TIME.txt b/SYS/KERNEL.S.TIME.txt index 8971a488..645b4dfb 100644 --- a/SYS/KERNEL.S.TIME.txt +++ b/SYS/KERNEL.S.TIME.txt @@ -95,7 +95,7 @@ K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7) cmp K.CTime.Year beq .4 -.2 jsr K.IsLeapYearYA CC = Leap +.2 jsr TIME.IsLeapYearYA CC = Leap lda #0 rol eor #1 @@ -126,7 +126,7 @@ K.ComputeWDAY lda #3 Thursday : 4 (-1 for mod 7) ldy K.CTime.Century lda K.CTime.Year - jsr K.IsLeapYearYA CC = Leap + jsr TIME.IsLeapYearYA CC = Leap lda #0 rol eor #1 @@ -309,7 +309,7 @@ K.CTime2Time >PULLW ZPQuickPtr1 K.CTime2Time.Year .1 ldy K.CTime.Century lda K.CTime.Year - jsr K.IsLeapYearYA if Leap year CC + jsr TIME.IsLeapYearYA if Leap year CC lda K.CTime.DivDay sbc #365 pha @@ -340,245 +340,6 @@ K.CTime2Time.Year clc rts *-------------------------------------- -* K.StrFTime -* In : -* PULLW = Src PTR To K.Time -* PULLW = Src PTR To Format String -* PULLW = Dst PTR To PSTR Buf -* %a Abbreviated weekday name : Thu -* %A Full weekday name : Thursday -* %b Abbreviated month name : Aug -* %B Full month name : August -* %d Day of the month, zero-padded (01-31) -* %H Hour in 24h format (00-23) 14 -* %I Hour in 12h format (01-12) 02 -* %m Month as a decimal number (01-12) 08 -* %M Minute (00-59) 55 -* %p AM or PM designation PM -* %S Second (00-61) 02 -* %w Weekday as a decimal number with Sunday as 0 (0-6) -* %y Year, last two digits (00-99) -* %Y Year four digits 2001 -* PULLW = Dst PSTR Buffer -*-------------------------------------- -K.StrFTime >PULLW ZPQuickPtr1 - >PULLW ZPQuickPtr2 - >PULLW ZPQuickPtr3 - - lda #0 - sta (ZPQuickPtr3) Reset target PSTR length - - tay - -.1 iny - lda (ZPQuickPtr2),y - cmp #'%' - beq .2 - - phy - jsr K.StrFTime.addChar - ply -.10 tya - cmp (ZPQuickPtr2) - bne .1 - rts - -.2 tya - cmp (ZPQuickPtr2) - beq .8 - - iny - ldx #K.StrFTime.JMPL-K.StrFTime.Tbl-1 - -.3 lda (ZPQuickPtr2),y - cmp K.StrFTime.Tbl,x - beq .4 - dex - bpl .3 - beq .10 - -.4 lda K.StrFTime.JMPL,x - sta .5+1 - lda K.StrFTime.JMPH,x - sta .5+2 - phy -.5 jsr $ffff - ply - bra .10 - -.8 rts -*-------------------------------------- -K.StrFTime.A ldx #3 Max Len - .HS 2C Bit abs - -K.StrFTime.AA ldx #15 - >LDYAI K.StrFTime.DAY - >STYA ZPQuickPtr4 - ldy #S.Time.WDAY - bra K.StrFTime.STR - -K.StrFTime.B ldx #3 - .HS 2C Bit abs - -K.StrFTime.BB ldx #15 - >LDYAI K.StrFTime.MON - >STYA ZPQuickPtr4 - ldy #S.Time.MONTH - -K.StrFTime.STR lda (ZPQuickPtr1),y get required S.Time field value - tay - beq .8 Illegal value - -.1 dey range 0..x - beq .2 - lda (ZPQuickPtr4) - sec - adc ZPQuickPtr4 - sta ZPQuickPtr4 - bcc .1 - inc ZPQuickPtr4+1 - bra .1 - -.2 ldy #0 - -.3 iny - lda (ZPQuickPtr4),y - phy - jsr K.StrFTime.addChar - pla - cmp (ZPQuickPtr4) - beq .8 - - tay - dex - bne .3 - -.8 rts - -K.StrFTime.D ldy #S.Time.DAY - bra K.StrFTime.addDecPtr1Y -K.StrFTime.HH ldy #S.Time.HOUR - bra K.StrFTime.addDecPtr1Y -K.StrFTime.II ldy #S.Time.HOUR - lda (ZPQuickPtr1),y - cmp #12 - bcc .1 - sbc #12 -.1 bra K.StrFTime.addDecA -K.StrFTime.M ldy #S.Time.MONTH - bra K.StrFTime.addDecPtr1Y -K.StrFTime.MM ldy #S.Time.MINUTE - bra K.StrFTime.addDecPtr1Y -K.StrFTime.P ldy #S.Time.HOUR - lda (ZPQuickPtr1),y - cmp #12 - bcc .1 - lda #'p' - .HS 2C bit abs -.1 lda #'a' - jsr K.StrFTime.addChar - lda #'m' - bra K.StrFTime.addChar -K.StrFTime.SS ldy #S.Time.SECOND - bra K.StrFTime.addDecPtr1Y -K.StrFTime.W ldy #S.Time.WDAY - bra K.StrFTime.addDecPtr1Y -K.StrFTime.YY ldy #S.Time.CENTURY - jsr K.StrFTime.addDecPtr1Y -K.StrFTime.Y ldy #S.Time.YEAR -*-------------------------------------- -K.StrFTime.addDecPtr1Y - lda (ZPQuickPtr1),y -K.StrFTime.addDecA - sta K.StrFTime.BIN - stz K.StrFTime.DEC - sed - ldx #8 - -.1 asl K.StrFTime.BIN - - lda K.StrFTime.DEC - adc K.StrFTime.DEC - sta K.StrFTime.DEC - - dex - bne .1 - cld - -* lda K.StrFTime.DEC already in A - - lsr - lsr - lsr - lsr - ora #$30 - jsr K.StrFTime.addChar - lda K.StrFTime.DEC - and #$0f - ora #$30 -*-------------------------------------- -K.StrFTime.addChar - pha - lda (ZPQuickPtr3) - inc - sta (ZPQuickPtr3) - tay - pla - sta (ZPQuickPtr3),y - rts -*-------------------------------------- -K.StrFTime.TBL .AS "aAbBdHImMpSwyY" -K.StrFTime.JMPL .DA #K.StrFTime.A - .DA #K.StrFTime.AA - .DA #K.StrFTime.B - .DA #K.StrFTime.BB - .DA #K.StrFTime.D - .DA #K.StrFTime.HH - .DA #K.StrFTime.II - .DA #K.StrFTime.M - .DA #K.StrFTime.MM - .DA #K.StrFTime.P - .DA #K.StrFTime.SS - .DA #K.StrFTime.W - .DA #K.StrFTime.Y - .DA #K.StrFTime.YY -*-------------------------------------- -K.StrFTime.JMPH .DA /K.StrFTime.A - .DA /K.StrFTime.AA - .DA /K.StrFTime.B - .DA /K.StrFTime.BB - .DA /K.StrFTime.D - .DA /K.StrFTime.HH - .DA /K.StrFTime.II - .DA /K.StrFTime.M - .DA /K.StrFTime.MM - .DA /K.StrFTime.P - .DA /K.StrFTime.SS - .DA /K.StrFTime.W - .DA /K.StrFTime.Y - .DA /K.StrFTime.YY -*-------------------------------------- -K.StrFTime.DAY >PSTRING "Monday" - >PSTRING "Tuesday" - >PSTRING "Wednesday" - >PSTRING "Thursday" - >PSTRING "Friday" - >PSTRING "Saturday" - >PSTRING "Sunday" -*-------------------------------------- -K.StrFTime.MON >PSTRING "January" - >PSTRING "February" - >PSTRING "March" - >PSTRING "April" - >PSTRING "May" - >PSTRING "June" - >PSTRING "July" - >PSTRING "August" - >PSTRING "September" - >PSTRING "October" - >PSTRING "November" - >PSTRING "December" -*-------------------------------------- * In : * Y = Century * A = Year (0..99) @@ -589,7 +350,8 @@ K.StrFTime.MON >PSTRING "January" * CC = Leap * CS = Not Leap *-------------------------------------- -K.IsLeapYearYA cmp #0 Year = 00 ? +TIME.IsLeapYearYA + cmp #0 Year = 00 ? bne .1 no tya year = 00, get century in a @@ -605,6 +367,7 @@ K.IsLeapYearYA cmp #0 Year = 00 ? .9 clc Leap rts *-------------------------------------- +K.StrFTime.MDAY .DA #3,#0,#3,#2,#3,#2,#3,#3,#2,#3,#2,#3 K.CTime.DWORD .BS 4 K.CTime.DivDay .BS 2 K.CTime.ModDay .BS 3 @@ -613,11 +376,6 @@ K.CTime.Div3600 .BS 1 K.CTime.Mod .BS 1 K.CTime.Century .BS 1 K.CTime.Year .BS 1 -*-------------------------------------- -K.StrFTime.BIN .BS 1 -K.StrFTime.DEC .BS 1 always < 100 -*-------------------------------------- -K.StrFTime.MDAY .DA #3,#0,#3,#2,#3,#2,#3,#3,#2,#3,#2,#3 MAN SAVE SYS/KERNEL.S.Time LOAD SYS/KERNEL.S diff --git a/SYS/KERNEL.S.txt b/SYS/KERNEL.S.txt index 0c5e5052..ee11fb26 100644 --- a/SYS/KERNEL.S.txt +++ b/SYS/KERNEL.S.txt @@ -38,8 +38,9 @@ ZPQuickPtr4 .EQ ZPKERNEL+6 *-------------------------------------- * Kernel Init Stage 3 *-------------------------------------- - jsr GO.A2osX - + sta SETALTZP + bit RRAMWRAMBNK1 + bit RRAMWRAMBNK1 jsr Kernel.Init3 >DEBUGOA *--------------------------------------