1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2024-12-30 08:30:31 +00:00
This commit is contained in:
David Schmenk 2017-12-18 08:58:16 -08:00
commit 8ea7f4cac7
5 changed files with 210 additions and 323 deletions

View File

@ -6,7 +6,7 @@ PLVM02 = PLASMA.SYSTEM\#FF2000
PLVM802 = PLASMA16.SYSTEM\#FF2000
PLVM03 = SOS.INTERP\#050000
CMD = CMD\#FF2000
ED = ED\#FF2000
ED = ED\#FE1000
SB = SB\#FF2000
ROD = ROD\#FE1000
SIEVE = SIEVE\#FE1000
@ -69,7 +69,7 @@ TXTTYPE = .TXT
#SYSTYPE = \#FF2000
#TXTTYPE = \#040000
all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(SB) $(MON) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(ROGUEIO) $(HGR1) $(TONE) $(DGR) $(DGRTEST) $(FILEIO) $(CONIO) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC)
all: $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM802) $(PLVM03) $(CMD) $(ARGS) $(MEMMGR) $(MEMTEST) $(FIBER) $(ED) $(MON) $(ROD) $(SIEVE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) $(HTTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(ROGUEIO) $(HGR1) $(TONE) $(DGR) $(DGRTEST) $(FILEIO) $(CONIO) $(PORTIO) $(SPIPORT) $(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(SANE) $(FPSTR) $(FPU) $(SANITY) $(RPNCALC)
clean:
-rm *FE1000 *FF2000 $(PLASM) $(PLVM) $(PLVM01) $(PLVM02) $(PLVM03)
@ -122,8 +122,8 @@ test: samplesrc/test.pla samplesrc/testlib.pla $(PLVM) $(PLASM)
./$(PLVM) TEST
$(ED): toolsrc/ed.pla $(PLVM02) $(PLASM) toolsrc/ed.pla
./$(PLASM) -AOW < toolsrc/ed.pla > toolsrc/ed.a
acme --setpc 8192 -o $(ED) toolsrc/ed.a
./$(PLASM) -AMOW < toolsrc/ed.pla > toolsrc/ed.a
acme --setpc 4094 -o $(ED) toolsrc/ed.a
$(SB): toolsrc/sb.pla $(PLVM02) $(PLASM) toolsrc/sb.pla
./$(PLASM) -AOW < toolsrc/sb.pla > toolsrc/sb.a

View File

@ -7,6 +7,8 @@
include "inc/cmdsys.plh"
include "inc/args.plh"
include "inc/fileio.plh"
const FALSE = 0
const TRUE = not FALSE
//
// Hardware constants
//
@ -16,6 +18,7 @@ const pushbttn2 = $C062
const pushbttn3 = $C063
const keyboard = $C000
const keystrobe = $C010
const cmdline = $01FF
//
// ASCII key values
//
@ -75,48 +78,29 @@ word = $0450,$04D0,$0550,$05D0,$0650,$06D0,$0750,$07D0
//
byte nullstr = ""
byte[64] txtfile = "UNTITLED"
word strlinbuf = $1000
word strpoolmap = $1F00
word strpoolmsz = 224 // $E0 = 28K is memory@16 bytes per bit map, 128 bytes per 8 bit map, 1K bytes per 8 byte map
word strpool = $4800
word strpoolsz = $7000
word strlinbuf = $1000
word strpoolmap = $1F00
word strpoolmsz = 224 // $E0 = 28K is memory@16 bytes per bit map, 128 bytes per 8 bit map, 1K bytes per 8 byte map
word strpool = $4800
word strpoolsz = $7000
byte exit = FALSE
byte flags = 0
byte flash = 0
word numlines = 0
word cutbuf = 0
byte perr, cursx, cursy, scrnleft, curscol, underchr, curschr
byte cursx, cursy, scrnleft, curscol, underchr, curschr
word keyin, cursrow, scrntop, cursptr
//
// Predeclared functions
//
predef cmdmode
predef cmdmode#0
//
// Utility functions
//
// Defines for ASM routines
//
asm equates
!SOURCE "vmsrc/plvmzp.inc"
end
//def toupper(c)
// if c >= 'a'
// if c <= 'z'
// return c - $20
// fin
// fin
// return c
//end
asm toupper
LDA ESTKL,X
AND #$7F
CMP #'a'
BCC +
CMP #'z'+1
BCS +
SEC
SBC #$20
+ STA ESTKL,X
RTS
!SOURCE "vmsrc/plvmzp.inc"
end
asm clrhibit(strptr)
LDA ESTKL,X
@ -181,11 +165,8 @@ CPLNLP LDA (SRC),Y
RTS
end
def crout
cout($0D)
end
def bell
cout($07)
putc($07)
end
//
// Memory management routines
@ -204,11 +185,11 @@ def delstr(strptr)
byte mask, ofst
if strptr and strptr <> @nullstr
mask = sizemask(^strptr + 1)
ofst = (strptr - strheap) >> 4
mask = mask << (ofst & $07)
ofst = ofst >> 3
strpoolmap->[ofst] = strpoolmap->[ofst] & ~mask
// mask = sizemask(^strptr + 1)
// ofst = (strptr - strheap) >> 4
// mask = mask << (ofst & $07)
// ofst = ofst >> 3
// strpoolmap->[ofst] = strpoolmap->[ofst] & ~mask
fin
end
def newstr(strptr)
@ -217,30 +198,29 @@ def newstr(strptr)
strlen = ^strptr
while (strptr).[strlen] == $8D or (strptr).[strlen] == $A0
strlen = strlen - 1
strlen--
loop
if strlen == 0
return @nullstr
fin
newptr = strpoolalloc(strlen + 1)
if newptr
memcpy(newptr, strptr, strlen + 1)
^newptr = strlen
return newptr
fin
// newptr = strpoolalloc(strlen + 1)
// if newptr
// memcpy(newptr, strptr, strlen + 1)
// ^newptr = strlen
// return newptr
// fin
return @nullstr
end
def inittxtbuf#0
word i
strlinbuf = $1000
strpoolmap = $1F00
strpoolmsz = 224 // $E0 = 28K is memory@16 bytes per bit map, 128 bytes per 8 bit map, 1K bytes per 8 byte map
strpool = $4800
strpoolsz = $7000
memset(strpoolmap, strheapmsz, 0)
memset(strlinbuf, maxfill * 2, @nullstr)
// strlinbuf = $1000
// strpoolmap = $1F00
// strpoolmsz = 224 // $E0 = 28K is memory@16 bytes per bit map, 128 bytes per 8 bit map, 1K bytes per 8 byte map
// strpool = $4800
// strpoolsz = $7000
// memset(strpoolmap, strheapmsz, 0)
// memset(strlinbuf, maxfill * 2, @nullstr)
numlines = 1
cursrow = 0
curscol = 0
@ -297,14 +277,6 @@ def txtlower#0
strlower(strlinbuf:[i])
next
end
def prbyte(h)#0
cout('$')
call($FDDA, h, 0, 0, 0)
end
def prword(h)#0
cout('$')
call($F941, h >> 8, h, 0, 0)
end
def print(i)#0
byte numstr[7]
byte place, sign
@ -319,13 +291,13 @@ def print(i)#0
while i >= 10
numstr[place] = i % 10 + '0'
i = i / 10
place = place - 1
place--
loop
numstr[place] = i + '0'
place = place - 1
place--
if sign
numstr[place] = '-'
place = place - 1
place--
fin
numstr[place] = 6 - place
puts(@numstr[place])
@ -340,27 +312,27 @@ end
def readtxt(filename)#0
byte txtbuf[81], refnum, i, j
refnum = open(filename, sysbuf)
refnum = fileio:open(filename)
if refnum
newline(refnum, $7F, $0D)
repeat
txtbuf = read(refnum, @txtbuf + 1, maxlnlen)
txtbuf = fileio:read(refnum, @txtbuf + 1, maxlnlen)
if txtbuf
sethibit(@txtbuf)
if flags & uppercase; strupper(@txtbuf); fin
strlinbuf:[numlines] = newstr(@txtbuf)
numlines = numlines + 1
numlines++
fin
if !(numlines & $0F); cout('.'); fin
if !(numlines & $0F); putc('.'); fin
until txtbuf == 0 or numlines == maxlines
close(refnum)
//
// Make sure there is a blank line at the end of the buffer
//
if numlines < maxlines and strlinbuf:[numlines - 1] <> @nullstr
strlinbuf:[numlines] = @nullstr
numlines = numlines + 1
fin
fileio:close(refnum)
//
// Make sure there is a blank line at the end of the buffer
//
if numlines < maxlines and strlinbuf:[numlines - 1] <> @nullstr
strlinbuf:[numlines] = @nullstr
numlines++
fin
fin
end
def writetxt(filename)#0
@ -368,9 +340,9 @@ def writetxt(filename)#0
byte j, chr
word i, strptr
destroy(filename)
create(filename, $C3, $04, $00) // full access, TXT file
refnum = open(filename, sysbuf)
fileio:destroy(filename)
fileio:create(filename, $04, $00) // full access, TXT file
refnum = fileio:open(filename)
if refnum == 0
return
fin
@ -385,15 +357,15 @@ def writetxt(filename)#0
cpyln(strlinbuf:[i], @txtbuf)
txtbuf = txtbuf + 1
txtbuf[txtbuf] = $0D
write(refnum, @txtbuf + 1, txtbuf)
if !(i & $0F); cout('.'); fin
fileio:write(refnum, @txtbuf + 1, txtbuf)
if !(i & $0F); putc('.'); fin
next
close(refnum)
fileio:close(refnum)
end
//
// Screen routines
//
def clrscrn@0
def clrscrn#0
call($FC58, 0, 0, 0, 0)
end
def drawrow(row, ofst, strptr)#0
@ -420,30 +392,30 @@ def drawscrn(toprow, ofst)#0
if ofst
for row = 0 to 23
strptr = strlinbuf:[toprow + row]
scrnptr = txtscrn[row]
if ofst >= ^strptr
numchars = 0
else
scrnptr = txtscrn[row]
if ofst >= ^strptr
numchars = 0
else
numchars = ^strptr - ofst
fin
if numchars >= 40
fin
if numchars >= 40
numchars = 40
else
memset(scrnptr + numchars, 40 - numchars, $A0A0)
fin
memcpy(scrnptr, strptr + ofst + 1, numchars)
else
memset(scrnptr + numchars, 40 - numchars, $A0A0)
fin
memcpy(scrnptr, strptr + ofst + 1, numchars)
next
else
for row = 0 to 23
strptr = strlinbuf:[toprow + row]
scrnptr = txtscrn[row]
numchars = ^strptr
if numchars >= 40
scrnptr = txtscrn[row]
numchars = ^strptr
if numchars >= 40
numchars = 40
else
memset(scrnptr + numchars, 40 - numchars, $A0A0)
fin
memcpy(scrnptr, strptr + 1, numchars)
else
memset(scrnptr + numchars, 40 - numchars, $A0A0)
fin
memcpy(scrnptr, strptr + 1, numchars)
next
fin
end
@ -507,9 +479,9 @@ end
def cursup#0
if cursrow > 0
cursoff
cursrow = cursrow - 1
cursrow--
if cursy > 0
cursy = cursy - 1
cursy--
else
scrntop = cursrow
drawscrn(scrntop, scrnleft)
@ -527,9 +499,9 @@ end
def cursdown#0
if cursrow < numlines - 1
cursoff
cursrow = cursrow + 1
cursrow++
if cursy < 23
cursy = cursy + 1
cursy++
else
scrntop = cursrow - 23
drawscrn(scrntop, scrnleft)
@ -547,9 +519,9 @@ end
def cursleft#0
if curscol > 0
cursoff
curscol = curscol - 1
curscol--
if cursx > 0
cursx = cursx - 1
cursx--
else
scrnleft = curscol
drawscrn(scrntop, scrnleft)
@ -567,9 +539,9 @@ end
def cursright#0
if curscol < 80
cursoff
curscol = curscol + 1
curscol++
if cursx < 39
cursx = cursx + 1
cursx++
else
scrnleft = curscol - 39
drawscrn(scrntop, scrnleft)
@ -643,7 +615,7 @@ def printtxt(slot)#0
for i = 0 to numlines - 1
cpyln(strlinbuf:[i], @txtbuf)
puts(@txtbuf)
crout
putln
next
*csw = scrncsw
end
@ -651,7 +623,7 @@ def openline(row)
if numlines < maxlines
memcpy(@strlinbuf:[row + 1], @strlinbuf:[row], (numlines - row) * 2)
strlinbuf:[row] = @nullstr
numlines = numlines + 1
numlines++
flags = flags | changed
return TRUE
fin
@ -659,11 +631,11 @@ def openline(row)
return FALSE
end
def cutline#0
freestr(cutbuf)
delstr(cutbuf)
cutbuf = strlinbuf:[cursrow]
memcpy(@strlinbuf:[cursrow], @strlinbuf:[cursrow + 1], (numlines - cursrow) * 2)
if numlines > 1
numlines = numlines - 1
numlines--
fin
flags = flags | changed
if cursrow == numlines
@ -675,7 +647,7 @@ def pasteline#0
if cutbuf and numlines < maxlines
memcpy(@strlinbuf:[cursrow + 1], @strlinbuf:[cursrow], (numlines - cursrow) * 2)
strlinbuf:[cursrow] = newstr(cutbuf)
numlines = numlines + 1
numlines++
flags = flags | changed
redraw
else
@ -691,10 +663,10 @@ def joinline#0
if joinlen < 80
memcpy(@joinstr + joinstr + 1, strlinbuf:[cursrow + 1] + 1, ^(strlinbuf:[cursrow + 1]))
joinstr = joinlen
freestr(strlinbuf:[cursrow])
delstr(strlinbuf:[cursrow])
strlinbuf:[cursrow] = newstr(@joinstr)
freestr(strlinbuf:[cursrow + 1])
numlines = numlines - 1
delstr(strlinbuf:[cursrow + 1])
numlines--
memcpy(@strlinbuf:[cursrow + 1], @strlinbuf:[cursrow + 2], (numlines - cursrow) * 2)
flags = flags | changed
redraw
@ -715,7 +687,7 @@ def splitline#0
strlinbuf:[cursrow + 1] = newstr(@splitstr)
memcpy(@splitstr + 1, strlinbuf:[cursrow] + 1, curscol)
splitstr = curscol
freestr(strlinbuf:[cursrow])
delstr(strlinbuf:[cursrow])
strlinbuf:[cursrow] = newstr(@splitstr)
fin
else
@ -757,34 +729,34 @@ def editline(key)
if curscol > 0
if curscol <= editstr
memcpy(@editstr[curscol], @editstr[curscol + 1], editstr - curscol)
editstr = editstr - 1
editstr--
fin
curscol = curscol - 1
curscol--
cursoff
if cursx > 0
cursx = cursx - 1
cursx--
drawrow(cursy, scrnleft, @editstr)
else
scrnleft = scrnleft - 1
scrnleft--
drawscrn(scrntop, scrnleft)
fin
curson
fin
elsif curscol < maxlnlen
curscol = curscol + 1
cursx = cursx + 1
curscol++
cursx++
if flags & insmode
if editstr < maxlnlen or editstr.maxlnlen == $A0
editstr = editstr + 1
editstr++
if curscol >= editstr
editstr = curscol
else
memcpy(@editstr[curscol + 1], @editstr[curscol], editstr - curscol)
fin
else
curscol = curscol - 1
cursx = cursx - 1
key = editstr[curscol]
curscol--
cursx--
key = editstr[curscol]
bell
fin
else
@ -797,8 +769,8 @@ def editline(key)
if cursx <= 39
drawrow(cursy, scrnleft, @editstr)
else
scrnleft = scrnleft + 1
cursx = 39
scrnleft++
cursx = 39
drawscrn(scrntop, scrnleft)
fin
curson
@ -809,7 +781,7 @@ def editline(key)
if curscol < editstr
strcpy(undoline, @editstr)
memcpy(@editstr[curscol + 1], @editstr[curscol + 2], editstr - curscol)
editstr = editstr - 1
editstr--
cursoff
drawrow(cursy, scrnleft, @editstr)
curson
@ -827,7 +799,7 @@ def editline(key)
else
strlinbuf:[cursrow] = @nullstr
fin
freestr(undoline)
delstr(undoline)
fin
return key
end
@ -859,15 +831,15 @@ def editmode#0
is keyctrlv
pasteline; break
is keyctrlf
if numlines < maxlines and cursrow == numlines - 1
if numlines < maxlines and cursrow == numlines - 1
strlinbuf:[numlines] = @nullstr
numlines = numlines + 1
fin
cursdown
numlines++
fin
cursdown
is keyctrlo
openline(cursrow)
redraw
break
break
is keyenter
if flags & insmode
splitline
@ -876,7 +848,7 @@ def editmode#0
cursdown
redraw
fin
break
break
is keyctrlt
joinline; break
is keyctrli
@ -887,7 +859,7 @@ def editmode#0
flags = flags | insmode
curschr = '+'
fin
break
break
is keyctrlc
if flags & uppercase
txtlower
@ -895,14 +867,14 @@ def editmode#0
txtupper
fin
redraw
break
break
is keyescape
cursoff
cmdmode
redraw
break
break
wend
until false
until exit
end
//
// Command mode
@ -913,22 +885,23 @@ def prfiles(optpath)
byte firstblk
byte entrylen, entriesblk
byte i, type, len
word entry, filecnt
word databuff, entry, filecnt
if ^optpath
strcpy(@path, optpath)
else
getpfx(@path)
puts(@path)
crout
putln
fin
refnum = open(@path, sysbuf)
databuff = heapalloc(512)
refnum = fileio:open(@path)
if perr
return perr
fin
firstblk = 1
repeat
if read(refnum, databuff, 512) == 512
if fileio:read(refnum, databuff, 512) == 512
entry = databuff + 4
if firstblk
entrylen = databuff.$23
@ -943,13 +916,13 @@ def prfiles(optpath)
^entry = len
puts(entry)
if type & $F0 == $D0 // Is it a directory?
cout('/')
len = len + 1
putc('/')
len++
fin
for len = 20 - len downto 1
cout(' ')
putc(' ')
next
filecnt = filecnt - 1
filecnt--
fin
entry = entry + entrylen
next
@ -958,14 +931,15 @@ def prfiles(optpath)
filecnt = 0
fin
until filecnt == 0
close(refnum)
crout
fileio:close(refnum)
heaprelease(databuff)
putln
return 0
end
def striplead(strptr, chr)#0
while ^strptr and ^(strptr + 1) == chr
memcpy(strptr + 1, strptr + 2, ^strptr)
^strptr = ^strptr - 1
^strptr--
loop
end
def parsecmd(strptr)
@ -976,7 +950,7 @@ def parsecmd(strptr)
if ^strptr
cmd = ^(strptr + 1)
memcpy(strptr + 1, strptr + 2, ^strptr)
^strptr = ^strptr - 1
^strptr--
fin
if ^strptr
striplead(strptr, ' ')
@ -987,43 +961,37 @@ def chkchng
if flags & changed
puts("LOSE CHANGES TO FILE (Y/N)?")
if toupper(keyin()) == 'N'
crout
putln
return FALSE
fin
crout
putln
fin
return TRUE
end
def quit#0
if chkchng
exit
fin
end
def cmdmode
def cmdmode#0
byte slot
word cmdptr
clrscrn
puts("PLASMA ][ EDITOR VERSION 0.99")
crout
while TRUE
puts("PLASMA ][ EDITOR VERSION 0.99\n")
while not exit
puts(@txtfile)
cmdptr = rdstr($BA)
cmdptr = gets($BA)
when toupper(parsecmd(cmdptr))
is 'A'
readtxt(cmdptr)
flags = flags | changed
break
break
is 'R'
if chkchng
inittxtbuf
numlines = 0
numlines = 0
strcpy(@txtfile, cmdptr)
readtxt(@txtfile)
if numlines == 0; numlines = 1; fin
if numlines == 0; numlines = 1; fin
flags = flags & ~changed
fin
break
break
is 'W'
if ^cmdptr
strcpy(@txtfile, cmdptr)
@ -1031,7 +999,7 @@ def cmdmode
writetxt(@txtfile)
//if flags & changed; fin
flags = flags & ~changed
break
break
is 'C'
prfiles(cmdptr); break
is 'P'
@ -1043,9 +1011,9 @@ def cmdmode
slot = 1
fin
printtxt(slot)
break
break
is 'Q'
quit
exit = chkchng
is 'E'
is 0
return
@ -1054,11 +1022,11 @@ def cmdmode
inittxtbuf
strcpy(@txtfile, "UNTITLED")
fin
break
break
otherwise
bell
cout('?')
crout
putc('?')
putln
wend
if perr
puts("ERROR: $")
@ -1066,7 +1034,7 @@ def cmdmode
else
puts("OK")
fin
crout
putln
loop
end
//
@ -1079,8 +1047,8 @@ else
keyin = @keyin2e
fin
inittxtbuf
if argbuff
strcpy(@txtfile, @argbuff)
if ^argNext(argFirst)
strcpy(@txtfile, cmdline)
puts(@txtfile)
numlines = 0
readtxt(@txtfile)

View File

@ -2024,7 +2024,7 @@ end
//
def emit_byte(bval)#0
^codeptr = bval
codeptr = codeptr + 1
codeptr++
end
def emit_word(wval)#0
*codeptr = wval
@ -2087,14 +2087,14 @@ def emit_data(vartype, consttype, constval, constsize)
size = constsize
emit_fill(constsize)
elsif consttype == STR_TYPE
size = constsize
chrptr = constval
constsize = constsize - 1
size = constsize
chrptr = constval
constsize--
emit_byte(constsize)
while constsize > 0
emit_byte(^chrptr)
chrptr = chrptr + 1
constsize = constsize - 1
chrptr++
constsize--
loop
else
if vartype & BYTE_TYPE
@ -2105,7 +2105,7 @@ def emit_data(vartype, consttype, constval, constsize)
if consttype == CONSTADDR_TYPE
emit_addr(constval)
else
emit_word(constval)
emit_word(constval)
fin
fin
fin
@ -2375,9 +2375,9 @@ def emit_drop#0
end
def emit_leave#0
if framesize
emit_op($5A)
emit_op($5A)
else
emit_op($5C)
emit_op($5C)
fin
end
def emit_enter(cparams)#0
@ -2408,7 +2408,7 @@ def idmatch(nameptr, len, idptr, idcnt)
fin
fin
idptr = idptr + idptr->idname + idrecsz
idcnt = idcnt - 1
idcnt--
loop
return 0
end
@ -2431,7 +2431,7 @@ def dumpsym(idptr, idcnt)#0
fin
crout
idptr = idptr + idptr->idname + idrecsz
idcnt = idcnt - 1
idcnt--
loop
end
def id_lookup(nameptr, len)
@ -2455,7 +2455,7 @@ def idlocal_add(namestr, len, type, size)
lastlocal=>idval = framesize
lastlocal->idtype = type | LOCAL_TYPE
nametostr(namestr, len, lastlocal + idname)
locals = locals + 1
locals++
lastlocal = lastlocal + idrecsz + len
if lastlocal > idlocal_tbl + idlocal_tblsz
prstr(@local_sym_overflw)
@ -2463,8 +2463,7 @@ def idlocal_add(namestr, len, type, size)
fin
framesize = framesize + size
if framesize > 255
prstr(@local_overflw)
return FALSE
return parse_err(@local_overflw)
fin
return TRUE
end
@ -2474,7 +2473,7 @@ def iddata_add(namestr, len, type, size)
lastglobal->idtype = type
nametostr(namestr, len, lastglobal + idname)
emit_iddata(datasize, size, lastglobal + idname)
globals = globals + 1
globals++
lastglobal = lastglobal + idrecsz + len
if lastglobal > idglobal_tbl + idglobal_tblsz
prstr(@global_sym_overflw)
@ -2496,7 +2495,7 @@ def idglobal_add(namestr, len, type, value)
lastglobal=>idval = value
lastglobal->idtype = type
nametostr(namestr, len, lastglobal + idname)
globals = globals + 1
globals++
lastglobal = lastglobal + idrecsz + len
if lastglobal > idglobal_tbl + idglobal_tblsz
prstr(@global_sym_overflw)
@ -2639,7 +2638,7 @@ def pop_val(valptr, sizeptr, typeptr)
^sizeptr = sizestack[valsp]
^typeptr = typestack[valsp]
valsp--
return valsp + 1
return valsp + 1
end
//
// Lexical anaylzer
@ -2878,16 +2877,12 @@ def nextln
cpyln(strlinbuf:[lineno], instr)
lineno++
if !(lineno & $0F); cout('.'); fin
print(lineno);cout(':');print(numlines)
cout('>')
prstr(instr)
crout
//print(lineno);cout(':');print(numlines);cout('>');prstr(instr);crout
scan
else
cout('<')
crout
^instr = 0
^inbuff = 0
//cout('<');crout
*instr = 0
//^inbuff = 0
token = DONE_TKN
fin
fin
@ -2973,7 +2968,7 @@ def parse_constval
when token
is SUB_TKN
mod = mod | 1; break
is ALT_COMP_TKN
is ALT_COMP_TKN
is COMP_TKN
mod = mod | 2; break
is LOGIC_NOT_TKN
@ -3012,7 +3007,7 @@ def parse_constval
if !idptr; return parse_err(@bad_cnst); fin
type = idptr->idtype
if type & ADDR_TYPE
if mod <> 8; return parse_err(@bad_cnst); fin
if mod <> 8; return parse_err(@bad_cnst); fin
type = CONSTADDR_TYPE
fin
value = idptr=>idval
@ -3139,20 +3134,20 @@ def parse_value(rvalue)
if deref
push_op(token, 0)
else
deref = deref + 1
type = type | BPTR_TYPE
deref++
type = type | BPTR_TYPE
fin
break
is WPTR_TKN
if deref
push_op(token, 0)
else
deref = deref + 1
type = type | WPTR_TYPE
deref++
type = type | WPTR_TYPE
fin
break
is AT_TKN
deref = deref - 1
deref--
break
is SUB_TKN
is ALT_COMP_TKN
@ -3184,14 +3179,14 @@ def parse_value(rvalue)
// type = type | WORD_TYPE
emit_val = TRUE
break
is STR_TKN
//
// Special case
//
emit_constr(constval, tknlen - 1)
scan
return WORD_TYPE
break
is STR_TKN
//
// Special case
//
emit_constr(constval, tknlen - 1)
scan
return WORD_TYPE
break
otherwise
return 0
wend
@ -3205,16 +3200,16 @@ def parse_value(rvalue)
is NEG_TKN
pop_op
value = -value
break
break
is ALT_COMP_TKN
is COMP_TKN
pop_op
value = ~value
break
break
is LOGIC_NOT_TKN
pop_op
value = !value
break
break
otherwise
cparams = FALSE
wend
@ -3238,7 +3233,8 @@ def parse_value(rvalue)
ref_offset = 0
fin
if ref_type & BPTR_TYPE; emit_lb
elsif ref_type & WPTR_TYPE; emit_lw; fin
elsif ref_type & WPTR_TYPE; emit_lw
fin
if lookahead <> CLOSE_PAREN_TKN
emit_push
fin
@ -3847,7 +3843,7 @@ def parse_var(type)
byte consttype, constsize, idlen
word idptr, constval, arraysize, size
cout('T')
//cout('T')
idlen = 0
size = 1
if scan == OPEN_BRACKET_TKN
@ -3903,7 +3899,7 @@ def parse_struc
byte type, idlen, struclen, constsize
word size, offset, idstr
cout('S')
//cout('S')
struclen = 0
if scan == ID_TKN
struclen = tknlen
@ -3959,7 +3955,7 @@ def parse_vars
byte idlen, type, size
word value, idptr
cout('V')
//cout('V')
when token
is CONST_TKN
if scan <> ID_TKN
@ -4012,7 +4008,7 @@ def parse_defs
word func_tag, idptr
if token == DEF_TKN
cout('D')
//cout('D')
if scan <> ID_TKN; return parse_err(@bad_decl); fin
cfnparms = 0
infunc = TRUE
@ -4028,12 +4024,12 @@ def parse_defs
idlocal_init
if scan == OPEN_PAREN_TKN
repeat
if scan == ID_TKN
cfnparms = cfnparms + 1
idlocal_add(tknptr, tknlen, WORD_TYPE, 2)
scan
fin
until token <> COMMA_TKN
if scan == ID_TKN
cfnparms = cfnparms + 1
idlocal_add(tknptr, tknlen, WORD_TYPE, 2)
scan
fin
until token <> COMMA_TKN
if token <> CLOSE_PAREN_TKN
return parse_err(@bad_decl)
fin
@ -4070,7 +4066,7 @@ def parse_module
while parse_defs
nextln
loop
cout('I')
//cout('I')
framesize = 0
entrypoint = codeptr
emit_enter(0)
@ -4080,7 +4076,7 @@ def parse_module
nextln
loop
fin
cout('!')
//cout('!')
if prevstmnt <> RETURN_TKN
emit_const(0)
emit_leave

View File

@ -0,0 +1,9 @@
# Filetype extension configuration file for Geany
# Insert as many items as you want, separate them with a ";".
# See Geany's main documentation for details.
[Extensions]
PLASMA=*.pla;*.plh;
# Note: restarting is required after editing groups
[Groups]
Programming=PLASMA;

View File

@ -1,86 +0,0 @@
# For complete documentation of this file, please see Geany's main documentation
[styling]
# Edit these in the colorscheme .conf file instead
default=default
commentline=comment_line
number=number_1
string=string_1
character=character
word=keyword_1
global=type
symbol=preprocessor
classname=class
defname=function
operator=operator
identifier=identifier_1
modulename=type
backticks=backticks
instancevar=default
classvar=default
datasection=default
heredelim=operator
worddemoted=keyword_1
stdin=default
stdout=default
stderr=default
regex=regex
here_q=here_doc
here_qq=here_doc
here_qx=here_doc
string_q=string_2
string_qq=string_2
string_qx=string_2
string_qr=string_2
string_qw=string_2
upper_bound=default
error=error
pod=comment_doc
[keywords]
# all items must be in one line
primary=done include import export struc const word byte and predef asm def end not or repeat until break for to downto next when wend is otherwise if else elsif fin while loop return
[settings]
# default extension used when saving files
extension=pla
# MIME type
mime_type=application/x-plasma
# the following characters are these which a "word" can contains, see documentation
$wordchars=$_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
# single comments, like # in this file
comment_single=//
# multiline comments
#comment_open==begin
#comment_close==end
# set to false if a comment character/string should start at column 0 of a line, true uses any
# indentation of the line, e.g. setting to true causes the following on pressing CTRL+d
#command_example();
# setting to false would generate this
# command_example();
# This setting works only for single line comments
comment_use_indent=true
# context action command (please see Geany's main documentation for details)
context_action_cmd=
lexer_filetype=pascal
[indentation]
width=4
# 0 is spaces, 1 is tabs, 2 is tab & spaces
type=0
[build-menu]
# %f will be replaced by the complete filename
# %e will be replaced by the filename without extension
# (use only one of it at one time)
FT_00_LB=_Compile
FT_00_CM=plasm -AMOW < "%f"
FT_00_WD=
EX_00_LB=_Execute
EX_00_CM=plvm "%f#FE1000"
EX_00_WD=