home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv017.ark / XDIR.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  13KB  |  534 lines

  1.     TITLE    'XDIR - CP/M DIRECTORY DISPLAY PROGRAM'
  2. ;            -  XDIR -
  3. ;                    BY S J SINGER
  4. ;MODIFICATIONS
  5. ;    MAY 15, 1980 - ADDED SUPPORT FOR DRIVES A-D
  6. ;    MAY 15, 1980 - CHANGED THE DISPLAY TO 18 LINES
  7. ;    MAY 15, 1980 - FIXED BUG WITH DIR EXTENTS NOT BEING IN
  8. ;               ORDER.  IF A LARGER EXTENT CAME BEFORE
  9. ;               EXTENT ZERO, THE PROGRAM WOULD LOOP INFINITELY.
  10. ;    MAY 24, 1980 - CHANGED SO THAT DIR ENTRIES ARE READ VIA
  11. ;            BDOS CALLS (011H AND 012H).  
  12. ;    MAY 24, 1980 - CHANGED SO THAT SPACE INFO IS GOTTEN IN
  13. ;            ACCORDANCE WITH CP/M 2.0 AND ABOVE.
  14. ;
  15. ;    XDIR IS A CPM UTILITY THAT DISPLAYS A DISK DIRECTORY IN A MORE
  16. ;READABLE FORM. THE DIRECTORY IS READ FROM THE SPECIFIED DISK, SORTED
  17. ;THEN DISPLAYED IN A 3 COLUMN FORMAT. BOTH THE FILE NAMES AND FILE SIZES 
  18. ;IN 1 K GROUPS ARE DISPLAYED.
  19. ;    THE PRESENT VERSION OF XDIR HAS CERTAIN MINOR LIMITATIONS WHICH
  20. ;MAY BE EASILY REMOVED IF THEY CAUSE PROBLEMS.
  21. ;
  22. ;    1.  ONLY 54 FILES ARE DISPLAYED. THIS LIMIT IS SUFFICIENT FOR
  23. ;        ALMOST ALL DISKS AND LEAVES ROOM ON THE SCREEN FOR EDITING.
  24. ;        TO CHANGE THE NO OF LINES DISPLAYED, CHANGE THE LINES VARIABLE
  25. ;        IN THE DATA ALLOCATION SECTION OF THE PROGRAM. FOR EXAMPLE
  26. ;        TO DISPLAY A MAXIMUM OF 54 FILES CHANGE LINES TO 18.
  27. ;
  28. ;    OCCASIONALLY THE FILE NAMES WILL BE DISPLAYED WITH THE FORMAT
  29. ;SCRAMBLED OR THE SPACE REMAINING ON THE DISK WILL NOT AGREE WITH THAT REPORTED
  30. ;BY THE STAT UTILITY. THIS ALMOST ALWAYS MEANS THE DISK DIRECTORY HAS BEEN
  31. ;MESSED UP SOMEHOW. USUALLY THE PROBLEM CAN BE CORRECTED BY COPYING ALL THE
  32. ;FILES TO ANOTHER DISK USING PIP.
  33. ;    XDIR WAS ASSEMBLED USING THE NEW CP/M MACRO ASSEMBLER AND USES A LARGE
  34. ;NUMBER OF MACROS. THESE ARE CONTAINED IN A LIBRARY CALLED MACRO.LIB WHICH
  35. ;IS REQUIRED IF THE PROGRAM IS TO BE REASSEMBLED.
  36. ;
  37. ;
  38. ;        COMMAND FORMAT
  39. ;
  40. ;    XDIR            DISPLAY DIRECTORY OF LOGGED DISK
  41. ;    XDIR A            DISPLAY DIRECTORY OF DISK A
  42. ;    XDIR B            DISPLAY DIRECTORY OF DISK B
  43. ;    XDIR C            DISPLAY DIRECTORY OF DISK C
  44. ;    XDIR D            DISPLAY DIRECTORY OF DISK D
  45. ;
  46. ;
  47. ;    THE PROGRAM STARTS READING THE CP/M DIRECTORY UNTIL AN EOF OCCURS.
  48. ;AS IT READS EACH ENTRY, IT MAINTAINS A TABLE OF ALL FILES.  THE TABLE CON-
  49. ;TAINS ONE ENTRY FOR EACH FILE FROM ITS LARGEST EXTENT.  WHEN ALL FILES ARE
  50. ;IN THE TABLE, IT SORTS THEM USING QUICKSORT AND AN AUXILIARY ADDRESS TABLE.
  51. ;WHEN THE SORT COMPLETES, THE FILE TABLE IS PRINTED IN THE ORDER OF THE AUX
  52. ;ADDRESS TABLE AND CONTROL IS GIVEN BACK TO CP/M.
  53.  
  54. ;        * * *  COMMON EQUATES  * * *
  55. LINES    EQU    18    ;LINES PER PAGE OF DISPLAY
  56. MAXDIR    EQU    128    ;MAXIMUM NUMBER OF DIRECTORY ENTRIES
  57.  
  58.     MACLIB    MACRO        ;INCLUDE MACRO LIBRARY
  59.     PAGE
  60. ;************************************************
  61. ;*        PROGRAM INITIALIZATION        *
  62. ;************************************************
  63.  
  64.     ORG    100H        ;SET PROG START
  65.     LXI    H,0
  66.     DAD    SP        ;GET OLD STACK POINTER
  67.     SHLD    OLDSTK        ;SAVE IT
  68.     LXI    SP,NEWSTK    ;LOAD NEW STACK POINTER
  69. ;
  70. ;    START OF DIRECTORY ROUTINE READ IN GROUPS 0 AND 1 AND STORE
  71. ;    DIRECTORY FILE NAMES NOT FLAGGED E5.  IF EXTENT NOT ZERO STORE
  72. ;    OVER PREVIOUS FILE NAME. TABLE OF POINTERS WILL BE BUILT IN PDIR
  73. ;
  74. DIR:    DISKIO    ?DRIVE
  75.     STA    NEWDRV
  76.     LDA    81H
  77.     ORA    A        ;CHECK IF INPUT BUFFER EMPTY
  78.     JZ    DDD
  79.     LDA    82H        ;CHECK NEW DRIVE (A-D)
  80.     CPI    'A'
  81.     JC     DSKERR
  82.     CPI    'D'+1
  83.     JNC    DSKERR
  84.     SUI    'A'        ;MAKE IT RELATIVE TO ZERO.
  85.     STA    NEWDRV        ;SAVE IT.
  86. DDD:    PRINT    <CR,LF,LF,'                        DIRECTORY DRIVE - '>
  87.     LDA    NEWDRV        ;LOGGED DISK
  88.     ADI    'A'        
  89.     CHAROUT
  90.     PRINT    <CR,LF,LF>
  91.     CALL    FIXB        ;RESTORE DRIVE.
  92.  
  93. ;        GET THE CURRENT DISK MAX VALUE.
  94.     MVI    C,01FH        ;GET DPB ADR FROM CP/M.
  95.     CALL    5
  96.     SHLD    DPBADR        ;SAVE IT.
  97.     LXI    D,2        ;GET THE BSH.
  98.     DAD    D
  99.     MOV    A,M        ;SAVE IT.
  100.     STA    DSKBSH
  101.     MOV    C,A        ;  AGAIN.
  102.     INX    H        ;GET THE BLM FOR LATER.
  103.     MOV    A,M
  104.     STA    DSKBLM        ;SAVE IT.
  105.     MOV    A,C        ;CONVERT BSH TO REL SHIFT.
  106.     SUI    3
  107.     MOV    C,A        ;SAVE IT.
  108.     INX    H        ;GET THE DSM.
  109.     INX    H
  110.     MOV    E,M
  111.     INX    H
  112.     MOV    D,M
  113.     INX    H
  114.     XCHG
  115.     INX    H        ;MAKE IT RELATIVE TO ONE.
  116.     DCR    C        ;SHIFT MAX BY (C) TIMES.
  117.     INR    C
  118.     JZ    $+8
  119.     DAD    H    
  120.     DCR    C
  121.     JMP    $-7
  122.     SHLD    MAXSTR        ;SAVE VALUE.
  123.  
  124. ;        GET DIRECTORY SIZE.
  125.     XCHG            ;HL = DPBDRM
  126.     MOV    E,M    
  127.     INX    H
  128.     MOV    D,M
  129.     XCHG
  130.     INX    H        ;MAKE IT RELATIVE TO ONE.
  131.     LXI    D,32-1        ;ROUND IT TO EVEN # OF K.
  132.     DAD    D
  133.     HALF            ;DIVIDE IT BY 32 (# IN 1K).
  134.     HALF            ;/4
  135.     HALF            ;/8
  136.     HALF            ;/16
  137.     HALF            ;/32
  138.     SHLD    DIRSIZ        ;SAVE IT.
  139.  
  140. ;        ADJUST MAX SIZE BY DIRECTORY SIZE.
  141.     LHLD    MAXSTR
  142.     DSUB    DIRSIZ
  143.     SHLD    MAXSTR
  144.  
  145.  
  146. DIR2:    XRA    A
  147.     STA    COUNT        ;COUNT OF DIRECTORY ENTRIES
  148.  
  149. ;    FILL    PDIR,PDIR+(2*(MAXDIR+1)) ;ZERO DIR PTR TABLE
  150.     LXI    H,PDIR
  151.     LXI    D,2*(MAXDIR+1)
  152.     MVI    M,0
  153.     INX    H
  154.     DCX    D
  155.     MOV    A,E
  156.     ORA    D
  157.     JNZ    $-6
  158.  
  159.     LXI    H,DIRBUF    ;POINTS TO DIRECTORY BUFFER
  160.     SHLD    OUTB
  161.     LXI    H,PDIR        ;POINTER TABLE
  162.     SHLD    IPOINT
  163.     LDA    NEWDRV
  164.     MOV    E,A
  165.     DISKIO    LOGIN        ;LOG IN NEW DRIVE NO
  166. DIR4:    LXI    H,80H        ;POINTS TO INPUT BUFFER
  167.     SHLD    INB
  168.     MVI    C,01AH        ;ISSUE SET DMA.
  169.     XCHG
  170.     CALL    5
  171.     MVI    C,011H        ;ISSUE DIR FIRST GET.
  172.     LXI    D,DIRFCB
  173.     CALL    5
  174.     JMP    DIR6
  175.  
  176. ;        GET NEXT DIR BUFFER.
  177. DIR5:
  178.     MVI    C,012H
  179.     CALL    5
  180.     CPI    255        ;END OF DIR?
  181.     JZ    SORT        ;...YES, GO SORT TABLE.
  182.     ADD    A        ;CONVERT # TO DISP.
  183.     ADD    A
  184.     ADD    A
  185.     ADD    A
  186.     ADD    A
  187.     ADI    80H        ;ADD IN BUFFER ADDRESS.
  188.     MOV    L,A
  189.     MVI    H,0
  190.     SHLD    INB        ;SAVE PTR.
  191.  
  192. ;        SEE IF EOF.
  193. DIR6:    LHLD    OUTB        ;LOAD DESTINATION POINTER
  194.     XCHG            ;PUT IT IN DE
  195.     LHLD    INB        ;LOAD SOURCE POINTER
  196.     MVI    A,0E5H        ;FLAG BYTE
  197.     CMP    M        ;TEST FIRST BYTE
  198.     JNZ    DIR8
  199.     INX    H
  200.     CMP    M        ;TEST SECOND BYTE
  201.     JZ    SORT        ;SORT DIRECTORY
  202.     JMP    DIR12A
  203.  
  204.  
  205. DIR8:
  206. ;        IF ITS THE ZERO ENTRY, ADD IT TO TABLE.
  207.     INX    H
  208.     SAVE    H,D
  209.  
  210. ;        SCAN TABLE TO SEE IF AN EXTENT EXISTS FOR THE FILE.
  211.     LXI    H,0        ;SEARCH FOR SAME NAME AND SWITCH
  212.     SHLD    J        ;INITIALIZE INDEX
  213. DIR9:    DLOAD    PDIR,J
  214.     MOV    A,H
  215.     ORA    L
  216.     JZ    DIR10        ;ERROR TABLE EMPTY
  217.     XCHG
  218.     LHLD    INB        ;POINTER TO NEW DIR ENTRY
  219.     SAVE    D,H
  220.     INX    H
  221.     MATCH    ,,11        ;COMPARE 11 CHARAACTERS
  222.     RESTORE    H,D
  223.     JZ    SWITCH        ;STORE NEW ENTRY OVER OLD
  224.     INDEX    J,2        ;INCR INDEX BY 2
  225.     JMP    DIR9
  226.  
  227. ;        REPLACE EXTENT IN TABLE IF ITS GREATER.
  228. SWITCH:
  229.     CALL    CLCSPC        ;GET NUMBER OF GROUPS.
  230.     XCHG
  231.     LXI    B,11        ;ADD IT TO CNT IN TBL.
  232.     DAD    B
  233.     ADD    M
  234.     MOV    M,A
  235.     JNC    $+5
  236.     INX    H
  237.     INR    M
  238.     JMP    DIR12
  239.  
  240. ;        INSERT ENTRY IN TABLE.
  241. DIR10:    RESTORE    D,H
  242.     SAVE    D,H
  243.     MOVE    ,,15        ;MOVE THE DIRECTORY ENTRY
  244.     RESTORE H,D
  245.     LXI    H,12        ;MOVE # OF GRPS TO EX.
  246.     DAD    D
  247.     CALL    CLCSPC        ;GET NUMBER OF CPM GROUPS.
  248.     MVI    M,0        ;ZERO S1.
  249.     DCX    H
  250.     MOV    M,A
  251.     LDA    COUNT
  252.     INR    A
  253.     STA    COUNT        ;INCR COUNT OF DIRECTORY ENTRIES
  254.     LHLD    OUTB
  255.     DSTORE    0,IPOINT    ;INDEXED STORE HL
  256.     INDEX    OUTB,16
  257.     INDEX    IPOINT,2
  258.     JMP    DIR12A
  259.  
  260. ;        BUMP INPUT POINTERS AND CHECK FOR END OF BUFFER.
  261. DIR12:
  262.     RESTORE    H
  263. DIR12A:
  264.     JMP    DIR5        ;READ ANOTHER BLOCK FROM DIRECTORY
  265.  
  266. ;        GET NUMBER OF CP/M GROUPS IN THIS EXTENT.
  267. CLCSPC:    SAVE    B,D,H
  268.     LHLD    INB        ;POINT TO EXTENT GROUP #'S.
  269.     LXI    D,16
  270.     DAD    D
  271.     MVI    B,0        ;ZERO COUNT.
  272.     MVI    C,16        ;SET FOR MAX # OF GROUPS.
  273. CLCLP:
  274.     MOV    A,M        ;GET A GROUP #.
  275.     ORA    A        ;ALLOCATED?
  276.     JZ    $+4        ;...NO.
  277.     INR    B        ;...YES, BUMP COUNT.
  278.     INX    H        ;BUMP GROUP PTR.
  279.     DCR    C        ;DECR COUNT.
  280.     JNZ    CLCLP        ;LOOP FOR ALL ENTRIES.
  281.     MOV    A,B        ;GET COUNT.
  282.     RESTORE H,D,B
  283.     RET
  284.  
  285.  
  286.  
  287. ;    THIS ROUTINE PRINTS THE DIRECTORY IN 3 COLUMNS. NO OF LINES
  288. ;    PRINTED IS CONTROLED BY VARIABLE LINES. ALL DIRECTORY NAMES
  289. ;    ARE PRESENT IN TABLE BUT ONLY A MAXIMUM OF 3*LINES WILL BE
  290. ;    PRINTED.
  291. ;
  292. DIR14:    LXI    H,0
  293.     SHLD    W        ;INITIALIZE ALLOCATION
  294.     SHLD    I        ;INITIALIZE INDEX
  295. DIR16:    DLOAD    PDIR,I        ;INDEX LOAD POINTER
  296.     DJZ    ENDFIL        ;EXIT IF POINTER ZERO
  297.     CALL    DIR20        ;CALL PRINT ROUTINE FOR AN ENTRY.
  298.     PRINT    '         '
  299.     DLOAD    PDIR+LINES*2,I    ;POINTER COL 2
  300.     DJZ    DIR18        ;NO PRINT IF ZERO
  301.     CALL    DIR20        ;PRINT IT
  302.     PRINT    '         '
  303.     DLOAD    PDIR+LINES*4,I    ;POINTER COL 3
  304.     DJZ    DIR18
  305.     CALL    DIR20        ;CALL PRINT ROUTINE
  306. DIR18:    PRINT    CRLF,$
  307.     INDEX    I,2        ;INCR INDEX BY 2
  308.     LXI    D,LINES*2    ;CHECK INDEX LIMIT
  309.     CPHL
  310.     JZ    ENDFIL        ;EXIT WHEN INDEX 32
  311.     JMP    DIR16        ;PRINT SOME MORE
  312.  
  313.  
  314. ;    *** SUBROUTINE TO PRINT A SINGLE DIRECTORY ENTRY ***
  315. ;
  316. ;        PRINT THE FILE NAME.
  317. DIR20:    MVI    C,11        ;NAME LENGTH
  318. DIR22:    SAVE    B,H        ;SAVE REGISTERS
  319.     MOV    A,M        ;GET A CHAR.
  320.     ANI    07FH        ;REMOVE POSSIBLE INDICATOR.
  321.     CHAROUT            ;PUT IT TO THE CONSOLE.
  322.     RESTORE    H,B        ;RESTORE THE REGISTERS
  323.     INX    H        ;INCR NAME POINTER
  324.     DCR    C        ;DECR CHAR COUNT
  325.     JNZ    DIR22        ;LOOP FOR LENGTH OF NAME.
  326.  
  327. ;        CALCULATE AND PRINT THE FILE SIZE.
  328. DIR24:
  329.     MOV    E,M        ;DE = # OF ALLOCATED GROUPS
  330.     INX    H
  331.     MOV    D,M
  332.     XCHG
  333.  
  334.     LDA    DSKBSH        ;CONVERT CP/M GROUP BACK TO K.
  335.     SUI    3
  336.     JZ    $+8
  337.     DAD    H
  338.     DCR    A
  339.     JNZ    $-2
  340.     SAVE    H
  341.  
  342.     XCHG            ;ADD IT TO CUM TOTAL.
  343.     LHLD    W
  344.     DAD    D
  345.     SHLD    W
  346.     
  347.     PRINT    ' '
  348.     POP    H
  349.     PUSH    H
  350.     LXI    D,1000
  351.     CPHL
  352.     JNC    DIR30
  353.     PRINT    ' '
  354.     POP    H
  355.     PUSH    H
  356.     LXI    D,100
  357.     CPHL
  358.     JNC    DIR30
  359.     PRINT    ' '
  360.     POP    H
  361.     PUSH    H
  362.     LXI    D,10
  363.     CPHL
  364.     JNC    DIR30
  365.     PRINT    ' '
  366. DIR30:    POP    H
  367.     DECOUT
  368.     PRINT    'K'
  369.     RET
  370. ;
  371. ;
  372. ;    THIS ROUTINE RESTORES DRIVE B
  373. ;
  374. FIXB:    LDA    NEWDRV        ;CHECK DRIVE NO
  375.     ORA    A
  376.     RZ            ;RETURN IF DRIVE A
  377.     LDA    NEWDRV        ;SELECT THE DRIVE.
  378.     MOV    E,A
  379.     DISKIO    LOGIN
  380.     RET
  381. ;
  382. ;    THIS IS THE EXIT POINT FROM THE PROGRAM. PRINT NO OF FILES AND
  383. ;    SPACE REMAINING, RELOAD OLD STACK POINTER AND RETURN BACK TO CCP.
  384. ;
  385. ENDFIL:    PRINT    <CR,LF,'                '>
  386.     LXI    H,0
  387.     LDA    COUNT
  388.     MOV    L,A
  389.     DECOUT
  390.     PRINT    ' FILES    '
  391.  
  392.     LHLD    MAXSTR        ;GET MAX STORAGE SIZE.
  393.     DSUB    W        ;SUBTRACT IN-USE SIZE.
  394.     DECOUT
  395.     PRINT    <'K BYTES REMAINING ON DISK',CR,LF>
  396. EF1:    LHLD    OLDSTK
  397.     SPHL            ;RELOAD OLD STACK POINTER
  398.     RET            ;RETURN TO CCP WITHOUT REBOOT
  399. ;
  400. DSKERR:    PRINT    <CR,LF,'ERROR - SELECT DRIVE A, B, C OR D'>
  401.     JMP    EF1        ;EXIT
  402. ;
  403. ;    THIS SECTION DOES THE ACTUAL SORTING OF THE DIRECTORY. DURING THE
  404. ;    INPUT OF THE DIRECTORY NAMES, A TABLE OF ADDRESS POINTERS PDIR
  405. ;    WAS CONSTRUCTED. THE SORT ROUTINE SORTS THE ADDRESS POINTERS
  406. ;    RATHER THAN THE ACTUAL DIRECTORY. 
  407. ;    THIS IS AN IMPLEMENTATION OF C. A. R. HOARE'S QUICKSORT ALGORITHM.
  408. ;    THE ALGORITHM IS VERY FAST AND GENERALLY USEFUL, HOWEVER CAUTION
  409. ;    SHOULD BE USED WITH LARGE FILES. THE ALGORITHM IS RECURSIVE AND
  410. ;    THE STACK SPACE REQUIRED IS PROPORTIONAL TO THE NO OF ITEMS TO BE
  411. ;    SORTED.
  412. ;
  413. SORT:    LDA    COUNT        ;NO OF ENTRIES IN DIR
  414.     ORA    A
  415.     JZ    ENDFIL        ;EXIT IF DIRECTORY EMPTY
  416.     DCR    A
  417.     LXI    H,0        ;ZERO HL
  418.     MOV    L,A
  419.     DAD    H
  420.     SHLD    LAST        ;END OF ARRAY
  421.     LXI    H,0
  422.     SHLD    FIRST        ;START OF ARRAY
  423.     LXI    H,0FFFFH
  424.     PUSH    H        ;FLAG FOR STACK EMPTY
  425.     LHLD    FIRST
  426.     PUSH    H
  427.     LHLD    LAST
  428.     PUSH    H        ;STACK CONTAINS FIRST AND LAST INDICES
  429. ;
  430. ;    NOW POP STACK AND KEEP CALLING SPLIT RECURSIVELY TILL STACK EMPTY
  431. ;
  432. SORT2:    POP    H
  433.     MOV    A,H
  434.     CPI    0FFH
  435.     JZ    DIR14        ;GO TO PRINT ROUTINE
  436.     SHLD    J
  437.     SHLD    LAST
  438.     POP    H
  439.     SHLD    I
  440.     SHLD    FIRST
  441.     CALL    SPLIT
  442.     LHLD    I
  443.     XCHG
  444.     LHLD    FIRST
  445.     CPHL
  446.     JZ    SORT4
  447.     PUSH    H        ;I ON STACK
  448.     DCX    D
  449.     DCX    D
  450.     PUSH    D        ;J ON STACK
  451. SORT4:    LHLD    J
  452.     XCHG
  453.     LHLD    LAST
  454.     CPHL
  455.     JZ    SORT8
  456.     INX    D
  457.     INX    D
  458.     PUSH    D        ;NEW I ON STACK
  459.     PUSH    H        ;NEW J ON STACK
  460. SORT8:    JMP    SORT2
  461. ;
  462. ;    SPLIT SUBROUTINE DOES A SINGLE PARTITION ON AN ARRAY OF POINTERS
  463. ;
  464. SPLIT:    HALF    I
  465.     XCHG
  466.     HALF    J
  467.     DAD    D
  468.     MOV    A,L
  469.     ANI    0FEH
  470.     MOV    L,A
  471.     SHLD    K        ;K=I+J/2
  472.     DLOAD    PDIR,K
  473.     SHLD    W        ;W IS POINTER TO PARTITION ELEMENT OF PDIR
  474. SPLIT2:    DLOAD    PDIR,I        ;GET ITEM FROM LEFT
  475.     XCHG
  476.     LHLD    W        ;PARTITION ELEMENT
  477.     MATCH    ,,11        ;CONPARE KEYS
  478.     JP    SPLIT4
  479.     INDEX    I,2        ;INCR I
  480.     JMP    SPLIT2
  481. SPLIT4:    DLOAD    PDIR,J        ;GET ITEM FROM RIGHT
  482.     XCHG
  483.     LHLD    W        ;PARTITION ELEMENT
  484.     XCHG
  485.     MATCH    ,,11        ;COMPARE KEYS
  486.     JP    SPLIT6
  487.     INDEX    J,-2
  488.     JMP    SPLIT4        ;LOOP BACK
  489. SPLIT6:    LHLD    I
  490.     XCHG
  491.     LHLD    J
  492.     CPHL            ;COMPARE I AND J
  493.     RZ            ;RET IF I = J
  494.     DLOAD    PDIR,I        ;SWITCH POINTERS
  495.     SAVE    H
  496.     DLOAD    PDIR,J
  497.     DSTORE    PDIR,I
  498.     RESTORE    H
  499.     DSTORE    PDIR,J
  500.     JMP    SPLIT2
  501. ;
  502. ;   DATA ALLOCATIONS
  503. ;
  504. LINES    EQU    18        ;LINES PER PAGE ON DISPLAY
  505. SPACE:    DB    ' $'        ;ASCII SPACE
  506. CRLF:    DB    0DH,0AH,24H    ;ASCII CR LF
  507. I:    DW    0        ;PSEUDO INDEX REGISTER
  508. J:    DW    0        ;PSEUDO INDEX REGISTER
  509. K:    DW    0        ;PSEUDO INDEX REGISTER
  510. FIRST:    DW    0        ;START OF ARRAY
  511. LAST:    DW    0        ;END OF ARRAY
  512. W:    DW    0        ;STORAGE FOR PARTITION INDEX
  513. DIRSIZ:    DW    0        ;SIZE OF DIRECTORY IN K
  514. MAXSTR:    DW    0        ;MAXIMUM STORAGE AVAILABLE
  515. LINE:    DW    0        ;LINE NUMBER FOR LISTING
  516. IPOINT:    DW    00        ;VARIABLE BUFFER POINTER
  517. DRVNO:    DB    0        ;STORAGE FOR ORIGINALLY LOGGED DRIVE
  518. NEWDRV:    DB    0        ;STORAGE FOR NEW DRIVE NO
  519. COUNT:    DB    0        ;COUNT OF DIRECTORY ENTRIES
  520. OLDSTK:    DW    0        ;STORAGE FOR OLD STACK POINTER
  521. ENDSTK:    DS    128        ;STORAGE FOR NEW STACK
  522. NEWSTK:    DW    0        ;NEW STACK
  523. INB:    DW    0        ;STORES POINTER TO INPUT BUFFER AREA
  524. OUTB:    DW    0        ;STORES POINTER TO DIRECTORY BUFFER AREA
  525. DPBADR:    DW    0        ;ADDRESS OF DISK'S CP/M DPB
  526. DSKBSH: DB     0        ;DISK DPBBSH VALUE
  527. DSKBLM:    DB    0        ;DISK DPBBLM VALUE
  528. DIRFCB:    DB    '?','????????','???','?',0,0,0
  529.     DB    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  530.     DB    0,0,0
  531. PDIR    DW    0        ;POINTER TABLE TO DIRECTORY
  532. DIRBUF:    EQU    PDIR+(2*MAXDIR)    ;START OF AREA USED TO STORE AND SORT DIRECTORY
  533.     END
  534.