home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / UTILS / DIRUTL / MDIR21.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  12KB  |  535 lines

  1. ;            MDIR.ASM 2.1
  2. ;             revised 02/25/82
  3. ;
  4. ;       CP/M-2 MASTER DISK DIRECTORY PROGRAM
  5. ;            by Jeff Hammersley, MD.
  6. ;
  7. ; PRINTS A COMPLETE DISK DIRECTORY INCLUDING ALL USERS,
  8. ; SORTED ALPHABETICALLY AND PRINTED 4 WIDE.
  9. ;
  10. ; Based on 'FMAP' as originally written by Ward Christensen
  11. ; and its subsequent evolution to 'SDIR' by Keith Petersen.
  12. ;
  13. ;---------------------------------------------------------------;
  14. ;                                ;
  15. ; Commands:                            ;
  16. ;                                ;
  17. ; MDIR      returns all files on the default disk under any user. ;
  18. ;                                ;
  19. ; Note: optional drive name may be specified.            ;
  20. ;                                ;
  21. ;                                ;
  22. ; MDIR FILENAME.FILETYPE    searches for all files that match    ;
  23. ;        in all user areas.                ;
  24. ;                                ;
  25. ; MDIR S???.*  returns all 4 character files with any extention ;
  26. ;        in any user areas.                ;
  27. ;                                ;
  28. ;_______________________________________________________________;
  29. ; 02/25/82 FIXED PROBLEM WITH TOP-OF-MEMORY CHECK...PROGRAM NOW
  30. ;       KEEPS TRACK OF WHETHER OR NOT IT OVERWRITES CCP, AND
  31. ;       DOES A WARM BOOT IF NECESSARY.  ALSO ADDED TOP-OF-MEM
  32. ;       CHECK IN BLDORD (MISSED THAT IN VERSION 2.0).  THANKS
  33. ;       TO KEITH PETERSEN (W8SDZ) FOR POINTING OUT THESE DEF-
  34. ;       ICIENCIES.           RON FOWLER
  35. ;
  36. ; 01/11/81 FIXED PROBLEM WITH SYSTEMS USING NON-ZERO EXTENT MASKS
  37. ;       BY MODIFYING EXTENT CHECK WITHIN 80H BUFFER TO USE EXM
  38. ;       FIELD OF THE DISK PARAMETER BLOCK.
  39. ;       ALSO REMOVED "NAMES" COUNT, ADDED DYNAMIC MEMORY SIZING,
  40. ;       AND OUT-OF-MEMORY CHECK.
  41. ;       (you may wonder: "with the power of SD-4x, why bother
  42. ;       with MDIR?"...answer: "I like its simplicity.")
  43. ;       
  44. ;            -- RON FOWLER
  45. ;
  46. ;07/02/80 FIXED TO ALLOW MORE THAN 256 NAMES IN DIRECTORY,
  47. ;      PRINT DRIVE NAME, AND ALLOW SPECIFYING DRIVE.
  48. ;      BY KEITH PETERSEN, W8SDZ.
  49. ;
  50. ;07/30/80 FIXED TO ELIMINATE CRASH WHEN NO NAMES ARE IN
  51. ;      DIRECTORY. REPLACED DECIMAL OUTPUT ROUTINE WITH
  52. ;      SIMPLER ONE WHICH IS SMALLER AND ALLOWS USE OF
  53. ;      ONE LESS LEADING SPACE SO DISPLAY CAN BE PRINTED
  54. ;      ON A 72-CHARACTER PRINTER. (KBP)
  55. ;
  56. ;08/17/80 CORRECTED MISSING INR A IN SEARCH FIRST ROUTINE,
  57. ;      WHICH CAUSED DUPLICATE LISTING OF THIRD DIRECTORY
  58. ;      ENTRY. (KBP)
  59. ;
  60. BASE    SET    0
  61. ;
  62. ALTCPM    EQU    0    ;PUT 1 HERE FOR H8 OR TRS-80 CP/M
  63. ;
  64.     IF    ALTCPM
  65. BASE    SET    4200H
  66.     ENDIF
  67. ;
  68. GETVER    EQU    12    ;GET VERSION BDOS FUNCT #
  69. GETDPB    EQU    31    ;GET DPB ADRS BDOS FUNCT #
  70. ;
  71. FCB    EQU    BASE+5CH ;SYSTEM FCB
  72. NPL    EQU    4    ;NUMBER OF NAMES PER LINE
  73. CR    EQU    0DH    ;CARRIAGE RETURN
  74. LF    EQU    0AH    ;LINE FEED
  75. DELIM    EQU    ':'    ;FENCE (DELIMITER) CHARACTER
  76. ;
  77.     ORG    BASE+100H
  78. ;
  79.     JMP    START    ;JUMP AROUND I.D.
  80.     DB    'MDIR.COM 02/25/82 '
  81. ;
  82. ;SAVE THE STACK
  83. START    LXI    H,0
  84.     DAD    SP    ;H=STACK
  85.     SHLD    STACK    ;SAVE IT
  86.     LXI    SP,STACK ;GET NEW STACK
  87.     LDA    FCB
  88.     ORA    A    ;ANY DRIVE SPECIFIED?
  89.     JZ    FSPEC2
  90.     DCR    A    ;CORRECT DISK NUMBER FOR CP/M
  91.     PUSH    PSW    ;SAVE REQUESTED DISK NUMBER
  92.     MVI    C,CURDSK ;FIND OUT WHERE WE'RE LOGGED
  93.     CALL    BDOS
  94.     STA    CDSK    ;SAVE IT FOR LATER
  95.     POP    PSW    ;GET REQUESTED DISK NR.
  96.     MOV    E,A    ;TO E FOR CP/M
  97.     MVI    C,SELDSK ;SELECT DISK REQUESTED
  98.     CALL    BDOS
  99. ;
  100. FSPEC2    MVI    C,CURDSK ;FIND OUT WHERE WE'RE LOGGED
  101.     CALL    BDOS
  102.     ADI    'A'    ;MAKE PRINTABLE
  103.     STA    DRNAME
  104. ;PRINT HEADER
  105.     CALL    GETEXM    ;GET EXTENT MASK
  106.     CALL    FSPEC3
  107.     DB    CR,LF
  108.     DB    '...Master Directory - Drive '
  109. DRNAME    DB    'X:'
  110.     DB    CR,LF,CR,LF,'$'
  111. ;
  112. FSPEC3    POP    D
  113.     MVI    C,PRINT
  114.     CALL    BDOS
  115.     LXI    H,FCB+1
  116.     MOV    A,M    ;GET 1ST CHAR. OF NAME REQUEST
  117.     STA    SAVFCB    ;SAVE FOR LATER
  118. ;
  119. ;MAKE DR FIELD OF FCB '?' TO FORCE RETURN OF ALL USER ENTRIES
  120.     DCX    H    ;POINT TO DR FIELD
  121.     MVI    M,'?'    ;STORE '?' IN FCB
  122. ;
  123. ;RETURN ALL DIRECTORY ENTRIES
  124.     MVI    C,FSRCHF ;GET 'SEARCH FIRST' FNC
  125.     LXI    D,FCB
  126.     CALL    BDOS    ;READ FIRST
  127.     INR    A    ;COMPENSATE FOR LATER DCR
  128.     JMP    SOME    ;GOT SOME (BECAUSE OF ? IN DR FIELD)
  129. ;
  130. ;READ MORE DIRECTORY ENTRIES
  131. MOREDIR MVI    C,FSRCHN ;SEARCH NEXT
  132.     LXI    D,FCB
  133.     CALL    BDOS    ;READ DIR ENTRY
  134.     INR    A    ;CHECK FOR END (0FFH)
  135.     JZ    SPRINT    ;NO MORE - SORT & PRINT
  136. ;
  137. ;POINT TO DIRECTORY ENTRY 
  138. SOME    DCR    A    ;UNDO PREV 'INR A'
  139.     ANI    3    ;MAKE MODULUS 4
  140.     ADD    A    ;MULTIPLY...
  141.     ADD    A    ;..BY 32 BECAUSE
  142.     ADD    A    ;..EACH DIRECTORY
  143.     ADD    A    ;..ENTRY IS 32
  144.     ADD    A    ;..BYTES LONG
  145.     LXI    H,BASE+80H ;POINT TO BUFFER
  146.     ADD    L    ;POINT TO ENTRY
  147.     MOV    L,A    ;SAVE (CAN'T CARRY TO H)
  148. ;MOVE ENTRY TO TABLE
  149.     MOV    A,M    ;GET DR FIELD
  150.     CPI    0E5H    ;IS IT AN ERASED FILE ?
  151.     JZ    MOREDIR ;YES, IGNORE AND GET ANOTHER
  152.     XCHG        ;ENTRY TO DE
  153.     LXI    H,12    ;OFFSET TO EXTENT BYTE
  154.     DAD    D
  155.     LDA    EXTMSK    ;GET DPB EXTENT MASK
  156.     CMA        ;GET NOT(EXTMSK)
  157.     ANA    M    ;MASK OUT ZERO-EXT BITS
  158.     JNZ    MOREDIR ;IGNORE NON-ZERO PHYSICAL EXTENTS
  159.     LHLD    NEXTT    ;NEXT TABLE ENTRY TO HL
  160.     MVI    B,12    ;ENTRY LENGTH
  161.     LDA    BASE+7    ;GET TOP OF SYS PAGE #
  162.     MOV    C,A    ;INTO C REG
  163. ;
  164. TMOVE    LDAX    D    ;GET ENTRY CHAR
  165.     ANI    7FH    ;REMOVE ATTRIBUTES
  166.     MOV    M,A    ;STORE IN TABLE
  167.     INX    D
  168.     INX    H
  169.     MOV    A,H    ;SUBTRACT PTR FROM TOP
  170.     SUB    C
  171.     JNZ    OKMEM    ;JUMP, NOT OUT OF MEM
  172. ;
  173. MEMFUL: CALL    ERXIT    ;OOPS, END REACHED
  174.     DB    CR,LF,'OUT OF MEMORY'
  175.     DB    CR,LF,'$'
  176. ;
  177. OKMEM:    DCR    B    ;MORE?
  178.     JNZ    TMOVE
  179.     SHLD    NEXTT    ;SAVE UPDATED TABLE ADDR
  180.     LHLD    COUNT    ;GET PREV COUNT
  181.     INX    H    ;ADD ONE
  182.     SHLD    COUNT    ;RESAVE COUNT
  183.     JMP    MOREDIR
  184. ;
  185. ;SORT AND PRINT
  186. SPRINT    LHLD    NEXTT    ;DEFINE ORDER TABLE LOC
  187.     SHLD    ORDER
  188.     LHLD    COUNT    ;GET COUNT
  189.     MOV    A,H
  190.     ORA    L    ;CHECK FOR ZERO COUNT
  191.     JZ    NFEXIT    ;NOTHING IN DIRECTORY, EXIT
  192.     SHLD    OCOUNT    ;SAVE FOR ORDER TABLE COUNT
  193.     SHLD    SCOUNT    ;SAVE FOR SORT COUNT
  194.     LHLD    ORDER
  195.     LXI    D,TABLE
  196.     LXI    B,12    ;ENTRY LENGTH
  197. ;
  198. BLDORD    MOV    M,E    ;SAVE LO ORD ADDR
  199.     INX    H
  200.     MOV    M,D    ;SAVE HI ORD ADDR
  201.     INX    H
  202. ;
  203. ; TEST FOR MEMORY LIMIT EXCEEDED
  204. ;
  205.     LDA    BASE+7    ;GET TOP PAGE #
  206.     SUB    H    ;SUBTRACT CURRENT PAGE NUMBER
  207.     JZ    MEMFUL    ;ERROR OUT WHEN WE GET TOO HIGH
  208.     XCHG        ;TABLE ADDR TO HL
  209.     DAD    B    ;POINT TO NEXT ENTRY
  210.     XCHG        ;NEXT ENTRY TO DE
  211.     PUSH    H
  212.     LHLD    OCOUNT    ;GET COUNT
  213.     DCX    H    ;ONE LESS
  214.     SHLD    OCOUNT    ;SAVE NEW COUNT
  215.     MOV    A,L
  216.     ORA    H    ;MORE?
  217.     POP    H
  218.     JNZ    BLDORD    ;..YES
  219.     SHLD    HIMEM    ;SAVE FOR CCP REBOOT FLAG
  220.     LHLD    COUNT    ;GET COUNT
  221.     DCX    H
  222.     MOV    A,L
  223.     ORA    H    ;ONLY 1 ENTRY?
  224.     JZ    DONE    ;..YES, SO SKIP SORT
  225. ;
  226. SORT    XRA    A    ;GET A ZERO
  227.     STA    SWITCH    ;SHOW NONE SWITCHED
  228.     LHLD    SCOUNT    ;GET COUNT
  229.     DCX    H    ;USE 1 LESS
  230.     SHLD    TEMP    ;SAVE # TO COMPARE
  231.     SHLD    SCOUNT    ;SAVE HIGHEST ENTRY
  232.     MOV    A,L
  233.     ORA    H
  234.     JZ    DONE    ;EXIT IF NO MORE
  235.     LHLD    ORDER    ;POINT TO ORDER TABLE
  236. ;
  237. SORTLP    CALL    COMPR    ;COMPARE 2 ENTRIES
  238.     CM    SWAP    ;SWAP IF NOT IN ORDER
  239.     INX    H    ;BUMP ORDER
  240.     INX    H    ;..TABLE POINTER
  241.     PUSH    H
  242.     LHLD    TEMP    ;GET COUNT
  243.     DCX    H    ;ONE LESS
  244.     SHLD    TEMP    ;SAVE COUNT
  245.     MOV    A,L
  246.     ORA    H    ;DONE?
  247.     POP    H
  248.     JNZ    SORTLP    ;CONTINUE
  249. ;ONE PASS OF SORT DONE
  250.     LDA    SWITCH    ;ANY SWAPS DONE?
  251.     ORA    A
  252.     JNZ    SORT
  253. ;
  254. ;SORT IS ALL DONE - PRINT ENTRIES
  255. DONE    LHLD    ORDER
  256.     SHLD    NEXTT
  257. ;
  258. ;PRINT AN ENTRY
  259.     MVI    C,NPL    ;NR. OF NAMES PER LINE
  260. ;
  261. ENTRY:    PUSH    B
  262.     MVI    C,CONST ;CK STATUS OF KBD
  263.     CALL    BDOS    ;ANY KEY PRESSED?
  264.     POP    B
  265.     ORA    A
  266.     JNZ    ABORT    ;YES, ABORT
  267.     LHLD    NEXTT    ;GET ORDER TABLE POINTER
  268.     MOV    E,M    ;GET LO ADDR
  269.     INX    H
  270.     MOV    D,M    ;GET HI ADDR
  271.     INX    H
  272.     SHLD    NEXTT    ;SAVE UPDATED TABLE POINTER
  273.     XCHG        ;TABLE ENTRY TO HL
  274.     LDA    SAVFCB    ;GET SAVED 1ST CHAR. OF FCB
  275.     CPI    ' '    ;WAS NAME SPECIFIED?
  276.     JNZ    MATCH    ;YES, GO SEE IF PRESENT
  277. ;
  278. ;PRINT USER #
  279. PTONE    MOV    A,M    ;GET USER NUMBER
  280.     CPI    32    ;IS IT VALID ? (IE.< 32)
  281.     JNC    NULL    ; NO, IGNORE IT
  282.     ORA    A    ;IS IT USER 0 ?
  283.     JNZ    PTONE2    ;NO, SKIP NEXT ROUTINE
  284.     CALL    SPACE2    ;USER 0, FILL WITH SPACES
  285.     JMP    PTONE3    ;SKIP DECOUT PRINT
  286. ;
  287. PTONE2    PUSH    H
  288.     MVI    H,0
  289.     MOV    L,A    ;NUMBER TO L FOR DECOUT
  290.     CPI    10    ;LESS THAN 10?
  291.     CC    SPACE    ;YES, ADD ONE SPACE
  292.     CALL    DECOUT    ;PRINT USER NUMBER
  293.     POP    H
  294. ;
  295. PTONE3    CALL    SPACE    ;MAKE IT LOOK NICE
  296.     INX    H    ;POINT TO NAME
  297.     MVI    B,8    ;FILE NAME LENGTH
  298.     CALL    TYPEIT    ;TYPE FILENAME
  299.     CALL    PERIOD    ;PERIOD AFTER FN
  300.     MVI    B,3    ;GET THE FILETYPE
  301.     CALL    TYPEIT
  302.     DCR    C    ;ONE LESS ON THIS LINE
  303.     PUSH    PSW
  304.     CNZ    FENCE    ;NO CR-LF NEEDED, DO FENCE
  305.     POP    PSW
  306.     CZ    CRLF    ;CR-LF NEEDED
  307. ;
  308. ;SEE IF MORE ENTRIES
  309. NULL    PUSH    H
  310.     LHLD    COUNT
  311.     DCX    H
  312.     SHLD    COUNT
  313.     MOV    A,L
  314.     ORA    H
  315.     POP    H
  316.     JNZ    ENTRY    ;YES, MORE
  317.     JMP    EXIT
  318. ;
  319. MATCH    PUSH    D    ;SAVE DE
  320.     PUSH    H    ;SAVE HL
  321.     LXI    D,FCB    ;GET FCB REQUEST
  322.     INX    H    ;MOVE TO FN.FT
  323.     INX    D    ;
  324.     MVI    B,11    ;GET NUMBER OF CHARACTERS TO COMPARE
  325. ;
  326. MAT1    LDAX    D    ;GET CHARACTER
  327.     CPI    '*'    ;IS FILENAME OR FILETYPE AMBIGUOUS ?
  328.     JZ    WHCH    ; YES, DETERMINE WHICH ONE
  329.     CPI    '?'    ;IS IT A AMBIGUOUS CHARACTER ?
  330.     JZ    AMBC    ; YES
  331.     CMP    M    ;COMPARE TO MEMORY
  332.     JNZ    NOMATCH ;MATCH FAILURE
  333. ;
  334. AMBC    INX    D
  335.     INX    H    ;GET NEW CHARACTERS
  336.     DCR    B    ;ARE WE DONE ?
  337.     JNZ    MAT1    ;NO, COMPARE NEXT
  338. ;
  339. FTYP    POP    H
  340.     POP    D    ;RESTORE REGISTERS
  341.     JMP    PTONE    ;GO PRINT ONE
  342. ;
  343. ; SUBROUTINE TO RETRIEVE EXTENT MASK FROM DISK PARM BLK
  344. ;
  345. GETEXM: MVI    C,GETVER ;GET CP/M VERSION NUMBER
  346.     CALL    BDOS
  347.     MOV    A,H
  348.     ORA    L    ;TEST FOR VERS 1.4
  349.     JZ    PUTEXM    ;MOVE THE ZERO EXTMSK IF 1.4
  350.     MVI    C,GETDPB ;IS CPM >1.4, GET DPB ADRS
  351.     CALL    BDOS
  352.     LXI    D,4    ;INDEX TO EXTMSK
  353.     DAD    D
  354.     MOV    A,M    ;FETCH EXTENT MASK
  355. ;
  356. PUTEXM: STA    EXTMSK    ;PUT IT AWAY
  357.     RET
  358. ;
  359. WHCH    MOV    A,B    ;GET B
  360.     CPI    3    ;IS IT STILL THE FILENAME ?
  361.     JC    FTYP    ; NO, IT IS ANY TYPE SO WE ARE DONE.
  362.     MVI    B,3    ;YES, LOAD UP TO FILETYPE
  363.     JMP    MAT1    ;RETURN FOR MORE
  364. ;
  365. NOMATCH POP    H
  366.     POP    D    ;RESTORE REGISTERS
  367.     JMP    NULL    ;GET NEW FILENAME TO TRY
  368. ;
  369. PERIOD    MVI    A,'.'
  370.     JMP    TYPE
  371. ;
  372. FENCE    CALL    SPACE2
  373.     MVI    A,DELIM ;FENCE CHARACTER
  374.     JMP    TYPE
  375. ;
  376. SPACE3    CALL    SPACE
  377. ;
  378. SPACE2    CALL    SPACE
  379. ;
  380. SPACE    MVI    A,' '
  381. ;
  382. ;TYPE CHAR IN A
  383. TYPE    PUSH    B
  384.     PUSH    D
  385.     PUSH    H
  386.     MOV    E,A
  387.     MVI    C,WRCHR
  388.     CALL    BDOS
  389.     POP    H
  390.     POP    D
  391.     POP    B
  392.     RET
  393. ;
  394. TYPEIT    MOV    A,M
  395.     CALL    TYPE
  396.     INX    H
  397.     DCR    B
  398.     JNZ    TYPEIT
  399.     RET
  400. ;
  401. CRLF    MVI    A,CR    ;CARRIAGE RETURN
  402.     CALL    TYPE
  403.     MVI    A,LF    ;LINE FEED
  404.     CALL    TYPE
  405.     MVI    C,NPL    ;NUMBER OF NAMES PER LINE
  406.     RET
  407. ;
  408. ;DECIMAL OUTPUT ROUTINE
  409. ;
  410. DECOUT: PUSH    B
  411.     PUSH    D
  412.     PUSH    H
  413.     LXI    B,-10
  414.     LXI    D,-1
  415. ;
  416. DECOU2: DAD    B
  417.     INX    D
  418.     JC    DECOU2
  419.     LXI    B,10
  420.     DAD    B
  421.     XCHG
  422.     MOV    A,H
  423.     ORA    L
  424.     CNZ    DECOUT
  425.     MOV    A,E
  426.     ADI    '0'
  427.     CALL    TYPE
  428.     POP    H
  429.     POP    D
  430.     POP    B
  431.     RET
  432. ;
  433. ;COMPARE ROUTINE FOR SORT
  434. COMPR    PUSH    H    ;SAVE TABLE ADDR
  435.     MOV    E,M    ;LOAD LO
  436.     INX    H
  437.     MOV    D,M    ;LOAD HI
  438.     INX    H
  439.     MOV    C,M
  440.     INX    H
  441.     MOV    B,M
  442. ;BC, DE NOW POINT TO ENTRIES TO BE COMPARED
  443.     XCHG
  444. ;
  445. CMPLP    LDAX    B
  446.     CMP    M
  447.     INX    H
  448.     INX    B
  449.     JZ    CMPLP
  450.     POP    H
  451.     RET        ;COND CODE TELLS ALL
  452. ;
  453. ;SWAP ENTRIES IN THE ORDER TABLE
  454. SWAP    MVI    A,1
  455.     STA    SWITCH    ;SHOW A SWAP WAS MADE
  456.     MOV    C,M
  457.     INX    H
  458.     PUSH    H    ;SAVE TABLE ADDR+1
  459.     MOV    B,M
  460.     INX    H
  461.     MOV    E,M
  462.     MOV    M,C
  463.     INX    H
  464.     MOV    D,M
  465.     MOV    M,B
  466.     POP    H
  467.     MOV    M,D
  468.     DCX    H    ;BACK POINTER TO CORRECT LOC'N
  469.     MOV    M,E
  470.     RET
  471. ;
  472. NFEXIT    CALL    ERXIT
  473.     DB    '++NO FILES ON THIS DISK',CR,LF,'$'
  474. ;
  475. ;ERROR EXIT
  476. ERXIT    POP    D    ;GET MSG
  477.     MVI    C,PRINT
  478.     JMP    CALLB    ;PRINT MSG, EXIT
  479. ;
  480. ;ABORT - READ CHAR ENTERED
  481. ABORT    MVI    C,RDCHR ;DELETE THE CHAR
  482. ;
  483. CALLB    CALL    BDOS
  484. ;
  485. ;FALL INTO EXIT
  486. ;EXIT - ALL DONE, RESTORE DISK LOG IN AND STACK
  487. EXIT    LDA    CDSK    ;GET ORIGINAL DISK NR.
  488.     MOV    E,A    ;TO E FOR CP/M
  489.     MVI    C,SELDSK ;RESTORE LOG-IN TO IT
  490.     CALL    BDOS
  491.     LHLD    BASE+6    ;GET TOP-OF-MEMORY PTR
  492.     MVI    L,0    ;ROUND TO PAGE ADRS
  493.     LXI    D,-800H ;SUBTRACT SIZE OF CCP
  494.     DAD    D
  495.     XCHG        ;DE=@CCP
  496.     LHLD    HIMEM    ;FETCH OUR HIGHEST USED
  497.     MOV    A,L    ;SUBTRACT: HIMEM-CCPLOC
  498.     SUB    E
  499.     MOV    A,H
  500.     SBB    D
  501.     JC    BASE    ;MUST WARM-BOOT, CCP NOT THERE
  502.     LHLD    STACK    ;GET OLD STACK
  503.     SPHL        ;MOVE TO STACK
  504.     RET        ;..AND RETURN
  505. ;
  506. HIMEM:    DW    0    ;HIGHEST MEMORY USED
  507. EXTMSK: DB    0    ;EXTENT MASK
  508. NEXTT    DW    TABLE    ;NEXT TABLE ENTRY
  509. COUNT    DW    0    ;ENTRY COUNT
  510. SWITCH    DB    0    ;SWAP SWITCH FOR SORT
  511. SAVFCB    DS    1    ;SAVED 1ST CHAR. OF FCB
  512. CDSK    DS    1    ;CURRENTLY LOGGED DISK NUMBER
  513. OCOUNT    DS    2    ;# NAMES TO PUT IN ORDER TABLE
  514. SCOUNT    DS    2    ;# TO SORT
  515. TEMP    DS    2    ;SAVE DIR ENTRY
  516. ORDER:    DS    2    ;LOC OF ORDER TABLE (TWO BYTES PER NAME)
  517.     DS    60    ;STACK AREA
  518. STACK    DS    2    ;SAVE OLD STACK HERE
  519. TABLE    EQU    $    ;READ ENTRIES IN HERE
  520. ;
  521. ; BDOS EQUATES
  522. ;
  523. RDCHR    EQU    1    ;READ CHAR FROM CONSOLE
  524. WRCHR    EQU    2    ;WRITE CHR TO CONSOLE
  525. PRINT    EQU    9    ;PRINT CONSOLE BUFF
  526. CONST    EQU    11    ;CHECK CONS STAT
  527. SELDSK    EQU    14    ;SELECT DISK DRIVE
  528. FSRCHF    EQU    17    ;   "   "
  529. FSRCHN    EQU    18    ;   "   "
  530. CURDSK    EQU    25    ;CHECK CURRENT DISK 0=A: 1=B:, ETC.
  531. BDOS    EQU    BASE+5
  532. ;
  533.     END
  534.