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 / CPMUG019.ARK / SAP.ASM < prev    next >
Assembly Source File  |  1985-02-10  |  4KB  |  239 lines

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