home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
rtsi.com
/
2014.01.www.rtsi.com.tar
/
www.rtsi.com
/
UNIFLEX
/
UNIFLEX
/
UniFLEX_Std.Utils1.tar.Z
/
UniFLEX_Std.Utils1.tar
/
utils1
/
fdncheck
< prev
next >
Wrap
Text File
|
1982-07-13
|
11KB
|
643 lines
opt nol,pag
ttl Directory check program
info UniFLEX fdncheck
info Version 1.4, Released July 6, 1982
info Copyright, (C) 1981, by
info Technical Systems Consultants, Inc.
info All rights reserved.
lib sysdef
opt lis
pag
** 3/1/82 GDT - Changed all Output to use Standard Output
STDOUT equ 1 Standard Output Channel
* Directory check program
BSIZ equ $4000
* structure definitions
org 0
busy rmb 1 busy status
pos rmb 1 position
size rmb 2 size
map rmb 10*3
org 0
dch ldd 0,s get arg count
cmpd #2
bne dch8 error?
sys update
ldd 4,s get device name
std iopn2 set sys call
sys ind,iopn open it
bes dch8 *** should be different ***
std dfd save file dessc
* check block device status here
leax -4096,s set stack size
sys stack
ldd dfd get file desc
sys seek,0,512,0 seek to sir
ldd dfd
sys read,fbuf,512 read in sir
lbes err5 error?
ldd fbuf+16 get fdn block count
std fdcnt save it
jsr zbuf zero buffer
jsr chdup check for dupes in core list
jsr flist find all fdns
clrb set zero
lda #15 set count
dch4 pshs b
deca
bne dch4
lda #'/ set root file name
sta 0,s save on stack
sts nptr save name ptr
ldd #1 set root fdn number
jsr rddir read dir tree
leas 15,s clean up stack
jsr chkf check fdn status
ldd #0
sys term exit
dch8 ldd #STDOUT
sys write,sym,22
ldd #$ff
sys term
sym fcc 'Command syntax error.',$d
*
* zero fdn buffer
*
zbuf ldd #0 set zero
ldx #buf point to buffer
zbuf2 std 0,x++ zero buffer
cmpx #buf+BSIZ finished?
bne zbuf2
rts return
*
* fill fdn buffer with fdn info
*
flist ldd #buf point to buffer start
std nxtfdn
ldd dfd get file desc
sys seek,0,1024,0 seek to fdn start
flist2 ldd dfd get file desc
sys read,fbuf,512 read in a block
lbes err1 error?
ldx #fbuf
ldu nxtfdn
ldb #8 set fdn per block count
flist4 lda 0,x get modes
sta 0,u+
lda 2,x get link count
sta 0,u+
leax 64,x get to next fdn
decb dec the counter
bne flist4
stu nxtfdn mark table end
ldd fdcnt get fdn block count
subd #1 dec it
std fdcnt
bne flist2
rts return
*
* rddir
*
* Read dirs recursively
*
rddir std fdnsav save fdn
jsr stfnd set fdn found bit
ldd #0 set name term ptr
pshs d
ldx nptr get name pointer
pshs x save it
ldy #name point to buffer
bra xfn3
xfn2 lda #'/ set sep char
sta 0,y+
xfn3 lda 0,x+ transfer name
sta 0,y+
bne xfn3
leay -1,y
ldx 0,s get name ptr
ldx -4,x get next in line
stx 0,s save new ptr
bne xfn2
leas 2,s
ldd fdnsav get fdn number
jsr xopen open file
pshs d save file desc
leas -512,s make buffer on stack
rddir1 ldx #0 zero out buffer
clrb
leau 0,s
rddir2 stx 0,u++
decb
bne rddir2
sts ird2 set read sys call
ldd 512,s get file desc
jsr xread read in block
cmpd #0 end of dir?
lbeq rddir8
ldb #512/16 set entry counter
pshs b
leau 1,s point to block just read
rddir3 ldd 0,u get fdn number
beq rddir6 empty entry?
ldx #buf point to fdn list
subd #1 finf fdn entry
lslb
rola
leax d,x point to entry
lda 0,x check if allocated
ora #$40
sta 0,x set linked to bit
tst 1,x link count zero?
bne rddir4
bita #$3f is it allocated?
beq rddi52
pshs x
jsr zler report error
puls x
bra rddir5
rddir4 lda 1,x get link count
cmpa #127 is it max?
beq rddir5
dec 1,x dec the link count
rddir5 lda 0,x check modes
bita #$3f
bne rddi55
rddi52 pshs x
jsr ffer free fdn error
puls x
bra rddir6
rddi55 tsta
bmi rddir6
bita #$8 is it dir?
beq rddir6
pshs u save u
ldb #0 set up dir name
pshs b
ldd 14,u transfer name to stack
pshs d
ldd 12,u
pshs d
ldd 10,u
pshs d
ldd 8,u
pshs d
ldd 6,u
pshs d
ldd 4,u
pshs d
ldd 2,u
pshs d
sts 532,s save name ptr
ldd 0,u
jsr rddir read this dir
leas 15,s clean stack
puls u
rddir6 leau 16,u move to next entry
dec 0,s dec the count
bne rddir3 repeat?
puls b
lbra rddir1
rddir8 leas 512,s clean stack
puls d get file desc
jsr xclose close the file
puls d,pc return
*
* set fdn found bit
*
stfnd ldx #buf point to fdn list
subd #1
lslb
rola
leax d,x point to entry
lda 0,x get mode
ora #$80 set bit
sta 0,x
rts return
*
* Report zero link error
*
zler ldd #STDOUT set file desc
sys write,zzm,13
bra generr
*
* Report no link error
*
ffer ldd #STDOUT
sys write,ffm,12
*
* general error
*
generr ldd #STDOUT set file desc
sys write,gnm1,6
leax 2,u point to file name
stx iwrt2
ldd #0 find name length
gener2 tst 0,x+
beq gener4
incb
bra gener2
gener4 std iwrt3 save count
ldd #STDOUT set file desc
sys ind,iwrt output name
ldd #STDOUT set file desc
sys write,gnm2,1
ldd 0,u get fdn number
gener6 pshs d
ldd #STDOUT set file desc
sys write,gnm3,6
puls d get fdn
prtdec ldx #sbuf point to string buffer
stx iwrt2
jsr decstn
leax d,x
addd #2 set length
std iwrt3
ldd #'.<<8|$d
std 0,x set in string
ldd #STDOUT set file desc
sys ind,iwrt output fdn number
rts return
*
* Report fdn check error
*
cherr pshs d save fdn
ldd #STDOUT
sys write,chm1,15
puls d
bra gener6
cherr2 pshs d save fdn
ldd #STDOUT
sys write,chm2,16
puls d
bra gener6
*
* Check fdns
*
chkf ldd #1 set fdn counter
pshs d
ldu #buf point to list
chkf2 lda 0,u get status
beq chkf5
bita #$40 referenced?
beq chkf4
lda 1,u link 0?
beq chkf5
cmpa #127 is it max?
beq chkf5
ldd 0,s get fdn number
jsr cherr report error
bra chkf5
chkf4 ldd 0,s get fdn
jsr cherr2 report error
chkf5 ldd 0,s get fdn
addd #1 bump by 1
std 0,s
leau 2,u next entry
cmpu nxtfdn end of table?
bne chkf2
puls d,pc return
*
* error routines
*
err1 pshs d
ldd #STDOUT set file desc
sys write,E1,21
puls d
swi
sys term
*
err3 pshs d
ldd #STDOUT set file desc
sys write,E3,22
puls d
swi
sys term
*
err4 pshs d
ldd #STDOUT
sys write,E4,22
puls d
swi
sys term
*
err5 pshs d
ldd #STDOUT
sys write,E5,24
puls d
swi
sys term
*
ferr ldd #STDOUT set file desc
sys write,ferm,FRSZ
ldd #$ff
sys term exit
dbig ldd #STDOUT set file desc
sys write,dirbig,DIRBIG "Directory too large"
bra ferr
*
* xread
*
* Fake system read routine. Reads dirs
*
xread lda #34 set file table entry size
mul b has file desc
ldx #filtab point to file table
leax d,x point to entry
ldd size,x get file size
beq xread6 eof?
pshs d save size
subd #512 dec by read amount
std size,x save new size
bpl xread2 ok?
ldd #0 set size to 0
std size,x
xread2 lda pos,x get file position (block offset)
inc pos,x bump pos
ldb #3 set map entry size
mul
leax map,x point to map
leax d,x point to block entry
lda 0,x transfer block to seek
sta isk+1
clr isk3
ldd 1,x get rest of it
std isk2
lsl isk2+1 shift left 1 (512 mult)
rol isk2
rol isk+1
ldd dfd get file desc
sys ind,isk seek to block
ldd dfd get file desc
sys ind,ird read in block
lbes err4 error?
ldx ird2 get buffer location
puls d get size
cmpd #512 enough there?
bhs xread5
leax d,x zero rest of buffer
pshs d save count
ldd #512 find count
subd 0,s++
xread4 clr 0,x+ zero buffer
subd #1
bne xread4
xread5 ldd #512 set read count
xread6 rts return
*
* close file simulation
*
xclose lda #34 find entry
mul
ldx #filtab in file table
leax d,x
clr 0,x clear status
rts return
*
* open simulation
*
xopen clr isk3 set up seek to fdn
clr isk+1
subd #1 calc its position
lsra
rorb
ror isk3
lsra
rorb
ror isk3
addd #2<<1 add in start block for fdns
std isk2
ldd dfd get file desc
sys ind,isk seek to block
ldd dfd get file desc
sys read,fdntmp,64 read in fdn
lbes err3 error?
ldx #filtab point to file table
ldd #0 find a slot for this guy
xopen3 tst 0,x busy?
beq xopen4
addd #1 bump file desc
leax 34,x next entry
cmpx #filend end of table?
bne xopen3
lbra ferr error!
xopen4 pshs d save file desc
inc 0,x set busy
pshs u save u
ldu #fdntmp+5 point to fdn
ldd 0,u++ get size
lbne dbig too big?
ldd 0,u++
cmpd #5120 too big?
lbhi dbig
std size,x save size
clr pos,x set begin pos
ldb #10 set map count
pshs b
leax map,x point to map
xopen5 lda 0,u+ transfer map
sta 0,x+
ldd 0,u++
std 0,x++
dec 0,s dec count
bne xopen5
puls b,u reset regs
puls d,pc return
*
* chdup - check for duplicate fdn's in core list
*
chdup ldx #fbuf+$58 (x)=ptr to fdn count
lda 0,x+ get count
pshs a save it
chdup1 lda 0,s+ restore count
beq chdup4 if exam of all fdn's complete
deca decrement fdn count
pshs a save new count
ldy 0,x++ get an fdn
pshs x save ptr into fdn list
clrb clear count of dupes
chdup2 tsta check count
beq chdup3 if done looking for dupes
cmpy 0,x++ duplicate fdn ?
bne chdp25 no dupe found
incb dump count to dupes found
chdp25 deca decrement count
bra chdup2 continue search for dupes
chdup3 tstb dupes found ?
bne chdup6 if dupes found, report it
chdp35 puls x restore ptr into fdn list
bra chdup1 check next fdn entry
chdup4 rts
** report dupes found.
chdup6 ldd #STDOUT set file desc
sys write,dupe,DUPSZ "Duplicate fdn found"
tfr y,d (d)=fdn #
jsr prtdec print it
bra chdp35 look at next fdn
*
* decst
*
* Convert the number in D into an ascii string
* representing a decimal number. The string
* is pointed at by X (X should be set on entry!)
* Also on exit, D has the length of the string.
* The second entry point, 'decstn' will not print
* leading spaces for leading zeroes, but will
* suppress all leading zero info. All strings
* start with a space.
*
decst pshs x save user pointer
clr 0,-s set suppression flag
bra decst2
*
decstn pshs x save user pointer
clr 0,-s
inc 0,s set for no fielding
decst2 pshs a
lda #$20 setup leading space
sta 0,x+ save in buffer
puls a
clr 0,-s set up bookkeeping
clr 0,-s
decst3 ldy #conlst point to constants
decst4 cmpd 0,y compare number to constant
blo decst5
subd 0,y do subtraction of constant
inc 1,s bump digits counter
bra decst4
decst5 pshs a save number
tst 2,s zero digit?
bne decst6
tst 1,s any numbers output yet?
bne decst6
tst 3,s doing suppression?
bne decst8
lda #$20 set up space
bra decst7
decst6 lda 2,s get digit count
inc 1,s set 'got one' flag
ora #$30 make ascii
decst7 sta 0,x+ save in buffer
decst8 puls a reset number
clr 1,s clear out digit
leay 2,y bump constant ptr
cmpy #conend end of list?
bne decst4
leas 3,s clean up stack
orb #$30 make last digit
stb 0,x+ save in buffer
clr 0,x null terminate string
tfr x,d
subd 0,s calculate string length
puls x,pc return
pag
* constants for convert
conlst fdb 10000
fdb 1000
fdb 100
fdb 10
conend equ * end of list
* data
E1 fcc "Can't read fdn list.",$d
E3 fcc "Can't open directory.",$d
E4 fcc "Can't read directory.",$d
E5 fcc "Can't read system info.",$d
zzm fcc "Too few links"
ffm fcc "Inactive fdn"
gnm1 fcc ' for "'
gnm2 fcc '"'
gnm3 fcc ' - fdn'
chm1 fcc 'Link count high'
chm2 fcc 'Never referenced'
ferm fcc 'Fatal error - fdncheck aborted!',$d
FRSZ equ *-ferm
dirbig fcc 'Encountered directory too large',$d
DIRBIG equ *-dirbig
dupe fcc 'Duplicate entry found "in core" list - fdn #'
DUPSZ equ *-dupe
dfd fdb 0 file desc
nxtfdn fdb 0 next fdn
fdcnt fdb 0 fdn block count
nptr fdb 0 name pointer
iopn fcb open
iopn2 fdb 0,0
ird fcb read
ird2 fdb 0,512
iwrt fcb write
iwrt2 fdb 0
iwrt3 fdb 0
isk fcb seek,0
isk2 fdb 0
isk3 fcb 0,0,0
fdnsave rmb 2 temp for fdn
name rmb 128 name buffer
fdntmp rmb 64 fdn buffer
filtab rmb 10*34 file table
filend equ *
sbuf rmb 16 buffer
org $e00
fbuf rmb 512
buf rmb BSIZ
end dch