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 / SIMTEL / CPMUG / CPMUG040.ARK / DI.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  14KB  |  595 lines

  1. ;            -  D -
  2. ;                    BY S J SINGER
  3. ;
  4. ;    D IS A CPM UTILITY THAT DISPLAYS A DISK DIRECTORY IN A MORE
  5. ;READABLE FORM. THE DIRECTORY IS READ FROM THE SPECIFIED DISK, SORTED
  6. ;THEN DISPLAYED IN A 3 COLUMN FORMAT. BOTH THE FILE NAMES AND FILE SIZES 
  7. ;IN 1 K GROUPS ARE DISPLAYED.
  8. ;    THE PRESENT VERSION OF D HAS CERTAIN MINOR LIMITATIONS WHICH
  9. ;MAY BE EASILY REMOVED IF THEY CAUSE PROBLEMS.
  10. ;
  11. ;    1.  ONLY 54 FILES ARE DISPLAYED. THIS LIMIT IS SUFFICIENT FOR
  12. ;        ALMOST ALL DISKS AND LEAVES ROOM ON THE SCREEN FOR EDITING.
  13. ;        TO CHANGE THE NO OF LINES DISPLAYED, CHANGE THE LINES VARIABLE
  14. ;        IN THE DATA ALLOCATION SECTION OF THE PROGRAM. FOR EXAMPLE
  15. ;        TO DISPLAY A MAXIMUM OF 54 FILES CHANGE LINES TO 18.
  16. ;    2.  THE PRESENT VERSION READS GROUPS 0 AND 1 DIRECTLY FOR SPEED.
  17. ;        IF A DISK IS SET UP FOR MORE THAN 64 FILES OR THE BLOCK FORMAT
  18. ;        IS CHANGED THE READ ROUTINE WILL HAVE TO BE MODIFIED.
  19. ;
  20. ;    OCCASIONALLY THE FILE NAMES WILL BE DISPLAYED WITH THE FORMAT
  21. ;SCRAMBLED OR THE SPACE REMAINING ON THE DISK WILL NOT AGREE WITH THAT REPORTED
  22. ;BY THE STAT UTILITY. THIS ALMOST ALWAYS MEANS THE DISK DIRECTORY HAS BEEN
  23. ;MESSED UP SOMEHOW. USUALLY THE PROBLEM CAN BE CORRECTED BY COPYING ALL THE
  24. ;FILES TO ANOTHER DISK USING PIP.
  25. ;    D WAS ASSEMBLED USING THE NEW CP/M MACRO ASSEMBLER AND USES A LARGE
  26. ;NUMBER OF MACROS. THESE ARE CONTAINED IN A LIBRARY CALLED MACRO.LIB WHICH
  27. ;IS REQUIRED IF THE PROGRAM IS TO BE REASSEMBLED.
  28. ;    THE STANDARD VERSION OF 'D' IS CONFIGURED FOR A DISPLAY SCREEN OF
  29. ;24 BY 80 CHARACTERS. A CONDITIONAL ASSEMBLY SWITCH IS INCLUDED TO CONFIGURE
  30. ;THE DISPLAY FOR A 16 BY 64 SIZE SCREEN WITH A SMALLER MAXIMUM NUMBER OF
  31. ;FILES. SET THE SWITCH TO TRUE FOR SMALLER SCREENS.
  32. ;    VDM    EQU    0FFH
  33. ;
  34. ;
  35. ;
  36. ;        COMMAND FORMAT
  37. ;
  38. ;    D            DISPLAY DIRECTORY OF LOGGED DISK
  39. ;    D A:            DISPLAY DIRECTORY OF DISK A
  40. ;    D B:            DISPLAY DIRECTORY OF DISK B
  41. ;    D C:            DISPLAY DIRECTORY OF C
  42. ;    D D:            DISPLAY DIRECTORY OF D
  43. ;
  44. ;
  45. VDM:    EQU    0H        ;CONDITIONAL ASSEMBLY SWITCH SET TRUE IF
  46. ;                 16 BY 64 SCREEN
  47. ;
  48.     MACLIB    MACRO        ;INCLUDE MACRO LIBRARY
  49.     ORG    100H        ;SET PROG START
  50.     LXI    H,0
  51.     DAD    SP        ;GET OLD STACK POINTER
  52.     SHLD    OLDSTK        ;SAVE IT
  53.     LXI    SP,NEWSTK    ;LOAD NEW STACK POINTER
  54.     JMP    DIR
  55. ;
  56. ;   GRPTS  CONVERT CPM GROUP AND SECTOR NUMBER TO TRK AND SEC
  57. ;       GROUP NO IN G, TRT NO RETURNED TO TRACK, SEC TO BSEC AND ESEC
  58. ;
  59. GRPTS:    LDA    DENCODE        ;CHECK DENSITY
  60.     CPI    0DDH        ;DOUBLE?
  61.     JZ    GRPTSD
  62.     JMP    GRPTSS        ;ELSE SINGLE DENSITY
  63. ;
  64. GRPTSD:    MVI    A,2
  65.     STA    TRACK        ;DIRECTORY IS ON TRACK 2
  66.     LDA    S        ;SECTOR NO
  67.     INR    A        ;INCR BY 1
  68.     MOV    B,A        ;TO B
  69.     LDA    G        ;GROUP NO
  70.     ADD    A
  71.     ADD    A
  72.     ADD    A
  73.     ADD    A        ;SHIFT LEFT 4 BITS
  74.     ADD    B        ;ADD IN GROUP NO
  75.     STA    BSEC
  76.     STA    ESEC
  77.     RET
  78. ;
  79. GRPTSS:    MVI    H,0        ;ZERO H
  80.     LDA    G        ;GROUP NO
  81.     MOV    L,A        ;TO L
  82.     MOV    D,H        ;ZERO    D
  83.     DAD    H
  84.     DAD    H
  85.     DAD    H        ;SHIFT LEFT 3
  86.     LDA    S        ;GET SECTOR NO
  87.     MOV    E,A        ;TO DE
  88.     DAD    D        ;HL HAS G*8+S
  89.     LXI    D,-26        ;DIVISOR
  90.     MVI    A,1        ;CONTAINS DIVIDEND
  91. DIV:    DAD    D        ;SUB 26
  92.     INR    A
  93.     JC    DIV        ;LOOP TILL MINUS
  94.     LXI    D,TABLE+26    ;INDEX INTO TABLE
  95.     DAD    D
  96.     STA    TRACK        ;STORE TRACK NO
  97.     MOV    A,M        ;GET SECTOR NO
  98.     STA    BSEC        ;SAVE IN BEGINNING SECTOR
  99.     STA    ESEC        ;SAVE IN END SECTOR TOO
  100.     RET
  101. ;
  102. ;    START OF DIRECTORY ROUTINE READ IN GROUPS 0 AND 1 AND STORE
  103. ;    DIRECTORY FILE NAMES NOT FLAGGED E5.  IF EXTENT NOT ZERO STORE
  104. ;    OVER PREVIOUS FILE NAME. TABLE OF POINTERS WILL BE BUILT IN PDIR
  105. ;
  106. DIR:    DISKIO    ?DRIVE
  107.     STA    NEWDRV
  108.     LDA    81H
  109.     ORA    A        ;CHECK IF INPUT BUFFER EMPTY
  110.     JZ    DIR2
  111.     LXI    H,82H        ;POINT TO INPUT BUFFER
  112.     CALL    GETDRV
  113.     JNC    DSKERR        ;ERROR OF NO DRIVE FOUND
  114.     STA    NEWDRV        ;STORE DRIVE CODE
  115. DIR2:    XRA    A
  116.     STA    S        ;SECTOR COUNT
  117.     STA    G        ;GROUP 0 = DIRECTORY
  118.     STA    COUNT        ;COUNT OF DIRECTORY ENTRIES
  119.     LXI    H,PDIR        ;ZERO DIRECTORY POINTER TABLE
  120.     MVI    B,0
  121.     XRA    A
  122. DIR3:    MOV    M,A        ;STORE A ZERO
  123.     INX    H
  124.     DCR    B
  125.     JNZ    DIR3        ;LOOP FOR 256 ITERATIONS
  126.     LXI    H,DIRBUF    ;POINTS TO DIRECTORY BUFFER
  127.     SHLD    OUTB
  128.     LXI    H,PDIR        ;POINTER TABLE
  129.     SHLD    IPOINT
  130.     LDA    NEWDRV
  131.     MOV    E,A
  132.     DISKIO    LOGIN        ;LOG IN NEW DRIVE NO
  133.     CALL    GETDEN
  134. DIR4:    LXI    H,80H        ;POINTS TO INPUT BUFFER
  135.     SHLD    INB
  136.     CALL    GRPTS        ;COMPUTE TRACK AND SECTOR NO FROM G AND S
  137.     SETSEC    BSEC        ;SET SECTOR
  138.     SETTRK    TRACK        ;SET TRACK
  139.     CALLBIOS DREAD        ;READ DIRECT
  140. DIR6:    LHLD    OUTB        ;LOAD DESTINATION POINTER
  141.     XCHG            ;PUT IT IN DE
  142.     LHLD    INB        ;LOAD SOURCE POINTER
  143.     MVI    A,0E5H        ;FLAG BYTE
  144.     CMP    M        ;TEST FIRST BYTE
  145.     JNZ    DIR8
  146.     INX    H
  147.     CMP    M        ;TEST SECOND BYTE
  148.     JZ    SORT        ;SORT DIRECTORY
  149.     JMP    DIR12
  150. DIR8:    INX    H
  151.     SAVE    H,D
  152.     LXI    D,11        ;EXTENSION OFFSET
  153.     DAD    D
  154.     MOV    A,M
  155.     ORA    A
  156.     JZ    DIR10        ;IF EXTENT ZERO CONTINUE
  157.     LXI    H,0        ;ELSE, SEARCH FOR SAME NAME AND SWITCH
  158.     SHLD    J        ;INITIALIZE INDEX
  159. DIR9:    DLOAD    PDIR,J
  160.     MOV    A,H
  161.     ORA    L
  162.     JZ    DIR10        ;ERROR TABLE EMPTY
  163.     XCHG
  164.     LHLD    INB        ;POINTER TO NEW DIR ENTRY
  165.     SAVE    D,H
  166.     INX    H
  167.     MATCH    ,,11        ;COMPARE 11 CHARAACTERS
  168.     RESTORE    H,D
  169.     JZ    SWITCH        ;STORE NEW ENTRY OVER OLD
  170.     INDEX    J,2        ;INCR INDEX BY 2
  171.     JMP    DIR9
  172. SWITCH:    INX    H
  173.     MOVE    ,,15        ;OVERWRITE OLD ENTRY
  174.     RESTORE    H
  175.     JMP    DIR12
  176. DIR10:    RESTORE    D,H
  177.     MOVE    ,,15        ;MOVE THE DIRECTORY ENTRY
  178.     LDA    COUNT
  179.     INR    A
  180.     STA    COUNT        ;INCR COUNT OF DIRECTORY ENTRIES
  181.     LHLD    OUTB
  182.     DSTORE    0,IPOINT    ;INDEXED STORE HL
  183.     INDEX    OUTB,16
  184.     INDEX    IPOINT,2
  185. DIR12:    INDEX    INB,32        ;INCR POINTERS
  186.     LXI    D,100H
  187.     CPHL            ;LIMIT OF 4 ENTRIES
  188.     JNZ    DIR6
  189.     LDA    S
  190.     INR    A
  191.     STA    S        ;INCR DIRECTORY SECTOR COUNT
  192.     JMP    DIR4        ;READ ANOTHER BLOCK FROM DIRECTORY
  193. ;
  194. ;    THIS ROUTINE PRINTS THE DIRECTORY IN 3 COLUMNS. NO OF LINES
  195. ;    PRINTED IS CONTROLED BY VARIABLE LINES. ALL DIRECTORY NAMES
  196. ;    ARE PRESENT IN TABLE BUT ONLY A MAXIMUM OF 3*LINES WILL BE
  197. ;    PRINTED.
  198. ;
  199. DIR14:    LXI    H,0
  200.     SHLD    W        ;INITIALIZE ALLOCATION
  201.     SHLD    I        ;INITIALIZE INDEX
  202. DIR16:    DLOAD    PDIR,I        ;INDEX LOAD POINTER
  203.     DJZ    ENDFIL        ;EXIT IF POINTER ZERO
  204.     CALL    DIR20        ;CALL PRINT ROUTINE
  205.     IF    VDM
  206.     PRINT    '      '
  207.     ELSE
  208.     PRINT    '         '
  209.     ENDIF
  210.     LDA    COUNT
  211.     CPI    58
  212.     JM    DIR17A
  213.     DLOAD    PDIR+LINES*2+6,I    ;POINTER COL 2
  214.     JMP    DIR17B
  215. DIR17A:    DLOAD    PDIR+LINES*2,I    ;POINTER COL 2
  216. DIR17B:    DJZ    DIR18        ;NO PRINT IF ZERO
  217.     CALL    DIR20        ;PRINT IT
  218.     IF    VDM
  219.     PRINT    '      '
  220.     ELSE
  221.     PRINT    '         '
  222.     ENDIF
  223.     LDA    COUNT
  224.     CPI    58
  225.     JM    DIR17C
  226.     DLOAD    PDIR+LINES*4+12,I
  227.     JMP    DIR17D
  228. DIR17C:    DLOAD    PDIR+LINES*4,I    ;POINTER COL 3
  229. DIR17D:    DJZ    DIR18
  230.     CALL    DIR20        ;CALL PRINT ROUTINE
  231. DIR18:    INDEX    I,2        ;INCR INDEX BY 2
  232.     LXI    D,LINES*2    ;CHECK INDEX LIMIT
  233.     LDA    COUNT
  234.     CPI    58
  235.     JM    DIR19
  236.     LXI    D,LINES*2+6
  237. DIR19:    CPHL
  238.     JZ    ENDFIL        ;EXIT WHEN INDEX 32
  239.     PRINT    CRLF,$
  240.     JMP    DIR16        ;PRINT SOME MORE
  241. ;
  242. ;    SUBROUTINE TO PRINT A SINGLE DIRECTORY ENTRY
  243. ;
  244. DIR20:    MVI    C,11        ;NAME LENGTH
  245. DIR22:    SAVE    B,H        ;SAVE REGISTERS
  246.     MVI    C,2
  247.     MOV    E,M        ;CHAR TO BE PRINTER
  248.     CALL    5        ;CALL BDOS
  249.     RESTORE    H,B        ;RESTORE THE REGISTERS
  250.     INX    H        ;INCR NAME POINTER
  251.     DCR    C        ;DECR CHAR COUNT
  252.     JZ    DIR24        ;PRINT SIZE
  253.     JMP    DIR22        ;LOOP TILL COUNT 0
  254. DIR24:    MOV    A,M        ;EXTENSION TO A
  255.     ADD    A
  256.     ADD    A
  257.     ADD    A
  258.     ADD    A        ;MULTIPLY BY 16
  259.     MOV    B,A        ;SAVE IN B
  260.     INX    H
  261.     INX    H
  262.     INX    H        ;ADD 3
  263.     XRA    A        ;CLEAR CARRY
  264.     MOV    A,M        ;GET RECORD COUNT
  265.     RRC
  266.     RRC
  267.     RRC            ;SHIFT RIGHT 3  (DIVIDE BY 8)
  268.     PUSH    PSW
  269.     ANI    1FH        ;EXTRACT
  270.     LXI    H,0
  271.     MOV    L,A        ;NO TO HL TO PRINT
  272.     POP    PSW
  273.     ANI    0E0H        ;EXTRACT
  274.     JZ    DIR26
  275.     INX    H
  276. DIR26:    LDA    DENCODE        ;CHECK DENSITY CODE
  277.     CPI    0DDH        ;DOUBLE DENSITY
  278.     JNZ    DIR26A        ;SINGLE DENSITY
  279.     INX    H
  280.     MOV    A,L
  281.     ANI    0FEH
  282.     MOV    L,A        ;ROUND UP ONE BIT (2K GROUPS)
  283. DIR26A:    MOV    A,L
  284.     ADD    B
  285.     MOV    L,A
  286.     PUSH    H
  287.     LXI    D,10
  288.     CPHL
  289.     JM    DIR28
  290.     POP    H
  291.     PUSH    H
  292.     LXI    D,100
  293.     CPHL
  294.     JM    DIR27
  295.     PRINT    ' '
  296.     JMP    DIR30
  297. DIR27:    PRINT    '  '
  298.     JMP    DIR30
  299. DIR28:    PRINT    '   '
  300. DIR30:    POP    H
  301.     PUSH    H
  302.     XCHG
  303.     LHLD    W
  304.     DAD    D
  305.     SHLD    W
  306.     POP    H
  307.     DECOUT
  308.     PRINT    'K'
  309.     RET
  310. ;
  311. ;
  312. ;    GET DENSITY CODE FROM TRACK ZERO SECTOR 1 BYTE 128
  313. ;
  314. GETDEN:    XRA    A
  315.     STA    TNUM        ;SELECT TRACK ZERO
  316.     INR    A        ;SELECT SECTOR 1
  317.     STA    SNUM
  318.     SETSEC    SNUM
  319.     SETTRK    TNUM
  320.     CALLBIOS DHOME        ;HOME DRIVES
  321.     CALLBIOS DREAD        ;READ TRACK ZERO DIRECT
  322.     LDA    0FFH
  323.     CPI    0DDH        ;DOUBLE DENSITY CODE
  324.     JZ    GDEN1
  325.     LDA    0FEH        ;TRY NEXT TO LAST BYTE ALSO
  326.     CPI    0DDH
  327.     RNZ
  328. GDEN1:    STA    DENCODE
  329.     RET
  330. ;
  331. ;    THIS IS THE EXIT POINT FROM THE PROGRAM. PRINT NO OF FILES AND
  332. ;    SPACE REMAINING, RELOAD OLD STACK POINTER AND RETURN BACK TO CCP.
  333. ;
  334. ENDFIL:    LDA    COUNT
  335.     CPI    58
  336.     JP    END0
  337.     PRINT    CRLF,$
  338.     IF    VDM
  339. END0:    PRINT    <CR,LF,'        '>
  340.     ELSE
  341. END0:    PRINT    <CR,LF,'              '>
  342.     ENDIF
  343.     LXI    H,0
  344.     LDA    COUNT
  345.     MOV    L,A
  346.     DECOUT
  347.     PRINT    ' FILES    '
  348.     LHLD    W
  349.     MOV    A,L        ;CHECK FOR ZERO
  350.     ORA    H
  351.     JZ    END1
  352.     XRA    A
  353.     SUB    L
  354.     MOV    L,A        ;MOVE IT BACK
  355.     MVI    A,00H
  356.     SBB    H
  357.     MOV    H,A        ;TWOS COMPLIMENT IN HL
  358. END1:    LDA    DENCODE        ;CHECK DENSITY
  359.     CPI    0DDH
  360.     LXI    D,478        ;DOUBLE DENSITY SPACE
  361.     JZ    END2
  362.     LXI    D,241        ;SINGLE DENSITY SPACE
  363. END2:    DAD    D        ;SUBTRACT FROM TOTAL
  364.     DECOUT
  365.     PRINT    <'K BYTES REMAINING ON DISK '>
  366.     LDA    NEWDRV        ;DRIVE NUMBER
  367.     CALL    PRNDRV        ;PRINT DRIVE NAME
  368. EF1:    LHLD    OLDSTK
  369.     SPHL            ;RELOAD OLD STACK POINTER
  370.     RET            ;RETURN TO CCP WITHOUT REBOOT
  371. ;
  372. DSKERR:    PRINT    <CR,LF,'ERROR - SELECT DRIVE A,B,C, OR D'>
  373.     JMP    EF1        ;EXIT
  374. ;
  375. ;    THIS SECTION DOES THE ACTUAL SORTING OF THE DIRECTORY. DURING THE
  376. ;    INPUT OF THE DIRECTORY NAMES, A TABLE OF ADDRESS POINTERS PDIR
  377. ;    WAS CONSTRUCTED. THE SORT ROUTINE SORTS THE ADDRESS POINTERS
  378. ;    RATHER THAN THE ACTUAL DIRECTORY. 
  379. ;    THIS IS AN IMPLEMENTATION OF C. A. R. HOARE'S QUICKSORT ALGORITHM.
  380. ;    THE ALGORITHM IS VERY FAST AND GENERALLY USEFUL, HOWEVER CAUTION
  381. ;    SHOULD BE USED WITH LARGE FILES. THE ALGORITHM IS RECURSIVE AND
  382. ;    THE STACK SPACE REQUIRED IS PROPORTIONAL TO THE NO OF ITEMS TO BE
  383. ;    SORTED.
  384. ;
  385. SORT:    LDA    COUNT        ;CHECK FOR EXTENDED PRINT
  386.     CPI    58
  387.     JP    SORT1
  388.     IF    NOT VDM
  389.     PRINT    <CR,LF,LF,'                        DIRECTORY DRIVE - '>
  390.     LDA    NEWDRV        ;LOGGED DISK
  391.     CALL    PRNDRV        ;PRINT DRIVE NAME (A - C)
  392.     PRINT    CRLF2,$        ;PRINT CR AND LF
  393.     ENDIF
  394. SORT1:    LDA    COUNT        ;NO OF ENTRIES IN DIR
  395.     ORA    A
  396.     JZ    ENDFIL        ;EXIT IF DIRECTORY EMPTY
  397.     DCR    A
  398.     LXI    H,0        ;ZERO HL
  399.     MOV    L,A
  400.     DAD    H
  401.     SHLD    LAST        ;END OF ARRAY
  402.     LXI    H,0
  403.     SHLD    FIRST        ;START OF ARRAY
  404.     LXI    H,0FFFFH
  405.     PUSH    H        ;FLAG FOR STACK EMPTY
  406.     LHLD    FIRST
  407.     PUSH    H
  408.     LHLD    LAST
  409.     PUSH    H        ;STACK CONTAINS FIRST AND LAST INDICES
  410. ;
  411. ;    NOW POP STACK AND KEEP CALLING SPLIT RECURSIVELY TILL STACK EMPTY
  412. ;
  413. SORT2:    POP    H
  414.     MOV    A,H
  415.     CPI    0FFH
  416.     JZ    DIR14        ;GO TO PRINT ROUTINE
  417.     SHLD    J
  418.     SHLD    LAST
  419.     POP    H
  420.     SHLD    I
  421.     SHLD    FIRST
  422.     CALL    SPLIT
  423.     LHLD    I
  424.     XCHG
  425.     LHLD    FIRST
  426.     CPHL
  427.     JZ    SORT4
  428.     PUSH    H        ;I ON STACK
  429.     DCX    D
  430.     DCX    D
  431.     PUSH    D        ;J ON STACK
  432. SORT4:    LHLD    J
  433.     XCHG
  434.     LHLD    LAST
  435.     CPHL
  436.     JZ    SORT8
  437.     INX    D
  438.     INX    D
  439.     PUSH    D        ;NEW I ON STACK
  440.     PUSH    H        ;NEW J ON STACK
  441. SORT8:    JMP    SORT2
  442. ;
  443. ;    SPLIT SUBROUTINE DOES A SINGLE PARTITION ON AN ARRAY OF POINTERS
  444. ;
  445. SPLIT:    HALF    I
  446.     XCHG
  447.     HALF    J
  448.     DAD    D
  449.     MOV    A,L
  450.     ANI    0FEH
  451.     MOV    L,A
  452.     SHLD    K        ;K=I+J/2
  453.     DLOAD    PDIR,K
  454.     SHLD    W        ;W IS POINTER TO PARTITION ELEMENT OF PDIR
  455. SPLIT2:    DLOAD    PDIR,I        ;GET ITEM FROM LEFT
  456.     XCHG
  457.     LHLD    W        ;PARTITION ELEMENT
  458.     MATCH    ,,11        ;CONPARE KEYS
  459.     JP    SPLIT4
  460.     INDEX    I,2        ;INCR I
  461.     JMP    SPLIT2
  462. SPLIT4:    DLOAD    PDIR,J        ;GET ITEM FROM RIGHT
  463.     XCHG
  464.     LHLD    W        ;PARTITION ELEMENT
  465.     XCHG
  466.     MATCH    ,,11        ;COMPARE KEYS
  467.     JP    SPLIT6
  468.     INDEX    J,-2
  469.     JMP    SPLIT4        ;LOOP BACK
  470. SPLIT6:    LHLD    I
  471.     XCHG
  472.     LHLD    J
  473.     CPHL            ;COMPARE I AND J
  474.     RZ            ;RET IF I = J
  475.     DLOAD    PDIR,I        ;SWITCH POINTERS
  476.     SAVE    H
  477.     DLOAD    PDIR,J
  478.     DSTORE    PDIR,I
  479.     RESTORE    H
  480.     DSTORE    PDIR,J
  481.     JMP    SPLIT2
  482. ;
  483. ;
  484. ;    GETDRV  SEARCH COMMAND STRING FOR DRIVE NAME AND RETURN CODE
  485. ;    A:=0 B:=1 C:=2 D:=3   CARRY SET IF DRIVE PRESENT
  486. ;    GETDRV IS CALLED WITH HL POINTING TO STARTING POSITION FOR SEARCH
  487. ;
  488. GETDRV:    SAVE            ;SAVE REGS
  489.     LXI    D,DSKNAME    ;POINT TO NAME TABLE
  490.     MVI    C,0        ;DRIVE NUMBER
  491. GD1:    SAVE
  492.     MVI    B,40H        ;STRING LENGTH
  493.     MVI    C,2        ;SUBSTRING LENGTH
  494.     INSTR    
  495.     RESTORE
  496.     JC    GD3        ;FOUND NAME ON CARRY
  497.     MOV    A,C        ;DRIVE NO TO A
  498.     CPI    3        ;CHECK LIMIT
  499.     JZ    GD3
  500.     INR    C        ;INCR DRIVE NO
  501.     INX    D
  502.     INX    D        ;POINT TO NEXT NAME
  503.     JMP    GD1        ;LOOP FOR 4 DRIVES
  504. GD3:    MOV    A,C        ;DRIVE NO TO A
  505.     RESTORE
  506.     RET
  507. ;
  508. DSKNAME:DB    'A:'        ;TABLE OF DISK NAMES
  509.     DB    'B:'
  510.     DB    'C:'
  511.     DB    'D:'
  512. ;
  513. ;    PRNDRV  PRINT DRIVE NAME CORRESPONDING TO CODE IN A REG
  514. ;    0=A 1=B 2=C 3=D  >3 ERROR
  515. ;
  516. PRNDRV:    SAVE
  517.     CPI    4        ;CHECK RANGE
  518.     JP    PRDR3        ;ERROR IF > 3
  519.     ADI    'A'        ;CALC LETTER TO PRINT
  520.     CHAROUT            ;PRINT IT
  521. PRDR1:    RESTORE
  522.     RET
  523. PRDR3:    PRINT    <CR,LF,'ERROR - DRIVE NUMBER GREATER THAN 3',CR,LF>
  524.     JMP    PRDR1
  525. ;
  526. ;
  527. ;   DATA ALLOCATIONS
  528. ;
  529.     IF    VDM
  530. LINES    EQU    13
  531.     ELSE
  532. LINES    EQU    19        ;LINES PER PAGE ON DISPLAY
  533.     ENDIF
  534. FCB    EQU    5CH        ;FILE CONTROL BLOCK
  535. SPACE:    DB    ' $'        ;ASCII SPACE
  536. CRLF:    DB    0DH,0AH,24H    ;ASCII CR LF
  537. CRLF2:    DB    0DH,0AH,0AH,'$'    ;ASCII CR LF LF
  538. I:    DW    0        ;PSEUDO INDEX REGISTER
  539. J:    DW    0        ;PSEUDO INDEX REGISTER
  540. K:    DW    0        ;PSEUDO INDEX REGISTER
  541. FIRST:    DW    0        ;START OF ARRAY
  542. LAST:    DW    0        ;END OF ARRAY
  543. W:    DW    0        ;STORAGE FOR PARTITION INDEX
  544. LINE:    DW    0        ;LINE NUMBER FOR LISTING
  545. IPOINT:    DW    00        ;VARIABLE BUFFER POINTER
  546. INBUF:    DS    10        ;USED AS CONSOLE INPUT BUFFER
  547. LASTIN:    DB    0        ;LAST CONSOLE INPUT CHAR
  548. INFLAG:    DB    0        ;FLAG, RET FOR MORE CONSOLE INPUT
  549. DRVNO:    DB    0        ;STORAGE FOR ORIGINALLY LOGGED DRIVE
  550. NEWDRV:    DB    0        ;STORAGE FOR NEW DRIVE NO
  551. TRACK:    DB    0        ;SELECTED TRACK
  552. BSEC:    DB    0        ;SELECTED BEGINNING SECTOR
  553. ESEC:    DB    0        ;SELECTED ENDING SECTOR
  554. TNUM:    DB    0        ;TRACK NO FOR VALIDATE
  555. SNUM:    DB    0        ;SECTOR NO FOR VALIDATE
  556. VALFLG:    DB    0        ;VALIDATION ERROR FLAG
  557. G:    DB    0        ;CPM GROUP NO
  558. S:    DB    0        ;SECTOR NO WITHIN GROUP G
  559. COUNT:    DB    0        ;COUNT OF DIRECTORY ENTRIES
  560. OLDSTK:    DW    0        ;STORAGE FOR OLD STACK POINTER
  561. INB:    DW    0        ;STORES POINTER TO INPUT BUFFER AREA
  562. OUTB:    DW    0        ;STORES POINTER TO DIRECTORY BUFFER AREA
  563. DENCODE:DB    0        ;DENSITY CODE  DD=DOUBLE  4D=QUAD
  564. TABLE:    DB    01H        ;SECTOR LOOK UP TABLE
  565.     DB    07H
  566.     DB    0DH
  567.     DB    13H
  568.     DB    19H
  569.     DB    05H
  570.     DB    0BH
  571.     DB    11H
  572.     DB    17H
  573.     DB    03H
  574.     DB    09H
  575.     DB    0FH
  576.     DB    15H
  577.     DB    02H
  578.     DB    08H
  579.     DB    0EH
  580.     DB    14H
  581.     DB    1AH
  582.     DB    06H
  583.     DB    0CH
  584.     DB    12H
  585.     DB    18H
  586.     DB    04H
  587.     DB    0AH
  588.     DB    10H
  589.     DB    16H
  590. ENDSTK:    DS    100        ;STORAGE FOR NEW STACK
  591. NEWSTK:    DS    0        ;NEW STACK
  592. PDIR    DS    256        ;POINTER TABLE TO DIRECTORY (128 ENTRIES MAX)
  593. DIRBUF:    EQU    PDIR+258    ;START OF AREA USED TO STORE AND SORT DIRECTORY
  594.     END
  595.