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 / ZSYS / SIMTEL20 / ZCPR3 / CLEANDIR.MAC < prev    next >
Text File  |  2000-06-30  |  15KB  |  857 lines

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