mirror of
https://github.com/dschmenk/PLASMA.git
synced 2024-06-09 10:29:35 +00:00
179 lines
2.2 KiB
Plaintext
179 lines
2.2 KiB
Plaintext
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 |