A2osX/BIN/CC.S.PCC.txt

729 lines
13 KiB
Plaintext
Raw Normal View History

2022-08-20 14:37:37 +00:00
NEW
AUTO 3,1
*--------------------------------------
* PCC = Pre Compiled Code
*--------------------------------------
ZS.RT.Ptr1 .EQ ZPBIN
ZS.RT.Ptr2 .EQ ZPBIN+2
*--------------------------------------
PCC.FH .PH $2000
PCC.FH.ORG cld
2022-08-20 14:37:37 +00:00
jmp (PCC.FH.JMP,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA #0 S.PS.F.EVENT
.DA #0
PCC.FH.CSSIZE .EQ *-PCC.FH.ORG
.DA $FFFF Code Size (without Constants)
PCC.FH.DSSIZE .EQ *-PCC.FH.ORG
.DA $FFFF Data Size
2022-08-20 14:37:37 +00:00
.DA #256 Stack Size
.DA #4 ZP Size
.DA 0
PCC.FH.JMP .DA PCC.FH.INIT
.DA PCC.FH.RUN
.DA PCC.FH.DOEVENT
.DA PCC.FH.QUIT
PCC.FH.CONST .EQ *-PCC.FH.ORG
.DA $FFFF
PCC.FH.LIBS .EQ *-PCC.FH.ORG
2022-08-20 14:37:37 +00:00
.DA $FFFF
.DA 0
PCC.FH.INIT >LDYA PCC.FH.ORG+PCC.FH.LIBS
>STYA ZS.RT.Ptr1
ldx #0
.1 lda (ZS.RT.Ptr1)
beq .8
phx
>LDYA ZS.RT.Ptr1
>SYSCALL LoadLib
plx
bcs .9
sta PCC.PH.hLIBs,x
phx
>SYSCALL GetMemPtr
plx
>STYA PCC.PH.JMPLIBs+1,x
inx
inx
inx
inx
ldy #0
.2 iny
lda (ZS.RT.Ptr1),y
bne .2
tya
sec
adc ZS.RT.Ptr1
sta ZS.RT.Ptr1
bcc .1
inc ZS.RT.Ptr1+1
bra .1
.8 clc
.9 rts
PCC.FH.QUIT ldx #12
.1 lda PCC.PH.hLIBs,x
beq .2
phx
>SYSCALL UnloadLib
plx
.2 dex
dex
dex
dex
bpl .1
clc
rts
PCC.PH.hLIBs .DA #0
PCC.PH.JMPLIBs jmp $FFFF
.DA #0
jmp $FFFF
.DA #0
jmp $FFFF
.DA #0
jmp $FFFF
PCC.FH.DOEVENT sec do not discard TIMER event
2022-08-20 14:37:37 +00:00
rts
* int main(int argc, char *argv[]) ;
PCC.FH.RUN lda #0
.1 pha
>SYSCALL ArgV
bcs .2
>STYA ZS.RT.Ptr1
pla
pha
asl
tay
lda ZS.RT.Ptr1
sta (pData),y
lda ZS.RT.Ptr1+1
iny
sta (pData),y
pla
inc
bra .1
.2 pla
jsr PCC.FH.CS Execute INIT code
lda #0
>PUSHA returned int=0
2022-08-20 14:37:37 +00:00
>PUSHA
>PUSHA int ARGC (hi byte)
2022-08-20 14:37:37 +00:00
ldy #S.PS.ARGC
lda (pPS),y
>PUSHA int ARGC (lo byte)
2022-08-20 14:37:37 +00:00
>PUSHW pData *char[] ARGV
* >DEBUG
PCC.FH.MAIN .EQ *-PCC.FH.ORG+1
jsr $FFFF jsr main
2022-08-20 14:37:37 +00:00
>PULLA
inc pStack pull returned int
sec
rts
*PCC.FH.SYSCALL jsr A2osX.SYSCALL
* bcc .8
* inc pStack
* eor #$ff
* inc
* >PUSHA int -ERROR code...
* ldy #1
* lda #$FF
* sta (pStack),y FFxx on stack
*.8
PCC.FH.CS .EP
PCC.FH.L .EQ *-PCC.FH
*--------------------------------------
PCC.DEBUG .DA #PCC.DEBUG.L
>DEBUG
PCC.DEBUG.L .EQ *-PCC.DEBUG
*--------------------------------------
PCC.SLEEP .DA #PCC.SLEEP.L
>SLEEP
PCC.SLEEP.L .EQ *-PCC.SLEEP
*--------------------------------------
PCC.ENTER .DA #PCC.ENTER.L
ldx pBase
phx
clc
adc pStack A = Local Size
sta pBase
PCC.ENTER.L .EQ *-PCC.ENTER
*--------------------------------------
PCC.LEAVE .DA #PCC.LEAVE.L
ldx pBase
stx pStack
plx
stx pBase
rts
PCC.LEAVE.L .EQ *-PCC.LEAVE
*--------------------------------------
PCC.ADDLOCAL .DA #PCC.ADDLOCAL.L
clc
adc pStack
sta pStack
PCC.ADDLOCAL.L .EQ *-PCC.ADDLOCAL
*--------------------------------------
PCC.SetRetValue .DA #PCC.SetRetValue.L
ldy #0
.1 >PULLA
sta (pBase),y
iny
dex
bne .1
PCC.SetRetValue.L .EQ *-PCC.SetRetValue
*--------------------------------------
PCC.TestZero1 .DA #PCC.TestZero1.L
>PULLA
tay
.2 bne .2+5 skip JMP abs
PCC.TestZero1.L .EQ *-PCC.TestZero1
*--------------------------------------
PCC.TestZero2 .DA #PCC.TestZero2.L
>PULLA
ora (pStack)
inc pStack
tay
.2 bne .2+5 skip JMP abs
PCC.TestZero2.L .EQ *-PCC.TestZero2
*--------------------------------------
PCC.TestZeroX .DA #PCC.TestZeroX.L
lda #0
.1 ora (pStack)
inc pStack
dex
bne .1
tay
.2 bne .2+5 skip JMP abs
PCC.TestZeroX.L .EQ *-PCC.TestZeroX
*--------------------------------------
PCC.TestnZero1 .DA #PCC.TestnZero1.L
>PULLA
tay
.2 beq .2+5 skip JMP abs
PCC.TestnZero1.L .EQ *-PCC.TestnZero1
*--------------------------------------
PCC.TestnZero2 .DA #PCC.TestnZero2.L
>PULLA
ora (pStack)
inc pStack
tay
.2 beq .2+5 skip JMP abs
PCC.TestnZero2.L .EQ *-PCC.TestnZero2
*--------------------------------------
PCC.TestnZeroX .DA #PCC.TestnZeroX.L
lda #0
.1 ora (pStack)
inc pStack
dex
bne .1
tay
.2 beq .2+5 skip JMP abs
PCC.TestnZeroX.L .EQ *-PCC.TestnZeroX
*--------------------------------------
PCC.PushLAddrH .DA #PCC.PushLAddrH.L
>PUSHB pBase+1
PCC.PushLAddrH.L .EQ *-PCC.PushLAddrH
*--------------------------------------
PCC.PushLAddrL .DA #PCC.PushLAddrL.L
clc
adc pBase
>PUSHA
PCC.PushLAddrL.L .EQ *-PCC.PushLAddrL
*--------------------------------------
PCC.PushIAddr .DA #PCC.PushIAddr.L
clc
adc PCC.FH.ORG+PCC.FH.CONST
2022-08-20 14:37:37 +00:00
dec pStack
>PUSHA
txa
adc PCC.FH.ORG+PCC.FH.CONST+1
2022-08-20 14:37:37 +00:00
ldy #1
sta (pStack),y
PCC.PushIAddr.L .EQ *-PCC.PushIAddr
*--------------------------------------
PCC.PushUAddr .DA #PCC.PushUAddr.L
clc
adc pData
dec pStack
>PUSHA
txa
adc pData+1
ldy #1
sta (pStack),y
PCC.PushUAddr.L .EQ *-PCC.PushUAddr
*--------------------------------------
PCC.GetLAddr1 .DA #PCC.GetLAddr1.L
clc
adc pBase
sta ZS.RT.Ptr1
lda pBase+1
sta ZS.RT.Ptr1+1
PCC.GetLAddr1.L .EQ *-PCC.GetLAddr1
*--------------------------------------
PCC.GetIAddr1 .DA #PCC.GetIAddr1.L
clc
adc PCC.FH.ORG+PCC.FH.CONST
2022-08-20 14:37:37 +00:00
sta ZS.RT.Ptr1
txa
adc PCC.FH.ORG+PCC.FH.CONST+1
2022-08-20 14:37:37 +00:00
sta ZS.RT.Ptr1+1
PCC.GetIAddr1.L .EQ *-PCC.GetIAddr1
*--------------------------------------
PCC.GetUAddr1 .DA #PCC.GetUAddr1.L
clc
adc pData
sta ZS.RT.Ptr1
txa
adc pData+1
sta ZS.RT.Ptr1+1
PCC.GetUAddr1.L .EQ *-PCC.GetUAddr1
*--------------------------------------
PCC.PopAddr1 .DA #PCC.PopAddr1.L
>PULLA
sta ZS.RT.Ptr1
>PULLA
sta ZS.RT.Ptr1+1
PCC.PopAddr1.L .EQ *-PCC.PopAddr1
*--------------------------------------
PCC.PopValue1 .DA #PCC.PopValue1.L
>PULLA
sta (ZS.RT.Ptr1)
PCC.PopValue1.L .EQ *-PCC.PopValue1
*--------------------------------------
PCC.PopValue2 .DA #PCC.PopValue2.L
>PULLA
sta (ZS.RT.Ptr1)
>PULLA
ldy #1
2022-08-20 14:37:37 +00:00
sta (ZS.RT.Ptr1),y
PCC.PopValue2.L .EQ *-PCC.PopValue2
*--------------------------------------
PCC.PopValueX .DA #PCC.PopValueX.L
ldy #0
.1 >PULLA
sta (ZS.RT.Ptr1),y
iny
dex
2022-08-20 14:37:37 +00:00
bpl .1
PCC.PopValueX.L .EQ *-PCC.PopValueX
2022-08-20 14:37:37 +00:00
*--------------------------------------
PCC.GetLAddr2 .DA #PCC.GetLAddr2.L
clc
adc pBase
sta ZS.RT.Ptr2
lda pBase+1
sta ZS.RT.Ptr2+1
PCC.GetLAddr2.L .EQ *-PCC.GetLAddr2
*--------------------------------------
PCC.GetIAddr2 .DA #PCC.GetIAddr2.L
clc
adc PCC.FH.ORG+PCC.FH.CONST
2022-08-20 14:37:37 +00:00
sta ZS.RT.Ptr2
txa
adc PCC.FH.ORG+PCC.FH.CONST+1
2022-08-20 14:37:37 +00:00
sta ZS.RT.Ptr2+1
PCC.GetIAddr2.L .EQ *-PCC.GetIAddr2
*--------------------------------------
PCC.GetUAddr2 .DA #PCC.GetUAddr2.L
clc
adc pData
sta ZS.RT.Ptr2
txa
adc pData+1
sta ZS.RT.Ptr2+1
PCC.GetUAddr2.L .EQ *-PCC.GetUAddr2
*--------------------------------------
PCC.PopAddr2 .DA #PCC.PopAddr2.L
>PULLA
sta ZS.RT.Ptr2
>PULLA
sta ZS.RT.Ptr2+1
PCC.PopAddr2.L .EQ *-PCC.PopAddr2
*--------------------------------------
PCC.Deref2 .DA #PCC.Deref2.L
ldy #1
lda (ZS.RT.Ptr2),y
tay
lda (ZS.RT.Ptr2)
sta ZS.RT.Ptr2
sty ZS.RT.Ptr2+1
PCC.Deref2.L .EQ *-PCC.Deref2
*--------------------------------------
PCC.PushDeref2 .DA #PCC.PushDeref2.L
ldy #1
>PUSHB (ZS.RT.Ptr2),y
>PUSHB (ZS.RT.Ptr2)
PCC.PushDeref2.L .EQ *-PCC.PushDeref2
*--------------------------------------
PCC.PushValue1 .DA #PCC.PushValue1.L
lda (ZS.RT.Ptr2)
>PUSHA
PCC.PushValue1.L .EQ *-PCC.PushValue1
*--------------------------------------
PCC.PushValue2 .DA #PCC.PushValue2.L
ldy #1
lda (ZS.RT.Ptr2),y
>PUSHA
lda (ZS.RT.Ptr2)
>PUSHA
PCC.PushValue2.L .EQ *-PCC.PushValue2
*--------------------------------------
PCC.PushValueY .DA #PCC.PushValueY.L
2022-08-20 14:37:37 +00:00
.1 lda (ZS.RT.Ptr2),y
>PUSHA
dey
bpl .1
PCC.PushValueY.L .EQ *-PCC.PushValueY
2022-08-20 14:37:37 +00:00
*--------------------------------------
PCC.Inc1 .DA #PCC.Inc1.L
lda (ZS.RT.Ptr2)
inc
sta (ZS.RT.Ptr2)
PCC.Inc1.L .EQ *-PCC.Inc1
*--------------------------------------
PCC.Inc2 .DA #PCC.Inc2.L
lda (ZS.RT.Ptr2)
inc
sta (ZS.RT.Ptr2)
bne .1
ldy #1
lda (ZS.RT.Ptr2),y
inc
sta (ZS.RT.Ptr2),y
.1
PCC.Inc2.L .EQ *-PCC.Inc2
*--------------------------------------
PCC.Inc4 .DA #PCC.Inc4.L
lda (ZS.RT.Ptr2)
inc
sta (ZS.RT.Ptr2)
bne .2
ldy #1
.1 lda (ZS.RT.Ptr2),y
inc
sta (ZS.RT.Ptr2),y
beq .2
iny
cpy #4
bne .1
.2
PCC.Inc4.L .EQ *-PCC.Inc4
*--------------------------------------
PCC.Dec1 .DA #PCC.Dec1.L
lda (ZS.RT.Ptr2)
dec
sta (ZS.RT.Ptr2)
PCC.Dec1.L .EQ *-PCC.Dec1
*--------------------------------------
PCC.Dec2 .DA #PCC.Dec2.L
lda (ZS.RT.Ptr2)
php
dec
sta (ZS.RT.Ptr2)
plp
bne .1
ldy #1
lda (ZS.RT.Ptr2),y
dec
sta (ZS.RT.Ptr2),y
.1
PCC.Dec2.L .EQ *-PCC.Dec2
*--------------------------------------
PCC.Dec4 .DA #PCC.Dec4.L
lda (ZS.RT.Ptr2)
clc
sbc #0
sta (ZS.RT.Ptr2)
bcs .2
ldy #1
.1 lda (ZS.RT.Ptr2),y
sbc #0
sta (ZS.RT.Ptr2),y
bcs .2
iny
cpy #4
bne .1
.2
PCC.Dec4.L .EQ *-PCC.Dec4
*--------------------------------------
PCC.BOPS.bMUL .DA #PCC.BOPS.bMUL.L
ldx #0 result
>PULLA
tay b2
.1 tya
beq .8
lsr
tay
bcc .2
clc
txa
adc (pStack) b1
tax
.2 lda (pStack) b1*2
asl
sta (pStack)
bne .1
.8 txa
sta (pStack)
PCC.BOPS.bMUL.L .EQ *-PCC.BOPS.bMUL
2022-08-20 14:37:37 +00:00
*--------------------------------------
PCC.BOPS.cMUL
*--------------------------------------
PCC.BOPS.bDIV
*--------------------------------------
PCC.BOPS.cDIV
*--------------------------------------
PCC.BOPS.bMOD
*--------------------------------------
PCC.BOPS.cMOD
*--------------------------------------
PCC.BOPS.ADD .DA #PCC.BOPS.ADD.L
clc
>PULLA
adc (pStack)
sta (pStack)
PCC.BOPS.ADD.L .EQ *-PCC.BOPS.ADD
*--------------------------------------
PCC.BOPS.SUB .DA #PCC.BOPS.SUB.L
sec
ldy #1
lda (pStack),y
sbc (pStack)
sta (pStack),y
inc pStack
PCC.BOPS.SUB.L .EQ *-PCC.BOPS.SUB
*--------------------------------------
PCC.BOPS.SHL .DA #PCC.BOPS.SHL.L
>PULLA
tax
beq .8
lda (pStack)
.1 asl
dex
bne .1
sta (pStack)
.8
PCC.BOPS.SHL.L .EQ *-PCC.BOPS.SHL
*--------------------------------------
PCC.BOPS.SHR .DA #PCC.BOPS.SHR.L
>PULLA
tax
beq .8
lda (pStack)
.1 lsr
dex
bne .1
sta (pStack)
.8
PCC.BOPS.SHR.L .EQ *-PCC.BOPS.SHR
*--------------------------------------
PCC.BOPS.L .DA #PCC.BOPS.L.L
>PULLA
cmp (pStack)
bcc .8
lda #0
sta (pStack)
rts
.8 lda #1
sta (pStack)
PCC.BOPS.L.L .EQ *-PCC.BOPS.L
*--------------------------------------
PCC.BOPS.G .DA #PCC.BOPS.G.L
>PULLA
cmp (pStack)
beq .1
bcs .8
.1 lda #0
sta (pStack)
rts
.8 lda #1
sta (pStack)
PCC.BOPS.G.L .EQ *-PCC.BOPS.G
*--------------------------------------
PCC.BOPS.LE .DA #PCC.BOPS.LE.L
>PULLA
cmp (pStack)
bcc .8
beq .8
lda #0
sta (pStack)
rts
.8 lda #1
sta (pStack)
PCC.BOPS.LE.L .EQ *-PCC.BOPS.LE
*--------------------------------------
PCC.BOPS.GE .DA #PCC.BOPS.GE.L
>PULLA
cmp (pStack)
bcs .8
lda #0
sta (pStack)
rts
.8 lda #1
sta (pStack)
PCC.BOPS.GE.L .EQ *-PCC.BOPS.GE
*--------------------------------------
PCC.BOPS.EQ .DA #PCC.BOPS.EQ.L
>PULLA
cmp (pStack)
beq .1
lda #0
clc
.1 ror
sta (pStack)
PCC.BOPS.EQ.L .EQ *-PCC.BOPS.EQ
*--------------------------------------
PCC.BOPS.NE .DA #PCC.BOPS.NE.L
>PULLA
eor (pStack)
sta (pStack)
PCC.BOPS.NE.L .EQ *-PCC.BOPS.NE
*--------------------------------------
PCC.BOPS.LAND
*--------------------------------------
PCC.BOPS.AND .DA #PCC.BOPS.AND.L
>PULLA
and (pStack)
sta (pStack)
PCC.BOPS.AND.L .EQ *-PCC.BOPS.AND
*--------------------------------------
PCC.BOPS.LOR
*--------------------------------------
PCC.BOPS.OR .DA #PCC.BOPS.OR.L
>PULLA
ora (pStack)
sta (pStack)
PCC.BOPS.OR.L .EQ *-PCC.BOPS.OR
*--------------------------------------
PCC.BOPS.EOR .DA #PCC.BOPS.EOR.L
>PULLA
eor (pStack)
sta (pStack)
PCC.BOPS.EOR.L .EQ *-PCC.BOPS.EOR
*--------------------------------------
MAN
SAVE usr/src/bin/cc.s.pcc
LOAD usr/src/bin/cc.s
ASM