home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Transactor
/
Transactor_27_1988_Transactor_Publishing.d64
/
shellram.sda
/
SRCHCMD.A
< prev
next >
Wrap
Text File
|
2023-02-26
|
9KB
|
633 lines
;
; shellram
;
; By: Adrian Pepper
; Toronto, Ontario
;
; based on, but heavily modified from
; the Pro-Line/Spinnaker
; C POWER/POWER C shell for the
; Commodore 64 home computer.
;
; The shell was modified to reduce
; the size of the code, and arrange
; things so memory page 22 (hex $16)
; will be free for use as a "RAMdisk
; Interface Page", for use with the
; Commodore 1764 256K RAM expander
; for the Commodore 64
;
; This (basically) allows all programs
; designed to run under the shell to
; operate with the RAM disk
;
;
; srchcmd.a - routines for searching
; for and executing built-in commands
;
; srchcmd - look for a built-in command
; execute if found
;
;
; colcmd - set to zero to remove 'col'
; screen colour command; this also
; moves cmdlbuf from the cassette
; buffer, where problems may occur
; (but never have for me) to space
; inside the shell program itself
;
colcmd=1 ; 0 means no col command
;
;
; standard constants; many should become
; external absolute or relative definitions
;
.ref sysdev
.ref sysdrv
.ref wrkdev
.ref wrkdrv
;
; kernal routines, etc
;
.ref readst
.ref close
.ref chkin
.ref chkout
.ref clrchn
.ref chrin
;
.ref nmivec
shftflg=$028d
;
;
.def srchcmd
;
.ref opnwrk
.ref kwrkfil
.ref ksysfil
.ref argv
;
.ref strload
.ref strapnd
.ref streq
.ref strfopn
.ref opnsys
.ref strechn
.ref strbout
;
.ref savnmi
.ref strout
.ref outln
.ref outchr
.ref doload
.ref clrstdo
.ref filcls
;
.ref getnum
;
; srchcmd - looks for built-in command
; executes, and returns with clc if found
; sec means command is not built-in
;
; note: clc returned even if built-in
; gets errors
;
srchcmd ldx #<cmdlbuf
ldy #>cmdlbuf
jsr strload
lda #$00
sta $59
ldx #<cmdtbl
ldy #>cmdtbl
t1180b jsr streq
beq jmpcmd
ldy #0
lda ($57),y
bne t1190f
sec ;; indicate built-in not found
rts ;; and return
t1190f inc $59
ldy $58
lda $57
clc
adc #5
tax
bcc t1180b
iny
bne t1180b
;
jmpcmd lda $59
asl a
tax
lda rtntbl+1,x
pha ; push pch for rts
lda rtntbl,x
pha ; push pcl for rts
rts ; indirect jump (to table entry, +1)
;
;
tobye jsr filcls
lda savnmi
sta nmivec
lda savnmi+1
sta nmivec+1
jmp $fce2 ;; never to return to C shell
;
toload lda $29
cmp #$02
bne t1210f
ldx argv+2
ldy argv+3
jsr doload
clc
rts
t1210f jmp argcnt
;
;
;
;
cmdtbl .byte 'b,'y,'e,0,0
.byte 'l,'o,'a,'d,0
.byte 'l,'s,0,0,0
.byte 'l,0,0,0,0
.byte 'r,'m,0,0,0
.byte 'm,'v,0,0,0
.byte 'p,'r,0,0,0
.byte 'd,'i,'s,'k,0
.byte 'w,'o,'r,'k,0
.byte 's,'y,'s,0,0
.ifne colcmd,0
.byte 'c,'o,'l,0,0
.fi
.byte 0
;
rtntbl .word tobye-1 ; 0 bye
.word toload-1 ; 1 bye
.word tols-1 ; 2 ls
.word tol-1 ; 3 l
.word dorm-1 ; 4 rm
.word domv-1 ; 5 mv
.word dopr-1 ; 6 pr
.word dodisk-1 ; 7 disk
.word dowork-1 ; 8 work
.word dosys-1 ; 9 sys
.ifne colcmd,0
.word docol-1 ; 10 col
.fi
;
;
;
sdollar .byte "$0:"
.byte 0
sstar .byte "*"
.byte 0
;
tols ldx sysdev
ldy sysdrv
jmp dol
tol ldx wrkdev
ldy wrkdrv
; fall through to dol
dol txa
pha
tya
clc
adc #'0
sta sdollar+1
ldx #<sdollar
ldy #>sdollar
jsr strload
lda $29
cmp #$02
bne t1260f
ldx argv+2
ldy argv+3
jsr strapnd
jmp t1280f
t1260f cmp #$01
beq t1270f
pla
jmp argcnt ;; and return
t1270f ldx #<sstar
ldy #>sstar
jsr strapnd
t1280f pla
tax
lda #$04
ldy #0
jsr strfopn
bcc t1300f
jsr strbout
clc
rts ; error return
;
t1300f jsr clrstdo
ldx #4
jsr chkin
jsr chrin
jsr chrin
lda #$0d
jsr outchr
lda #0
sta oreadst
t1310b jsr chrrdst
bcs dirend
jsr chrrdst
bcs dirend
jsr chrrdst
bcs dirend
pha
jsr chrrdst
tay
pla
tax
jsr dolsubr
ldx #0
t1320b lda dolsbuf,x
cmp #$20
beq t1330f
jsr outchr
inx
cpx #3
bne t1320b
t1330f lda #$20
jsr outchr
t1340b jsr chrrdst
bcs dirend
cmp #0
beq t1350f
jsr outchr
jmp t1340b
t1350f lda #$0d
jsr outchr
t1360f lda $cb
eor #$40
ora shftflg
bne t1360f
jmp t1310b
dirend lda #$0d
jsr outchr
clc
rts
;
dolsubr stx vdola
sty vdolb
ldx #3
lda #$20
t1370b sta dolsbuf,x
dex
bpl t1370b
ldx #0
ldy #3
t1380b lda #0
sta vdold
t1390b sec
lda vdola
sbc doltbl1,y
sta vdolc
lda vdolb
sbc doltbl2,y
bcc t1400f
sta vdolb
lda vdolc
sta vdola
inc vdold
bne t1390b
t1400f lda vdold
bne t1410f
cpx #0
beq t1420f
t1410f clc
adc #$30
sta dolsbuf,x
inx
t1420f dey
bpl t1380b
txa
bne t1430f
lda #$30
sta dolsbuf
t1430f rts
;
doltbl1 .byte $01,$0a,$64,$e8
doltbl2 .byte $00,$00,$00,$03
.def vdolc ; not clear why shellmain needs this
vdola .byte $00
vdolb .byte $00
vdolc .byte $00
vdold .byte $00
dolsbuf .byte $00
.byte $00
.byte $00
.byte $00
;
chrrdst lda oreadst
cmp #0
beq t1440f
sec
rts
t1440f jsr chrin
pha
jsr readst
sta oreadst
pla
clc
rts
oreadst .bss 1
;
; dodisk - do user specified "disk" command
;
dodisk lda $29
cmp #$02
beq t1450f
jmp argcnt
t1450f ldx argv+2
ldy argv+3
jsr strload
; jmp sndwrk ;; and return clc
;
; sndwrk - send string in (x,y) to work device
;
sndwrk ldx #<snewlin
ldy #>snewlin
jsr strapnd
ldx #<kwrkfil
jsr chkout
jsr strbout ;; send to work command channel
jsr clrchn
ldx wrkdev
jsr strechn
bcc t1460f
jsr strbout
t1460f clc ;; always return clc
rts
;
; rm - remove (delete) a file
;
sszero .byte "s0:"
.byte 0
dorm lda $29
cmp #2
beq t1480f
jmp argcnt
t1480f clc
lda wrkdrv
adc #$30
sta sszero+1
ldx #<sszero
ldy #>sszero
jsr strload
ldx argv+2
ldy argv+3
jsr strapnd
jmp sndwrk ;; and return clc
;
;
; mv - move (rename) a file
;
srzero .byte "r0:"
.byte 0
seqzero .byte "=0:"
.byte 0
domv lda $29
cmp #$03
beq t1520f
jmp argcnt
t1520f clc
lda wrkdrv
adc #'0
sta srzero+1
sta seqzero+1
ldx #<srzero
ldy #>srzero
jsr strload
ldx argv+4
ldy argv+5
jsr strapnd
ldx #<seqzero
ldy #>seqzero
jsr strapnd
ldx argv+2
ldy argv+3
jsr strapnd
jmp sndwrk ;; and return clc
;
dopr lda $29
cmp #$02
beq t1580f
jmp argcnt
t1580f ldx argv+2
ldy argv+3
jsr strload
lda #4
ldx wrkdev
tay
jsr strfopn
bcc t1610f
jsr strbout
clc
rts ; error return
t1610f jsr clrstdo
ldx #4
jsr chkin
t1630b jsr chrin
tax
jsr readst
pha
txa
jsr outchr
pla
beq t1630b
jsr outln
clc
rts
;
;
dowork ldx wrkdev
ldy wrkdrv
jsr dows
bcs t1635f
stx wrkdev ; store if successful new device/drive
sty wrkdrv
lda #<kwrkfil
jsr close
jsr opnwrk
t1635f clc
rts
;
dosys ldx sysdev
ldy sysdrv
jsr dows
bcs t1636f
stx sysdev ; store if successful new device/drive
sty sysdrv
t1636f clc
rts
;
;
; dows - do work and sys commands
;
dows lda $29
cmp #$01
beq shdrvdv ; show, return with set carry
t1640f cmp #3
beq gdevdrv ; returns (with sec
;; only if device/drive is bad)
jsr argcnt
sec ;; don't save x,y as device/drive
rts
;
;
;
shdrvdv lda #$20
sta devnum+1
txa
ldx #0
cmp #10
bcc t1710f
pha
lda #$31
sta devnum
pla
sec
sbc #10
inx
t1710f clc
adc #'0
sta devnum,x
clc
tya
adc #'0
sta drvnum
ldx #<drvdvbf
ldy #>drvdvbf
jsr strout
sec
rts
;
gdevdrv lda argv+2
sta $2a
lda argv+3
sta $2b
ldx #0
ldy #0
lda ($2a),y
cmp #$31
bne t1720f
ldx #$0a
iny
lda ($2a),y
bne t1720f
jmp drvnotp
t1720f txa
clc
adc ($2a),y
sec
sbc #'0
sta devnum
iny
lda ($2a),y
beq t1730f
jmp drvnotp
t1730f lda argv+4
sta $2a
lda argv+5
sta $2b
ldy #0
lda ($2a),y
cmp #$30
bcc t1740f
cmp #$32
bcs t1740f
tax
iny
lda ($2a),y
beq t1750f
t1740f jmp drvnotp
t1750f txa
sec
sbc #'0
sta drvnum
ldx devnum
jsr opnsys
bcs drvnotp
ldx devnum
ldy drvnum
rts
;
drvdvbf .byte "device: "
devnum .byte $00
devnum1 .byte $00
.byte " drive: "
drvnum .byte $00,$0d,$0d,0
;
;
drvnotp ldx #<sdrvnp
ldy #>sdrvnp
jsr strout
sec
rts
sdrvnp .byte "drive not present"
snewlin .byte $0d,0
;
;
.ifne colcmd,0
;
;
; docol - set char, bkg, status, border colours
;
docol lda $29
cmp #6
bcc t1800f
jmp argcnt
t1800f asl a
sta $29
ldx #0
beq t1830f
t1810b stx savx
ldy argv+1,x
lda argv,x
tax
jsr getnum
ldx savx
ldy coltbl-2,x
sty $2a
ldy coltbl-2+1,x
sty $2b
ldy #0
sta ($2a),y
ldx savx
t1830f inx
inx
cpx $29
bcc t1810b
clc
rts
;
savx .bss 1
coltbl .word $0286 ; char (foreground) colour
.word $d021 ; background colour 1
.word dummy ; dummy, for status line
.word $d020 ; border colour
dummy .bss 1
;
.fi
;
argcnt ldx #<swrnarg
ldy #>swrnarg
jsr strout
clc ;; successfully found built-in
rts ;; even though IT had error
swrnarg .byte "wrong number of arguments"
.byte $0d,$0d,0
;
.ifne colcmd,0
;
.def cmdlbuf ; where command line read into
cmdlbuf=$03fb-81 ; put command line in cassette buffer
.else
;
cmdlbuf .dseg 81 ; put cmdlbuf in shell data space
; don't implement col command
.fi