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:
parent
c5d4d7d35f
commit
86408f5157
BIN
PLASMA.D64
Normal file
BIN
PLASMA.D64
Normal file
Binary file not shown.
@ -138,7 +138,7 @@ vmsrc/c64/cmd.a: vmsrc/c64/cmd.pla $(PLASM)
|
||||
./$(PLASM) -AOW < vmsrc/c64/cmd.pla > 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)
|
||||
./$(PLASM) -AOW < vmsrc/apple/a1cmd.pla > vmsrc/apple/a1cmd.a
|
||||
|
@ -1,6 +1,6 @@
|
||||
const RELADDR = $1000
|
||||
const inbuff = $200
|
||||
const freemem = $0006
|
||||
const freemem = $0100
|
||||
//const inbuff = $0200
|
||||
//
|
||||
// System flags: memory allocator screen holes.
|
||||
//
|
||||
@ -18,16 +18,6 @@ const resxhgr2 = $0080
|
||||
const modkeep = $1000
|
||||
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.
|
||||
//
|
||||
predef syscall(cmd,null)#1, call(addr,areg,xreg,yreg,status)#1
|
||||
@ -51,13 +41,9 @@ byte perr, refauto
|
||||
//
|
||||
// String pool.
|
||||
//
|
||||
byte inbuff[128]
|
||||
byte autorun[] = "AUTORUN"
|
||||
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'
|
||||
//
|
||||
// Exported Machine ID.
|
||||
@ -195,12 +181,6 @@ CALL6502 JSR $FFFF
|
||||
REGVALS !FILL 4
|
||||
end
|
||||
//
|
||||
// QUIT TO MONITOR
|
||||
//
|
||||
asm quit()#0
|
||||
JMP $9000
|
||||
end
|
||||
//
|
||||
// SET MEMORY TO VALUE
|
||||
// MEMSET(ADDR, VALUE, SIZE)
|
||||
// With optimizations from Peter Ferrie
|
||||
@ -725,16 +705,15 @@ end
|
||||
//
|
||||
asm cout(c)#0
|
||||
LDA ESTKL,X
|
||||
JSR TOUPR
|
||||
ORA #$80
|
||||
JMP $FFEF
|
||||
INX
|
||||
JMP $FFD2
|
||||
end
|
||||
asm cin()#1
|
||||
DEX
|
||||
- LDA $D011
|
||||
BPL -
|
||||
LDA $D010
|
||||
STX ESP
|
||||
JSR $FFCF
|
||||
AND #$7F
|
||||
LDX ESP
|
||||
STA ESTKL,X
|
||||
LDA #$00
|
||||
STA ESTKH,X
|
||||
@ -755,62 +734,19 @@ def print(i)#0
|
||||
cout(i % 10 + '0')
|
||||
end
|
||||
def rdstr(prompt)#1
|
||||
byte ch, maxlen
|
||||
maxlen = 0
|
||||
byte ch
|
||||
inbuff.0 = 0
|
||||
cout(prompt)
|
||||
repeat
|
||||
for inbuff = 0 to 127
|
||||
ch = cin
|
||||
when ch
|
||||
is $15 // right arrow
|
||||
if ^inbuff < maxlen //inbuff.0 < maxlen
|
||||
inbuff.0++
|
||||
ch = inbuff[inbuff.0]
|
||||
cout(ch)
|
||||
fin
|
||||
break
|
||||
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
|
||||
if ch == $0D
|
||||
break
|
||||
fin
|
||||
inbuff.0++
|
||||
inbuff[inbuff.0] = ch
|
||||
next
|
||||
crout
|
||||
return @inbuff
|
||||
end
|
||||
def prbyte(v)#0
|
||||
cout(hexchar[(v >> 4) & $0F])
|
||||
@ -834,27 +770,13 @@ def strcat(dst, src)#1
|
||||
return dst
|
||||
end
|
||||
//
|
||||
// CFFA1 routines
|
||||
// FILE I/O
|
||||
// C64 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
|
||||
*CFFAFileName = filename
|
||||
perr = syscall($14, 0)
|
||||
return *CFFAEntryPtr
|
||||
return 0
|
||||
end
|
||||
def readfile(filename, buffer)#1
|
||||
*CFFADest = buffer
|
||||
*CFFAFileName = filename
|
||||
perr = syscall($22, 0)
|
||||
return perr
|
||||
return 0
|
||||
end
|
||||
//
|
||||
// Heap routines.
|
||||
@ -1150,7 +1072,7 @@ heap = *freemem
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
@ -1176,7 +1098,7 @@ perr = 0
|
||||
// Print some startup info.
|
||||
//
|
||||
if not ^cmdptr
|
||||
prstr(@freestr)
|
||||
prstr("MEM FREE:$")
|
||||
prword(availheap)
|
||||
crout
|
||||
fin
|
||||
@ -1186,24 +1108,24 @@ fin
|
||||
while 1
|
||||
if ^cmdptr
|
||||
when toupper(parsecmd(cmdptr))
|
||||
is 'Q'
|
||||
quit
|
||||
is 'C'
|
||||
break
|
||||
is '+'
|
||||
execmod(cmdptr)
|
||||
break
|
||||
otherwise
|
||||
prstr(@huhstr)
|
||||
cout('?')
|
||||
wend
|
||||
if perr
|
||||
prstr(@errorstr)
|
||||
prstr("ERR:$")
|
||||
prbyte(perr)
|
||||
perr = 0
|
||||
else
|
||||
prstr(@okstr)
|
||||
prstr("OK")
|
||||
fin
|
||||
crout()
|
||||
crout
|
||||
fin
|
||||
prstr(@prompt)
|
||||
cmdptr = rdstr($BA)
|
||||
prstr("C64 PLASMA")
|
||||
cmdptr = rdstr(':')
|
||||
loop
|
||||
done
|
||||
|
@ -10,8 +10,8 @@
|
||||
;*
|
||||
!SOURCE "vmsrc/plvmzp.inc"
|
||||
DVSIGN = TMP+2
|
||||
DROP = $EF
|
||||
NEXTOP = $F0
|
||||
DROP = $7F
|
||||
NEXTOP = $80
|
||||
FETCHOP = NEXTOP+1
|
||||
IP = FETCHOP+1
|
||||
IPL = IP
|
||||
@ -21,7 +21,7 @@ OPPAGE = OPIDX+1
|
||||
;*
|
||||
;* INTERPRETER HEADER+INITIALIZATION
|
||||
;*
|
||||
*= $0800
|
||||
*= $1000
|
||||
SEGBEGIN JMP VMINIT
|
||||
;*
|
||||
;* SYSTEM INTERPRETER ENTRYPOINT
|
||||
@ -900,21 +900,27 @@ LEAVE INY ;+INC_IP
|
||||
RET RTS
|
||||
CMD !SOURCE "vmsrc/c64/cmd.a"
|
||||
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
|
||||
STA DROP-1,Y
|
||||
DEY
|
||||
BNE -
|
||||
LDA #$4C ; SET JMPTMP OPCODE
|
||||
STA JMPTMP
|
||||
STY IFPL ; INIT FRAME POINTER
|
||||
LDA #$80
|
||||
STY IFPL ; INIT FRAME POINTER TO $D000
|
||||
LDA #$D0
|
||||
STA IFPH
|
||||
LDA #<SEGEND ; SAVE HEAP START
|
||||
STA SRCL
|
||||
STA $0100
|
||||
LDA #>SEGEND
|
||||
STA SRCH
|
||||
STA $0101
|
||||
LDX #$FF ; INIT STACK POINTER
|
||||
TXS
|
||||
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
|
||||
LDA $01
|
||||
AND #$FE ; SWAP OUT BASIC ROM
|
||||
STA $01
|
||||
JMP CMD
|
||||
PAGE0 = *
|
||||
!PSEUDOPC DROP {
|
||||
|
Loading…
Reference in New Issue
Block a user