1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-10-18 22:24:28 +00:00

Apple 3 VM updates

This commit is contained in:
David Schmenk 2018-03-06 19:20:59 -08:00
parent 2e952bfde3
commit 25599c00c8
7 changed files with 211 additions and 131 deletions

BIN
PLASMA-BLD2.PO Normal file

Binary file not shown.

BIN
PLASMA-DEM2.PO Normal file

Binary file not shown.

BIN
PLASMA-SOS2.PO Normal file

Binary file not shown.

BIN
PLASMA-SYS2.PO Normal file

Binary file not shown.

View File

@ -706,34 +706,6 @@ DUP DEX
STA ESTKH,X STA ESTKH,X
JMP NEXTOP JMP NEXTOP
;* ;*
;* CONSTANT -1, NYBBLE, BYTE, $FF BYTE, WORD (BELOW)
;*
MINUS1 DEX
LDA #$FF
STA ESTKL,X
STA ESTKH,X
JMP NEXTOP
CN DEX
LSR ; A = CONST * 2
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
CB DEX
LDA #$00
STA ESTKH,X
INY ;+INC_IP
LDA (IP),Y
STA ESTKL,X
JMP NEXTOP
CFFB DEX
LDA #$FF
STA ESTKH,X
INY ;+INC_IP
LDA (IP),Y
STA ESTKL,X
JMP NEXTOP
;*
;* ADD IMMEDIATE TO TOS ;* ADD IMMEDIATE TO TOS
;* ;*
ADDI INY ;+INC_IP ADDI INY ;+INC_IP
@ -774,6 +746,34 @@ ORI INY ;+INC_IP
STA ESTKL,X STA ESTKL,X
JMP NEXTOP JMP NEXTOP
;* ;*
;* CONSTANT -1, NYBBLE, BYTE, $FF BYTE, WORD (BELOW)
;*
MINUS1 DEX
LDA #$FF
STA ESTKL,X
STA ESTKH,X
JMP NEXTOP
CN DEX
LSR ; A = CONST * 2
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
CB DEX
LDA #$00
STA ESTKH,X
INY ;+INC_IP
LDA (IP),Y
STA ESTKL,X
JMP NEXTOP
CFFB DEX
LDA #$FF
STA ESTKH,X
INY ;+INC_IP
LDA (IP),Y
STA ESTKL,X
JMP NEXTOP
;*
;* LOAD ADDRESS & LOAD CONSTANT WORD (SAME THING, WITH OR WITHOUT FIXUP) ;* LOAD ADDRESS & LOAD CONSTANT WORD (SAME THING, WITH OR WITHOUT FIXUP)
;* ;*
- TYA ; RENORMALIZE IP - TYA ; RENORMALIZE IP
@ -1450,22 +1450,6 @@ ADDBRLE LDA ESTKL,X
STA ESTKH+1,X STA ESTKH+1,X
INX INX
BNE _BRLE BNE _BRLE
;IBRNCH TYA ; FLATTEN IP
; CLC
; ADC IPL
; STA TMPL
; LDA #$00
; TAY
; ADC IPH
; STA TMPH ; ADD BRANCH OFFSET
; LDA TMPL
; ;CLC ; BETTER NOT CARRY OUT OF IP+Y
; ADC ESTKL,X
; STA IPL
; LDA TMPH
; ADC ESTKH,X
; STA IPH
; JMP DROP
;* ;*
;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE) ;* CALL INTO ABSOLUTE ADDRESS (NATIVE CODE)
;* ;*

View File

