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

First Commodore 64 version!

This commit is contained in:
David Schmenk 2018-02-24 18:11:06 -08:00
parent c5d4d7d35f
commit 86408f5157
4 changed files with 46 additions and 118 deletions

BIN
PLASMA.D64 Normal file

Binary file not shown.

View File

@ -138,7 +138,7 @@ vmsrc/c64/cmd.a: vmsrc/c64/cmd.pla $(PLASM)
./$(PLASM) -AOW < vmsrc/c64/cmd.pla > vmsrc/c64/cmd.a ./$(PLASM) -AOW < vmsrc/c64/cmd.pla > vmsrc/c64/cmd.a
$(PLVMC64): vmsrc/c64/plvmc64.s vmsrc/c64/cmd.a $(PLVMC64): vmsrc/c64/plvmc64.s vmsrc/c64/cmd.a
acme -o $(PLVMC64) -l vmsrc/c64/plvmc64.sym vmsrc/c64/plvmc64.s acme -f cbm -o $(PLVMC64) -l vmsrc/c64/plvmc64.sym vmsrc/c64/plvmc64.s
vmsrc/apple/a1cmd.a: vmsrc/apple/a1cmd.pla $(PLASM) vmsrc/apple/a1cmd.a: vmsrc/apple/a1cmd.pla $(PLASM)
./$(PLASM) -AOW < vmsrc/apple/a1cmd.pla > vmsrc/apple/a1cmd.a ./$(PLASM) -AOW < vmsrc/apple/a1cmd.pla > vmsrc/apple/a1cmd.a

View File

@ -1,6 +1,6 @@
const RELADDR = $1000 const RELADDR = $1000
const inbuff = $200 const freemem = $0100
const freemem = $0006 //const inbuff = $0200
// //
// System flags: memory allocator screen holes. // System flags: memory allocator screen holes.
// //
@ -18,16 +18,6 @@ const resxhgr2 = $0080
const modkeep = $1000 const modkeep = $1000
const modinitkeep = $2000 const modinitkeep = $2000
// //
// CFFA1 addresses.
//
const CFFADest = $00
const CFFAFileName = $02
const CFFAOldName = $04
const CFFAFileType = $06
const CFFAAuxType = $07
const CFFAFileSize = $09
const CFFAEntryPtr = $0B
//
// Pedefined functions. // Pedefined functions.
// //
predef syscall(cmd,null)#1, call(addr,areg,xreg,yreg,status)#1 predef syscall(cmd,null)#1, call(addr,areg,xreg,yreg,status)#1
@ -51,13 +41,9 @@ byte perr, refauto
// //
// String pool. // String pool.
// //
byte inbuff[128]
byte autorun[] = "AUTORUN" byte autorun[] = "AUTORUN"
byte verstr[] = "\nPLASMA " byte verstr[] = "\nPLASMA "
byte freestr[] = "MEM FREE:$"
byte errorstr[] = "ERR:$"
byte prompt[] = "PLASMA"
byte okstr[] = "OK"
byte huhstr[] = "?\n"
byte hexchar[] = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' byte hexchar[] = '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
// //
// Exported Machine ID. // Exported Machine ID.
@ -195,12 +181,6 @@ CALL6502 JSR $FFFF
REGVALS !FILL 4 REGVALS !FILL 4
end end
// //
// QUIT TO MONITOR
//
asm quit()#0
JMP $9000
end
//
// SET MEMORY TO VALUE // SET MEMORY TO VALUE
// MEMSET(ADDR, VALUE, SIZE) // MEMSET(ADDR, VALUE, SIZE)
// With optimizations from Peter Ferrie // With optimizations from Peter Ferrie
@ -725,16 +705,15 @@ end
// //
asm cout(c)#0 asm cout(c)#0
LDA ESTKL,X LDA ESTKL,X
JSR TOUPR INX
ORA #$80 JMP $FFD2
JMP $FFEF
end end
asm cin()#1 asm cin()#1
DEX DEX
- LDA $D011 STX ESP
BPL - JSR $FFCF
LDA $D010
AND #$7F AND #$7F
LDX ESP
STA ESTKL,X STA ESTKL,X
LDA #$00 LDA #$00
STA ESTKH,X STA ESTKH,X
@ -755,62 +734,19 @@ def print(i)#0
cout(i % 10 + '0') cout(i % 10 + '0')
end end
def rdstr(prompt)#1 def rdstr(prompt)#1
byte ch, maxlen byte ch
maxlen = 0
inbuff.0 = 0 inbuff.0 = 0
cout(prompt) cout(prompt)
repeat for inbuff = 0 to 127
ch = cin ch = cin
when ch if ch == $0D
is $15 // right arrow break
if ^inbuff < maxlen //inbuff.0 < maxlen fin
inbuff.0++ inbuff.0++
ch = inbuff[inbuff.0] inbuff[inbuff.0] = ch
cout(ch) next
fin crout
break return @inbuff
is $08 // left arrow
if inbuff.0
cout('\\')
cout(inbuff[inbuff.0])
inbuff.0--
fin
break
is $04 // ctrl-d
if inbuff.0
cout('#')
cout(inbuff[inbuff.0])
memcpy(inbuff + inbuff.0, inbuff + inbuff.0 + 1, maxlen - inbuff.0)
maxlen--
inbuff.0--
fin
break
is $0C // ctrl-l
crout
prstr(inbuff)
break
is $0D // return
is $18 // ctrl-x
crout
inbuff.0 = 0
break
is $9B // escape
inbuff.0 = 0
ch = $0D
break
otherwise
if ch >= ' '
cout(ch)
inbuff.0++
inbuff[inbuff.0] = ch
if inbuff.0 > maxlen
maxlen = inbuff.0
fin
fin
wend
until ch == $0D or inbuff.0 == $7F
cout($0D)
return inbuff
end end
def prbyte(v)#0 def prbyte(v)#0
cout(hexchar[(v >> 4) & $0F]) cout(hexchar[(v >> 4) & $0F])
@ -834,27 +770,13 @@ def strcat(dst, src)#1
return dst return dst
end end
// //
// CFFA1 routines // C64 FILE I/O
// FILE I/O
// //
//def opendir
// perr = syscall($10, 0)
// return perr
//end
//def readdir
// perr = syscall($12, 0)
// return *CFFAEntryPtr
//end
def finddirentry(filename)#1 def finddirentry(filename)#1
*CFFAFileName = filename return 0
perr = syscall($14, 0)
return *CFFAEntryPtr
end end
def readfile(filename, buffer)#1 def readfile(filename, buffer)#1
*CFFADest = buffer return 0
*CFFAFileName = filename
perr = syscall($22, 0)
return perr
end end
// //
// Heap routines. // Heap routines.
@ -1150,7 +1072,7 @@ heap = *freemem
// //
// Print PLASMA version // Print PLASMA version
// //
prstr(@verstr); prbyte(version.1); cout('.'); prbyte(version.0); crout prstr("\nPRELIM PLASMA "); prbyte(version.1); cout('.'); prbyte(version.0); crout
// //
// Init symbol table. // Init symbol table.
// //
@ -1176,7 +1098,7 @@ perr = 0
// Print some startup info. // Print some startup info.
// //
if not ^cmdptr if not ^cmdptr
prstr(@freestr) prstr("MEM FREE:$")
prword(availheap) prword(availheap)
crout crout
fin fin
@ -1186,24 +1108,24 @@ fin
while 1 while 1
if ^cmdptr if ^cmdptr
when toupper(parsecmd(cmdptr)) when toupper(parsecmd(cmdptr))
is 'Q' is 'C'
quit break
is '+' is '+'
execmod(cmdptr) execmod(cmdptr)
break break
otherwise otherwise
prstr(@huhstr) cout('?')
wend wend
if perr if perr
prstr(@errorstr) prstr("ERR:$")
prbyte(perr) prbyte(perr)
perr = 0 perr = 0
else else
prstr(@okstr) prstr("OK")
fin fin
crout() crout
fin fin
prstr(@prompt) prstr("C64 PLASMA")
cmdptr = rdstr($BA) cmdptr = rdstr(':')
loop loop
done done

