1
0
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:
David Schmenk
2014-06-12 17:53:18 -07:00
parent 49f5c312cd
commit 40b5e8e417
5 changed files with 97 additions and 252 deletions
+3 -14
View File
@@ -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.
-179
View File
@@ -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
View File
@@ -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
View File
@@ -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