mirror of https://github.com/callapple/LLUCE.git
625 lines
18 KiB
ArmAsm
625 lines
18 KiB
ArmAsm
********************************
|
|
* *
|
|
* Shell to system file *
|
|
* *
|
|
********************************
|
|
*
|
|
* This overlay allows shelling to any system program,
|
|
* and returning to LLUCE at the place you left off.
|
|
*
|
|
* Calling format is:
|
|
*
|
|
* overlay "shell","system.prog"
|
|
* [,"startpath"][,"initial.pfx"][,"save.name"]
|
|
*
|
|
* All parameters must be in their proper place.
|
|
* What this means is that if you wish to have a
|
|
* save.name, but not a startpath or initial.pfx,
|
|
* you must still supply those parameters, but they
|
|
* should be empty strings ("").
|
|
*
|
|
* "system.prog" may be any program that executes at
|
|
* $2000.
|
|
*
|
|
* "startpath" is the path of the startup file for the
|
|
* program being run.
|
|
*
|
|
* "initial.pfx" is the prefix to set before executing
|
|
* system.prog. If this is different from the folder
|
|
* containing "system.prog", "system.prog" must be a
|
|
* complete pathname.
|
|
*
|
|
* "save.name" is a filename to save memory to.
|
|
* The default is "LLUCE.SAVE" in the LLUCE.SYSTEM
|
|
* directory. Move to a ramdisk for faster operation.
|
|
*
|
|
* NOTE: All pathnames MUST be complete pathnames
|
|
* unless the partial path is in the CURRENT
|
|
* directory (Lance!)
|
|
*-------------------------------
|
|
DATE
|
|
*-------------------------------
|
|
|
|
Id = 5
|
|
Aux = 255
|
|
|
|
LST OFF
|
|
LSTDO OFF
|
|
XC
|
|
TR
|
|
TR ADR
|
|
EXP ONLY
|
|
Y = 1
|
|
y = 1
|
|
N = 0
|
|
n = 0
|
|
NOLIST = Y
|
|
DO NOLIST
|
|
LISTOBJ = N
|
|
LISTSYM = N
|
|
ELSE
|
|
LISTOBJ KBD 'List This Source? (Y/N)'
|
|
LISTSYM KBD 'List Symbol Table? (Y/N)'
|
|
FIN
|
|
|
|
DO LISTOBJ
|
|
LST
|
|
FIN
|
|
LST OFF
|
|
USE EQUATES/MACROS
|
|
PUT EQUATES/EQUATES
|
|
PUT EQUATES/OS.EQUATES
|
|
PUT EQUATES/DRIVEREQU
|
|
PUT EQUATES/ENTRY
|
|
LST RTN
|
|
|
|
]TYPE = ^overlays ; set file type
|
|
]AUX = overlays ; and aux type
|
|
ORG ]AUX ; must be this way
|
|
TYP ]TYPE
|
|
|
|
DSK /MAIN/LLUCE/SYSTEM/SHELL
|
|
|
|
TTL 'LLUCE - Shell to system file'
|
|
DO LISTOBJ
|
|
LST
|
|
FIN
|
|
|
|
DB Id
|
|
DA Aux
|
|
DB Aux/256!Aux!Id!$A5
|
|
|
|
*-------------------------------
|
|
* Size Of Code To Check CRC
|
|
*-------------------------------
|
|
|
|
DA IOEND-MAIN
|
|
DA 0 ; CRC Goes Here
|
|
|
|
PATH2 = LNBUF+$80
|
|
|
|
ORG $D000
|
|
|
|
MAIN
|
|
MOVD MLI+1;ORIGMLI ; save patches
|
|
MOVD IRQVEC;ORIGIRQ
|
|
MOVD RESETVEC;ORIGRST
|
|
LDX #0
|
|
MOVEMOVE MOV MOVECODE,X;DO_MOVES,X
|
|
DBNE X;MOVEMOVE
|
|
|
|
PDOS Getpfx;KILLLST ; get and save prefix
|
|
|
|
LDX PATH2
|
|
SVOPFX MOV PATH2,X;ORIGPFX+QUITCODE-QUIT,X
|
|
DBPL X;SVOPFX
|
|
|
|
LDX SYSPFX ; set to LLUCE system pfx
|
|
MOVSPFX MOV SYSPFX,X;PATH2,X
|
|
DBPL X;MOVSPFX
|
|
|
|
PDOS Setpfx;KILLLST
|
|
|
|
STZ PRN
|
|
JSR GOBCOM ; get the filename
|
|
JSR MOVNAME
|
|
LD16 #PATHNAME+EXITCODE-EXIT
|
|
JSR FRMFLN
|
|
|
|
STZ PREFIX+EXITCODE-EXIT ; set for no prefix
|
|
STZ STARTUP+EXITCODE-EXIT ; set no startup
|
|
|
|
LDX FLNAME
|
|
FINDPFX LDA FLNAME,X
|
|
AND #Clrhi
|
|
CPEQ #'/';FOUNDPFX
|
|
DBPL X;FINDPFX
|
|
BRA NOPFX
|
|
|
|
FOUNDPFX STX FLNAME
|
|
LD16 #PREFIX+EXITCODE-EXIT
|
|
JSR FRMFLN
|
|
|
|
NOPFX IFNE (PRGPTR);#','+Hibit;NONAMES
|
|
|
|
JSR GOBCOM ; get the start name
|
|
JSR MOVNAME
|
|
LD16 #STARTUP+EXITCODE-EXIT
|
|
JSR FRMFLN
|
|
|
|
EMPTYST IFNE (PRGPTR);#','+Hibit;NONAMES
|
|
|
|
JSR GOBCOM ; get the prefix
|
|
JSR MOVNAME
|
|
LD16 #PREFIX+EXITCODE-EXIT
|
|
JSR FRMFLN
|
|
|
|
EMPTYPFX IFNE (PRGPTR);#','+Hibit;NONAMES
|
|
|
|
JSR GOBCOM ; get the save name
|
|
JSR MOVNAME
|
|
LD16 #SAVEPATH+QUITCODE-QUIT
|
|
JSR FRMFLN
|
|
|
|
NONAMES LD16 #PATHNAME+EXITCODE-EXIT
|
|
JSR EXISTS
|
|
BCS ERROR
|
|
LD16 #STARTUP+EXITCODE-EXIT
|
|
JSR EXISTS
|
|
BCS ERROR
|
|
LD16 #PREFIX+EXITCODE-EXIT
|
|
JSR EXISTS
|
|
BCS ERROR
|
|
|
|
JSR DO_CL3 ; all files closed
|
|
|
|
JSR SYSSTORE ; save variables
|
|
|
|
*-------------------------------
|
|
* Done accessing LLUCE code
|
|
*-------------------------------
|
|
|
|
PHP
|
|
SEI
|
|
MOVD PDOSVEC;MLI+1
|
|
MOVD IRQSAVE;IRQVEC
|
|
PLP
|
|
|
|
LDX SAVEPATH+QUITCODE-QUIT
|
|
MOVPATH MOV SAVEPATH+QUITCODE-QUIT,X;PATH2,X
|
|
DBPL X;MOVPATH
|
|
|
|
JSR DO_MOVES ; move all code down
|
|
BCS MOVEERR
|
|
; put path where we can use it
|
|
LDX #0
|
|
MOVMOV2 MOV MOVCODE2,X;MOVQUIT,X
|
|
DBNE X;MOVMOV2
|
|
|
|
JSR MOVQUIT
|
|
|
|
JSR SAVEBUF ; save LLUCE kernel
|
|
|
|
LDX #0
|
|
EXITLOOP MOV EXITCODE,X;EXIT,X
|
|
MOV EXITCODE+$100,X;EXIT+$100,X
|
|
DBNE X;EXITLOOP
|
|
|
|
JSR EXIT ; returns only if error
|
|
|
|
JSR RSTBUFF ; restore original
|
|
|
|
ERROR STA PRN
|
|
PHP
|
|
SEI
|
|
MOVD ORIGMLI;MLI+1
|
|
MOVD ORIGIRQ;IRQVEC
|
|
MOVD ORIGRST;RESETVEC
|
|
EOR #$A5
|
|
STA SOFTEV
|
|
PLP
|
|
RTS
|
|
|
|
EXISTS ST16 TEMP
|
|
CLC
|
|
LDA (TEMP)
|
|
BEQ IS_THERE
|
|
TAY
|
|
MVEXIST MOV (TEMP),Y;PATH2,Y
|
|
DBPL Y;MVEXIST
|
|
PDOS Getinfo;INFOLST
|
|
IS_THERE RTS
|
|
|
|
MOVEERR JSR ERROR
|
|
JSR SYSRCAL ; recall all variables
|
|
LDA #0 ; reload last segment
|
|
PHA
|
|
PHA
|
|
PHA
|
|
PHA
|
|
PHA
|
|
PHA
|
|
LDA #$80 ; continue last segment
|
|
JSR RELOAD ; no return from here
|
|
|
|
SAVEBUF MOVD #NODENUM;a1
|
|
MOVD MODULE;a2
|
|
MOVD #SYSTEM;a4
|
|
SEC
|
|
JSR auxMove
|
|
RTS
|
|
|
|
RSTBUFF PHA
|
|
MOVD #SYSTEM;a1
|
|
CLC
|
|
ADC MODULE+1
|
|
STA a2+1
|
|
STZ a2
|
|
MOVD #NODENUM;a4
|
|
CLC
|
|
JSR auxMove
|
|
PLA
|
|
RTS
|
|
|
|
ORIGMLI DW 0
|
|
ORIGIRQ DW 0
|
|
ORIGRST DW 0
|
|
|
|
DS \
|
|
|
|
QUITCODE ORG $A000
|
|
|
|
QUIT CLD ; for ProDOS
|
|
|
|
LDX #0 ; move quit code up
|
|
QUITUP MOV $1000,X;QUIT,X
|
|
MOV $1100,X;QUIT+$100,X
|
|
MOV $1200,X;QUIT+$200,X
|
|
DBNE X;QUITUP
|
|
JMP QUITCONT
|
|
|
|
QUITCONT PDOS Setpfx;OPFXLST
|
|
|
|
PDOS Open;OSAVELST
|
|
MOV OSAVEREF;RDREF
|
|
PDOS Read;RDLST ; read zp and page 3
|
|
PDOS Close;OCLSLST
|
|
|
|
IFNE DEV1ADR;DEV2ADR+6;KILLRAM ; /RAM
|
|
IFEQ DEV1ADR+1;DEV2ADR+7;NORAM ; installed?
|
|
|
|
KILLRAM LDX DEVCNT ; Find Any Ramdisk
|
|
FNDRAM LDA DEVLST,X ; Get Device Id Byte
|
|
TAY
|
|
AND #$B3 ; Low Nibble Is Type
|
|
CPEQ #$B3;MVDEV ; Is It A RAM Disk?
|
|
|
|
DBPL X;FNDRAM ; Go To Next Device
|
|
BRA NORAM
|
|
|
|
MVDEV MOV DEVLST+1,X;DEVLST,X ; Copy Bytes Down
|
|
INX
|
|
CPLTX #13;MVDEV ; Finished With List?
|
|
STZ DEVLST+13 ; zap last byte
|
|
|
|
DEC DEVCNT ; 1 Less Device
|
|
|
|
LD16 DEV2ADR+6 ; save driver info
|
|
STZ SETALTZP ; in alt zp
|
|
ST16 RAMDRVR
|
|
STY RAMDEV
|
|
STZ SETSTDZP
|
|
|
|
MOVD DEV1ADR;DEV2ADR+6 ; set no device
|
|
|
|
TYA
|
|
AND #HiNibble
|
|
STA UNIT ; Save Unit Number
|
|
PDOS Online;ONLINE ; This Clears Device
|
|
|
|
NORAM MOVD ORIGIRQ;IRQVEC
|
|
|
|
MOV MODULE+1;LOADADR2+2
|
|
STZ SETALTZP
|
|
LDY #1 ; move zero page down
|
|
LDA #>0
|
|
JSR MOVEOUT
|
|
STZ SETSTDZP
|
|
LDY #1 ; restore interrupt buffer
|
|
LDA #>INTBUF
|
|
JSR MOVEOUT
|
|
LDY #16
|
|
LDA #>MAIN ; Move D000-DFFF main bank 1
|
|
STZ SETRAM1
|
|
JSR MOVEOUT
|
|
STZ SETALTZP
|
|
LDY #16
|
|
LDA #>MAIN ; Move D000-DFFF aux bank 1
|
|
JSR MOVEOUT
|
|
STZ SETRAM2
|
|
LDY #15
|
|
LDA #>PROFILT ; Move F000-FEFF aux bank 2
|
|
JSR MOVEOUT
|
|
|
|
STZ SETRAM2 ; Select Ram Card
|
|
STZ SETRAM2
|
|
STZ SETALTZP
|
|
|
|
MOVD ORIGMLI;MLI+1
|
|
MOVD ORIGRST;RESETVEC
|
|
EOR #$A5
|
|
STA SOFTEV
|
|
|
|
STZ AUTOLOG ; Clear auto logon flag
|
|
STZ V_MODE
|
|
STZ BLINK
|
|
STZ DISP80 ; Switch To 80 Column Mode
|
|
STZ STORE80 ; Enable Page Select
|
|
STZ ALTCHRS ; Mousetext Available
|
|
|
|
MOV #vidWidth;V_OLDCV ; 80 Columns Wide
|
|
|
|
LDA LORES ; ** It Makes Things Work !!
|
|
LDA ANU_ON ; Annunc_On
|
|
LDA KBDSTRB
|
|
|
|
MOV #$60;USERVEC ; Put RTS For User-Routine
|
|
|
|
LDA #ff ; clear any junk
|
|
JSR VIDCOUT
|
|
|
|
JSR SYSRCAL ; recall all variables
|
|
LDA #0 ; reload last segment
|
|
PHA
|
|
PHA
|
|
PHA
|
|
PHA
|
|
PHA
|
|
PHA
|
|
LDA #$80 ; continue last segment
|
|
JSR RELOAD ; no return from here
|
|
|
|
MOVEOUT STA SAVEADR2+2
|
|
LDX #0
|
|
LOADADR2 LDA NODENUM,X
|
|
SAVEADR2 STA NODENUM,X
|
|
DBNE X;LOADADR2
|
|
INC LOADADR2+2
|
|
INC SAVEADR2+2
|
|
DBNE Y;LOADADR2
|
|
RTS
|
|
|
|
OPFXLST DB 1
|
|
DA ORIGPFX
|
|
|
|
OSAVELST DB 3
|
|
DA SAVEPATH
|
|
DA FBUF1
|
|
OSAVEREF DB 0
|
|
|
|
RDLST DB 4 ; Write from $200-$3FF
|
|
RDREF DB 0
|
|
DW NODENUM
|
|
RDREQ DW 0
|
|
DW 0
|
|
|
|
OCLSLST DB 1
|
|
DB 0
|
|
|
|
ONLINE DB 2
|
|
UNIT DB 0
|
|
DA LNBUF+$81
|
|
|
|
DS $A280-*
|
|
|
|
SAVEPATH STR 'LLUCE.SAVE' ; our save name
|
|
DS $40-*+SAVEPATH,' ' ; DON'T TOUCH
|
|
ORIGPFX DS $40 ; Prefix to return to
|
|
ORG
|
|
|
|
EXITCODE ORG $1000
|
|
|
|
EXIT LDEQ RAMDEV;NODRVR ; /RAM removed?
|
|
|
|
MOVD RAMDRVR;DEV2ADR+6
|
|
|
|
INC DEVCNT
|
|
LDY DEVCNT
|
|
FIXDEV MOV DEVLST-1,Y;DEVLST,Y
|
|
DBNE Y;FIXDEV
|
|
MOV RAMDEV;DEVLST
|
|
STZ SETSTDZP ; set to standard zp
|
|
AND #HiNibble
|
|
STA DVRUNIT
|
|
MOV #3;DVRCMD ; format command
|
|
MOVD #SYSTEM;DVRBUFF
|
|
LDA SETRAM2
|
|
JSR FMTDVR
|
|
BCS EXITERR
|
|
|
|
NODRVR STZ SETSTDZP ; set to standard zp
|
|
STZ SETROM
|
|
|
|
LDEQ PREFIX;SAMEPFX
|
|
PDOS Setpfx;SPFXLST
|
|
BCS EXITERR
|
|
SAMEPFX PDOS Open;OPENALST
|
|
BCS EXITERR
|
|
MOV OPENAREF;READAREF
|
|
STA CLSALST
|
|
PDOS Read;READALST
|
|
BCS EXITERR
|
|
PDOS Close;CLSALST
|
|
BCS EXITERR
|
|
|
|
LDEQX STARTUP;GOSYS ;any startup path?
|
|
IFNE SYSTEM;#$20;GOSYS ; place for startup?
|
|
IFNE #$EE;SYSTEM+3;GOSYS
|
|
CPNE SYSTEM+4;GOSYS
|
|
IFLT STARTUP;SYSTEM+5;GOSYS
|
|
|
|
MVSTART MOV STARTUP,X;SYSTEM+6,X ; move in path
|
|
DBPL X;MVSTART
|
|
|
|
GOSYS JMP SYSTEM
|
|
|
|
FMTDVR JMP (DEV2ADR+6)
|
|
|
|
EXITERR STZ SETRAM2 ; Select Ram Card
|
|
STZ SETRAM2
|
|
STZ SETALTZP
|
|
RTS
|
|
|
|
OPENALST DB 3
|
|
DA PATHNAME
|
|
DA FBUF1
|
|
OPENAREF DB 0
|
|
|
|
READALST DB 4
|
|
READAREF DB 0
|
|
DW SYSTEM
|
|
DW MLI-SYSTEM
|
|
DW 0
|
|
|
|
CLSALST DB 1
|
|
CLSAREF DB 0
|
|
|
|
SPFXLST DB 1
|
|
DA PREFIX
|
|
|
|
DS \
|
|
|
|
PATHNAME DS $40
|
|
PREFIX DS $40
|
|
STARTUP DS $40
|
|
DS $40
|
|
ORG
|
|
EXITEND = *
|
|
|
|
MOVECODE ORG $A000
|
|
|
|
DO_MOVES MOV MODULE+1;SAVEADR+2
|
|
LDY #1 ; move zero page up
|
|
LDA #>0
|
|
JSR MOVEIN
|
|
LDY #1 ; save interrupt buffer
|
|
LDA #>INTBUF
|
|
JSR MOVEIN
|
|
LDY #16
|
|
LDA #>MAIN ; Move D000-DFFF main bank 1
|
|
STZ SETSTDZP
|
|
STZ SETRAM1
|
|
JSR MOVEIN
|
|
STZ SETALTZP
|
|
LDY #16
|
|
LDA #>MAIN ; Move D000-DFFF aux bank 1
|
|
JSR MOVEIN
|
|
STZ SETRAM2
|
|
LDY #15
|
|
LDA #>PROFILT ; Move F000-FEFF aux bank 2
|
|
JSR MOVEIN
|
|
|
|
SEC
|
|
LDA SAVEADR+2
|
|
SBC #>NODENUM
|
|
STA WRREQ+1
|
|
STA RDREQ+1+QUITCODE-QUIT
|
|
|
|
STZ SETSTDZP
|
|
|
|
PDOS Destroy;KILLLST ; kill file...
|
|
PDOS Create;CRTLST ; make new one
|
|
BCS SAVEERR
|
|
PDOS Open;OPENLST ; open our file
|
|
BCS SAVEERR
|
|
|
|
MOV OPENREF;WRREF
|
|
|
|
PDOS Write;WRLST
|
|
PHP
|
|
PHA
|
|
PDOS Close;CLOSELST
|
|
PLA
|
|
PLP
|
|
SAVEERR STZ SETALTZP
|
|
STZ SETRAM2
|
|
RTS
|
|
|
|
MOVEIN STA LOADADR+2
|
|
LDX #0
|
|
LOADADR LDA NODENUM,X
|
|
SAVEADR STA NODENUM,X
|
|
DBNE X;LOADADR
|
|
INC LOADADR+2
|
|
INC SAVEADR+2
|
|
DBNE Y;LOADADR
|
|
RTS
|
|
|
|
OPENLST DB 3
|
|
DA PATH2
|
|
DA FBUF1
|
|
OPENREF DB 0
|
|
|
|
WRLST DB 4 ; Write from $200-$3FF
|
|
WRREF DB 0
|
|
DW NODENUM
|
|
WRREQ DW 0
|
|
DW 0
|
|
|
|
CLOSELST DB 1
|
|
DB 0
|
|
|
|
KILLLST DB 1
|
|
DA PATH2
|
|
|
|
CRTLST DB 7
|
|
DA PATH2
|
|
DB $E3 ; standard access
|
|
DB ^overlays ; LLUCE data file
|
|
DW overlays ; Non-packed file
|
|
DB 1 ; standard file
|
|
DW 0 ; use current date/time
|
|
DW 0
|
|
|
|
INFOLST DB $A
|
|
DW PATH2
|
|
DB 0
|
|
DB 0
|
|
DW 0
|
|
DB 0
|
|
DW 0
|
|
DW 0
|
|
DW 0
|
|
DW 0
|
|
DW 0
|
|
DS \
|
|
ORG
|
|
|
|
MOVCODE2 ORG LNBUF
|
|
|
|
MOVQUIT LDX #0
|
|
MOVEDOWN MOV QUITCODE,X;QUIT,X
|
|
MOV QUITCODE+$100,X;QUIT+$100,X
|
|
MOV QUITCODE+$200,X;QUIT+$200,X
|
|
DBNE X;MOVEDOWN
|
|
STZ SETSTDZP
|
|
STZ SETRAM1
|
|
LDX #0
|
|
MOVEUP MOV QUIT,X;$D100,X
|
|
MOV QUIT+$100,X;$D200,X
|
|
MOV QUIT+$200,X;$D300,X
|
|
DBNE X;MOVEUP
|
|
STZ SETALTZP
|
|
STZ SETRAM2
|
|
RTS
|
|
|
|
ORG
|
|
IOEND = *
|
|
|
|
LST OFF
|
|
DO LISTSYM
|
|
LST
|
|
FIN
|
|
TTL 'SHELL - Symbol Table'
|
|
|