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 / CPMUG029.ARK / SAP.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  4KB  |  264 lines

  1. ;    SAP - SORT AND PACK CP/M DISK DIRECTORY
  2. ;
  3. ;    L.E. HUGHES    8080SDC
  4. ;    MODIFIED 5/30/78 BY B.R. RATOFF
  5. ;        1) PICK UP VECTORS FOR ANY SIZE SYSTEM
  6. ;        2) HANDLE NULL EXTENTS OF NON-NULL FILES
  7. ;            PROPERLY
  8.     ORG    100H
  9. ;*****
  10. ; OBTAIN BIOS VECTORS
  11. ;*****
  12. VECTRS:    JMP    GETVEC
  13.     DS    42
  14. WBOOTE    EQU    VECTRS+3
  15. CSTS    EQU    VECTRS+6
  16. CI    EQU    VECTRS+9
  17. CO    EQU    VECTRS+12
  18. LO    EQU    VECTRS+15
  19. PO    EQU    VECTRS+18
  20. RI    EQU    VECTRS+21
  21. HOME    EQU    VECTRS+24
  22. SELDSK    EQU    VECTRS+27
  23. SETTRK    EQU    VECTRS+30
  24. SETSEC    EQU    VECTRS+33
  25. SETDMA    EQU    VECTRS+36
  26. READ    EQU    VECTRS+39
  27. WRITE    EQU    VECTRS+42
  28. GETVEC:    LXI    D,WBOOTE
  29.     LHLD    1
  30.     MVI    B,42
  31. GETVE1:    MOV    A,M
  32.     STAX    D
  33.     INX    H
  34.     INX    D
  35.     DCR    B
  36.     JNZ    GETVE1
  37. ;
  38. SAP:    LXI    H,0
  39.     DAD    SP
  40.     SHLD    OLDSP
  41.     LXI    SP,STACK+64
  42.     MVI    C,0        ;SELECT DISK A
  43.     CALL    SELDSK
  44.     MVI    C,2        ;SET TO TRACK 2
  45.     CALL    SETTRK
  46.     MVI    A,1        ;SECNO=1
  47.     STA    SECNO
  48.     LXI    H,BUF        ;ADDR = FWA OF BUFFER
  49.     SHLD    ADDR
  50. SAP1:    LDA    SECNO        ;SET TO SECTOR "SECNO"
  51.     LXI    H,LPMAP-1
  52.     ADD    L
  53.     MOV    L,A
  54.     JNC    $+4
  55.     INR    H
  56.     MOV    C,M
  57.     CALL    SETSEC
  58.     LHLD    ADDR        ;SET DMA ADDRESS TO "ADDR"
  59.     MOV    B,H
  60.     MOV    C,L
  61.     CALL    SETDMA
  62.     CALL    READ        ;READ SECTOR INTO MEMORY
  63.     LHLD    ADDR        ;ADDR = ADDR + 80H
  64.     MOV    A,L
  65.     ADI    80H
  66.     MOV    L,A
  67.     JNC    $+4
  68.     INR    H
  69.     SHLD    ADDR
  70.     LDA    SECNO        ;SECNO = SECNO + 1
  71.     INR    A
  72.     STA    SECNO
  73.     CPI    17        ;LOOP UNTIL SECNO>16
  74.     JC    SAP1
  75.     CALL    CLEAN        ;CLEAN THE DIRECTORY
  76.     CALL    SORT        ;SORT THE DIRECTORY
  77.     CALL    PACK        ;PACK THE DIRECTORY
  78.     MVI    A,1        ;SECNO = 1
  79.     STA    SECNO
  80.     LXI    H,BUF        ;ADDR = FWA OF BUFFER
  81.     SHLD    ADDR
  82. SAP2:    LDA    SECNO        ;SET TO SECTOR "SECNO"
  83.     LXI    H,LPMAP-1
  84.     ADD    L
  85.     MOV    L,A
  86.     JNC    $+4
  87.     INR    H
  88.     MOV    C,M
  89.     CALL    SETSEC
  90.     LHLD    ADDR        ;SET DMA ADDRESS TO "ADDR"
  91.     MOV    B,H
  92.     MOV    C,L
  93.     CALL    SETDMA
  94.     CALL    WRITE        ;WRITE SECTOR TO DISK
  95.     LHLD    ADDR        ;ADDR = ADDR + 80H
  96.     MOV    A,L
  97.     ADI    80H
  98.     MOV    L,A
  99.     JNC    $+4
  100.     INR    H
  101.     SHLD    ADDR
  102.     LDA    SECNO        ;SECNO = SECNO + 1
  103.     INR    A
  104.     STA    SECNO
  105.     CPI    17        ;LOOP UNTIL SECNO > 16
  106.     JC    SAP2
  107.     LHLD    OLDSP        ;EXIT TO CP/M
  108.     SPHL
  109.     RET
  110.  
  111. CLEAN:    MVI    A,0        ;I = 0
  112. CLEAN1:    STA    I
  113.     CALL    INDEX        ;HL = BUF + 16 * I
  114.     MOV    A,M        ;JUMP IF THIS IS A DELETED FILE
  115.     CPI    0E5H
  116.     JZ    CLEAN2
  117.     MOV    A,L        ;HL = HL + 12
  118.     ADI    12
  119.     MOV    L,A
  120.     JNC    $+4
  121.     INR    H
  122.     MOV    A,M        ;CHECK EXTENT FIELD
  123.     ORA    A
  124.     JNZ    CLEAN4        ;SKIP IF NOT EXTENT ZERO
  125.     INX    H        ;POINT TO RECORD COUNT FIELD
  126.     INX    H
  127.     INX    H
  128.     MOV    A,M        ;CHECK RECORD COUNT FIELD
  129.     ORA    A
  130.     JNZ    CLEAN4        ;JUMP IF NON-ZERO
  131.     LDA    I        ;CLEAR ALL 32 BYTES OF
  132.     CALL    INDEX        ;  DIRECTORY ENTRY TO E5
  133. CLEAN2:    MVI    C,32
  134. CLEAN3:    MVI    M,0E5H
  135.     INX    H
  136.     DCR    C
  137.     JNZ    CLEAN3
  138. CLEAN4:    LDA    I        ;I = I + 1
  139.     INR    A
  140.     CPI    64        ;LOOP UNTIL I > 63
  141.     JC    CLEAN1
  142.     RET
  143.  
  144. LPMAP:    DB    01,07,13,19,25,05,11,17,23,03,09,15,21
  145.     DB    02,08,14,20,26,06,12,18,24,04,10,16,22
  146.  
  147. COMP:    LDA    I        ;HL = BUF + 16 * I
  148.     CALL    INDEX
  149.     PUSH    H
  150.     LDA    J        ;HL = BUF + 16 * J
  151.     CALL    INDEX
  152.     XCHG
  153.     POP    H
  154.     MVI    C,13        ;NUMBER OF BYTES TO COMPARE
  155. COMP1:    LDAX    D        ;COMPARE NEXT BYTE
  156.     CMP    M
  157.     RNZ            ;RETURN IF NOT EQUAL
  158.     INX    D
  159.     INX    H
  160.     DCR    C        ;LOOP THRU FIRST 13 BYTES
  161.     JNZ    COMP1
  162.     XRA    A        ;CLEAR FLAGS AND EXIT
  163.     RET
  164.  
  165. SORT:    MVI    A,0        ;I = 0
  166.     STA    I
  167. SORT1:    LDA    I        ;J = I + 1
  168.     INR    A
  169.     STA    J
  170. SORT2:    CALL    COMP        ;IF NAME(J)<NAME(I), SWAP
  171.     CC    SWAP
  172.     LDA    J        ;J = J + 1
  173.     INR    A
  174.     STA    J
  175.     CPI    64        ;IF J < 64 GOTO SORT2
  176.     JC    SORT2
  177.     LDA    I        ;I = I + 1
  178.     INR    A
  179.     STA    I
  180.     CPI    63        ;IF I < 63 GOTO SORT1
  181.     JC    SORT1
  182.     RET
  183.  
  184. SWAP:    LDA    I
  185.     CALL    INDEX
  186.     PUSH    H
  187.     LDA    J
  188.     CALL    INDEX
  189.     XCHG
  190.     POP    H
  191.     MVI    C,32
  192. SWAP1:    LDAX    D
  193.     MOV    B,A
  194.     MOV    A,M
  195.     STAX    D
  196.     MOV    M,B
  197.     INX    D
  198.     INX    H
  199.     DCR    C
  200.     JNZ    SWAP1
  201.     RET
  202.  
  203. INDEX:    MOV    L,A
  204.     MVI    H,0
  205.     DAD    H
  206.     DAD    H
  207.     DAD    H
  208.     DAD    H
  209.     DAD    H
  210.     LXI    D,BUF
  211.     DAD    D
  212.     RET
  213.  
  214. PACK:    MVI    A,0        ;I = 0
  215. PACK1:    STA    I
  216.     CALL    INDEX        ;HL = BUF + 16 * I
  217.     MOV    A,L        ;HL = HL + 9
  218.     ADI    9
  219.     MOV    L,A
  220.     JNC    $+4
  221.     INR    H
  222.     MOV    A,M        ;JUMP IF FILETYPE NOT 'X$$'
  223.     SUI    '0'        ;  WHERE 0.LE.X.LE.9
  224.     JC    PACK2
  225.     CPI    10
  226.     JNC    PACK2
  227.     STA    J
  228.     INX    H
  229.     MOV    A,M
  230.     CPI    '$'
  231.     JNZ    PACK2
  232.     INX    H
  233.     MOV    A,M
  234.     CPI    '$'
  235.     JNZ    PACK2
  236.     INX    H        ;SET EXTENT NUMBER TO X
  237.     LDA    J
  238.     MOV    M,A
  239.     DCX    H        ;SET FILETYPE TO '$$$'
  240.     MVI    M,'$'
  241.     DCX    H
  242.     MVI    M,'$'
  243.     DCX    H
  244.     MVI    M,'$'
  245. PACK2:    LDA    I        ;I = I + 1
  246.     INR    A
  247.     CPI    64        ;LOOP UNTIL I > 63
  248.     JC    PACK1
  249.     RET
  250.  
  251. ;    DATA AREA
  252.  
  253. OLDSP:    DS    2
  254. STACK:    DS    64
  255. SECNO:    DS    1
  256. ADDR:    DS    2
  257. BUF:    DS    64*32
  258.  
  259. I:    DS    1
  260. J:    DS    1
  261.  
  262.     END
  263.