home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol043 / sd.a86 < prev    next >
Text File  |  1984-04-29  |  15KB  |  643 lines

  1. ;
  2. ;            SD.A86
  3. ;          (revised 05/05/81)
  4. ;
  5. ;        SUPER DIRECTORY PROGRAM
  6. ;          by Bruce R. Ratoff
  7. ;
  8. ;Displays the directory of a CP/M disk, sorted alphabetically,
  9. ;with the file size in K, rounded to the nearest CP/M block size.
  10. ;
  11. ;This latest variation on a common theme will automatically adjust
  12. ;itself for any block size and directory length under CP/M 1.4 or 2.x
  13. ;or MP/M (any version).  If the screen fills, program will pause until
  14. ;a key is struck (see NPL and LPS equates below).  Total space used
  15. ;and number of files are printed at end.
  16. ;
  17. ;Command: SD FILENAME.FILETYPE or just SD
  18. ;
  19. ;Allows '*' or '?' type specifications.  Drive name may also be
  20. ;specified.  Ignores "SYS" files unless SOPT is TRUE and 'S' option
  21. ;is given (i.e., SD *.* S will print all files).
  22. ;
  23. ;05/03/81 First 8086 version. (Bruce R. Ratoff)
  24. ;
  25. ;01/21/81 Fixed print abort test so it would work like "DIR"
  26. ;        [aborts on any character, or on ^S, ^C].
  27. ;      (ASB)
  28. ;
  29. ;
  30. ;01/06/81 Made output go through BDOS so if the printer was on,
  31. ;      you could get the output on it. The ^S test was rendered
  32. ;      useless, as was the ^C test, as BDOS buffers one character
  33. ;      ahead when it is writing out to the console. [You now need
  34. ;      to do a ^S ^C combonation to abort, and the size message
  35. ;      is not printed, but I don't think that is a major problem.]
  36. ;      (Andrew S. Beals)
  37. ;
  38. ;01/06/81 Added conditional assembly to print user number when in CP/M
  39. ;      2.x. (ASB)
  40. ;
  41. ;12/15/80 Added space suppression when printing file
  42. ;      totals.  (KBP)
  43. ;
  44. ;12/14/80 Added logic to print space remaining on disk.
  45. ;      Changed ^C test so that interrupting character is
  46. ;      not echoed (makes remote use cleaner).  (BRR)
  47. ;
  48. ;12/02/80 Fixed bug in print routine which compared last file
  49. ;      against garbage before printing. (BRR)
  50. ;
  51. ;11/29/80 Changed to allow printing 4 file names. (Ben Bronson
  52. ;      and Keith Petersen)
  53. ;
  54. ;11/22/80 Fixed bug in handling >256 files.  Changed abort test in
  55. ;      print routine to only abort on control-c.  (brr)
  56. ;
  57. ;Based on 'DIRS' by Keith Petersen, W8SDZ
  58. ;
  59. ;Set 'RMAC' TRUE to assemble with relocating assembler (requires
  60. ;link with PAGE 0 equates in separate file).
  61. ;
  62. FALSE    EQU    0        ;DEFINE LOGICAL FALSE
  63. TRUE    EQU    NOT FALSE    ;DEFINE LOGICAL TRUE
  64. ;
  65. SOPT    EQU    TRUE     ;PUT TRUE TO ALLOW 'DIR *.* S' FORM
  66. WIDE    EQU    true     ;PUT TRUE TO ALLOW 4 NAMES ACROSS
  67. user    equ    true    ;print user numbers for cp/m 2.x also?
  68. ;
  69. ;
  70. ;
  71. BASE    EQU    0
  72. TPA    EQU    100H
  73. ;
  74. FCB    EQU    5CH
  75. ;
  76.     IF    WIDE
  77. NPL    EQU    4    ;NUMBER OF NAMES PER LINE
  78.     ENDIF
  79. ;
  80.     IF    NOT WIDE
  81. NPL    EQU    3    ;NUMBER OF NAMES PER LINE
  82.     ENDIF
  83. ;
  84. LPS    EQU    23    ;NUMBER OF LINES PER SCREEN
  85. DELIM    EQU    ':'    ;FENCE (DELIMITER) CHARACTER
  86. ;
  87.     org    TPA
  88. ;
  89. START:
  90.     cld
  91. ;
  92.     IF    SOPT
  93.     mov    al,byte ptr .FCB+17     ;SAVE S OPTION FLAG
  94.     mov    SOPFLG,al     ;(BLANK OR LETTER S)
  95.     ENDIF
  96. ;
  97.     mov    USERNO,0     ;DEFAULT TO USER 0
  98.     mov    LINCNT,0     ;CLEAR COUNT OF LINES ON SCREEN
  99.     mov    cl,12
  100.     CALL    BDOS     ;CHECK CP/M VERSION
  101.     mov    word ptr VERFLG,bx  ;LO ORD >0 IF 2.X, HI ORD>0 IF MP/M
  102.     mov    dl,0FFH
  103.     mov    cl,CURUSR ;INTERROGATE USER NUMBER
  104.     CALL    BDOS
  105.     mov    USERNO,al
  106. ;
  107.     if    not user
  108.     mov    al,MPMFLG     ;MP/M?
  109.     test    al,al     ;IF SO, TYPC HEADING LINE
  110.     JZ    CHKDRV     ; ELSE SKIP IT
  111.     endif
  112. ;
  113.     mov    dx,offset USRMSG ;DISPLAY IT
  114.     mov    cl,PRINT
  115.     CALL    BDOS     ;FIRST PART OF MESSAGE
  116.     mov    al,USERNO
  117.     cmp    al,10     ;IF USER NO. > 9 PRINT LEADING 1
  118.     JB    DUX
  119.     mov    al,'1'
  120.     CALL    TYPC
  121.     mov    al,USERNO     ;PRINT LOW DIGIT OF USER NO.
  122.     sub    al,10
  123. ;
  124. DUX:    add    al,'0'
  125.     CALL    TYPC
  126.     mov    dx,offset USRMS2 ;PRINT TAIL OF MESSAGE
  127.     mov    cl,PRINT
  128.     CALL    BDOS
  129.     mov    LINCNT,1    ;WE USED A LINE
  130. ;
  131. CHKDRV:    mov    si,offset FCB
  132.     lods    al    ;get drive name
  133.     test    al,al    ;ANY SPECIFIED?
  134.     JNZ    START2    ;YES SKIP NEXT ROUTINE
  135.     mov    cl,CURDSK
  136.     CALL    BDOS    ;GET CURRENT DISK NR
  137.     inc    al    ;MAKE A:=1
  138.     mov    byte ptr .FCB,al
  139. ;
  140. START2:    add    al,'A'-1    ;MAKE IT PRINTABLE
  141.     mov    DRNAM,al    ;SAVE FOR LATER
  142.     mov    di,offset FCB+1    ;POINT TO NAME
  143.     mov    al,[di]    ;ANY SPECIFIED?
  144.     cmp    al,' '
  145.     JNZ    GOTFCB
  146. ;No FCB - make FCB all '?'
  147.     mov    cx,11    ;FN+FT COUNT
  148.     mov    al,'?'
  149. ;
  150.     rep stos al    ;fill fcb with '?'
  151. ;
  152. GOTFCB:
  153.     mov    byte ptr .FCB+12,'?'    ;FORCE WILD EXTENT
  154.     mov    al,byte ptr .FCB    ;CHECK FOR EXPLICIT DRIVE
  155.     dec    al
  156.     mov    dl,al    ;SELECT SPECIFIED DRIVE
  157.     mov    cl,SELDSK
  158.     CALL    BDOS
  159.     mov    byte ptr .FCB,0
  160. ;
  161.     mov    cl,CURDPB;IT'S 2.X OR MP/M...REQUEST DPB
  162.     push    es    ;save current extra segment
  163.     int    224    ;return bx=offset dpb, es=segment dpb
  164.     add    bx,2
  165.     mov    al,es: [bx]
  166.     mov    BLKSHF,al    ;GET BLOCK SHIFT
  167.     inc    bx    ;BUMP TO BLOCK MASK
  168.     mov    al,es: [bx]
  169.     mov    BLKMSK,al
  170.     add    bx,2
  171.     mov    ax,es: [bx]
  172.     mov    BLKMAX,ax
  173.     add    bx,2
  174.     mov    ax,es: [bx]
  175.     mov    DIRMAX,ax    ;SAVE IT
  176.     pop    es        ;restore our extra segment
  177. ;
  178. SETTBL:    inc    ax    ;DIRECTORY SIZE IS DIRMAX+1
  179.     shl    ax,1    ;DOUBLE DIRECTORY SIZE
  180.     add    ax,offset ORDER    ;TO GET SIZE OF ORDER TABLE
  181.     mov    TBLOC,ax ;NAME TABLE BEGINS WHERE ORDER TABLE ENDS
  182.     mov    NEXTT,ax
  183.     mov    bx,word ptr .BASE+6    ;MAKE SURE WE HAVE ROOM TO CONTINUE
  184.     cmp    ax,bx
  185.     jb    SFIRST
  186.     JMP    OUTMEM
  187. ;
  188. ;Look up the FCB in the directory
  189. ;
  190. SFIRST:    mov    cl,FSRCHF ;GET 'SEARCH FIRST' FNC
  191.     mov    dx,offset FCB
  192.     CALL    BDOS    ;READ FIRST
  193.     inc    al    ;WERE THERE ANY?
  194.     JNZ    SOME    ;GOT SOME
  195. ;
  196. NONE:    mov    dx,offset FNF    ;PREPARE MP/M ERROR MESSAGE
  197.     mov    al,MPMFLG
  198.     test    al,al    ;USE IT IF REALLY MP/M
  199.     jz    NOFILE
  200.     JMP    ERXIT1
  201. NOFILE:    CALL    ERXIT    ;ELSE USE CP/M ERROR MESSAGE
  202.     DB    'NO FILE$'
  203. FNF    DB    'File not found.$'
  204. ;
  205. USRMSG    DB    'Directory for user $'
  206. USRMS2    DB    ':',13,10,'$'
  207. ;
  208. ;Read more directory entries
  209. ;
  210. MORDIR:    mov    cl,FSRCHN ;SEARCH NEXT
  211.     mov    dx,offset FCB
  212.     CALL    BDOS    ;READ DIR ENTRY
  213.     inc    al    ;CHECK FOR END (0FFH)
  214.     JZ    SPRINT    ;NO MORE - SORT & PRINT
  215. ;
  216. ;Point to directory entry 
  217. ;
  218. SOME:    dec    al    ;UNDO PREV 'INR A'
  219.     mov    cl,5
  220.     shl    al,cl    ;entry no. times 32
  221.     mov    ah,0
  222.     add    al,80h
  223.     mov    bx,ax ;POINT TO BUFFER
  224.             ;(SKIP TO FN/FT)
  225. ;
  226.     IF    SOPT
  227.     mov    al,SOPFLG    ;DID USER REQUEST SYS FILES?
  228.     cmp    al,'S'
  229.     JZ    SYSFOK
  230.     ENDIF
  231. ;
  232.     test    byte ptr 10[bx],80H    ;check bit 7 of SYS byte
  233.     JNZ    MORDIR    ;SKIP THAT FILE
  234. ;
  235. SYSFOK:    mov    al,USERNO    ;GET CURRENT USER
  236.     cmp    al,[bx]
  237.     JNZ    MORDIR    ;IGNORE IF DIFFERENT
  238.     inc    bx
  239. ;
  240. ;Move entry to table
  241. ;
  242.     mov    si,bx    ;si points to name
  243.     mov    di,NEXTT    ;NEXT TABLE ENTRY TO di
  244.     mov    cx,12    ;ENTRY LENGTH (NAME, TYPC, EXTENT)
  245. ;
  246. TMOVE:    lods    al    ;GET ENTRY CHAR
  247.     and    al,7FH    ;REMOVE ATTRIBUTES
  248.     stos    al    ;store in table
  249.     loop    TMOVE
  250.     mov    al,2[si]    ;get sector count
  251.     MOV    [di],al    ;STORE IN TABLE
  252.     inc    di
  253.     mov    NEXTT,di    ;SAVE UPDATED TABLE ADDR
  254.     inc    COUNT
  255.     add    di,13    ;SIZE OF NEXT ENTRY
  256.     sub    di,word ptr .BASE+6    ;PICK UP TPA END
  257.     JB    MORDIR    ;IF TPA END>NEXTT THEN LOOP BACK FOR MORE
  258. ;
  259. OUTMEM:    CALL    ERXIT
  260.     DB    'Out of memory.',13,10,'$'
  261. ;
  262. ;Sort and print
  263. ;
  264. SPRINT:    mov    cx,COUNT    ;GET FILE NAME COUNT
  265.     test    cx,cx
  266.     jnz    SPRINI
  267.     jmp    NONE    ;NONE, EXIT
  268. ;Init the order table
  269. SPRINI:    mov    ax,TBLOC    ;GET START OF NAME TABLE
  270.     mov    di,offset ORDER    ;POINT TO ORDER TABLE
  271. ;
  272. BLDORD:    stos    ax
  273.     add    ax,13
  274.     loop    BLDORD
  275.     mov    bx,COUNT    ;GET COUNT
  276.     mov    SCOUNT,bx    ;SAVE AS # TO SORT
  277.     dec    bx    ;only 1 entry?
  278.     JZ    DONE    ;..YES, SO SKIP SORT
  279. ;
  280. SORT:    mov    SWITCH,0    ;SHOW NONE SWITCHED
  281.     mov    bx,SCOUNT    ;GET COUNT
  282.     dec    bx        ;use 1 less
  283.     mov    word ptr TEMP,bx    ;SAVE # TO COMPARE
  284.     mov    SCOUNT,bx    ;SAVE HIGHEST ENTRY
  285.     JZ    DONE    ;EXIT IF NO MORE
  286.     mov    bx,offset ORDER ;POINT TO ORDER TABLE
  287. ;
  288. SORTLP:    mov    cx,12    ;# BYTES TO COMPARE
  289.     CALL    COMPR    ;COMPARE 2 ENTRIES
  290.     jbe    NOSWAP
  291.     CALL    SWAP    ;SWAP IF NOT IN ORDER
  292. NOSWAP:    add    bx,2    ;bump order table ptr
  293.     dec    TEMP    ;BUMP COUNT
  294.     JNZ    SORTLP    ;CONTINUE
  295. ;One pass of sort done
  296.     mov    al,SWITCH    ;ANY SWAPS DONE?
  297.     test    al,al
  298.     JNZ    SORT
  299. ;
  300. ;Sort is all done - print entries
  301. ;
  302. DONE:    mov    bx,offset ORDER
  303.     mov    NEXTT,bx
  304. ;
  305. ;Print an entry
  306. ;
  307.     IF    NOT WIDE
  308.     CALL    DRPRNT    ;PRINT DRIVE NAME
  309.     ENDIF
  310.     mov    cx,NPL    ;NR. OF NAMES PER LINE
  311.     mov    TOTSIZ,0    ; TOTAL K USED
  312.     mov    TOTFIL,0    ; AND TOTAL FILES
  313. ;
  314. ENTRY:    mov    bx,COUNT    ; CHECK COUNT OF REMAINING FILES
  315.     dec    bx    ; skip compare if only 1 left
  316.     JZ    OKPRNT
  317.     PUSH    cx
  318. ;
  319.     mov    cl,dconio    ;get console status
  320.     mov    dl,0ffh
  321.     call    bdos
  322.     test    al,al    ;char?
  323.     jz    nobrk    ;no char, bypass the other stuff
  324.     jmp    exit    ;abort
  325. ;
  326. NOBRK:    mov    bx,NEXTT
  327.     mov    cx,11
  328.     CALL    COMPR    ;DOES THIS ENTRY MATCH NEXT ONE?
  329.     pop    cx
  330.     JNE    OKPRNT    ;NO, PRINT IT
  331.     add    bx,2    ;SKIP, SINCE HIGHEST EXTENT COMES LAST IN LIST
  332.     mov    NEXTT,bx
  333.     dec    COUNT    ;COUNT DOWN
  334.     JMP    ENTRY    ;GO GET NEXT
  335. ;
  336. OKPRNT:
  337.     push    cx
  338. ;
  339.     IF    NOT WIDE
  340.     CALL    FENCE    ;PRINT FENCE CHAR AND SPACE
  341.     ENDIF
  342. ;
  343.     mov    bx,NEXTT    ;GET ORDER TABLE POINTER
  344.     mov    si,[bx]
  345.     add    bx,2
  346.     mov    NEXTT,bx    ;SAVE UPDATED TABLE POINTER
  347.     mov    cx,8    ;FILE NAME LENGTH
  348.     CALL    TYPCIT    ;TYPC FILENAME
  349.     mov    al,'.'    ;PERIOD AFTER FN
  350.     CALL    TYPC
  351.     mov    cx,3    ;GET THE FILETYPC
  352.     CALL    TYPCIT
  353.     mov    dl,[si]
  354.     mov    dh,0
  355.     inc    si
  356.     mov    al,[si]    ;GET SECTOR COUNT OF LAST EXTENT
  357.     mov    cl,4    ;# OF EXTENTS TIMES 16K
  358.     shl    dx,cl
  359.     ADD    al,BLKMSK    ;ROUND LAST EXTENT TO BLOCK SIZE
  360.     mov    cl,3
  361.     shr    al,cl        ;CONVERT FROM SECTORS TO K
  362.     mov    ah,0
  363.     add    dx,ax    ;add to total K
  364.     mov    al,BLKMSK    ;GET SECTORS/BLK-1
  365.     mov    cl,3
  366.     shr    ax,cl        ;CONVERT TO K/BLK
  367.     not    ax        ;USE TO FINISH ROUNDING
  368.     and    dx,ax
  369.     add    TOTSIZ,dx    ;add to total used
  370.     inc    TOTFIL    ;INCREMENT FILE COUNT
  371.     mov    ax,dx        ;GET BACK FILE SIZE
  372.     CALL    DECPRT    ; AND PRINT IT
  373.     mov    al,'k'    ;FOLLOW WITH K
  374.     CALL    TYPC
  375. ;
  376.     IF    NOT WIDE
  377.     CALL    SPACE
  378.     ENDIF
  379. ;
  380. ;See if more entries
  381. ;
  382.     dec    COUNT    ;COUNT DOWN ENTRIES
  383.     pop    cx
  384.     JZ    PRTOTL    ;IF OUT OF FILES, PRINT TOTALS
  385.     DEC    CX    ;ONE LESS ON THIS LINE
  386.     jz    DOCRLF
  387. ;
  388.     IF    WIDE
  389.     CALL    FENCE    ;NO CR-LF NEEDED, DO FENCE
  390.     ENDIF
  391. ;
  392.     jmps    NOCRLF
  393. ;
  394. DOCRLF:    CALL    CRLF    ;CR-LF NEEDED
  395. NOCRLF:    JMP    ENTRY
  396. ;
  397. ;Print HL in decimal with leading zero suppression
  398. ;
  399. DECPRT:            ;CLEAR LEADING ZERO FLAG
  400.     mov    LZFLG,0
  401.     mov    bx,1000    ;PRINT 1000'S DIGIT
  402.     CALL    DIGIT
  403.     mov    bx,100    ;ETC
  404.     CALL    DIGIT
  405.     mov    bx,10
  406.     CALL    DIGIT
  407.     add    al,'0'    ;GET 1'S DIGIT
  408.     JMP    TYPC
  409. ;
  410. DIGIT:    mov    dx,0    ;init hi order dividend
  411.     div    bx    ;divide ax by digit value (dx gets rmdr)
  412.     add    al,'0'    ;convert to ASCII digit
  413. ;
  414.     cmp    al,'0'    ;ZERO DIGIT?
  415.     JNZ    DIGNZ    ;NO, TYPC IT
  416.     mov    al,LZFLG    ;LEADING ZERO?
  417.     test    al,al
  418.     mov    al,'0'
  419.     JNZ    DIGPR    ;PRINT DIGIT
  420.     mov    al,SUPSPC    ;GET SPACE SUPPRESSION FLAG
  421.     test    al,al    ;SEE IF PRINTING FILE TOTALS
  422.     jz    DIGNP        ;YES, DON'T GIVE LEADING SPACES
  423.     mov    al,' '
  424.     JMPS    DIGPR    ;LEADING ZERO...PRINT SPACE
  425. ;
  426. DIGNZ:    mov    LZFLG,0ffh ;SET LEADING ZERO FLAG SO NEXT ZERO PRINTS
  427. DIGPR:    call    TYPC    ;AND PRINT DIGIT
  428. DIGNP:    mov    ax,dx    ;set up remainder for next digit
  429.     ret
  430. ;
  431. ;Show total space and files used
  432. ;
  433. PRTOTL:    mov    SUPSPC,0    ;SUPPRESS LEADING SPACES IN TOTALS
  434.     CALL    CRLF    ;NEW LINE (WITH PAUSE IF NECESSARY)
  435. ;
  436.     IF    WIDE
  437.     mov    dx,offset TOTMS1 ;PRINT FIRST PART OF TOTAL MESSAGE
  438.     ENDIF
  439. ;
  440.     IF    NOT WIDE
  441.     mov    dx,offset TOTMS1+1 ;PRINT FIRST PART OF TOTAL MESSAGE
  442.     ENDIF
  443. ;
  444.     mov    cl,PRINT
  445.     CALL    BDOS
  446.     mov    ax,TOTSIZ    ;PRINT TOTAL K USED
  447.     CALL    DECPRT
  448.     mov    dx,offset TOTMS2;NEXT PART OF MESSAGE
  449.     mov    cl,PRINT
  450.     CALL    BDOS
  451.     mov    ax,TOTFIL    ;PRINT COUNT OF FILES
  452.     CALL    DECPRT
  453.     mov    dx,offset TOTMS3;TAIL OF MESSAGE
  454.     mov    cl,PRINT
  455.     CALL    BDOS
  456.     mov    cl,GALLOC    ;GET ADDRESS OF ALLOCATION VECTOR
  457.     push    es    ;save our ES
  458.     int    224    ;return bx=offset ALV, es=segment ALV
  459.     mov    dx,BLKMAX    ;GET ITS LENGTH
  460.     inc    dx
  461.     mov    cx,0    ;INIT BLOCK COUNT TO 0
  462. ;
  463. GSPBYT:    PUSH    bx    ;SAVE ALLOC ADDRESS
  464.     mov    al,es: [bx]
  465.     mov    bl,8    ;SET TO PROCESS 8 BLOCKS
  466. ;
  467. GSPLUP:    shl    al,1        ;TEST BIT
  468.     JB    NOTFRE
  469.     inc    cx
  470. ;
  471. NOTFRE:    dec    dx    ;COUNT DOWN BLOCKS
  472.     JZ    ENDALC    ;QUIT IF OUT OF BLOCKS
  473.     dec    bl    ;COUNT DOWN 8 BITS
  474.     JNZ    GSPLUP    ;DO ANOTHER BIT
  475.     POP    bx    ;BUMP TO NEXT BYTE
  476.     INC    bx    ;OF ALLOC. VECTOR
  477.     JMPS    GSPBYT    ;PROCESS IT
  478. ;
  479. ENDALC:    pop    es    ;restore our es
  480.     mov    ax,cx
  481.     mov    cl,BLKSHF    ;GET BLOCK SHIFT FACTOR
  482.     sub    cl,3    ;CONVERT FROM SECTORS TO K
  483.     JZ    PRTFRE    ;SKIP SHIFTS IF 1K BLOCKS
  484. ;
  485.     shl    ax,cl    ;mult blks by k/blk
  486. ;
  487. PRTFRE:    CALL    DECPRT    ;PRINT K FREE
  488.     mov    dx,offset TOTMS4
  489.     mov    cl,PRINT
  490.     CALL    BDOS
  491.     JMP    EXIT    ;ALL DONE...RETURN TO CP/M
  492. ;
  493. TOTMS1    DB    ' : Total of $'
  494. DRNAM    equ    TOTMS1
  495. TOTMS2    DB    'k in $'
  496. TOTMS3    DB    ' files with $'
  497. TOTMS4    DB    'k space remaining.$'
  498. ;
  499. FENCE:
  500.     IF    WIDE
  501.     CALL    SPACE
  502.     ENDIF
  503.     mov    al,DELIM    ;FENCE CHARACTER
  504.     CALL    TYPC    ;PRINT IT, FALL INTO SPACE
  505. ;
  506. SPACE:    mov    al,' '
  507. ;
  508. ;Type character in A
  509. ;
  510. TYPC:    PUSH    cx
  511.     PUSH    dx
  512.     push    bx
  513.     push    si
  514.     mov    dl,al    ;use bdos calls, that's what they're there for
  515.     mov    cl,dconio
  516.     call    bdos
  517.     pop    si
  518.     POP    bx
  519.     POP     dx
  520.     POP    cx
  521.     RET
  522. ;
  523. TYPCIT:    lods    al
  524.     CALL    TYPC
  525.     loop    TYPCIT
  526.     RET
  527. ;
  528. ;Fetch character from console (without echo)
  529. ;
  530. CINPUT:    mov    cl,dconio
  531.     mov    al,0ffh
  532.     call    BDOS
  533.     and    al,7FH
  534.     jz    CINPUT
  535.     RET
  536. ;
  537. CRLF:    mov    al,LINCNT    ;CHECK FOR END OF SCREEN
  538.     inc    al
  539.     cmp    al,LPS
  540.     JB    NOTEOS    ;SKIP MESSAGE IF MORE LINES LEFT ON SCREEN
  541.     mov    dx,offset EOSMSG;SAY WE'RE PAUSING FOR INPUT
  542.     mov    cl,PRINT
  543.     CALL    BDOS
  544.     CALL    CINPUT    ;WAIT FOR CHAR.
  545.     mov    al,0    ;SET UP TO ZERO LINE COUNT
  546. ;
  547. NOTEOS:    mov    LINCNT,al    ;SAVE NEW LINE COUNT
  548.     mov    al,13    ;print cr
  549.     call    TYPC
  550.     mov    al,10    ;lf
  551.     call    TYPC
  552. ;
  553.     IF    NOT WIDE
  554.     CALL    DRPRNT    ;DRIVE NAME
  555.     ENDIF
  556. ;
  557.     mov    cx,NPL    ;RESET NUMBER OF NAMES PER LINE
  558.     RET
  559. ;
  560. EOSMSG    DB    13,10,'(Strike any key to continue)$'
  561. ;
  562.     IF    NOT WIDE
  563. DRPRNT:    mov    al,DRNAM
  564.     JMP    TYPC
  565.     ENDIF
  566. ;
  567. ;Compare routine for sort
  568. ;
  569. COMPR:    mov    si,[bx]
  570.     mov    di,2[bx]
  571.     repe cmps al,al
  572.     ret
  573. ;
  574. ;
  575. ;Swap entries in the order table
  576. ;
  577. SWAP:    mov    SWITCH,1    ;SHOW A SWAP WAS MADE
  578.     mov    dx,[bx]
  579.     xchg    dx,2[bx]
  580.     mov    [bx],dx
  581.     ret
  582. ;
  583. ;Error exit
  584. ;
  585. ERXIT:    POP    dx    ;GET MSG
  586. ;
  587. ERXIT1:    mov    cl,PRINT
  588. ;
  589. CALLB:    CALL    BDOS    ;PERFORM REQUESTED FUNCTION
  590. ;
  591. ;(fall into exit)
  592. ;Exit - all done, restore stack
  593. ;
  594. EXIT:    mov    cl,0    ;exit is via BDOS call 0
  595. ;
  596. BDOS:    push    es    ;preserve es thru bdos call
  597.     int    224    ;call bdos 8086 style
  598.     pop    es
  599.     ret
  600. ;
  601. ;Temporary storage area
  602. ;
  603. BLKSHF    DB    0    ;# SHIFTS TO MULT BY SEC/BLK
  604. BLKMSK    DB    0    ;SEC/BLK - 1
  605. BLKMAX    DW    0    ;HIGHEST BLOCK # ON DRIVE
  606. DIRMAX    DW    0    ;HIGHEST FILE # IN DIRECTORY
  607. TOTSIZ    DW    0    ;TOTAL SIZE OF ALL FILES
  608. TOTFIL    DW    0    ;TOTAL NUMBER OF FILES
  609. LINCNT    DB    0    ;COUNT OF LINES ON SCREEN
  610. TBLOC    DW    0    ;POINTER TO START OF NAME TABLE
  611. NEXTT    DW    0    ;NEXT TABLE ENTRY
  612. COUNT    DW    0    ;ENTRY COUNT
  613. SCOUNT    DW    0    ;# TO SORT
  614. SWITCH    DB    0    ;SWAP SWITCH FOR SORT
  615. SUPSPC    DB    0FFH    ;LEADING SPACE FLAG FOR DECIMAL RTN.
  616. BUFAD    DW    BASE+80H ;OUTPUT ADDR
  617. SOPFLG    db    0    ;SET TO 'S' TO ALLOW SYS FILES TO PRINT
  618. USERNO    db    0    ;CONTAINS CURRENT USER NUMBER
  619. TEMP    dw    0    ;SAVE DIR ENTRY
  620. VERFLG    db    0    ;VERSION FLAG
  621. MPMFLG    db    0    ;MP/M FLAG
  622. LZFLG    db    0    ;0 WHEN PRINTING LEADING ZEROS
  623. ORDER    EQU    $    ;ORDER TABLE STARTS HERE
  624. ;
  625. ;BDOS equates
  626. ;
  627. RDCHR    EQU    1    ;READ CHAR FROM CONSOLE
  628. WRCHR    EQU    2    ;WRITE CHR TO CONSOLE
  629. DCONIO    EQU    6    ;direct console i/o
  630. PRINT    EQU    9    ;PRINT CONSOLE BUFF
  631. CONST    EQU    11    ;CHECK CONS STAT
  632. SELDSK    EQU    14    ;SELECT DISK
  633. FOPEN    EQU    15    ;0FFH=NOT FOUND
  634. FCLOSE    EQU    16    ;   "    "
  635. FSRCHF    EQU    17    ;   "    "
  636. FSRCHN    EQU    18    ;   "    "
  637. CURDSK    EQU    25    ;GET CURRENTLY LOGGED DISK NAME
  638. GALLOC    EQU    27    ;GET ADDRESS OF ALLOCATION VECTOR
  639. CURDPB    EQU    31    ;GET CURRENT DISK PARAMETERS
  640. CURUSR    EQU    32    ;GET CURRENTLY LOGGED USER NUMBER (2.x ONLY)
  641. ;
  642.     END
  643.