1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-04-09 16:40:38 +00:00

Add optional self-modifying opcode implementation.

This commit is contained in:
David Schmenk 2017-08-12 15:50:36 -07:00
parent 50f066e527
commit 4591334896
4 changed files with 296 additions and 36 deletions

View File

@ -5,6 +5,7 @@
;* SYSTEM ROUTINES AND LOCATIONS
;*
;**********************************************************
SELFMODIFY = 1
;*
;* VM ZERO PAGE LOCATIONS
;*
@ -441,6 +442,17 @@ CS DEX
;*
;* LOAD VALUE FROM ADDRESS TAG
;*
!IF SELFMODIFY {
LB LDA ESTKL,X
STA LBLDA+1
LDA ESTKH,X
STA LBLDA+2
LBLDA LDA $FFFF
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
} ELSE {
LB LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -452,6 +464,7 @@ LB LDA ESTKL,X
STY ESTKH,X
LDY IPY
JMP NEXTOP
}
LW LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -507,6 +520,20 @@ LLW +INC_IP
;*
;* LOAD VALUE FROM ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
LAB +INC_IP
LDA (IP),Y
STA LABLDA+1
+INC_IP
LDA (IP),Y
STA LABLDA+2
LABLDA LDA $FFFF
DEX
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
} ELSE {
LAB +INC_IP
LDA (IP),Y
STA TMPL
@ -521,6 +548,7 @@ LAB +INC_IP
STY ESTKH,X
LDY IPY
JMP NEXTOP
}
LAW +INC_IP
LDA (IP),Y
STA TMPL
@ -540,6 +568,18 @@ LAW +INC_IP
;*
;* STORE VALUE TO ADDRESS
;*
!IF SELFMODIFY {
SB LDA ESTKL,X
STA SBSTA+1
LDA ESTKH,X
STA SBSTA+2
LDA ESTKL+1,X
SBSTA STA $FFFF
INX
; INX
; JMP NEXTOP
JMP DROP
} ELSE {
SB LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -553,6 +593,7 @@ SB LDA ESTKL,X
; INX
; JMP NEXTOP
JMP DROP
}
SW LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -620,6 +661,19 @@ DLW +INC_IP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
SAB +INC_IP
LDA (IP),Y
STA SABSTA+1
+INC_IP
LDA (IP),Y
STA SABSTA+2
LDA ESTKL,X
SABSTA STA $FFFF
; INX
; JMP NEXTOP
JMP DROP
} ELSE {
SAB +INC_IP
LDA (IP),Y
STA TMPL
@ -634,6 +688,7 @@ SAB +INC_IP
; INX
; JMP NEXTOP
JMP DROP
}
SAW +INC_IP
LDA (IP),Y
STA TMPL
@ -654,6 +709,17 @@ SAW +INC_IP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK
;*
!IF SELFMODIFY {
DAB +INC_IP
LDA (IP),Y
STA DABSTA+1
+INC_IP
LDA (IP),Y
STA DABSTA+2
LDA ESTKL,X
DABSTA STA $FFFF
JMP NEXTOP
} ELSE {
DAB +INC_IP
LDA (IP),Y
STA TMPL
@ -666,6 +732,7 @@ DAB +INC_IP
STA (TMP),Y
LDY IPY
JMP NEXTOP
}
DAW +INC_IP
LDA (IP),Y
STA TMPL

View File

