home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / wunderki.zip / SETH.ASM < prev    next >
Assembly Source File  |  1993-08-16  |  4KB  |  274 lines

  1.  
  2. ; *******************************************************
  3. ; *                            *
  4. ; *     Turbo Pascal Run-time Library                   *
  5. ; *    Set Support Routines                *
  6. ; *                            *
  7. ; *     Copyright (c) 1988,92 Borland International     *
  8. ; *                            *
  9. ; *******************************************************
  10.  
  11.     TITLE    SETH
  12.  
  13.     INCLUDE    SE.ASM
  14.  
  15. CODE    SEGMENT    BYTE PUBLIC
  16.  
  17.     ASSUME    CS:CODE
  18.  
  19. ; Publics
  20.  
  21.     PUBLIC    ZLoad,ZStore,ZBitMask,ZWordLoad,ZAddComp,ZAddRange
  22.     PUBLIC    ZUnion,ZDifference,ZIntersect,ZEqual,ZRelation
  23.  
  24. ; Load set
  25. ; In    [SP+6] = Destination pointer
  26. ;    [SP+2] = Source pointer
  27. ;    [SP]   = Set data
  28. ; Out    SP     = SP+6
  29.  
  30. ZLoad:
  31.  
  32.     CLD
  33.     MOV    BX,SP
  34.     MOV    DX,DS
  35.     LES    DI,SS:[BX+10]
  36.     LDS    SI,SS:[BX+6]
  37.     MOV    BX,SS:[BX+4]
  38.     MOV    CL,BH
  39.     XOR    CH,CH
  40.     XOR    AL,AL
  41.     REP    STOSB
  42.     MOV    CL,BL
  43.     REP    MOVSB
  44.     MOV    CL,32
  45.     SUB    CL,BL
  46.     SUB    CL,BH
  47.     REP    STOSB
  48.     MOV    DS,DX
  49.     RETF    6
  50.  
  51. ; Load word sized set
  52. ; In    [SP+2] = Destination pointer
  53. ;    [SP]   = Word set
  54. ; Out    SP     = SP+2
  55.  
  56. ZWordLoad:
  57.  
  58.     CLD
  59.     MOV    BX,SP
  60.     LES    DI,SS:[BX+6]
  61.     MOV    AX,SS:[BX+4]
  62.     STOSW
  63.     MOV    CX,15
  64.     XOR    AX,AX
  65.     REP    STOSW
  66.     RETF    2
  67.  
  68. ; Add set component
  69. ; In    [SP+2] = Destination pointer
  70. ;    [SP]   = Component number
  71. ; Out    SP     = SP+2
  72.  
  73. ZAddComp:
  74.  
  75.     MOV    BX,SP
  76.     LES    DI,SS:[BX+6]
  77.     MOV    AL,SS:[BX+4]
  78.     MOV    BL,AL
  79.     XOR    BH,BH
  80.     MOV    CL,3
  81.     SHR    BX,CL
  82.     MOV    CL,AL
  83.     AND    CL,7
  84.     MOV    AL,1
  85.     SHL    AL,CL
  86.     OR    ES:[DI+BX],AL
  87.     RETF    2
  88.  
  89. ; Add set range
  90. ; In    [SP+4] = Destination pointer
  91. ;    [SP+2] = First component number
  92. ;    [SP]   = Last component number
  93. ; Out    SP     = SP+4
  94.  
  95. ZAddRange:
  96.  
  97.     MOV    BX,SP
  98.     LES    DI,SS:[BX+8]
  99.     MOV    AL,SS:[BX+6]
  100.     MOV    DL,SS:[BX+4]
  101.     SUB    DL,AL
  102.     JC    @@2
  103.     INC    DL
  104.     MOV    BL,AL
  105.     XOR    BH,BH
  106.     MOV    CL,3
  107.     SHR    BX,CL
  108.     MOV    CL,AL
  109.     AND    CL,7
  110.     MOV    AL,1
  111.     SHL    AL,CL
  112. @@1:    OR    ES:[DI+BX],AL
  113.     ROL    AL,1
  114.     ADC    BX,0
  115.     DEC    DL
  116.     JNE    @@1
  117. @@2:    RETF    4
  118.  
  119. ; Store set
  120. ; In    [SP+6] = Source pointer
  121. ;    [SP+2] = Destination pointer
  122. ;    [SP]   = Set data
  123. ; Out    SP     = SP+10
  124.  
  125. ZStore:
  126.  
  127.     CLD
  128.     MOV    BX,SP
  129.     MOV    DX,DS
  130.     LDS    SI,SS:[BX+10]
  131.     LES    DI,SS:[BX+6]
  132.     MOV    BX,SS:[BX+4]
  133.     MOV    CL,BH
  134.     XOR    CH,CH
  135.     ADD    SI,CX
  136.     MOV    CL,BL
  137.     REP    MOVSB
  138.     MOV    DS,DX
  139.     RETF    10
  140.  
  141. ; Compute set offset and bit mask
  142. ; In    AL = Element number
  143. ;    AH = 01H or 0FEH
  144. ;    DL = Number of bytes in set
  145. ;    DH = Offset of first byte in set
  146. ; Out    AL = Bit mask
  147. ;    DX = Byte offset
  148.  
  149. ZBitMask:
  150.  
  151.     MOV    CH,AL
  152.     MOV    CL,3
  153.     SHR    CH,CL
  154.     SUB    CH,DH
  155.     JB    @@1
  156.     CMP    CH,DL
  157.     JAE    @@1
  158.     MOV    DL,CH
  159.     XOR    DH,DH
  160.     AND    AL,7
  161.     MOV    CL,AL
  162.     MOV    AL,AH
  163.     ROL    AL,CL
  164.     RETF
  165. @@1:    CWD
  166.     XCHG    AX,DX
  167.     XOR    DX,DX
  168.     RETF
  169.  
  170. ; Set union
  171. ; In    [SP+4] = Destination pointer
  172. ;    [SP]   = Source pointer
  173. ; Out    SP     = SP+4
  174.  
  175. ZUnion:
  176.  
  177.     CLD
  178.     MOV    BX,SP
  179.     MOV    DX,DS
  180.     LES    DI,SS:[BX+8]
  181.     LDS    SI,SS:[BX+4]
  182.     MOV    CX,16
  183. @@1:    LODSW
  184.     OR    AX,ES:[DI]
  185.     STOSW
  186.     LOOP    @@1
  187.     MOV    DS,DX
  188.     RETF    4
  189.  
  190. ; Set difference
  191. ; In    [SP+4] = Destination pointer
  192. ;    [SP]   = Source pointer
  193. ; Out    SP     = SP+4
  194.  
  195. ZDifference:
  196.  
  197.     CLD
  198.     MOV    BX,SP
  199.     MOV    DX,DS
  200.     LES    DI,SS:[BX+8]
  201.     LDS    SI,SS:[BX+4]
  202.     MOV    CX,16
  203. @@1:    LODSW
  204.     NOT    AX
  205.     AND    AX,ES:[DI]
  206.     STOSW
  207.     LOOP    @@1
  208.     MOV    DS,DX
  209.     RETF    4
  210.  
  211. ; Set intersection
  212. ; In    [SP+4] = Destination pointer
  213. ;    [SP]   = Source pointer
  214. ; Out    SP     = SP+4
  215.  
  216. ZIntersect:
  217.  
  218.     CLD
  219.     MOV    BX,SP
  220.     MOV    DX,DS
  221.     LES    DI,SS:[BX+8]
  222.     LDS    SI,SS:[BX+4]
  223.     MOV    CX,16
  224. @@1:    LODSW
  225.     AND    AX,ES:[DI]
  226.     STOSW
  227.     LOOP    @@1
  228.     MOV    DS,DX
  229.     RETF    4
  230.  
  231. ; Set equality test
  232. ; In    [SP+4] = Destination pointer
  233. ;    [SP]   = Source pointer
  234. ; Out    SP     = SP+8
  235. ;    ZF     = 1 if Dest=Source
  236.  
  237. ZEqual:
  238.  
  239.     CLD
  240.     MOV    BX,SP
  241.     MOV    DX,DS
  242.     LES    DI,SS:[BX+8]
  243.     LDS    SI,SS:[BX+4]
  244.     MOV    CX,16
  245.     REP    CMPSW
  246.     MOV    DS,DX
  247.     RETF    8
  248.  
  249. ; Set relation test
  250. ; In    [SP+4] = Destination pointer
  251. ;    [SP]   = Source pointer
  252. ; Out    SP     = SP+8
  253. ;    ZF     = 1 if Dest>=Source
  254.  
  255. ZRelation:
  256.  
  257.     CLD
  258.     MOV    BX,SP
  259.     MOV    DX,DS
  260.     LES    DI,SS:[BX+8]
  261.     LDS    SI,SS:[BX+4]
  262.     MOV    CX,16
  263. @@1:    LODSW
  264.     OR    AX,ES:[DI]
  265.     SCASW
  266.     JNE    @@2
  267.     LOOP    @@1
  268. @@2:    MOV    DS,DX
  269.     RETF    8
  270.  
  271. CODE    ENDS
  272.  
  273.     END
  274.