home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol018 / sap.asm < prev    next >
Assembly Source File  |  1984-04-29  |  5KB  |  366 lines

  1.     TITLE    'SAP - SORT AND PACK DIRECTORY'
  2. ;
  3. ;    L.E. HUGHES    8080SDC
  4. ;
  5. ;    FIX 1/23/81 W. EARNEST FOR CP/M 2.2 & 1.4
  6. ;    FIX FOR ANY SIZE SYSTEM TO 256 DIRECT ENTRIES
  7. ;    FIX FOR ANY DRIVE UP TO 4
  8. ;
  9. ;    OFFSET FROM WARM BOOT VECTOR
  10. ;
  11. SELDSK    EQU    24
  12. SETTRK    EQU    27
  13. SETSEC    EQU    30
  14. SETDMA    EQU    33
  15. READ    EQU    36
  16. WRITE    EQU    39
  17. XLT    EQU    45
  18. BDOS    EQU    5
  19.  
  20.     ORG    100H
  21. SAP:    LXI    SP,STACK+32
  22.     MVI    C,12    ;CHECK VERSION
  23.     CALL    BDOS
  24.     MOV    A,H
  25.     ORA    L
  26.     STA    VERFLG
  27.     MVI    C,25    ;GET CURR DSK
  28.     CALL    BDOS
  29.     MOV    C,A    ;SELECT IT ASSUMED
  30.     LDA    5CH    ;FCB
  31.     ORA    A    ;TEST IF DEFINED
  32.     JZ    SEDRV    ;NO, USE DEFAULT
  33.     DCR    A    ;ADJUST FOR BIOS
  34.     MOV    C,A
  35. SEDRV:    MVI    E,SELDSK
  36.     CALL    XCPM
  37.     LDA    VERFLG
  38.     ORA    A
  39.     JZ    SELSKP    ;NOT 2.X
  40.     MOV    A,H
  41.     ORA    L
  42.     JZ    0    ;ABORT IF ILLEGAL
  43.     MOV    E,M
  44.     INX    H
  45.     MOV    D,M    ;XLATE MAP ADDRESS
  46.     XCHG
  47.     SHLD    ADMAP
  48.     LXI    H,9    ;DPB OFFSET
  49.     DAD    D
  50.     MOV    A,M
  51.     INX    H
  52.     MOV    H,M    ;DPB ADDR
  53.     MOV    L,A
  54.     MOV    E,M
  55.     INX    H
  56.     MOV    D,M    ;SECTORS PER TRK
  57.     XCHG
  58.     SHLD    SPERT
  59.     LXI    H,6
  60.     DAD    D
  61.     MOV    E,M
  62.     INX    H
  63.     MOV    D,M    ;DIRECT ENTRIES
  64.     XCHG
  65.     SHLD    DIRENT
  66.     LXI    H,5
  67.     DAD    D
  68.     MOV    E,M
  69.     INX    H
  70.     MOV    D,M
  71.     XCHG
  72.     SHLD    TKOFFS    ;OFFSET TO FIRST DIR TRK
  73. ;
  74. SELSKP:    LHLD    TKOFFS
  75.     SHLD    CURTRK
  76.     CALL    DOTRK
  77.     XRA    A        ;SECNO=0 LOGICAL
  78.     STA    SECNO
  79.     STA    LSEC
  80.     LXI    H,BUF        ;ADDR = FWA OF BUFFER
  81.     SHLD    ADDR
  82. ;
  83. SAP1:    CALL    XLATS    ;SET TO SECTOR "SECNO"
  84.     LHLD    ADDR        ;SET DMA ADDRESS TO "ADDR"
  85.     MOV    B,H
  86.     MOV    C,L
  87.     MVI    E,SETDMA
  88.     CALL    XCPM
  89.     MVI    E,READ
  90.     CALL    XCPM        ;READ SECTOR INTO MEMORY
  91.     LHLD    ADDR        ;ADDR = ADDR + 80H
  92.     LXI    D,128
  93.     DAD    D
  94.     SHLD    ADDR
  95.     LDA    SECNO        ;SECNO = SECNO + 1
  96.     INR    A
  97.     STA    SECNO
  98.     LXI    H,SPERT
  99.     CMP    M
  100.     JC    SAMTK1
  101.     LHLD    CURTRK
  102.     INX    H
  103.     SHLD    CURTRK
  104.     XRA    A
  105.     STA    SECNO
  106.     CALL    DOTRK
  107. SAMTK1:    LXI    H,LSEC
  108.     INR    M
  109.     MOV    A,M
  110.     ADD    A
  111.     ADD    A    ;TIMES 4ENT/TRK
  112.     DCR    A
  113.     LXI    H,DIRENT
  114.     CMP    M
  115.     JNZ    SAP1
  116. ;
  117.     CALL    CLEAN        ;CLEAN THE DIRECTORY
  118.     CALL    SORT        ;SORT THE DIRECTORY
  119.     CALL    PACK        ;PACK THE DIRECTORY
  120.     XRA    A        ;SECNO = 0 LOGICAL
  121.     STA    SECNO
  122.     STA    LSEC
  123.     LHLD    TKOFFS
  124.     SHLD    CURTRK
  125.     CALL    DOTRK
  126.     LXI    H,BUF        ;ADDR = FWA OF BUFFER
  127.     SHLD    ADDR
  128. ;
  129. SAP2:    CALL    XLATS
  130.     LHLD    ADDR        ;SET DMA ADDRESS TO "ADDR"
  131.     MOV    B,H
  132.     MOV    C,L
  133.     MVI    E,SETDMA
  134.     CALL    XCPM
  135.     MVI    E,WRITE
  136.     CALL    XCPM        ;WRITE SECTOR TO DISK
  137.     LHLD    ADDR        ;ADDR = ADDR + 80H
  138.     LXI    D,128
  139.     DAD    D
  140.     SHLD    ADDR
  141.     LDA    SECNO        ;SECNO = SECNO + 1
  142.     INR    A
  143.     STA    SECNO
  144.     LXI    H,SPERT
  145.     CMP    M
  146.     JC    SAMTK2
  147.     LHLD    CURTRK
  148.     INX    H
  149.     SHLD    CURTRK
  150.     XRA    A
  151.     STA    SECNO
  152.     CALL    DOTRK
  153. SAMTK2:    LXI    H,LSEC
  154.     INR    M
  155.     MOV    A,M
  156.     ADD    A
  157.     ADD    A
  158.     DCR    A
  159.     LXI    H,DIRENT
  160.     CMP    M
  161.     JNZ    SAP2
  162.     JMP    0        ;EXIT TO CP/M WARM BOOT
  163. ;
  164. DOTRK:    MOV    B,H
  165.     MOV    C,L
  166.     MVI    E,SETTRK
  167.     JMP    XCPM
  168. ;
  169. CLEAN:    MVI    A,0        ;I = 0
  170. CLEAN1:    STA    I
  171.     CALL    INDEX        ;HL = BUF + 32 * I
  172.     MOV    A,M        ;JUMP IF THIS IS A DELETED FILE
  173.     CPI    0E5H
  174.     JZ    CLEAN2
  175.     LXI    D,9        ;OFFSET TO R/O FLG
  176.     DAD    D
  177.     MOV    A,M
  178.     ANI    80H
  179.     JNZ    CLEAN4
  180.     LXI    D,6        ;HL = HL + 6
  181.     DAD    D
  182.     MOV    A,M        ;CHECK RECORD COUNT FIELD
  183.     ORA    A
  184.     JNZ    CLEAN4        ;JUMP IF NON-ZERO
  185. CLEAN2:    LDA    I        ;CLEAR ALL 32 BYTES OF
  186.     CALL    INDEX        ;  DIRECTORY ENTRY TO E5
  187.     MVI    C,32
  188. CLEAN3:    MVI    M,0E5H
  189.     INX    H
  190.     DCR    C
  191.     JNZ    CLEAN3
  192. CLEAN4:    LDA    I        ;I = I + 1
  193.     LXI    H,DIRENT
  194.     CMP    M
  195.     RZ
  196.     INR    A
  197.     JMP    CLEAN1
  198. ;
  199. XLATS:    LDA    VERFLG
  200.     ORA    A
  201.     LDA    SECNO
  202.     JNZ    XLT2
  203.     LXI    H,LPMAP
  204.     ADD    L
  205.     MOV    L,A
  206.     JNC    NOCRY
  207.     INR    H
  208. NOCRY:    MOV    C,M
  209. XLT3:    MVI    E,SETSEC
  210.     JMP    XCPM
  211. ;
  212. XLT2:    MOV    C,A
  213.     MVI    B,0
  214.     LHLD    1
  215.     LXI    D,XLT
  216.     DAD    D
  217.     LXI    D,XRSLT
  218.     PUSH    D    ;FAKE CALL
  219.     XCHG
  220.     LHLD    ADMAP
  221.     XCHG
  222.     PCHL
  223. ;
  224. XRSLT:    MOV    C,L
  225.     JMP    XLT3
  226. ;
  227. ADMAP:    DW    LPMAP
  228. ;
  229. LPMAP:    DB    01,07,13,19,25,05,11,17,23,03,09,15,21
  230.     DB    02,08,14,20,26,06,12,18,24,04,10,16,22
  231.  
  232. COMP:    LDA    I        ;HL = BUF + 32 * I
  233.     CALL    INDEX
  234.     PUSH    H
  235.     LDA    J        ;HL = BUF + 32 * J
  236.     CALL    INDEX
  237.     XCHG
  238.     POP    H
  239.     MVI    C,13        ;NUMBER OF BYTES TO COMPARE
  240. COMP1:    MOV    A,M    ;GET NEXT BYTE
  241.     ANI    7FH    ;REMOVE ATTRIBUTE
  242.     MOV    B,A
  243.     LDAX    D        ;COMPARE NEXT BYTE
  244.     ANI    7FH    ;REMOVE ATTRIBUTES
  245.     CMP    B
  246.     RNZ            ;RETURN IF NOT EQUAL
  247.     INX    D
  248.     INX    H
  249.     DCR    C        ;LOOP THRU FIRST 13 BYTES
  250.     JNZ    COMP1
  251.     XRA    A        ;CLEAR FLAGS AND EXIT
  252.     RET
  253.  
  254. SORT:    MVI    A,0        ;I = 0
  255.     STA    I
  256. SORT1:    LDA    I        ;J = I + 1
  257.     INR    A
  258.     STA    J
  259. SORT2:    CALL    COMP        ;IF NAME(J)<NAME(I), SWAP
  260.     CC    SWAP
  261.     LDA    J        ;J = J + 1
  262.     INR    A
  263.     STA    J
  264.     JZ    SORT3
  265.     LXI    H,DIRENT
  266.     CMP    M
  267.     JNZ    SORT2
  268. SORT3:    LDA    I        ;I = I + 1
  269.     INR    A
  270.     STA    I
  271.     LXI    H,DIRENT
  272.     RZ
  273.     CMP    M
  274.     JC    SORT1
  275.     RET
  276.  
  277. SWAP:    LDA    I
  278.     CALL    INDEX
  279.     PUSH    H
  280.     LDA    J
  281.     CALL    INDEX
  282.     XCHG
  283.     POP    H
  284.     MVI    C,32
  285. SWAP1:    LDAX    D
  286.     MOV    B,A
  287.     MOV    A,M
  288.     STAX    D
  289.     MOV    M,B
  290.     INX    D
  291.     INX    H
  292.     DCR    C
  293.     JNZ    SWAP1
  294.     RET
  295.  
  296. INDEX:    MOV    L,A
  297.     MVI    H,0
  298.     DAD    H
  299.     DAD    H
  300.     DAD    H
  301.     DAD    H
  302.     DAD    H
  303.     LXI    D,BUF
  304.     DAD    D
  305.     RET
  306.  
  307. PACK:    MVI    A,0        ;I = 0
  308. PACK1:    STA    I
  309.     CALL    INDEX        ;HL = BUF + 32 * I
  310.     MOV    A,L        ;HL = HL + 9
  311.     ADI    9
  312.     MOV    L,A
  313.     JNC    $+4
  314.     INR    H
  315.     MOV    A,M        ;JUMP IF FILETYPE NOT 'X$$'
  316.     SUI    '0'        ;  WHERE 0.LE.X.LE.9
  317.     JC    PACK2
  318.     CPI    10
  319.     JNC    PACK2
  320.     STA    J
  321.     INX    H
  322.     MOV    A,M
  323.     CPI    '$'
  324.     JNZ    PACK2
  325.     INX    H
  326.     MOV    A,M
  327.     CPI    '$'
  328.     JNZ    PACK2
  329.     INX    H        ;SET EXTENT NUMBER TO X
  330.     LDA    J
  331.     MOV    M,A
  332.     DCX    H        ;SET FILETYPE TO '$$$'
  333.     MVI    M,'$'
  334.     DCX    H
  335.     MVI    M,'$'
  336.     DCX    H
  337.     MVI    M,'$'
  338. PACK2:    LDA    I        ;I = I + 1
  339.     LXI    H,DIRENT
  340.     CMP    M
  341.     RZ
  342.     INR    A
  343.     JMP    PACK1
  344. ;
  345. XCPM:    MVI    D,0    ;CLEAR HI BYTE
  346.     LHLD    1    ;WARM BOOT VECT ADDR
  347.     DAD    D    ;CALC VECTOR
  348.     PCHL
  349. ;
  350. ;    DATA AREA
  351. CURTRK:    DW    2
  352. SPERT    DW    26    ;1.4 DEFLT
  353. DIRENT:    DW    63    ;1.4
  354. TKOFFS:    DW    2    ;1.4
  355. VERFLG:    DB    0
  356. LSEC:    DB    0
  357. STACK:    DS    32
  358. SECNO:    DS    1
  359. ADDR:    DS    2
  360. I:    DS    1
  361. J:    DS    1
  362.     DS    1    ;MAKE EVEN
  363. BUF:    DS    1
  364. ;
  365.     END
  366.