mirror of
https://github.com/dschmenk/PLASMA.git
synced 2024-10-01 14:57:08 +00:00
Update C64 VM
This commit is contained in:
parent
bef66ae6c0
commit
1c63d4832e
@ -1379,8 +1379,6 @@ CALL INY ;+INC_IP
|
|||||||
STA IPH
|
STA IPH
|
||||||
PLA
|
PLA
|
||||||
STA IPL
|
STA IPL
|
||||||
LDA #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
|
|
||||||
STA OPPAGE
|
|
||||||
LDY #$00
|
LDY #$00
|
||||||
JMP FETCHOP
|
JMP FETCHOP
|
||||||
;*
|
;*
|
||||||
@ -1403,8 +1401,6 @@ ICAL LDA ESTKL,X
|
|||||||
STA IPH
|
STA IPH
|
||||||
PLA
|
PLA
|
||||||
STA IPL
|
STA IPL
|
||||||
LDA #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
|
|
||||||
STA OPPAGE
|
|
||||||
LDY #$00
|
LDY #$00
|
||||||
JMP FETCHOP
|
JMP FETCHOP
|
||||||
;*
|
;*
|
||||||
|
@ -30,14 +30,13 @@ predef sext(a)#1, divmod(a,b)#2, execmod(modfile)#1
|
|||||||
//
|
//
|
||||||
// Exported CMDSYS table
|
// Exported CMDSYS table
|
||||||
//
|
//
|
||||||
word version = $0110 // 01.10
|
word version = $0200 // 02.00
|
||||||
word syspath
|
word syspath
|
||||||
word syscmdln
|
word syscmdln
|
||||||
word = @execmod
|
word = @execmod, 0, 0, 0, 0
|
||||||
word systemflags = 0
|
byte perr
|
||||||
word heap
|
byte jitcount = 0
|
||||||
word symtbl, lastsym
|
byte jitsize = 0
|
||||||
byte perr, refauto
|
|
||||||
//
|
//
|
||||||
// String pool.
|
// String pool.
|
||||||
//
|
//
|
||||||
@ -115,6 +114,13 @@ word = @machidstr, @machid
|
|||||||
word = 0
|
word = 0
|
||||||
word syslibsym = @exports
|
word syslibsym = @exports
|
||||||
//
|
//
|
||||||
|
// System variable.
|
||||||
|
//
|
||||||
|
word systemflags = 0
|
||||||
|
word heap
|
||||||
|
word symtbl, lastsym
|
||||||
|
byte refauto
|
||||||
|
//
|
||||||
// Utility functions
|
// Utility functions
|
||||||
//
|
//
|
||||||
asm saveX#0
|
asm saveX#0
|
||||||
@ -1072,7 +1078,7 @@ heap = *freemem
|
|||||||
//
|
//
|
||||||
// Print PLASMA version
|
// Print PLASMA version
|
||||||
//
|
//
|
||||||
prstr("\nPRELIM PLASMA "); prbyte(version.1); cout('.'); prbyte(version.0); crout
|
prstr("\nPLASMA 2.0 Dev\n") //; prbyte(version.1); cout('.'); prbyte(version.0); crout
|
||||||
//
|
//
|
||||||
// Init symbol table.
|
// Init symbol table.
|
||||||
//
|
//
|
||||||
|
@ -121,6 +121,7 @@ OPTBL !WORD CN,CN,CN,CN,CN,CN,CN,CN ; 00 02
|
|||||||
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 90 92 94 96 98 9A 9C 9E
|
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 90 92 94 96 98 9A 9C 9E
|
||||||
!WORD BRGT,BRLT,INCBRLE,ADDBRLE,DECBRGE,SUBBRGE,BRAND,BROR ; A0 A2 A4 A6 A8 AA AC AE
|
!WORD BRGT,BRLT,INCBRLE,ADDBRLE,DECBRGE,SUBBRGE,BRAND,BROR ; A0 A2 A4 A6 A8 AA AC AE
|
||||||
!WORD ADDLB,ADDLW,ADDAB,ADDAW,IDXLB,IDXLW,IDXAB,IDXAW ; B0 B2 B4 B6 B8 BA BC BE
|
!WORD ADDLB,ADDLW,ADDAB,ADDAW,IDXLB,IDXLW,IDXAB,IDXAW ; B0 B2 B4 B6 B8 BA BC BE
|
||||||
|
!WORD NATV ; C0
|
||||||
;*
|
;*
|
||||||
;* DIV TOS-1 BY TOS
|
;* DIV TOS-1 BY TOS
|
||||||
;*
|
;*
|
||||||
@ -143,7 +144,7 @@ MOD JSR _DIV
|
|||||||
;* DIVMOD TOS-1 BY TOS
|
;* DIVMOD TOS-1 BY TOS
|
||||||
;*
|
;*
|
||||||
DIVMOD JSR _DIV
|
DIVMOD JSR _DIV
|
||||||
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
|
LSR DVSIGN ; SIGN(RESULT) = (SIGN(DIVIDEND) + SIGN(DIVISOR)) & 1
|
||||||
BCC +
|
BCC +
|
||||||
JSR _NEG
|
JSR _NEG
|
||||||
+ DEX
|
+ DEX
|
||||||
@ -527,45 +528,72 @@ LLW INY ;+INC_IP
|
|||||||
;*
|
;*
|
||||||
;* ADD VALUE FROM LOCAL FRAME OFFSET
|
;* ADD VALUE FROM LOCAL FRAME OFFSET
|
||||||
;*
|
;*
|
||||||
ADDLB LDA #$60 ; RTS
|
ADDLB INY ;+INC_IP
|
||||||
STA NEXTOP
|
LDA (IP),Y
|
||||||
JSR LLB
|
STY IPY
|
||||||
LDA #$C8 ; INY
|
TAY
|
||||||
STA NEXTOP
|
LDA (IFP),Y
|
||||||
JMP ADD
|
CLC
|
||||||
ADDLBX LDA #$60 ; RTS
|
ADC ESTKL,X
|
||||||
STA NEXTOP
|
STA ESTKL,X
|
||||||
JSR LLBX
|
BCC +
|
||||||
LDA #$C8 ; INY
|
INC ESTKH,X
|
||||||
STA NEXTOP
|
+ LDY IPY
|
||||||
JMP ADD
|
JMP NEXTOP
|
||||||
ADDLW LDA #$60 ; RTS
|
ADDLW INY ;+INC_IP
|
||||||
STA NEXTOP
|
LDA (IP),Y
|
||||||
JSR LLW
|
STY IPY
|
||||||
LDA #$C8 ; INY
|
TAY
|
||||||
STA NEXTOP
|
LDA (IFP),Y
|
||||||
JMP ADD
|
CLC
|
||||||
ADDLWX LDA #$60 ; RTS
|
ADC ESTKL,X
|
||||||
STA NEXTOP
|
STA ESTKL,X
|
||||||
JSR LLWX
|
INY
|
||||||
LDA #$C8 ; INY
|
LDA (IFP),Y
|
||||||
STA NEXTOP
|
ADC ESTKH,X
|
||||||
JMP ADD
|
STA ESTKH,X
|
||||||
|
LDY IPY
|
||||||
|
JMP NEXTOP
|
||||||
;*
|
;*
|
||||||
;* INDEX VALUE FROM LOCAL FRAME OFFSET
|
;* INDEX VALUE FROM LOCAL FRAME OFFSET
|
||||||
;*
|
;*
|
||||||
IDXLB LDA #$60 ; RTS
|
IDXLB INY ;+INC_IP
|
||||||
STA NEXTOP
|
LDA (IP),Y
|
||||||
JSR LLB
|
STY IPY
|
||||||
LDA #$C8 ; INY
|
TAY
|
||||||
STA NEXTOP
|
LDA (IFP),Y
|
||||||
JMP IDXW
|
LDY #$00
|
||||||
IDXLW LDA #$60 ; RTS
|
ASL
|
||||||
STA NEXTOP
|
BCC +
|
||||||
JSR LLW
|
INY
|
||||||
LDA #$C8 ; INY
|
CLC
|
||||||
STA NEXTOP
|
+ ADC ESTKL,X
|
||||||
JMP IDXW
|
STA ESTKL,X
|
||||||
|
TYA
|
||||||
|
ADC ESTKH,X
|
||||||
|
STA ESTKH,X
|
||||||
|
LDY IPY
|
||||||
|
JMP NEXTOP
|
||||||
|
IDXLW INY ;+INC_IP
|
||||||
|
LDA (IP),Y
|
||||||
|
STY IPY
|
||||||
|
TAY
|
||||||
|
LDA (IFP),Y
|
||||||
|
ASL
|
||||||
|
STA TMPL
|
||||||
|
INY
|
||||||
|
LDA (IFP),Y
|
||||||
|
ROL
|
||||||
|
STA TMPH
|
||||||
|
LDA TMPL
|
||||||
|
CLC
|
||||||
|
ADC ESTKL,X
|
||||||
|
STA ESTKL,X
|
||||||
|
LDA TMPH
|
||||||
|
ADC ESTKH,X
|
||||||
|
STA ESTKH,X
|
||||||
|
LDY IPY
|
||||||
|
JMP NEXTOP
|
||||||
;*
|
;*
|
||||||
;* LOAD VALUE FROM ABSOLUTE ADDRESS
|
;* LOAD VALUE FROM ABSOLUTE ADDRESS
|
||||||
;*
|
;*
|
||||||
@ -600,33 +628,84 @@ LAW INY ;+INC_IP
|
|||||||
;*
|
;*
|
||||||
;* ADD VALUE FROM ABSOLUTE ADDRESS
|
;* ADD VALUE FROM ABSOLUTE ADDRESS
|
||||||
;*
|
;*
|
||||||
ADDAB LDA #$60 ; RTS
|
ADDAB INY ;+INC_IP
|
||||||
STA NEXTOP
|
LDA (IP),Y
|
||||||
JSR LAB
|
STA ESTKH-2,X
|
||||||
LDA #$C8 ; INY
|
INY ;+INC_IP
|
||||||
STA NEXTOP
|
LDA (IP),Y
|
||||||
JMP ADD
|
STA ESTKH-1,X
|
||||||
ADDAW LDA #$60 ; RTS
|
LDA (ESTKH-2,X)
|
||||||
STA NEXTOP
|
CLC
|
||||||
JSR LAW
|
ADC ESTKL,X
|
||||||
LDA #$C8 ; INY
|
STA ESTKL,X
|
||||||
STA NEXTOP
|
BCC +
|
||||||
JMP ADD
|
INC ESTKH,X
|
||||||
|
+ JMP NEXTOP
|
||||||
|
ADDAW INY ;+INC_IP
|
||||||
|
LDA (IP),Y
|
||||||
|
STA SRCL
|
||||||
|
INY ;+INC_IP
|
||||||
|
LDA (IP),Y
|
||||||
|
STA SRCH
|
||||||
|
STY IPY
|
||||||
|
LDY #$00
|
||||||
|
LDA (SRC),Y
|
||||||
|
CLC
|
||||||
|
ADC ESTKL,X
|
||||||
|
STA ESTKL,X
|
||||||
|
INY
|
||||||
|
LDA (SRC),Y
|
||||||
|
ADC ESTKH,X
|
||||||
|
STA ESTKH,X
|
||||||
|
LDY IPY
|
||||||
|
JMP NEXTOP
|
||||||
;*
|
;*
|
||||||
;* INDEX VALUE FROM ABSOLUTE ADDRESS
|
;* INDEX VALUE FROM ABSOLUTE ADDRESS
|
||||||
;*
|
;*
|
||||||
IDXAB LDA #$60 ; RTS
|
IDXAB INY ;+INC_IP
|
||||||
STA NEXTOP
|
LDA (IP),Y
|
||||||
JSR LAB
|
STA ESTKH-2,X
|
||||||
LDA #$C8 ; INY
|
INY ;+INC_IP
|
||||||
STA NEXTOP
|
LDA (IP),Y
|
||||||
JMP IDXW
|
STA ESTKH-1,X
|
||||||
IDXAW LDA #$60 ; RTS
|
LDA (ESTKH-2,X)
|
||||||
STA NEXTOP
|
STY IPY
|
||||||
JSR LAW
|
LDY #$00
|
||||||
LDA #$C8 ; INY
|
ASL
|
||||||
STA NEXTOP
|
BCC +
|
||||||
JMP IDXW
|
INY
|
||||||
|
CLC
|
||||||
|
+ ADC ESTKL,X
|
||||||
|
STA ESTKL,X
|
||||||
|
TYA
|
||||||
|
ADC ESTKH,X
|
||||||
|
STA ESTKH,X
|
||||||
|
LDY IPY
|
||||||
|
JMP NEXTOP
|
||||||
|
IDXAW INY ;+INC_IP
|
||||||
|
LDA (IP),Y
|
||||||
|
STA SRCL
|
||||||
|
INY ;+INC_IP
|
||||||
|
LDA (IP),Y
|
||||||
|
STA SRCH
|
||||||
|
STY IPY
|
||||||
|
LDY #$00
|
||||||
|
LDA (SRC),Y
|
||||||
|
ASL
|
||||||
|
STA TMPL
|
||||||
|
INY
|
||||||
|
LDA (SRC),Y
|
||||||
|
ROL
|
||||||
|
STA TMPH
|
||||||
|
LDA TMPL
|
||||||
|
CLC
|
||||||
|
ADC ESTKL,X
|
||||||
|
STA ESTKL,X
|
||||||
|
LDA TMPH
|
||||||
|
ADC ESTKH,X
|
||||||
|
STA ESTKH,X
|
||||||
|
LDY IPY
|
||||||
|
JMP NEXTOP
|
||||||
;*
|
;*
|
||||||
;* STORE VALUE TO ADDRESS
|
;* STORE VALUE TO ADDRESS
|
||||||
;*
|
;*
|
||||||
@ -694,6 +773,8 @@ DLB INY ;+INC_IP
|
|||||||
TAY
|
TAY
|
||||||
LDA ESTKL,X
|
LDA ESTKL,X
|
||||||
STA (IFP),Y
|
STA (IFP),Y
|
||||||
|
LDA #$00
|
||||||
|
STA ESTKH,X
|
||||||
LDY IPY
|
LDY IPY
|
||||||
JMP NEXTOP
|
JMP NEXTOP
|
||||||
DLW INY ;+INC_IP
|
DLW INY ;+INC_IP
|
||||||
@ -754,6 +835,8 @@ DAB INY ;+INC_IP
|
|||||||
STA ESTKH-1,X
|
STA ESTKH-1,X
|
||||||
LDA ESTKL,X
|
LDA ESTKL,X
|
||||||
STA (ESTKH-2,X)
|
STA (ESTKH-2,X)
|
||||||
|
LDA #$00
|
||||||
|
STA ESTKH,X
|
||||||
JMP NEXTOP
|
JMP NEXTOP
|
||||||
DAW INY ;+INC_IP
|
DAW INY ;+INC_IP
|
||||||
LDA (IP),Y
|
LDA (IP),Y
|
||||||
@ -850,20 +933,17 @@ SEL INX
|
|||||||
DEY
|
DEY
|
||||||
LDA (IP),Y
|
LDA (IP),Y
|
||||||
STA TMPL ; CASE COUNT
|
STA TMPL ; CASE COUNT
|
||||||
LDA ESTKL-1,X
|
|
||||||
INC IPL
|
INC IPL
|
||||||
BNE CASELP
|
BNE CASELP
|
||||||
INC IPH
|
INC IPH
|
||||||
CASELP CMP (IP),Y
|
CASELP LDA ESTKL-1,X
|
||||||
BNE +
|
CMP (IP),Y
|
||||||
|
BEQ +
|
||||||
LDA ESTKH-1,X
|
LDA ESTKH-1,X
|
||||||
INY
|
INY
|
||||||
CMP (IP),Y
|
SBC (IP),Y
|
||||||
BEQ BRNCH
|
BMI CASEEND
|
||||||
LDA ESTKL-1,X
|
- INY
|
||||||
DEY
|
|
||||||
+ INY
|
|
||||||
INY
|
|
||||||
INY
|
INY
|
||||||
DEC TMPL
|
DEC TMPL
|
||||||
BEQ FIXNEXT
|
BEQ FIXNEXT
|
||||||
@ -871,6 +951,27 @@ CASELP CMP (IP),Y
|
|||||||
BNE CASELP
|
BNE CASELP
|
||||||
INC IPH
|
INC IPH
|
||||||
BNE CASELP
|
BNE CASELP
|
||||||
|
+ LDA ESTKH-1,X
|
||||||
|
INY
|
||||||
|
SBC (IP),Y
|
||||||
|
BEQ BRNCH
|
||||||
|
BPL -
|
||||||
|
CASEEND LDA #$00
|
||||||
|
STA TMPH
|
||||||
|
DEC TMPL
|
||||||
|
LDA TMPL
|
||||||
|
ASL ; SKIP REMAINING CASES
|
||||||
|
ROL TMPH
|
||||||
|
ASL
|
||||||
|
ROL TMPH
|
||||||
|
; CLC
|
||||||
|
ADC IPL
|
||||||
|
STA IPL
|
||||||
|
LDA TMPH
|
||||||
|
ADC IPH
|
||||||
|
STA IPH
|
||||||
|
INY
|
||||||
|
INY
|
||||||
FIXNEXT TYA
|
FIXNEXT TYA
|
||||||
LDY #$00
|
LDY #$00
|
||||||
SEC
|
SEC
|
||||||
@ -1007,15 +1108,6 @@ ADDBRLE LDA ESTKL,X
|
|||||||
INX
|
INX
|
||||||
BNE _BRLE
|
BNE _BRLE
|
||||||
;*
|
;*
|
||||||
;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
|
|
||||||
;*
|
|
||||||
ICAL LDA ESTKL,X
|
|
||||||
STA TMPL
|
|
||||||
LDA ESTKH,X
|
|
||||||
STA TMPH
|
|
||||||
INX
|
|
||||||
BNE _CALL
|
|
||||||
;*
|
|
||||||
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
|
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
|
||||||
;*
|
;*
|
||||||
CALL INY ;+INC_IP
|
CALL INY ;+INC_IP
|
||||||
@ -1024,8 +1116,8 @@ CALL INY ;+INC_IP
|
|||||||
INY ;+INC_IP
|
INY ;+INC_IP
|
||||||
LDA (IP),Y
|
LDA (IP),Y
|
||||||
STA TMPH
|
STA TMPH
|
||||||
_CALL TYA
|
TYA
|
||||||
CLC
|
SEC
|
||||||
ADC IPL
|
ADC IPL
|
||||||
PHA
|
PHA
|
||||||
LDA IPH
|
LDA IPH
|
||||||
@ -1036,7 +1128,29 @@ _CALL TYA
|
|||||||
STA IPH
|
STA IPH
|
||||||
PLA
|
PLA
|
||||||
STA IPL
|
STA IPL
|
||||||
LDY #$01
|
LDY #$00
|
||||||
|
JMP FETCHOP
|
||||||
|
;*
|
||||||
|
;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
|
||||||
|
;*
|
||||||
|
ICAL LDA ESTKL,X
|
||||||
|
STA TMPL
|
||||||
|
LDA ESTKH,X
|
||||||
|
STA TMPH
|
||||||
|
INX
|
||||||
|
TYA
|
||||||
|
SEC
|
||||||
|
ADC IPL
|
||||||
|
PHA
|
||||||
|
LDA IPH
|
||||||
|
ADC #$00
|
||||||
|
PHA
|
||||||
|
JSR JMPTMP
|
||||||
|
PLA
|
||||||
|
STA IPH
|
||||||
|
PLA
|
||||||
|
STA IPL
|
||||||
|
LDY #$00
|
||||||
JMP FETCHOP
|
JMP FETCHOP
|
||||||
;*
|
;*
|
||||||
;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT
|
;* ENTER FUNCTION WITH FRAME SIZE AND PARAM COUNT
|
||||||
@ -1076,28 +1190,39 @@ LEAVE INY ;+INC_IP
|
|||||||
RTS
|
RTS
|
||||||
+ INC IFPH
|
+ INC IFPH
|
||||||
RET RTS
|
RET RTS
|
||||||
|
;*
|
||||||
|
;* RETURN TO NATIVE CODE
|
||||||
|
;*
|
||||||
|
NATV TYA ; FLATTEN IP
|
||||||
|
SEC
|
||||||
|
ADC IPL
|
||||||
|
STA IPL
|
||||||
|
BCS +
|
||||||
|
JMP (IP)
|
||||||
|
+ INC IPH
|
||||||
|
JMP (IP)
|
||||||
CMD !SOURCE "vmsrc/c64/cmd.a"
|
CMD !SOURCE "vmsrc/c64/cmd.a"
|
||||||
SEGEND = *
|
SEGEND = *
|
||||||
VMINIT JSR $FFE7 ; CLOSE ALL CHANNELS
|
VMINIT JSR $FFE7 ; CLOSE ALL CHANNELS
|
||||||
LDY #$10 ; INSTALL PAGE 0 FETCHOP ROUTINE
|
LDY #$10 ; INSTALL PAGE 0 FETCHOP ROUTINE
|
||||||
- LDA PAGE0-1,Y
|
- LDA PAGE0-1,Y
|
||||||
STA DROP-1,Y
|
STA DROP-1,Y
|
||||||
DEY
|
DEY
|
||||||
BNE -
|
BNE -
|
||||||
LDA #$4C ; SET JMPTMP OPCODE
|
LDA #$4C ; SET JMPTMP OPCODE
|
||||||
STA JMPTMP
|
STA JMPTMP
|
||||||
STY IFPL ; INIT FRAME POINTER TO $D000
|
STY IFPL ; INIT FRAME POINTER TO $D000
|
||||||
LDA #$D0
|
LDA #$D0
|
||||||
STA IFPH
|
STA IFPH
|
||||||
LDA #<SEGEND ; SAVE HEAP START
|
LDA #<SEGEND ; SAVE HEAP START
|
||||||
STA $0100
|
STA $0100
|
||||||
LDA #>SEGEND
|
LDA #>SEGEND
|
||||||
STA $0101
|
STA $0101
|
||||||
LDX #$FF ; INIT STACK POINTER
|
LDX #$FF ; INIT STACK POINTER
|
||||||
TXS
|
TXS
|
||||||
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
|
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
|
||||||
LDA $01
|
LDA $01
|
||||||
AND #$FE ; SWAP OUT BASIC ROM
|
AND #$FE ; SWAP OUT BASIC ROM
|
||||||
STA $01
|
STA $01
|
||||||
JMP CMD
|
JMP CMD
|
||||||
PAGE0 = *
|
PAGE0 = *
|
||||||
@ -1105,9 +1230,9 @@ PAGE0 = *
|
|||||||
;*
|
;*
|
||||||
;* INTERP BYTECODE INNER LOOP
|
;* INTERP BYTECODE INNER LOOP
|
||||||
;*
|
;*
|
||||||
INX ; DROP
|
INX ; DROP
|
||||||
INY ; NEXTOP
|
INY ; NEXTOP
|
||||||
LDA $FFFF,Y ; FETCHOP @ $F3, IP MAPS OVER $FFFF @ $F4
|
LDA $FFFF,Y ; FETCHOP @ $F3, IP MAPS OVER $FFFF @ $F4
|
||||||
STA OPIDX
|
STA OPIDX
|
||||||
JMP (OPTBL)
|
JMP (OPTBL)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user