1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2025-03-23 07:35:00 +00:00

Simplify VM configurations and auto-load alternative VMs

This commit is contained in:
David Schmenk 2018-04-13 12:09:14 -07:00
parent 795d56c2a7
commit 3a6c77a4eb
9 changed files with 178 additions and 1105 deletions

View File

@ -47,5 +47,6 @@ fin
*jitcomp = @compiler
cmdsys.jitcount = 44
cmdsys.jitsize = 96
puts("16 BIT VM/JITC enabled.\n")
return modkeep
done

View File

@ -4,12 +4,12 @@ PLVM = plvm
PLVMZP_APL = vmsrc/apple/plvmzp.inc
PLVM01 = rel/apple/A1PLASMA\#060280
PLVM02 = rel/apple/PLASMA.SYSTEM\#FF2000
PLVMJIT = rel/apple/PLASMAJIT.SYSTEM\#FF2000
PLVM802 = rel/apple/PLASMA16.SYSTEM\#FF2000
PLVMJIT = rel/apple/PLVM-128\#FF2000
PLVM802 = rel/apple/PLVM16\#FF2000
PLVM03 = rel/apple/SOS.INTERP\#050000
SOSCMD = rel/apple/SOS.CMD\#FE1000
CMD = rel/apple/CMD\#061000
CMDJIT = rel/apple/CMDJIT\#061000
CMDJIT = rel/apple/CMD128\#061000
PLVMZP_C64 = vmsrc/c64/plvmzp.inc
PLVMC64 = rel/c64/PLASMA
ED = rel/ED\#FE1000

View File

