mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 22:43:15 -06:00
207 lines
3.6 KiB
Plaintext
207 lines
3.6 KiB
Plaintext
; 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
|
||
|