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
/
PUBPATCH
/
PUBLIC.AQM
/
PUBLIC.ASM
Wrap
Assembly Source File
|
2000-06-30
|
9KB
|
496 lines
title 'PUBLIC.ASM v 1.1 11-14-84 (c) 1984 Plu*Perfect Systems'
PAGE 55
;
vers equ 1$1
;
;Utility to set/clear attribute bit 2 of filename.
;For use with Plu*Perfect Systems' PUBlic-file BDOS patch.
;
;usage: PUBLIC [d:] -- lists PUBlic files (on d:)
; PUBLIC [d:]filename.typ -- makes filename.typ PUBlic
; PUBLIC [d:]filename.typ [X] -- makes filename.typ private
; filename,type must be unambiguous - no wildcards
;
;prints drive/user number of all files of specified name,
; with attribute bits displayed as lower-case characters
;
;if just one such file found:
; if X, clears attribute bit - making file private in orig user #
; else, sets attribute bit - making file PUBlic
;
;
; v 1.1 Fixed extent match on overflow to S2 byte (11-14-84)
;
maclib z80
FALSE EQU 0
TRUE EQU NOT FALSE
;
LISTPUBBIT equ 0
MAKPUBBIT equ 1
fence equ '|'
;
NULL equ 0
BELL equ 'G'-'@'
CR equ 0dh
LF equ 0ah
ESC equ 1bh
SPACE EQU ' '
DEL EQU 7FH
drivefn equ 14
openfn equ 15
closefn equ 16
srchfstfn equ 17
srchnxtfn equ 18
deletefn equ 19
readfn equ 20
writefn equ 21
makefn equ 22
renamefn equ 23
logvecfn equ 24
curdskfn equ 25
dmafn equ 26
setattrfn equ 30
getaddrfn equ 31
userfn equ 32
readrfn equ 33
writerfn equ 34
sizefn equ 35
;
reccnt equ 15
currec equ 32
r0 equ 33
tbuff equ 80h
fcb equ 5ch
fcb2 equ fcb+16
;
BOOT equ 0000h
BDOS equ 0005h
ADDRESS equ 0FFFFh ;filled in by loader
bdoslen equ 0e00h
dobdos macro num,arg
if not nul arg
lxi de,arg
endif
mvi c,num
call 5
endm
;
print macro msg
if not nul msg
lxi d,msg
endif
call printde
endm
;
$-MACRO
PAGE
aseg
org 100h
;
top: jmp start
;
banner: db CR,LF,'PUBLIC v '
db vers/10+'0','.',(vers mod 10)+'0'
db ' (c) 1984 Plu*Perfect Systems$'
;
usage: db CR,LF,LF,'Usage: '
db 'PUBLIC [d:] -- list PUBlic files (on d:)'
db CR,LF,' '
db 'PUBLIC [d:]file.ext -- make file PUBlic'
db CR,LF,' '
db 'PUBLIC [d:]file.ext X -- make file private'
db CR,LF,LF,'$'
;
header: db CR,LF,LF,'The currently PUBlic files are:',CR,LF,'$'
;
tomsg: db ' set to ==> $'
pubnam: db 'PUBLIC $'
privnam:db 'PRIVATE $'
ismsg: db ' ==> is already $'
;
multimsg:db CR,LF,BELL,'*** Multiple copies, can''t change!$'
nonemsg:db CR,LF,BELL,'*** No file!$'
cantmsg:db CR,LF,BELL,'*** Can''t make file $'
nopubs: db CR,LF,'(None.)$'
;
;
start: sspd ustack
lxi sp,stack
print banner
lxi h,fcb+1
mov a,m
cpi SPACE
lxi h,flags
res LISTPUBBIT,m
jrnz setup
setb LISTPUBBIT,m
print header
;
setup: dobdos dmafn,buf ;set directory buffer
dobdos curdskfn ;save user's drive
sta drive
sta udrive
lda fcb ;check for specified drive
ora a
jrz savusr
dcr a
sta drive ;login specified drive
mov e,a
dobdos drivefn,
;
savusr: dobdos userfn,0ffh ;save user #
sta uuser
dobdos getaddrfn ;get extent mask for this drive
inx h ! inx h ! inx h ! inx h
mov a,m
sta EXTMASK
xra a
sta count
lda fcb2+1
cpi 'X'
lxi h,flags
res MAKPUBBIT,m
jrz find
setb MAKPUBBIT,m
;
PAGE
; find all filename entries in all user numbers
;
find: lxi h,fcb
mvi m,'?' ;match ALL dir entries
xchg
dobdos srchfstfn,
sta indx ;save position in buffer
inr a
jrz done ;no entries at all
;
findall:call chknxt ;is entry PUBlic or specified filename?
jrnz findnxt
call savefcb ;yes - save it
call setcol
call printentry ; list it
lxi h,count ; and count it
inr m
findnxt:dobdos srchnxtfn,fcb
sta indx
inr a
jrnz findall
;
nomore: lxi h,flags
bit LISTPUBBIT,m
lda count
jrz nom0
ora a
jrnz done
print nopubs
jr done
;
nom0: sui 1
jrc none
jrnz nochanges
lxi h,flags ;exactly 1 file found
bit MAKPUBBIT,m
jrz nom1
call setpub
jr done
nom1: call setpriv
jr done
;
PAGE
nochanges: ;can't be PUBlic if > 1 match on drive
print multimsg
jr done
;
none: print nonemsg
jr done
;
nopub: lxi d,pubnam
call cant
;fall thru
;
; all done, restore drive/user and return
;
done: lxi h,flags
bit LISTPUBBIT,m
jrz done0
print usage
done0: lda udrive ;relogin user's drive
mov e,a
dobdos drivefn,
done1: lda uuser
mov e,a
dobdos userfn,
call crlf
xit: lspd ustack
ret
;
; set the PUBlic attribute bit
;
setpub: lxi h,pubfcb+2 ;test attr bit 2
bit 7,m
jrnz ispub ;quit if already PUBlic
setb 7,m ;set attr bit 2
lda pubfcb ;save user # for output
mov e,a ;set user # of this file
dobdos userfn,
lxi h,pubfcb
mvi m,0 ;put default drive into fcb
xchg
dobdos setattrfn,
inr a
jrz nopub
print tomsg
print pubnam
setpend:
lxi h,pubfcb
jmp printent1
;
ispub: lxi d,pubnam
jmp istype
;
;
; reset the PUBlic attribute bit
;
setpriv:
lda pubfcb ;save file user #
mov e,a ;set user # of fcb
dobdos userfn,
lxi h,pubfcb+2 ;reset PUBlic attr bit
bit 7,m
jrz ispriv ;quit if it's already private
res 7,m
lxi h,pubfcb
mvi m,0 ;default drive
xchg
dobdos setattrfn
inr a
jrz nopriv
print tomsg
print privnam
jr setpend
;
PAGE
nopriv: lxi d,privnam
jmp cant
;
ispriv: lxi d,privnam
; fall thru
istype: push d
print ismsg
pop d
; fall thru
;
printde: ;bdos string print function
mvi c,9
jmp 5
;
cant: push d
print cantmsg
pop d ;print 2nd msg
jr printde
;
; check next directory entry
; if listing PUBlic files, ret Z if PUBlic and 0th extent
; if matching a filename, ret Z if same name,type and extent
; else ret NZ
chknxt: call findentry
mov a,m
cpi 0E5h ;don't match erased entries
jrnz chkn0
ora a ;set nz
ret
chkn0: inx h
lda flags
bit LISTPUBBIT,a
jrz chkn1
;
; list all PUBlic files
inx h ;point at 2nd char of filename
mov a,m
cma
ani 80h ;check compl of attr bit
rnz ;not PUBlic - ret NZ
lxi d,12-2 ;have a PUBlic file,
dad d ;point at its extent byte
xra a ;and check for extent 0
jr chkn3
;
; check for match with specified filename/extent 0
;note* doesn't allow wild cards
chkn1: lxi d,fcb+1
mvi b,11 ;name & type
chkn2: ldax d
sub m
ani 7fh ;don't test attr bits
inx h
inx d
rnz ;nz if no match
djnz chkn2
xra a ;check for extent # 0
chkn3: mov c,m
;
; check for same extent in A, C
;
SAMEXT: ;z set if same extent
push psw
EXTMASK equ $+1
mvi a,00h
cma
mov b,a ;save mask
mov a,c ;mask C
ana b
mov c,a ;save in C
pop psw ;now do A
ana b
sub c
ani 1Fh ;check only legal bits 0-4
rnz ; v 1.1 11-14-84
inx h ;extent is 0, check overflow (s2) ext.
inx h
mov a,m
ani 7fh
ret
;
;
savefcb:
call findentry
mov a,m ;save the user #
sta fileuserno
lxi d,pubfcb
lxi b,32
ldir
ret
;
findentry: ;find entry in buf
lda indx ;point to fcb found
add a ;*32
add a
add a
add a
add a
lxi h,buf
add l
mov l,a
rnc
inr h
ret
;
setcol: lda count
ani 03h
jz crlf
call twosp
mvi c,fence
call charout
twosp: mvi c,space
call charout
mvi c,space
jmp charout
printentry: ;print drive/user/filename
call findentry
printent1: ;print at (hl)
push h
call printdrv
fileuserno equ $+1
mvi a,00h
call printuser
pop h
;fall thru
print$fn: ;print filename.ext
inx h
mvi b,8
call prfn
mvi c,'.'
call charout
mvi b,3
;fall thru
prfn: ;print filename char, lowercase if attr bit set
mov a,m
ani 7fh ;kill attr bit when printing
cmp m
jrz prfn1
ori 20h ;set lower case
prfn1: mov c,a
call charout
inx h
djnz prfn
ret
;
printdrv: ;print drive
lda drive
adi 'A'
mov c,a
jr charout
;
crlf: mvi c,CR
call charout
mvi c,LF
;fall thru
;
charout: ;preserve registers
push h
push b
push d
mov e,c
mvi c,2
call 5
pop d
pop b
pop h
ret
;
printuser: ;print A as user #
cpi 10
jrnc printu1
push psw ;1 space if sgl digit
mvi c,' '
call charout
pop psw
printu1:mov l,a
mvi h,0
call printdec
mvi c,':'
jr charout
;
printdec:
DECOUT: PUSH PSW ;prints hl in decimal
PUSH B
PUSH D
PUSH H
LXI B,-10
LXI D,-1
DECOU2: DAD B
INX D
JC DECOU2
LXI B,10
DAD B
XCHG
MOV A,H
ORA L
CNZ DECOUT ;recursive
MOV A,E
ADI '0'
mov c,a
call charout
POP H
POP D
POP B
POP PSW
RET
;
flags: db 0
indx: db 0
drive: db 0
count: db 0
udrive: db 0 ;user's drive
uuser: db 0
ustack: dw 0
pubfcb equ $
stack equ pubfcb +32 + 48
;
buf equ stack
END