Files
RomWBW/Source/Images/d_bp/u15/CMD.MAC
2020-01-03 20:42:06 -08:00

267 lines
4.8 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
; 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