home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
ZSYS
/
SIMTEL20
/
ZCPR3
/
CMD.MAC
< prev
next >
Wrap
Text File
|
2000-06-30
|
5KB
|
267 lines
; PROGRAM: CMD
; VERSION: 1.0
; DATE: 19 July 84
; AUTHOR: Richard Conn
; PREVIOUS VERSIONS: None
;
z3env equ 0f400h
VERS EQU 10 ;version number
; CMD is copyright (c) 1984 by Richard Conn
; All Rights Reserved
; CMD may be used freely by the ZCPR3 Community
;
; CMD is used to define and run a command line. It either accepts
; the command line (including semicolons) which follow the verb CMD onto
; the command line buffer or, if no input is provided, it prompts the
; user for input and then places this into the command line buffer.
;
; Syntax:
; CMD cmd1;cmd2;...
; or CMD
;
; The sequence of commands "cmd1;cmd2;..." becomes the command line.
;
;
; SYSLIB, Z3LIB, and VLIB References
;
ext z3init
ext getcl1,getcl2,puter2,putzex,dutdir
ext eprint,pafdc,cout,bline
ext retud
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
;
; Check for Help or Prompt
;
lda fcb+1 ;check for help request
cpi ' ' ;prompted input?
jz prompt
cpi '/' ;help?
jnz cinit
;
; Print Help Message
;
help:
call eprint
db 'CMD, Version '
db (VERS/10)+'0','.',(VERS MOD 10)+'0'
db cr,lf,' Syntax: CMD cmd1;cmd2;... or CMD (prompted input)'
db cr,lf,' CMD defines the command line in the CL buffer'
db 0
ret
;
; Initialize Command Line
;
cinit:
call getcl1 ;check for command line buffer
jz nocl
;
; HL now points to the command line buffer
;
call codend ;pt to free area
inx h ;skip 2 bytes
inx h
xchg ;... in DE
lxi h,tbuff+2 ;pt to option input
call copystr ;copy string
mvi c,1 ;set not empty
;
; Entry point to build rest of command line, where DE=next address
; and C=empty line flag (C=0 means line was empty)
;
checkcl:
mov a,c ;get empty flag
call puter2 ;set error flag
call getcl2 ;get address of command line
jz setsh ;set shell command
call copystr ;copy string
setsh:
call getcl1 ;pt to command line buffer
xchg ;... in DE
lxi h,4 ;pt to first char position
dad d
shld lstart ;save start address in case of abort
xchg
mov m,e ;store pointer
inx h
mov m,d
inx h ;pt to buffer size
mov b,m ;get it in B
call codend ;pt to string
inx h ;skip 2 bytes
inx h
clcopy:
mov a,m ;get char
stax d ;put char
inx h ;pt to next
inx d
ora a ;done?
rz
dcr b ;count down
jnz clcopy
;
; Command Line Too Long
;
lhld lstart ;zero command line
mvi m,0
call eprint
db ' Command Line too Long for Buffer',0
ret
;
; Print no command line buffer message and exit
;
nocl:
call eprint
db ' No Command Line Buffer',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
;
; Prompt User for Input
;
prompt:
call eprint
db 'CMD ',0
call retud ;get DU
;
; Print DU
;
mov a,b ;output disk
adi 'A'
call cout
mov a,c ;output user
call pafdc
mvi a,':' ;separator
call cout
;
; Print DIR
;
call dutdir ;convert to name
jz prompt2 ;no name input
;
; DIR is defined
;
mvi b,8 ;8 chars max
prompt1:
mov a,m ;get char
cpi ' ' ;done if space
jz promptx
call cout ;echo it
inx h ;pt to next
dcr b ;count down
jnz prompt1
jmp promptx
;
; DIR is not defined
;
prompt2:
call eprint ;name not found
db 'Noname',0
;
; Complete prompt and get user input
;
promptx:
call eprint
db '> ',0
mvi a,1 ;tell ZEX that it is prompted
call putzex
call codend ;use buffer area
mvi m,254 ;set large line size
mvi a,0 ;no caps
call bline ;get input line
xra a ;no more prompt
call putzex
call codend ;skip to EOL
inx h
inx h
xchg ;ptr in DE
ldax d ;get first char
mov c,a ;save flag
;
; Skip to end of input line
;
findeol:
ldax d ;get char
ora a ;done?
jz checkcl
inx d ;pt to next
jmp findeol
;
; Buffers
;
lstart:
ds 2 ;start of command line
end