; Program: DIRBAR.Z80 ; Purpose: Graphic display of file size in records and kbytes ; Usage: DIRBAR [dir:afn] ; Author: Rob Friefeld Long Beach, CA ; Date: 31 May 1990 ; This program requires installation of NZTCAPD for terminal graphics. ; It is intended to show how many records of each Kbyte small files fill. ; Files larger than 9k are ignored. ; ----------------- ; DECLARATIONS no equ 0 yes equ not no bdos equ 5 fcb1 equ 5ch fcb2 equ 6ch cr equ 0dh lf equ 0ah maxrec equ 66 ; File too big to show crtlns equ 24 ; Nominal screen size pglns equ crtlns-5 ; Displayable lines ; VLIB4D ext tinit,dinit,stndout,stndend,cls,at,gotoxy ext gz3init,drhorz,drhash,drfull,setatr,lisec,lleft ; Z3LIB ext z3log ; SYSLIB ext dparams,dirqs,phlfdc,$memry ; ----------------- ; Z HEADER entry: jp start db 'Z3ENV' db 3 z3eadr: dw 0fe00h dw entry ; ----------------- ; CONFIG ; ----------------- ; MAIN PROGRAM start: ld hl,(z3eadr) ld a,h ; Don't run unless ZCPR3 or l ret z ld (stksav),sp ld sp,stack call GZ3INIT ; Set up vlib4d bit 3,a ; Test for graphics jp z,notcap call TINIT ; Generate sorted file list ; parse: ld hl,fcb1+1 ld a,(hl) cp '/' ; Help jp z,info ; Convert filename in fcb1 to wild card ; wcard: ; ld hl,fcb1+1 ld b,11 ld a,' ' wcard1: cp (hl) jr nz,wcard2 ld (hl),'?' wcard2: inc hl djnz wcard1 ld de,fcb1 ; Log into target DU: call Z3LOG load: ld hl,($memry) ; Name buffer call DPARAMS ; Get disk params ld a,11000000b ld de,fcb1 call DIRQS ; Directory sort ld (fcount),bc ; Save file count ld a,b ; Check file count or c jp z,nofile ; No matches ld (dirptr),hl ; List position ; Display results ; header: xor a ld (vid_mode),a ; Set normal attributes ld a,pglns ld (pgcount),a ; Init line counter call header_line ; Show label line showloop: call pentry ; Print current entry jp z,exit ld hl,(dirptr) ld de,16 add hl,de ; Point to next ld (dirptr),hl ld hl,pgcount ; Page full? dec (hl) jr nz,showloop call STNDEND ; Pause for full page xor a call SETATR ; Normal attributes call print dc cr,lf,'[More...] ' call cin cp 'C'-'@' jr nz,header jp exit ; Show current entry in file list ; If file size > max, skip this entry ; pentry: ld hl,(dirptr) ; Current entry push hl ld de,12 add hl,de ld a,(hl) ; A = extent # inc hl inc hl inc hl ld e,(hl) ; E = Record # ld h,a ld l,0 ; HL = extent # x 256 srl h ; Div 2 = recs in extent # rr l ld d,0 add hl,de ; Add in records ld (recnt),hl ; Save record count or a ld de,maxrec ; Check size sbc hl,de pop hl jr nc,pentry1 ; Too big, ignore it call crlf ld a,4 ; Underline attr call SETATR call switch_vid ; Alternate hi vid/ low vid inc hl call pfn ; Print file name call filesize ; Graph the file size info jr pentry2 pentry1: ld hl,pgcount ; Skipping this entry, pre-inc page counter inc (hl) pentry2: ld bc,(fcount) dec bc ld (fcount),bc ld a,b or c ret ; Display bar graph of file size ; filesize: ld hl,(recnt) ; Record count call print dc ' ' call DRFULL ld a,l or h ret z ; 0 len file filesz0: ld l,a ld b,8 filesz1: call filesz2 ret z ld b,7 jr filesz1 filesz2: call DRHASH dec l ret z djnz filesz2 call DRFULL dec l ret ; Swap stndend/stndout modes for current line ; switch_vid: ld a,(vid_mode) cpl ld (vid_mode),a switch_vid1: or a jp z,STNDEND jp STNDOUT ; Print filename at HL ; pfn: ld b,8 call pfn01 ld a,' ' cp (hl) jr z,pfn1 ld a,'.' pfn1: call cout ld b,3 pfn01: ld a,(hl) call cout inc hl djnz pfn01 ret ; In-line print ; vprint: print: ex (sp),hl call printhl ex (sp),hl ret printhl: ld a,(hl) inc hl or a ret z cp 1 jr z,vpr_bright cp 2 jr z,vpr_dim call cout ret m jr printhl vpr_bright: call STNDOUT jr printhl vpr_dim: call STNDEND jr printhl ; Print character in A ; cout: push hl push de push bc push af and 7fh ld e,a ld c,2 call bdos pop af pop bc pop de pop hl ret ; Console input routine, no echo ; cin: ; push hl ; push de ; push bc cin1: ld c,6 ld e,-1 call 5 or a jr z,cin1 ; pop bc ; pop de ; pop hl ret crlf: call print dc cr,lf ret ; ----------------- ; EXITS nofile: call print dc 'No files' jp exit info: call print db cr,lf db 'DIRBAR, vers 0.2 - Graphic small file size display',cr,lf db ' Syntax: DIRBAR [dir:fn]',cr,lf,lf db 'Filename automatically wild-carded.',cr,lf dc cr,lf exit: xor a call SETATR ; Restore screen attrs call STNDEND call DINIT call crlf exit1: ld sp,(stksav) ret notcap: call print dc 'Need graphics info in NZTCAPD' jr exit1 ; ----------------- header_line: call STNDEND call CLS call print db cr,lf db ' ',1,'K Bytes',2,' ',1,'1',2 db ' ',1,'2',2,' ',1,'3',2,' ',1,'4',2 db ' ',1,'5',2,' ',1,'6',2,' ',1,'7',2 db ' ',1,'8',2,' ',1,'9',2 db cr,lf db ' Records 0 8 16 24 32 40 48 56 64' ; db cr,lf ; db 'Names' db 0 ld hl,4*256 + 14 call GOTOXY call LLEFT call DRHORZ db 4,15,80-15,0 ld de,8 ld b,8 hl1: add hl,de call GOTOXY call LISEC djnz hl1 ret ; ----------------- ; DATA dseg stksav ds 50 stack equ $ recnt ds 2 ; Record count dirptr ds 2 ; List pointer fcount ds 2 ; File count pgcount ds 1 ; Line counter vid_mode ds 1 ; Hi/low video flag end