; ; Program: ALIAS0 ; Author: Richard Conn ; Version: 1.1 ; Date: 10 Jun 84 ; Previous Versions: 1.0 (5 Mar 84) ; version equ 11 ; ; The purpose of ALIAS0 is to create aliases using the ALIAS1 ; program. ; ; ; Environment Definition ; MACLIB Z3BASE.LIB ; ; Basic Equates ; buffer equ 4000h ;1K (approx) buffer tbuff equ 80h fcb equ 5ch cr equ 0dh lf equ 0ah ; ; External References ; ext $memry ext z3init,qprint,getwhl ext print,sksp,bbline,capine,crlf,pfn1,retud,logud,padc ext hmovb,sfa,cout,ccout,pstr,zfname ext f$open,f$read,f$close,f$make,f$delete,f$write,f$exist,initfcb ; ; Key Equates for Address Definition of Environment ; envdefn equ 103H ;Beginning of Environment Definition envclas equ 108H ;Address of Environment Descriptor Class ; ; 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 SYSENV.LIB z3eadr: jmp start SYSENV start: lxi h,z3eadr ;pt to ZCPR3 environment endif ; ; Start of Program -- Initialize ZCPR3 Environment ; call z3init ;initialize the ZCPR3 Env and the VLIB Env ; ; Print Banner ; call qprint db 'ALIAS, Version ' db (version/10)+'0','.',(version mod 10)+'0',0 ; ; Check for File ; xra a sta flflag ;clear file loaded flag lxi h,fcb+1 ;pt to file name mov a,m ;get first char cpi ' ' ;no name if space jz create ;create an alias if no name cpi '/' ;help? jnz start0 ; ; Help Message ; call print db cr,lf,'ALIAS -- Create Alias Commands' db cr,lf,'Syntax:' db cr,lf,' ALIAS <-- Define New Command' db cr,lf,'or' db cr,lf,' ALIAS dir:cmndname <-- Redefine Old Command' db 0 ret ; ; Load ALIAS File ; start0: call setcom ;set file type of file in FCB to COM if not already call retud ;get current DU in BC dcx h ;pt to disk mov a,m ;get disk ora a ;no current disk? jz start1 ;use current disk dcr a ;set disk (A=0) mov b,a start1: mvi m,0 ;set current disk lxi d,13 ;pt to user number push h ;save ptr to FCB dad d ;pt to user mov c,m ;get user pop d ;pt to FCB call logud ;log into dir in BC lxi h,buffer ;pt to file storage buffer call f$open ;open alias file for input jz load ;load file call print db cr,lf,' Alias File ',0 inx d ;pt to file name call pfn1 ;print it call print db ' Not Found',0 ret ; ; Load Alias File ; load: lxi h,buffer ;pt to load buffer mvi c,9 ;set block count load1: lxi d,fcb ;pt to FCB call f$read ;read next block jnz load2 lxi d,tbuff ;pt to buffer xchg mvi b,128 ;128 bytes call hmovb xchg ;DE pts to next block dcr c ;count down jnz load1 ; ; Error - Not an Alias File ; noalias: call print db cr,lf,' File ',0 lxi d,fcb+1 call pfn1 call print db ' is Not an Alias',0 ret ; ; Load Complete - Check for Alias File Structure ; load2: call f$close ;close input file lhld buffer+1 ;get address of START lxi d,buffer-100H dad d ;pt to actual address lxi d,9 ;skip to ALIAS ID dad d lxi d,aliasid ;compare mvi b,8 ;8 chars acheck: ldax d ;get char cmp m ;compare jnz noalias inx h ;pt to next inx d dcr b ;count down jnz acheck shld oldaline ;save ptr to old alias command line mvi a,0ffh ;set file loaded flag sta flflag ; ; Create New Alias ; create: lda flflag ;check for file loaded ora a ;0 if not jz cr1 ; ; Display Data on Old Alias ; call print db cr,lf,' Alias Name: ',0 lxi h,fcb+1 ;pt to name mvi b,8 ;8 chars cr0: mov a,m ;print name call cout inx h ;pt to next char dcr b ;count down jnz cr0 call print db cr,lf,' Old Alias Command Line:',0 lhld oldaline mvi b,1 ;set line count cr0a: mov a,m ;check for done ora a jz cr1 call crlf ;new line mov a,b ;print line number call padc inr b ;increment count call print ;print prompt db ' --> ',0 cr0b: mov a,m ;get char ora a jz cr1 call ccout ;print char with control char processing inx h ;pt to next cpi ';' ;next logical line? jz cr0a jmp cr0b ; ; Input Alias Command from User ; cr1: call getwhl ;get wheel byte jnz cr1a call print db cr,lf,' Modification of Alias Not Permitted',0 ret ; ; Input Alias from User ; cr1a: call print db cr,lf db cr,lf,' Input Alias (RETURN to Abort)',cr,lf,' --> ',0 mvi a,0ffh ;input line from user call bbline call sksp ;skip to non-blank mov a,m ;get char ora a ;any input? rz push h ;save ptr ; ; Set Buffers in New Alias to Reflect the ALIAS0 Buffers ; call codend ;pt to new alias inx h ;pt to start of buffers inx h inx h lxi d,envdefn ;pt to environment definition mvi b,8 ;prepare to copy 8 bytes for class 1 ; bytes are: DB 'Z3ENV',1 ; DW envaddr lda envclas ;get code for class of alias cpi 1 ;class 1 is address of Env Desc only jz cr1b mvi b,100H-3 ;prepare to copy an entire env desc ; ; Copy the Buffers Over ; cr1b: ldax d ;copy environment definition into new alias mov m,a inx h ;advance inx d dcr b ;count down jnz cr1b ; ; Prep to Copy New Command Into Alias ; call codend ;pt to new alias command buffer inx h mov e,m ;get address of START inx h mov d,m lxi h,17 ;pt to buffer at START+17 dad d lxi d,-100H ;compute offset dad d ;HL contains offset xchg call codend dad d ;HL pts to absolute address mvi b,255 ;check for overflow (max number of chars) pop d ;pt to new command ; ; Copy New Command into ALIAS File ; cr2: ldax d ;get char mov m,a ;put char ora a ;done? jz cr3 inx h ;pt to next inx d dcr b ;count down jnz cr2 call print db cr,lf,' Command Too Long for Buffer - Reenter',0 jmp create ; ; ALIAS Command Line Copied ; cr3: lda flflag ;file loaded? ora a ;0=no jnz write call print db cr,lf,' Name of ALIAS Command (RETURN to Abort)? ',0 mvi a,0ffh ;capitalize call bbline call sksp ;skip to non-blank mov a,m ora a jz create lxi d,fcb ;pt to FCB call zfname ;convert and place in FCB call setcom ;set file type to COM if not already call retud ;get current DU lda fcb ;get disk ora a ;default? jz cr4 dcr a ;disk A = 0 mov b,a cr4: lda fcb+13 ;get user mov c,a call logud ; ; Write File whose Name is in FCB ; write: lxi d,fcb ;check for file call initfcb ;clear FCB call f$exist ;check for existence jz write1 call print db cr,lf,' File ',0 lxi d,fcb+1 call pfn1 call print db ' Exists - Overwrite (Y/N)? ',0 call capine call crlf cpi 'Y' rnz ;abort if not Y lxi d,fcb ;clear file attributes xra a call sfa ;set file attributes to R/W DIR call f$delete ;delete file ; ; Create New File ; write1: lxi d,fcb ;pt to FCB call initfcb ;init it call f$make ;create file mvi c,8 ;8 sectors call codend ;pt to file write2: lxi d,tbuff ;copy sector into buffer mvi b,128 ;128 bytes call hmovb lxi d,fcb ;write block call f$write jnz werr dcr c ;count down jnz write2 call f$close ;close file call print db cr,lf,' Alias Created',0 ret werr: call print db cr,lf,' Error in Creating File',0 ret ; ; Determine End of Code to Nearest 128 bytes ; codend: push d lhld $memry ;get next available byte mov a,l ;get low ani 80h ;set MSB mov l,a lxi d,128 ;next 128 bytes dad d pop d ret ; ; Set File Type of File in FCB to COM if Not Already Set ; setcom: lda fcb+9 ;get first char of file type cpi ' ' rnz push h push d push b lxi h,comtyp ;set COM type lxi d,fcb+9 ;copy into file type mvi b,3 ;3 bytes call hmovb pop b pop d pop h ret ; ; Buffers ; comtyp: db 'COM' ;COM File Type aliasid: db 'Z3 ALIAS' ;ALIAS File ID flflag: ds 1 ;file loaded flag oldaline: ds 2 ;ptr to old alias line end