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

  1. ;    SORTDIR - CP/M UTILITY TO SORT DISK DIRECTORY
  2. ;
  3.     ORG    0100H
  4.     JMP    SORTDIR
  5.     DB    '(C) 1980 - N D H HAMMOND'
  6. PRGNAME    DB    'SORTDIR V1.1 OF 22APR80'
  7.     DB    0DH,0AH,'$'
  8. ;
  9. ;    DEFINITIONS
  10. ;
  11. BOOT    EQU    0000H        ;CP/M BOOT VECTOR
  12. CBIOS    EQU    BOOT+1        ;^CBIOS
  13. ENTRY    EQU    0005H        ;CP/M FDOS ENTRY
  14. TBUFF    EQU    0080H        ;DEFAULT BUFFER
  15. DIRTRK    EQU    2        ;DIRECTORY TRACK NO
  16. NDIRSEC    EQU    16        ;NO OF DIR SECTORS
  17. NDIRENT    EQU    64        ;MAX NO OF DIR ENTRIES
  18. ENTLGTH    EQU    32        ;ENTRY LGTH IN BYTES
  19. NLGTH    EQU    8        ;NAME FIELD LGTH
  20. TLGTH    EQU    3        ;TYPE FIELD LGTH
  21. FNLGTH    EQU    NLGTH+TLGTH    ;LENGTH OF FILENAME
  22. FLSTEP    EQU    0FH        ;OFFSET TO FL FIELD
  23. DELCHR    EQU    0E5H        ;DELETED DATA CHAR
  24. NAME    EQU    0        ;SORT BY FILE NAME
  25. TYPE    EQU    0FFH        ;SORT BY FILE TYPE
  26. ;
  27. ;    MAIN PROGRAM
  28. ;
  29. SORTDIR    LXI    H,0        ;SAVE SYSTEM SP
  30.     DAD    SP
  31.     SHLD    OLDSP
  32.     LXI    SP,STACK
  33.     LXI    D,PRGNAME    ;PRINT SIGNON MSG
  34.     CALL    WRITESTRING
  35.     CALL    CHECKMODE
  36.     CALL    GETDISK
  37.     CALL    READDIR
  38.     CALL    TIDY
  39.     CALL    SORT
  40.     CALL    WRITEDIR
  41.     CALL    INITBDOS
  42.     LXI    D,TERMMSG
  43.     CALL    WRITESTRING
  44.     LHLD    OLDSP        ;RESTORE SYSTEM SP
  45.     SPHL
  46.     RET            ;RETURN TO CP/M
  47. ;
  48. ;    SUBROUTINES
  49. ;
  50. CHECKMODE    ;CHECK FOR NAME-TYPE OR TYPE-NAME SORT
  51.     MVI    A,NAME
  52.     STA    MODE
  53.     LXI    H,TBUFF
  54.     MOV    A,M
  55.     CPI    2
  56.     JNZ    NOSTAR
  57.     INX    H
  58.     INX    H
  59.     MOV    A,M
  60.     CPI    '*'
  61.     JNZ    NOSTAR
  62.     MVI    A,TYPE
  63.     STA    MODE
  64. NOSTAR    RET
  65. ;
  66. ;
  67. GETDISK    ;PROMPT OPERATOR FOR DISK
  68.     LXI    D,DSKMSG
  69.     CALL    WRITESTRING
  70. GET1    CALL    READCHAR
  71.     CPI    0DH        ;<CR> ?
  72.     RZ
  73.     CPI    03H        ;<^C> ?
  74.     JZ    BOOT
  75.     JMP    GET1
  76. ;
  77. ;
  78. READDIR    ;READ DISK DIRECTORY INTO BUFFER
  79.     MVI    C,DIRTRK    ;SET TRACK NO
  80.     CALL    SETTRK
  81.     LXI    H,BUFFER    ;INITIALIZE BUFFPT
  82.     SHLD    BUFFPT
  83.     XRA    A        ;INITIALIZE SECTOR
  84.     STA    SECTOR
  85. READLP    CALL    NEXTSEC        ;SET SECTOR NO
  86.     LHLD    BUFFPT        ;SET DMA ADDRESS
  87.     MOV    B,H
  88.     MOV    C,L
  89.     CALL    SETDMA
  90.     CALL    READ        ;READ SECTOR
  91.     LHLD    BUFFPT        ;UPDATE DMA ADDRESS
  92.     LXI    D,80H
  93.     DAD    D
  94.     SHLD    BUFFPT
  95.     LDA    SECTOR        ;UPDATE SECTOR
  96.     INR    A
  97.     STA    SECTOR
  98.     CPI    NDIRSEC
  99.     JNZ    READLP
  100.     RET
  101. ;
  102. ;
  103. WRITEDIR    ;WRITE DISK DIRECTORY FROM BUFFER
  104.     MVI    C,DIRTRK    ;SET TRACK NO
  105.     CALL    SETTRK
  106.     LXI    H,BUFFER    ;INITIALIZE BUFFPT
  107.     SHLD    BUFFPT
  108.     XRA    A        ;INITIALIZE SECTOR
  109.     STA    SECTOR
  110. WRITELP    CALL    NEXTSEC        ;SET SECTOR NO
  111.     LHLD    BUFFPT        ;SET DMA ADDRESS
  112.     MOV    B,H
  113.     MOV    C,L
  114.     CALL    SETDMA
  115.     CALL    WRITE        ;WRITE SECTOR
  116.     LHLD    BUFFPT    ;UPDATE DMA ADDRESS
  117.     LXI    D,80H
  118.     DAD    D
  119.     SHLD    BUFFPT
  120.     LDA    SECTOR    ;UPDATE SECTOR
  121.     INR    A
  122.     STA    SECTOR
  123.     CPI    NDIRSEC
  124.     JNZ    WRITELP
  125.     RET
  126. ;
  127. ;
  128. NEXTSEC    ;SET SECTOR NO TO NEXT DIRECTORY SECTOR
  129.     ;MAPS SEQUENTIAL NO IN REG-A TO PHYSICAL
  130.     ;SECTOR ON DISK.
  131.     LXI    H,SEGTABLE
  132.     MVI    B,0
  133.     MOV    C,A
  134.     DAD    B
  135.     MOV    C,M
  136.     CALL    SETSEC
  137.     RET
  138. ;
  139. SEGTABLE
  140.     DB    01H,07H,0DH,13H
  141.     DB    19H,05H,0BH,11H
  142.     DB    17H,03H,09H,0FH
  143.     DB    15H,02H,08H,0EH
  144. ;
  145. ;
  146. TIDY    ;TIDY DIRECTORY BY COMPLETELY DELETING 
  147.     ;ERASED ENTRIES AND ENTRIES OF ZERO LENGTH
  148.     MVI    D,NDIRENT
  149.     LXI    H,BUFFER
  150. TIDYLP    MOV    A,M        ;CHECK FOR ERASED FILE
  151.     PUSH    H
  152.     CPI    DELCHR
  153.     CZ    DELETE
  154.     LXI    B,FLSTEP    ;CHECK FOR ZERO LGTH
  155.     DAD    B
  156.     MOV    A,M
  157.     POP    H
  158.     PUSH    H
  159.     CPI    0
  160.     CZ    DELETE
  161.     LXI    B,ENTLGTH    ;STEP TO NEXT ENTRY
  162.     POP    H
  163.     DAD    B
  164.     DCR    D
  165.     JNZ    TIDYLP
  166.     RET
  167. ;
  168. ;
  169. DELETE    ;DELETE FILE ENTRY AT HL^
  170.     ;PRESERVE HL
  171.     PUSH    H
  172.     MVI    B,ENTLGTH
  173. DELLP    MVI    M,DELCHR
  174.     INX    H
  175.     DCR    B
  176.     JNZ    DELLP
  177.     POP    H
  178.     RET
  179. ;
  180. ;
  181. SORT    ;BUBBLE SORT DIRECTORY INTO ALPHABETICAL ORDER
  182.     MVI    A,NDIRENT-1
  183.     STA    OPC        ;OUTER LOOP PASSES
  184. SORTOLP    STA    IPC        ;INNER LOOP PASSES
  185.     LXI    B,2*ENTLGTH
  186.     LXI    H,BUFFER
  187.     LXI    D,BUFFER+ENTLGTH
  188. SORTILP    PUSH    B
  189.     PUSH    H
  190.     PUSH    D
  191.     LDA    MODE
  192.     CPI    NAME
  193.     JNZ    CTYP
  194.     CALL    COMPNAME
  195.     JMP    CKSWP
  196. CTYP    CALL    COMPTYPE
  197. CKSWP    CC    SWAP
  198.     POP    D
  199.     POP    H
  200.     POP    B
  201.     DAD    B
  202.     XCHG
  203.     LDA    IPC
  204.     DCR    A
  205.     STA    IPC
  206.     JNZ    SORTILP    ;END INNER LOOP
  207.     LDA    OPC
  208.     DCR    A
  209.     STA    OPC
  210.     JNZ    SORTOLP    ;END OUTER LOOP
  211.     RET
  212. ;
  213. ;
  214. COMPNAME    ;COMPARE FILES BY NAME:TYPE
  215.     MVI    B,FNLGTH
  216.     CALL    COMPARE
  217.     RET
  218. ;
  219. ;
  220. COMPTYPE    ;COMPARE BY TYPE:NAME
  221.     PUSH    H
  222.     PUSH    D
  223.     LXI    B,NLGTH+1
  224.     DAD    B
  225.     XCHG
  226.     DAD    B
  227.     XCHG
  228.     MVI    B,TLGTH
  229.     CALL    COMPARE
  230.     POP    D
  231.     POP    H
  232.     RNZ
  233.     MVI    B,NLGTH
  234.     CALL    COMPARE
  235.     RET
  236. ;
  237. ;
  238. COMPARE    ;COMPARE FIELDS (LENGTH B) OF ENTRIES AT HL^
  239.     ;AND DE^. SET C AND Z FLAGS (C => DE^
  240.     ;FILENAME SMALLER).
  241.     ;PRESERVE REGS HL AND DE
  242.     PUSH    D
  243.     PUSH    H
  244. COMPLP    LDAX    D
  245.     CMP    M
  246.     JNZ    ENDCOMP
  247.     INX    D
  248.     INX    H
  249.     DCR    B
  250.     JNZ    COMPLP
  251.     XRA    A
  252. ENDCOMP    POP    H
  253.     POP    D
  254.     RET
  255. ;
  256. ;
  257. SWAP    ;SWAP ENTRIES AT HL^ AND DE^
  258.     MVI    B,ENTLGTH
  259. SWAPLP    LDAX    D
  260.     MOV    C,A
  261.     MOV    A,M
  262.     MOV    M,C
  263.     STAX    D
  264.     INX    H
  265.     INX    D
  266.     DCR    B
  267.     JNZ    SWAPLP
  268.     RET
  269. ;
  270. ;    I/O ROUTINES
  271. ;
  272. WRITESTRING    ;WRITE STRING TO CONSOLE
  273.     MVI    C,9
  274.     JMP    ENTRY
  275. ;
  276. ;
  277. READCHAR    ;READ CHARACTER FROM CONSOLE
  278.     MVI    C,1
  279.     JMP    ENTRY
  280. ;
  281. ;
  282. INITBDOS    ;INITIALIZE BDOS, LOG IN DISK A
  283.     MVI    C,13
  284.     JMP    ENTRY
  285. ;
  286. ;
  287. ;    WARNING - THESE LOW LEVEL DISK I/O ROUTINES
  288. ;    ACCESS THE CP/M CBIOS DIRECTLY.  THEY MAY
  289. ;    NEED MODIFICATION WITH NON STANDARD SYSTEMS.
  290. ;
  291. ;
  292. SETTRK    ;SET TRACK (C-REG)
  293.     LHLD    CBIOS
  294.     MVI    L,1EH
  295.     PCHL
  296. ;
  297. ;
  298. SETSEC    ;SET SECTOR (C-REG)
  299.     LHLD    CBIOS
  300.     MVI    L,21H
  301.     PCHL
  302. ;
  303. ;
  304. SETDMA    ;SET TRANSFER ADDRESS (BC-REG)
  305.     LHLD    CBIOS
  306.     MVI    L,24H
  307.     PCHL
  308. ;
  309. ;
  310. READ    ;READ A SECTOR
  311.     LHLD    CBIOS
  312.     MVI    L,27H
  313.     PCHL
  314. ;
  315. ;
  316. WRITE    ;WRITE A SECTOR
  317.     LHLD    CBIOS
  318.     MVI    L,2AH
  319.     PCHL
  320. ;
  321. ;
  322. ;    DATA AREA
  323. ;
  324. DSKMSG    DB    'INSERT DISK, <CR> TO CONTINUE'
  325.     DB    0DH,0AH,'$'
  326. TERMMSG    DB    'FUNCTION COMPLETE'
  327.     DB    0DH,0AH,'$'
  328. OLDSP    DS    2    ;SYSTEM STACK POINTER
  329. SECTOR    DS    1    ;CURRENT SECTOR SEQUENCE NO
  330. MODE    DS    1    ;SORT MODE FLAG
  331. IPC    DS    1    ;INNER PASS COUNTER
  332. OPC    DS    1    ;OUTER PASS COUNTER
  333. BUFFPT    DS    2    ;BUFFER POINTER
  334.     DS    20H    ;STACK SPACE
  335. STACK    EQU    $    ;GROWS DOWN
  336. BUFFER    EQU    $    ;GROWS UP
  337. ;
  338.     END
  339.