203 lines
2.5 KiB
ArmAsm
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
|