mirror of
https://github.com/dschmenk/PLASMA.git
synced 2026-04-20 01:16:36 +00:00
Remove cmdexec.pla, replace with asm code
This commit is contained in:
+3
-14
@@ -94,18 +94,7 @@ byte prefix[32] = ""
|
||||
;
|
||||
; Utility functions
|
||||
;
|
||||
asm equates
|
||||
;*
|
||||
;* BANK SWITCHED MEM
|
||||
;*
|
||||
LCRDEN = $C080
|
||||
LCWTEN = $C081
|
||||
ROMEN = $C082
|
||||
LCRWEN = $C083
|
||||
LCBNK2 = $00
|
||||
LCBNK1 = $08
|
||||
!SOURCE "vmsrc/plvm02zp.inc"
|
||||
end
|
||||
;asm equates included from cmdstub.s
|
||||
;
|
||||
; CALL PRODOS
|
||||
; SYSCALL(CMD, PARAMS)
|
||||
@@ -189,7 +178,7 @@ end
|
||||
;
|
||||
asm reboot
|
||||
BIT ROMEN
|
||||
DEC $3F4 ; INVALIDATE POWER-UP BYTE
|
||||
DEC $03F4 ; INVALIDATE POWER-UP BYTE
|
||||
JMP ($FFFC) ; RESET
|
||||
end
|
||||
;
|
||||
@@ -1301,8 +1290,8 @@ loop
|
||||
;
|
||||
; Try to run autorun module.
|
||||
;
|
||||
execmod(@autorun)
|
||||
resetmemfiles()
|
||||
execmod(@autorun)
|
||||
perr = 0
|
||||
;
|
||||
; Print some startup info.
|
||||
|
||||
@@ -1,179 +0,0 @@
|
||||
const iobuffer = $0800
|
||||
const databuff = $0C00
|
||||
const memmap = $BF58
|
||||
const sysfile = $0280
|
||||
byte syshalt[] = "SYSTEM HALTED..."
|
||||
byte perr
|
||||
;
|
||||
; Utility functions
|
||||
;
|
||||
; CALL PRODOS
|
||||
; SYSCALL(CMD, PARAMS)
|
||||
;
|
||||
asm prodos
|
||||
LDA ESTKL,X
|
||||
LDY ESTKH,X
|
||||
STA PARAMS
|
||||
STY PARAMS+1
|
||||
INX
|
||||
LDA ESTKL,X
|
||||
STA CMD
|
||||
STX ESP
|
||||
JSR $BF00
|
||||
CMD: !BYTE 00
|
||||
PARAMS: !WORD 0000
|
||||
LDX ESP
|
||||
STA ESTKL,X
|
||||
LDY #$00
|
||||
STY ESTKH,X
|
||||
RTS
|
||||
end
|
||||
;
|
||||
; CALL LOADED SYSTEM PROGRAM
|
||||
;
|
||||
asm exec
|
||||
LDA #$00
|
||||
STA IFPL
|
||||
LDA #$BF
|
||||
STA IFPH
|
||||
LDX #$FE
|
||||
TXS
|
||||
LDX #ESTKSZ/2
|
||||
BIT ROMEN
|
||||
JMP $2000
|
||||
end
|
||||
;
|
||||
; EXIT
|
||||
;
|
||||
asm reboot
|
||||
BIT ROMEN
|
||||
LDA #$00
|
||||
STA $3F4 ; INVALIDATE POWER-UP BYTE
|
||||
JMP ($FFFC) ; RESET
|
||||
end
|
||||
;
|
||||
; SET MEMORY TO 0
|
||||
; MEMCLR(ADDR, SIZE)
|
||||
;
|
||||
asm memclr
|
||||
LDY #$00
|
||||
LDA ESTKL+1,X
|
||||
STA DSTL
|
||||
LDA ESTKH+1,X
|
||||
STA DSTH
|
||||
INC ESTKL,X
|
||||
INC ESTKH,X
|
||||
TYA
|
||||
SETMLP DEC ESTKL,X
|
||||
BNE +
|
||||
DEC ESTKH,X
|
||||
BEQ ++
|
||||
+ STA (DST),Y
|
||||
INY
|
||||
BNE SETMLP
|
||||
INC DSTH
|
||||
BNE SETMLP
|
||||
++ INX
|
||||
RTS
|
||||
end
|
||||
asm cin
|
||||
BIT ROMEN
|
||||
STX ESP
|
||||
JSR $FD0C
|
||||
LDX ESP
|
||||
DEX
|
||||
STA ESTKL,X
|
||||
LDY #$00
|
||||
STY ESTKH,X
|
||||
BIT LCRDEN+LCBNK2
|
||||
RTS
|
||||
end
|
||||
;
|
||||
; PRINT STRING
|
||||
; PRSTR(STR)
|
||||
;
|
||||
asm prstr
|
||||
LDY #$00
|
||||
LDA ESTKL,X
|
||||
STA SRCL
|
||||
LDA ESTKH,X
|
||||
STA SRCH
|
||||
BIT ROMEN
|
||||
LDA (SRC),Y
|
||||
STA ESTKL,X
|
||||
BEQ +
|
||||
- INY
|
||||
LDA (SRC),Y
|
||||
ORA #$80
|
||||
JSR $FDED
|
||||
TYA
|
||||
CMP ESTKL,X
|
||||
BNE -
|
||||
+ BIT LCRDEN+LCBNK2
|
||||
RTS
|
||||
end
|
||||
;
|
||||
; ProDOS routines
|
||||
;
|
||||
def open(path, buff)
|
||||
byte params[6]
|
||||
|
||||
params.0 = 3
|
||||
params:1 = path
|
||||
params:3 = buff
|
||||
params.5 = 0
|
||||
perr = prodos($C8, @params)
|
||||
return params.5
|
||||
end
|
||||
def close(refnum)
|
||||
byte params[2]
|
||||
|
||||
params.0 = 1
|
||||
params.1 = refnum
|
||||
perr = prodos($CC, @params)
|
||||
return perr
|
||||
end
|
||||
def read(refnum, buff, len)
|
||||
byte params[8]
|
||||
|
||||
params.0 = 4
|
||||
params.1 = refnum
|
||||
params:2 = buff
|
||||
params:4 = len
|
||||
params:6 = 0
|
||||
perr = prodos($CA, @params)
|
||||
return params:6
|
||||
end
|
||||
def resetmemfiles
|
||||
;
|
||||
; Close all files
|
||||
;
|
||||
^$BFD8 = 0
|
||||
close(0)
|
||||
;
|
||||
; Set memory bitmap
|
||||
;
|
||||
memclr(memmap, 24)
|
||||
^memmap.0 = $CF
|
||||
^memmap.23 = $01
|
||||
end
|
||||
def execsys
|
||||
byte refnum
|
||||
|
||||
if ^sysfile
|
||||
refnum = open(sysfile, iobuffer)
|
||||
if refnum
|
||||
if read(refnum, $2000, $FFFF)
|
||||
resetmemfiles()
|
||||
exec()
|
||||
fin
|
||||
fin
|
||||
fin
|
||||
end
|
||||
|
||||
resetmemfiles()
|
||||
execsys
|
||||
prstr(@syshalt)
|
||||
cin()
|
||||
reboot()
|
||||
done
|
||||
+30
-14
@@ -1,29 +1,45 @@
|
||||
INTERP = $03D0
|
||||
LCRDEN = $C080
|
||||
LCWTEN = $C081
|
||||
ROMEN = $C082
|
||||
LCRWEN = $C083
|
||||
LCBNK2 = $00
|
||||
LCBNK1 = $08
|
||||
!SOURCE "vmsrc/plvm02zp.inc"
|
||||
;*
|
||||
;* MOVE CMD DOWN TO $1000-$2000
|
||||
;*
|
||||
LDA #<_CMDBEGIN
|
||||
STA $06
|
||||
STA SRCL
|
||||
LDA #>_CMDBEGIN
|
||||
STA $07
|
||||
LDA #$00
|
||||
STA $08
|
||||
LDA #$10
|
||||
STA $09
|
||||
STA SRCH
|
||||
LDY #$00
|
||||
- LDA ($06),Y
|
||||
STA ($08),Y
|
||||
STY DSTL
|
||||
LDA #$10
|
||||
STA DSTH
|
||||
- LDA (SRC),Y
|
||||
STA (DST),Y
|
||||
INY
|
||||
BNE -
|
||||
INC $07
|
||||
INC $09
|
||||
LDA $09
|
||||
CMP #$20
|
||||
INC SRCH
|
||||
INC DSTH
|
||||
LDA DSTH
|
||||
CMP #$20 ; STOP WHEN DST=$2000 REACHED
|
||||
BNE -
|
||||
LDA #<_CMDEND
|
||||
STA $06
|
||||
STA SRCL
|
||||
LDA #>_CMDEND
|
||||
STA $07
|
||||
STA SRCH
|
||||
;
|
||||
; INIT VM ENVIRONMENT STACK POINTERS
|
||||
;
|
||||
LDA #$00 ; INIT FRAME POINTER
|
||||
STA IFPL
|
||||
LDA #$BF
|
||||
STA IFPH
|
||||
LDX #$FE ; INIT STACK POINTER (YES, $FE. SEE GETS)
|
||||
TXS
|
||||
LDX #ESTKSZ/2 ; INIT EVAL STACK INDEX
|
||||
JMP $1000
|
||||
_CMDBEGIN = *
|
||||
!PSEUDOPC $1000 {
|
||||
|
||||
+64
-45
@@ -40,21 +40,19 @@ ALTWROFF= $C004
|
||||
ALTWRON = $C005
|
||||
!SOURCE "vmsrc/plvm02zp.inc"
|
||||
STRBUF = $0280
|
||||
;**********************************************************
|
||||
;*
|
||||
;* INTERPRETER INSTRUCTION POINTER INCREMENT MACRO
|
||||
;*
|
||||
;**********************************************************
|
||||
!MACRO INC_IP {
|
||||
INY
|
||||
BNE * + 4
|
||||
INC IPH
|
||||
}
|
||||
;***********************************************
|
||||
;*
|
||||
;* INTERPRETER INITIALIZATION
|
||||
;*
|
||||
;***********************************************
|
||||
;******************************
|
||||
;* *
|
||||
;* INTERPRETER INITIALIZATION *
|
||||
;* *
|
||||
;******************************
|
||||
* = $2000
|
||||
LDX #$FF
|
||||
TXS
|
||||
@@ -178,6 +176,11 @@ INTERP BIT LCRDEN+LCBNK2 ; $03D0 - DIRECT INTERP ENTRY
|
||||
TMRVEC !WORD TMRRTS
|
||||
TMRRTS RTS
|
||||
}
|
||||
;************************************************
|
||||
;* *
|
||||
;* LANGUAGE CARD RESIDENT PLASMA VM STARTS HERE *
|
||||
;* *
|
||||
;************************************************
|
||||
VMCORE = *
|
||||
!PSEUDOPC $D000 {
|
||||
;*
|
||||
@@ -203,12 +206,9 @@ OPTBL !WORD ZERO,ADD,SUB,MUL,DIV,MOD,INCR,DECR ; 00 02 04 06 08 0A 0C 0E
|
||||
!WORD LB,LW,LLB,LLW,LAB,LAW,DLB,DLW ; 60 62 64 66 68 6A 6C 6E
|
||||
!WORD SB,SW,SLB,SLW,SAB,SAW,DAB,DAW ; 70 72 74 76 78 7A 7C 7E
|
||||
;*
|
||||
;* 'BYE' COMMAND PROCESSING
|
||||
;* 'BYE' PROCESSING - COPIED TO $1000 ON PRODOS BYE COMMAND
|
||||
;*
|
||||
!PSEUDOPC $1000 {
|
||||
;*
|
||||
;* CLEAR COMMAND LINE LENGTH BYTE IF CALLED FROM 'BYE'
|
||||
;*
|
||||
BYE JMP CPYCMD
|
||||
DEFCMD !FILL 63 ; AT $D103 IN LC MEMORY
|
||||
CPYCMD LDY DEFCMD
|
||||
@@ -216,31 +216,10 @@ CPYCMD LDY DEFCMD
|
||||
STA STRBUF,Y
|
||||
DEY
|
||||
BPL -
|
||||
;*
|
||||
;* MOVE REST OF CMD FROM LANGUAGE CARD
|
||||
;*
|
||||
CMDEXEC LDY #$00
|
||||
STY SRCL
|
||||
STY DSTL
|
||||
LDA #$D2
|
||||
STA SRCH
|
||||
LDA #$11
|
||||
STA DSTH
|
||||
BIT LCRDEN+LCBNK2
|
||||
- LDA (SRC),Y
|
||||
STA (DST),Y
|
||||
INY
|
||||
BNE -
|
||||
INC SRCH
|
||||
INC DSTH
|
||||
LDA SRCH
|
||||
CMP #$D4 ; #$E0
|
||||
BNE -
|
||||
;*
|
||||
;* DEACTIVATE 80 COL CARDS
|
||||
;*
|
||||
LDX #$FE
|
||||
TXS
|
||||
CMDEXEC = *
|
||||
;
|
||||
; DEACTIVATE 80 COL CARDS
|
||||
;
|
||||
BIT ROMEN
|
||||
LDY #4
|
||||
- LDA DISABLE80,Y
|
||||
@@ -252,16 +231,56 @@ CMDEXEC LDY #$00
|
||||
BIT $C051
|
||||
BIT $C058
|
||||
JSR $FC58 ; HOME
|
||||
;*
|
||||
;* JUMP TO INTERPRETER
|
||||
;*
|
||||
START LDA #$00
|
||||
STA IFPL
|
||||
LDA #$BF
|
||||
STA IFPH
|
||||
LDX #ESTKSZ/2
|
||||
!SOURCE "vmsrc/cmdexec.a"
|
||||
;
|
||||
; READ CMD INTO MEMORY
|
||||
;
|
||||
JSR PRODOS ; CLOSE EVERYTHING
|
||||
!BYTE $CC
|
||||
!WORD CLOSEPARMS
|
||||
BNE FAIL
|
||||
JSR PRODOS ; OPEN CMD
|
||||
!BYTE $C8
|
||||
!WORD OPENPARMS
|
||||
BNE FAIL
|
||||
LDA REFNUM
|
||||
STA READPARMS+1
|
||||
JSR PRODOS
|
||||
!BYTE $CA
|
||||
!WORD READPARMS
|
||||
BNE FAIL
|
||||
JSR PRODOS
|
||||
!BYTE $CC
|
||||
!WORD CLOSEPARMS
|
||||
BNE FAIL
|
||||
JMP $2000 ; JUMP TO LOADED SYSTEM COMMAND
|
||||
;
|
||||
; PRINT FAIL MESSAGE, WAIT FOR KEYPRESS, AND REBOOT
|
||||
;
|
||||
FAIL INC $3F4 ; INVALIDATE POWER-UP BYTE
|
||||
LDY #$01
|
||||
- LDA FAILMSG,Y
|
||||
ORA #$80
|
||||
JSR $FDED
|
||||
INY
|
||||
CPY FAILMSG
|
||||
BNE -
|
||||
JSR $FD0C ; WAIT FOR KEYPRESS
|
||||
JMP ($FFFC) ; RESET
|
||||
OPENPARMS !BYTE 3
|
||||
!WORD STRBUF
|
||||
!WORD $0800
|
||||
REFNUM !BYTE 0
|
||||
READPARMS !BYTE 4
|
||||
!BYTE 0
|
||||
!WORD $2000
|
||||
!WORD $1100
|
||||
!WORD 0
|
||||
CLOSEPARMS !BYTE 1
|
||||
!BYTE 0
|
||||
DISABLE80 !BYTE 21, 13, '1', 26, 13
|
||||
FAILMSG !BYTE 39
|
||||
!TEXT "MISSING CMD. PRESS ANY KEY TO RESET..."
|
||||
ENDBYE = *
|
||||
}
|
||||
;*
|
||||
;* ENTER INTO BYTECODE INTERPRETER
|
||||
|
||||
Reference in New Issue
Block a user