@ -5,6 +5,7 @@
;* SYSTEM ROUTINES AND LOCATIONS
;*
;**********************************************************
SELFMODIFY = 0
;*
;* MONITOR SPECIAL LOCATIONS
;*
@ -195,9 +196,13 @@ DINTRP PLA
LDA PPH
STA IFPH
LDY #$00
!IF SELFMODIFY {
BEQ +
} ELSE {
LDA #>OPTBL
STA OPPAGE
JMP FETCHOP
}
IINTRP PLA
STA TMPL
PLA
@ -217,8 +222,12 @@ IINTRP PLA
STA IFPL
LDA PPH
STA IFPH
LDA #>OPTBL
+ LDA #>OPTBL
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
JMP FETCHOP
IINTRPX PLA
STA TMPL
@ -243,6 +252,10 @@ IINTRPX PLA
STA OPPAGE
SEI
STA ALTRDON
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
JMP FETCHOP
;************************************************************
;* *
@ -844,6 +857,17 @@ _CEXSX LDA (IP),Y ; SKIP TO NEXT OP ADDR AFTER STRING
;*
;* LOAD VALUE FROM ADDRESS TAG
;*
!IF SELFMODIFY {
LB LDA ESTKL,X
STA LBLDA+1
LDA ESTKH,X
STA LBLDA+2
LBLDA LDA $FFFF
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
} ELSE {
LB LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -855,6 +879,7 @@ LB LDA ESTKL,X
STY ESTKH,X
LDY IPY
JMP NEXTOP
}
LW LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -869,6 +894,19 @@ LW LDA ESTKL,X
LDY IPY
JMP NEXTOP
;
!IF SELFMODIFY {
LBX LDA ESTKL,X
STA LBXLDA+1
LDA ESTKH,X
STA LBXLDA+2
STA ALTRDOFF
LBXLDA LDA $FFFF
STA ESTKL,X
LDA #$00
STA ESTKH,X
STA ALTRDON
JMP NEXTOP
} ELSE {
LBX LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -882,6 +920,7 @@ LBX LDA ESTKL,X
LDY IPY
STA ALTRDON
JMP NEXTOP
}
LWX LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -967,6 +1006,20 @@ LLWX +INC_IP
;*
;* LOAD VALUE FROM ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
LAB +INC_IP
LDA (IP),Y
STA LABLDA+1
+INC_IP
LDA (IP),Y
STA LABLDA+2
LABLDA LDA $FFFF
DEX
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
} ELSE {
LAB +INC_IP
LDA (IP),Y
STA TMPL
@ -981,6 +1034,7 @@ LAB +INC_IP
STY ESTKH,X
LDY IPY
JMP NEXTOP
}
LAW +INC_IP
LDA (IP),Y
STA TMPL
@ -998,6 +1052,22 @@ LAW +INC_IP
LDY IPY
JMP NEXTOP
;
!IF SELFMODIFY {
LABX +INC_IP
LDA (IP),Y
STA LABXLDA+1
+INC_IP
LDA (IP),Y
STA LABXLDA+2
STA ALTRDOFF
LABXLDA LDA $FFFF
DEX
STA ESTKL,X
LDA #$00
STA ESTKH,X
STA ALTRDON
JMP NEXTOP
} ELSE {
LABX +INC_IP
LDA (IP),Y
STA TMPL
@ -1014,6 +1084,7 @@ LABX +INC_IP
STA ALTRDON
LDY IPY
JMP NEXTOP
}
LAWX +INC_IP
LDA (IP),Y
STA TMPL
@ -1035,6 +1106,18 @@ LAWX +INC_IP
;*
;* STORE VALUE TO ADDRESS
;*
!IF SELFMODIFY {
SB LDA ESTKL,X
STA SBSTA+1
LDA ESTKH,X
STA SBSTA+2
LDA ESTKL+1,X
SBSTA STA $FFFF
INX
; INX
; JMP NEXTOP
JMP DROP
} ELSE {
SB LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -1048,6 +1131,7 @@ SB LDA ESTKL,X
; INX
; JMP NEXTOP
JMP DROP
}
SW LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -1115,6 +1199,19 @@ DLW +INC_IP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
SAB +INC_IP
LDA (IP),Y
STA SABSTA+1
+INC_IP
LDA (IP),Y
STA SABSTA+2
LDA ESTKL,X
SABSTA STA $FFFF
; INX
; JMP NEXTOP
JMP DROP
} ELSE {
SAB +INC_IP
LDA (IP),Y
STA TMPL
@ -1129,6 +1226,7 @@ SAB +INC_IP
; INX
; JMP NEXTOP
JMP DROP
}
SAW +INC_IP
LDA (IP),Y
STA TMPL
@ -1149,6 +1247,17 @@ SAW +INC_IP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK
;*
!IF SELFMODIFY {
DAB +INC_IP
LDA (IP),Y
STA DABSTA+1
+INC_IP
LDA (IP),Y
STA DABSTA+2
LDA ESTKL,X
DABSTA STA $FFFF
JMP NEXTOP
} ELSE {
DAB +INC_IP
LDA (IP),Y
STA TMPL
@ -1161,6 +1270,7 @@ DAB +INC_IP
STA (TMP),Y
LDY IPY
JMP NEXTOP
}
DAW +INC_IP
LDA (IP),Y
STA TMPL
@ -1334,6 +1444,10 @@ CALL +INC_IP
STA IPH
LDA #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
JMP NEXTOP
;
CALLX +INC_IP
@ -1361,6 +1475,10 @@ CALLX +INC_IP
STA IPH
LDA #>OPXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
JMP NEXTOP
;*
;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
@ -1385,6 +1503,10 @@ ICAL LDA ESTKL,X
STA IPH
LDA #>OPTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
JMP NEXTOP
;
ICALX LDA ESTKL,X
@ -1411,6 +1533,10 @@ ICALX LDA ESTKL,X
STA IPH
LDA #>OPXTBL ; MAKE SURE WE'RE INDEXING THE RIGHT TABLE
STA OPPAGE
!IF SELFMODIFY {
BIT LCRWEN+LCBNK2
BIT LCRWEN+LCBNK2
}
JMP NEXTOP
;*
;* JUMP INDIRECT TRHOUGH TMP

View File

