Kernel version 0.8 : API finalized and dispatched in LCBNK1/2, now fits in BNK1/BNK2

This commit is contained in:
Rémy GIBERT 2016-09-28 17:34:15 +02:00
parent 127f89cedc
commit 270098e108
11 changed files with 438 additions and 445 deletions

Binary file not shown.

Binary file not shown.

View File

@ -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
>STYA ZPQuickPtr1
jsr BIN.InstallEXE
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
.3 lda (ZPQuickPtr1),y
sta (ZPQuickPtr2),y
iny
bne .2
inc ZPQuickPtr1+1
inc ZPQuickPtr2+1
bra .2
.8 rts
.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___ :
* 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
.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
sec + 1 to skip last 00 from beq .2
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
lda (ZPQuickPtr1),y Get HI
sbc Rel.End+1
bcs .6 addr > CX, out of range
iny make Y point to HI
cpx BIN.Relocate.Start
lda (ZPQuickPtr1),y Get HI
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

View File

@ -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

View File

@ -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

View File

@ -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/"

View File

@ -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

View File

@ -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

View File

@ -179,6 +179,9 @@ K.PStrUprYA ldx #0
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

View File

@ -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

View File

@ -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
*--------------------------------------