home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
CPM
/
ZCPR2
/
PWD.MAC
< prev
next >
Wrap
Text File
|
2000-06-30
|
11KB
|
527 lines
;
; Program: PWD
; Version: 1.1
; Author: Richard Conn
; Date: 6 Jan 83
; Previous Versions: 1.0 (7 Dec 82)
; Derivation: PWD.MAC was derived in concept from CD.MAC, Version 2.1
;
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.
;
;
; PWD is designed to allow the user to print his working directory
; (PWD=Print Working Directory) and to find out what directories
; are available to him to move to.
; Intended to be small in size, PWD accepts a command of the
; following forms:
;
; PWD <-- Print Current Info
; PWD DIR <-- Print Directory Info
; PWD // <-- Print Help Message
;
;
; CP/M Constants
;
cpm equ 0 ; Warm Boot Address
entry equ cpm+5 ; BDOS Entry Point
fcb equ 5ch ; Location of Default FCB
tbuff equ 80h ; Temporary Input Line Buffer
cr equ 0dh
lf equ 0ah
;
; Externals
;
ext cline ; save current line as string
ext zgpins ; init ZCPR2 buffers
ext zdnfind ; used to determine directory user/disk
ext retud ; return current user/disk
ext print ; print routine
ext zdname ; load directory names
ext cout ; char output
ext codend ; end of code
ext padc ; print A as decimal
ext madc ; print A in memory
ext crlf ; new line
ext cin ; char input
;
; 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 0FFH ; MULTIPLE COMMAND LINE?
MXREQD:
DB 0FFH ; MAX USER/DISK?
UDREQD:
DB 0FFH ; ALLOW USER/DISK CHANGE?
PUREQD:
DB 0FFH ; PRIVILEGED USER?
CDREQD:
DB 0FFH ; 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 ; install ZCPR2 variables
call print ; print banner
db 'PWD, Version '
db vers/10+'0','.',(vers mod 10)+'0',0
lxi h,0 ; set no loaded directory file
shld ndfadr
xra a ; set zero count
sta ndfcnt
lxi h,tbuff ; pt to input line
call cline ; save and buffer input line
;
; Skip to first non-blank and process if Help requested
;
sblank:
mov a,m ; pt to char
inx h ; pt to next
cpi ' ' ; <sp>?
jz sblank
dcx h ; pt to first non-blank
ora a ; print directory info?
jz cwd
cpi 'D' ; dir option?
jz pwd
;
; Print Help Message
;
call print
db cr,lf,' PWD is a ZCPR2 named directory display utility'
db cr,lf,'(PWD=Print Working Directory). Command Forms are:'
db cr,lf,' PWD <-- Print Current Info'
db cr,lf,' PWD DIR <-- Print Available Directories'
db cr,lf,' PWD // <-- Print Help Message'
db cr,lf,0
ret
;
; Print Directories and Current Working Directory
;
pwd:
call retud ; get current disk/user
mov a,b ; save current disk
sta cdisk
mov a,c ; save current user
sta cuser
call print
db cr,lf,cr,lf,'** Directory Display **',cr,lf,0
lhld ndradr ; check for named directory buffer
mov a,l
ora h ; HL=0 if none
jnz pwdn
call print
db '** No Named Directory Buffer **',0
jmp pwd0
;
; Print contents of named directory buffer
;
pwdn:
inx h ; pt to entry count
mov c,m ; get count in C
mov a,c ; check for any entries
ora a
jz pwd0
inx h ; pt to first entry
call print
db cr,lf,' ** Named Directory Memory-Based Definitions **',0
call prndir ; print named directory
call print
db cr,lf,cr,lf,'Strike Any Key to Continue - ',0
call cin
call crlf
pwd0:
call codend ; get end of code
call zdname ; load names.dir entries
jnz pwd1
call print
db cr,lf,'** No Directory Names File **',0
jmp pwd2
pwd1:
mov a,c ; save count in buffer
sta ndfcnt
shld ndfadr ; save address in buffer
call print
db cr,lf,' ** Named Directory Disk-Based Definitions **',0
call prndir ; print named directory
pwd2:
call print
db cr,lf,cr,lf,'** Current Directory **',0
lhld ndradr ; check named directory buffer
mov a,h ; any buffer?
ora l
jz pwd3
inx h ; pt to count
mov c,m ; get count in C
inx h ; pt to first entry
call prcwd ; print current working dir
rnz ; found
pwd3:
lhld ndfadr ; get address of NAMES.DIR file in memory
lda ndfcnt ; get entry count
mov c,a ; ... in C
call prcwd
rnz ; found
call print
db cr,lf,' Noname',0
ret
;
; Print Current Working Directory alone
;
cwd:
call retud ; get current disk/user
mov a,b ; save current disk
sta cdisk
mov a,c ; save current user
sta cuser
call codend ; get end of code
call zdname ; load names.dir entries
jz pwd2
mov a,c ; save count in buffer
sta ndfcnt
shld ndfadr ; save address in buffer
jmp pwd2
;
; Print named directory pointed to by HL whose entry count is in C
;
prndir:
call crlf ; new line
mov a,c ; print total count
call padc
call print
db ' Directory Entries Total ',0
ora a ; any entries?
rz
call prpriv ; print privileged count
mvi b,0 ; set new line count
mvi d,0ffh ; set last dir to empty
push h ; save ptr to first entry
push b ; save entry count
prnd1:
call dsel ; check for priv rights to see this entry
jz prnd2 ; do not see
call diskck ; check for new disk
mov a,b ; get flag
ani 3 ; mask
cz crlf ; new line
inr b ; increment flag
call pentry ; print entry
dcr c ; count down
jnz prnd1
pop b ; get entry count
pop h ; get ptr to first entry
ret
prnd2:
call add10 ; pt to next entry (HL=HL+10)
dcr c ; count down
jnz prnd1
pop b ; get entry count
pop h ; get ptr to first entry
ret
;
; Print Count of Privileged Directories
;
prpriv:
mvi a,'(' ; print text
call cout
push h ; save HL
push b ; save BC
mvi b,0 ; set count
prp1:
call dsel ; priv dir?
jnz prp2
inr b ; increment count
prp2:
call add10 ; HL=HL+10
dcr c ; count down
jnz prp1
mov a,b ; get count
pop b ; restore regs
pop h
call padc ; print decimal value
call print
db ' Directories Hidden) --',0
ret
;
; Print Current Directory
;
prcwd:
mov a,c ; check for no entries
ora a
rz
lda cuser ; get current user
mov e,a ; ... in E
lda cdisk ; get current disk
mov b,a ; ... in B
prcwd1:
mov a,m ; get disk
cmp b ; compare disks
jnz prcwd2
inx h ; pt to user
mov a,m ; get user
dcx h ; pt back
cmp e ; compare users
jnz prcwd2
call print
db cr,lf,' ',0
mov a,m ; get disk number
adi 'A' ; convert to letter
call cout
call pe0 ; print entry without leading spaces
mvi a,0ffh ; set OK flag
ora a
ret
prcwd2:
call add10 ; HL=HL+10 to pt to next entry
dcr c ; count down
jnz prcwd1
xra a ; set not found flag
ret
;
; Determine if user is priveleged, and, if not, then select only those
; directory entries he has access to without a password. On return,
; Zero Flag Set (Z) if user should not see the entry pted to by HL
;
dsel:
push b ; save BC
lda cuser ; get current user
mov c,a ; ... in C
lda puser ; start of priveleged user areas
cmp c ; compare current and priv users
jz dselok ; OK if same
jc dselok ; OK if current > priv
inx h ; pt to user number
mov c,m ; get user number
dcx h ; pt to disk number
cmp c ; compare entry and priv users
jz dselno ; no select if entry is priv
jnc dselok ; select is entry is not priv
dselno:
pop b ; restore BC
xra a ; return not OK
ret
dselok:
pop b ; restore BC
mvi a,0ffh ; return OK
ora a
ret
;
; Check to see if new disk, and, if so, print banner and set current disk
;
diskck:
mov a,m ; get next disk number
cmp d ; same as before?
rz
mov d,a ; set new disk number
mvi b,0 ; reset entry/line flag
call crlf ; new line
adi 'A' ; convert to letter
call cout
call print
db ' --',0
ret
;
; HL=HL+10 to pt to next entry
;
add10:
mov a,l ; add low
adi 10
mov l,a
mov a,h ; add high
aci 0
mov h,a
ret
;
; Print entry pted to by HL; on return, HL pts to next entry
;
pentry:
mvi a,' ' ; print leading spaces
call cout
call cout
pe0:
push d ; save DE
inx h ; skip disk number
mov a,m ; get user number
call pusr ; print user number
inx h ; pt to next char
mvi d,8 ; 8 chars
pe1:
mov a,m ; get char
call cout ; print it
inx h ; pt to next
dcr d ; count down
jnz pe1
pop d ; restore de
ret
;
; Print user number in A as 2 decimal digits with leading spaces
;
pusr:
push d ; save DE
lxi d,buff ; pt to buffer
push d ; save ptr
call madc ; load number into buffer as ASCII chars
pop d ; get ptr
inx d ; pt to 2nd letter (1st digit)
ldax d ; get 1st digit
call cout
inx d ; pt to 2nd digit
ldax d ; get it
call cout
mvi a,':' ; separator
call cout
mvi a,' ' ; print space
call cout
pop d ; restore DE
ret
;
; Buffers
;
buff:
ds 3 ; number storage buffer
cuser:
ds 1 ; current user
cdisk:
ds 1 ; current disk
ndfcnt:
ds 1 ; named directory file entry count
ndfadr:
ds 2 ; named directory file load address
end