mirror of https://github.com/wwarthen/RomWBW.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
207 lines
3.6 KiB
207 lines
3.6 KiB
; PROGRAM: SHSET
|
|
; VERSION: 1.0
|
|
; DATE: 19 July 84
|
|
; AUTHOR: Richard Conn
|
|
; PREVIOUS VERSIONS: None
|
|
;
|
|
z3env equ 0f400h
|
|
VERS EQU 10 ;version number
|
|
|
|
; SHSET is copyright (c) 1984 by Richard Conn
|
|
; All Rights Reserved
|
|
; SHSET may be used freely by the ZCPR3 Community
|
|
|
|
;
|
|
; SHSET is used to establish a command line as a shell. It pushes
|
|
; the command line (including semicolons) which follow the verb SHSET onto
|
|
; the shell stack if it fits.
|
|
;
|
|
; Syntax:
|
|
; SHSET cmd1;cmd2;...
|
|
;
|
|
; The sequence of commands "cmd1;cmd2;..." becomes the shell.
|
|
;
|
|
|
|
;
|
|
; SYSLIB, Z3LIB, and VLIB References
|
|
;
|
|
ext z3init
|
|
ext shpush,getcl1,getcl2,putshm,getsh,getsh2
|
|
ext eprint,phlfdc
|
|
ext codend
|
|
|
|
;
|
|
; Basic Definitions
|
|
;
|
|
TRUE EQU 0FFH ;define true and..
|
|
FALSE EQU 0 ;..false.
|
|
|
|
;
|
|
; System Addresses
|
|
;
|
|
OS$BASE EQU 000H ;system base..
|
|
BDOS EQU OS$BASE+05H
|
|
FCB EQU OS$BASE+5CH
|
|
FCB2 EQU OS$BASE+6CH
|
|
TBUFF EQU OS$BASE+80H
|
|
TPA EQU OS$BASE+100H
|
|
|
|
;
|
|
; ASCII Chars
|
|
;
|
|
LF EQU 0AH ;..linefeed..
|
|
CR EQU 0DH ;..carriage return..
|
|
|
|
;
|
|
; Environment Definition
|
|
;
|
|
if z3env ne 0
|
|
;
|
|
; External ZCPR3 Environment Descriptor
|
|
;
|
|
jmp start
|
|
db 'Z3ENV' ;This is a ZCPR3 Utility
|
|
db 1 ;External Environment Descriptor
|
|
z3eadr:
|
|
dw z3env
|
|
start:
|
|
lhld z3eadr ;pt to ZCPR3 environment
|
|
;
|
|
else
|
|
;
|
|
; Internal ZCPR3 Environment Descriptor
|
|
;
|
|
MACLIB Z3BASE.LIB
|
|
MACLIB SYSENV.LIB
|
|
z3eadr:
|
|
jmp start
|
|
SYSENV
|
|
start:
|
|
lxi h,z3eadr ;pt to ZCPR3 environment
|
|
endif
|
|
|
|
;
|
|
; Mainline
|
|
;
|
|
call z3init ;initialize the ZCPR3 Env
|
|
|
|
;
|
|
; Print Prompt
|
|
;
|
|
call eprint
|
|
db 'SHSET, Version '
|
|
db (VERS/10)+'0','.',(VERS MOD 10)+'0'
|
|
db 0
|
|
lda fcb+1 ;check for help request
|
|
cpi '/' ;help?
|
|
jz help
|
|
cpi ' '
|
|
jnz shinit
|
|
;
|
|
; Print Help Message
|
|
;
|
|
help:
|
|
call eprint
|
|
db cr,lf,' Syntax: SHSET cmd1;cmd2;...'
|
|
db cr,lf,' SHSET defines the command sequence to be a shell'
|
|
db 0
|
|
ret
|
|
;
|
|
; Initialize Shell
|
|
;
|
|
shinit:
|
|
call shtest1 ;there must be a shell stack
|
|
call shtest2 ;there must be a command line buffer
|
|
;
|
|
; HL now points to the command line buffer
|
|
;
|
|
call codend ;pt to free area
|
|
xchg ;... in DE
|
|
lxi h,tbuff+1 ;pt to option input
|
|
mov a,m ;check for no input
|
|
ora a ;none if zero
|
|
jz checkcl
|
|
inx h ;pt to first good char
|
|
call copystr ;copy string
|
|
checkcl:
|
|
call getcl2 ;get address of command line
|
|
jz setsh ;set shell command
|
|
call copystr ;copy string
|
|
setsh:
|
|
call codend ;pt to string
|
|
call shpush ;push onto shell stack
|
|
jnz sherr ;error?
|
|
;
|
|
; Set Shell Messages
|
|
;
|
|
mvi a,0 ;Zero Message 0
|
|
mvi b,0
|
|
call putshm
|
|
;
|
|
mvi a,0 ;Zero Message 1
|
|
mvi b,1
|
|
call putshm
|
|
;
|
|
call eprint
|
|
db ' Shell Installed',0
|
|
;
|
|
exit:
|
|
call getcl2 ;terminate following command
|
|
mvi m,0 ;set ending 0
|
|
ret
|
|
;
|
|
; Error in Shell Stack Installation
|
|
;
|
|
sherr:
|
|
cpi 2 ;shell stack full
|
|
jnz sherr1
|
|
call eprint
|
|
db ' Shell Stack Full',0
|
|
jmp exit
|
|
sherr1:
|
|
call eprint
|
|
db ' Shell Entry too Large -- Limit is ',0
|
|
call getsh2 ;get limit in DE
|
|
xchg
|
|
call phlfdc ;print as floating decimal
|
|
call eprint
|
|
db ' Characters',0
|
|
jmp exit
|
|
|
|
;
|
|
; Check for Presence of Shell Stack
|
|
;
|
|
shtest1:
|
|
call getsh ;get shell stack data
|
|
rnz
|
|
pop psw ;clear stack
|
|
call eprint
|
|
db ' No Shell Stack',0
|
|
ret
|
|
|
|
;
|
|
; Check for Command Line
|
|
;
|
|
shtest2:
|
|
call getcl1 ;get command line data
|
|
rnz
|
|
pop psw ;clear stack
|
|
call eprint
|
|
db ' No Command Line',0
|
|
ret
|
|
|
|
;
|
|
; Copy string from HL to DE
|
|
; Store ending 0 and leave pointer in DE to it
|
|
;
|
|
copystr:
|
|
mov a,m ;get char
|
|
stax d ;store it
|
|
ora a ;done?
|
|
rz
|
|
inx h ;pt to next
|
|
inx d
|
|
jmp copystr
|
|
|
|
end
|
|
|