a2render/files/GAME/SHELL.S

203 lines
2.5 KiB
ArmAsm

* Tiny shell
LST OFF
XC ; enable 65c02 ops
* Merlin addresses
TEXTSTART = $A
TEXTEND = $E
HIMEM = $C
OBJADDR = $E2
OBJLEN = $E4
ORGADDR = $E6
* Monitor addresses
STARTADDR = $3C
ENDADDR = $3E
DESTADDR = $42
* My zero-pg
MLICMD = $50
* I/O addresses
SETMAINZP = $C008
SETALTZP = $C009
READROM = $C082
LCBANK2 = $C08B
* Other stuff
INBUF = $200
RESETVEC = $3F2
USERVEC = $3F5
CTRLYVEC = $3F8
PRODOSBUF = $BB00
NAMEBUF = $C00
MLI = $BF00
MEMMAP = $BF58
AUXMOVE = $C311
MERLIN = $E003
PRNTAX = $F941
PRHEX = $F944
BASCALC = $FBC1
CALCRESET = $FB6F
INPUT = $FD6A
INPUTZ = $FD6F
CROUT = $FD8E
COUT = $FDED
SETVID = $FE93
PRERR = $FF2D
MONITOR = $FF69
MONSCAN = $FF70
ORG $300
INSTVECS LDA #<TOMON
STA USERVEC+1
LDA #>TOMON
STA USERVEC+2
LDA #<TOMERLIN
STA RESETVEC
STA CTRLYVEC+1
LDA #>TOMERLIN
STA RESETVEC+1
STA CTRLYVEC+2
JMP CALCRESET
* Start of resident code
RUNSHELL
; clear ProDOS memory map
LDX #$18
LDA #1
:MEMLUP
STA MEMMAP-1,X
LDA #0
DEX
BNE :MEMLUP
; display prompt
:LUP LDA PROMPT,X
BEQ :GETNAME
JSR COUT
INX
BNE :LUP
:GETNAME
JSR INPUTZ
TXA
BEQ :MON
:LOADIT
JSR LOADPROG
:MON JMP MONITOR
* Load program, name in INBUF
LOADPROG
; translate filename
LDY #0
STY MLICMD+1 ; filename lo byte
LDA #>NAMEBUF
STA MLICMD+2 ; ...and hi byte
:LUP
LDA INBUF,Y
INY
STA NAMEBUF,Y
CMP #$8D
BNE :LUP
:NAMEDONE
DEY
STY NAMEBUF
LDA #$C4 ; get info
LDX #$A
JSR DOMLI
LDA MLICMD+6 ; addr hi
PHA
LDA MLICMD+5 ; addr lo
PHA
LDA #<PRODOSBUF
STA MLICMD+3
LDA #>PRODOSBUF
STA MLICMD+4
LDA #$C8 ; open
LDX #3
JSR DOMLI
LDA MLICMD+5 ; handle
STA MLICMD+1
PLA ; addr lo
STA MLICMD+2
PLA ; addr hi
STA MLICMD+3
LDA #$CA ; read
STA MLICMD+5 ; also length (more than enough)
INX
JSR DOMLI
; fall through
CLOSE
STZ MLICMD+1 ; close all
LDA #$CC
LDX #1
; fall through
DOMLI
STA MLIOP
STX MLICMD
JSR MLI
MLIOP DFB 0
DA MLICMD
BCS :NO
:OK
RTS
:NO
LDA MLIOP
CMP #$CC
BEQ :OK
; fall through
ERR
JSR PRHEX
JSR CLOSE
JSR PRERR
JMP RUNSHELL
COPYUPPR LDX #$98
LDY #$C0
; fall through
* Copy page X-Y to page A
* Carry: clear = aux2main, set = main2aux
UNITYCOPY TXA
COPY STX STARTADDR+1
STY ENDADDR+1
STA DESTADDR+1
STZ STARTADDR
STZ ENDADDR
STZ DESTADDR
JMP AUXMOVE
TOMON
SEC
JSR COPYUPPR
STA SETMAINZP
BIT READROM
JSR INSTVECS
LDX #$FF
TXS
JSR SETVID
JMP RUNSHELL
TOMERLIN
JSR CLOSE
CLC
JSR COPYUPPR
STA SETALTZP
LDX #$FF
TXS
LDA LCBANK2
JMP MERLIN
PROMPT DFB $8D
ASC "Ld:",00
LST ON
END DFB 0
ERR \$3F0
LST OFF
SAV SHELL