Davex/src/shell/2/file_execution2.asm

650 lines
9.7 KiB
NASM

rdkey = $fd0c
;****************************************
;
; shell/runcmd -- SYS/BIN/S16 file runner
; for Davex
;
;****************************************
run_s16:
jsr notspool
sec
jsr idroutine ;IIgs?
bcs typerr
lda #>bridge_name
ldy #<bridge_name
jsr build_local
sta br_ugh+2
sty br_ugh+1
ldx #63
br_ugh: lda $ffff,x
and #$7f ;23-Feb-88
sta $2c0,x
dex
bpl br_ugh
ldx #3
cpdave: lda dave,x
.byte $9f,$02,$01,$01 ;STA $010102,X
dex
bpl cpdave
ldx #63
cpys16: lda cmdpath,x
and #$7f ;ProDOS 16 cares about high bit!
.byte $9f,$06,$01,$01 ;STA $010106,X
lda mypath_all,x
and #$7f
.byte $9f,$46,$01,$01 ;STA $010146,X
dex
bpl cpys16
CALLOS mli_bye, s16p
.byte 0 ;single-byte BRK
s16p: .byte 4,$ee
.addr $2c0,0
bridge_name:
pstr "BRIDGE.S16"
dave: asc "DAVE"
run_something:
cmp #tSYS
beq is_sys
cmp #tS16
beq run_s16
cmp #$B5 ;can run EXE files, too!
beq run_s16
cmp #$2E ;$2E;$8001 is a Dvx command
bne cmdNot2E
ldx info_auxtype+1
cpx #$80
bne cmdNot2E
ldx info_auxtype
cpx #$01
beq run_ext0
cmdNot2E:
cmp #tBIN
bne typerr
run_ext0:
jmp run_external
typerr: pha
message_cstr "Can't run '"
pla
jsr print_ftype
message_cstr_cr "' files"
jmp main_err
is_sys: jsr notspool
jsr finish_oredir
jsr finish_iredir
jsr chk_argu
ldx #127
copy280:
lda cmdpath,x
jsr upcase
and #$7f
sta $280,x
dex
bpl copy280
lda #0
SET_LEVEL
jsr close
jsr open_sys
bcs run_err
;
; If '-n' parameter given, don't replace quit code
;
lda #$80+'n'
jsr getparm_ch
bcc no_return
jsr write_quit
jsr my_quit
no_return:
jsr copy_loader
jsr off80
jsr setkbd
jsr setvid
start_normal
jsr home
lda #>cmdpath
ldy #<cmdpath
jsr print_path
message_cstr_cr "..."
jsr hook_speech
lda reset+1
sta reset+2 ; cause Reset to reboot
lda #$ff ; disconnect NMI
ldy #$59
sta $3fd
sty $3fc
lda #0
ldx #23
clearbm1:
sta bitmap,x
dex
bne clearbm1
lda #%11001111
sta bitmap+0
lda #1
sta bitmap+BitMapSize-1
jmp $1800
run_err:
rts
;
; open system file & store refnum into
; loader code
;
open_sys:
lda #stdlevel
SET_LEVEL
CALLOS mli_open, loader_open
CALLOS_BRANCH_NEG @exit
lda loadref1
sta loadref2
sta loadref3
@exit: rts
loader_open:
.byte 3
.addr cmdpath
.addr filebuff
loadref1:
.byte 0
;
; save current quit code into %config if it does not
; belong to this incarnation of Davex.
;
write_quit: ;use filebuff2
bit $c083
bit $c083
ldx #0
getq: lda $d100,x
sta filebuff3,x
lda $d200,x
sta filebuff3+$100,x
lda $d300,x
sta filebuff3+$200,x
dex
bne getq
bit $c082
lda filebuff3
cmp myqcode
bne notmine
lda filebuff3+1
cmp myqcode+1
bne notmine
lda filebuff3+2
cmp myqcode+2
bne notmine
ldy mypath_all
qmine: lda mypath_all,y
cmp filebuff3+mypath_all-myqcode,y
bne notmine
dey
bpl qmine
offline:
rts
notmine:
lda #>config_pn
ldy #<config_pn
jsr build_local
jsr open_config
bcs offline
sta qcref2
sta qcref3
jsr posit_qcode
CALLOS mli_write, wr_quitc
CALLOS_BRANCH_NEG wrq_err
lda qcref2
jmp close
wrq_err:
jmp ProDOS_er
posit_qcode:
CALLOS mli_setmark, kill_qc
CALLOS_BRANCH_NEG wrq_err
rts
;
; get_quitcode -- load quit code from %config
; if present; return with CLC if successful, SEC
; if not
;
gotqc: rts
get_quitcode:
bit $c083
lda $d100
ldx $d101
ldy $d102
bit $c082
cmp myqcode
bne gotqc
cpx myqcode+1
bne gotqc
cpy myqcode+2
bne gotqc
lda #>config_pn
ldy #<config_pn
jsr build_local
jsr open_config
bcs reload_x
sta qcref2
sta qcref3
jsr posit_qcode
CALLOS mli_read, wr_quitc
CALLOS_BRANCH_NEG reload_x
bit $c083
bit $c083
ldx #0
reload1:
lda filebuff3,x
sta $d100,x
lda filebuff3+$100,x
sta $d200,x
lda filebuff3+$200,x
sta $d300,x
dex
bne reload1
bit $c082
CALLOS mli_seteof, kill_qc
reload_x:
jmp close_config
wr_quitc:
.byte 4
qcref2:
.byte 0
.addr filebuff3
.addr $300 ;length of QUIT code
.addr 0
kill_qc:
.byte 2
qcref3:
.byte 0
.addr config_len
.byte 0
;
; install Quit code to return to MYPATH_ALL
;
my_quit:
bit $c083
bit $c083
ldx #0
myquit1:
lda myqcode,x
sta $d100,x
lda myqcode+$100,x
sta $d200,x
lda myqcode+$200,x
sta $d300,x
dex
bne myquit1
bit $c081
rts
;
; myqcode -- code to return to the shell;
; must run at $1000
;
myqcode:
cld
sed
cld
lda $c082
sta $c00c
jsr setkbd
jsr setvid
start_normal
jsr f8rom_init
jsr home
lda reset+1
sta reset+2
; init brkv
lda #$fa
sta $3f1
lda #$59
sta $3f0 ;brkv
lda #0
SET_LEVEL
CALLOS mli_close, qt_closeall-myqcode+$1000
ldx #23
lda #0
clearbm2:
sta bitmap,x
dex
bne clearbm2
lda #%11001111
sta bitmap+0
lda #1
sta bitmap+BitMapSize-1
ldx #79
@copy: lda mypath_all-myqcode+$1000,x
sta $280,x
dex
bpl @copy
rtn_again:
CALLOS mli_open, qt_open-myqcode+$1000
CALLOS_BRANCH_NEG qt_err
lda qt_ref-myqcode+$1000
sta qt_ref2-myqcode+$1000
CALLOS mli_read,qt_read-myqcode+$1000
CALLOS_BRANCH_NEG qt_err
CALLOS mli_close, qt_closeall-myqcode+$1000
jmp $2000
qt_err: jsr home
CALLOS mli_close, qt_closeall-myqcode+$1000
ldx #0
qtprob1:
lda qtprobmsg-myqcode+$1000,x
beq qtprobx
jsr cout
inx
bne qtprob1
qtprobx:
lda #$e
jsr qtone
lda #$0c
jsr qtone
lda #$e
jsr qtone
jsr rdkey
jsr home
jmp rtn_again-myqcode+$1000
qtprobmsg:
asc_hi "Unable to return to Davex"
.byte cr,cr
asc_hi "Hit a key to try again..."
.byte 0
qtone = *-myqcode+$1000
ldx #200
qton1: pha
jsr wait
lda spkr
pla
dex
bne qton1
rts
mypath_all:
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
.byte 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
qt_closeall:
.byte 1
.byte 0
qt_open:
.byte 3
.addr mypath_all-myqcode+$1000
.addr $800
qt_ref: .byte 0
qt_read:
.byte 4
qt_ref2:
.byte 0
.addr $2000
.addr $ffff
.addr 0
;
; copy_loader -- move real loader down to $1800
;
copy_loader:
ldx #0
copyl1: lda loader,x
sta $1800,x
dex
bne copyl1
rts
;
; LOADER -- code to run at $1800 to load and run a SYS file
;
loader:
CALLOS mli_read, loader_read-loader+$1800
CALLOS_BRANCH_NEG loader_err
CALLOS mli_close, loader_close-loader+$1800
CALLOS_BRANCH_NEG loader_err
; copy startup argument if present
ldy $1F80
beq ld_nostrarg
ld_copyarg:
lda $1F80,y
sta $2006,y
dey
cpy #<-1
bne ld_copyarg
ld_nostrarg:
jsr home
ldx #$f8
txs
jmp $2000
loader_err:
pha
jsr home
ldx #6
lderr1: lda lderrmsg-loader+$1800,x
jsr cout
dex
bpl lderr1
pla
jsr prbyte
lda reset+1
sta reset+2
jsr rdkey
CALLOS mli_bye, ldbye-loader+$1800
jmp ($fffc)
ldbye: .byte 4,0,0,0,0,0,0
lderrmsg:
asc "$ rorrE"
loader_read:
.byte 4
loadref2:
.byte 0
.addr $2000
.addr $ffff
.addr 0
loader_close:
.byte 1
loadref3:
.byte 0
;
; chk_argu -- scan for a string parameter
; (after a SYS file name); give error if there
; is no Startup buffer large enough, else
; return string at $1F80
;
chk_argu:
lda #>sysparms
ldy #<sysparms
sta cmd_ptr+1
sty cmd_ptr
jsr parse_parms
lda #0
jsr getparm_n
sta ptr+1
sty ptr
ldy #127
copyarg:
lda (ptr),y
sta $1F80,y
dey
bpl copyarg
lda $1F80
bne arg_given
rts
arg_given:
lda #>cmdpath
ldy #<cmdpath
jsr startup_size
cmp #0
beq null_buffer
tax
dex
cpx $1F80
bcc small_buffer
rts
small_buffer:
lda #der_smallsbf
bf_err: jmp ProDOS_err
null_buffer:
lda #der_nosbf
bne bf_err
sysparms:
cstr "x" ; dummy name
.addr 0 ; dummy entry point
.byte 0,t_string
.byte $80+'n',t_nil ; '-n' = don't replace the Quit code before launching SYS
.byte 0,0
;**************************************************
;
; run_external -- load a BIN or $2E;8001 file,
; parse its parameters, and run it
;
run_external:
lda #>cmdpath
ldy #<cmdpath
jsr startup_size
lda pagebuff
cmp #$60
bne notxtrn
lda #$ee
cmp pagebuff+1
bne notxtrn
cmp pagebuff+2
bne notxtrn
lda pagebuff+x_minver
cmp #myBakVer
bcc @davexTooOld
cmp #myversion
bne :+
lda pagebuff+x_minverMinor
and #$0f
cmp #AuxVersion
: beq ver_okay
bcc ver_okay
@davexTooOld:
message_cstr_cr "External cmd not compatible with this version of Davex."
jmp main_err
notxtrn:
lda #der_notxtn
bne der4
;
; version ok -- load external cmd
;
xtn_err:
jmp ProDOS_err
ver_okay:
lda pagebuff+x_loadadr+1
ldy pagebuff+x_loadadr
sta xtn_addr+1
sty xtn_addr
cmp #>copybuff
beq adr_err
bcs adr_ok
adr_err:
lda #der_adrlow
bne der4
adr_ok:
;
; check OK hardware
;
lda xc_req
eor #%11111111
and pagebuff+x_reqbits
beq reqs_ok
lda #der_badhware
der4:
xcerr: jmp ProDOS_err
reqs_ok:
;
; turn off 80col if necessary
;
bit pagebuff+x_reqbits
bpl keep80
lda scr_width
cmp #80
ror suspend80 ;set if was 80col
jsr off80
keep80:
jsr xtn_open
bcs xtn_err
jsr xtn_read
bcs xtn_err
lda xtn_ref
jsr close
clc
lda xtn_addr
adc #x_parmtbl
sta cmd_ptr
lda xtn_addr+1
adc #>x_parmtbl
sta cmd_ptr+1
lda pagebuff+x_goadr+1
ldy pagebuff+x_goadr
sta cmd_addr+1
sty cmd_addr
; tell mmgr about us
ldx #mli_write
lda xtn_addr+1
jsr mmgr
bcs xcerr
;;; clc
rts
xtn_open:
CALLOS mli_open, xtnop
rts
xtn_read:
lda xtn_ref
sta xtn_ref2
CALLOS mli_read, xtnrd
rts
;
xtnop: .byte 3
.addr cmdpath
.addr filebuff
xtn_ref:
.byte 0
xtnrd: .byte 4
xtn_ref2:
.byte 0
xtn_addr:
.byte 0,0
.addr highmem-copybuff ; amount to read
.addr 0