home *** CD-ROM | disk | FTP | other *** search
- ;
- ; PROGRAM: SYSTEST2
- ; AUTHOR: Richard Conn
- ; PURPOSE: To demonstrate the SYSLIB routines for directory manipulation.
- ; NOTE: This program loads the disk directory and selects and prints files
- ; which are non-system in the user area given by the user; it
- ; may be used to test and compare DIRF and DIRFS
- ;
-
- ;
- ; Externals
- ;
- ext bbline ; Input Line Editor
- ext eval10 ; String to Binary Conversion
- ext dirf ; Fast Directory Load/Select/Alphabetize/Pack
- ext dirfs ; DIRF with File Sizing
- ext print ; Print String
- ext cin ; Char in
- ext caps ; Capitalize
- ext cout ; Char out
- ext crlf ; New Line
- ext retud ; Return User and Disk
- ext codend ; End of Code/Beginning of Buffer
-
- ;
- ; CP/M Equates
- ;
- fcb equ 5ch ; address of FCB loaded by CP/M
- cr equ 0dh
- lf equ 0ah
-
- ;
- ; I would normally look at the FCB to see if any file was specified and
- ; make it wild (all ?'s) if so, but I won't do this so we can get right
- ; to the problem at hand. Hence, if the user simply types SYSTEST2 as
- ; his command, the FCB will be all spaces and no file will match it.
- ;
- lxi h,fcb+1 ; clear FCB to ? chars
- mvi b,11 ; 11 bytes
- mvi a,'?' ; wild card
- fill:
- mov m,a ; copy into FCB
- inx h
- dcr b
- jnz fill
- ;
- ; Main Loop
- ;
- test:
- call print
- db cr,lf,'SYSTEST2 - Demo of Directory Routines in SYSLIB',cr,lf
- db 'Use DIRF (Y), DIRFS (N), or Quit (Q)? ',0
- call cin ; get and save response
- call caps
- call cout
- cpi 'Q'
- rz
- sta routine
- call print
- db cr,lf,'User Number? ',0
- call bbline ; get line from user
- call crlf ; new line
- call eval10 ; get user number in A
- mov c,a ; save user number
- call codend ; get buffer address in HL
- lxi d,fcb ; pt to fcb in DE
- mov a,c ; user number in A
- ori 10000000b ; Mask in MSB so only Non-System files selected
- mov c,a ; result in C
- lda routine ; get routine selection
- cpi 'Y' ; use DIRF?
- mov a,c ; restore flag
- jnz usefs
- call dirf ; load dir/select files/alphabetize/pack
- jmp usef
- usefs:
- call dirfs
- usef:
-
- ;
- ; We now have a set of fixed-length records in memory, the first one being
- ; pointed to by HL. The number of records is in BC, and the length of each
- ; record is 16 bytes. These are the first 16 bytes of the FCBs of all files
- ; which matched the files we were looking for.
- ;
- ; I will now print out these file names horizontally across the screen.
- ;
- mvi d,0 ; set 4 count (new line every 4 entries)
- mov a,b ; any file names?
- ora c ; zero if so
- jnz loop ; continue if any names
- call print
- db cr,lf,'No Files Match Ambiguous File Name',0
- jmp test ; return to OS
-
- ;
- ; This is the main loop to print the matching file names.
- ;
- loop:
- push d ; save 4-count in D
- call prfile ; print file name (HL, BC not affected)
- lxi d,16 ; point to next file name by adding 16 to HL
- dad d
- pop d ; get 4-count in D
- inr d ; add 1 to 4-count
- mov a,d ; check to see if it is a 4 multiple
- ani 3 ; zero if so
- cz crlf ; ... and new line
- dcx b ; count down
- mov a,b
- ora c
- jnz loop
- jmp test ; return to Operating System when done
-
- ;
- ; Print file name whose FCB is pointed to by HL. Do not affect HL or BC.
- ;
- prfile:
- push b ; save regs
- push h
- inx h ; pt to first char of file name
- mvi b,8 ; print 8 bytes
- call prch ; my routine to do this (not in SYSLIB)
- mvi a,'.' ; print dot
- call cout
- mvi b,3 ; print 3 bytes
- call prch
- call print
- db ' ! ',0 ; print name separator
- pop h ; restore regs
- pop b
- ret
-
- ;
- ; Print B chars pointed to by HL
- ;
- prch:
- mov a,m ; get char
- inx h ; pt to next
- call cout ; print char
- dcr b ; count down
- jnz prch
- ret
-
- ;
- ; Buffer
- ;
- routine:
- ds 1 ; routine select flag
-
- end