home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol201 / cleandir.mqc / CLEANDIR.MAC
Encoding:
Text File  |  1985-02-10  |  11.9 KB  |  759 lines

  1. ;
  2. ; Program:  CLEANDIR
  3. ; Derivation:  SAP 3.8 (see following history for authors)
  4. ; Derivation By:  Richard Conn
  5. ; Version: 1.0
  6. ; Date:  20 June 84
  7. ;
  8. vers    equ    10
  9. z3env    equ    0f400h
  10.  
  11. ;
  12. ;  SYSLIB and Z3LIB References
  13. ;
  14.     ext    z3init,z3log
  15.     ext    eprint,cout
  16.     ext    codend
  17.  
  18. ;
  19. ; Environment Definition
  20. ;
  21.     if    z3env ne 0
  22. ;
  23. ; External ZCPR3 Environment Descriptor
  24. ;
  25.     jmp    start
  26.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  27.     db    1    ;External Environment Descriptor
  28. z3eadr:
  29.     dw    z3env
  30. start:
  31.     lhld    z3eadr    ;pt to ZCPR3 environment
  32. ;
  33.     else
  34. ;
  35. ; Internal ZCPR3 Environment Descriptor
  36. ;
  37.     MACLIB    Z3BASE.LIB
  38.     MACLIB    SYSENV.LIB
  39. z3eadr:
  40.     jmp    start
  41.     SYSENV
  42. start:
  43.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  44.     endif
  45.  
  46. ;
  47. ; Start of Program -- Initialize ZCPR3 Environment
  48. ;
  49.     call    z3init    ;initialize the ZCPR3 Environment
  50.  
  51. ; v3.8 SORT AND PACK CP/M DISK DIRECTORY - 10/16/83
  52. ;
  53. ; THIS PROGRAM READS THE DISK DIRECTORY TRACKS, SORTS THEM ALPHABETICALLY
  54. ; THEN REPLACES THEM ON THE DISK.  ALL UNUSED OR ERASED AREAS ON THE DIR-
  55. ; ECTORY TRACK ARE REFORMATTED WITH CONTINUOUS 'E5' CHARACTERS.  (THIS
  56. ; ERASES PREVIOUS FILE NAMES WHICH HAVE BEEN DEACTIVATED.)  SORTING THE
  57. ; DIRECTORY IN THIS MANNER OFFERS MANY ADVANTAGES.  SOME OF THEM ARE:
  58. ;
  59. ;    1)  ALLOWS 'DIR' TO SHOW AN ALPHABETIZED LISTING
  60. ;    2)  ELIMINATES POTENTIAL PROBLEMS WITH "UNERASE" PROGRAMS
  61. ;    3)  SPEEDS UP ACCESS VIA 'SD' AND OTHER SPECIAL PROGRAMS
  62. ;    4)  ASSISTS ON WORKING DIRECTLY ON THE DISK WITH 'DUU', ETC.
  63. ;    5)  REMOVES FILES FROM THE DISK SOMEBODY ELSE COULD RECOVER
  64. ;
  65. ;                - Notes by Irv Hoff W6FFC
  66. ;
  67. ; 1977    Written by L. E. Hughes.  Modified extensively since by Bruce
  68. ;    Ratoff, Keith Petersen, James Prest, Ron Fowler, Frank Gaude,
  69. ;    Irv Hoff and likely others.
  70. ;
  71. ; 10/16/83 Now using a Shell-Metzner sort which speeds the sorting time
  72. ;       considerably, especially on large directories. (SFK)
  73. ;
  74. ; 07/27/83 Shows an error flag for MP/M and CP/M+ both.  Rewrites dir-
  75. ;       tory even if previously sorted, to insure erased programs at
  76. ;   v3.7   end of directory are properly cleared.
  77. ;                    - Irv Hoff
  78. ;                                                              
  79. TRUE    EQU    0FFH
  80. FALSE    EQU    0
  81. ;
  82. BDOS    EQU    5
  83. CR    EQU    0DH
  84. DPBLEN    EQU    15        ;SIZE OF CP/M2 DISK PARAMETER BLOCK
  85. FCB    EQU    5CH
  86. FCB2    EQU    6CH
  87. GETDSK    EQU    25        ;BDOS "GET DISK #" FUNCTION
  88. LF    EQU    0AH
  89. SELDRV    EQU    14        ;SELECT DRIVE
  90. ;.....
  91. ;
  92. ; OBTAIN BIOS VECTORS
  93. ;
  94. VECTRS:
  95.     JMP    GETVEC
  96. ;
  97.     DS    53        ;ROOM FOR JUMP VECTORS
  98. ;
  99. WBOOT    EQU    VECTRS+3    ;DO NOT CHANGE THESE EQUATES
  100. CSTS    EQU    VECTRS+6
  101. CI    EQU    VECTRS+9
  102. CO    EQU    VECTRS+12
  103. LO    EQU    VECTRS+15
  104. PO    EQU    VECTRS+18
  105. RI    EQU    VECTRS+21
  106. HOME    EQU    VECTRS+24
  107. SELDSK    EQU    VECTRS+27
  108. SETTRK    EQU    VECTRS+30
  109. SETSEC    EQU    VECTRS+33
  110. SETDMA    EQU    VECTRS+36
  111. READ    EQU    VECTRS+39
  112. WRITE    EQU    VECTRS+42
  113. LSTS    EQU    VECTRS+45    ;ONLY IN CP/M2
  114. SECTRN    EQU    VECTRS+48    ;ONLY IN CP/M2
  115. ;
  116. ;  GET BIOS VECTORS
  117. ;
  118. GETVEC:
  119.     LXI    D,WBOOT
  120.     LHLD    1
  121.     MVI    B,53
  122.     CALL    MOVE
  123. ;
  124. ;  PROGRAM STARTS HERE
  125. ;
  126.     LXI    H,0
  127.     DAD    SP        ;GET ADDRESS OF CP/M STACK
  128.     SHLD    STACK        ;STORE IT SO WE CAN GO BACK TO IT
  129.     CALL    CODEND        ;DETERMINE FREE SPACE
  130.     LXI    D,80H        ;ALLOW 80H BYTES FOR STACK
  131.     SHLD    BUF        ;SET BUFFER ADDRESS
  132.     SPHL            ;SET TOP OF STACK
  133.     XRA    A        ;SET NO REVERSE OF USER AREAS
  134.     STA    REVERSE
  135.        CALL    EPRINT        ;PRINT MSG:
  136.     DB    'CLEANDIR, Version '
  137.     DB    (vers/10)+'0','.',(vers mod 10)+'0'
  138.     DB    0
  139.     LDA    FCB+1        ;CHECK FOR HELP REQUEST
  140.     CPI    '/'        ;ANY OPTION MEANS HELP
  141.     JZ    HELP
  142.     CPI    'D'        ;SELECT DESCENDING ORDER?
  143.     JZ    DESC
  144.     LDA    FCB2+1        ;CHECK FOR OPTION CHAR
  145.     CPI    'D'        ;DESCENDING ORDER OF USER AREAS?
  146.     JNZ    SAP
  147. DESC:
  148.     MVI    A,0FFH        ;ENABLE REVERSE
  149.     STA    REVERSE
  150.     JMP    SAP
  151. ;
  152. ;  PRINT HELP MESSAGE
  153. ;
  154. HELP:
  155.     CALL    EPRINT
  156.     DB    CR,LF,'Syntax:'
  157.     DB    CR,LF,'  CLEANDIR dir: o'
  158.     DB    CR,LF,'Options:'
  159.     DB    CR,LF,'  D - sort in Descending Order (users and files)'
  160.     DB    CR,LF,'Note:'
  161.     DB    CR,LF,'  Only disk ref is used in dir: form'
  162.     DB    0
  163.     JMP    EXIT1
  164. ;
  165. ;  MAIN PROGRAM ROUTINE
  166. ;
  167. SAP:
  168.     CALL    SETUP
  169.     CALL    RDDIR
  170.     CALL    CLEAN
  171.     CALL    SORT
  172.     CALL    PACK
  173.     CALL    WRDIR
  174.     CALL    EPRINT
  175.     DB    'Done',0
  176.     JMP    EXIT
  177. ;
  178. ;      SUBROUTINES
  179. ;
  180. CLEAN:
  181.     LXI    H,0        ;I = 0
  182. ;
  183. CLNLOP:
  184.     SHLD    I
  185.     CALL    INDEX        ;HL = BUF + 16 * I
  186.     MOV    A,M        ;JUMP IF THIS IS A DELETED FILE
  187.     CPI    0E5H
  188.     JZ    FILLE5
  189.     LXI    D,12
  190.     DAD    D        ;HL = HL + 12
  191.     MOV    A,M        ;CHECK EXTENT FIELD
  192.     ORA    A
  193.     JNZ    CLBUMP        ;SKIP IF NOT EXTENT ZERO
  194.     INX    H        ;POINT TO RECORD COUNT FIELD
  195.     INX    H
  196.     MOV    A,M        ;GET S2 BYTE (EXTENDED RC)
  197.     ANI    0FH        ;  FOR CPM2, 0 FOR CPM1
  198.     MOV    E,A
  199.     INX    H
  200.     MOV    A,M        ;CHECK RECORD COUNT FIELD
  201.     ORA    E
  202.     JNZ    CLBUMP        ;JUMP IF NON-ZERO
  203.     LHLD    I        ;CLEAR ALL 32 BYTES OF
  204.     CALL    INDEX        ;  DIRECTORY ENTRY TO E5
  205.     INX    H
  206.     MOV    A,M        ;GET FIRST CHAR OF FILENAME
  207.     DCX    H        ;  WARD CHRISTENSONS CAT PGMS
  208.     CPI    '-'        ;  HAVE DISKNAME OF ZERO LENGTH
  209.     JZ    CLBUMP        ;  THAT START WITH '-', DON'T DELETE
  210. ;
  211. FILLE5:
  212.     MVI    C,32        ;NUMBER OF BYTES TO CLEAR
  213. ;
  214. FILLOP:
  215.     MVI    M,0E5H        ;MAKE IT ALL E5'S
  216.     INX    H
  217.     DCR    C
  218.     JNZ    FILLOP
  219. ;
  220. CLBUMP:
  221.     LHLD    DRM        ;GET COUNT OF FILENAMES
  222.     INX    H
  223.     XCHG
  224.     LHLD    I        ;OUR CURRENT COUNT
  225.     INX    H
  226.     PUSH    H
  227.     CALL    SUBDE        ;SUBTRACT
  228.     POP    H
  229.     JC    CLNLOP        ;LOOP TILL ALL CLEANED
  230.     RET
  231. ;
  232. DODIR:
  233.     STA    WRFLAG
  234.     LHLD    SYSTRK
  235.     CALL    DOTRAK        ;SET THE TRACK
  236.     LXI    H,0
  237.     SHLD    SECTOR
  238.     LHLD    DRM        ;NUMBER OF DIR ENTRIES
  239.     INX    H        ;RELATIVE TO 1
  240.     CALL    ROTRHL        ;DIVIDE BY 4
  241.     CALL    ROTRHL        ;  TO GET SECTOR COUNT
  242.     SHLD    DIRCNT
  243.     LHLD    BUF
  244.     SHLD    ADDR        ;FOR DMA ADDRESS
  245. ;
  246. DIRLOP:
  247.     LHLD    SECTOR        ;GET SECTORS PER TRACK
  248.     INX    H
  249.     XCHG
  250.     LHLD    SPT        ;CURRENT SECTOR
  251.     CALL    SUBDE        ;  SECTOR - SPT
  252.     XCHG
  253.     JNC    NOTROV
  254. ;
  255. ; TRACK OVERFLOW, BUMP TO NEXT
  256. ;
  257.     LHLD    TRACK
  258.     INX    H
  259.     CALL    DOTRAK
  260.     LXI    H,1        ;REWIND SECTOR NUMBER
  261. ;
  262. NOTROV:
  263.     CALL    DOSEC        ;SET CURRENT SECTOR
  264.     LHLD    ADDR
  265.     MOV    B,H        ;SET UP DMA ADDRESS
  266.     MOV    C,L
  267.     CALL    SETDMA
  268.     LDA    WRFLAG        ;TIME TO FIGURE OUT
  269.     ORA    A        ;  IF WE ARE READING
  270.     JNZ    DWRT        ;  OR WRITING
  271. ;
  272. ;
  273. ; READ
  274. ;
  275.     CALL    READ
  276.     ORA    A        ;TEST FLAGS ON READ
  277.     JNZ    RERROR        ;NZ=ERROR
  278.     JMP    MORE        ;GOOD READ, GO DO MORE
  279. ;
  280. ; TRACK AND SECTOR UPDATE ROUTINES
  281. ;
  282. DOTRAK:
  283.     SHLD    TRACK
  284.     MOV    B,H
  285.     MOV    C,L
  286.     CALL    SETTRK
  287.     RET
  288. DOSEC:
  289.     SHLD    SECTOR
  290.     MOV    B,H
  291.     MOV    C,L
  292.     LHLD    SECTBL
  293.     XCHG
  294.     DCX    B
  295.     CALL    SECTRN
  296.     MOV    B,H
  297.     MOV    C,L
  298.     CALL    SETSEC
  299.     RET
  300. ;
  301. ; WRITE
  302. ;
  303. DWRT:
  304.     MVI    C,1        ;FOR CPM/2 DEBLOCKING BIOS'S
  305.     CALL    WRITE
  306.     ORA    A        ;TEST FLAGS ON WRITE
  307.     JNZ    WERROR        ;NZ=BAD DIRECTORY WRITE
  308.     JMP    MORE
  309. ;
  310. ; Exit Program
  311. ;
  312. EXIT:
  313.     LDA    NOBOOT        ;SEE IF BOOT IS NEEDED
  314.     ORA    A
  315.     JNZ    EXIT1        ;FLAG IS SET IF ALREADY ALPHABETIZED
  316.     JMP    0000H        ;A REWRITTEN DIRECTORY NEEDS A WARM BOOT
  317. ;
  318. EXIT1:
  319.     LHLD    STACK        ;GET ADDRESS OF ORIGINAL CP/M STACK
  320.     SPHL            ;RESET STACK ADDRESS
  321.     RET
  322. ;
  323. INDEX:
  324.     DAD    H
  325.     DAD    H
  326.     DAD    H
  327.     DAD    H
  328.     DAD    H
  329.     XCHG
  330.     LHLD    BUF    ;GET ADDRESS OF BUF
  331.     XCHG
  332.     DAD    D
  333.     RET
  334. ;
  335. ; GOOD READ OR WRITE
  336. ;
  337. MORE:
  338.     LHLD    ADDR        ;BUMP DMA ADRS FOR NEXT PASS
  339.     LXI    D,80H
  340.     DAD    D
  341.     SHLD    ADDR
  342.     LHLD    DIRCNT        ;COUNTDOWN ENTRIES
  343.     DCX    H
  344.     SHLD    DIRCNT
  345.     MOV    A,H        ;TEST FOR ZERO LEFT
  346.     ORA    L
  347.     JNZ    DIRLOP        ;LOOP TILL ZERO
  348. ;
  349. ;
  350. ; DIRECTORY I/O DONE, RESET DMA ADDRESS
  351. ;
  352.     LXI    B,80H
  353.     CALL    SETDMA
  354.     RET
  355. ;
  356. ; MOVE UTILITY SUBROUTINE
  357. ;
  358. MOVE:
  359.     MOV    A,M
  360.     STAX    D
  361.     INX    H
  362.     INX    D
  363.     DCR    B
  364.     JNZ    MOVE
  365.     RET
  366. ;
  367. ; PACK DIRECTORY
  368. ;
  369. PACK:
  370.     LXI    H,0        ;I = 0
  371. ;
  372. PACK1:
  373.     SHLD    I
  374.     CALL    INDEX        ;HL = BUF + 16 * I
  375.     LXI    D,9
  376.     DAD    D        ;HL = HL + 9
  377.     MOV    A,M        ;JUMP IF FILETYPE NOT 'X$$'
  378.     SUI    '0'        ;  WHERE 0.LE.X.LE.9
  379.     JC    PACK2
  380.     CPI    10
  381.     JNC    PACK2
  382.     STA    J
  383.     INX    H
  384.     MOV    A,M
  385.     CPI    '$'
  386.     JNZ    PACK2
  387.     INX    H
  388.     MOV    A,M
  389.     CPI    '$'
  390.     JNZ    PACK2
  391.     INX    H        ;SET EXTENT NUMBER TO X
  392.     LDA    J
  393.     MOV    M,A
  394.     DCX    H        ;SET FILETYPE TO '$$$'
  395.     MVI    M,'$'
  396.     DCX    H
  397.     MVI    M,'$'
  398.     DCX    H
  399.     MVI    M,'$'
  400. ;
  401. PACK2:
  402.     LHLD    I        ;I = I + 1
  403.     INX    H
  404.     XCHG
  405.     LHLD    DRM
  406.     INX    H
  407.     XCHG
  408.     PUSH    H
  409.     CALL    SUBDE
  410.     POP    H        ;LOOP UNTIL I > DRM
  411.     JC    PACK1
  412.     RET
  413. ;
  414. ; READ AND WRITE DIRECTORY ROUTINES
  415. ;
  416. RDDIR:
  417.     CALL    EPRINT
  418.     DB    ' --> Reading, ',0
  419.     XRA    A
  420.     STA    NOBOOT        ;ZERO THE FLAG
  421.     JMP    DODIR        ;ZERO THE WRITE FLAG FOR NOW
  422. ;
  423. ; COME HERE IF WE GET A READ ERROR
  424. ;
  425. RERROR:
  426.     CALL    EPRINT        ;PRINT:
  427.     DB    ' READ ERROR - No Change Made',0
  428.     JMP    EXIT
  429. ;
  430. ; DIVIDE HL BY 2
  431. ;
  432. ROTRHL:
  433.     ORA    A        ;CLEAR CARRY
  434.     MOV    A,H
  435.     RAR
  436.     MOV    H,A
  437.     MOV    A,L
  438.     RAR
  439.     MOV    L,A
  440.     RET
  441. ;
  442. ; SETUP FOR SELECTING DRIVE AND LOADING DISK PARM BLOCK
  443. ;
  444. SETUP:
  445.     LXI    D,FCB
  446.     CALL    Z3LOG        ;LOG INTO DISK SPECIFIED BY USER
  447.     MVI    C,GETDSK    ;OTHERWISE GET CURRENT DEFAULT DRIVE
  448.     CALL    BDOS        ;SO QUERY 'BDOS' FOR DRIVE
  449.     MOV    C,A        ;PREP FOR OBTAINING DPB
  450.     CALL    EPRINT
  451.     DB    CR,LF,' Disk ',0
  452.     MOV    A,C        ;GET DISK NUMBER
  453.     ADI    'A'        ;CONVERT TO ASCII
  454.     CALL    COUT
  455.     CALL    SELDSK
  456. ;
  457. ; GET CP/M 2.2 DPB DATA
  458. ;
  459.     MOV    E,M
  460.     INX    H
  461.     MOV    D,M
  462.     INX    H
  463.     XCHG
  464.     SHLD    SECTBL
  465.     XCHG
  466.     LXI    D,8        ;OFFSET TO DPB WITHIN HEADER
  467.     DAD    D        ;RETURNED BY SELDSK IN CPM2
  468.     MOV    A,M        ;GET ADRS OF DPB
  469.     INX    H
  470.     MOV    H,M
  471.     MOV    L,A
  472.     LXI    D,DPB        ;POINT TO DEST: OUR DPB
  473.     MVI    B,DPBLEN
  474.     CALL    MOVE
  475.     RET
  476. ;
  477. ; SORT THE DIRECTORY
  478. ;
  479. SORT:
  480.     CALL    EPRINT
  481.     DB    'Sorting (',0
  482.     LDA    REVERSE        ;INDICATE ASC OR DSC
  483.     ORA    A        ;0=ASC
  484.     JZ    SORTASC
  485.     CALL    EPRINT
  486.     DB    'Descending',0
  487.     JMP    SORTDO
  488. SORTASC:
  489.     CALL    EPRINT
  490.     DB    'Ascending',0
  491. ;
  492. ; SHELL-METZNER SORT
  493. ;
  494. SORTDO:
  495.     CALL    EPRINT
  496.     DB    ' Order), ',0
  497.     LHLD    I
  498.     SHLD    SNUMRECW
  499.     LHLD    BUF
  500.     SHLD    SSTADR
  501.     PUSH    H        ;  AND SAVE IT
  502.     LXI    H,32
  503.     SHLD    SRECLEN
  504.     PUSH    H        ;  AND SAVE IT
  505. ;
  506. ; NOW DIVIDE # OF FIELDS BY 2
  507. ;
  508. DIVIDE:
  509.     LHLD    SNUMRECW    ;GET VALUE
  510.     CALL    ROTRHL
  511.     SHLD    SNUMRECW    ;SAVE RESULT
  512.     MOV    A,L        ;IF SNUMRECW<>0
  513.     ORA    H        ;  THEN
  514.     JNZ    NOTDONE        ;    NOT DONE
  515. ;
  516. ; ALL FIELDS SORTED
  517. ;
  518.     POP    B        ;CLEAN UP STACK
  519.     POP    D
  520.     RET
  521. ;
  522. NOTDONE:
  523.     XCHG
  524.     LHLD    I
  525.     MOV    A,L
  526.     SUB    E
  527.     MOV    L,A
  528.     MOV    A,H
  529.     SBB    D
  530.     MOV    H,A
  531.     SHLD    SRECLEN
  532.     LXI    H,1
  533.     SHLD    SSORTV1
  534.     SHLD    SSTADR
  535.     DCR    L
  536.     POP    B
  537.     PUSH    B
  538. NDONE1:
  539.     DAD    D
  540.     DCX    B
  541.     MOV    A,B
  542.     ORA    C
  543.     JNZ    NDONE1
  544.     SHLD    SSORTV2
  545.     XCHG
  546.     POP    B
  547.     POP    H
  548.     PUSH    H
  549.     PUSH    B
  550. NDONE2:
  551.     SHLD    SSORTV4
  552.     SHLD    SSORTV3
  553.     XCHG
  554.     DAD    D
  555.     XCHG
  556. COMPARE:
  557.     POP    B
  558.     PUSH    B
  559. COMPAR1:
  560.     LDAX    D
  561.     ANI    7FH
  562.     PUSH    B
  563.     MOV    C,A
  564.     MOV    A,M
  565.     ANI    7FH
  566.     MOV    B,A
  567.     MOV    A,C
  568.     SUB    B
  569.     POP    B
  570.     JNZ    NOTEQU
  571.     INX    H
  572.     INX    D
  573.     DCX    B
  574.     MOV    A,B
  575.     ORA    C
  576.     JNZ    COMPAR1
  577.     JMP    NOSWITCH
  578. ;
  579. ; THE CONDITION AT NOTEQU: HAS TO
  580. ; BE CHANGED FOR DESCENDING SORT -- IF REVERSE=0, JNC TO NOSWITCH, ELSE
  581. ; JC TO NOSWITCH
  582. ;
  583. NOTEQU:
  584.     PUSH    PSW    ;SAVE CONDITION
  585.     LDAX    D    ;GET (DE)
  586.     CPI    0E5H    ;IF ERASED, SELECT ASCENDING
  587.     JZ    ASCENDING
  588.     MOV    A,M    ;GET (HL)
  589.     CPI    0E5H    ;IF ERASED, SELECT ASCENDING
  590.     JZ    ASCENDING
  591.     LDA    REVERSE    ;DESCENDING SORT?
  592.     ORA    A    ;0=NO
  593.     JZ    ASCENDING
  594.     POP    PSW    ;GET CONDITION FOR DESCENDING SORT
  595.     JC    NOSWITCH
  596.     JMP    SWITCH
  597. ASCENDING:
  598.     POP    PSW    ;GET CONDITION FOR ASCENDING SORT
  599.     JNC    NOSWITCH
  600. SWITCH:
  601.     PUSH    B
  602.     MOV    B,M
  603.     LDAX    D
  604.     MOV    M,A
  605.     MOV    A,B
  606.     STAX    D
  607.     INX    H
  608.     INX    D
  609.     POP    B
  610.     DCX    B
  611.     MOV    A,B
  612.     ORA    C
  613.     JNZ    SWITCH
  614.     LHLD    SNUMRECW
  615.     MOV    A,H
  616.     CMA
  617.     MOV    D,A
  618.     MOV    A,L
  619.     CMA
  620.     MOV    E,A
  621.     LHLD    SSORTV1
  622.     DAD    D
  623.     JNC    NOSWITCH
  624.     INX    H
  625.     SHLD    SSORTV1
  626.     LHLD    SSORTV3
  627.     XCHG
  628.     LHLD    SSORTV2
  629.     MOV    A,E
  630.     SUB    L
  631.     MOV    L,A
  632.     MOV    A,D
  633.     SBB    H
  634.     MOV    H,A
  635.     SHLD    SSORTV3
  636.     JMP    COMPARE
  637. ;
  638. NOSWITCH:
  639.     LHLD    SSTADR
  640.     INX    H
  641.     SHLD    SSTADR
  642.     SHLD    SSORTV1
  643.     XCHG
  644.     LHLD    SRECLEN
  645.     MOV    A,L
  646.     SUB    E
  647.     MOV    A,H
  648.     SBB    D
  649.     JC    DIVIDE
  650.     LHLD    SSORTV4
  651.     POP    D
  652.     PUSH    D
  653.     DAD    D
  654.     XCHG
  655.     LHLD    SSORTV2
  656.     XCHG
  657.     JMP    NDONE2
  658. ;
  659. ; UTILITY SUBTRACTION SUBROUTINE...
  660. ; HL=HL-DE
  661. ;
  662. SUBDE:
  663.     MOV    A,L
  664.     SUB    E
  665.     MOV    L,A
  666.     MOV    A,H
  667.     SBB    D
  668.     MOV    H,A
  669.     RET
  670. ;.....
  671. ;
  672. ;
  673. WRDIR:
  674.     CALL    EPRINT
  675.     DB    'Writing, ',0
  676.     MVI    A,1
  677.     JMP    DODIR
  678. ;
  679. ; COME HERE IF WE GET A WRITE ERROR
  680. ;
  681. WERROR:
  682.     CALL    EPRINT        ;PRINT:
  683.     DB    ' WRITE ERROR - Directory Left in UNKNOWN Condition',0
  684.     JMP    EXIT
  685. ;
  686. ; DATA AREA
  687. ;
  688. ADDR:
  689.     DS    2
  690. BUF:
  691.     DS    2
  692. DIRCNT:
  693.     DS    2
  694. I:
  695.     DS    2
  696. J:
  697.     DS    2
  698. MAPPTR:
  699.     DS    2
  700. NOBOOT:
  701.     DS    1
  702. NOSWAP:
  703.     DS    1
  704. REVERSE:
  705.     DS    1
  706. SECTBL:
  707.     DS    2
  708. SECTOR:
  709.     DS    2
  710. TRACK:
  711.     DS    2
  712. WRFLAG:
  713.     DS    1
  714. SRECLEN:
  715.     DS    2
  716. SSTADR:
  717.     DS    2
  718. SSORTV1:
  719.     DS    2
  720. SSORTV2:
  721.     DS    2
  722. SSORTV3:
  723.     DS    2
  724. SSORTV4:
  725.     DS    2
  726. SNUMRECW:
  727.     DS    2
  728. ;
  729. ; DISK PARAMETER BLOCK:
  730. ;
  731. DPB:
  732. SPT:
  733.     DS    2
  734. BSH:
  735.     DS    1
  736. BLM:
  737.     DS    1
  738. EXM:
  739.     DS    1
  740. DSM:
  741.     DS    2
  742. DRM:
  743.     DS    2
  744. AL0:
  745.     DS    1
  746. AL1:
  747.     DS    1
  748. CKS:
  749.     DS    2
  750. SYSTRK:
  751.     DS    2
  752. ;
  753. STACK:
  754.     DS    2        ;SPACE FOR OLD STACK ADDRESS
  755. ;
  756.     END
  757. ;
  758.