View File

@ -10,8 +10,8 @@
;* ;*
!SOURCE "vmsrc/plvmzp.inc" !SOURCE "vmsrc/plvmzp.inc"
DVSIGN = TMP+2 DVSIGN = TMP+2
DROP = $EF DROP = $7F
NEXTOP = $F0 NEXTOP = $80
FETCHOP = NEXTOP+1 FETCHOP = NEXTOP+1
IP = FETCHOP+1 IP = FETCHOP+1
IPL = IP IPL = IP
@ -21,7 +21,7 @@ OPPAGE = OPIDX+1
;* ;*
;* INTERPRETER HEADER+INITIALIZATION ;* INTERPRETER HEADER+INITIALIZATION
;* ;*
*= $0800 *= $1000
SEGBEGIN JMP VMINIT SEGBEGIN JMP VMINIT
;* ;*
;* SYSTEM INTERPRETER ENTRYPOINT ;* SYSTEM INTERPRETER ENTRYPOINT
@ -900,21 +900,27 @@ LEAVE INY ;+INC_IP
RET RTS RET RTS
CMD !SOURCE "vmsrc/c64/cmd.a" CMD !SOURCE "vmsrc/c64/cmd.a"
SEGEND = * SEGEND = *
VMINIT LDY #$10 ; INSTALL PAGE 0 FETCHOP ROUTINE VMINIT JSR $FFE7 ; CLOSE ALL CHANNELS
LDY #$10 ; INSTALL PAGE 0 FETCHOP ROUTINE
- LDA PAGE0-1,Y - LDA PAGE0-1,Y
STA DROP-1,Y STA DROP-1,Y
DEY DEY
BNE - BNE -
LDA #$4C ; SET JMPTMP OPCODE LDA #$4C ; SET JMPTMP OPCODE
STA JMPTMP STA JMPTMP
STY IFPL ; INIT FRAME POINTER STY IFPL ; INIT FRAME POINTER TO $D000
LDA #$80 LDA #$D0
STA IFPH STA IFPH
LDA #<SEGEND ; SAVE HEAP START LDA #<SEGEND ; SAVE HEAP START
STA SRCL STA $0100
LDA #>SEGEND LDA #>SEGEND
STA SRCH STA $0101
LDX #$FF ; INIT STACK POINTER
TXS
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
LDA $01
AND #$FE ; SWAP OUT BASIC ROM
STA $01
JMP CMD JMP CMD
PAGE0 = * PAGE0 = *
!PSEUDOPC DROP { !PSEUDOPC DROP {