home *** CD-ROM | disk | FTP | other *** search
- ; 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