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
|
./$(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
|
||||||
|
@ -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
|
||||||
|
@ -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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user