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