home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / p / sap38.lbr / SAP38.AZM / SAP38.ASM
Encoding:
Assembly Source File  |  1993-10-25  |  11.9 KB  |  735 lines

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