mirror of
https://github.com/dschmenk/PLASMA.git
synced 2024-06-01 03:41:34 +00:00
324 lines
6.9 KiB
Plaintext
Executable File
324 lines
6.9 KiB
Plaintext
Executable File
include "inc/cmdsys.plh"
|
|
sysflags nojitc // Keep JITC from compiling itself
|
|
//
|
|
// JIT compiler values
|
|
//
|
|
//
|
|
// Indirect interpreter DEFinition entrypoint
|
|
//
|
|
struc t_defentry
|
|
byte interpjsr
|
|
word interpaddr
|
|
word bytecodeaddr
|
|
byte bytecodexbyte
|
|
byte callcount
|
|
byte bytecodesize
|
|
end
|
|
//
|
|
// Private addresses
|
|
//
|
|
const jitcbuf = $9000
|
|
const codemax = $A000
|
|
const cmdparser = $A0F0
|
|
const jitcomp = $A0F2
|
|
const jitcodeptr = $A0F4
|
|
const sinterp = $A0F6
|
|
const xinterp = $A0F8
|
|
const jitinterp = $A0FA
|
|
const estkh8 = $C000
|
|
const estkh = $00C0
|
|
const estkl8 = $D000
|
|
const estkl = $00D0
|
|
const ifpl8 = $E000
|
|
const ifph8 = $E100
|
|
const jmptmp = $00E6
|
|
const tmpl8 = $E700
|
|
const tmph8 = $E800
|
|
word directentry, indirectentry
|
|
//
|
|
// COPY FROM EXT MEM TO MAIN MEM.
|
|
//
|
|
asm defcpy(dst, defentry)#0
|
|
!SOURCE "vmsrc/plvmzp.inc"
|
|
XPAGE = $1600
|
|
SRCX = XPAGE+SRCH
|
|
DSTX = XPAGE+DSTH
|
|
|
|
LDA ESTKL+1,X
|
|
STA DSTL
|
|
LDA ESTKH+1,X
|
|
STA DSTH
|
|
LDA ESTKL,X
|
|
STA TMPL
|
|
LDA ESTKH,X
|
|
STA TMPH
|
|
LDY #$05
|
|
LDA (TMP),Y
|
|
STA SRCX
|
|
DEY
|
|
LDA (TMP),Y
|
|
STA SRCH
|
|
DEY
|
|
LDA (TMP),Y
|
|
STA SRCL
|
|
LDY #$07
|
|
LDA (TMP),Y
|
|
TAY
|
|
DEY
|
|
BEQ +
|
|
- LDA (SRC),Y
|
|
STA (DST),Y
|
|
DEY
|
|
BNE -
|
|
+ LDA (SRC),Y
|
|
STA (DST),Y
|
|
STY SRCX
|
|
INX
|
|
INX
|
|
RTS
|
|
end
|
|
include "libsrc/jitcore.pla"
|
|
//
|
|
// SOS routines
|
|
// FILE I/O
|
|
//
|
|
def getpfx(path)#1
|
|
byte params[4]
|
|
|
|
^path = 0
|
|
params.0 = 2
|
|
params:1 = path
|
|
params.3 = 128
|
|
syscall($C7, @params)
|
|
return path
|
|
end
|
|
def setpfx(path)#1
|
|
byte params[6]
|
|
byte fileinfo[2]
|
|
|
|
params.0 = 3
|
|
params:1 = path
|
|
params:3 = @fileinfo
|
|
params.5 = 2
|
|
if not syscall($C4, @params) and (fileinfo.1 == $00 or fileinfo.1 == $0F) // Make sure it's a directory
|
|
params.0 = 1
|
|
params:1 = path
|
|
syscall($C6, @params)
|
|
else
|
|
getpfx(path) // Get current path
|
|
fin
|
|
return path
|
|
end
|
|
def dev_info(devnum, name, list, listlen)#1
|
|
byte params[7]
|
|
|
|
params.0 = 4
|
|
params.1 = devnum
|
|
params:2 = name
|
|
params:4 = list
|
|
params.6 = listlen
|
|
return syscall($85, @params)
|
|
end
|
|
def volume(devname, volname)#1
|
|
byte params[9]
|
|
|
|
params.0 = 4
|
|
params:1 = devname
|
|
params:3 = volname
|
|
params:5 = 0
|
|
params:7 = 0
|
|
return syscall($C5, @params)
|
|
end
|
|
//
|
|
// Command mode
|
|
//
|
|
def volumes()#0
|
|
byte info[11]
|
|
byte devname[17]
|
|
byte volname[17]
|
|
byte i
|
|
|
|
for i = $01 to $18
|
|
if dev_info(i, @devname, @info, 11) == 0
|
|
puts(@devname)
|
|
if volume(@devname, @volname) == 0
|
|
puts(" => /")
|
|
puts(@volname)
|
|
putc('/')
|
|
fin
|
|
putln
|
|
fin
|
|
next
|
|
end
|
|
def catalog(path)#0
|
|
byte refnum
|
|
byte firstblk
|
|
byte entrylen, entriesblk
|
|
byte i, type, len
|
|
word entry, catptr
|
|
|
|
if !^path
|
|
getpfx(path)
|
|
fin
|
|
refnum = cmdsys:sysopen(path)
|
|
if not refnum
|
|
return
|
|
fin
|
|
catptr = heapmark
|
|
firstblk = 1
|
|
while cmdsys:sysread(refnum, catptr, 512) == 512
|
|
entry = catptr + 4
|
|
if firstblk
|
|
entrylen = catptr->$23
|
|
entriesblk = catptr->$24 - 1
|
|
entry = entry + entrylen
|
|
fin
|
|
for i = firstblk to entriesblk
|
|
if ^entry
|
|
^entry = ^entry & $0F
|
|
puts(entry)
|
|
type = ' '
|
|
when entry->$10
|
|
is $0F // Is it a directory?
|
|
type = '/'
|
|
break
|
|
is $FF // SYSTEM file
|
|
type = '-'
|
|
break
|
|
is $FE // REL file
|
|
type = '+'
|
|
wend
|
|
putc(type)
|
|
for len = ^entry to 18
|
|
putc(' ')
|
|
next
|
|
fin
|
|
entry = entry + entrylen
|
|
next
|
|
firstblk = 0
|
|
loop
|
|
cmdsys:sysclose(refnum)
|
|
putln()
|
|
end
|
|
def stripchars(strptr)#1
|
|
while ^strptr and ^(strptr + 1) > ' '
|
|
memcpy(strptr + 1, strptr + 2, ^strptr)
|
|
^strptr--
|
|
loop
|
|
return ^strptr
|
|
end
|
|
def stripspaces(strptr)#0
|
|
while ^strptr and ^(strptr + ^strptr) <= ' '
|
|
^strptr--
|
|
loop
|
|
while ^strptr and ^(strptr + 1) <= ' '
|
|
memcpy(strptr + 1, strptr + 2, ^strptr)
|
|
^strptr--
|
|
loop
|
|
end
|
|
def striptrail(strptr)#1
|
|
byte i
|
|
|
|
for i = 1 to ^strptr
|
|
if ^(strptr + i) <= ' '
|
|
^strptr = i - 1
|
|
break
|
|
fin
|
|
next
|
|
return strptr
|
|
end
|
|
def parsecmd(strptr)#1
|
|
byte cmd
|
|
|
|
cmd = 0
|
|
stripspaces(strptr)
|
|
if ^strptr
|
|
cmd = ^(strptr + 1)
|
|
memcpy(strptr + 1, strptr + 2, ^strptr)
|
|
^strptr--
|
|
fin
|
|
stripspaces(strptr)
|
|
return cmd
|
|
end
|
|
//
|
|
// Command line handler
|
|
//
|
|
def shell#1
|
|
byte textmode[3]
|
|
byte prefix[64]
|
|
byte err[]
|
|
word cmdptr
|
|
|
|
//
|
|
// Copy AUTORUN commmand line
|
|
//
|
|
cmdptr = strcpy(heapmark, cmdsys:cmdline)
|
|
//
|
|
// Handle commands.
|
|
//
|
|
getpfx(@prefix)
|
|
repeat
|
|
if ^cmdptr
|
|
when toupper(parsecmd(cmdptr))
|
|
is 'C'
|
|
catalog(cmdptr)
|
|
break
|
|
is 'P'
|
|
if ^cmdptr and ^(cmdptr + 1) <> '/' and ^(cmdptr + 1) <> '.'
|
|
strcat(@prefix, cmdptr)
|
|
else
|
|
strcpy(@prefix, cmdptr)
|
|
fin
|
|
setpfx(@prefix)
|
|
break
|
|
is '/'
|
|
repeat
|
|
prefix--
|
|
until prefix[prefix] == '/'
|
|
if prefix > 1
|
|
setpfx(@prefix)
|
|
fin
|
|
break
|
|
is 'S'
|
|
setpfx(cmdptr)
|
|
strcat(getpfx(cmdsys:syspath), "SYS/")
|
|
break
|
|
is 'V'
|
|
volumes
|
|
break
|
|
is '+'
|
|
*jitcodeptr = jitcbuf
|
|
return striptrail(cmdptr)
|
|
break
|
|
otherwise
|
|
puts("?\n")
|
|
wend
|
|
if cmdsys.syserr
|
|
err = cmdsys.syserr
|
|
puts("ERR:$")
|
|
putb(err)
|
|
else
|
|
puts("OK")
|
|
fin
|
|
putln
|
|
fin
|
|
puts(getpfx(@prefix))
|
|
cmdptr = gets($BA)
|
|
strcpy(cmdsys:cmdline, cmdptr)
|
|
until 0
|
|
return 0
|
|
end
|
|
//
|
|
// Save pointer to command line handler
|
|
//
|
|
*cmdparser = @shell
|
|
//
|
|
// Install JIT compiler
|
|
//
|
|
directentry = *sinterp
|
|
indirectentry = *xinterp
|
|
*jitcomp = @compiler
|
|
cmdsys.jitcount = 32
|
|
cmdsys.jitsize = 96
|
|
done
|