@ -138,14 +138,17 @@ VMCORE = *
;* OPCODE TABLE ;* OPCODE TABLE
;* ;*
!ALIGN 255,0 !ALIGN 255,0
OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E OPTBL !WORD CN,CN,CN,CN,CN,CN,CN,CN ; 00 02 04 06 08 0A 0C 0E
!WORD NEG,COMP,BAND,IOR,XOR,SHL,SHR,IDXW ; 10 12 14 16 18 1A 1C 1E !WORD CN,CN,CN,CN,CN,CN,CN,CN ; 10 12 14 16 18 1A 1C 1E
!WORD LNOT,LOR,LAND,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E !WORD MINUS1,NEXTOP,NEXTOP,LA,LLA,CB,CW,CS ; 20 22 24 26 28 2A 2C 2E
!WORD DROP,DUP,NEXTOP,DIVMOD,BRGT,BRLT,BREQ,BRNE ; 30 32 34 36 38 3A 3C 3E !WORD DROP,DROP2,DUP,DIVMOD,ADDI,SUBI,ANDI,ORI ; 30 32 34 36 38 3A 3C 3E
!WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E !WORD ISEQ,ISNE,ISGT,ISLT,ISGE,ISLE,BRFLS,BRTRU ; 40 42 44 46 48 4A 4C 4E
!WORD BRNCH,IBRNCH,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E !WORD BRNCH,SEL,CALL,ICAL,ENTER,LEAVE,RET,CFFB ; 50 52 54 56 58 5A 5C 5E
!WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E !WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
!WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E !WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E
!WORD LNOT,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 80 82 84 86 88 8A 8C 8E
!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
;* ;*
;* SYSTEM INTERPRETER ENTRYPOINT ;* SYSTEM INTERPRETER ENTRYPOINT
;* ;*
@ -440,31 +443,6 @@ SHR STY IPY
+ LDY IPY + LDY IPY
JMP DROP JMP DROP
;* ;*
;* LOGICAL AND
;*
LAND LDA ESTKL+1,X
ORA ESTKH+1,X
BEQ ++
LDA ESTKL,X
ORA ESTKH,X
BEQ +
LDA #$FF
+ STA ESTKL+1,X
STA ESTKH+1,X
++ JMP DROP
;*
;* LOGICAL OR
;*
LOR LDA ESTKL,X
ORA ESTKH,X
ORA ESTKL+1,X
ORA ESTKH+1,X
BEQ +
LDA #$FF
STA ESTKL+1,X
STA ESTKH+1,X
+ JMP DROP
;*
;* DUPLICATE TOS ;* DUPLICATE TOS
;* ;*
DUP DEX DUP DEX
@ -478,17 +456,64 @@ DUP DEX
;* ;*
LNOT LDA ESTKL,X LNOT LDA ESTKL,X
ORA ESTKH,X ORA ESTKH,X
BNE + BEQ +
LDA #$FF LDA #$FF
+ EOR #$FF
STA ESTKL,X STA ESTKL,X
STA ESTKH,X STA ESTKH,X
JMP NEXTOP JMP NEXTOP
;* ;*
;* CONSTANT ;* ADD IMMEDIATE TO TOS
;* ;*
ZERO DEX ADDI INY ;+INC_IP
+ LDA #$00 LDA (IP),Y
CLC
ADC ESTKL,X
STA ESTKL,X STA ESTKL,X
BCC +
INC ESTKH,X
+ JMP NEXTOP
;*
;* SUB IMMEDIATE FROM TOS
;*
SUBI INY ;+INC_IP
LDA ESTKL,X
SEC
SBC (IP),Y
STA ESTKL,X
BCS +
DEC ESTKH,X
+ JMP NEXTOP
;*
;* AND IMMEDIATE TO TOS
;*
ANDI INY ;+INC_IP
LDA (IP),Y
AND ESTKL,X
STA ESTKL,X
LDA #$00
STA ESTKH,X
JMP NEXTOP
;*
;* IOR IMMEDIATE TO TOS
;*
ORI INY ;+INC_IP
LDA (IP),Y
ORA ESTKL,X
STA ESTKL,X
JMP NEXTOP
;*
;* CONSTANT -1, NYBBLE, BYTE, $FF BYTE, WORD (BELOW)
;*
MINUS1 DEX
LDA #$FF
STA ESTKL,X
STA ESTKH,X
JMP NEXTOP
CN DEX
LSR ; A = CONST * 2
STA ESTKL,X
LDA #$00
STA ESTKH,X STA ESTKH,X
JMP NEXTOP JMP NEXTOP
CFFB LDA #$FF CFFB LDA #$FF
@ -716,7 +741,10 @@ SW LDA ESTKL,X
JMP DROP JMP DROP
+ INC ESTKH,X + INC ESTKH,X
STA (ESTKH-1,X) STA (ESTKH-1,X)
INX ;*
;* DROP TOS, TOS-1
;*
DROP2 INX
JMP DROP JMP DROP
;* ;*
;* STORE VALUE TO LOCAL FRAME OFFSET ;* STORE VALUE TO LOCAL FRAME OFFSET
@ -900,16 +928,71 @@ ISLT LDA ESTKL+1,X
+ BMI ISFLS + BMI ISFLS
BPL ISTRU BPL ISTRU
;* ;*
;* NORMALIZE IP+Y BEFORE CALLING NEXTOP ;* BRANCHES
;* ;*
SEL INX
TYA ; FLATTEN IP
SEC
ADC IPL
STA TMPL
LDA #$00
TAY
ADC IPH
STA TMPH ; ADD BRANCH OFFSET
LDA (TMP),Y
;CLC ; BETTER NOT CARRY OUT OF IP+Y
ADC TMPL
STA IPL
INY
LDA (TMP),Y
ADC TMPH
STA IPH
DEY
LDA (IP),Y
BEQ ++
STA TMPL ; CASE COUNT
INC IPL
BNE +
INC IPH
+ LDA ESTKL-1,X
CASELP CMP (IP),Y
BNE +
LDA ESTKH-1,X
INY
CMP (IP),Y
BEQ BRNCH
LDA ESTKL-1,X
DEY
+ DEC TMPL
BEQ +
INY
INY
INY
INY
BNE CASELP
INC IPH
BNE CASELP
+ INY
INY
INY
FIXNEXT TYA FIXNEXT TYA
LDY #$00 LDY #$00
CLC CLC
ADC IPL ADC IPL
STA IPL STA IPL
BCC + BCC ++
INC IPH INC IPH
+ JMP NEXTOP ++ JMP NEXTOP
BRAND LDA ESTKL,X
ORA ESTKH,X
BEQ BRNCH
INX ; DROP LEFT HALF OF AND
BNE NOBRNCH
BROR LDA ESTKL,X
ORA ESTKH,X
BNE BRNCH
INX ; DROP LEFT HALF OF OR
BNE NOBRNCH
;* ;*
;* BRANCHES ;* BRANCHES
;* ;*
@ -946,58 +1029,71 @@ BRNCH TYA ; FLATTEN IP
DEY DEY
STY TMPX ; CLEAR TMPX STY TMPX ; CLEAR TMPX
JMP FETCHOP JMP FETCHOP
BREQ INX ;*
LDA ESTKL-1,X ;* FOR LOOPS PUT TERMINAL VALUE AT ESTK+1 AND CURRENT COUNT ON ESTK
;*
BRGT LDA ESTKL+1,X
CMP ESTKL,X CMP ESTKL,X
BNE NOBRNCH LDA ESTKH+1,X
LDA ESTKH-1,X
CMP ESTKH,X
BEQ BRNCH
BNE NOBRNCH
BRNE INX
LDA ESTKL-1,X
CMP ESTKL,X
BNE BRNCH
LDA ESTKH-1,X
CMP ESTKH,X
BEQ NOBRNCH
BNE BRNCH
BRGT INX
LDA ESTKL-1,X
CMP ESTKL,X
LDA ESTKH-1,X
SBC ESTKH,X SBC ESTKH,X
BVS + BVS +
BPL NOBRNCH BPL NOBRNCH
BMI BRNCH - INX ; DROP FOR VALUES
+ BPL BRNCH INX
BMI NOBRNCH BNE BRNCH ; BMI BRNCH
BRLT INX BRLT LDA ESTKL,X
LDA ESTKL,X CMP ESTKL+1,X
CMP ESTKL-1,X
LDA ESTKH,X LDA ESTKH,X
SBC ESTKH-1,X SBC ESTKH+1,X
BVS + BVS +
BPL NOBRNCH BPL NOBRNCH
BMI BRNCH BMI -
+ BPL BRNCH + BMI NOBRNCH
BMI NOBRNCH BPL -
IBRNCH TYA ; FLATTEN IP INCBRLE INC ESTKL,X
BNE _BRLE
INC ESTKH,X
_BRLE LDA ESTKL+1,X
CMP ESTKL,X
LDA ESTKH+1,X
SBC ESTKH,X
BVS +
BPL BRNCH
- INX ; DROP FOR VALUES
INX
BNE NOBRNCH ; BMI NOBRNCH
DECBRGE DEC ESTKL,X
LDA ESTKL,X
CMP #$FF
BNE +
DEC ESTKH,X
_BRGE LDA ESTKL,X
+ CMP ESTKL+1,X
LDA ESTKH,X
SBC ESTKH+1,X
BVS +
BPL BRNCH
BMI -
+ BMI BRNCH
BPL -
SUBBRGE LDA ESTKL+1,X
SEC
SBC ESTKL,X
STA ESTKL+1,X
LDA ESTKH+1,X
SBC ESTKH,X
STA ESTKH+1,X
INX
BNE _BRGE
ADDBRLE LDA ESTKL,X
CLC CLC
ADC IPL ADC ESTKL+1,X
STA TMPL STA ESTKL+1,X
LDA #$00 LDA ESTKH,X
TAY ADC ESTKH+1,X
ADC IPH STA ESTKH+1,X
STA TMPH ; ADD BRANCH OFFSET INX
LDA TMPL BNE _BRLE
;CLC ; BETTER NOT CARRY OUT OF IP+Y
ADC ESTKL,X
STA IPL
LDA TMPH
ADC ESTKH,X
STA IPH
JMP DROP
;* ;*
;* INDIRECT CALL TO ADDRESS (NATIVE CODE) ;* INDIRECT CALL TO ADDRESS (NATIVE CODE)
;* ;*

View File

@ -29,7 +29,7 @@ predef execmod(modfile)#1
// //
// Exported CMDSYS table // Exported CMDSYS table
// //
word version = $0102 // 01.02 word version = $0202 // 02.00
word syspath word syspath
word cmdlnptr word cmdlnptr
word = @execmod word = @execmod
@ -1428,7 +1428,7 @@ init_cons
// //
// Print PLASMA version // Print PLASMA version
// //
prstr("PLASMA "); prbyte(version.1); cout('.'); prbyte(version.0); crout prstr("PLASMA 2.0 Dev\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
// //
// Init 2K symbol table. // Init 2K symbol table.
// //