@ -5,6 +5,7 @@
;* SYSTEM ROUTINES AND LOCATIONS
;*
;**********************************************************
SELFMODIFY = 1
;
; HARDWARE REGISTERS
;
@ -598,6 +599,17 @@ _CEXS LDA (IP),Y ; SKIP TO NEXT OP ADDR AFTER STRING
;*
;* LOAD VALUE FROM ADDRESS TAG
;*
!IF SELFMODIFY {
LB LDA ESTKL,X
STA LBLDA+1
LDA ESTKH,X
STA LBLDA+2
LBLDA LDA $FFFF
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
} ELSE {
LB LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -609,6 +621,7 @@ LB LDA ESTKL,X
STY ESTKH,X
LDY IPY
JMP NEXTOP
}
LW LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -664,6 +677,20 @@ LLW +INC_IP
;*
;* LOAD VALUE FROM ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
LAB +INC_IP
LDA (IP),Y
STA LABLDA+1
+INC_IP
LDA (IP),Y
STA LABLDA+2
LABLDA LDA $FFFF
DEX
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
} ELSE {
LAB +INC_IP
LDA (IP),Y
STA TMPL
@ -678,6 +705,7 @@ LAB +INC_IP
STY ESTKH,X
LDY IPY
JMP NEXTOP
}
LAW +INC_IP
LDA (IP),Y
STA TMPL
@ -697,6 +725,18 @@ LAW +INC_IP
;*
;* STORE VALUE TO ADDRESS
;*
!IF SELFMODIFY {
SB LDA ESTKL,X
STA SBSTA+1
LDA ESTKH,X
STA SBSTA+2
LDA ESTKL+1,X
SBSTA STA $FFFF
INX
; INX
; JMP NEXTOP
JMP DROP
} ELSE {
SB LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -710,6 +750,7 @@ SB LDA ESTKL,X
; INX
; JMP NEXTOP
JMP DROP
}
SW LDA ESTKL,X
STA TMPL
LDA ESTKH,X
@ -777,6 +818,19 @@ DLW +INC_IP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS
;*
!IF SELFMODIFY {
SAB +INC_IP
LDA (IP),Y
STA SABSTA+1
+INC_IP
LDA (IP),Y
STA SABSTA+2
LDA ESTKL,X
SABSTA STA $FFFF
; INX
; JMP NEXTOP
JMP DROP
} ELSE {
SAB +INC_IP
LDA (IP),Y
STA TMPL
@ -791,6 +845,7 @@ SAB +INC_IP
; INX
; JMP NEXTOP
JMP DROP
}
SAW +INC_IP
LDA (IP),Y
STA TMPL
@ -811,6 +866,17 @@ SAW +INC_IP
;*
;* STORE VALUE TO ABSOLUTE ADDRESS WITHOUT POPPING STACK
;*
!IF SELFMODIFY {
DAB +INC_IP
LDA (IP),Y
STA DABSTA+1
+INC_IP
LDA (IP),Y
STA DABSTA+2
LDA ESTKL,X
DABSTA STA $FFFF
JMP NEXTOP
} ELSE {
DAB +INC_IP
LDA (IP),Y
STA TMPL
@ -823,6 +889,7 @@ DAB +INC_IP
STA (TMP),Y
LDY IPY
JMP NEXTOP
}
DAW +INC_IP
LDA (IP),Y
STA TMPL

View File

@ -1,41 +1,41 @@
;**********************************************************
;*
;* VM ZERO PAGE LOCATIONS
;* VM ZERO PAGE LOCATIONS
;*
;**********************************************************
SRC = $06
SRCL = SRC
SRCH = SRC+1
DST = SRC+2
DSTL = DST
DSTH = DST+1
ESTKSZ = $20
XSTK = $A0
XSTKL = XSTK
XSTKH = XSTK+ESTKSZ/2
ESTK = $C0
ESTKL = ESTK
ESTKH = ESTK+ESTKSZ/2
VMZP = ESTK+ESTKSZ
ESP = VMZP
DVSIGN = VMZP
IFP = ESP+1
IFPL = IFP
IFPH = IFP+1
SRC = $06
SRCL = SRC
SRCH = SRC+1
DST = SRC+2
DSTL = DST
DSTH = DST+1
ESTKSZ = $20
XSTK = $A0
XSTKL = XSTK
XSTKH = XSTK+ESTKSZ/2
ESTK = $C0
ESTKL = ESTK
ESTKH = ESTK+ESTKSZ/2
VMZP = ESTK+ESTKSZ
ESP = VMZP
DVSIGN = VMZP
IFP = ESP+1
IFPL = IFP
IFPH = IFP+1
PP = IFP+2
PPL = PP
PPH = PP+1
IPY = PP+2
TMP = IPY+1
TMPL = TMP
TMPH = TMP+1
NPARMS = TMPL
FRMSZ = TMPH
DROP = $EF
NEXTOP = $F0
PPL = PP
PPH = PP+1
IPY = PP+2
TMP = IPY+1
TMPL = TMP
TMPH = TMP+1
NPARMS = TMPL
FRMSZ = TMPH
DROP = $EF
NEXTOP = $F0
FETCHOP = NEXTOP+3
IP = FETCHOP+1
IPL = IP
IPH = IPL+1
OPIDX = FETCHOP+6
OPPAGE = OPIDX+1
IP = FETCHOP+1
IPL = IP
IPH = IPL+1
OPIDX = FETCHOP+6
OPPAGE = OPIDX+1