@ -931,39 +931,6 @@ def releaseheap(newheap)#1
heap = newheap
return @newheap - heap
end
def allocxheap(size)#1
word xaddr
xaddr = xheap
xheap = xheap + size
if systemflags & restxt1
if uword_isle(xaddr, $0800) and uword_isgt(xheap, $0400)
xaddr = $0800
xheap = xaddr + size
fin
fin
if systemflags & restxt2
if uword_isle(xaddr, $0C00) and uword_isgt(xheap, $0800)
xaddr = $0C00
xheap = xaddr + size
fin
fin
if systemflags & resxhgr1
if uword_isle(xaddr, $4000) and uword_isgt(xheap, $2000)
xaddr = $4000
xheap = xaddr + size
fin
fin
if systemflags & resxhgr2
if uword_isle(xaddr, $6000) and uword_isgt(xheap, $4000)
xaddr = $6000
xheap = xaddr + size
fin
fin
if uword_isge(xheap, $BF00)
return 0
fin
return xaddr
end
//
// Symbol table routines.
//
@ -1009,12 +976,12 @@ def lookupextern(esd, index)#1
fin
return 0
end
def adddef(bank, addr, deflast)#1
def adddef(addr, deflast)#1
word defentry
defentry = *deflast
*deflast = defentry + 5
defentry->0 = $20
defentry=>1 = bank ?? $03DC :: $03D6 // JSR $03DC (AUX MEM INTERP) or $03D6 (MAIN MEM INTERP)
defentry=>1 = $03D6
defentry=>3 = addr
defentry->5 = 0 // NULL out next entry
return defentry
@ -1024,7 +991,7 @@ def loadmod(mod)#1
word addr, defaddr, modaddr, modfix, modofst, modend
word deftbl, deflast
word moddep, rld, esd, sym
byte refnum, defbank, filename[64], str[]
byte refnum, filename[64], str[]
byte header[128]
//
// Read the RELocatable module header (first 128 bytes)
@ -1121,17 +1088,7 @@ def loadmod(mod)#1
esd = esd + 4
loop
esd = esd + 1
//
// Locate bytecode defs in appropriate bank.
//
if ^MACHID & $30 == $30
defbank = 1
defaddr = allocxheap(rld - bytecode)
modend = bytecode
else
defbank = 0
defaddr = bytecode
fin
defaddr = bytecode
codefix = defaddr - bytecode
defofst = defaddr - defofst
//
@ -1141,7 +1098,7 @@ def loadmod(mod)#1
//
// This is a bytcode def entry - add it to the def directory.
//
adddef(defbank, rld=>1 + defofst, @deflast)
adddef(rld=>1 + defofst, @deflast)
rld = rld + 4
loop
//
@ -1153,31 +1110,6 @@ def loadmod(mod)#1
*addr = ^rld & $10 ?? *addr + lookupextern(esd, rld->3) :: lookupdef(fixup + codefix, deftbl)
rld = rld + 4
fin
//addr = rld=>1 + modfix
//if uword_isge(addr, modaddr) // Skip fixups to header
// if type & $80 // WORD sized fixup.
// fixup = *addr
// else // BYTE sized fixup.
// fixup = ^addr
// fin
// if ^rld & $10 // EXTERN reference.
// fixup = fixup + lookupextern(esd, rld->3)
// else // INTERN fixup.
// fixup = fixup + modofst
// if uword_isge(fixup, bytecode)
// //
// // Bytecode address - replace with call def directory.
// //
// fixup = lookupdef(fixup + codefix, deftbl)
// fin
// fin
// if type & $80 // WORD sized fixup.
// *addr = fixup
// else // BYTE sized fixup.
// ^addr = fixup
// fin
//fin
//rld = rld + 4
loop
//
// Run through the External/Entry Symbol Directory.
@ -1200,15 +1132,6 @@ def loadmod(mod)#1
fin
esd = esd + 3
loop
if defbank
//
// Move bytecode to AUX bank.
//
*$003C = bytecode
*$003E = modaddr + modsize
*$0042 = defaddr
call($C311, 0, 0, 0, $05) // CALL XMOVE with carry set (MAIN->AUX) and ints disabled
fin
else
perr = $46
fin
@ -1216,7 +1139,7 @@ def loadmod(mod)#1
return -perr
fin
//
// Free up rld+esd (and bytecode on 128K) in main memory.
// Free up rld+esd in main memory.
//
releaseheap(modend)
//
@ -1225,19 +1148,12 @@ def loadmod(mod)#1
fixup = 0 // This is repurposed for the return code
if init
init = init + defofst
fixup = adddef(defbank, init, @deflast)()
fixup = adddef(init, @deflast)()
if fixup < modinitkeep
//
// Free init routine unless initkeep
//
if defbank
xheap = init
else
//
// Free up init code in main memory.
//
releaseheap(init)
fin
releaseheap(init)
if fixup < 0
perr = -fixup
fin
@ -1366,6 +1282,9 @@ def parsecmd(strptr)#1
return cmd
end
def resetmemfiles()#0
byte terr
terr = perr // Save perr
//
// Close all files
//
@ -1377,6 +1296,7 @@ def resetmemfiles()#0
memset($BF58, 0, 24)
^$BF58 = $CF
^$BF6F = $01
perr = terr // Restore perr
end
def execsys(sysfile)#0
byte refnum
@ -1430,7 +1350,7 @@ heap = *freemem
//
// Print PLASMA version
//
prstr("PLASMA 2.0 Dev\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
prstr("PLASMA 64K 2.0 Dev\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
//
// Init symbol table.
//

View File

@ -1346,6 +1346,9 @@ def parsecmd(strptr)#1
return cmd
end
def resetmemfiles()#0
byte terr
terr = perr // Save perr
//
// Close all files
//
@ -1357,6 +1360,7 @@ def resetmemfiles()#0
memset($BF58, 0, 24)
^$BF58 = $CF
^$BF6F = $01
perr = terr // Restore perr
end
def execsys(sysfile)#0
byte refnum
@ -1412,7 +1416,7 @@ heap = *freemem
//
// Print PLASMA version
//
prstr("PLASMA JITC 2.0 Dev\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
prstr("PLASMA 128K 2.0 Dev\n")//; prbyte(version.1); cout('.'); prbyte(version.0); crout
//
// Init symbol table.
//
@ -1428,7 +1432,7 @@ strcat(strcpy(@sysmods, $280), "SYS/")) // This is the path to CMD
syspath = @sysmods // Update external interface table
syscmdln = @cmdln
loadmod(jitmod)
xheap = $0800 // Reset heap to point at low memory
xheap = $0400 // Reset heap to point at low memory
xheaptop = $A000 // Top where JIT loaded
//
// Try to load autorun.

View File

@ -1,12 +1,12 @@
INTERP = $03D0
LCRDEN = $C080
LCWTEN = $C081
ROMEN = $C082
LCRWEN = $C083
LCBNK2 = $00
LCBNK1 = $08
JITCOMP = $03E2
JITCODE = $03E4
INTERP = $03D0
LCRDEN = $C080
LCWTEN = $C081
ROMEN = $C082
LCRWEN = $C083
LCBNK2 = $00
LCBNK1 = $08
JITCOMP = $03E2
JITCODE = $03E4
!SOURCE "vmsrc/plvmzp.inc"
;*
;* MOVE CMD DOWN TO $1000-$2000
@ -25,7 +25,7 @@ JITCODE = $03E4
BNE -
INC SRCH
INC DSTH
DEX ; STOP WHEN DST=$2000 REACHED
DEX ; STOP WHEN DST=$2000 REACHED
BNE -
LDA #<_CMDEND
STA SRCL
@ -34,11 +34,11 @@ JITCODE = $03E4
;
; INIT VM ENVIRONMENT STACK POINTERS
;
STY PPL
STY IFPL ; INIT FRAME POINTER = $AF00 (4K FOR JIT CODE)
STY JITCODE
STY JITCOMP
STY JITCOMP+1
STY PPL
STY IFPL ; INIT FRAME POINTER
STY JITCODE
LDA #$AF
STA PPH
STA IFPH
@ -46,7 +46,6 @@ JITCODE = $03E4
LDX #$FE ; INIT STACK POINTER (YES, $FE. SEE GETS)
TXS
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
JMP $1000
_CMDBEGIN = *
!PSEUDOPC $1000 {

View File

@ -1,48 +1,48 @@
INTERP = $03D0
LCRDEN = $C080
LCWTEN = $C081
ROMEN = $C082
LCRWEN = $C083
LCBNK2 = $00
LCBNK1 = $08
INTERP = $03D0
LCRDEN = $C080
LCWTEN = $C081
ROMEN = $C082
LCRWEN = $C083
LCBNK2 = $00
LCBNK1 = $08
!SOURCE "vmsrc/plvmzp.inc"
;*
;* MOVE CMD DOWN TO $1000-$2000
;*
LDA #<_CMDBEGIN
STA SRCL
LDA #>_CMDBEGIN
STA SRCH
LDY #$00
STY DSTL
LDX #$10
STX DSTH
- LDA (SRC),Y
STA (DST),Y
INY
BNE -
INC SRCH
INC DSTH
DEX ; STOP WHEN DST=$2000 REACHED
BNE -
LDA #<_CMDEND
STA SRCL
LDA #>_CMDEND
STA SRCH
LDA #<_CMDBEGIN
STA SRCL
LDA #>_CMDBEGIN
STA SRCH
LDY #$00
STY DSTL
LDX #$10
STX DSTH
- LDA (SRC),Y
STA (DST),Y
INY
BNE -
INC SRCH
INC DSTH
DEX ; STOP WHEN DST=$2000 REACHED
BNE -
LDA #<_CMDEND
STA SRCL
LDA #>_CMDEND
STA SRCH
;
; INIT VM ENVIRONMENT STACK POINTERS
;
STY PPL
STY IFPL ; INIT FRAME POINTER
LDA #$BF
STA PPH
STA IFPH
LDX #$FE ; INIT STACK POINTER (YES, $FE. SEE GETS)
TXS
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
JMP $1000
STY PPL
STY IFPL ; INIT FRAME POINTER = $BF00
LDA #$BF
STA PPH
STA IFPH
LDX #$FE ; INIT STACK POINTER (YES, $FE. SEE GETS)
TXS
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
JMP $1000
_CMDBEGIN = *
!PSEUDOPC $1000 {
!SOURCE "vmsrc/apple/cmd.a"
!PSEUDOPC $1000 {
!SOURCE "vmsrc/apple/cmd.a"
_CMDEND = *
}

File diff suppressed because it is too large Load Diff

View File

@ -97,7 +97,7 @@ NOS = $03 ; TOS-1
;* INTERPRETER INITIALIZATION *
;* *
;******************************
* = $2000
* = $2000
;*
;* MUST HAVE 128K FOR JIT
;*
@ -143,13 +143,6 @@ BADCPU !TEXT "65C802/65C816 CPU REQUIRED.", 13
ANYKEY !TEXT "PRESS ANY KEY...", 0
++ XCE ; SWITCH BACK TO EMULATED MODE
;*
;* INITIALIZE STACK
;*
;INITSP LDX #$FE
; TXS
; LDX #$00
; STX $01FF
;*
;* DISCONNECT /RAM
;*
@ -196,7 +189,7 @@ RAMDONE ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
STY DSTL
LDA #$D0
STA DSTH
- LDA (SRC),Y ; COPY VM+CMD INTO LANGUAGE CARD
- LDA (SRC),Y ; COPY VM+BYE INTO LANGUAGE CARD
STA (DST),Y
INY
BNE -
@ -208,10 +201,7 @@ RAMDONE ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
;*
;* MOVE FIRST PAGE OF 'BYE' INTO PLACE
;*
STY SRCL
LDA #$D1
STA SRCH
- LDA (SRC),Y
- LDA $D100,Y
STA $1000,Y
INY
BNE -
@ -236,13 +226,13 @@ RAMDONE ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
LDA #"D"
INY
STA STRBUF,Y
LDA #"J"
LDA #"1"
INY
STA STRBUF,Y
LDA #"I"
LDA #"2"
INY
STA STRBUF,Y
LDA #"T"
LDA #"8"
INY
STA STRBUF,Y
STY STRBUF

View File

@ -1,6 +1,6 @@
;**********************************************************
;*
;* APPLE ][ 64K/128K PLASMA INTERPRETER
;* APPLE ][ 128K PLASMA INTERPRETER
;*
;* SYSTEM ROUTINES AND LOCATIONS
;*
@ -61,10 +61,6 @@ JITCODE = $03E4
;* *
;******************************
* = $2000
LDX #$FE
TXS
LDX #$00
STX $01FF
;*
;* MUST HAVE 128K FOR JIT
;*
@ -134,7 +130,7 @@ RAMDONE ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
STY DSTL
LDA #$D0
STA DSTH
- LDA (SRC),Y ; COPY VM+CMD INTO LANGUAGE CARD
- LDA (SRC),Y ; COPY VM+BYE INTO LANGUAGE CARD
STA (DST),Y
INY
BNE -
@ -146,10 +142,7 @@ RAMDONE ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
;*
;* MOVE FIRST PAGE OF 'BYE' INTO PLACE
;*
STY SRCL
LDA #$D1
STA SRCH
- LDA (SRC),Y
- LDA $D100,Y
STA $1000,Y
INY
BNE -
@ -181,13 +174,13 @@ RAMDONE ;CLI UNTIL I KNOW WHAT TO DO WITH THE UNENHANCED IIE
LDA #"D"
INY
STA STRBUF,Y
LDA #"J"
LDA #"1"
INY
STA STRBUF,Y
LDA #"I"
LDA #"2"
INY
STA STRBUF,Y
LDA #"T"
LDA #"8"
INY
STA STRBUF,Y
STY STRBUF
@ -2035,11 +2028,11 @@ RET RTS
NATV TYA ; FLATTEN IP
SEC
ADC IPL
STA TMPL
STA IPL
LDA #$00
ADC IPH
STA TMPH
JMP JMPTMP
STA IPH
JMP (IP)
VMEND = *
}
;***************************************