; ; Program: LD ; Author: Richard Conn ; Version: 1.1 ; Date: 6 Jan 83 ; Previous Versions: 1.0 (6 Dec 82) ; ; LD Loads the named Directory file (LD=Load Directory) NAMES.DIR or ; that file specified in the command line into the memory-resident directory ; buffer. It also has the capability of displaying the contents of this ; buffer to the user. Forms of this command are: ; ; LD <-- Display Loaded Directory ; LD filename <-- Load Directory filename.DIR ; LD filename.typ <-- Load Directory filename.typ ; LD // <-- Ask for Help ; vers equ 11 ; ; This program is Copyright (c) 1982, 1983 by Richard Conn ; All Rights Reserved ; ; ZCPR2 and its utilities, including this one, are released ; to the public domain. Anyone who wishes to USE them may do so with ; no strings attached. The author assumes no responsibility or ; liability for the use of ZCPR2 and its utilities. ; ; The author, Richard Conn, has sole rights to this program. ; ZCPR2 and its utilities may not be sold without the express, ; written permission of the author. ; ; ; Constants ; cr equ 0dh lf equ 0ah tfcb equ 5ch ; ZCPR2 FCB ; ; Externals ; ext zgpins ; installation program ext zfninit ; reinit NAMES.DIR ext zdname ; load names into buffer ext codend ; end of code ext moveb ; move routine ext print ; print routine ext padc ; print A as decimal chars ext cout ; output char ext crlf ; new line ext retud ; return current user/disk ; ; Branch to Start of Program ; jmp start ; ;****************************************************************** ; ; SINSFORM -- ZCPR2 Utility Standard General Purpose Initialization Format ; ; This data block precisely defines the data format for ; initial features of a ZCPR2 system which are required for proper ; initialization of the ZCPR2-Specific Routines in SYSLIB. ; ; ; EXTERNAL PATH DATA ; EPAVAIL: DB 0FFH ; IS EXTERNAL PATH AVAILABLE? (0=NO, 0FFH=YES) EPADR: DW 40H ; ADDRESS OF EXTERNAL PATH IF AVAILABLE ; ; INTERNAL PATH DATA ; INTPATH: DB 0,0 ; DISK, USER FOR FIRST PATH ELEMENT ; DISK = 1 FOR A, '$' FOR CURRENT ; USER = NUMBER, '$' FOR CURRENT DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 DB 0,0 ; DISK, USER FOR 8TH PATH ELEMENT DB 0 ; END OF PATH ; ; MULTIPLE COMMAND LINE BUFFER DATA ; MCAVAIL: DB 0FFH ; IS MULTIPLE COMMAND LINE BUFFER AVAILABLE? MCADR: DW 0FF00H ; ADDRESS OF MULTIPLE COMMAND LINE BUFFER IF AVAILABLE ; ; DISK/USER LIMITS ; MDISK: DB 4 ; MAXIMUM NUMBER OF DISKS MUSER: DB 31 ; MAXIMUM USER NUMBER ; ; FLAGS TO PERMIT LOG IN FOR DIFFERENT USER AREA OR DISK ; DOK: DB 0FFH ; ALLOW DISK CHANGE? (0=NO, 0FFH=YES) UOK: DB 0FFH ; ALLOW USER CHANGE? (0=NO, 0FFH=YES) ; ; PRIVILEGED USER DATA ; PUSER: DB 10 ; BEGINNING OF PRIVILEGED USER AREAS PPASS: DB 'chdir',0 ; PASSWORD FOR MOVING INTO PRIV USER AREAS DS 41-($-PPASS) ; 40 CHARS MAX IN BUFFER + 1 for ending NULL ; ; CURRENT USER/DISK INDICATOR ; CINDIC: DB '$' ; USUAL VALUE (FOR PATH EXPRESSIONS) ; ; DMA ADDRESS FOR DISK TRANSFERS ; DMADR: DW 80H ; TBUFF AREA ; ; NAMED DIRECTORY INFORMATION ; NDRADR: DW 00000H ; ADDRESS OF MEMORY-RESIDENT NAMED DIRECTORY NDNAMES: DB 64 ; MAX NUMBER OF DIRECTORY NAMES DNFILE: DB 'NAMES ' ; NAME OF DISK NAME FILE DB 'DIR' ; TYPE OF DISK NAME FILE ; ; REQUIREMENTS FLAGS ; EPREQD: DB 0FFH ; EXTERNAL PATH? MCREQD: DB 000H ; MULTIPLE COMMAND LINE? MXREQD: DB 0FFH ; MAX USER/DISK? UDREQD: DB 000H ; ALLOW USER/DISK CHANGE? PUREQD: DB 000H ; PRIVILEGED USER? CDREQD: DB 000H ; CURRENT INDIC AND DMA? NDREQD: DB 0FFH ; NAMED DIRECTORIES? Z2CLASS: DB 0 ; CLASS 0 DB 'ZCPR2' DS 10 ; RESERVED ; ; END OF SINSFORM -- STANDARD DEFAULT PARAMETER DATA ; ;****************************************************************** ; ; ; Start of Program ; start: call zgpins ; init ZCPR2 routines call retud ; get current user number mov a,b ; save current disk number away sta cdisk mov a,c ; save current user number away sta cuser call print db 'LD Version ' db (vers/10)+'0','.',(vers mod 10)+'0',0 lhld ndradr ; check for facility support in the first place mov a,h ora l ; HL=0 if no facilities for mem-based named dirs jnz start0 call print db cr,lf,'Memory-Based Named Directories Not Supported' db cr,lf,'on this System -- Aborting',0 ret start0: lxi h,tfcb+1 ; pt to first byte of file name mov a,m ; get it cpi ' ' ; display loaded directory if no file name given jz ldisp cpi '/' ; option? jnz start1 ; load directory if file specified call print db cr,lf,' LD is the Load Directory program for ZCPR2.' db cr,lf,'The functions of LD are to load the memory-resident' db cr,lf,'named directory buffer from the specified or implied' db cr,lf,'disk file and to display the contents of the named' db cr,lf,'directory buffer.' db cr,lf db cr,lf,' The forms of the LD command are --',cr,lf db cr,lf,' LD <-- Display Loaded Directory' db cr,lf,' LD filename <-- Load filename.DIR' db cr,lf,' LD filename.typ <-- Load filename.typ' db cr,lf,' LD // <-- Print this Help Message' db cr,lf,0 ret ; ; Process Load Function ; start1: lxi d,8 ; pt to file type dad d mov a,m ; get first char of file type cpi ' ' ; any file type? jnz setname ; yes, so user file given totally lxi d,dirtyp ; set file type to DIR xchg ; copy type into TFCB mvi b,3 ; 3 bytes call moveb setname: lxi d,tfcb ; pt to FCB mvi a,80h ; only set FCB call zfninit ; set new NAMES.DIR file call codend ; get end of code call zdname ; load NAMES.DIR file (or user file) jz loaderr ; load error lhld ndradr ; pt to named directory buffer mov a,m ; get limit cmp c ; within range? jnc load1 call print db cr,lf,'Load Error -- Not Enough Room in Memory Buffer' db cr,lf,'for Directory Names -- Aborting',0 ret loaderr: call print db cr,lf,'Load Error -- File Not Found -- Aborting',0 ret load1: inx h ; pt to dir size mov m,c ; set dir size inx h ; pt to first byte of first entry xchg ; ... in DE call codend ; pt to first loaded byte in HL load2: mvi b,10 ; 10 bytes/entry load3: mov a,m ; get byte stax d ; put byte inx h ; pt to next inx d dcr b ; count down jnz load3 dcr c ; count down entries jnz load2 call print db cr,lf,'Load Complete',0 ret ; ; Display Contents of Loaded Directory ; ldisp: lhld ndradr ; get address call print db cr,lf,'**********************************************' db cr,lf,'** Memory-Based Named Directory Definitions **' db cr,lf,'** Number of Entries Permitted: ',0 mov a,m ; get count call padc ; print as decimal call print db ' **' db cr,lf,'** Number of Entries Loaded: ',0 inx h ; pt to count mov a,m ; get count call padc call print db ' **' db cr,lf,'**********************************************',0 ora a ; any entries? jnz ldisp0 call print db cr,lf,' -- No Named Directories Loaded --',0 ret ldisp0: call print db cr,lf,' -- Named Directory Display --',0 inx h ; pt to first entry mov b,a ; count in B mvi c,0ffh ; set current disk indicator to nothing mvi d,0 ; set entry counter ldisp1: mov a,m ; get next disk cmp c ; same as current indicator? jz ldisp2 ; process if same mov c,a ; set new disk call crlf ; new line adi 'A' ; convert to letter call cout call print db ' --',0 mvi d,0ffh ; set for increment to zero ldisp2: inx h ; pt to user number lda puser ; get priv user number dcr a ; back up to last non-priv number cmp m ; compare to entry jnc ldisp3 ; go ahead and display if non-priv number push b ; save BC lda cuser ; get current user mov b,a ; ... in B lda puser ; check for privileged user dcr a ; set top of non-priv users cmp b ; privileged? pop b ; restore BC jc ldisp3 ; privileged mov a,l ; pt to next entry adi 9 ; 9 bytes to next entry mov l,a mov a,h aci 0 mov h,a jmp ldisp5 ldisp3: inr d ; increment entry counter mov a,d ; get count ani 3 ; check for 4th cz crlf mov a,m ; get user number call padc ; print user number as decimal chars mvi a,':' ; print colon call cout mvi a,' ' ; print space call cout inx h ; pt to first char of name mvi e,8 ; print 8-char name ldisp4: mov a,m ; get char of dir name call cout inx h ; pt to next dcr e ; count down jnz ldisp4 ldisp5: dcr b ; count down jnz ldisp1 call print db cr,lf,cr,lf,'** Current Directory **',cr,lf,' ',0 lhld ndradr ; get address of buffer inx h ; pt to entry count mov b,m ; get entry count inx h ; pt to first entry cdisp: mov c,m ; get next disk number inx h ; pt to user number lda cdisk ; compare to current disk cmp c jnz cdisp2 ; skip if no match lda cuser ; compare current user cmp m ; to user pted to jnz cdisp2 ; skip if no match inx h ; we have found it, so pt to first char lda cdisk ; print current disk letter adi 'A' call cout lda cuser ; print current user number call padc mvi a,':' ; print separator call cout mvi a,' ' call cout mvi b,8 ; print 8 chars cdisp1: mov a,m ; get char call cout ; print char inx h ; pt to next dcr b ; count down jnz cdisp1 ret cdisp2: lxi d,9 ; skip to next entry dad d dcr b ; count down jnz cdisp call print db 'Not Named in Directory Buffer',0 ret ; ; Buffers ; cdisk: ds 1 ; current disk number cuser: ds 1 ; current user number dirtyp: db 'DIR' ; type of Directory file end