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 / ZSYS / SIMTEL20 / SYSLIB / SLIB1.LBR / SDIR06.Z80 < prev    next >
Text File  |  2000-06-30  |  10KB  |  421 lines

  1. ;
  2. ; SYSLIB Module Name:  SDIR06
  3. ; Author:  Richard Conn
  4. ; Part of SYSLIB3 SDIR Series
  5. ; SYSLIB Version Number:  3.6
  6. ; Module Version Number:  1.5
  7.  
  8.     public    diralpha
  9.  
  10.     MACLIB    SDIRHDR.LIB
  11.     EXT    SDMOVE,PRINT
  12.  
  13. ;
  14. ;  DIRALPHA -- ALPHABETIZES DIRECTORY PTED TO BY HL; BC CONTAINS
  15. ;    THE NUMBER OF FILES IN THE DIRECTORY AND A = SORT FLAG
  16. ;    (0=SORT BY FILE NAME/TYPE, <>0 = SORT BY FILE TYPE/NAME)
  17. ;
  18. DIRALPHA:
  19.     LD    (CMP$FLAG),A    ; SET FLAG
  20.     LD    A,B    ; ANY FILES?
  21.     OR    C
  22.     RET    Z
  23.     PUSH    HL    ; SAVE REGS
  24.     PUSH    DE
  25.     PUSH    BC
  26.     LD    (DIRBUF),HL    ; SAVE PTR TO DIRECTORY
  27.     PUSH    HL    ; SAVE HL
  28.     LD    H,B    ; HL=BC=FILE COUNT
  29.     LD    L,C
  30.     LD    (N),HL    ; SET "N"
  31.     POP    HL
  32. ;
  33. ;  SHELL SORT --
  34. ;    THIS SORT ROUTINE IS ADAPTED FROM "SOFTWARE TOOLS"
  35. ;    BY KERNIGAN AND PLAUGHER, PAGE 106.  COPYRIGHT, 1976, ADDISON-WESLEY.
  36. ;  ON ENTRY, BC=NUMBER OF ENTRIES
  37. ;
  38. SORT:
  39.     EX    DE,HL        ; POINTER TO DIRECTORY IN DE
  40.     LD    HL,(ORDER)    ; PT TO ORDER TABLE
  41. ;
  42. ;  SET UP ORDER TABLE; HL PTS TO NEXT ENTRY IN ORDER TABLE, DE PTS TO NEXT
  43. ;    ENTRY IN DIRECTORY, BC = NUMBER OF ELEMENTS REMAINING
  44. ;
  45. SORT1:
  46.     LD    (HL),E    ; STORE LOW-ORDER ADDRESS
  47.     INC    HL    ; PT TO NEXT ORDER BYTE
  48.     LD    (HL),D    ; STORE HIGH-ORDER ADDRESS
  49.     INC    HL    ; PT TO NEXT ORDER ENTRY
  50.     PUSH    HL    ; SAVE PTR
  51.     LD    HL,ESIZE    ; HL=NUMBER OF BYTES/ENTRY
  52.     ADD    HL,DE    ; PT TO NEXT DIR1 ENTRY
  53.     EX    DE,HL        ; DE PTS TO NEXT ENTRY
  54.     POP    HL    ; GET PTR TO ORDER TABLE
  55.     DEC    BC    ; COUNT DOWN
  56.     LD    A,B    ; DONE?
  57.     OR    C
  58.     JP    NZ,SORT1
  59. ;
  60. ;  THIS IS THE MAIN SORT LOOP FOR THE SHELL SORT IN "SOFTWARE TOOLS" BY K&P
  61. ;
  62.  
  63. ;
  64. ;  SHELL SORT FROM "SOFTWARE TOOLS" BY KERNINGHAN AND PLAUGER
  65. ;
  66.     LD    HL,(N)    ; NUMBER OF ITEMS TO SORT
  67.     LD    (GAP),HL    ; SET INITIAL GAP TO N FOR FIRST DIVISION BY 2
  68.  
  69. ;  FOR (GAP = N/2; GAP > 0; GAP = GAP/2)
  70. SRTL0:
  71.     OR    A    ; CLEAR CARRY
  72.     LD    HL,(GAP)    ; GET PREVIOUS GAP
  73.     LD    A,H    ; ROTATE RIGHT TO DIVIDE BY 2
  74.     RRA
  75.     LD    H,A
  76.     LD    A,L
  77.     RRA
  78.     LD    L,A
  79.  
  80. ;  TEST FOR ZERO
  81.     OR    H
  82.     JP    Z,SDONE    ; DONE WITH SORT IF GAP = 0
  83.  
  84.     LD    (GAP),HL    ; SET VALUE OF GAP
  85.     LD    (IVAL),HL    ; SET I=GAP FOR FOLLOWING LOOP
  86.  
  87. ;  FOR (I = GAP + 1; I <= N; I = I + 1)
  88. SRTL1:
  89.     LD    HL,(IVAL)    ; ADD 1 TO I
  90.     INC    HL
  91.     LD    (IVAL),HL
  92.  
  93. ;  TEST FOR I <= N
  94.     EX    DE,HL        ; I IS IN DE
  95.     LD    HL,(N)    ; GET N
  96.     LD    A,L    ; COMPARE BY SUBTRACTION
  97.     SUB    E
  98.     LD    A,H
  99.     SBC    A,D    ; CARRY SET MEANS I > N
  100.     JP    C,SRTL0    ; DON'T DO FOR LOOP IF I > N
  101.  
  102.     LD    HL,(IVAL)    ; SET J = I FOR FIRST SUBTRACTION OF GAP
  103.     LD    (J),HL
  104.  
  105. ;  FOR (J = I - GAP; J > 0; J = J - GAP)
  106. SRTL2:
  107.     LD    HL,(GAP)    ; GET GAP
  108.     EX    DE,HL        ; ... IN DE
  109.     LD    HL,(J)    ; GET J
  110.     LD    A,L    ; COMPUTE J - GAP
  111.     SUB    E
  112.     LD    L,A
  113.     LD    A,H
  114.     SBC    A,D
  115.     LD    H,A
  116.     LD    (J),HL    ; J = J - GAP
  117.     JP    C,SRTL1    ; IF CARRY FROM SUBTRACTIONS, J < 0 AND ABORT
  118.     LD    A,H    ; J=0?
  119.     OR    L
  120.     JP    Z,SRTL1    ; IF ZERO, J=0 AND ABORT
  121.  
  122. ;  SET JG = J + GAP
  123.     EX    DE,HL        ; J IN DE
  124.     LD    HL,(GAP)    ; GET GAP
  125.     ADD    HL,DE    ; J + GAP
  126.     LD    (JG),HL    ; JG = J + GAP
  127.  
  128. ;  IF (V(J) <= V(JG))
  129.     CALL    ICOMPARE    ; J IN DE, JG IN HL
  130.  
  131. ;  ... THEN BREAK
  132.     JP    C,SRTL1
  133.  
  134. ;  ... ELSE EXCHANGE
  135.     LD    HL,(J)    ; SWAP J, JG
  136.     EX    DE,HL
  137.     LD    HL,(JG)
  138.     CALL    ISWAP    ; J IN DE, JG IN HL
  139.  
  140. ;  END OF INNER-MOST FOR LOOP
  141.     JP    SRTL2
  142.  
  143. ;
  144. ;  SORT IS DONE -- RESTRUCTURE DIR1 IN SORTED ORDER IN PLACE
  145. ;
  146. SDONE:
  147.     LD    HL,(N)    ; NUMBER OF ENTRIES
  148.     LD    B,H    ; ... IN BC
  149.     LD    C,L
  150.     LD    HL,(ORDER)    ; PTR TO ORDERED POINTER TABLE
  151.     LD    (PTPTR),HL    ; SET PTR PTR
  152.     LD    HL,(DIRBUF)    ; PTR TO UNORDERED DIRECTORY
  153.     LD    (PTDIR),HL    ; SET PTR DIR BUFFER
  154.  
  155. ;  FIND PTR TO NEXT DIR1 ENTRY
  156. SRTDN:
  157.     LD    HL,(PTPTR)    ; PT TO REMAINING POINTERS
  158.     EX    DE,HL        ; ... IN DE
  159.     LD    HL,(PTDIR)    ; HL PTS TO NEXT DIR ENTRY
  160.     PUSH    BC    ; SAVE COUNT OF REMAINING ENTRIES
  161.  
  162. ;  FIND PTR TABLE ENTRY
  163. SRTDN1:
  164.     LD    A,(DE)    ; GET CURRENT POINTER TABLE ENTRY VALUE
  165.     INC    DE    ; PT TO HIGH-ORDER POINTER BYTE
  166.     CP    L    ; COMPARE AGAINST DIR1 ADDRESS LOW
  167.     JP    NZ,SRTDN2    ; NOT FOUND YET
  168.     LD    A,(DE)    ; LOW-ORDER BYTES MATCH -- GET HIGH-ORDER POINTER BYTE
  169.     CP    H    ; COMPARE AGAINST DIR1 ADDRESS HIGH
  170.     JP    Z,SRTDN3    ; MATCH FOUND
  171. SRTDN2:
  172.     INC    DE    ; PT TO NEXT PTR TABLE ENTRY
  173.     DEC    BC    ; COUNT DOWN
  174.     LD    A,C    ; END OF TABLE?
  175.     OR    B
  176.     JP    NZ,SRTDN1    ; CONTINUE IF NOT
  177.  
  178. ;  FATAL ERROR -- INTERNAL ERROR; POINTER TABLE NOT CONSISTENT
  179. FERR$PTR:
  180.     CALL    PRINT
  181.     DB    0DH,0AH,'DIRALPHA Error',0
  182.     JP    CPM
  183.  
  184. ;  FOUND THE POINTER TABLE ENTRY WHICH POINTS TO THE NEXT UNORDERED DIR1 ENTRY
  185. ;    MAKE BOTH POINTERS (PTR TO NEXT, PTR TO CURRENT UNORDERED DIR1 ENTRY)
  186. ;    POINT TO SAME LOCATION (PTR TO NEXT DIR1 ENTRY TO BE ORDERED)
  187. SRTDN3:
  188.     LD    HL,(PTPTR)    ; GET PTR TO NEXT ORDERED ENTRY
  189.     DEC    DE    ; DE PTS TO LOW-ORDER POINTER ADDRESS
  190.     LD    A,(HL)    ; MAKE PTR TO NEXT UNORDERED DIR1 PT TO BUFFER FOR
  191.     LD    (DE),A    ;   DIR1 ENTRY TO BE MOVED TO NEXT UNORDERED DIR1 POS
  192.     INC    HL    ; PT TO NEXT PTR ADDRESS
  193.     INC    DE
  194.     LD    A,(HL)    ; MAKE HIGH POINT SIMILARLY
  195.     LD    (DE),A
  196.  
  197. ;  COPY NEXT UNORDERED DIR1 ENTRY TO HOLD BUFFER
  198.     LD    B,ESIZE    ; B=NUMBER OF BYTES/ENTRY
  199.     LD    HL,(PTDIR)    ; PT TO ENTRY
  200.     LD    DE,HOLD    ; PT TO HOLD BUFFER
  201.     PUSH    BC    ; SAVE B=NUMBER OF BYTES/ENTRY
  202.     CALL    SDMOVE
  203.     POP    BC
  204.  
  205. ;  COPY TO-BE-ORDERED DIR1 ENTRY TO NEXT ORDERED DIR1 POSITION
  206.     LD    HL,(PTPTR)    ; POINT TO ITS POINTER
  207.     LD    E,(HL)    ; GET LOW-ADDRESS POINTER
  208.     INC    HL
  209.     LD    D,(HL)    ; GET HIGH-ADDRESS POINTER
  210.     LD    HL,(PTDIR)    ; DESTINATION ADDRESS FOR NEXT ORDERED ENTRY
  211.     EX    DE,HL        ; HL PTS TO ENTRY TO BE MOVED, DE PTS TO DEST
  212.     PUSH    BC    ; SAVE B=NUMBER OF BYTES/ENTRY
  213.     CALL    SDMOVE
  214.     POP    BC
  215.     EX    DE,HL        ; HL PTS TO NEXT UNORDERED DIR1 ENTRY
  216.     LD    (PTDIR),HL    ; SET POINTER FOR NEXT LOOP
  217.  
  218. ;  COPY ENTRY IN HOLD BUFFER TO LOC PREVIOUSLY HELD BY LATEST ORDERED ENTRY
  219.     LD    HL,(PTPTR)    ; GET PTR TO PTR TO THE DESTINATION
  220.     LD    E,(HL)    ; GET LOW-ADDRESS POINTER
  221.     INC    HL
  222.     LD    D,(HL)    ; HIGH-ADDRESS POINTER
  223.     LD    HL,HOLD    ; HL PTS TO HOLD BUFFER, DE PTS TO ENTRY DEST
  224.     CALL    SDMOVE    ; B=NUMBER OF BYTES/ENTRY
  225.  
  226. ;  POINT TO NEXT ENTRY IN POINTER TABLE
  227.     LD    HL,(PTPTR)    ; POINTER TO CURRENT ENTRY
  228.     INC    HL    ; SKIP OVER IT
  229.     INC    HL
  230.     LD    (PTPTR),HL
  231.  
  232. ;  COUNT DOWN
  233.     POP    BC    ; GET COUNTER
  234.     DEC    BC    ; COUNT DOWN
  235.     LD    A,C    ; DONE?
  236.     OR    B
  237.     JP    NZ,SRTDN
  238.     POP    BC    ; RESTORE REGS
  239.     POP    DE
  240.     POP    HL
  241.     RET        ; DONE
  242.  
  243. ;
  244. ;  SWAP (Exchange) the pointers in the ORDER table whose indexes are in
  245. ;    HL and DE
  246. ;
  247. ISWAP:
  248.     PUSH    HL        ; SAVE HL
  249.     LD    HL,(ORDER)        ; ADDRESS OF ORDER TABLE - 2
  250.     LD    B,H        ; ... IN BC
  251.     LD    C,L
  252.     POP    HL
  253.     DEC    HL        ; ADJUST INDEX TO 0...N-1 FROM 1...N
  254.     ADD    HL,HL        ; HL PTS TO OFFSET ADDRESS INDICATED BY INDEX
  255.                 ;   OF ORIGINAL HL (1, 2, ...)
  256.     ADD    HL,BC        ; HL NOW PTS TO POINTER INVOLVED
  257.     EX    DE,HL            ; DE NOW PTS TO POINTER INDEXED BY HL
  258.     DEC    HL        ; ADJUST INDEX TO 0...N-1 FROM 1...N
  259.     ADD    HL,HL        ; HL PTS TO OFFSET ADDRESS INDICATED BY INDEX
  260.                 ;   OF ORIGINAL DE (1, 2, ...)
  261.     ADD    HL,BC        ; HL NOW PTS TO POINTER INVOLVED
  262.     LD    C,(HL)        ; EXCHANGE POINTERS -- GET OLD (DE)
  263.     LD    A,(DE)        ; -- GET OLD (HL)
  264.     EX    DE,HL        ; SWITCH
  265.     LD    (HL),C        ; PUT NEW (HL)
  266.     LD    (DE),A        ; PUT NEW (DE)
  267.     INC    HL        ; PT TO NEXT BYTE OF POINTER
  268.     INC    DE
  269.     LD    C,(HL)        ; GET OLD (HL)
  270.     LD    A,(DE)        ; GET OLD (DE)
  271.     EX    DE,HL        ; SWITCH
  272.     LD    (HL),C        ; PUT NEW (DE)
  273.     LD    (DE),A        ; PUT NEW (HL)
  274.     RET
  275. ;
  276. ;  ICOMPARE compares the entry pointed to by the pointer pointed to by HL
  277. ;    with that pointed to by DE (1st level indirect addressing); on entry,
  278. ;    HL and DE contain the numbers of the elements to compare (1, 2, ...);
  279. ;    on exit, Carry Set means ((DE)) < ((HL)), Zero Set means ((HL)) = ((DE)),
  280. ;    and Non-Zero and No-Carry means ((DE)) > ((HL))
  281. ;
  282. ICOMPARE:
  283.     PUSH    HL        ; SAVE HL
  284.     LD    HL,(ORDER)    ; ADDRESS OF ORDER - 2
  285.     LD    B,H        ; ... IN BC
  286.     LD    C,L
  287.     POP    HL
  288.     DEC    HL        ; ADJUST INDEX TO 0...N-1 FROM 1...N
  289.     ADD    HL,HL        ; DOUBLE THE ELEMENT NUMBER TO POINT TO THE PTR
  290.     ADD    HL,BC        ; ADD TO THIS THE BASE ADDRESS OF THE PTR TABLE
  291.     EX    DE,HL        ; RESULT IN DE
  292.     DEC    HL        ; ADJUST INDEX TO 0...N-1 FROM 1...N
  293.     ADD    HL,HL        ; DO THE SAME WITH THE ORIGINAL DE
  294.     ADD    HL,BC
  295.     EX    DE,HL
  296.  
  297. ;
  298. ;  HL NOW POINTS TO THE POINTER WHOSE INDEX WAS IN HL TO BEGIN WITH
  299. ;  DE NOW POINTS TO THE POINTER WHOSE INDEX WAS IN DE TO BEGIN WITH
  300. ;    FOR EXAMPLE, IF DE=5 AND HL=4, DE NOW POINTS TO THE 5TH PTR AND HL
  301. ; TO THE 4TH POINTER
  302. ;
  303.     LD    C,(HL)        ; BC IS MADE TO POINT TO THE OBJECT INDEXED TO
  304.     INC    HL        ; ... BY THE ORIGINAL HL
  305.     LD    B,(HL)
  306.     EX    DE,HL
  307.     LD    E,(HL)        ; DE IS MADE TO POINT TO THE OBJECT INDEXED TO
  308.     INC    HL        ; ... BY THE ORIGINAL DE
  309.     LD    D,(HL)
  310.     LD    H,B        ; SET HL = OBJECT PTED TO INDIRECTLY BY BC
  311.     LD    L,C
  312.  
  313. ;
  314. ;  COMPARE DIR ENTRY PTED TO BY HL WITH THAT PTED TO BY DE;
  315. ;    NO NET EFFECT ON HL, DE; RET W/CARRY SET MEANS DE<HL
  316. ;    RET W/ZERO SET MEANS DE=HL
  317. ;
  318. CMP$ENTRY:
  319.     LD    A,(CMP$FLAG)    ; GROUP BY FILE TYPE?
  320.     OR    A
  321.     JP    Z,CMP$FN$FT
  322. ;
  323. ;  COMPARE BY FILE TYPE, FILE NAME, EXTENSION, AND USER (IN THAT ORDER)
  324. ;
  325. CMP$FCB1:    
  326.     PUSH    HL
  327.     PUSH    DE
  328.     LD    BC,9    ; PT TO FT (8 BYTES + 1 BYTE FOR USER NUMBER)
  329.     ADD    HL,BC
  330.     EX    DE,HL
  331.     ADD    HL,BC
  332.     EX    DE,HL    ; DE, HL NOW PT TO THEIR FT'S
  333.     LD    B,3    ; 3 BYTES
  334.     CALL    COMP    ; COMPARE FT'S
  335.     POP    DE
  336.     POP    HL
  337.     RET    NZ    ; CONTINUE IF COMPLETE MATCH
  338.     PUSH    HL
  339.     PUSH    DE
  340.     INC    HL    ; PT TO FILE NAME
  341.     INC    DE
  342.     LD    B,8    ; 8 BYTES
  343.     CALL    COMP    ; COMPARE FN'S
  344.     POP    DE
  345.     POP    HL
  346.     RET    NZ    ; CONTINUE IF COMPLETE MATCH
  347.     PUSH    HL
  348.     PUSH    DE
  349.     LD    BC,12    ; PT TO EXT (11 BYTES FOR FN/FT AND 1 BYTE FOR USER)
  350.     ADD    HL,BC
  351.     EX    DE,HL
  352.     ADD    HL,BC
  353.     EX    DE,HL        ; DE, HL NOW PT TO THEIR EXT'S
  354.     LD    A,(DE)    ; COMPARE
  355.     CP    (HL)
  356.     POP    DE
  357.     POP    HL
  358.     RET    NZ
  359.     LD    A,(DE)    ; COMPARE USER NUMBERS
  360.     CP    (HL)
  361.     RET
  362. ;
  363. ;  COMPARE BY FILE NAME, FILE TYPE, EXTENSION, AND USER NUM (IN THAT ORDER)
  364. ;
  365. CMP$FN$FT:
  366.     PUSH    HL
  367.     PUSH    DE
  368.     INC    HL    ; PT TO FN
  369.     INC    DE
  370.     LD    B,12    ; COMPARE FN, FT, EX
  371.     CALL    COMP
  372.     POP    DE
  373.     POP    HL
  374.     RET    NZ
  375.     LD    A,(DE)    ; COMPARE USER NUMBER
  376.     CP    (HL)
  377.     RET
  378. ;
  379. ;  COMP COMPARES DE W/HL FOR B BYTES; RET W/CARRY IF DE<HL
  380. ;    MSB IS DISREGARDED
  381. ;
  382. COMP:
  383.     LD    A,(HL)    ; GET (HL)
  384.     AND    7FH    ; MASK MSB
  385.     LD    C,A    ; ... IN C
  386.     LD    A,(DE)    ; COMPARE
  387.     AND    7FH    ; MASK MSB
  388.     CP    C
  389.     RET    NZ
  390.     INC    HL    ; PT TO NEXT
  391.     INC    DE
  392.     DEC    B    ; COUNT DOWN
  393.     JP    NZ,COMP
  394.     RET
  395.  
  396. ;*************************************************************************
  397.  
  398. ;
  399. ;  BUFFERS
  400. ;
  401. CMP$FLAG:        ; 0=SORT BY FILE NAME/TYPE, ELSE BY TYPE/NAME
  402.     DS    1
  403. HOLD:
  404.     DS    35    ; EXCHANGE HOLD BUFFER FOR FCB'S
  405. PTPTR:
  406.     DS    2    ; POINTER POINTER
  407. PTDIR:
  408.     DS    2    ; DIRECTORY POINTER
  409. IVAL:
  410.     DS    2    ; INDEXES FOR SORT
  411. J:
  412.     DS    2
  413. JG:
  414.     DS    2
  415. N:
  416.     DS    2    ; NUMBER OF ELEMENTS TO SORT
  417. GAP:
  418.     DS    2    ; BINARY GAP SIZE
  419.  
  420.     END
  421.