X;SAVE #D9:FMSDIR.M65ALIST DIRECTORYAX;"X; LISTDIR - LIST THE DIRECTORY%X; GDCHAR - GET NEXT DIR CHARACTER&X; THE DIRECTORY IS LISTED VIA OPEN$&X; LIST DIRECTORY FUNCTION EACH DIR.&X; ENTRY THAT MATCHES THE FILE SPEC8(X; IS CONVERTED TO A PRINTABLE FORMATB)X; INTO A SECTOR BUFFER. THE GET BYTEL(X; ENTRY IS USED TO GET THE PRINTABLEV$X; CHARACTERS ONE AT A TIME. THE`#X; LAST LINE PRINTED IS ALWAYS Aj+X; COUNT OF THE NUMBET OF SECTORS IN USEt0X; AND THE NUMBER REMAINING AVAILABLE SECTORS~X; LISTDIR" SFDIR;; Search for first name+D:LDJN;; found a name...join with FDENTX;'X; no more name matches in directoryX; :LDFREE" RDVTOC;; ensure VTOC in place %>DVDAUX*Q@VTOCPTR7;; get LSB of aux sector cnt %>DVDNSA,-O@VTOCPTR7;; add in LSB or std sector cnt 5;; save for a nonce3+Q@VTOCPTR7;; MSB of standard sector cnt(%>DVDAUX2+O@VTOCPTR7;; is added to MSB of aux cnt<>;; we need this in A-reg...F7;; ...but this..P?;; ...has to be in Y-regZ!A;; so now it is back in A-regdX;n&X; free sector cnt in Y,A (lsb,msb)xX;$>0&DIRCPTR;; so that cnt is at start of buffer% CVDX;; convert to decimal number%>;; right after count...A$P@ZSBA7;; put space or plus sign3;; to start of msgX; add FREE SECTORS message :FRMSGLP2Q:FSMSG8;; becuz Y starts at 4 in this loopP@ZSBA7;; a byte of msg3)>;; at end ?H:FRMSGLP;; no- :CVEOL;; add RETURN and set DIRCPTR to 0:GREATEXIT""!GREAT;; exit with good status,#X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6X;@!X; This entry point is used byJ X; the FMS get-a-byte routineT"X; when it discovers that input^#X; is occurring from a file openhX; in DIRECTORY mode.rX;|#X; Here, we simply pass back the#X; formatted entry one byte at a'X; time until an entry is exhausted.(X; Then we go format another line, ifX; there is more to do.X; GDCHAR#%DIRCPTR;; get and test pointer I:GDOK$!ERREOF;; no more char's to get!X; :GDOKQ@ZSBA7;;GET NEXT CHARPSVDBYT;; IN SVDBYT#DIRCPTR;;INC COUNTR>EOL;;TEST IF EOL DONEH:GREATEXIT;;BR NOT EOL&)>;;WAS THIS AN ENTRY0ELDENT;;BR IF IT WAS:Q>;;ELSE INDICATE ENDDPDIRCPTR;;IN DIRCPTRN-!FGREAT;;DONE...release the sector bufferXX;b3X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;lX;v1X; LDENT is used to get another file name line(X; formatted into the sector bufferX; LDENT " CSFDIR;;SEARCH FOR NEXT MATCH,E:LDFREE;;NO MORE MATCHES, give free cnt :LDJN FDENT;;FORMAT ENTRY!GREAT;;DONEX;X;-X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;X; :FSMSG AFREE SECTORSA X; X;*+X; FORMAT DIR ENTRY INTO A SECTOR BUFFER4X;> FDENTH$CDIRD;; current dir entryR%>;;START AT DISPL ZERO\Q> ;;START WITH A BLANKf P@ZSBA7;;formatted in bufferpQFILDIRDFDFL19z M>DFDLOC;;BUT IF FILE LOCKED F:LD1Q> *;;CHANGE TO ASTERISK P@ZSBA7:LD13Q> ;;FOLLOWED BY A BLANK P@ZSBA73X;0X; now move the name from directory to bufferX;*LD2QFILDIRDFDPFN9;;MOVE THE 11 CHARP@ZSBA7;;FILE NAME 2 3 )> $ DLD2. X;8 Q> ;;FOLLOWED BY A BLANKB P@ZSBA7L 3V )'DIRCPTR;; where we want # of sectors` X;j X;t %X; now we check to see if extended~ %X; file type needs to be indicated X; ($CDIRD;; back to look at current dir QICAX1Z;; what kind of open? W?;; (mode 6 or mode 7?) D:LD3;; mode 6...do nothing X; indicate whether extended QFILDIRDFDFL19;; file type #W?;; extended file is $03 or $23 !D:LD3;; not extended...ignore &1;; back to where we just put space Q> > 'P@ZSBA7;; form becomes "" %>;; right after asterisk Q> < %P@ZSBA7;; other half of indicator X;( :LD32 X;< X; ready for cnt of sectorsF X;P X;Z %FILDIRDFDCNT9;;SET A,Yd &QFILDIRDFDCNT9;;=SECTOR COUNTn X;x CVDX $>d;;CONVERT AND MOVE  CVDIGIT;;100S DIGIT $>  CVDIGIT;;10S DIGIT $>  CVDIGIT;;1S DIGIT X; )X; but this routine gives a max number 'X; of 999...and free sector cnt gets #X; a plus sign if cnt is greater X; $> ;; assume a space C;; remainder !F:LT1000;; less than 1000, ok +$> +;; greater than 999...need plus sign :LT1000" X;, %>;; where we want the EOL6 X;@ ,X; put out an EOL and reset entry pointerJ X;T :CVEOL^ Q>EOL;;AND EOLh P@ZSBA7r %>| 'DIRCPTR;;SET CHAR CNT = 0 : X; -X;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; X; (X; CVDIGIT -- routine puts next digit X; of number into entry X; CVDIGIT &TEMP3;;SAVE DIGIT VALUE $> X; :CVD1 PZTEMP2;;SAVE CURR VALUE HI 'ZTEMP1;;AND LOW 2;; INC DIGIT COUNTER ;;;SUBRTACT DIGIT VALUE& QZTEMP1;;FROM CUR VALUE0 STEMP3: ?D QZTEMP2N S>X -D:CVD2;; went minus...we went one too farb X;l "(> ;; got max digit value yet?v H:CVD1;; no ;yes...fall through! X; :CVD2 X; A;;DIGIT TO ACU L>0;;PLUS ASCII ZERO %DIRCPTR;;GET OUTPUT INDEX P@ZSBA7;;AND SET DIGIT #DIRCPTR;; INC OUTPUT INDEX *QZTEMP2;;LOAD VALUE HI (for next call) %ZTEMP1;;AND VALUE LO :