; ; Program: VALIAS1 ; Author: Jay Sage ; Version: 1.0 ; Date: 09 August 1985 ; Previous Versions: ALIAS1 V1.1 by Richard Conn ; version equ 10 ; ; The purpose of VALIAS1 is to load the Command Line Buffer with ; a command line stored within ALIAS1, extracting parameters using the ; SUBMIT file convention ($n) as they are referenced in the new command ; line. VALIAS1 differs from ALIAS1 in that it contains a flag that ; selects one of two modes. Normal mode is identical to ALIAS; the ; alias command line is substituted for the alias command, and any tail ; in the command line buffer is appended to it. In recursive mode, any ; tail in the command line is purged. This mode, as the name implies, ; is useful when an alias is going to call itself recursively, and the ; command tail could build up to the point of overflowing. ; ; The mode flag is placed just before the label START, where it can ; easily be found. It is preceeded by a byte of 'F' so that VALIAS0 can ; determine when it reads in an alias file whether the alias is of the new ; type or the old type. The character 'F' is unlikely to occur by ; accident in an internal environment descriptor. If the environment is ; external, then the byte before the flag would otherwise be the high byte ; of the address of the environment descriptor. This would not be likely ; to be as small as 46H (value of 'F'). ; ; Macros ; MACLIB Z3BASE.LIB ; ; Basic Equates ; tbuff equ 80h ; ; External References ; ext z3init,getefcb,getcl1,getenv,getfn2 ext eprint,codend,sksp,retud,caps EXT DONE,PARAML,PARAMU,NOPARAM,ONAME ; ; 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 db 'F' ;byte to identify VALIAS aliases rflag: db 0 ;0=normal alias / ff=recursive alias ;recursive alias clears old command line start: lhld z3eadr ;pt to ZCPR3 environment ; else *** ERROR *** file too long with internal environment endif ; ; Start of Program -- Initialize ZCPR3 Environment ; call z3init ;initialize the ZCPR3 Env and the VLIB Env jmp start1 ;skip command line buffer ; ; ALIAS ID at START+9 ; db 'Z3 ALIAS' ; ; Internal Command Line Buffer ; This buffer address can be determined from START+17, where the ; value of START is obtained from the 2nd and 3rd bytes of ALIAS1. ; clbuf: db 0 ;set to empty ds 255 ;allow 256 bytes ; ; Resume ALIAS1 ; start1: call codend ;pt to free space in which to build new line lxi d,clbuf ;pt to buffer xchg ;HL pts to target line, DE pts to buffer ; ; Process Next Char from Target Command Line ; nxtchar: mov a,m ;get next char ora a ;end of line? jz done cpi '$' ;possible passed parameter? jz param stax d ;store next char inx h ;pt to next inx d jmp nxtchar ; ; Process Possible Parameter ; param: lxi b,nxtchar ;establish return address push b ;... on stack inx h ;get parameter char mov a,m call caps ;capitalize cpi '*' ;entire tail? jz paraml cpi 'D' ;current disk? jz paramd cpi 'U' ;current user? jz paramu cpi 'F' ;System Filename.Typ? jz paramf cpi 'N' ;System Filename? jz paramn ; cpi 'T' ;System Typ? ; jz paramt sui '0' ;convert jc noparam cpi 10 ;range? jnc noparam ora a ;parameter 0 = original name jz oname mov b,a ;count in B (1 or more) inx h ;pt to next char push h ;save ptr lxi h,tbuff+1 ;pt to input line ; ; Advance to Desired Parameter ; param1: call sksp ;skip to non-blank mov a,m ;check for done ora a jz paramx dcr b ;count down jz param3 ;got it ; ; Skip Over This Parameter ; param2: mov a,m ;skip to space or EOL inx h ;pt to next cpi ' ' ;space jz param1 ora a ;EOL jz paramx jmp param2 ;continue ; ; Extract Parameter Into Target Buffer ; param3: mov a,m ;get char cpi ' '+1 ;done? jc paramx stax d ;store char inx h ;advance inx d jmp param3 ; ; Resume Processing of Target Command ; paramx: pop h ;restore ptr to next char ret ;resume at next char ; ; Parameter is for System Filename.typ ; paramf: call getfnum ;get file number rz ;resume if error push h ;save ptr to next char call ptfn ;set ptr to file name call putn ;put file name mvi a,'.' ;dot stax d inx d call putt ;put file type pop h ;restore ptr ret ; ; Parameter is for System Filename ; paramn: call getfnum ;get file number rz ;resume if error push h ;save ptr to next char call ptfn ;set ptr to file name call putn ;put file name pop h ;restore ptr ret ; ; Parameter is for System Typ ; ;paramt: ; call getfnum ;get file number ; jz nxtchar ;resume if error ; push h ;save ptr to next char ; call ptfn ;set ptr to file name ; mvi a,8 ;add 8 to get to file type ; add l ; mov l,a ; mov a,h ; aci 0 ; mov h,a ; call putt ;put file type ; pop h ;restore ptr ; jmp nxtchar ; ; Get File Number (1 to 4) ; If valid number, return with value in A and HL pting to next char ; If not valid, return with Z and HL pting to next char (the number) ; getfnum: inx h ;pt to number mov a,m ;get char sui '1' ;convert jc getfne ;error if less cpi 4 ;range? jnc getfne ;error if more inx h ;pt to next char ret ;NZ from CPI 4 getfne: xra a ;return Z ret ; ; Pt to File Name whose Number (1-4) is in A ; ptfn: mov b,a ;number in B call getfn2 ;pt to file name 2 push d ;save DE mov a,b ;file 0? ora a jz ptfnx lxi d,11 ;size of file name and type ptfn1: dad d ;pt to next dcr b ;count down jnz ptfn1 ptfnx: pop d ;restore DE ret ; ; Put File Name pted to by HL ; putn: mvi b,8 ;8 chars jmp putc ; ; Put File Type pted to by HL ; putt: mvi b,3 ;3 chars ; ; Copy chars from HL to DE for up to 8 bytes - flush if space ; putc: mov a,m ;get next char cpi ' ' ;skip spaces jz putc1 stax d ;put next char inx d ;pt to next putc1: inx h ;pt to next dcr b ;count down jnz putc ret ; ; Parameter is for Disk Letter ; paramd: call retud ;get mov a,b ;get disk letter adi 'A' ;convert to ASCII stax d ;store char inx d ;pt to next inx h ;pt to next char ret ; ; Parameter is for User Number ; paramu: call retud ;get DU in BC mov a,c ;get user number mvi b,10 ;compute 10's mvi c,'0' pmu1: sub b ;subtract 10's jc pmu2 inr c ;increment 10's jmp pmu1 pmu2: add b ;add B back in adi '0' ;convert to ASCII mov b,a ;10's in C, 1's in B mov a,c cpi '0' ;no leading 0's jz pmu3 stax d ;store char inx d ;pt to next pmu3: mov a,b ;get 1's stax d ;store char inx d ;pt to next inx h ;pt to next char ret ; ; Parameter is command line tail ; paraml: inx h ;pt to char after parameter letter push h ;save ptr to parameter lxi h,tbuff+1 ;pt to tail paramt1: mov a,m ;copy tail into line ora a ;end of tail? jz paramt2 stax d ;store char inx h ;pt to next inx d jmp paramt1 paramt2: pop h ;pt to next char in script ret ;continue processing ; ; Form assumed to be $$ ; noparam: mvi a,'$' ;store '$' stax d inx d ;pt to next chars inx h ret ; ; $0 - ALIAS Command Name ; oname: inx h ;pt to next char push h ;save ptr call getefcb ;pt to FCB jz paramx ;skip if no external FCB inx h ;pt to first char mvi b,8 ;at most 8 chars on1: mov a,m ;copy into output line cpi ' ' ;done if space jz paramx stax d ;store char inx h ;pt to next inx d dcr b ;count down jnz on1 jmp paramx ; ; Done -- Buffer is Loaded ; done: xra a ;store ending 0 stax d call codend ;pt to buffer mov a,m ;skip if empty line ora a rz ; ; Determine if ZCPR3 Environment Support is Available for Command Line ; push h ;save ptr to line call getenv ;get environment mov a,h ora l jz done0 ; ; Get environment from descriptor ; call getcl1 ;get command line data mov b,a ;save char count mov a,h ;check for no command line ora l jz done0 mov a,b ;restore char count ora a ;check for no chars jnz done1 ; ; Get environment from MACRO File ; done0: lxi h,z3cl ;pt to command line from macro expansion mvi a,z3cls ;get size of command line ; ; Store Command Line ; done1: pop d ;DE pts to line call putcl ;store in command line rnz ;return to ZCPR3 for processing if OK call eprint db 'Ovfl',0 ret ; ; PUTCL stores a command line in the ZCPR3 command line buffer. ; This command line is pted to by DE. CL Buffer is pted to by HL. ; Size in A. On return, A=0 and Zero ; Flag Set if command line overflow is possible (no change to command line). ; putcl: shld clbfr ;save ptr to command line buffer ora a ;any command line? jz nocl mov b,a ;char count in B xchg ;HL pts to new line push h ;save ptr to new line pcl2: mov a,m ;go to end of line ora a ;at end? jz pcl3 inx h ;pt to next dcr b ;count down jnz pcl2 pop h ;clear stack ; ; Command Line Buffer Overflow ; nocl: xra a ;error return ret ; ; At End of New Command Line (ptr on stack) ; Ptr to first char of new command line on stack ; HL pts to ending 0 of new command line ; B = number of chars remaining before overflow of Z3 command line ; pcl3: push h ;save ptr to last byte in case of error lhld clbfr ;pt to tail of command line mov e,m inx h mov d,m xchg ;HL pts to command line tail pop d ;restore ptr to last byte of command line push d mov a,m ;get first char of tail cpi ';' ;continuation? jz pcl4 ora a ;done? jz pcl4 mvi a,';' ;set continuation char stax d inx d dcr b ;count down jz pcl5 ;overflow ; ; Copy tail onto end of new command line ; pcl4: mov a,m ;get next char stax d ;store it inx h ;pt to next inx d ora a ;done? jz pcl6 dcr b ;count down jnz pcl4 ; ; Command Line too Long ; pcl5: pop h ;get ptr to end of old line mvi m,0 ;store ending 0 pop psw ;clear stack jmp nocl ; ; New Command Line OK ; pcl6: pop psw ;clear stack lhld clbfr ;pt to command line buffer lxi d,4 ;pt to first char in buffer xchg dad d xchg mov m,e ;store address inx h mov m,d ;DE pts to first char of buffer pop h ;HL pts to first char of new line ; ; Copy New Command Line into Buffer ; pcl7: mov a,m ;copy stax d inx h inx d ora a ;EOL? jnz pcl7 ; ; Exit with OK Code ; xra a ;set NZ dcr a ret ; ; Buffers ; clbfr: ds 2 ;ptr to command line end