1
0
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:
David Schmenk 2018-04-16 11:10:51 -07:00
parent bef66ae6c0
commit 1c63d4832e
3 changed files with 231 additions and 104 deletions

View File

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

View File

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

View File

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