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.
267 lines
4.8 KiB
267 lines
4.8 KiB
; 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
|
|
|