home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Resources / System / BoingBag1 / Contributions / Workbench / RexxArpLib3p6 / src / areapolydraw.a < prev    next >
Text File  |  1998-06-19  |  110KB  |  2,338 lines

  1. SAS AMIGA 680x0OBJ Module Disassembler 6.57
  2. Copyright © 1995 SAS Institute, Inc.
  3.  
  4.  
  5. Amiga Object File Loader V1.00
  6. 68000 Instruction Set
  7.  
  8. EXTERNAL DEFINITIONS
  9.  
  10. @AllocTmpRas 00F8-00    @FreeTmpRas 01CA-00    @AreaPolyDraw 0202-00    
  11. @AddVertex 070C-00    @KillVertex 074A-00    _ptdata 0000-01
  12.  
  13. SECTION 00 "text" 00000D4C BYTES
  14. ;   1: /** areapolydraw.c
  15. ;   2:  *
  16. ;   3:  *   This file contains the functions Alloc/FreeAreaInfo() and Alloc/FreeTmpRas()
  17. ;   4:  *   to initialize and free TmpRas and AreaInfo structures, as well as the
  18. ;   5:  *   function AreaPolyDraw(), and AddVertex() and KillVertex().
  19. ;   6:  *
  20. ;   7:  *   W.G.J. Langeveld, 14 July 1988
  21. ;   8:  *
  22. ;   9: **/
  23. ;  10: #include <functions.h>
  24. ;  11: #include "ralprotos.h"
  25. ;  12: #include <exec/types.h>
  26. ;  13: #include <exec/exec.h>
  27. ;  14: #include <intuition/intuition.h>
  28. ;  15: #include <graphics/gfxmacros.h>
  29. ;  16: #include <devices/timer.h>
  30. ;  17: #include <stdlib.h>
  31. ;  18: #include <string.h>
  32. ;  19: #include <ctype.h>
  33. ;  20: 
  34. ;  21: #include "areapolydraw.h"
  35. ;  22: #include "areapatterns.h"
  36. ;  23: 
  37. ;  24: static int AllocAreaInfo(struct RastPort *, int);
  38. ;  25: static int FreeAreaInfo(struct RastPort *);
  39. ;  26: static int FindAreaSize(struct vtx *, int *, int *, int *, int *);
  40. ;  27: static int setdither(unsigned int *, int);
  41. ;  28: static int bm(int *, int);
  42. ;  29: static struct vtx *AreaPolyClip(struct vtx *, int, int, int, int);
  43. ;  30: static struct vtx *SHClip(struct vtx *, int, int);
  44. ;  31: static struct vtx *addvtx(struct vtx *, struct vtx *);
  45. ;  32: static int inside(struct vtx *, int, int);
  46. ;  33: static struct vtx *addintersect(struct vtx *, struct vtx *,
  47. ;  34: struct vtx *, int, int);
  48. ;  35: 
  49. ;  36: extern struct IntuitionBase *IntuitionBase;
  50. ;  37: extern struct GfxBase *GfxBase;
  51. ;  38: 
  52. ;  39: #define AISIZE ((long) sizeof(struct AreaInfo))
  53. ;  40: #define TRSIZE ((long) sizeof(struct TmpRas))
  54. ;  41:     
  55. ;  42: #define min(a, b) ( ((a) > (b)) ? (b) : (a) )
  56. ;  43:     
  57. ;  44: static int bm(), setdither(), FindAreaSize();
  58. ;  45: static struct vtx *AreaPolyClip();
  59. ;  46:     
  60. ;  47: #define BD_LEFT   1
  61. ;  48: #define BD_RIGHT  2
  62. ;  49: #define BD_TOP    3
  63. ;  50: #define BD_BOTTOM 4
  64. ;  51:     
  65. ;  52: /**
  66. ;  53:  *
  67. ;  54:  *    NAME
  68. ;  55:  *
  69. ;  56:  * AllocAreaInfo()
  70. ;  57:  * ===============
  71. ;  58:  *
  72. ;  59:  *    SYNOPSIS
  73. ;  60:  *
  74. ;  61:  * AllocAreaInfo(rp, nverts)
  75. ;  62:  * FreeAreaInfo(rp)
  76. ;  63:  *
  77. ;  64:  *    FUNCTION
  78. ;  65:  *
  79. ;  66:  * Function to allocate and initialize and free an AreaInfo structure
  80. ;  67:  * for Area functions.
  81. ;  68:  *
  82. ;  69:  *    INPUTS
  83. ;  70:  *
  84. ;  71:  * struct RastPort *rp Rastport to be initialized
  85. ;  72:  * int nverts  Number of vertices allowed
  86. ;  73:  *
  87. ;  74:  *    RESULT
  88. ;  75:  *
  89. ;  76:  * The fields in Rastport rp are initialized.
  90. ;  77:  *
  91. ;  78:  *    ADDITIONAL CONSIDERATIONS
  92. ;  79:  *
  93. ;  80:  *    BUGS
  94. ;  81:  *
  95. ;  82:  * None known.
  96. ;  83:  *
  97. ;  84:  *    AUTHOR
  98. ;  85:  *
  99. ;  86:  * W.G.J. Langeveld, 8 November1988
  100. ;  87:  *
  101. ;  88: **/
  102. ;  89: static int AllocAreaInfo(rp, nverts)
  103. ;  90:     struct RastPort *rp;
  104. ;  91:     int nverts;
  105.        | 0000  594F                           SUBQ.W      #4,A7
  106.        | 0002  48E7 0136                      MOVEM.L     D7/A2-A3/A5-A6,-(A7)
  107.        | 0006  2E00                           MOVE.L      D0,D7
  108.        | 0008  2A48                           MOVEA.L     A0,A5
  109. ;  92: {
  110. ;  93:     struct AreaInfo *ai = NULL;
  111. ;  94:     UBYTE *aidata = NULL;
  112.        | 000A  97CB                           SUBA.L      A3,A3
  113. ;  95:     
  114. ;  96:     if (ai = rp->AreaInfo) 
  115.        | 000C  206D 0010                      MOVEA.L     0010(A5),A0
  116.        | 0010  2F4E 0014                      MOVE.L      A6,0014(A7)
  117.        | 0014  2008                           MOVE.L      A0,D0
  118.        | 0016  670E                           BEQ.B       0026
  119. ;  97:     {
  120. ;  98:         if (ai->MaxCount >= nverts)
  121.        | 0018  3228 0012                      MOVE.W      0012(A0),D1
  122.        | 001C  B247                           CMP.W       D7,D1
  123.        | 001E  6D06                           BLT.B       0026
  124. ;  99:             return(1);
  125.        | 0020  7001                           MOVEQ       #01,D0
  126.        | 0022  6000 0080                      BRA.W       00A4
  127. ; 100:     }
  128. ; 101:     
  129. ; 102:     ai = (struct AreaInfo *) AllocMem(AISIZE, MEMF_CLEAR);
  130.        | 0026  7018                           MOVEQ       #18,D0
  131.        | 0028  7201                           MOVEQ       #01,D1
  132.        | 002A  4841                           SWAP        D1
  133.        | 002C  2C78 0004                      MOVEA.L     0004,A6
  134.        | 0030  4EAE FF3A                      JSR         FF3A(A6)
  135.        | 0034  2440                           MOVEA.L     D0,A2
  136. ; 103:     if (ai == NULL)
  137.        | 0036  4A80                           TST.L       D0
  138.        | 0038  2C6F 0014                      MOVEA.L     0014(A7),A6
  139.        | 003C  6738                           BEQ.B       0076
  140. ; 104:         goto cleanup;
  141. ; 105:     
  142. ; 106:     aidata = (UBYTE *) AllocMem((long) nverts * 5L, MEMF_CLEAR);
  143.        | 003E  3007                           MOVE.W      D7,D0
  144.        | 0040  48C0                           EXT.L       D0
  145.        | 0042  2200                           MOVE.L      D0,D1
  146.        | 0044  E581                           ASL.L       #2,D1
  147.        | 0046  D081                           ADD.L       D1,D0
  148.        | 0048  7201                           MOVEQ       #01,D1
  149.        | 004A  4841                           SWAP        D1
  150.        | 004C  2C78 0004                      MOVEA.L     0004,A6
  151.        | 0050  4EAE FF3A                      JSR         FF3A(A6)
  152.        | 0054  2640                           MOVEA.L     D0,A3
  153. ; 107:     if (aidata == NULL)
  154.        | 0056  4A80                           TST.L       D0
  155.        | 0058  2C6F 0014                      MOVEA.L     0014(A7),A6
  156.        | 005C  6718                           BEQ.B       0076
  157. ; 108:         goto cleanup;
  158. ; 109:     
  159. ; 110:     InitArea(ai, (WORD *) aidata, (long) nverts);
  160.        | 005E  3007                           MOVE.W      D7,D0
  161.        | 0060  48C0                           EXT.L       D0
  162.        | 0062  204A                           MOVEA.L     A2,A0
  163.        | 0064  224B                           MOVEA.L     A3,A1
  164.        | 0066  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  165.        | 006A  4EAE FEE6                      JSR         FEE6(A6)
  166. ; 111:     
  167. ; 112:     rp->AreaInfo = ai;
  168.        | 006E  2B4A 0010                      MOVE.L      A2,0010(A5)
  169. ; 113:     
  170. ; 114:     return(2);
  171.        | 0072  7002                           MOVEQ       #02,D0
  172.        | 0074  602E                           BRA.B       00A4
  173. ; 115:     
  174. ; 116:     cleanup :
  175. ; 117:     if (aidata)
  176.        | 0076  200B                           MOVE.L      A3,D0
  177.        | 0078  6714                           BEQ.B       008E
  178. ; 118:         FreeMem(aidata, (long) nverts * 5L);
  179.        | 007A  3007                           MOVE.W      D7,D0
  180.        | 007C  48C0                           EXT.L       D0
  181.        | 007E  2200                           MOVE.L      D0,D1
  182.        | 0080  E581                           ASL.L       #2,D1
  183.        | 0082  D081                           ADD.L       D1,D0
  184.        | 0084  224B                           MOVEA.L     A3,A1
  185.        | 0086  2C78 0004                      MOVEA.L     0004,A6
  186.        | 008A  4EAE FF2E                      JSR         FF2E(A6)
  187.        | 008E  2C6F 0014                      MOVEA.L     0014(A7),A6
  188. ; 119:     if (ai)
  189.        | 0092  200A                           MOVE.L      A2,D0
  190.        | 0094  670C                           BEQ.B       00A2
  191. ; 120:         FreeMem(ai,     AISIZE);
  192.        | 0096  224A                           MOVEA.L     A2,A1
  193.        | 0098  7018                           MOVEQ       #18,D0
  194.        | 009A  2C78 0004                      MOVEA.L     0004,A6
  195.        | 009E  4EAE FF2E                      JSR         FF2E(A6)
  196. ; 121:     
  197. ; 122:     return(0);
  198.        | 00A2  7000                           MOVEQ       #00,D0
  199.        | 00A4  4CDF 6C80                      MOVEM.L     (A7)+,D7/A2-A3/A5-A6
  200.        | 00A8  584F                           ADDQ.W      #4,A7
  201.        | 00AA  4E75                           RTS
  202. ; 123: }
  203. ; 124: 
  204. ; 125: static int FreeAreaInfo(rp)
  205. ; 126:     struct RastPort *rp;
  206.        | 00AC  594F                           SUBQ.W      #4,A7
  207.        | 00AE  48E7 2016                      MOVEM.L     D2/A3/A5-A6,-(A7)
  208.        | 00B2  2A48                           MOVEA.L     A0,A5
  209. ; 127: {
  210. ; 128:     struct AreaInfo *ai;
  211. ; 129:     UBYTE *aidata;
  212. ; 130:     
  213. ; 131:     if (ai = rp->AreaInfo) 
  214.        | 00B4  266D 0010                      MOVEA.L     0010(A5),A3
  215.        | 00B8  2F4E 0010                      MOVE.L      A6,0010(A7)
  216.        | 00BC  200B                           MOVE.L      A3,D0
  217.        | 00BE  672E                           BEQ.B       00EE
  218. ; 132:     {
  219. ; 133:         if (aidata = (UBYTE *) ai->VctrTbl) 
  220.        | 00C0  2053                           MOVEA.L     (A3),A0
  221.        | 00C2  2008                           MOVE.L      A0,D0
  222.        | 00C4  6718                           BEQ.B       00DE
  223. ; 134:         {
  224. ; 135:             FreeMem(aidata, (long) ai->MaxCount * 5L);
  225.        | 00C6  322B 0012                      MOVE.W      0012(A3),D1
  226.        | 00CA  48C1                           EXT.L       D1
  227.        | 00CC  2401                           MOVE.L      D1,D2
  228.        | 00CE  E582                           ASL.L       #2,D2
  229.        | 00D0  D481                           ADD.L       D1,D2
  230.        | 00D2  2240                           MOVEA.L     D0,A1
  231.        | 00D4  2002                           MOVE.L      D2,D0
  232.        | 00D6  2C78 0004                      MOVEA.L     0004,A6
  233.        | 00DA  4EAE FF2E                      JSR         FF2E(A6)
  234. ; 136:         }
  235. ; 137:         FreeMem(ai, AISIZE);
  236.        | 00DE  224B                           MOVEA.L     A3,A1
  237.        | 00E0  7018                           MOVEQ       #18,D0
  238.        | 00E2  2C78 0004                      MOVEA.L     0004,A6
  239.        | 00E6  4EAE FF2E                      JSR         FF2E(A6)
  240. ; 138:         rp->AreaInfo = NULL;
  241.        | 00EA  42AD 0010                      CLR.L       0010(A5)
  242. ; 139:     }
  243. ; 140:     
  244. ; 141:     return(0);
  245.        | 00EE  7000                           MOVEQ       #00,D0
  246.        | 00F0  4CDF 6804                      MOVEM.L     (A7)+,D2/A3/A5-A6
  247.        | 00F4  584F                           ADDQ.W      #4,A7
  248.        | 00F6  4E75                           RTS
  249. ; 142: }
  250. ; 143: 
  251. ; 144: 
  252. ; 145: /**
  253. ; 146:  *
  254. ; 147:  *    NAME
  255. ; 148:  *
  256. ; 149:  * AllocTmpRas()
  257. ; 150:  * =============
  258. ; 151:  *
  259. ; 152:  *    SYNOPSIS
  260. ; 153:  *
  261. ; 154:  * AllocTmpRas(rp, width, height)
  262. ; 155:  *
  263. ; 156:  *    FUNCTION
  264. ; 157:  *
  265. ; 158:  * Function to allocate and initialize and free a TmpRas structure
  266. ; 159:  * for Area functions.
  267. ; 160:  *
  268. ; 161:  *    INPUTS
  269. ; 162:  *
  270. ; 163:  * struct RastPort *rp Rastport to be initialized
  271. ; 164:  * int width, height Size of TmpRas needed
  272. ; 165:  *
  273. ; 166:  *    RESULT
  274. ; 167:  *
  275. ; 168:  * The fields in Rastport rp are initialized.
  276. ; 169:  *
  277. ; 170:  *    ADDITIONAL CONSIDERATIONS
  278. ; 171:  *
  279. ; 172:  *    BUGS
  280. ; 173:  *
  281. ; 174:  * None known.
  282. ; 175:  *
  283. ; 176:  *    AUTHOR
  284. ; 177:  *
  285. ; 178:  * W.G.J. Langeveld, 24 July 1988
  286. ; 179:  *
  287. ; 180: **/
  288. ; 181: long AllocTmpRas(rp, width, height)
  289. ; 182:     struct RastPort *rp;
  290. ; 183:     int width, height;
  291.        | 00F8  594F                           SUBQ.W      #4,A7
  292.        | 00FA  48E7 0336                      MOVEM.L     D6-D7/A2-A3/A5-A6,-(A7)
  293.        | 00FE  2C01                           MOVE.L      D1,D6
  294.        | 0100  2E00                           MOVE.L      D0,D7
  295.        | 0102  2A48                           MOVEA.L     A0,A5
  296. ; 184: {
  297. ; 185:     struct TmpRas *tr = NULL;
  298. ; 186:     UBYTE *trdata = NULL;
  299.        | 0104  97CB                           SUBA.L      A3,A3
  300. ; 187:     
  301. ; 188:     if (tr = rp->TmpRas) 
  302.        | 0106  206D 000C                      MOVEA.L     000C(A5),A0
  303.        | 010A  2F4E 0018                      MOVE.L      A6,0018(A7)
  304.        | 010E  2008                           MOVE.L      A0,D0
  305.        | 0110  6726                           BEQ.B       0138
  306. ; 189:     {
  307. ; 190:         if (tr->Size >= (long) RASSIZE((long) width, (long) height))
  308.        | 0112  3207                           MOVE.W      D7,D1
  309.        | 0114  48C1                           EXT.L       D1
  310.        | 0116  700F                           MOVEQ       #0F,D0
  311.        | 0118  D280                           ADD.L       D0,D1
  312.        | 011A  E689                           LSR.L       #3,D1
  313.        | 011C  0281 0000 FFFE                 ANDI.L      #0000FFFE,D1
  314.        | 0122  3006                           MOVE.W      D6,D0
  315.        | 0124  48C0                           EXT.L       D0
  316.        | 0126  6100  0000-XX.1                BSR.W       __CXM22
  317.        | 012A  2228 0004                      MOVE.L      0004(A0),D1
  318.        | 012E  B280                           CMP.L       D0,D1
  319.        | 0130  6D06                           BLT.B       0138
  320. ; 191:             return(1);
  321.        | 0132  7001                           MOVEQ       #01,D0
  322.        | 0134  6000 008C                      BRA.W       01C2
  323. ; 192:     }
  324. ; 193:     
  325. ; 194:     tr = (struct TmpRas *) AllocMem (TRSIZE, MEMF_CLEAR);
  326.        | 0138  7008                           MOVEQ       #08,D0
  327.        | 013A  7201                           MOVEQ       #01,D1
  328.        | 013C  4841                           SWAP        D1
  329.        | 013E  2C78 0004                      MOVEA.L     0004,A6
  330.        | 0142  4EAE FF3A                      JSR         FF3A(A6)
  331.        | 0146  2440                           MOVEA.L     D0,A2
  332. ; 195:     if (tr == NULL)
  333.        | 0148  4A80                           TST.L       D0
  334.        | 014A  2C6F 0018                      MOVEA.L     0018(A7),A6
  335.        | 014E  6746                           BEQ.B       0196
  336. ; 196:         goto cleanup;
  337. ; 197:     
  338. ; 198:     trdata = (UBYTE *) AllocRaster((long) width, (long) height);
  339.        | 0150  3007                           MOVE.W      D7,D0
  340.        | 0152  48C0                           EXT.L       D0
  341.        | 0154  3206                           MOVE.W      D6,D1
  342.        | 0156  48C1                           EXT.L       D1
  343.        | 0158  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  344.        | 015C  4EAE FE14                      JSR         FE14(A6)
  345.        | 0160  2640                           MOVEA.L     D0,A3
  346. ; 199:     if (trdata == NULL)
  347.        | 0162  4A80                           TST.L       D0
  348.        | 0164  2C6F 0018                      MOVEA.L     0018(A7),A6
  349.        | 0168  672C                           BEQ.B       0196
  350. ; 200:         goto cleanup;
  351. ; 201:     
  352. ; 202:     InitTmpRas(tr, trdata, (long) RASSIZE((long) width, (long) height) );
  353.        | 016A  3007                           MOVE.W      D7,D0
  354.        | 016C  48C0                           EXT.L       D0
  355.        | 016E  720F                           MOVEQ       #0F,D1
  356.        | 0170  D081                           ADD.L       D1,D0
  357.        | 0172  E688                           LSR.L       #3,D0
  358.        | 0174  0280 0000 FFFE                 ANDI.L      #0000FFFE,D0
  359.        | 017A  3206                           MOVE.W      D6,D1
  360.        | 017C  48C1                           EXT.L       D1
  361.        | 017E  6100  0000-XX.1                BSR.W       __CXM22
  362.        | 0182  204A                           MOVEA.L     A2,A0
  363.        | 0184  224B                           MOVEA.L     A3,A1
  364.        | 0186  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  365.        | 018A  4EAE FE2C                      JSR         FE2C(A6)
  366. ; 203:     
  367. ; 204:     rp->TmpRas = tr;
  368.        | 018E  2B4A 000C                      MOVE.L      A2,000C(A5)
  369. ; 205:     
  370. ; 206:     return(2);
  371.        | 0192  7002                           MOVEQ       #02,D0
  372.        | 0194  602C                           BRA.B       01C2
  373. ; 207:     
  374. ; 208:     cleanup :
  375. ; 209:     if (trdata)
  376.        | 0196  200B                           MOVE.L      A3,D0
  377.        | 0198  6712                           BEQ.B       01AC
  378. ; 210:         FreeRaster(trdata, (long) width, (long) height);
  379.        | 019A  3007                           MOVE.W      D7,D0
  380.        | 019C  48C0                           EXT.L       D0
  381.        | 019E  3206                           MOVE.W      D6,D1
  382.        | 01A0  48C1                           EXT.L       D1
  383.        | 01A2  204B                           MOVEA.L     A3,A0
  384.        | 01A4  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  385.        | 01A8  4EAE FE0E                      JSR         FE0E(A6)
  386.        | 01AC  2C6F 0018                      MOVEA.L     0018(A7),A6
  387. ; 211:     if (tr)
  388.        | 01B0  200A                           MOVE.L      A2,D0
  389.        | 01B2  670C                           BEQ.B       01C0
  390. ; 212:         FreeMem(tr,     TRSIZE);
  391.        | 01B4  224A                           MOVEA.L     A2,A1
  392.        | 01B6  7008                           MOVEQ       #08,D0
  393.        | 01B8  2C78 0004                      MOVEA.L     0004,A6
  394.        | 01BC  4EAE FF2E                      JSR         FF2E(A6)
  395. ; 213:     
  396. ; 214:     return(0);
  397.        | 01C0  7000                           MOVEQ       #00,D0
  398.        | 01C2  4CDF 6CC0                      MOVEM.L     (A7)+,D6-D7/A2-A3/A5-A6
  399.        | 01C6  584F                           ADDQ.W      #4,A7
  400.        | 01C8  4E75                           RTS
  401. ; 215: }
  402. ; 216: 
  403. ; 217: long FreeTmpRas(rp)
  404. ; 218:     struct RastPort *rp;
  405.        | 01CA  594F                           SUBQ.W      #4,A7
  406.        | 01CC  48E7 0016                      MOVEM.L     A3/A5-A6,-(A7)
  407.        | 01D0  2A48                           MOVEA.L     A0,A5
  408. ; 219: {
  409. ; 220:     struct TmpRas *tr;
  410. ; 221:     
  411. ; 222:     if (tr = rp->TmpRas) 
  412.        | 01D2  266D 000C                      MOVEA.L     000C(A5),A3
  413.        | 01D6  2F4E 000C                      MOVE.L      A6,000C(A7)
  414.        | 01DA  200B                           MOVE.L      A3,D0
  415.        | 01DC  671A                           BEQ.B       01F8
  416. ; 223:     {
  417. ; 224:         FreeMem(tr->RasPtr, tr->Size);
  418.        | 01DE  2253                           MOVEA.L     (A3),A1
  419.        | 01E0  202B 0004                      MOVE.L      0004(A3),D0
  420.        | 01E4  2C78 0004                      MOVEA.L     0004,A6
  421.        | 01E8  4EAE FF2E                      JSR         FF2E(A6)
  422. ; 225:         FreeMem(tr, TRSIZE);
  423.        | 01EC  224B                           MOVEA.L     A3,A1
  424.        | 01EE  7008                           MOVEQ       #08,D0
  425.        | 01F0  4EAE FF2E                      JSR         FF2E(A6)
  426. ; 226:         rp->TmpRas = NULL;
  427.        | 01F4  42AD 000C                      CLR.L       000C(A5)
  428. ; 227:     }
  429. ; 228:     
  430. ; 229:     return(0);
  431.        | 01F8  7000                           MOVEQ       #00,D0
  432.        | 01FA  4CDF 6800                      MOVEM.L     (A7)+,A3/A5-A6
  433.        | 01FE  584F                           ADDQ.W      #4,A7
  434.        | 0200  4E75                           RTS
  435. ; 230: }
  436. ; 231: 
  437. ; 232: /**
  438. ; 233:  *
  439. ; 234:  *    NAME
  440. ; 235:  *
  441. ; 236:  * AreaPolyDraw()
  442. ; 237:  * ==============
  443. ; 238:  *
  444. ; 239:  *    SYNOPSIS
  445. ; 240:  *
  446. ; 241:  * AreaPolyDraw(rp, vertex, ppen, xoff, yoff)
  447. ; 242:  *
  448. ; 243:  *    FUNCTION
  449. ; 244:  *
  450. ; 245:  * Draws a filled n-vertex polygon according to the outline in linked
  451. ; 246:  * list of vertices. Performs pre-clipping, allows various textures and
  452. ; 247:  * 4-pixel dithering patterns.
  453. ; 248:  *
  454. ; 249:  *    INPUTS
  455. ; 250:  *
  456. ; 251:  * w  Pointer to a window to receive the imagery.
  457. ; 252:  *       vertex  Ptr to linked list of vtx structures
  458. ; 253:  * ppen  Pattern pen. 0->15: use APen 0 through 15.
  459. ; 254:  *                If texture flag set, use one of 16 textures.
  460. ; 255:  *                If dither flag is set use one of 125 dithers.
  461. ; 256:  *                If outline flag is set, use outline.
  462. ; 257:  * xoff  X offset for polygon
  463. ; 258:  * yoff  Y offset for polygon
  464. ; 259:  *
  465. ; 260:  *    RESULT
  466. ; 261:  *
  467. ; 262:  * Zero on failure, non-zero otherwise.
  468. ; 263:  *
  469. ; 264:  *    ADDITIONAL CONSIDERATIONS
  470. ; 265:  *
  471. ; 266:  * This routine allocates its own AreaInfo and TmpRas structures, and
  472. ; 267:  * frees them as well. If the RastPort already had these, they are saved
  473. ; 268:  * and restored at the end.
  474. ; 269:  * The routine preclips all AreaMoves and AreaDraws so they won't
  475. ; 270:  *       require a TmpRas larger than a single full bitplane the size of
  476. ; 271:  *       the window. Window borders are taken into account.
  477. ; 272:  *
  478. ; 273:  *    BUGS
  479. ; 274:  *
  480. ; 275:  * None known.
  481. ; 276:  *
  482. ; 277:  *    AUTHOR
  483. ; 278:  *
  484. ; 279:  * W.G.J. Langeveld, 24 July 1988
  485. ; 280:  *          revised: November 1989.
  486. ; 281:  *
  487. ; 282: **/
  488. ; 283: AreaPolyDraw(w, v, ppen, xoff, yoff)
  489. ; 284:     struct Window *w;
  490. ; 285:     struct vtx *v;
  491. ; 286:     int ppen, xoff, yoff;
  492.        | 0202  9EFC 0114                      SUBA.W      #0114,A7
  493.        | 0206  48E7 3F36                      MOVEM.L     D2-D7/A2-A3/A5-A6,-(A7)
  494.        | 020A  3C2F 0140                      MOVE.W      0140(A7),D6
  495.        | 020E  2E01                           MOVE.L      D1,D7
  496.        | 0210  2A49                           MOVEA.L     A1,A5
  497. ; 287: {
  498. ; 288:     register int n;
  499. ; 289:     register struct vtx *tmp;
  500. ; 290:     register int pow, clipped = 0;
  501.        | 0212  426F 0120                      CLR.W       0120(A7)
  502. ; 291:     int resai = 0, restr = 0, res = 0, notmoved, type;
  503.        | 0216  426F 0134                      CLR.W       0134(A7)
  504. ; 292:     struct RastPort *rp;
  505. ; 293:     struct RastPort tmprp;
  506. ; 294:     int minx, maxx, miny, maxy;
  507. ; 295:     int clipxmin, clipymin, clipxmax, clipymax;
  508. ; 296:     unsigned int colpat[64];
  509. ; 297:     
  510. ; 298:     if (w == NULL)
  511.        | 021A  47EF 0032                      LEA         0032(A7),A3
  512.        | 021E  36C0                           MOVE.W      D0,(A3)+
  513.        | 0220  26C8                           MOVE.L      A0,(A3)+
  514.        | 0222  26CE                           MOVE.L      A6,(A3)+
  515.        | 0224  2208                           MOVE.L      A0,D1
  516.        | 0226  6606                           BNE.B       022E
  517. ; 299:         return(0);
  518.        | 0228  7000                           MOVEQ       #00,D0
  519.        | 022A  6000 0404                      BRA.W       0630
  520. ; 300:     rp = w->RPort;
  521.        | 022E  2468 0032                      MOVEA.L     0032(A0),A2
  522. ; 301:     
  523. ; 302:     if (v == NULL)
  524.        | 0232  220D                           MOVE.L      A5,D1
  525.        | 0234  2C6F 0038                      MOVEA.L     0038(A7),A6
  526.        | 0238  6606                           BNE.B       0240
  527. ; 303:         return(0);
  528.        | 023A  7000                           MOVEQ       #00,D0
  529.        | 023C  6000 03F2                      BRA.W       0630
  530. ; 304:     if (ppen & APD_NOFILL)
  531.        | 0240  0800 000A                      BTST        #000A,D0
  532.        | 0244  2C6F 0038                      MOVEA.L     0038(A7),A6
  533.        | 0248  6706                           BEQ.B       0250
  534. ; 305:         return(0);
  535.        | 024A  7000                           MOVEQ       #00,D0
  536.        | 024C  6000 03E2                      BRA.W       0630
  537. ; 306:     /*
  538. ; 307:      *   See if we need clipping
  539. ; 308:      */
  540. ; 309:     clipxmin =             w->BorderLeft;
  541.        | 0250  47E8 0036                      LEA         0036(A0),A3
  542.        | 0254  1A1B                           MOVE.B      (A3)+,D5
  543. ; 310:     clipymin =             w->BorderTop;
  544.        | 0256  4885                           EXT.W       D5
  545.        | 0258  181B                           MOVE.B      (A3)+,D4
  546. ; 311:     clipxmax = w->Width  - w->BorderRight - 1;
  547.        | 025A  4884                           EXT.W       D4
  548.        | 025C  101B                           MOVE.B      (A3)+,D0
  549.        | 025E  4880                           EXT.W       D0
  550.        | 0260  3228 0008                      MOVE.W      0008(A0),D1
  551.        | 0264  9240                           SUB.W       D0,D1
  552. ; 312:     clipymax = w->Height - w->BorderBottom - 1;
  553.        | 0266  5341                           SUBQ.W      #1,D1
  554.        | 0268  1028 0039                      MOVE.B      0039(A0),D0
  555.        | 026C  4880                           EXT.W       D0
  556.        | 026E  3428 000A                      MOVE.W      000A(A0),D2
  557.        | 0272  9440                           SUB.W       D0,D2
  558. ; 313:     
  559. ; 314:     n = FindAreaSize(v, &minx, &miny, &maxx, &maxy);
  560.        | 0274  5342                           SUBQ.W      #1,D2
  561.        | 0276  486F 0130                      PEA         0130(A7)
  562.        | 027A  486F 0130                      PEA         0130(A7)
  563.        | 027E  486F 0130                      PEA         0130(A7)
  564.        | 0282  3F41 0036                      MOVE.W      D1,0036(A7)
  565.        | 0286  3F42 0038                      MOVE.W      D2,0038(A7)
  566.        | 028A  204D                           MOVEA.L     A5,A0
  567.        | 028C  43EF 0130                      LEA         0130(A7),A1
  568.        | 0290  2C6F 0044                      MOVEA.L     0044(A7),A6
  569.        | 0294  6100 03A4                      BSR.W       063A
  570.        | 0298  4FEF 000C                      LEA         000C(A7),A7
  571. ; 315:     /*
  572. ; 316:      *   If so, clip the vertexlist, compute new size and set flag.
  573. ; 317:      */
  574. ; 318:     if ((minx < clipxmin) || (miny < clipymin) ||
  575.        | 029C  3F40 0138                      MOVE.W      D0,0138(A7)
  576.        | 02A0  302F 0124                      MOVE.W      0124(A7),D0
  577.        | 02A4  B045                           CMP.W       D5,D0
  578.        | 02A6  6D1C                           BLT.B       02C4
  579.        | 02A8  302F 0128                      MOVE.W      0128(A7),D0
  580.        | 02AC  B044                           CMP.W       D4,D0
  581.        | 02AE  6D14                           BLT.B       02C4
  582. ; 319:     (maxx > clipxmax) || (maxy > clipymax)  ) 
  583.        | 02B0  302F 002A                      MOVE.W      002A(A7),D0
  584.        | 02B4  322F 012C                      MOVE.W      012C(A7),D1
  585.        | 02B8  B240                           CMP.W       D0,D1
  586.        | 02BA  6E08                           BGT.B       02C4
  587.        | 02BC  322F 0130                      MOVE.W      0130(A7),D1
  588.        | 02C0  B242                           CMP.W       D2,D1
  589.        | 02C2  6F36                           BLE.B       02FA
  590. ; 320:     {
  591. ; 321:         v = AreaPolyClip(v, clipxmin, clipymin, clipxmax, clipymax);
  592.        | 02C4  3F02                           MOVE.W      D2,-(A7)
  593.        | 02C6  3F2F 002C                      MOVE.W      002C(A7),-(A7)
  594.        | 02CA  2005                           MOVE.L      D5,D0
  595.        | 02CC  2204                           MOVE.L      D4,D1
  596.        | 02CE  204D                           MOVEA.L     A5,A0
  597.        | 02D0  6100 07A6                      BSR.W       0A78
  598.        | 02D4  2A40                           MOVEA.L     D0,A5
  599. ; 322:         n = FindAreaSize(v, &minx, &miny, &maxx, &maxy);
  600.        | 02D6  486F 0134                      PEA         0134(A7)
  601.        | 02DA  486F 0134                      PEA         0134(A7)
  602.        | 02DE  486F 0134                      PEA         0134(A7)
  603.        | 02E2  2040                           MOVEA.L     D0,A0
  604.        | 02E4  43EF 0134                      LEA         0134(A7),A1
  605.        | 02E8  6100 0350                      BSR.W       063A
  606.        | 02EC  4FEF 0010                      LEA         0010(A7),A7
  607. ; 323:         clipped = 1;
  608.        | 02F0  3F7C 0001 0120                 MOVE.W      #0001,0120(A7)
  609.        | 02F6  3F40 0138                      MOVE.W      D0,0138(A7)
  610. ; 324:     }
  611. ; 325:     /*
  612. ; 326:      *   Check for empty set
  613. ; 327:      */
  614. ; 328:     if (v == NULL)
  615.        | 02FA  200D                           MOVE.L      A5,D0
  616.        | 02FC  6700 0332                      BEQ.W       0630
  617. ; 329:         return(0);
  618. ; 330:     if (n == 0)
  619.        | 0300  4A6F 0138                      TST.W       0138(A7)
  620.        | 0304  2C6F 0038                      MOVEA.L     0038(A7),A6
  621.        | 0308  6700 0316                      BEQ.W       0620
  622. ; 331:         goto cleanup;
  623. ; 332:     /*
  624. ; 333:      *   Make a copy of the rastport
  625. ; 334:      */
  626. ; 335:     movmem(rp, &tmprp, sizeof(struct RastPort));
  627.        | 030C  204A                           MOVEA.L     A2,A0
  628.        | 030E  43EF 00BC                      LEA         00BC(A7),A1
  629.        | 0312  7064                           MOVEQ       #64,D0
  630.        | 0314  6100  0000-XX.1                BSR.W       @movmem
  631. ; 336:     /*
  632. ; 337:      *   Add an outline if requested
  633. ; 338:      */
  634. ; 339:     if (ppen & APD_OUTLINE) 
  635.        | 0318  082F 0003 0032                 BTST        #0003,0032(A7)
  636.        | 031E  670E                           BEQ.B       032E
  637. ; 340:     {
  638. ; 341:         SetOPen(&tmprp, (long) tmprp.FgPen)
  639.        | 0320  1F6F 00D5 00D7                 MOVE.B      00D5(A7),00D7(A7)
  640.        | 0326  08EF 0003 00DD                 BSET        #0003,00DD(A7)
  641.        | 032C  6006                           BRA.B       0334
  642. ; 342:     }
  643. ; 343:     else
  644. ; 344:     {
  645. ; 345:         BNDRYOFF(&tmprp);
  646.        | 032E  08AF 0003 00DD                 BCLR        #0003,00DD(A7)
  647. ; 346:     }
  648. ; 347:     /*
  649. ; 348:      *   Set APen
  650. ; 349:      */
  651. ; 350:     if ((ppen & 0xFF) < 16)
  652.        | 0334  303C 00FF                      MOVE.W      #00FF,D0
  653.        | 0338  C06F 0032                      AND.W       0032(A7),D0
  654.        | 033C  7210                           MOVEQ       #10,D1
  655.        | 033E  B041                           CMP.W       D1,D0
  656.        | 0340  6C0E                           BGE.B       0350
  657. ; 351:         SetAPen(&tmprp, (long) (ppen & 0xFF));
  658.        | 0342  48C0                           EXT.L       D0
  659.        | 0344  43EF 00BC                      LEA         00BC(A7),A1
  660.        | 0348  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  661.        | 034C  4EAE FEAA                      JSR         FEAA(A6)
  662. ; 352:     /*
  663. ; 353:      *   If object still too large, just draw it, don't bother filling
  664. ; 354:      */
  665. ; 355:     if ((minx < clipxmin) || (miny < clipymin) ||
  666.        | 0350  302F 0124                      MOVE.W      0124(A7),D0
  667.        | 0354  B045                           CMP.W       D5,D0
  668.        | 0356  2C6F 0038                      MOVEA.L     0038(A7),A6
  669.        | 035A  6D1E                           BLT.B       037A
  670.        | 035C  302F 0128                      MOVE.W      0128(A7),D0
  671.        | 0360  B044                           CMP.W       D4,D0
  672.        | 0362  6D16                           BLT.B       037A
  673. ; 356:     (maxx > clipxmax) || (maxy > clipymax)  ) 
  674.        | 0364  302F 012C                      MOVE.W      012C(A7),D0
  675.        | 0368  B06F 002A                      CMP.W       002A(A7),D0
  676.        | 036C  6E0C                           BGT.B       037A
  677.        | 036E  302F 0130                      MOVE.W      0130(A7),D0
  678.        | 0372  B06F 002C                      CMP.W       002C(A7),D0
  679.        | 0376  6F00 00A8                      BLE.W       0420
  680. ; 357:     {
  681. ; 358:         tmp = v;
  682.        | 037A  264D                           MOVEA.L     A5,A3
  683. ; 359:         notmoved = 1;
  684.        | 037C  7801                           MOVEQ       #01,D4
  685. ; 360:         while (tmp) 
  686.        | 037E  6000 0090                      BRA.W       0410
  687. ; 361:         {
  688. ; 362:             type = tmp->type;
  689.        | 0382  3A2B 0004                      MOVE.W      0004(A3),D5
  690. ; 363:             if (notmoved && (type == AREADRAW))
  691.        | 0386  4A44                           TST.W       D4
  692.        | 0388  6708                           BEQ.B       0392
  693.        | 038A  2005                           MOVE.L      D5,D0
  694.        | 038C  5540                           SUBQ.W      #2,D0
  695.        | 038E  6602                           BNE.B       0392
  696. ; 364:                 type = AREAMOVE;
  697.        | 0390  7A01                           MOVEQ       #01,D5
  698. ; 365:             switch (type) 
  699.        | 0392  3005                           MOVE.W      D5,D0
  700.        | 0394  5340                           SUBQ.W      #1,D0
  701.        | 0396  670E                           BEQ.B       03A6
  702.        | 0398  5340                           SUBQ.W      #1,D0
  703.        | 039A  672A                           BEQ.B       03C6
  704.        | 039C  5340                           SUBQ.W      #1,D0
  705.        | 039E  6744                           BEQ.B       03E4
  706.        | 03A0  5340                           SUBQ.W      #1,D0
  707.        | 03A2  6740                           BEQ.B       03E4
  708.        | 03A4  6068                           BRA.B       040E
  709. ; 366:             {
  710. ; 367:             case AREAMOVE :
  711. ; 368:                 Move(&tmprp, (long) (tmp->x + xoff), (long) (tmp->y + yoff));
  712.        | 03A6  302B 0006                      MOVE.W      0006(A3),D0
  713.        | 03AA  D047                           ADD.W       D7,D0
  714.        | 03AC  48C0                           EXT.L       D0
  715.        | 03AE  322B 0008                      MOVE.W      0008(A3),D1
  716.        | 03B2  D246                           ADD.W       D6,D1
  717.        | 03B4  48C1                           EXT.L       D1
  718.        | 03B6  43EF 00BC                      LEA         00BC(A7),A1
  719.        | 03BA  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  720.        | 03BE  4EAE FF10                      JSR         FF10(A6)
  721. ; 369:                 notmoved = 0;
  722.        | 03C2  7800                           MOVEQ       #00,D4
  723. ; 370:                 break;
  724.        | 03C4  6044                           BRA.B       040A
  725. ; 371:             case AREADRAW :
  726. ; 372:                 Draw(&tmprp, (long) (tmp->x + xoff), (long) (tmp->y + yoff) );
  727.        | 03C6  302B 0006                      MOVE.W      0006(A3),D0
  728.        | 03CA  D047                           ADD.W       D7,D0
  729.        | 03CC  48C0                           EXT.L       D0
  730.        | 03CE  322B 0008                      MOVE.W      0008(A3),D1
  731.        | 03D2  D246                           ADD.W       D6,D1
  732.        | 03D4  48C1                           EXT.L       D1
  733.        | 03D6  43EF 00BC                      LEA         00BC(A7),A1
  734.        | 03DA  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  735.        | 03DE  4EAE FF0A                      JSR         FF0A(A6)
  736. ; 373:                 break;
  737.        | 03E2  6026                           BRA.B       040A
  738. ; 374:             case AREACIRCLE :
  739. ; 375:             case AREAELLIPSE :
  740. ; 376:                 DrawEllipse(&tmprp, (long) (tmp->x + xoff), (long) (tmp->y + yoff),
  741.        | 03E4  45EB 0006                      LEA         0006(A3),A2
  742.        | 03E8  301A                           MOVE.W      (A2)+,D0
  743.        | 03EA  D047                           ADD.W       D7,D0
  744.        | 03EC  48C0                           EXT.L       D0
  745.        | 03EE  321A                           MOVE.W      (A2)+,D1
  746.        | 03F0  D246                           ADD.W       D6,D1
  747.        | 03F2  48C1                           EXT.L       D1
  748.        | 03F4  341A                           MOVE.W      (A2)+,D2
  749.        | 03F6  48C2                           EXT.L       D2
  750.        | 03F8  362B 000C                      MOVE.W      000C(A3),D3
  751. ; 377:                 (long) tmp->a         , (long) tmp->b );
  752.        | 03FC  48C3                           EXT.L       D3
  753.        | 03FE  43EF 00BC                      LEA         00BC(A7),A1
  754.        | 0402  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  755.        | 0406  4EAE FF4C                      JSR         FF4C(A6)
  756. ; 378:                 break;
  757. ; 379:             }
  758.        | 040A  2C6F 0038                      MOVEA.L     0038(A7),A6
  759. ; 380:             tmp = tmp->next;
  760.        | 040E  2653                           MOVEA.L     (A3),A3
  761. ; 381:         }
  762.        | 0410  200B                           MOVE.L      A3,D0
  763.        | 0412  6600 FF6E                      BNE.W       0382
  764. ; 382:         res = 1;
  765.        | 0416  3F7C 0001 0134                 MOVE.W      #0001,0134(A7)
  766.        | 041C  6000 01FE                      BRA.W       061C
  767. ; 383:     }
  768. ; 384:     else
  769. ; 385:     {
  770. ; 386:         /*
  771. ; 387:          *   Allocate new AreaInfo/TmpRas (resxx = 2) or use the ones we have (resxx = 1).
  772. ; 388:          */
  773. ; 389:         resai = AllocAreaInfo(&tmprp, n + 10);
  774.        | 0420  700A                           MOVEQ       #0A,D0
  775.        | 0422  D06F 0138                      ADD.W       0138(A7),D0
  776.        | 0426  41EF 00BC                      LEA         00BC(A7),A0
  777.        | 042A  6100 FBD4                      BSR.W       0000
  778.        | 042E  3A00                           MOVE.W      D0,D5
  779. ; 390:         restr = AllocTmpRas(&tmprp, maxx - minx + 32, maxy - miny + 2);
  780.        | 0430  322F 012C                      MOVE.W      012C(A7),D1
  781.        | 0434  926F 0124                      SUB.W       0124(A7),D1
  782.        | 0438  0641 0020                      ADDI.W      #0020,D1
  783.        | 043C  342F 0130                      MOVE.W      0130(A7),D2
  784.        | 0440  946F 0128                      SUB.W       0128(A7),D2
  785.        | 0444  5442                           ADDQ.W      #2,D2
  786.        | 0446  3F40 002A                      MOVE.W      D0,002A(A7)
  787.        | 044A  2001                           MOVE.L      D1,D0
  788.        | 044C  2202                           MOVE.L      D2,D1
  789.        | 044E  41EF 00BC                      LEA         00BC(A7),A0
  790.        | 0452  6100 FCA4                      BSR.W       00F8
  791. ; 391:         /*
  792. ; 392:          *   AreaMove, AreaDraw, AreaCircle, AreaEllipse.
  793. ; 393:          */
  794. ; 394:         if (resai && restr) 
  795.        | 0456  3F40 0028                      MOVE.W      D0,0028(A7)
  796.        | 045A  4A45                           TST.W       D5
  797.        | 045C  6700 019A                      BEQ.W       05F8
  798.        | 0460  4A40                           TST.W       D0
  799.        | 0462  6700 0194                      BEQ.W       05F8
  800. ; 395:         {
  801. ; 396:             tmp = v;
  802.        | 0466  264D                           MOVEA.L     A5,A3
  803. ; 397:             notmoved = 1;
  804.        | 0468  7801                           MOVEQ       #01,D4
  805. ; 398:             while (tmp) 
  806.        | 046A  6000 0090                      BRA.W       04FC
  807. ; 399:             {
  808. ; 400:                 type = tmp->type;
  809.        | 046E  3A2B 0004                      MOVE.W      0004(A3),D5
  810. ; 401:                 if (notmoved && (type == AREADRAW))
  811.        | 0472  4A44                           TST.W       D4
  812.        | 0474  6708                           BEQ.B       047E
  813.        | 0476  2005                           MOVE.L      D5,D0
  814.        | 0478  5540                           SUBQ.W      #2,D0
  815.        | 047A  6602                           BNE.B       047E
  816. ; 402:                     type = AREAMOVE;
  817.        | 047C  7A01                           MOVEQ       #01,D5
  818. ; 403:                 switch (type) 
  819.        | 047E  3005                           MOVE.W      D5,D0
  820.        | 0480  5340                           SUBQ.W      #1,D0
  821.        | 0482  670E                           BEQ.B       0492
  822.        | 0484  5340                           SUBQ.W      #1,D0
  823.        | 0486  672A                           BEQ.B       04B2
  824.        | 0488  5340                           SUBQ.W      #1,D0
  825.        | 048A  6744                           BEQ.B       04D0
  826.        | 048C  5340                           SUBQ.W      #1,D0
  827.        | 048E  6740                           BEQ.B       04D0
  828.        | 0490  6068                           BRA.B       04FA
  829. ; 404:                 {
  830. ; 405:                 case AREAMOVE :
  831. ; 406:                     AreaMove(&tmprp, (long) (tmp->x + xoff),
  832.        | 0492  302B 0006                      MOVE.W      0006(A3),D0
  833.        | 0496  D047                           ADD.W       D7,D0
  834.        | 0498  48C0                           EXT.L       D0
  835.        | 049A  322B 0008                      MOVE.W      0008(A3),D1
  836.        | 049E  D246                           ADD.W       D6,D1
  837.        | 04A0  48C1                           EXT.L       D1
  838. ; 407:                     (long) (tmp->y + yoff));
  839.        | 04A2  43EF 00BC                      LEA         00BC(A7),A1
  840.        | 04A6  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  841.        | 04AA  4EAE FF04                      JSR         FF04(A6)
  842. ; 408:                     notmoved = 0;
  843.        | 04AE  7800                           MOVEQ       #00,D4
  844. ; 409:                     break;
  845.        | 04B0  6044                           BRA.B       04F6
  846. ; 410:                 case AREADRAW :
  847. ; 411:                     AreaDraw(&tmprp, (long) (tmp->x + xoff),
  848.        | 04B2  302B 0006                      MOVE.W      0006(A3),D0
  849.        | 04B6  D047                           ADD.W       D7,D0
  850.        | 04B8  48C0                           EXT.L       D0
  851.        | 04BA  322B 0008                      MOVE.W      0008(A3),D1
  852.        | 04BE  D246                           ADD.W       D6,D1
  853.        | 04C0  48C1                           EXT.L       D1
  854. ; 412:                     (long) (tmp->y + yoff) );
  855.        | 04C2  43EF 00BC                      LEA         00BC(A7),A1
  856.        | 04C6  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  857.        | 04CA  4EAE FEFE                      JSR         FEFE(A6)
  858. ; 413:                     break;
  859.        | 04CE  6026                           BRA.B       04F6
  860. ; 414:                 case AREACIRCLE :
  861. ; 415:                 case AREAELLIPSE :
  862. ; 416:                     AreaEllipse(&tmprp, (long) (tmp->x + xoff),
  863.        | 04D0  45EB 0006                      LEA         0006(A3),A2
  864.        | 04D4  301A                           MOVE.W      (A2)+,D0
  865.        | 04D6  D047                           ADD.W       D7,D0
  866.        | 04D8  48C0                           EXT.L       D0
  867.        | 04DA  321A                           MOVE.W      (A2)+,D1
  868.        | 04DC  D246                           ADD.W       D6,D1
  869.        | 04DE  48C1                           EXT.L       D1
  870.        | 04E0  341A                           MOVE.W      (A2)+,D2
  871.        | 04E2  48C2                           EXT.L       D2
  872.        | 04E4  362B 000C                      MOVE.W      000C(A3),D3
  873. ; 417:                     (long) (tmp->y + yoff),
  874. ; 418:                     (long) tmp->a         ,
  875. ; 419:                     (long) tmp->b );
  876.        | 04E8  48C3                           EXT.L       D3
  877.        | 04EA  43EF 00BC                      LEA         00BC(A7),A1
  878.        | 04EE  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  879.        | 04F2  4EAE FF46                      JSR         FF46(A6)
  880. ; 420:                     break;
  881. ; 421:                 }
  882.        | 04F6  2C6F 0038                      MOVEA.L     0038(A7),A6
  883. ; 422:                 tmp = tmp->next;
  884.        | 04FA  2653                           MOVEA.L     (A3),A3
  885. ; 423:             }
  886.        | 04FC  200B                           MOVE.L      A3,D0
  887.        | 04FE  6600 FF6E                      BNE.W       046E
  888. ; 424:             /*
  889. ; 425:              *   Set up an areafill pattern
  890. ; 426:              */
  891. ; 427:             setmem(colpat, 128, 0);
  892.        | 0502  41EF 003C                      LEA         003C(A7),A0
  893.        | 0506  303C 0080                      MOVE.W      #0080,D0
  894.        | 050A  7200                           MOVEQ       #00,D1
  895.        | 050C  6100  0000-XX.1                BSR.W       @setmem
  896. ; 428:             /*
  897. ; 429:              *   Copy either a texture...
  898. ; 430:              */
  899. ; 431:             if (ppen & APD_TEXTURE) 
  900.        | 0510  3A2F 0032                      MOVE.W      0032(A7),D5
  901.        | 0514  0805 0008                      BTST        #0008,D5
  902.        | 0518  6700 008E                      BEQ.W       05A8
  903. ; 432:             {
  904. ; 433:                 pow = arpt[ppen & 0xF].power;
  905.        | 051C  3005                           MOVE.W      D5,D0
  906.        | 051E  0240 000F                      ANDI.W      #000F,D0
  907.        | 0522  48C0                           EXT.L       D0
  908.        | 0524  2200                           MOVE.L      D0,D1
  909.        | 0526  E581                           ASL.L       #2,D1
  910.        | 0528  9280                           SUB.L       D0,D1
  911.        | 052A  D281                           ADD.L       D1,D1
  912.        | 052C  47EC  00FA-01.2                LEA         01.000000FA(A4),A3
  913.        | 0530  D7C1                           ADDA.L      D1,A3
  914.        | 0532  3A13                           MOVE.W      (A3),D5
  915. ; 434:                 movmem(arpt[ppen & 0xF].data, colpat,
  916.        | 0534  6A12                           BPL.B       0548
  917.        | 0536  7001                           MOVEQ       #01,D0
  918.        | 0538  3200                           MOVE.W      D0,D1
  919.        | 053A  9245                           SUB.W       D5,D1
  920.        | 053C  7000                           MOVEQ       #00,D0
  921.        | 053E  03C0                           BSET.L      D1,D0
  922.        | 0540  2200                           MOVE.L      D0,D1
  923.        | 0542  E541                           ASL.W       #2,D1
  924.        | 0544  9240                           SUB.W       D0,D1
  925.        | 0546  6008                           BRA.B       0550
  926.        | 0548  3005                           MOVE.W      D5,D0
  927.        | 054A  5240                           ADDQ.W      #1,D0
  928.        | 054C  7200                           MOVEQ       #00,D1
  929.        | 054E  01C1                           BSET.L      D0,D1
  930. ; 435:                 (pow < 0) ? (1 << (1 - pow)) * 3 : 1 << (pow + 1));
  931.        | 0550  2001                           MOVE.L      D1,D0
  932.        | 0552  206B 0002                      MOVEA.L     0002(A3),A0
  933.        | 0556  43EF 003C                      LEA         003C(A7),A1
  934.        | 055A  6100  0000-XX.1                BSR.W       @movmem
  935. ; 436:                 
  936. ; 437:                 SetAfPt(&tmprp, (unsigned short *) colpat, pow); // Stop a complaint
  937.        | 055E  41EF 003C                      LEA         003C(A7),A0
  938.        | 0562  2F48 00C4                      MOVE.L      A0,00C4(A7)
  939.        | 0566  3005                           MOVE.W      D5,D0
  940.        | 0568  1F40 00D9                      MOVE.B      D0,00D9(A7)
  941. ; 438:                 if (pow < 0)
  942.        | 056C  4A45                           TST.W       D5
  943.        | 056E  6A16                           BPL.B       0586
  944. ; 439:                     SetAPen(&tmprp, 255L);
  945.        | 0570  43EF 00BC                      LEA         00BC(A7),A1
  946.        | 0574  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  947.        | 0578  7000                           MOVEQ       #00,D0
  948.        | 057A  4600                           NOT.B       D0
  949.        | 057C  4EAE FEAA                      JSR         FEAA(A6)
  950.        | 0580  2C6F 0038                      MOVEA.L     0038(A7),A6
  951.        | 0584  600E                           BRA.B       0594
  952. ; 440:                 else
  953. ; 441:                     SetAPen(&tmprp, 1L);
  954.        | 0586  43EF 00BC                      LEA         00BC(A7),A1
  955.        | 058A  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  956.        | 058E  7001                           MOVEQ       #01,D0
  957.        | 0590  4EAE FEAA                      JSR         FEAA(A6)
  958. ; 442:                 SetDrMd(&tmprp, JAM2);
  959.        | 0594  43EF 00BC                      LEA         00BC(A7),A1
  960.        | 0598  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  961.        | 059C  7001                           MOVEQ       #01,D0
  962.        | 059E  4EAE FE9E                      JSR         FE9E(A6)
  963.        | 05A2  2C6F 0038                      MOVEA.L     0038(A7),A6
  964.        | 05A6  603A                           BRA.B       05E2
  965. ; 443:             }
  966. ; 444:             /*
  967. ; 445:              *   ...or a dithered color
  968. ; 446:              */
  969. ; 447:             else
  970. ; 448:             if (ppen & APD_DITHER) 
  971.        | 05A8  0805 0009                      BTST        #0009,D5
  972.        | 05AC  6734                           BEQ.B       05E2
  973. ; 449:             {
  974. ; 450:                 setdither(colpat, ppen & 0xFF);
  975.        | 05AE  3005                           MOVE.W      D5,D0
  976.        | 05B0  0240 00FF                      ANDI.W      #00FF,D0
  977.        | 05B4  41EF 003C                      LEA         003C(A7),A0
  978.        | 05B8  6100 01C0                      BSR.W       077A
  979. ; 451:                 
  980. ; 452:                 SetAfPt(&tmprp, (unsigned short *) colpat, -1);
  981.        | 05BC  41EF 003C                      LEA         003C(A7),A0
  982.        | 05C0  2F48 00C4                      MOVE.L      A0,00C4(A7)
  983.        | 05C4  50EF 00D9                      ST          00D9(A7)
  984. ; 453:                 SetAPen(&tmprp, 255L);
  985.        | 05C8  43EF 00BC                      LEA         00BC(A7),A1
  986.        | 05CC  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  987.        | 05D0  7000                           MOVEQ       #00,D0
  988.        | 05D2  4600                           NOT.B       D0
  989.        | 05D4  4EAE FEAA                      JSR         FEAA(A6)
  990. ; 454:                 SetDrMd(&tmprp, JAM2);
  991.        | 05D8  43EF 00BC                      LEA         00BC(A7),A1
  992.        | 05DC  7001                           MOVEQ       #01,D0
  993.        | 05DE  4EAE FE9E                      JSR         FE9E(A6)
  994. ; 455:             }
  995. ; 456:             /*
  996. ; 457:              *   Do the blit. Make sure the blit finishes before deallocating.
  997. ; 458:              */
  998. ; 459:             AreaEnd(&tmprp);
  999.        | 05E2  43EF 00BC                      LEA         00BC(A7),A1
  1000.        | 05E6  2C6C  0000-XX.2                MOVEA.L     _GfxBase(A4),A6
  1001.        | 05EA  4EAE FEF8                      JSR         FEF8(A6)
  1002. ; 460:             WaitBlit();
  1003.        | 05EE  4EAE FF1C                      JSR         FF1C(A6)
  1004. ; 461:             
  1005. ; 462:             res = 1;
  1006.        | 05F2  3F7C 0001 0134                 MOVE.W      #0001,0134(A7)
  1007. ; 463:         }
  1008. ; 464:         /*
  1009. ; 465:          *   Free allocated resources.
  1010. ; 466:          */
  1011. ; 467:         if (resai == 2)
  1012.        | 05F8  7002                           MOVEQ       #02,D0
  1013.        | 05FA  B06F 002A                      CMP.W       002A(A7),D0
  1014.        | 05FE  2C6F 0038                      MOVEA.L     0038(A7),A6
  1015.        | 0602  6608                           BNE.B       060C
  1016. ; 468:             FreeAreaInfo(&tmprp);
  1017.        | 0604  41EF 00BC                      LEA         00BC(A7),A0
  1018.        | 0608  6100 FAA2                      BSR.W       00AC
  1019. ; 469:         if (restr == 2)
  1020.        | 060C  7002                           MOVEQ       #02,D0
  1021.        | 060E  B06F 0028                      CMP.W       0028(A7),D0
  1022.        | 0612  6608                           BNE.B       061C
  1023. ; 470:             FreeTmpRas(&tmprp);
  1024.        | 0614  41EF 00BC                      LEA         00BC(A7),A0
  1025.        | 0618  6100 FBB0                      BSR.W       01CA
  1026.        | 061C  2C6F 0038                      MOVEA.L     0038(A7),A6
  1027. ; 471:     }
  1028. ; 472:     /*
  1029. ; 473:      *   Deallocate our local copy of the list
  1030. ; 474:      */
  1031. ; 475:     
  1032. ; 476:     cleanup:
  1033. ; 477:     
  1034. ; 478:     if (clipped)
  1035.        | 0620  4A6F 0120                      TST.W       0120(A7)
  1036.        | 0624  6706                           BEQ.B       062C
  1037. ; 479:         KillVertex(v);
  1038.        | 0626  204D                           MOVEA.L     A5,A0
  1039.        | 0628  6100 0120                      BSR.W       074A
  1040. ; 480:     
  1041. ; 481:     return(res);
  1042.        | 062C  302F 0134                      MOVE.W      0134(A7),D0
  1043.        | 0630  4CDF 6CFC                      MOVEM.L     (A7)+,D2-D7/A2-A3/A5-A6
  1044.        | 0634  DEFC 0114                      ADDA.W      #0114,A7
  1045.        | 0638  4E75                           RTS
  1046. ; 482: }
  1047. ; 483: 
  1048. ; 484: 
  1049. ; 485: /**
  1050. ; 486:  *
  1051. ; 487:  *   Find number of vertices and horizontal and vertical extent.
  1052. ; 488:  *
  1053. ; 489: **/
  1054. ; 490: static int FindAreaSize(v, minx, miny, maxx, maxy)
  1055. ; 491:     struct vtx *v;
  1056. ; 492:     int *minx, *miny, *maxx, *maxy;
  1057.        | 063A  594F                           SUBQ.W      #4,A7
  1058.        | 063C  48E7 2324                      MOVEM.L     D2/D6-D7/A2/A5,-(A7)
  1059.        | 0640  246F 001C                      MOVEA.L     001C(A7),A2
  1060.        | 0644  2A48                           MOVEA.L     A0,A5
  1061. ; 493: {
  1062. ; 494:     int n = 0, t;
  1063.        | 0646  7E00                           MOVEQ       #00,D7
  1064. ; 495:     
  1065. ; 496:     *minx = *miny = 20000;
  1066.        | 0648  303C 4E20                      MOVE.W      #4E20,D0
  1067.        | 064C  3480                           MOVE.W      D0,(A2)
  1068.        | 064E  3280                           MOVE.W      D0,(A1)
  1069. ; 497:     *maxx = *maxy = 0;
  1070.        | 0650  206F 0024                      MOVEA.L     0024(A7),A0
  1071.        | 0654  4250                           CLR.W       (A0)
  1072.        | 0656  206F 0020                      MOVEA.L     0020(A7),A0
  1073.        | 065A  4250                           CLR.W       (A0)
  1074.        | 065C  2F4E 0014                      MOVE.L      A6,0014(A7)
  1075. ; 498:     
  1076. ; 499:     while (v) 
  1077.        | 0660  6000 009A                      BRA.W       06FC
  1078. ; 500:     {
  1079. ; 501:         switch (v->type) 
  1080.        | 0664  302D 0004                      MOVE.W      0004(A5),D0
  1081.        | 0668  5340                           SUBQ.W      #1,D0
  1082.        | 066A  6710                           BEQ.B       067C
  1083.        | 066C  5340                           SUBQ.W      #1,D0
  1084.        | 066E  670E                           BEQ.B       067E
  1085.        | 0670  5340                           SUBQ.W      #1,D0
  1086.        | 0672  6736                           BEQ.B       06AA
  1087.        | 0674  5340                           SUBQ.W      #1,D0
  1088.        | 0676  6738                           BEQ.B       06B0
  1089.        | 0678  6000 0080                      BRA.W       06FA
  1090. ; 502:         {
  1091. ; 503:         case AREAMOVE :
  1092. ; 504:             n++;
  1093.        | 067C  5247                           ADDQ.W      #1,D7
  1094. ; 505:         case AREADRAW :
  1095. ; 506:             n++;
  1096.        | 067E  5247                           ADDQ.W      #1,D7
  1097. ; 507:             if ((t = v->x) < *minx)
  1098.        | 0680  3C2D 0006                      MOVE.W      0006(A5),D6
  1099.        | 0684  BC51                           CMP.W       (A1),D6
  1100.        | 0686  6C02                           BGE.B       068A
  1101. ; 508:                 *minx = t;
  1102.        | 0688  3286                           MOVE.W      D6,(A1)
  1103. ; 509:             if (t > *maxx)
  1104.        | 068A  206F 0020                      MOVEA.L     0020(A7),A0
  1105.        | 068E  BC50                           CMP.W       (A0),D6
  1106.        | 0690  6F02                           BLE.B       0694
  1107. ; 510:                 *maxx = t;
  1108.        | 0692  3086                           MOVE.W      D6,(A0)
  1109. ; 511:             if ((t = v->y) < *miny)
  1110.        | 0694  3C2D 0008                      MOVE.W      0008(A5),D6
  1111.        | 0698  BC52                           CMP.W       (A2),D6
  1112.        | 069A  6C02                           BGE.B       069E
  1113. ; 512:                 *miny = t;
  1114.        | 069C  3486                           MOVE.W      D6,(A2)
  1115. ; 513:             if (t > *maxy)
  1116.        | 069E  206F 0024                      MOVEA.L     0024(A7),A0
  1117.        | 06A2  BC50                           CMP.W       (A0),D6
  1118.        | 06A4  6F54                           BLE.B       06FA
  1119. ; 514:                 *maxy = t;
  1120.        | 06A6  3086                           MOVE.W      D6,(A0)
  1121. ; 515:             break;
  1122.        | 06A8  6050                           BRA.B       06FA
  1123. ; 516:         case AREACIRCLE :
  1124. ; 517:             v->b = v->a;
  1125.        | 06AA  3B6D 000A 000C                 MOVE.W      000A(A5),000C(A5)
  1126. ; 518:         case AREAELLIPSE :
  1127. ; 519:             n += 2;
  1128.        | 06B0  5447                           ADDQ.W      #2,D7
  1129. ; 520:             if ((t = v->x - v->a) < *minx)
  1130.        | 06B2  302D 000A                      MOVE.W      000A(A5),D0
  1131.        | 06B6  322D 0006                      MOVE.W      0006(A5),D1
  1132.        | 06BA  2401                           MOVE.L      D1,D2
  1133.        | 06BC  9440                           SUB.W       D0,D2
  1134.        | 06BE  B451                           CMP.W       (A1),D2
  1135.        | 06C0  6C02                           BGE.B       06C4
  1136. ; 521:                 *minx = t;
  1137.        | 06C2  3282                           MOVE.W      D2,(A1)
  1138. ; 522:             if ((t = v->x + v->a) > *maxx)
  1139.        | 06C4  302D 0006                      MOVE.W      0006(A5),D0
  1140.        | 06C8  D06D 000A                      ADD.W       000A(A5),D0
  1141.        | 06CC  206F 0020                      MOVEA.L     0020(A7),A0
  1142.        | 06D0  B050                           CMP.W       (A0),D0
  1143.        | 06D2  6F02                           BLE.B       06D6
  1144. ; 523:                 *maxx = t;
  1145.        | 06D4  3080                           MOVE.W      D0,(A0)
  1146. ; 524:             if ((t = v->y - v->b) < *miny)
  1147.        | 06D6  302D 000C                      MOVE.W      000C(A5),D0
  1148.        | 06DA  322D 0008                      MOVE.W      0008(A5),D1
  1149.        | 06DE  2401                           MOVE.L      D1,D2
  1150.        | 06E0  9440                           SUB.W       D0,D2
  1151.        | 06E2  B452                           CMP.W       (A2),D2
  1152.        | 06E4  6C02                           BGE.B       06E8
  1153. ; 525:                 *miny = t;
  1154.        | 06E6  3482                           MOVE.W      D2,(A2)
  1155. ; 526:             if ((t = v->y + v->b) > *maxy)
  1156.        | 06E8  302D 0008                      MOVE.W      0008(A5),D0
  1157.        | 06EC  D06D 000C                      ADD.W       000C(A5),D0
  1158.        | 06F0  206F 0024                      MOVEA.L     0024(A7),A0
  1159.        | 06F4  B050                           CMP.W       (A0),D0
  1160.        | 06F6  6F02                           BLE.B       06FA
  1161. ; 527:                 *maxy = t;
  1162.        | 06F8  3080                           MOVE.W      D0,(A0)
  1163. ; 528:             break;
  1164. ; 529:         }
  1165. ; 530:         v = v->next;
  1166.        | 06FA  2A55                           MOVEA.L     (A5),A5
  1167. ; 531:     }
  1168.        | 06FC  200D                           MOVE.L      A5,D0
  1169.        | 06FE  6600 FF64                      BNE.W       0664
  1170. ; 532:     return(n);
  1171.        | 0702  3007                           MOVE.W      D7,D0
  1172.        | 0704  4CDF 24C4                      MOVEM.L     (A7)+,D2/D6-D7/A2/A5
  1173.        | 0708  584F                           ADDQ.W      #4,A7
  1174.        | 070A  4E75                           RTS
  1175. ; 533: }
  1176. ; 534: 
  1177. ; 535: /**
  1178. ; 536:  *
  1179. ; 537:  *   Allocate a new vtx structure, and add to list.
  1180. ; 538:  *
  1181. ; 539: **/
  1182. ; 540: struct vtx *AddVertex(v)
  1183. ; 541:     struct vtx *v;
  1184.        | 070C  594F                           SUBQ.W      #4,A7
  1185.        | 070E  48E7 0016                      MOVEM.L     A3/A5-A6,-(A7)
  1186.        | 0712  2A48                           MOVEA.L     A0,A5
  1187.        | 0714  2F4E 000C                      MOVE.L      A6,000C(A7)
  1188. ; 542: {
  1189. ; 543:     struct vtx *t, *m;
  1190. ; 544:     
  1191. ; 545:     if (v) 
  1192.        | 0718  200D                           MOVE.L      A5,D0
  1193.        | 071A  670A                           BEQ.B       0726
  1194. ; 546:     {
  1195. ; 547:         t = v;
  1196.        | 071C  264D                           MOVEA.L     A5,A3
  1197. ; 548:         while (t->next)
  1198.        | 071E  0C40 2653                      CMPI.W      #2653,D0
  1199. ; 549:             t = t->next;
  1200.        | 0722  4A93                           TST.L       (A3)
  1201.        | 0724  66FA                           BNE.B       0720
  1202. ; 550:     }
  1203. ; 551:     
  1204. ; 552:     m = (struct vtx *) AllocMem((long) sizeof(struct vtx), MEMF_CLEAR);
  1205.        | 0726  700E                           MOVEQ       #0E,D0
  1206.        | 0728  7201                           MOVEQ       #01,D1
  1207.        | 072A  4841                           SWAP        D1
  1208.        | 072C  2C78 0004                      MOVEA.L     0004,A6
  1209.        | 0730  4EAE FF3A                      JSR         FF3A(A6)
  1210.        | 0734  2040                           MOVEA.L     D0,A0
  1211.        | 0736  2C6F 000C                      MOVEA.L     000C(A7),A6
  1212. ; 553:     
  1213. ; 554:     if (v)
  1214.        | 073A  200D                           MOVE.L      A5,D0
  1215.        | 073C  6702                           BEQ.B       0740
  1216. ; 555:         t->next = m;
  1217.        | 073E  2688                           MOVE.L      A0,(A3)
  1218. ; 556:     
  1219. ; 557:     return(m);
  1220.        | 0740  2008                           MOVE.L      A0,D0
  1221.        | 0742  4CDF 6800                      MOVEM.L     (A7)+,A3/A5-A6
  1222.        | 0746  584F                           ADDQ.W      #4,A7
  1223.        | 0748  4E75                           RTS
  1224. ; 558: }
  1225. ; 559: 
  1226. ; 560: /**
  1227. ; 561:  *
  1228. ; 562:  *   Delete vtx structure list.
  1229. ; 563:  *
  1230. ; 564: **/
  1231. ; 565: struct vtx *KillVertex(v)
  1232. ; 566:     struct vtx *v;
  1233.        | 074A  594F                           SUBQ.W      #4,A7
  1234.        | 074C  48E7 0016                      MOVEM.L     A3/A5-A6,-(A7)
  1235.        | 0750  2A48                           MOVEA.L     A0,A5
  1236.        | 0752  2F4E 000C                      MOVE.L      A6,000C(A7)
  1237. ; 567: {
  1238. ; 568:     struct vtx *t;
  1239. ; 569:     
  1240. ; 570:     while (v) 
  1241.        | 0756  6014                           BRA.B       076C
  1242. ; 571:     {
  1243. ; 572:         t = v->next;
  1244.        | 0758  2655                           MOVEA.L     (A5),A3
  1245. ; 573:         FreeMem(v, (long) sizeof(struct vtx));
  1246.        | 075A  224D                           MOVEA.L     A5,A1
  1247.        | 075C  700E                           MOVEQ       #0E,D0
  1248.        | 075E  2C78 0004                      MOVEA.L     0004,A6
  1249.        | 0762  4EAE FF2E                      JSR         FF2E(A6)
  1250. ; 574:         v = t;
  1251.        | 0766  2A4B                           MOVEA.L     A3,A5
  1252.        | 0768  2C6F 000C                      MOVEA.L     000C(A7),A6
  1253. ; 575:     }
  1254.        | 076C  200D                           MOVE.L      A5,D0
  1255.        | 076E  66E8                           BNE.B       0758
  1256. ; 576:     
  1257. ; 577:     return(NULL);
  1258.        | 0770  7000                           MOVEQ       #00,D0
  1259.        | 0772  4CDF 6800                      MOVEM.L     (A7)+,A3/A5-A6
  1260.        | 0776  584F                           ADDQ.W      #4,A7
  1261.        | 0778  4E75                           RTS
  1262. ; 578: }
  1263. ; 579: 
  1264. ; 580: 
  1265. ; 581: 
  1266. ; 582: /**
  1267. ; 583:  *
  1268. ; 584:  *   This function calculates a dithering pattern for color n,
  1269. ; 585:  *   where n is a number between 0 and 124 (inclusive) according to
  1270. ; 586:  *
  1271. ; 587:  *      n = r * 25 + g * 5 + b,
  1272. ; 588:  *
  1273. ; 589:  *   with r, g, and b between 0 and 4 (inclusive).
  1274. ; 590:  *
  1275. ; 591: **/
  1276. ; 592: static unsigned int bits[16][2] = 
  1277. ; 593: {
  1278. ; 594:     {0x0000, 0x0000
  1279. ; 595: }
  1280. ; 596: ,
  1281. ; 597: {
  1282. ; 598:     0xaaaa, 0x0000
  1283. ; 599: }
  1284. ; 600: ,
  1285. ; 601: {
  1286. ; 602:     0x5555, 0x0000
  1287. ; 603: }
  1288. ; 604: ,
  1289. ; 605: {
  1290. ; 606:     0xffff, 0x0000
  1291. ; 607: }
  1292. ; 608: ,
  1293. ; 609: {
  1294. ; 610:     0x0000, 0xaaaa
  1295. ; 611: }
  1296. ; 612: ,
  1297. ; 613: {
  1298. ; 614:     0xaaaa, 0xaaaa
  1299. ; 615: }
  1300. ; 616: ,
  1301. ; 617: {
  1302. ; 618:     0x5555, 0xaaaa
  1303. ; 619: }
  1304. ; 620: ,
  1305. ; 621: {
  1306. ; 622:     0xffff, 0xaaaa
  1307. ; 623: }
  1308. ; 624: ,
  1309. ; 625: {
  1310. ; 626:     0x0000, 0x5555
  1311. ; 627: }
  1312. ; 628: ,
  1313. ; 629: {
  1314. ; 630:     0xaaaa, 0x5555
  1315. ; 631: }
  1316. ; 632: ,
  1317. ; 633: {
  1318. ; 634:     0x5555, 0x5555
  1319. ; 635: }
  1320. ; 636: ,
  1321. ; 637: {
  1322. ; 638:     0xffff, 0x5555
  1323. ; 639: }
  1324. ; 640: ,
  1325. ; 641: {
  1326. ; 642:     0x0000, 0xffff
  1327. ; 643: }
  1328. ; 644: ,
  1329. ; 645: {
  1330. ; 646:     0xaaaa, 0xffff
  1331. ; 647: }
  1332. ; 648: ,
  1333. ; 649: {
  1334. ; 650:     0x5555, 0xffff
  1335. ; 651: }
  1336. ; 652: ,
  1337. ; 653: {
  1338. ; 654:     0xffff, 0xffff
  1339. ; 655: }
  1340. ; 656: };
  1341. ; 657: 
  1342. ; 658: static int setdither(ptdata, n)
  1343. ; 659:     unsigned int ptdata[];
  1344. ; 660:     int n;
  1345.        | 077A  9EFC 0014                      SUBA.W      #0014,A7
  1346.        | 077E  48E7 3F14                      MOVEM.L     D2-D7/A3/A5,-(A7)
  1347.        | 0782  2A48                           MOVEA.L     A0,A5
  1348.        | 0784  3E00                           MOVE.W      D0,D7
  1349. ; 661: {
  1350. ; 662:     int r, g, b;
  1351. ; 663:     int l, m, nblack, nwhite, nmagenta, ncyan, nyellow;
  1352. ; 664:     static int indices[4];
  1353. ; 665:     static int map[4] = 
  1354. ; 666:     {
  1355. ; 667:         0, 3, 1, 2 
  1356. ; 668:     };
  1357. ; 669:     
  1358. ; 670:     /*
  1359. ; 671:      *   Argument tests
  1360. ; 672:      */
  1361. ; 673:     if (ptdata == 0L)
  1362.        | 0786  3F40 002E                      MOVE.W      D0,002E(A7)
  1363.        | 078A  2F4E 0030                      MOVE.L      A6,0030(A7)
  1364.        | 078E  200D                           MOVE.L      A5,D0
  1365.        | 0790  6700 029E                      BEQ.W       0A30
  1366. ; 674:         return;
  1367. ; 675:     if (n < 0)
  1368.        | 0794  4A47                           TST.W       D7
  1369.        | 0796  6B00 0298                      BMI.W       0A30
  1370. ; 676:         return;
  1371. ; 677:     
  1372. ; 678:     n = (n & 0x7f);
  1373.        | 079A  0247 007F                      ANDI.W      #007F,D7
  1374. ; 679:     if (n > 124)
  1375.        | 079E  707C                           MOVEQ       #7C,D0
  1376.        | 07A0  BE40                           CMP.W       D0,D7
  1377.        | 07A2  6F02                           BLE.B       07A6
  1378. ; 680:         n = 124;
  1379.        | 07A4  3E00                           MOVE.W      D0,D7
  1380. ; 681:     /*
  1381. ; 682:      *   Extract r, g, and b
  1382. ; 683:      */
  1383. ; 684:     r = n / 25;
  1384.        | 07A6  3007                           MOVE.W      D7,D0
  1385.        | 07A8  48C0                           EXT.L       D0
  1386.        | 07AA  7219                           MOVEQ       #19,D1
  1387.        | 07AC  81C1                           DIVS.W      D1,D0
  1388.        | 07AE  2C00                           MOVE.L      D0,D6
  1389. ; 685:     b = n - r * 25;
  1390.        | 07B0  E540                           ASL.W       #2,D0
  1391.        | 07B2  D046                           ADD.W       D6,D0
  1392.        | 07B4  2400                           MOVE.L      D0,D2
  1393.        | 07B6  E542                           ASL.W       #2,D2
  1394.        | 07B8  D440                           ADD.W       D0,D2
  1395.        | 07BA  3007                           MOVE.W      D7,D0
  1396.        | 07BC  9042                           SUB.W       D2,D0
  1397. ; 686:     g = b / 5;
  1398.        | 07BE  3F40 0020                      MOVE.W      D0,0020(A7)
  1399.        | 07C2  48C0                           EXT.L       D0
  1400.        | 07C4  7205                           MOVEQ       #05,D1
  1401.        | 07C6  81C1                           DIVS.W      D1,D0
  1402.        | 07C8  2E00                           MOVE.L      D0,D7
  1403. ; 687:     b = b - g * 5;
  1404.        | 07CA  E540                           ASL.W       #2,D0
  1405.        | 07CC  D047                           ADD.W       D7,D0
  1406.        | 07CE  322F 0020                      MOVE.W      0020(A7),D1
  1407.        | 07D2  9240                           SUB.W       D0,D1
  1408.        | 07D4  2A01                           MOVE.L      D1,D5
  1409. ; 688:     /*
  1410. ; 689:      *   Initialize number of black pixels in a square
  1411. ; 690:      */
  1412. ; 691:     nblack = 4;
  1413.        | 07D6  7804                           MOVEQ       #04,D4
  1414. ; 692:     /*
  1415. ; 693:      *   Number of white pixels...
  1416. ; 694:      */
  1417. ; 695:     if (nwhite = min(min(r, g), b)) 
  1418.        | 07D8  BC47                           CMP.W       D7,D6
  1419.        | 07DA  6F04                           BLE.B       07E0
  1420.        | 07DC  3007                           MOVE.W      D7,D0
  1421.        | 07DE  0C40 3006                      CMPI.W      #3006,D0
  1422.        | 07E2  B045                           CMP.W       D5,D0
  1423.        | 07E4  6F04                           BLE.B       07EA
  1424.        | 07E6  3005                           MOVE.W      D5,D0
  1425.        | 07E8  600A                           BRA.B       07F4
  1426.        | 07EA  BC47                           CMP.W       D7,D6
  1427.        | 07EC  6F04                           BLE.B       07F2
  1428.        | 07EE  3007                           MOVE.W      D7,D0
  1429.        | 07F0  0C40 3006                      CMPI.W      #3006,D0
  1430.        | 07F4  3F40 0026                      MOVE.W      D0,0026(A7)
  1431.        | 07F8  670C                           BEQ.B       0806
  1432. ; 696:     {
  1433. ; 697:         r -= nwhite;
  1434.        | 07FA  9C40                           SUB.W       D0,D6
  1435. ; 698:         g -= nwhite;
  1436.        | 07FC  9E40                           SUB.W       D0,D7
  1437. ; 699:         b -= nwhite;
  1438.        | 07FE  9A40                           SUB.W       D0,D5
  1439. ; 700:         nblack -= nwhite;
  1440.        | 0800  7204                           MOVEQ       #04,D1
  1441.        | 0802  9240                           SUB.W       D0,D1
  1442.        | 0804  2801                           MOVE.L      D1,D4
  1443. ; 701:     }
  1444. ; 702:     /*
  1445. ; 703:      *   ...and cyan, magenta or yellow pixels
  1446. ; 704:      */
  1447. ; 705:     ncyan    = min(g, b);
  1448.        | 0806  BE45                           CMP.W       D5,D7
  1449.        | 0808  6F04                           BLE.B       080E
  1450.        | 080A  3205                           MOVE.W      D5,D1
  1451.        | 080C  0C40 3207                      CMPI.W      #3207,D0
  1452. ; 706:     nmagenta = min(r, b);
  1453.        | 0810  3F41 0020                      MOVE.W      D1,0020(A7)
  1454.        | 0814  BC45                           CMP.W       D5,D6
  1455.        | 0816  6F04                           BLE.B       081C
  1456.        | 0818  3405                           MOVE.W      D5,D2
  1457.        | 081A  0C40 3406                      CMPI.W      #3406,D0
  1458. ; 707:     nyellow  = min(r, g);
  1459.        | 081E  3F42 0022                      MOVE.W      D2,0022(A7)
  1460.        | 0822  BC47                           CMP.W       D7,D6
  1461.        | 0824  6F04                           BLE.B       082A
  1462.        | 0826  3607                           MOVE.W      D7,D3
  1463.        | 0828  0C40 3606                      CMPI.W      #3606,D0
  1464.        | 082C  3F43 0024                      MOVE.W      D3,0024(A7)
  1465. ; 708:     
  1466. ; 709:     if (ncyan) 
  1467.        | 0830  4A41                           TST.W       D1
  1468.        | 0832  6708                           BEQ.B       083C
  1469. ; 710:     {
  1470. ; 711:         g -= ncyan;
  1471.        | 0834  9E41                           SUB.W       D1,D7
  1472. ; 712:         b -= ncyan;
  1473.        | 0836  9A41                           SUB.W       D1,D5
  1474. ; 713:         nblack -= ncyan;
  1475.        | 0838  9841                           SUB.W       D1,D4
  1476.        | 083A  6016                           BRA.B       0852
  1477. ; 714:     }
  1478. ; 715:     else
  1479. ; 716:     if (nmagenta) 
  1480.        | 083C  4A42                           TST.W       D2
  1481.        | 083E  6708                           BEQ.B       0848
  1482. ; 717:     {
  1483. ; 718:         r -= nmagenta;
  1484.        | 0840  9C42                           SUB.W       D2,D6
  1485. ; 719:         b -= nmagenta;
  1486.        | 0842  9A42                           SUB.W       D2,D5
  1487. ; 720:         nblack -= nmagenta;
  1488.        | 0844  9842                           SUB.W       D2,D4
  1489.        | 0846  600A                           BRA.B       0852
  1490. ; 721:     }
  1491. ; 722:     else
  1492. ; 723:     if (nyellow) 
  1493.        | 0848  4A43                           TST.W       D3
  1494.        | 084A  6706                           BEQ.B       0852
  1495. ; 724:     {
  1496. ; 725:         r -= nyellow;
  1497.        | 084C  9C43                           SUB.W       D3,D6
  1498. ; 726:         g -= nyellow;
  1499.        | 084E  9E43                           SUB.W       D3,D7
  1500. ; 727:         nblack -= nyellow;
  1501.        | 0850  9843                           SUB.W       D3,D4
  1502. ; 728:     }
  1503. ; 729:     /*
  1504. ; 730:      *   ...and red green and blue pixels
  1505. ; 731:      */
  1506. ; 732:     if      (r)
  1507.        | 0852  3F47 0028                      MOVE.W      D7,0028(A7)
  1508.        | 0856  2005                           MOVE.L      D5,D0
  1509.        | 0858  3F40 002A                      MOVE.W      D0,002A(A7)
  1510.        | 085C  4A46                           TST.W       D6
  1511.        | 085E  6704                           BEQ.B       0864
  1512. ; 733:         nblack -= r;
  1513.        | 0860  9846                           SUB.W       D6,D4
  1514.        | 0862  600E                           BRA.B       0872
  1515. ; 734:     else
  1516. ; 735:     if (g)
  1517.        | 0864  4A47                           TST.W       D7
  1518.        | 0866  6704                           BEQ.B       086C
  1519. ; 736:         nblack -= g;
  1520.        | 0868  9847                           SUB.W       D7,D4
  1521.        | 086A  6006                           BRA.B       0872
  1522. ; 737:     else
  1523. ; 738:     if (b)
  1524.        | 086C  4A45                           TST.W       D5
  1525.        | 086E  6702                           BEQ.B       0872
  1526. ; 739:         nblack -= b;
  1527.        | 0870  9845                           SUB.W       D5,D4
  1528. ; 740:     /*
  1529. ; 741:      *   Set up the color indices for the four pixels
  1530. ; 742:      */
  1531. ; 743:     m = 0;
  1532.        | 0872  7400                           MOVEQ       #00,D2
  1533. ; 744:     for (l = 0; l < nblack;   l++, m++)
  1534.        | 0874  7600                           MOVEQ       #00,D3
  1535.        | 0876  47EC  019A-01.2                LEA         01.0000019A(A4),A3
  1536.        | 087A  6014                           BRA.B       0890
  1537. ; 745:         indices[map[m]] = 0;
  1538.        | 087C  301B                           MOVE.W      (A3)+,D0
  1539.        | 087E  48C0                           EXT.L       D0
  1540.        | 0880  2200                           MOVE.L      D0,D1
  1541.        | 0882  D281                           ADD.L       D1,D1
  1542.        | 0884  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1543.        | 0888  4270 1800                      CLR.W       00(A0,D1.L)
  1544.        | 088C  5243                           ADDQ.W      #1,D3
  1545.        | 088E  5242                           ADDQ.W      #1,D2
  1546.        | 0890  B644                           CMP.W       D4,D3
  1547.        | 0892  6DE8                           BLT.B       087C
  1548. ; 746:     for (l = 0; l < nwhite;   l++, m++)
  1549.        | 0894  7600                           MOVEQ       #00,D3
  1550.        | 0896  48C2                           EXT.L       D2
  1551.        | 0898  2002                           MOVE.L      D2,D0
  1552.        | 089A  D080                           ADD.L       D0,D0
  1553.        | 089C  47EC  019A-01.2                LEA         01.0000019A(A4),A3
  1554.        | 08A0  D7C0                           ADDA.L      D0,A3
  1555.        | 08A2  382F 0026                      MOVE.W      0026(A7),D4
  1556.        | 08A6  6016                           BRA.B       08BE
  1557. ; 747:         indices[map[m]] = 1;
  1558.        | 08A8  301B                           MOVE.W      (A3)+,D0
  1559.        | 08AA  48C0                           EXT.L       D0
  1560.        | 08AC  2200                           MOVE.L      D0,D1
  1561.        | 08AE  D281                           ADD.L       D1,D1
  1562.        | 08B0  7001                           MOVEQ       #01,D0
  1563.        | 08B2  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1564.        | 08B6  3180 1800                      MOVE.W      D0,00(A0,D1.L)
  1565.        | 08BA  5243                           ADDQ.W      #1,D3
  1566.        | 08BC  5242                           ADDQ.W      #1,D2
  1567.        | 08BE  B644                           CMP.W       D4,D3
  1568.        | 08C0  6DE6                           BLT.B       08A8
  1569. ; 748:     for (l = 0; l < ncyan;    l++, m++)
  1570.        | 08C2  7600                           MOVEQ       #00,D3
  1571.        | 08C4  48C2                           EXT.L       D2
  1572.        | 08C6  2002                           MOVE.L      D2,D0
  1573.        | 08C8  D080                           ADD.L       D0,D0
  1574.        | 08CA  47EC  019A-01.2                LEA         01.0000019A(A4),A3
  1575.        | 08CE  D7C0                           ADDA.L      D0,A3
  1576.        | 08D0  382F 0020                      MOVE.W      0020(A7),D4
  1577.        | 08D4  6016                           BRA.B       08EC
  1578. ; 749:         indices[map[m]] = 5;
  1579.        | 08D6  301B                           MOVE.W      (A3)+,D0
  1580.        | 08D8  48C0                           EXT.L       D0
  1581.        | 08DA  2200                           MOVE.L      D0,D1
  1582.        | 08DC  D281                           ADD.L       D1,D1
  1583.        | 08DE  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1584.        | 08E2  31BC 0005 1800                 MOVE.W      #0005,00(A0,D1.L)
  1585.        | 08E8  5243                           ADDQ.W      #1,D3
  1586.        | 08EA  5242                           ADDQ.W      #1,D2
  1587.        | 08EC  B644                           CMP.W       D4,D3
  1588.        | 08EE  6DE6                           BLT.B       08D6
  1589. ; 750:     for (l = 0; l < nmagenta; l++, m++)
  1590.        | 08F0  7600                           MOVEQ       #00,D3
  1591.        | 08F2  48C2                           EXT.L       D2
  1592.        | 08F4  2002                           MOVE.L      D2,D0
  1593.        | 08F6  D080                           ADD.L       D0,D0
  1594.        | 08F8  47EC  019A-01.2                LEA         01.0000019A(A4),A3
  1595.        | 08FC  D7C0                           ADDA.L      D0,A3
  1596.        | 08FE  382F 0022                      MOVE.W      0022(A7),D4
  1597.        | 0902  6016                           BRA.B       091A
  1598. ; 751:         indices[map[m]] = 6;
  1599.        | 0904  301B                           MOVE.W      (A3)+,D0
  1600.        | 0906  48C0                           EXT.L       D0
  1601.        | 0908  2200                           MOVE.L      D0,D1
  1602.        | 090A  D281                           ADD.L       D1,D1
  1603.        | 090C  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1604.        | 0910  31BC 0006 1800                 MOVE.W      #0006,00(A0,D1.L)
  1605.        | 0916  5243                           ADDQ.W      #1,D3
  1606.        | 0918  5242                           ADDQ.W      #1,D2
  1607.        | 091A  B644                           CMP.W       D4,D3
  1608.        | 091C  6DE6                           BLT.B       0904
  1609. ; 752:     for (l = 0; l < nyellow;  l++, m++)
  1610.        | 091E  7600                           MOVEQ       #00,D3
  1611.        | 0920  48C2                           EXT.L       D2
  1612.        | 0922  2002                           MOVE.L      D2,D0
  1613.        | 0924  D080                           ADD.L       D0,D0
  1614.        | 0926  47EC  019A-01.2                LEA         01.0000019A(A4),A3
  1615.        | 092A  D7C0                           ADDA.L      D0,A3
  1616.        | 092C  382F 0024                      MOVE.W      0024(A7),D4
  1617.        | 0930  6016                           BRA.B       0948
  1618. ; 753:         indices[map[m]] = 7;
  1619.        | 0932  301B                           MOVE.W      (A3)+,D0
  1620.        | 0934  48C0                           EXT.L       D0
  1621.        | 0936  2200                           MOVE.L      D0,D1
  1622.        | 0938  D281                           ADD.L       D1,D1
  1623.        | 093A  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1624.        | 093E  31BC 0007 1800                 MOVE.W      #0007,00(A0,D1.L)
  1625.        | 0944  5243                           ADDQ.W      #1,D3
  1626.        | 0946  5242                           ADDQ.W      #1,D2
  1627.        | 0948  B644                           CMP.W       D4,D3
  1628.        | 094A  6DE6                           BLT.B       0932
  1629. ; 754:     for (l = 0; l < r;        l++, m++)
  1630.        | 094C  7600                           MOVEQ       #00,D3
  1631.        | 094E  48C2                           EXT.L       D2
  1632.        | 0950  2002                           MOVE.L      D2,D0
  1633.        | 0952  D080                           ADD.L       D0,D0
  1634.        | 0954  47EC  019A-01.2                LEA         01.0000019A(A4),A3
  1635.        | 0958  D7C0                           ADDA.L      D0,A3
  1636.        | 095A  6016                           BRA.B       0972
  1637. ; 755:         indices[map[m]] = 2;
  1638.        | 095C  301B                           MOVE.W      (A3)+,D0
  1639.        | 095E  48C0                           EXT.L       D0
  1640.        | 0960  2200                           MOVE.L      D0,D1
  1641.        | 0962  D281                           ADD.L       D1,D1
  1642.        | 0964  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1643.        | 0968  31BC 0002 1800                 MOVE.W      #0002,00(A0,D1.L)
  1644.        | 096E  5243                           ADDQ.W      #1,D3
  1645.        | 0970  5242                           ADDQ.W      #1,D2
  1646.        | 0972  B646                           CMP.W       D6,D3
  1647.        | 0974  6DE6                           BLT.B       095C
  1648. ; 756:     for (l = 0; l < g;        l++, m++)
  1649.        | 0976  7800                           MOVEQ       #00,D4
  1650.        | 0978  48C2                           EXT.L       D2
  1651.        | 097A  2002                           MOVE.L      D2,D0
  1652.        | 097C  D080                           ADD.L       D0,D0
  1653.        | 097E  47EC  019A-01.2                LEA         01.0000019A(A4),A3
  1654.        | 0982  D7C0                           ADDA.L      D0,A3
  1655.        | 0984  362F 0028                      MOVE.W      0028(A7),D3
  1656.        | 0988  6016                           BRA.B       09A0
  1657. ; 757:         indices[map[m]] = 3;
  1658.        | 098A  301B                           MOVE.W      (A3)+,D0
  1659.        | 098C  48C0                           EXT.L       D0
  1660.        | 098E  2200                           MOVE.L      D0,D1
  1661.        | 0990  D281                           ADD.L       D1,D1
  1662.        | 0992  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1663.        | 0996  31BC 0003 1800                 MOVE.W      #0003,00(A0,D1.L)
  1664.        | 099C  5244                           ADDQ.W      #1,D4
  1665.        | 099E  5242                           ADDQ.W      #1,D2
  1666.        | 09A0  B843                           CMP.W       D3,D4
  1667.        | 09A2  6DE6                           BLT.B       098A
  1668. ; 758:     for (l = 0; l < b;        l++, m++)
  1669.        | 09A4  7600                           MOVEQ       #00,D3
  1670.        | 09A6  48C2                           EXT.L       D2
  1671.        | 09A8  2002                           MOVE.L      D2,D0
  1672.        | 09AA  D080                           ADD.L       D0,D0
  1673.        | 09AC  47EC  019A-01.2                LEA         01.0000019A(A4),A3
  1674.        | 09B0  D7C0                           ADDA.L      D0,A3
  1675.        | 09B2  342F 002A                      MOVE.W      002A(A7),D2
  1676.        | 09B6  6014                           BRA.B       09CC
  1677. ; 759:         indices[map[m]] = 4;
  1678.        | 09B8  301B                           MOVE.W      (A3)+,D0
  1679.        | 09BA  48C0                           EXT.L       D0
  1680.        | 09BC  2200                           MOVE.L      D0,D1
  1681.        | 09BE  D281                           ADD.L       D1,D1
  1682.        | 09C0  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1683.        | 09C4  31BC 0004 1800                 MOVE.W      #0004,00(A0,D1.L)
  1684.        | 09CA  5243                           ADDQ.W      #1,D3
  1685.        | 09CC  B642                           CMP.W       D2,D3
  1686.        | 09CE  6DE8                           BLT.B       09B8
  1687. ; 760:     /*
  1688. ; 761:      *   Convert to bitmaps and return in ptdata.
  1689. ; 762:      */
  1690. ; 763:     movmem(bits[bm(indices, 0)], &ptdata[0], 4);
  1691.        | 09D0  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1692.        | 09D4  7000                           MOVEQ       #00,D0
  1693.        | 09D6  6100 0062                      BSR.W       0A3A
  1694.        | 09DA  48C0                           EXT.L       D0
  1695.        | 09DC  E580                           ASL.L       #2,D0
  1696.        | 09DE  41EC  015A-01.2                LEA         01.0000015A(A4),A0
  1697.        | 09E2  D1C0                           ADDA.L      D0,A0
  1698.        | 09E4  224D                           MOVEA.L     A5,A1
  1699.        | 09E6  7004                           MOVEQ       #04,D0
  1700.        | 09E8  6100  0000-XX.1                BSR.W       @movmem
  1701. ; 764:     movmem(bits[bm(indices, 1)], &ptdata[2], 4);
  1702.        | 09EC  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1703.        | 09F0  7001                           MOVEQ       #01,D0
  1704.        | 09F2  6100 0046                      BSR.W       0A3A
  1705.        | 09F6  48C0                           EXT.L       D0
  1706.        | 09F8  E580                           ASL.L       #2,D0
  1707.        | 09FA  41EC  015A-01.2                LEA         01.0000015A(A4),A0
  1708.        | 09FE  D1C0                           ADDA.L      D0,A0
  1709.        | 0A00  43ED 0004                      LEA         0004(A5),A1
  1710.        | 0A04  7004                           MOVEQ       #04,D0
  1711.        | 0A06  6100  0000-XX.1                BSR.W       @movmem
  1712. ; 765:     movmem(bits[bm(indices, 2)], &ptdata[4], 4);
  1713.        | 0A0A  41EC  0000-02.2                LEA         02.00000000(A4),A0
  1714.        | 0A0E  7002                           MOVEQ       #02,D0
  1715.        | 0A10  6100 0028                      BSR.W       0A3A
  1716.        | 0A14  48C0                           EXT.L       D0
  1717.        | 0A16  E580                           ASL.L       #2,D0
  1718.        | 0A18  41EC  015A-01.2                LEA         01.0000015A(A4),A0
  1719.        | 0A1C  D1C0                           ADDA.L      D0,A0
  1720.        | 0A1E  43ED 0008                      LEA         0008(A5),A1
  1721.        | 0A22  7004                           MOVEQ       #04,D0
  1722.        | 0A24  4CDF 28FC                      MOVEM.L     (A7)+,D2-D7/A3/A5
  1723.        | 0A28  DEFC 0014                      ADDA.W      #0014,A7
  1724.        | 0A2C  6000  0000-XX.1                BRA.W       @movmem
  1725. ; 766:     
  1726. ; 767:     return;
  1727.        | 0A30  4CDF 28FC                      MOVEM.L     (A7)+,D2-D7/A3/A5
  1728.        | 0A34  DEFC 0014                      ADDA.W      #0014,A7
  1729.        | 0A38  4E75                           RTS
  1730. ; 768: }
  1731. ; 769: 
  1732. ; 770: /**
  1733. ; 771:  *
  1734. ; 772:  *   Extract bitmap n from quadruple s
  1735. ; 773:  *
  1736. ; 774: **/
  1737. ; 775: static int bm(s, n)
  1738. ; 776:     int s[], n;
  1739.        | 0A3A  594F                           SUBQ.W      #4,A7
  1740.        | 0A3C  48E7 3C00                      MOVEM.L     D2-D5,-(A7)
  1741.        | 0A40  2400                           MOVE.L      D0,D2
  1742. ; 777: {
  1743. ; 778:     int index = 0;
  1744. ; 779:     int mask = 1 << n;
  1745.        | 0A42  3002                           MOVE.W      D2,D0
  1746.        | 0A44  7200                           MOVEQ       #00,D1
  1747.        | 0A46  01C1                           BSET.L      D0,D1
  1748. ; 780:     
  1749. ; 781:     
  1750. ; 782:     index = (( ((s[3] & mask) << 3) +
  1751.        | 0A48  3028 0006                      MOVE.W      0006(A0),D0
  1752.        | 0A4C  C041                           AND.W       D1,D0
  1753. ; 783:     ((s[2] & mask) << 2) +
  1754.        | 0A4E  3628 0004                      MOVE.W      0004(A0),D3
  1755.        | 0A52  C641                           AND.W       D1,D3
  1756. ; 784:     ((s[1] & mask) << 1) +
  1757.        | 0A54  3828 0002                      MOVE.W      0002(A0),D4
  1758.        | 0A58  C841                           AND.W       D1,D4
  1759. ; 785:     ((s[0] & mask)     )   ) >> n) & 0xf ;
  1760.        | 0A5A  3A10                           MOVE.W      (A0),D5
  1761.        | 0A5C  CA41                           AND.W       D1,D5
  1762.        | 0A5E  D844                           ADD.W       D4,D4
  1763.        | 0A60  E543                           ASL.W       #2,D3
  1764.        | 0A62  E740                           ASL.W       #3,D0
  1765.        | 0A64  D043                           ADD.W       D3,D0
  1766.        | 0A66  D044                           ADD.W       D4,D0
  1767.        | 0A68  D045                           ADD.W       D5,D0
  1768.        | 0A6A  E460                           ASR.W       D2,D0
  1769.        | 0A6C  0240 000F                      ANDI.W      #000F,D0
  1770. ; 786:     
  1771. ; 787:     return(index);
  1772.        | 0A70  4CDF 003C                      MOVEM.L     (A7)+,D2-D5
  1773.        | 0A74  584F                           ADDQ.W      #4,A7
  1774.        | 0A76  4E75                           RTS
  1775. ; 788: }
  1776. ; 789: 
  1777. ; 790: 
  1778. ; 791: 
  1779. ; 792: // These are already defined (differently in one case)
  1780. ; 793:     //static struct vtx *addintersect(), *addvtx();
  1781. ; 794:     //int inside();
  1782. ; 795:     //static struct vtx *SHClip();
  1783. ; 796:     
  1784. ; 797:     /**
  1785. ; 798:      *
  1786. ; 799:      *   Clip a vertex list against a rectangle
  1787. ; 800:      *
  1788. ; 801:     **/
  1789. ; 802:     static struct vtx *AreaPolyClip(vi, x1, y1, x2, y2)
  1790. ; 803:     struct vtx *vi;
  1791. ; 804:     int x1, y1, x2, y2;
  1792.        | 0A78  514F                           SUBQ.W      #8,A7
  1793.        | 0A7A  48E7 0214                      MOVEM.L     D6/A3/A5,-(A7)
  1794.        | 0A7E  2C01                           MOVE.L      D1,D6
  1795.        | 0A80  2200                           MOVE.L      D0,D1
  1796. ; 805: {
  1797. ; 806:     struct vtx *vo = NULL;
  1798. ; 807:     
  1799. ; 808:     vo = SHClip(vi, BD_LEFT, x1);
  1800.        | 0A82  2F48 000C                      MOVE.L      A0,000C(A7)
  1801.        | 0A86  2F4E 0010                      MOVE.L      A6,0010(A7)
  1802.        | 0A8A  7001                           MOVEQ       #01,D0
  1803.        | 0A8C  6100 0048                      BSR.W       0AD6
  1804. ; 809:     /*
  1805. ; 810:      *   Be careful not to deallocate the input list!
  1806. ; 811:      */
  1807. ; 812:     vi = vo;
  1808.        | 0A90  2A40                           MOVEA.L     D0,A5
  1809. ; 813:     
  1810. ; 814:     vo = SHClip(vi, BD_RIGHT, x2);
  1811.        | 0A92  2040                           MOVEA.L     D0,A0
  1812.        | 0A94  322F 0018                      MOVE.W      0018(A7),D1
  1813.        | 0A98  7002                           MOVEQ       #02,D0
  1814.        | 0A9A  6100 003A                      BSR.W       0AD6
  1815.        | 0A9E  2640                           MOVEA.L     D0,A3
  1816. ; 815:     KillVertex(vi);
  1817.        | 0AA0  204D                           MOVEA.L     A5,A0
  1818.        | 0AA2  6100 FCA6                      BSR.W       074A
  1819. ; 816:     vi = vo;
  1820. ; 817:     
  1821. ; 818:     vo = SHClip(vi, BD_TOP, y1);
  1822.        | 0AA6  2206                           MOVE.L      D6,D1
  1823.        | 0AA8  204B                           MOVEA.L     A3,A0
  1824.        | 0AAA  7003                           MOVEQ       #03,D0
  1825.        | 0AAC  6100 0028                      BSR.W       0AD6
  1826.        | 0AB0  2A40                           MOVEA.L     D0,A5
  1827. ; 819:     KillVertex(vi);
  1828.        | 0AB2  204B                           MOVEA.L     A3,A0
  1829.        | 0AB4  6100 FC94                      BSR.W       074A
  1830. ; 820:     vi = vo;
  1831. ; 821:     
  1832. ; 822:     vo = SHClip(vi, BD_BOTTOM, y2);
  1833.        | 0AB8  322F 001A                      MOVE.W      001A(A7),D1
  1834.        | 0ABC  204D                           MOVEA.L     A5,A0
  1835.        | 0ABE  7004                           MOVEQ       #04,D0
  1836.        | 0AC0  6100 0014                      BSR.W       0AD6
  1837.        | 0AC4  2640                           MOVEA.L     D0,A3
  1838. ; 823:     KillVertex(vi);
  1839.        | 0AC6  204D                           MOVEA.L     A5,A0
  1840.        | 0AC8  6100 FC80                      BSR.W       074A
  1841. ; 824:     
  1842. ; 825:     return(vo);
  1843.        | 0ACC  200B                           MOVE.L      A3,D0
  1844.        | 0ACE  4CDF 2840                      MOVEM.L     (A7)+,D6/A3/A5
  1845.        | 0AD2  504F                           ADDQ.W      #8,A7
  1846.        | 0AD4  4E75                           RTS
  1847. ; 826: }
  1848. ; 827: 
  1849. ; 828: /**
  1850. ; 829:  *
  1851. ; 830:  *   Polygon clipping against a single boundary
  1852. ; 831:  *   Sutherland-Hodgman, Foley and Van dam page 454
  1853. ; 832:  *   Modified to do just rectangular clips.
  1854. ; 833:  *
  1855. ; 834: **/
  1856. ; 835: static struct vtx *SHClip(vi, bordertype, bordervalue)
  1857. ; 836:     struct vtx *vi;
  1858. ; 837:     int bordertype, bordervalue;
  1859.        | 0AD6  9EFC 000C                      SUBA.W      #000C,A7
  1860.        | 0ADA  48E7 0736                      MOVEM.L     D5-D7/A2-A3/A5-A6,-(A7)
  1861.        | 0ADE  2C01                           MOVE.L      D1,D6
  1862.        | 0AE0  2E00                           MOVE.L      D0,D7
  1863.        | 0AE2  2A48                           MOVEA.L     A0,A5
  1864. ; 838: {
  1865. ; 839:     struct vtx *p, *s, *vo, *t, *u;
  1866. ; 840:     int first = 1;
  1867.        | 0AE4  7A01                           MOVEQ       #01,D5
  1868. ; 841:     /*
  1869. ; 842:      *   Find last vertex s
  1870. ; 843:      */
  1871. ; 844:     s = NULL;
  1872.        | 0AE6  97CB                           SUBA.L      A3,A3
  1873. ; 845:     
  1874. ; 846:     t = vi;
  1875.        | 0AE8  244D                           MOVEA.L     A5,A2
  1876.        | 0AEA  2F4E 0020                      MOVE.L      A6,0020(A7)
  1877. ; 847:     while (t) 
  1878.        | 0AEE  600C                           BRA.B       0AFC
  1879. ; 848:     {
  1880. ; 849:         if (t->type == AREADRAW)
  1881.        | 0AF0  7002                           MOVEQ       #02,D0
  1882.        | 0AF2  B06A 0004                      CMP.W       0004(A2),D0
  1883.        | 0AF6  6602                           BNE.B       0AFA
  1884. ; 850:             s = t;
  1885.        | 0AF8  264A                           MOVEA.L     A2,A3
  1886. ; 851:         t = t->next;
  1887.        | 0AFA  2452                           MOVEA.L     (A2),A2
  1888. ; 852:     }
  1889.        | 0AFC  200A                           MOVE.L      A2,D0
  1890.        | 0AFE  66F0                           BNE.B       0AF0
  1891. ; 853:     /*
  1892. ; 854:      *   If there is no last vertex, there is nothing to do
  1893. ; 855:      */
  1894. ; 856:     if (s == NULL)
  1895. ; 857:         return(NULL);
  1896.        | 0B00  95CA                           SUBA.L      A2,A2
  1897.        | 0B02  200B                           MOVE.L      A3,D0
  1898.        | 0B04  6700 00DA                      BEQ.W       0BE0
  1899. ; 858:     /*
  1900. ; 859:      *   Set up output vertex array
  1901. ; 860:      */
  1902. ; 861:     vo = AddVertex(NULL);
  1903.        | 0B08  204A                           MOVEA.L     A2,A0
  1904.        | 0B0A  6100 FC00                      BSR.W       070C
  1905. ; 862:     if (vo == NULL)
  1906.        | 0B0E  2F40 001C                      MOVE.L      D0,001C(A7)
  1907.        | 0B12  6606                           BNE.B       0B1A
  1908. ; 863:         return(NULL);
  1909.        | 0B14  7000                           MOVEQ       #00,D0
  1910.        | 0B16  6000 00CA                      BRA.W       0BE2
  1911.        | 0B1A  2C6F 0020                      MOVEA.L     0020(A7),A6
  1912. ; 864:     /*
  1913. ; 865:      *   Loop over the list
  1914. ; 866:      */
  1915. ; 867:     while (vi) 
  1916.        | 0B1E  6000 00B2                      BRA.W       0BD2
  1917. ; 868:     {
  1918. ; 869:         /*
  1919. ; 870:          *   Skip non-vertices.
  1920. ; 871:          */
  1921. ; 872:         if ((vi->type == AREAMOVE) || (vi->type == AREADRAW)) 
  1922.        | 0B22  302D 0004                      MOVE.W      0004(A5),D0
  1923.        | 0B26  7201                           MOVEQ       #01,D1
  1924.        | 0B28  B041                           CMP.W       D1,D0
  1925.        | 0B2A  6706                           BEQ.B       0B32
  1926.        | 0B2C  5540                           SUBQ.W      #2,D0
  1927.        | 0B2E  6600 0092                      BNE.W       0BC2
  1928. ; 873:         {
  1929. ; 874:             p = vi;
  1930. ; 875:             /*
  1931. ; 876:              *   Now s and p correspond to the vertices in Fig. 11.21 in
  1932. ; 877:              *   Foley and Van Dam
  1933. ; 878:              */
  1934. ; 879:             if (inside(p, bordertype, bordervalue)) 
  1935.        | 0B32  2007                           MOVE.L      D7,D0
  1936.        | 0B34  2206                           MOVE.L      D6,D1
  1937.        | 0B36  204D                           MOVEA.L     A5,A0
  1938.        | 0B38  6100 00EC                      BSR.W       0C26
  1939.        | 0B3C  4A40                           TST.W       D0
  1940.        | 0B3E  675E                           BEQ.B       0B9E
  1941. ; 880:             {
  1942. ; 881:                 if (inside(s, bordertype, bordervalue)) 
  1943.        | 0B40  2007                           MOVE.L      D7,D0
  1944.        | 0B42  2206                           MOVE.L      D6,D1
  1945.        | 0B44  204B                           MOVEA.L     A3,A0
  1946.        | 0B46  6100 00DE                      BSR.W       0C26
  1947.        | 0B4A  4A40                           TST.W       D0
  1948.        | 0B4C  670A                           BEQ.B       0B58
  1949. ; 882:                 {
  1950. ; 883:                     addvtx(vo, p);
  1951.        | 0B4E  204A                           MOVEA.L     A2,A0
  1952.        | 0B50  224D                           MOVEA.L     A5,A1
  1953.        | 0B52  6100 0098                      BSR.W       0BEC
  1954.        | 0B56  6064                           BRA.B       0BBC
  1955. ; 884:                 }
  1956. ; 885:                 else
  1957. ; 886:                 {
  1958. ; 887:                     t = addintersect(vo, s, p, bordertype, bordervalue);
  1959.        | 0B58  2F0D                           MOVE.L      A5,-(A7)
  1960.        | 0B5A  2007                           MOVE.L      D7,D0
  1961.        | 0B5C  2206                           MOVE.L      D6,D1
  1962.        | 0B5E  204A                           MOVEA.L     A2,A0
  1963.        | 0B60  224B                           MOVEA.L     A3,A1
  1964.        | 0B62  6100 012A                      BSR.W       0C8E
  1965.        | 0B66  2640                           MOVEA.L     D0,A3
  1966. ; 888:                     u = addvtx(vo, p);
  1967.        | 0B68  204A                           MOVEA.L     A2,A0
  1968.        | 0B6A  224D                           MOVEA.L     A5,A1
  1969.        | 0B6C  6100 007E                      BSR.W       0BEC
  1970.        | 0B70  584F                           ADDQ.W      #4,A7
  1971.        | 0B72  2240                           MOVEA.L     D0,A1
  1972. ; 889:                     /*
  1973. ; 890:                      *   Tricky: (only the first time!) if the first point is inside, but the
  1974. ; 891:                      *   previous point (which is the last point in the list) is outside,
  1975. ; 892:                      *   we want to reverse the functions of the two added points. The new
  1976. ; 893:                      *   intersect (t) becomes a "move", whereas the point at hand becomes a
  1977. ; 894:                      *   "draw" (if they were "draw" and "move" before). Reason: the intersect
  1978. ; 895:                      *   gets added *first*, even though it is the leftover of the *last* point.
  1979. ; 896:                      */
  1980. ; 897:                     if (first && t && u) 
  1981.        | 0B74  4A45                           TST.W       D5
  1982.        | 0B76  6744                           BEQ.B       0BBC
  1983.        | 0B78  200B                           MOVE.L      A3,D0
  1984.        | 0B7A  6740                           BEQ.B       0BBC
  1985.        | 0B7C  2009                           MOVE.L      A1,D0
  1986.        | 0B7E  673C                           BEQ.B       0BBC
  1987. ; 898:                     {
  1988. ; 899:                         if ((s->type == AREADRAW) && (p->type == AREAMOVE)) 
  1989.        | 0B80  7002                           MOVEQ       #02,D0
  1990.        | 0B82  206F 0024                      MOVEA.L     0024(A7),A0
  1991.        | 0B86  B068 0004                      CMP.W       0004(A0),D0
  1992.        | 0B8A  6630                           BNE.B       0BBC
  1993.        | 0B8C  7201                           MOVEQ       #01,D1
  1994.        | 0B8E  B26D 0004                      CMP.W       0004(A5),D1
  1995.        | 0B92  6628                           BNE.B       0BBC
  1996. ; 900:                         {
  1997. ; 901:                             t->type = AREAMOVE;
  1998.        | 0B94  3741 0004                      MOVE.W      D1,0004(A3)
  1999. ; 902:                             u->type = AREADRAW;
  2000.        | 0B98  3340 0004                      MOVE.W      D0,0004(A1)
  2001.        | 0B9C  601E                           BRA.B       0BBC
  2002. ; 903:                         }
  2003. ; 904:                     }
  2004. ; 905:                 }
  2005. ; 906:             }
  2006. ; 907:             else
  2007. ; 908:             {
  2008. ; 909:                 if (inside(s, bordertype, bordervalue)) 
  2009.        | 0B9E  2007                           MOVE.L      D7,D0
  2010.        | 0BA0  2206                           MOVE.L      D6,D1
  2011.        | 0BA2  204B                           MOVEA.L     A3,A0
  2012.        | 0BA4  6100 0080                      BSR.W       0C26
  2013.        | 0BA8  4A40                           TST.W       D0
  2014.        | 0BAA  6710                           BEQ.B       0BBC
  2015. ; 910:                 {
  2016. ; 911:                     addintersect(vo, s, p, bordertype, bordervalue);
  2017.        | 0BAC  2F0D                           MOVE.L      A5,-(A7)
  2018.        | 0BAE  2007                           MOVE.L      D7,D0
  2019.        | 0BB0  2206                           MOVE.L      D6,D1
  2020.        | 0BB2  204A                           MOVEA.L     A2,A0
  2021.        | 0BB4  224B                           MOVEA.L     A3,A1
  2022.        | 0BB6  6100 00D6                      BSR.W       0C8E
  2023.        | 0BBA  584F                           ADDQ.W      #4,A7
  2024. ; 912:                 }
  2025. ; 913:             }
  2026. ; 914:             first = 0;
  2027.        | 0BBC  7A00                           MOVEQ       #00,D5
  2028. ; 915:             /*
  2029. ; 916:              *   Advance to next pair of vertices
  2030. ; 917:              */
  2031. ; 918:             s = p;
  2032.        | 0BBE  264D                           MOVEA.L     A5,A3
  2033.        | 0BC0  600E                           BRA.B       0BD0
  2034. ; 919:         }
  2035. ; 920:         else
  2036. ; 921:         if (vi->type) 
  2037.        | 0BC2  4A6D 0004                      TST.W       0004(A5)
  2038.        | 0BC6  6708                           BEQ.B       0BD0
  2039. ; 922:         {
  2040. ; 923:             /*
  2041. ; 924:              *   If this is something other than AREADRAW or MOVE, but not NULL,
  2042. ; 925:              *   copy it straight into the output.
  2043. ; 926:              */
  2044. ; 927:             addvtx(vo, vi);
  2045.        | 0BC8  204A                           MOVEA.L     A2,A0
  2046.        | 0BCA  224D                           MOVEA.L     A5,A1
  2047.        | 0BCC  6100 001E                      BSR.W       0BEC
  2048. ; 928:         }
  2049. ; 929:         vi = vi->next;
  2050.        | 0BD0  2A55                           MOVEA.L     (A5),A5
  2051. ; 930:     }
  2052.        | 0BD2  2F4B 0024                      MOVE.L      A3,0024(A7)
  2053.        | 0BD6  246F 001C                      MOVEA.L     001C(A7),A2
  2054.        | 0BDA  200D                           MOVE.L      A5,D0
  2055.        | 0BDC  6600 FF44                      BNE.W       0B22
  2056. ; 931:     
  2057. ; 932:     return(vo);
  2058.        | 0BE0  200A                           MOVE.L      A2,D0
  2059.        | 0BE2  4CDF 6CE0                      MOVEM.L     (A7)+,D5-D7/A2-A3/A5-A6
  2060.        | 0BE6  DEFC 000C                      ADDA.W      #000C,A7
  2061.        | 0BEA  4E75                           RTS
  2062. ; 933: }
  2063. ; 934: 
  2064. ; 935: /**
  2065. ; 936:  *
  2066. ; 937:  *   Add a vertex p to list vo.
  2067. ; 938:  *
  2068. ; 939: **/
  2069. ; 940: static struct vtx *addvtx(vo, p)
  2070. ; 941:     struct vtx *vo, *p;
  2071.        | 0BEC  514F                           SUBQ.W      #8,A7
  2072.        | 0BEE  48E7 0014                      MOVEM.L     A3/A5,-(A7)
  2073.        | 0BF2  2A49                           MOVEA.L     A1,A5
  2074. ; 942: {
  2075. ; 943:     struct vtx *t;
  2076. ; 944:     
  2077. ; 945:     if (t = AddVertex(vo)) 
  2078.        | 0BF4  2F48 0008                      MOVE.L      A0,0008(A7)
  2079.        | 0BF8  2F4E 000C                      MOVE.L      A6,000C(A7)
  2080.        | 0BFC  6100 FB0E                      BSR.W       070C
  2081.        | 0C00  2040                           MOVEA.L     D0,A0
  2082.        | 0C02  4A80                           TST.L       D0
  2083.        | 0C04  6716                           BEQ.B       0C1C
  2084. ; 946:     {
  2085. ; 947:         t->type = p->type;
  2086.        | 0C06  47ED 0004                      LEA         0004(A5),A3
  2087. ; 948:         t->x    = p->x;
  2088.        | 0C0A  43E8 0004                      LEA         0004(A0),A1
  2089. ; 949:         t->y    = p->y;
  2090.        | 0C0E  32DB                           MOVE.W      (A3)+,(A1)+
  2091. ; 950:         t->a    = p->a;
  2092.        | 0C10  32DB                           MOVE.W      (A3)+,(A1)+
  2093. ; 951:         t->b    = p->b;
  2094.        | 0C12  32DB                           MOVE.W      (A3)+,(A1)+
  2095.        | 0C14  32ED 000A                      MOVE.W      000A(A5),(A1)+
  2096.        | 0C18  32ED 000C                      MOVE.W      000C(A5),(A1)+
  2097. ; 952:     }
  2098. ; 953:     return(t);
  2099.        | 0C1C  2008                           MOVE.L      A0,D0
  2100.        | 0C1E  4CDF 2800                      MOVEM.L     (A7)+,A3/A5
  2101.        | 0C22  504F                           ADDQ.W      #8,A7
  2102.        | 0C24  4E75                           RTS
  2103. ; 954: }
  2104. ; 955: 
  2105. ; 956: /**
  2106. ; 957:  *
  2107. ; 958:  *   Determine whether a vertex is inside or outside the border
  2108. ; 959:  *
  2109. ; 960: **/
  2110. ; 961: static int inside(s, bordertype, bordervalue)
  2111. ; 962:     struct vtx *s;
  2112. ; 963:     int bordertype, bordervalue;
  2113.        | 0C26  594F                           SUBQ.W      #4,A7
  2114.        | 0C28  48E7 0300                      MOVEM.L     D6-D7,-(A7)
  2115.        | 0C2C  2C01                           MOVE.L      D1,D6
  2116.        | 0C2E  2E00                           MOVE.L      D0,D7
  2117.        | 0C30  2F4E 0008                      MOVE.L      A6,0008(A7)
  2118. ; 964: {
  2119. ; 965:     if (s) 
  2120.        | 0C34  2008                           MOVE.L      A0,D0
  2121.        | 0C36  674C                           BEQ.B       0C84
  2122. ; 966:     {
  2123. ; 967:         switch (bordertype) 
  2124.        | 0C38  3007                           MOVE.W      D7,D0
  2125.        | 0C3A  5340                           SUBQ.W      #1,D0
  2126.        | 0C3C  670E                           BEQ.B       0C4C
  2127.        | 0C3E  5340                           SUBQ.W      #1,D0
  2128.        | 0C40  6718                           BEQ.B       0C5A
  2129.        | 0C42  5340                           SUBQ.W      #1,D0
  2130.        | 0C44  6722                           BEQ.B       0C68
  2131.        | 0C46  5340                           SUBQ.W      #1,D0
  2132.        | 0C48  672C                           BEQ.B       0C76
  2133.        | 0C4A  6038                           BRA.B       0C84
  2134. ; 968:         {
  2135. ; 969:         case BD_LEFT :
  2136. ; 970:             return(s->x >= bordervalue);
  2137.        | 0C4C  3228 0006                      MOVE.W      0006(A0),D1
  2138.        | 0C50  B246                           CMP.W       D6,D1
  2139.        | 0C52  5CC0                           SGE         D0
  2140.        | 0C54  4400                           NEG.B       D0
  2141.        | 0C56  4880                           EXT.W       D0
  2142.        | 0C58  602C                           BRA.B       0C86
  2143. ; 971:             break;
  2144. ; 972:         case BD_RIGHT :
  2145. ; 973:             return(s->x < bordervalue);
  2146.        | 0C5A  3228 0006                      MOVE.W      0006(A0),D1
  2147.        | 0C5E  B246                           CMP.W       D6,D1
  2148.        | 0C60  5DC0                           SLT         D0
  2149.        | 0C62  4400                           NEG.B       D0
  2150.        | 0C64  4880                           EXT.W       D0
  2151.        | 0C66  601E                           BRA.B       0C86
  2152. ; 974:             break;
  2153. ; 975:         case BD_TOP :
  2154. ; 976:             return(s->y >= bordervalue);
  2155.        | 0C68  3228 0008                      MOVE.W      0008(A0),D1
  2156.        | 0C6C  B246                           CMP.W       D6,D1
  2157.        | 0C6E  5CC0                           SGE         D0
  2158.        | 0C70  4400                           NEG.B       D0
  2159.        | 0C72  4880                           EXT.W       D0
  2160.        | 0C74  6010                           BRA.B       0C86
  2161. ; 977:             break;
  2162. ; 978:         case BD_BOTTOM :
  2163. ; 979:             return(s->y < bordervalue);
  2164.        | 0C76  3228 0008                      MOVE.W      0008(A0),D1
  2165.        | 0C7A  B246                           CMP.W       D6,D1
  2166.        | 0C7C  5DC0                           SLT         D0
  2167.        | 0C7E  4400                           NEG.B       D0
  2168.        | 0C80  4880                           EXT.W       D0
  2169.        | 0C82  0C40 7000                      CMPI.W      #7000,D0
  2170. ; 980:             break;
  2171. ; 981:         }
  2172. ; 982:     }
  2173. ; 983:     return(0);
  2174.        | 0C86  4CDF 00C0                      MOVEM.L     (A7)+,D6-D7
  2175.        | 0C8A  584F                           ADDQ.W      #4,A7
  2176.        | 0C8C  4E75                           RTS
  2177. ; 984: }
  2178. ; 985: 
  2179. ; 986: /**
  2180. ; 987:  *
  2181. ; 988:  *   Add the intersect of vectors s and p with the border to list vo
  2182. ; 989:  *   Routine assumes that one vector is inside, the other outside (no
  2183. ; 990:  *   particular order).
  2184. ; 991:  *
  2185. ; 992: **/
  2186. ; 993: static struct vtx *addintersect(vo, s, p, bordertype, bordervalue)
  2187. ; 994:     struct vtx *vo, *s, *p;
  2188. ; 995:     int bordertype, bordervalue;
  2189.        | 0C8E  514F                           SUBQ.W      #8,A7
  2190.        | 0C90  48E7 3B14                      MOVEM.L     D2-D4/D6-D7/A3/A5,-(A7)
  2191.        | 0C94  2C01                           MOVE.L      D1,D6
  2192.        | 0C96  2E00                           MOVE.L      D0,D7
  2193.        | 0C98  266F 0028                      MOVEA.L     0028(A7),A3
  2194.        | 0C9C  2A49                           MOVEA.L     A1,A5
  2195. ; 996: {
  2196. ; 997:     struct vtx *v;
  2197. ; 998:     
  2198. ; 999:     v = AddVertex(vo);
  2199.        | 0C9E  2F48 001C                      MOVE.L      A0,001C(A7)
  2200.        | 0CA2  2F4E 0020                      MOVE.L      A6,0020(A7)
  2201.        | 0CA6  6100 FA64                      BSR.W       070C
  2202.        | 0CAA  2040                           MOVEA.L     D0,A0
  2203. ;1000:     
  2204. ;1001:     if (s && p && v) 
  2205.        | 0CAC  200D                           MOVE.L      A5,D0
  2206.        | 0CAE  6700 0092                      BEQ.W       0D42
  2207.        | 0CB2  200B                           MOVE.L      A3,D0
  2208.        | 0CB4  6700 008C                      BEQ.W       0D42
  2209.        | 0CB8  2008                           MOVE.L      A0,D0
  2210.        | 0CBA  6700 0086                      BEQ.W       0D42
  2211. ;1002:     {
  2212. ;1003:         v->type = p->type;
  2213.        | 0CBE  316B 0004 0004                 MOVE.W      0004(A3),0004(A0)
  2214. ;1004:         
  2215. ;1005:         switch (bordertype) 
  2216.        | 0CC4  3007                           MOVE.W      D7,D0
  2217.        | 0CC6  5340                           SUBQ.W      #1,D0
  2218.        | 0CC8  670E                           BEQ.B       0CD8
  2219.        | 0CCA  5340                           SUBQ.W      #1,D0
  2220.        | 0CCC  670A                           BEQ.B       0CD8
  2221.        | 0CCE  5340                           SUBQ.W      #1,D0
  2222.        | 0CD0  673C                           BEQ.B       0D0E
  2223.        | 0CD2  5340                           SUBQ.W      #1,D0
  2224.        | 0CD4  6738                           BEQ.B       0D0E
  2225.        | 0CD6  606A                           BRA.B       0D42
  2226. ;1006:         {
  2227. ;1007:         case BD_LEFT :
  2228. ;1008:         case BD_RIGHT :
  2229. ;1009:             v->x = bordervalue;
  2230.        | 0CD8  3146 0006                      MOVE.W      D6,0006(A0)
  2231. ;1010:             v->y = s->y + (int) (((long) (bordervalue - s->x) * (p->y - s->y)) /
  2232.        | 0CDC  3006                           MOVE.W      D6,D0
  2233.        | 0CDE  322D 0006                      MOVE.W      0006(A5),D1
  2234.        | 0CE2  9041                           SUB.W       D1,D0
  2235.        | 0CE4  342D 0008                      MOVE.W      0008(A5),D2
  2236.        | 0CE8  362B 0008                      MOVE.W      0008(A3),D3
  2237.        | 0CEC  9642                           SUB.W       D2,D3
  2238. ;1011:             (p->x - s->x));
  2239.        | 0CEE  382B 0006                      MOVE.W      0006(A3),D4
  2240.        | 0CF2  9841                           SUB.W       D1,D4
  2241.        | 0CF4  48C4                           EXT.L       D4
  2242.        | 0CF6  48C3                           EXT.L       D3
  2243.        | 0CF8  48C0                           EXT.L       D0
  2244.        | 0CFA  2203                           MOVE.L      D3,D1
  2245.        | 0CFC  6100  0000-XX.1                BSR.W       __CXM33
  2246.        | 0D00  2204                           MOVE.L      D4,D1
  2247.        | 0D02  6100  0000-XX.1                BSR.W       __CXD33
  2248.        | 0D06  D440                           ADD.W       D0,D2
  2249.        | 0D08  3142 0008                      MOVE.W      D2,0008(A0)
  2250. ;1012:             break;
  2251.        | 0D0C  6034                           BRA.B       0D42
  2252. ;1013:         case BD_TOP :
  2253. ;1014:         case BD_BOTTOM :
  2254. ;1015:             v->y = bordervalue;
  2255.        | 0D0E  3146 0008                      MOVE.W      D6,0008(A0)
  2256. ;1016:             v->x = s->x + (int) (((long) (bordervalue - s->y) * (p->x - s->x)) /
  2257.        | 0D12  3006                           MOVE.W      D6,D0
  2258.        | 0D14  322D 0008                      MOVE.W      0008(A5),D1
  2259.        | 0D18  9041                           SUB.W       D1,D0
  2260.        | 0D1A  342D 0006                      MOVE.W      0006(A5),D2
  2261.        | 0D1E  362B 0006                      MOVE.W      0006(A3),D3
  2262.        | 0D22  9642                           SUB.W       D2,D3
  2263. ;1017:             (p->y - s->y));
  2264.        | 0D24  382B 0008                      MOVE.W      0008(A3),D4
  2265.        | 0D28  9841                           SUB.W       D1,D4
  2266.        | 0D2A  48C4                           EXT.L       D4
  2267.        | 0D2C  48C3                           EXT.L       D3
  2268.        | 0D2E  48C0                           EXT.L       D0
  2269.        | 0D30  2203                           MOVE.L      D3,D1
  2270.        | 0D32  6100  0000-XX.1                BSR.W       __CXM33
  2271.        | 0D36  2204                           MOVE.L      D4,D1
  2272.        | 0D38  6100  0000-XX.1                BSR.W       __CXD33
  2273.        | 0D3C  D440                           ADD.W       D0,D2
  2274.        | 0D3E  3142 0006                      MOVE.W      D2,0006(A0)
  2275. ;1018:             break;
  2276. ;1019:         }
  2277.        | 0D42  2008                           MOVE.L      A0,D0
  2278.        | 0D44  4CDF 28DC                      MOVEM.L     (A7)+,D2-D4/D6-D7/A3/A5
  2279.        | 0D48  504F                           ADDQ.W      #8,A7
  2280.        | 0D4A  4E75                           RTS
  2281.  
  2282. SECTION 01 "__MERGED" 000001A4 BYTES
  2283. 0000 04 04 0A 0A 11 11 A0 A0 40 40 A0 A0 11 11 0A 0A ......  @@  ....
  2284. 0010 04 04 08 08 10 10 20 20 40 40 20 20 10 10 08 08 ......  @@  ....
  2285. 0020 10 10 00 00 00 00 00 00 01 01 82 82 44 44 28 28 ............DD((
  2286. 0030 00 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 ................
  2287. 0040 10 10 10 10 10 10 10 10 10 10 FF FF 10 10 10 10 ................
  2288. OFFSETS 0050 THROUGH 005F CONTAIN ZERO
  2289. 0060 04 04 04 04 04 04 FF FF 80 80 80 80 80 80 FF FF ................
  2290. OFFSETS 0070 THROUGH 007F CONTAIN ZERO
  2291. 0080 10 10 80 80 40 40 20 20 10 10 08 08 04 04 02 02 ....@@  ........
  2292. 0090 01 01 00 00 55 55 00 00 AA AA 11 11 44 44 88 88 ....UU..**..DD..
  2293. 00A0 44 44 22 22 00 00 44 44 00 00 00 00 00 00 00 00 DD""..DD........
  2294. 00B0 88 88 11 11 11 11 11 11 00 00 33 33 33 33 33 33 ..........333333
  2295. 00C0 33 33 33 33 33 33 33 33 33 33 0F 0F 0F 0F 0F 0F 3333333333......
  2296. 00D0 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 FF 00 FF 00 FF ................
  2297. 00E0 00 FF 00 FF 00 FF 00 FF 00 FF 81 FC C3 13 7D 22 ...........|C.}"
  2298. 00F0 20 F2 E1 9F 1F 84 08 C6 7E 62 00 03  ra....F~b..
  2299. 00FC 00000000-01 01.00000000
  2300. 0100 00 03 ..
  2301. 0102 00000010-01 01.00000010
  2302. 0106 00 03 ..
  2303. 0108 00000020-01 01.00000020
  2304. 010C 00 03 ..
  2305. 010E 00000030-01 01.00000030
  2306. 0112 00 03 ..
  2307. 0114 00000040-01 01.00000040
  2308. 0118 FF FD .}
  2309. 011A 00000050-01 01.00000050
  2310. OFFSETS 011E THROUGH 011F CONTAIN ZERO
  2311. 0120 00000080-01 01.00000080
  2312. 0124 00 03 ..
  2313. 0126 00000082-01 01.00000082
  2314. 012A 00 02 ..
  2315. 012C 00000092-01 01.00000092
  2316. 0130 00 01 ..
  2317. 0132 0000009A-01 01.0000009A
  2318. 0136 00 02 ..
  2319. 0138 0000009E-01 01.0000009E
  2320. 013C 00 01 ..
  2321. 013E 000000A6-01 01.000000A6
  2322. 0142 00 02 ..
  2323. 0144 000000AA-01 01.000000AA
  2324. 0148 00 02 ..
  2325. 014A 000000B2-01 01.000000B2
  2326. 014E FF FD .}
  2327. 0150 000000BA-01 01.000000BA
  2328. 0154 00 03 ..
  2329. 0156 000000EA-01 01.000000EA
  2330. 015A 00 00 00 00 AA AA ....**
  2331. 0160 00 00 55 55 00 00 FF FF 00 00 00 00 AA AA AA AA ..UU........****
  2332. 0170 AA AA 55 55 AA AA FF FF AA AA 00 00 55 55 AA AA **UU**..**..UU**
  2333. 0180 55 55 55 55 55 55 FF FF 55 55 00 00 FF FF AA AA UUUUUU..UU....**
  2334. 0190 FF FF 55 55 FF FF FF FF FF FF 00 00 00 03 00 01 ..UU............
  2335. 01A0 00 02 00 00 ....
  2336.  
  2337. SECTION 02 "__MERGED" 00000008 BYTES
  2338.