home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 13
/
AACD13.ISO
/
AACD
/
Resources
/
System
/
BoingBag1
/
Contributions
/
Workbench
/
RexxArpLib3p6
/
src
/
areapolydraw.a
< prev
next >
Wrap
Text File
|
1998-06-19
|
110KB
|
2,338 lines
SAS AMIGA 680x0OBJ Module Disassembler 6.57
Copyright © 1995 SAS Institute, Inc.
Amiga Object File Loader V1.00
68000 Instruction Set
EXTERNAL DEFINITIONS
@AllocTmpRas 00F8-00 @FreeTmpRas 01CA-00 @AreaPolyDraw 0202-00
@AddVertex 070C-00 @KillVertex 074A-00 _ptdata 0000-01
SECTION 00 "text" 00000D4C BYTES
; 1: /** areapolydraw.c
; 2: *
; 3: * This file contains the functions Alloc/FreeAreaInfo() and Alloc/FreeTmpRas()
; 4: * to initialize and free TmpRas and AreaInfo structures, as well as the
; 5: * function AreaPolyDraw(), and AddVertex() and KillVertex().
; 6: *
; 7: * W.G.J. Langeveld, 14 July 1988
; 8: *
; 9: **/
; 10: #include <functions.h>
; 11: #include "ralprotos.h"
; 12: #include <exec/types.h>
; 13: #include <exec/exec.h>
; 14: #include <intuition/intuition.h>
; 15: #include <graphics/gfxmacros.h>
; 16: #include <devices/timer.h>
; 17: #include <stdlib.h>
; 18: #include <string.h>
; 19: #include <ctype.h>
; 20:
; 21: #include "areapolydraw.h"
; 22: #include "areapatterns.h"
; 23:
; 24: static int AllocAreaInfo(struct RastPort *, int);
; 25: static int FreeAreaInfo(struct RastPort *);
; 26: static int FindAreaSize(struct vtx *, int *, int *, int *, int *);
; 27: static int setdither(unsigned int *, int);
; 28: static int bm(int *, int);
; 29: static struct vtx *AreaPolyClip(struct vtx *, int, int, int, int);
; 30: static struct vtx *SHClip(struct vtx *, int, int);
; 31: static struct vtx *addvtx(struct vtx *, struct vtx *);
; 32: static int inside(struct vtx *, int, int);
; 33: static struct vtx *addintersect(struct vtx *, struct vtx *,
; 34: struct vtx *, int, int);
; 35:
; 36: extern struct IntuitionBase *IntuitionBase;
; 37: extern struct GfxBase *GfxBase;
; 38:
; 39: #define AISIZE ((long) sizeof(struct AreaInfo))
; 40: #define TRSIZE ((long) sizeof(struct TmpRas))
; 41:
; 42: #define min(a, b) ( ((a) > (b)) ? (b) : (a) )
; 43:
; 44: static int bm(), setdither(), FindAreaSize();
; 45: static struct vtx *AreaPolyClip();
; 46:
; 47: #define BD_LEFT 1
; 48: #define BD_RIGHT 2
; 49: #define BD_TOP 3
; 50: #define BD_BOTTOM 4
; 51:
; 52: /**
; 53: *
; 54: * NAME
; 55: *
; 56: * AllocAreaInfo()
; 57: * ===============
; 58: *
; 59: * SYNOPSIS
; 60: *
; 61: * AllocAreaInfo(rp, nverts)
; 62: * FreeAreaInfo(rp)
; 63: *
; 64: * FUNCTION
; 65: *
; 66: * Function to allocate and initialize and free an AreaInfo structure
; 67: * for Area functions.
; 68: *
; 69: * INPUTS
; 70: *
; 71: * struct RastPort *rp Rastport to be initialized
; 72: * int nverts Number of vertices allowed
; 73: *
; 74: * RESULT
; 75: *
; 76: * The fields in Rastport rp are initialized.
; 77: *
; 78: * ADDITIONAL CONSIDERATIONS
; 79: *
; 80: * BUGS
; 81: *
; 82: * None known.
; 83: *
; 84: * AUTHOR
; 85: *
; 86: * W.G.J. Langeveld, 8 November1988
; 87: *
; 88: **/
; 89: static int AllocAreaInfo(rp, nverts)
; 90: struct RastPort *rp;
; 91: int nverts;
| 0000 594F SUBQ.W #4,A7
| 0002 48E7 0136 MOVEM.L D7/A2-A3/A5-A6,-(A7)
| 0006 2E00 MOVE.L D0,D7
| 0008 2A48 MOVEA.L A0,A5
; 92: {
; 93: struct AreaInfo *ai = NULL;
; 94: UBYTE *aidata = NULL;
| 000A 97CB SUBA.L A3,A3
; 95:
; 96: if (ai = rp->AreaInfo)
| 000C 206D 0010 MOVEA.L 0010(A5),A0
| 0010 2F4E 0014 MOVE.L A6,0014(A7)
| 0014 2008 MOVE.L A0,D0
| 0016 670E BEQ.B 0026
; 97: {
; 98: if (ai->MaxCount >= nverts)
| 0018 3228 0012 MOVE.W 0012(A0),D1
| 001C B247 CMP.W D7,D1
| 001E 6D06 BLT.B 0026
; 99: return(1);
| 0020 7001 MOVEQ #01,D0
| 0022 6000 0080 BRA.W 00A4
; 100: }
; 101:
; 102: ai = (struct AreaInfo *) AllocMem(AISIZE, MEMF_CLEAR);
| 0026 7018 MOVEQ #18,D0
| 0028 7201 MOVEQ #01,D1
| 002A 4841 SWAP D1
| 002C 2C78 0004 MOVEA.L 0004,A6
| 0030 4EAE FF3A JSR FF3A(A6)
| 0034 2440 MOVEA.L D0,A2
; 103: if (ai == NULL)
| 0036 4A80 TST.L D0
| 0038 2C6F 0014 MOVEA.L 0014(A7),A6
| 003C 6738 BEQ.B 0076
; 104: goto cleanup;
; 105:
; 106: aidata = (UBYTE *) AllocMem((long) nverts * 5L, MEMF_CLEAR);
| 003E 3007 MOVE.W D7,D0
| 0040 48C0 EXT.L D0
| 0042 2200 MOVE.L D0,D1
| 0044 E581 ASL.L #2,D1
| 0046 D081 ADD.L D1,D0
| 0048 7201 MOVEQ #01,D1
| 004A 4841 SWAP D1
| 004C 2C78 0004 MOVEA.L 0004,A6
| 0050 4EAE FF3A JSR FF3A(A6)
| 0054 2640 MOVEA.L D0,A3
; 107: if (aidata == NULL)
| 0056 4A80 TST.L D0
| 0058 2C6F 0014 MOVEA.L 0014(A7),A6
| 005C 6718 BEQ.B 0076
; 108: goto cleanup;
; 109:
; 110: InitArea(ai, (WORD *) aidata, (long) nverts);
| 005E 3007 MOVE.W D7,D0
| 0060 48C0 EXT.L D0
| 0062 204A MOVEA.L A2,A0
| 0064 224B MOVEA.L A3,A1
| 0066 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 006A 4EAE FEE6 JSR FEE6(A6)
; 111:
; 112: rp->AreaInfo = ai;
| 006E 2B4A 0010 MOVE.L A2,0010(A5)
; 113:
; 114: return(2);
| 0072 7002 MOVEQ #02,D0
| 0074 602E BRA.B 00A4
; 115:
; 116: cleanup :
; 117: if (aidata)
| 0076 200B MOVE.L A3,D0
| 0078 6714 BEQ.B 008E
; 118: FreeMem(aidata, (long) nverts * 5L);
| 007A 3007 MOVE.W D7,D0
| 007C 48C0 EXT.L D0
| 007E 2200 MOVE.L D0,D1
| 0080 E581 ASL.L #2,D1
| 0082 D081 ADD.L D1,D0
| 0084 224B MOVEA.L A3,A1
| 0086 2C78 0004 MOVEA.L 0004,A6
| 008A 4EAE FF2E JSR FF2E(A6)
| 008E 2C6F 0014 MOVEA.L 0014(A7),A6
; 119: if (ai)
| 0092 200A MOVE.L A2,D0
| 0094 670C BEQ.B 00A2
; 120: FreeMem(ai, AISIZE);
| 0096 224A MOVEA.L A2,A1
| 0098 7018 MOVEQ #18,D0
| 009A 2C78 0004 MOVEA.L 0004,A6
| 009E 4EAE FF2E JSR FF2E(A6)
; 121:
; 122: return(0);
| 00A2 7000 MOVEQ #00,D0
| 00A4 4CDF 6C80 MOVEM.L (A7)+,D7/A2-A3/A5-A6
| 00A8 584F ADDQ.W #4,A7
| 00AA 4E75 RTS
; 123: }
; 124:
; 125: static int FreeAreaInfo(rp)
; 126: struct RastPort *rp;
| 00AC 594F SUBQ.W #4,A7
| 00AE 48E7 2016 MOVEM.L D2/A3/A5-A6,-(A7)
| 00B2 2A48 MOVEA.L A0,A5
; 127: {
; 128: struct AreaInfo *ai;
; 129: UBYTE *aidata;
; 130:
; 131: if (ai = rp->AreaInfo)
| 00B4 266D 0010 MOVEA.L 0010(A5),A3
| 00B8 2F4E 0010 MOVE.L A6,0010(A7)
| 00BC 200B MOVE.L A3,D0
| 00BE 672E BEQ.B 00EE
; 132: {
; 133: if (aidata = (UBYTE *) ai->VctrTbl)
| 00C0 2053 MOVEA.L (A3),A0
| 00C2 2008 MOVE.L A0,D0
| 00C4 6718 BEQ.B 00DE
; 134: {
; 135: FreeMem(aidata, (long) ai->MaxCount * 5L);
| 00C6 322B 0012 MOVE.W 0012(A3),D1
| 00CA 48C1 EXT.L D1
| 00CC 2401 MOVE.L D1,D2
| 00CE E582 ASL.L #2,D2
| 00D0 D481 ADD.L D1,D2
| 00D2 2240 MOVEA.L D0,A1
| 00D4 2002 MOVE.L D2,D0
| 00D6 2C78 0004 MOVEA.L 0004,A6
| 00DA 4EAE FF2E JSR FF2E(A6)
; 136: }
; 137: FreeMem(ai, AISIZE);
| 00DE 224B MOVEA.L A3,A1
| 00E0 7018 MOVEQ #18,D0
| 00E2 2C78 0004 MOVEA.L 0004,A6
| 00E6 4EAE FF2E JSR FF2E(A6)
; 138: rp->AreaInfo = NULL;
| 00EA 42AD 0010 CLR.L 0010(A5)
; 139: }
; 140:
; 141: return(0);
| 00EE 7000 MOVEQ #00,D0
| 00F0 4CDF 6804 MOVEM.L (A7)+,D2/A3/A5-A6
| 00F4 584F ADDQ.W #4,A7
| 00F6 4E75 RTS
; 142: }
; 143:
; 144:
; 145: /**
; 146: *
; 147: * NAME
; 148: *
; 149: * AllocTmpRas()
; 150: * =============
; 151: *
; 152: * SYNOPSIS
; 153: *
; 154: * AllocTmpRas(rp, width, height)
; 155: *
; 156: * FUNCTION
; 157: *
; 158: * Function to allocate and initialize and free a TmpRas structure
; 159: * for Area functions.
; 160: *
; 161: * INPUTS
; 162: *
; 163: * struct RastPort *rp Rastport to be initialized
; 164: * int width, height Size of TmpRas needed
; 165: *
; 166: * RESULT
; 167: *
; 168: * The fields in Rastport rp are initialized.
; 169: *
; 170: * ADDITIONAL CONSIDERATIONS
; 171: *
; 172: * BUGS
; 173: *
; 174: * None known.
; 175: *
; 176: * AUTHOR
; 177: *
; 178: * W.G.J. Langeveld, 24 July 1988
; 179: *
; 180: **/
; 181: long AllocTmpRas(rp, width, height)
; 182: struct RastPort *rp;
; 183: int width, height;
| 00F8 594F SUBQ.W #4,A7
| 00FA 48E7 0336 MOVEM.L D6-D7/A2-A3/A5-A6,-(A7)
| 00FE 2C01 MOVE.L D1,D6
| 0100 2E00 MOVE.L D0,D7
| 0102 2A48 MOVEA.L A0,A5
; 184: {
; 185: struct TmpRas *tr = NULL;
; 186: UBYTE *trdata = NULL;
| 0104 97CB SUBA.L A3,A3
; 187:
; 188: if (tr = rp->TmpRas)
| 0106 206D 000C MOVEA.L 000C(A5),A0
| 010A 2F4E 0018 MOVE.L A6,0018(A7)
| 010E 2008 MOVE.L A0,D0
| 0110 6726 BEQ.B 0138
; 189: {
; 190: if (tr->Size >= (long) RASSIZE((long) width, (long) height))
| 0112 3207 MOVE.W D7,D1
| 0114 48C1 EXT.L D1
| 0116 700F MOVEQ #0F,D0
| 0118 D280 ADD.L D0,D1
| 011A E689 LSR.L #3,D1
| 011C 0281 0000 FFFE ANDI.L #0000FFFE,D1
| 0122 3006 MOVE.W D6,D0
| 0124 48C0 EXT.L D0
| 0126 6100 0000-XX.1 BSR.W __CXM22
| 012A 2228 0004 MOVE.L 0004(A0),D1
| 012E B280 CMP.L D0,D1
| 0130 6D06 BLT.B 0138
; 191: return(1);
| 0132 7001 MOVEQ #01,D0
| 0134 6000 008C BRA.W 01C2
; 192: }
; 193:
; 194: tr = (struct TmpRas *) AllocMem (TRSIZE, MEMF_CLEAR);
| 0138 7008 MOVEQ #08,D0
| 013A 7201 MOVEQ #01,D1
| 013C 4841 SWAP D1
| 013E 2C78 0004 MOVEA.L 0004,A6
| 0142 4EAE FF3A JSR FF3A(A6)
| 0146 2440 MOVEA.L D0,A2
; 195: if (tr == NULL)
| 0148 4A80 TST.L D0
| 014A 2C6F 0018 MOVEA.L 0018(A7),A6
| 014E 6746 BEQ.B 0196
; 196: goto cleanup;
; 197:
; 198: trdata = (UBYTE *) AllocRaster((long) width, (long) height);
| 0150 3007 MOVE.W D7,D0
| 0152 48C0 EXT.L D0
| 0154 3206 MOVE.W D6,D1
| 0156 48C1 EXT.L D1
| 0158 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 015C 4EAE FE14 JSR FE14(A6)
| 0160 2640 MOVEA.L D0,A3
; 199: if (trdata == NULL)
| 0162 4A80 TST.L D0
| 0164 2C6F 0018 MOVEA.L 0018(A7),A6
| 0168 672C BEQ.B 0196
; 200: goto cleanup;
; 201:
; 202: InitTmpRas(tr, trdata, (long) RASSIZE((long) width, (long) height) );
| 016A 3007 MOVE.W D7,D0
| 016C 48C0 EXT.L D0
| 016E 720F MOVEQ #0F,D1
| 0170 D081 ADD.L D1,D0
| 0172 E688 LSR.L #3,D0
| 0174 0280 0000 FFFE ANDI.L #0000FFFE,D0
| 017A 3206 MOVE.W D6,D1
| 017C 48C1 EXT.L D1
| 017E 6100 0000-XX.1 BSR.W __CXM22
| 0182 204A MOVEA.L A2,A0
| 0184 224B MOVEA.L A3,A1
| 0186 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 018A 4EAE FE2C JSR FE2C(A6)
; 203:
; 204: rp->TmpRas = tr;
| 018E 2B4A 000C MOVE.L A2,000C(A5)
; 205:
; 206: return(2);
| 0192 7002 MOVEQ #02,D0
| 0194 602C BRA.B 01C2
; 207:
; 208: cleanup :
; 209: if (trdata)
| 0196 200B MOVE.L A3,D0
| 0198 6712 BEQ.B 01AC
; 210: FreeRaster(trdata, (long) width, (long) height);
| 019A 3007 MOVE.W D7,D0
| 019C 48C0 EXT.L D0
| 019E 3206 MOVE.W D6,D1
| 01A0 48C1 EXT.L D1
| 01A2 204B MOVEA.L A3,A0
| 01A4 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 01A8 4EAE FE0E JSR FE0E(A6)
| 01AC 2C6F 0018 MOVEA.L 0018(A7),A6
; 211: if (tr)
| 01B0 200A MOVE.L A2,D0
| 01B2 670C BEQ.B 01C0
; 212: FreeMem(tr, TRSIZE);
| 01B4 224A MOVEA.L A2,A1
| 01B6 7008 MOVEQ #08,D0
| 01B8 2C78 0004 MOVEA.L 0004,A6
| 01BC 4EAE FF2E JSR FF2E(A6)
; 213:
; 214: return(0);
| 01C0 7000 MOVEQ #00,D0
| 01C2 4CDF 6CC0 MOVEM.L (A7)+,D6-D7/A2-A3/A5-A6
| 01C6 584F ADDQ.W #4,A7
| 01C8 4E75 RTS
; 215: }
; 216:
; 217: long FreeTmpRas(rp)
; 218: struct RastPort *rp;
| 01CA 594F SUBQ.W #4,A7
| 01CC 48E7 0016 MOVEM.L A3/A5-A6,-(A7)
| 01D0 2A48 MOVEA.L A0,A5
; 219: {
; 220: struct TmpRas *tr;
; 221:
; 222: if (tr = rp->TmpRas)
| 01D2 266D 000C MOVEA.L 000C(A5),A3
| 01D6 2F4E 000C MOVE.L A6,000C(A7)
| 01DA 200B MOVE.L A3,D0
| 01DC 671A BEQ.B 01F8
; 223: {
; 224: FreeMem(tr->RasPtr, tr->Size);
| 01DE 2253 MOVEA.L (A3),A1
| 01E0 202B 0004 MOVE.L 0004(A3),D0
| 01E4 2C78 0004 MOVEA.L 0004,A6
| 01E8 4EAE FF2E JSR FF2E(A6)
; 225: FreeMem(tr, TRSIZE);
| 01EC 224B MOVEA.L A3,A1
| 01EE 7008 MOVEQ #08,D0
| 01F0 4EAE FF2E JSR FF2E(A6)
; 226: rp->TmpRas = NULL;
| 01F4 42AD 000C CLR.L 000C(A5)
; 227: }
; 228:
; 229: return(0);
| 01F8 7000 MOVEQ #00,D0
| 01FA 4CDF 6800 MOVEM.L (A7)+,A3/A5-A6
| 01FE 584F ADDQ.W #4,A7
| 0200 4E75 RTS
; 230: }
; 231:
; 232: /**
; 233: *
; 234: * NAME
; 235: *
; 236: * AreaPolyDraw()
; 237: * ==============
; 238: *
; 239: * SYNOPSIS
; 240: *
; 241: * AreaPolyDraw(rp, vertex, ppen, xoff, yoff)
; 242: *
; 243: * FUNCTION
; 244: *
; 245: * Draws a filled n-vertex polygon according to the outline in linked
; 246: * list of vertices. Performs pre-clipping, allows various textures and
; 247: * 4-pixel dithering patterns.
; 248: *
; 249: * INPUTS
; 250: *
; 251: * w Pointer to a window to receive the imagery.
; 252: * vertex Ptr to linked list of vtx structures
; 253: * ppen Pattern pen. 0->15: use APen 0 through 15.
; 254: * If texture flag set, use one of 16 textures.
; 255: * If dither flag is set use one of 125 dithers.
; 256: * If outline flag is set, use outline.
; 257: * xoff X offset for polygon
; 258: * yoff Y offset for polygon
; 259: *
; 260: * RESULT
; 261: *
; 262: * Zero on failure, non-zero otherwise.
; 263: *
; 264: * ADDITIONAL CONSIDERATIONS
; 265: *
; 266: * This routine allocates its own AreaInfo and TmpRas structures, and
; 267: * frees them as well. If the RastPort already had these, they are saved
; 268: * and restored at the end.
; 269: * The routine preclips all AreaMoves and AreaDraws so they won't
; 270: * require a TmpRas larger than a single full bitplane the size of
; 271: * the window. Window borders are taken into account.
; 272: *
; 273: * BUGS
; 274: *
; 275: * None known.
; 276: *
; 277: * AUTHOR
; 278: *
; 279: * W.G.J. Langeveld, 24 July 1988
; 280: * revised: November 1989.
; 281: *
; 282: **/
; 283: AreaPolyDraw(w, v, ppen, xoff, yoff)
; 284: struct Window *w;
; 285: struct vtx *v;
; 286: int ppen, xoff, yoff;
| 0202 9EFC 0114 SUBA.W #0114,A7
| 0206 48E7 3F36 MOVEM.L D2-D7/A2-A3/A5-A6,-(A7)
| 020A 3C2F 0140 MOVE.W 0140(A7),D6
| 020E 2E01 MOVE.L D1,D7
| 0210 2A49 MOVEA.L A1,A5
; 287: {
; 288: register int n;
; 289: register struct vtx *tmp;
; 290: register int pow, clipped = 0;
| 0212 426F 0120 CLR.W 0120(A7)
; 291: int resai = 0, restr = 0, res = 0, notmoved, type;
| 0216 426F 0134 CLR.W 0134(A7)
; 292: struct RastPort *rp;
; 293: struct RastPort tmprp;
; 294: int minx, maxx, miny, maxy;
; 295: int clipxmin, clipymin, clipxmax, clipymax;
; 296: unsigned int colpat[64];
; 297:
; 298: if (w == NULL)
| 021A 47EF 0032 LEA 0032(A7),A3
| 021E 36C0 MOVE.W D0,(A3)+
| 0220 26C8 MOVE.L A0,(A3)+
| 0222 26CE MOVE.L A6,(A3)+
| 0224 2208 MOVE.L A0,D1
| 0226 6606 BNE.B 022E
; 299: return(0);
| 0228 7000 MOVEQ #00,D0
| 022A 6000 0404 BRA.W 0630
; 300: rp = w->RPort;
| 022E 2468 0032 MOVEA.L 0032(A0),A2
; 301:
; 302: if (v == NULL)
| 0232 220D MOVE.L A5,D1
| 0234 2C6F 0038 MOVEA.L 0038(A7),A6
| 0238 6606 BNE.B 0240
; 303: return(0);
| 023A 7000 MOVEQ #00,D0
| 023C 6000 03F2 BRA.W 0630
; 304: if (ppen & APD_NOFILL)
| 0240 0800 000A BTST #000A,D0
| 0244 2C6F 0038 MOVEA.L 0038(A7),A6
| 0248 6706 BEQ.B 0250
; 305: return(0);
| 024A 7000 MOVEQ #00,D0
| 024C 6000 03E2 BRA.W 0630
; 306: /*
; 307: * See if we need clipping
; 308: */
; 309: clipxmin = w->BorderLeft;
| 0250 47E8 0036 LEA 0036(A0),A3
| 0254 1A1B MOVE.B (A3)+,D5
; 310: clipymin = w->BorderTop;
| 0256 4885 EXT.W D5
| 0258 181B MOVE.B (A3)+,D4
; 311: clipxmax = w->Width - w->BorderRight - 1;
| 025A 4884 EXT.W D4
| 025C 101B MOVE.B (A3)+,D0
| 025E 4880 EXT.W D0
| 0260 3228 0008 MOVE.W 0008(A0),D1
| 0264 9240 SUB.W D0,D1
; 312: clipymax = w->Height - w->BorderBottom - 1;
| 0266 5341 SUBQ.W #1,D1
| 0268 1028 0039 MOVE.B 0039(A0),D0
| 026C 4880 EXT.W D0
| 026E 3428 000A MOVE.W 000A(A0),D2
| 0272 9440 SUB.W D0,D2
; 313:
; 314: n = FindAreaSize(v, &minx, &miny, &maxx, &maxy);
| 0274 5342 SUBQ.W #1,D2
| 0276 486F 0130 PEA 0130(A7)
| 027A 486F 0130 PEA 0130(A7)
| 027E 486F 0130 PEA 0130(A7)
| 0282 3F41 0036 MOVE.W D1,0036(A7)
| 0286 3F42 0038 MOVE.W D2,0038(A7)
| 028A 204D MOVEA.L A5,A0
| 028C 43EF 0130 LEA 0130(A7),A1
| 0290 2C6F 0044 MOVEA.L 0044(A7),A6
| 0294 6100 03A4 BSR.W 063A
| 0298 4FEF 000C LEA 000C(A7),A7
; 315: /*
; 316: * If so, clip the vertexlist, compute new size and set flag.
; 317: */
; 318: if ((minx < clipxmin) || (miny < clipymin) ||
| 029C 3F40 0138 MOVE.W D0,0138(A7)
| 02A0 302F 0124 MOVE.W 0124(A7),D0
| 02A4 B045 CMP.W D5,D0
| 02A6 6D1C BLT.B 02C4
| 02A8 302F 0128 MOVE.W 0128(A7),D0
| 02AC B044 CMP.W D4,D0
| 02AE 6D14 BLT.B 02C4
; 319: (maxx > clipxmax) || (maxy > clipymax) )
| 02B0 302F 002A MOVE.W 002A(A7),D0
| 02B4 322F 012C MOVE.W 012C(A7),D1
| 02B8 B240 CMP.W D0,D1
| 02BA 6E08 BGT.B 02C4
| 02BC 322F 0130 MOVE.W 0130(A7),D1
| 02C0 B242 CMP.W D2,D1
| 02C2 6F36 BLE.B 02FA
; 320: {
; 321: v = AreaPolyClip(v, clipxmin, clipymin, clipxmax, clipymax);
| 02C4 3F02 MOVE.W D2,-(A7)
| 02C6 3F2F 002C MOVE.W 002C(A7),-(A7)
| 02CA 2005 MOVE.L D5,D0
| 02CC 2204 MOVE.L D4,D1
| 02CE 204D MOVEA.L A5,A0
| 02D0 6100 07A6 BSR.W 0A78
| 02D4 2A40 MOVEA.L D0,A5
; 322: n = FindAreaSize(v, &minx, &miny, &maxx, &maxy);
| 02D6 486F 0134 PEA 0134(A7)
| 02DA 486F 0134 PEA 0134(A7)
| 02DE 486F 0134 PEA 0134(A7)
| 02E2 2040 MOVEA.L D0,A0
| 02E4 43EF 0134 LEA 0134(A7),A1
| 02E8 6100 0350 BSR.W 063A
| 02EC 4FEF 0010 LEA 0010(A7),A7
; 323: clipped = 1;
| 02F0 3F7C 0001 0120 MOVE.W #0001,0120(A7)
| 02F6 3F40 0138 MOVE.W D0,0138(A7)
; 324: }
; 325: /*
; 326: * Check for empty set
; 327: */
; 328: if (v == NULL)
| 02FA 200D MOVE.L A5,D0
| 02FC 6700 0332 BEQ.W 0630
; 329: return(0);
; 330: if (n == 0)
| 0300 4A6F 0138 TST.W 0138(A7)
| 0304 2C6F 0038 MOVEA.L 0038(A7),A6
| 0308 6700 0316 BEQ.W 0620
; 331: goto cleanup;
; 332: /*
; 333: * Make a copy of the rastport
; 334: */
; 335: movmem(rp, &tmprp, sizeof(struct RastPort));
| 030C 204A MOVEA.L A2,A0
| 030E 43EF 00BC LEA 00BC(A7),A1
| 0312 7064 MOVEQ #64,D0
| 0314 6100 0000-XX.1 BSR.W @movmem
; 336: /*
; 337: * Add an outline if requested
; 338: */
; 339: if (ppen & APD_OUTLINE)
| 0318 082F 0003 0032 BTST #0003,0032(A7)
| 031E 670E BEQ.B 032E
; 340: {
; 341: SetOPen(&tmprp, (long) tmprp.FgPen)
| 0320 1F6F 00D5 00D7 MOVE.B 00D5(A7),00D7(A7)
| 0326 08EF 0003 00DD BSET #0003,00DD(A7)
| 032C 6006 BRA.B 0334
; 342: }
; 343: else
; 344: {
; 345: BNDRYOFF(&tmprp);
| 032E 08AF 0003 00DD BCLR #0003,00DD(A7)
; 346: }
; 347: /*
; 348: * Set APen
; 349: */
; 350: if ((ppen & 0xFF) < 16)
| 0334 303C 00FF MOVE.W #00FF,D0
| 0338 C06F 0032 AND.W 0032(A7),D0
| 033C 7210 MOVEQ #10,D1
| 033E B041 CMP.W D1,D0
| 0340 6C0E BGE.B 0350
; 351: SetAPen(&tmprp, (long) (ppen & 0xFF));
| 0342 48C0 EXT.L D0
| 0344 43EF 00BC LEA 00BC(A7),A1
| 0348 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 034C 4EAE FEAA JSR FEAA(A6)
; 352: /*
; 353: * If object still too large, just draw it, don't bother filling
; 354: */
; 355: if ((minx < clipxmin) || (miny < clipymin) ||
| 0350 302F 0124 MOVE.W 0124(A7),D0
| 0354 B045 CMP.W D5,D0
| 0356 2C6F 0038 MOVEA.L 0038(A7),A6
| 035A 6D1E BLT.B 037A
| 035C 302F 0128 MOVE.W 0128(A7),D0
| 0360 B044 CMP.W D4,D0
| 0362 6D16 BLT.B 037A
; 356: (maxx > clipxmax) || (maxy > clipymax) )
| 0364 302F 012C MOVE.W 012C(A7),D0
| 0368 B06F 002A CMP.W 002A(A7),D0
| 036C 6E0C BGT.B 037A
| 036E 302F 0130 MOVE.W 0130(A7),D0
| 0372 B06F 002C CMP.W 002C(A7),D0
| 0376 6F00 00A8 BLE.W 0420
; 357: {
; 358: tmp = v;
| 037A 264D MOVEA.L A5,A3
; 359: notmoved = 1;
| 037C 7801 MOVEQ #01,D4
; 360: while (tmp)
| 037E 6000 0090 BRA.W 0410
; 361: {
; 362: type = tmp->type;
| 0382 3A2B 0004 MOVE.W 0004(A3),D5
; 363: if (notmoved && (type == AREADRAW))
| 0386 4A44 TST.W D4
| 0388 6708 BEQ.B 0392
| 038A 2005 MOVE.L D5,D0
| 038C 5540 SUBQ.W #2,D0
| 038E 6602 BNE.B 0392
; 364: type = AREAMOVE;
| 0390 7A01 MOVEQ #01,D5
; 365: switch (type)
| 0392 3005 MOVE.W D5,D0
| 0394 5340 SUBQ.W #1,D0
| 0396 670E BEQ.B 03A6
| 0398 5340 SUBQ.W #1,D0
| 039A 672A BEQ.B 03C6
| 039C 5340 SUBQ.W #1,D0
| 039E 6744 BEQ.B 03E4
| 03A0 5340 SUBQ.W #1,D0
| 03A2 6740 BEQ.B 03E4
| 03A4 6068 BRA.B 040E
; 366: {
; 367: case AREAMOVE :
; 368: Move(&tmprp, (long) (tmp->x + xoff), (long) (tmp->y + yoff));
| 03A6 302B 0006 MOVE.W 0006(A3),D0
| 03AA D047 ADD.W D7,D0
| 03AC 48C0 EXT.L D0
| 03AE 322B 0008 MOVE.W 0008(A3),D1
| 03B2 D246 ADD.W D6,D1
| 03B4 48C1 EXT.L D1
| 03B6 43EF 00BC LEA 00BC(A7),A1
| 03BA 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 03BE 4EAE FF10 JSR FF10(A6)
; 369: notmoved = 0;
| 03C2 7800 MOVEQ #00,D4
; 370: break;
| 03C4 6044 BRA.B 040A
; 371: case AREADRAW :
; 372: Draw(&tmprp, (long) (tmp->x + xoff), (long) (tmp->y + yoff) );
| 03C6 302B 0006 MOVE.W 0006(A3),D0
| 03CA D047 ADD.W D7,D0
| 03CC 48C0 EXT.L D0
| 03CE 322B 0008 MOVE.W 0008(A3),D1
| 03D2 D246 ADD.W D6,D1
| 03D4 48C1 EXT.L D1
| 03D6 43EF 00BC LEA 00BC(A7),A1
| 03DA 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 03DE 4EAE FF0A JSR FF0A(A6)
; 373: break;
| 03E2 6026 BRA.B 040A
; 374: case AREACIRCLE :
; 375: case AREAELLIPSE :
; 376: DrawEllipse(&tmprp, (long) (tmp->x + xoff), (long) (tmp->y + yoff),
| 03E4 45EB 0006 LEA 0006(A3),A2
| 03E8 301A MOVE.W (A2)+,D0
| 03EA D047 ADD.W D7,D0
| 03EC 48C0 EXT.L D0
| 03EE 321A MOVE.W (A2)+,D1
| 03F0 D246 ADD.W D6,D1
| 03F2 48C1 EXT.L D1
| 03F4 341A MOVE.W (A2)+,D2
| 03F6 48C2 EXT.L D2
| 03F8 362B 000C MOVE.W 000C(A3),D3
; 377: (long) tmp->a , (long) tmp->b );
| 03FC 48C3 EXT.L D3
| 03FE 43EF 00BC LEA 00BC(A7),A1
| 0402 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 0406 4EAE FF4C JSR FF4C(A6)
; 378: break;
; 379: }
| 040A 2C6F 0038 MOVEA.L 0038(A7),A6
; 380: tmp = tmp->next;
| 040E 2653 MOVEA.L (A3),A3
; 381: }
| 0410 200B MOVE.L A3,D0
| 0412 6600 FF6E BNE.W 0382
; 382: res = 1;
| 0416 3F7C 0001 0134 MOVE.W #0001,0134(A7)
| 041C 6000 01FE BRA.W 061C
; 383: }
; 384: else
; 385: {
; 386: /*
; 387: * Allocate new AreaInfo/TmpRas (resxx = 2) or use the ones we have (resxx = 1).
; 388: */
; 389: resai = AllocAreaInfo(&tmprp, n + 10);
| 0420 700A MOVEQ #0A,D0
| 0422 D06F 0138 ADD.W 0138(A7),D0
| 0426 41EF 00BC LEA 00BC(A7),A0
| 042A 6100 FBD4 BSR.W 0000
| 042E 3A00 MOVE.W D0,D5
; 390: restr = AllocTmpRas(&tmprp, maxx - minx + 32, maxy - miny + 2);
| 0430 322F 012C MOVE.W 012C(A7),D1
| 0434 926F 0124 SUB.W 0124(A7),D1
| 0438 0641 0020 ADDI.W #0020,D1
| 043C 342F 0130 MOVE.W 0130(A7),D2
| 0440 946F 0128 SUB.W 0128(A7),D2
| 0444 5442 ADDQ.W #2,D2
| 0446 3F40 002A MOVE.W D0,002A(A7)
| 044A 2001 MOVE.L D1,D0
| 044C 2202 MOVE.L D2,D1
| 044E 41EF 00BC LEA 00BC(A7),A0
| 0452 6100 FCA4 BSR.W 00F8
; 391: /*
; 392: * AreaMove, AreaDraw, AreaCircle, AreaEllipse.
; 393: */
; 394: if (resai && restr)
| 0456 3F40 0028 MOVE.W D0,0028(A7)
| 045A 4A45 TST.W D5
| 045C 6700 019A BEQ.W 05F8
| 0460 4A40 TST.W D0
| 0462 6700 0194 BEQ.W 05F8
; 395: {
; 396: tmp = v;
| 0466 264D MOVEA.L A5,A3
; 397: notmoved = 1;
| 0468 7801 MOVEQ #01,D4
; 398: while (tmp)
| 046A 6000 0090 BRA.W 04FC
; 399: {
; 400: type = tmp->type;
| 046E 3A2B 0004 MOVE.W 0004(A3),D5
; 401: if (notmoved && (type == AREADRAW))
| 0472 4A44 TST.W D4
| 0474 6708 BEQ.B 047E
| 0476 2005 MOVE.L D5,D0
| 0478 5540 SUBQ.W #2,D0
| 047A 6602 BNE.B 047E
; 402: type = AREAMOVE;
| 047C 7A01 MOVEQ #01,D5
; 403: switch (type)
| 047E 3005 MOVE.W D5,D0
| 0480 5340 SUBQ.W #1,D0
| 0482 670E BEQ.B 0492
| 0484 5340 SUBQ.W #1,D0
| 0486 672A BEQ.B 04B2
| 0488 5340 SUBQ.W #1,D0
| 048A 6744 BEQ.B 04D0
| 048C 5340 SUBQ.W #1,D0
| 048E 6740 BEQ.B 04D0
| 0490 6068 BRA.B 04FA
; 404: {
; 405: case AREAMOVE :
; 406: AreaMove(&tmprp, (long) (tmp->x + xoff),
| 0492 302B 0006 MOVE.W 0006(A3),D0
| 0496 D047 ADD.W D7,D0
| 0498 48C0 EXT.L D0
| 049A 322B 0008 MOVE.W 0008(A3),D1
| 049E D246 ADD.W D6,D1
| 04A0 48C1 EXT.L D1
; 407: (long) (tmp->y + yoff));
| 04A2 43EF 00BC LEA 00BC(A7),A1
| 04A6 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 04AA 4EAE FF04 JSR FF04(A6)
; 408: notmoved = 0;
| 04AE 7800 MOVEQ #00,D4
; 409: break;
| 04B0 6044 BRA.B 04F6
; 410: case AREADRAW :
; 411: AreaDraw(&tmprp, (long) (tmp->x + xoff),
| 04B2 302B 0006 MOVE.W 0006(A3),D0
| 04B6 D047 ADD.W D7,D0
| 04B8 48C0 EXT.L D0
| 04BA 322B 0008 MOVE.W 0008(A3),D1
| 04BE D246 ADD.W D6,D1
| 04C0 48C1 EXT.L D1
; 412: (long) (tmp->y + yoff) );
| 04C2 43EF 00BC LEA 00BC(A7),A1
| 04C6 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 04CA 4EAE FEFE JSR FEFE(A6)
; 413: break;
| 04CE 6026 BRA.B 04F6
; 414: case AREACIRCLE :
; 415: case AREAELLIPSE :
; 416: AreaEllipse(&tmprp, (long) (tmp->x + xoff),
| 04D0 45EB 0006 LEA 0006(A3),A2
| 04D4 301A MOVE.W (A2)+,D0
| 04D6 D047 ADD.W D7,D0
| 04D8 48C0 EXT.L D0
| 04DA 321A MOVE.W (A2)+,D1
| 04DC D246 ADD.W D6,D1
| 04DE 48C1 EXT.L D1
| 04E0 341A MOVE.W (A2)+,D2
| 04E2 48C2 EXT.L D2
| 04E4 362B 000C MOVE.W 000C(A3),D3
; 417: (long) (tmp->y + yoff),
; 418: (long) tmp->a ,
; 419: (long) tmp->b );
| 04E8 48C3 EXT.L D3
| 04EA 43EF 00BC LEA 00BC(A7),A1
| 04EE 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 04F2 4EAE FF46 JSR FF46(A6)
; 420: break;
; 421: }
| 04F6 2C6F 0038 MOVEA.L 0038(A7),A6
; 422: tmp = tmp->next;
| 04FA 2653 MOVEA.L (A3),A3
; 423: }
| 04FC 200B MOVE.L A3,D0
| 04FE 6600 FF6E BNE.W 046E
; 424: /*
; 425: * Set up an areafill pattern
; 426: */
; 427: setmem(colpat, 128, 0);
| 0502 41EF 003C LEA 003C(A7),A0
| 0506 303C 0080 MOVE.W #0080,D0
| 050A 7200 MOVEQ #00,D1
| 050C 6100 0000-XX.1 BSR.W @setmem
; 428: /*
; 429: * Copy either a texture...
; 430: */
; 431: if (ppen & APD_TEXTURE)
| 0510 3A2F 0032 MOVE.W 0032(A7),D5
| 0514 0805 0008 BTST #0008,D5
| 0518 6700 008E BEQ.W 05A8
; 432: {
; 433: pow = arpt[ppen & 0xF].power;
| 051C 3005 MOVE.W D5,D0
| 051E 0240 000F ANDI.W #000F,D0
| 0522 48C0 EXT.L D0
| 0524 2200 MOVE.L D0,D1
| 0526 E581 ASL.L #2,D1
| 0528 9280 SUB.L D0,D1
| 052A D281 ADD.L D1,D1
| 052C 47EC 00FA-01.2 LEA 01.000000FA(A4),A3
| 0530 D7C1 ADDA.L D1,A3
| 0532 3A13 MOVE.W (A3),D5
; 434: movmem(arpt[ppen & 0xF].data, colpat,
| 0534 6A12 BPL.B 0548
| 0536 7001 MOVEQ #01,D0
| 0538 3200 MOVE.W D0,D1
| 053A 9245 SUB.W D5,D1
| 053C 7000 MOVEQ #00,D0
| 053E 03C0 BSET.L D1,D0
| 0540 2200 MOVE.L D0,D1
| 0542 E541 ASL.W #2,D1
| 0544 9240 SUB.W D0,D1
| 0546 6008 BRA.B 0550
| 0548 3005 MOVE.W D5,D0
| 054A 5240 ADDQ.W #1,D0
| 054C 7200 MOVEQ #00,D1
| 054E 01C1 BSET.L D0,D1
; 435: (pow < 0) ? (1 << (1 - pow)) * 3 : 1 << (pow + 1));
| 0550 2001 MOVE.L D1,D0
| 0552 206B 0002 MOVEA.L 0002(A3),A0
| 0556 43EF 003C LEA 003C(A7),A1
| 055A 6100 0000-XX.1 BSR.W @movmem
; 436:
; 437: SetAfPt(&tmprp, (unsigned short *) colpat, pow); // Stop a complaint
| 055E 41EF 003C LEA 003C(A7),A0
| 0562 2F48 00C4 MOVE.L A0,00C4(A7)
| 0566 3005 MOVE.W D5,D0
| 0568 1F40 00D9 MOVE.B D0,00D9(A7)
; 438: if (pow < 0)
| 056C 4A45 TST.W D5
| 056E 6A16 BPL.B 0586
; 439: SetAPen(&tmprp, 255L);
| 0570 43EF 00BC LEA 00BC(A7),A1
| 0574 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 0578 7000 MOVEQ #00,D0
| 057A 4600 NOT.B D0
| 057C 4EAE FEAA JSR FEAA(A6)
| 0580 2C6F 0038 MOVEA.L 0038(A7),A6
| 0584 600E BRA.B 0594
; 440: else
; 441: SetAPen(&tmprp, 1L);
| 0586 43EF 00BC LEA 00BC(A7),A1
| 058A 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 058E 7001 MOVEQ #01,D0
| 0590 4EAE FEAA JSR FEAA(A6)
; 442: SetDrMd(&tmprp, JAM2);
| 0594 43EF 00BC LEA 00BC(A7),A1
| 0598 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 059C 7001 MOVEQ #01,D0
| 059E 4EAE FE9E JSR FE9E(A6)
| 05A2 2C6F 0038 MOVEA.L 0038(A7),A6
| 05A6 603A BRA.B 05E2
; 443: }
; 444: /*
; 445: * ...or a dithered color
; 446: */
; 447: else
; 448: if (ppen & APD_DITHER)
| 05A8 0805 0009 BTST #0009,D5
| 05AC 6734 BEQ.B 05E2
; 449: {
; 450: setdither(colpat, ppen & 0xFF);
| 05AE 3005 MOVE.W D5,D0
| 05B0 0240 00FF ANDI.W #00FF,D0
| 05B4 41EF 003C LEA 003C(A7),A0
| 05B8 6100 01C0 BSR.W 077A
; 451:
; 452: SetAfPt(&tmprp, (unsigned short *) colpat, -1);
| 05BC 41EF 003C LEA 003C(A7),A0
| 05C0 2F48 00C4 MOVE.L A0,00C4(A7)
| 05C4 50EF 00D9 ST 00D9(A7)
; 453: SetAPen(&tmprp, 255L);
| 05C8 43EF 00BC LEA 00BC(A7),A1
| 05CC 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 05D0 7000 MOVEQ #00,D0
| 05D2 4600 NOT.B D0
| 05D4 4EAE FEAA JSR FEAA(A6)
; 454: SetDrMd(&tmprp, JAM2);
| 05D8 43EF 00BC LEA 00BC(A7),A1
| 05DC 7001 MOVEQ #01,D0
| 05DE 4EAE FE9E JSR FE9E(A6)
; 455: }
; 456: /*
; 457: * Do the blit. Make sure the blit finishes before deallocating.
; 458: */
; 459: AreaEnd(&tmprp);
| 05E2 43EF 00BC LEA 00BC(A7),A1
| 05E6 2C6C 0000-XX.2 MOVEA.L _GfxBase(A4),A6
| 05EA 4EAE FEF8 JSR FEF8(A6)
; 460: WaitBlit();
| 05EE 4EAE FF1C JSR FF1C(A6)
; 461:
; 462: res = 1;
| 05F2 3F7C 0001 0134 MOVE.W #0001,0134(A7)
; 463: }
; 464: /*
; 465: * Free allocated resources.
; 466: */
; 467: if (resai == 2)
| 05F8 7002 MOVEQ #02,D0
| 05FA B06F 002A CMP.W 002A(A7),D0
| 05FE 2C6F 0038 MOVEA.L 0038(A7),A6
| 0602 6608 BNE.B 060C
; 468: FreeAreaInfo(&tmprp);
| 0604 41EF 00BC LEA 00BC(A7),A0
| 0608 6100 FAA2 BSR.W 00AC
; 469: if (restr == 2)
| 060C 7002 MOVEQ #02,D0
| 060E B06F 0028 CMP.W 0028(A7),D0
| 0612 6608 BNE.B 061C
; 470: FreeTmpRas(&tmprp);
| 0614 41EF 00BC LEA 00BC(A7),A0
| 0618 6100 FBB0 BSR.W 01CA
| 061C 2C6F 0038 MOVEA.L 0038(A7),A6
; 471: }
; 472: /*
; 473: * Deallocate our local copy of the list
; 474: */
; 475:
; 476: cleanup:
; 477:
; 478: if (clipped)
| 0620 4A6F 0120 TST.W 0120(A7)
| 0624 6706 BEQ.B 062C
; 479: KillVertex(v);
| 0626 204D MOVEA.L A5,A0
| 0628 6100 0120 BSR.W 074A
; 480:
; 481: return(res);
| 062C 302F 0134 MOVE.W 0134(A7),D0
| 0630 4CDF 6CFC MOVEM.L (A7)+,D2-D7/A2-A3/A5-A6
| 0634 DEFC 0114 ADDA.W #0114,A7
| 0638 4E75 RTS
; 482: }
; 483:
; 484:
; 485: /**
; 486: *
; 487: * Find number of vertices and horizontal and vertical extent.
; 488: *
; 489: **/
; 490: static int FindAreaSize(v, minx, miny, maxx, maxy)
; 491: struct vtx *v;
; 492: int *minx, *miny, *maxx, *maxy;
| 063A 594F SUBQ.W #4,A7
| 063C 48E7 2324 MOVEM.L D2/D6-D7/A2/A5,-(A7)
| 0640 246F 001C MOVEA.L 001C(A7),A2
| 0644 2A48 MOVEA.L A0,A5
; 493: {
; 494: int n = 0, t;
| 0646 7E00 MOVEQ #00,D7
; 495:
; 496: *minx = *miny = 20000;
| 0648 303C 4E20 MOVE.W #4E20,D0
| 064C 3480 MOVE.W D0,(A2)
| 064E 3280 MOVE.W D0,(A1)
; 497: *maxx = *maxy = 0;
| 0650 206F 0024 MOVEA.L 0024(A7),A0
| 0654 4250 CLR.W (A0)
| 0656 206F 0020 MOVEA.L 0020(A7),A0
| 065A 4250 CLR.W (A0)
| 065C 2F4E 0014 MOVE.L A6,0014(A7)
; 498:
; 499: while (v)
| 0660 6000 009A BRA.W 06FC
; 500: {
; 501: switch (v->type)
| 0664 302D 0004 MOVE.W 0004(A5),D0
| 0668 5340 SUBQ.W #1,D0
| 066A 6710 BEQ.B 067C
| 066C 5340 SUBQ.W #1,D0
| 066E 670E BEQ.B 067E
| 0670 5340 SUBQ.W #1,D0
| 0672 6736 BEQ.B 06AA
| 0674 5340 SUBQ.W #1,D0
| 0676 6738 BEQ.B 06B0
| 0678 6000 0080 BRA.W 06FA
; 502: {
; 503: case AREAMOVE :
; 504: n++;
| 067C 5247 ADDQ.W #1,D7
; 505: case AREADRAW :
; 506: n++;
| 067E 5247 ADDQ.W #1,D7
; 507: if ((t = v->x) < *minx)
| 0680 3C2D 0006 MOVE.W 0006(A5),D6
| 0684 BC51 CMP.W (A1),D6
| 0686 6C02 BGE.B 068A
; 508: *minx = t;
| 0688 3286 MOVE.W D6,(A1)
; 509: if (t > *maxx)
| 068A 206F 0020 MOVEA.L 0020(A7),A0
| 068E BC50 CMP.W (A0),D6
| 0690 6F02 BLE.B 0694
; 510: *maxx = t;
| 0692 3086 MOVE.W D6,(A0)
; 511: if ((t = v->y) < *miny)
| 0694 3C2D 0008 MOVE.W 0008(A5),D6
| 0698 BC52 CMP.W (A2),D6
| 069A 6C02 BGE.B 069E
; 512: *miny = t;
| 069C 3486 MOVE.W D6,(A2)
; 513: if (t > *maxy)
| 069E 206F 0024 MOVEA.L 0024(A7),A0
| 06A2 BC50 CMP.W (A0),D6
| 06A4 6F54 BLE.B 06FA
; 514: *maxy = t;
| 06A6 3086 MOVE.W D6,(A0)
; 515: break;
| 06A8 6050 BRA.B 06FA
; 516: case AREACIRCLE :
; 517: v->b = v->a;
| 06AA 3B6D 000A 000C MOVE.W 000A(A5),000C(A5)
; 518: case AREAELLIPSE :
; 519: n += 2;
| 06B0 5447 ADDQ.W #2,D7
; 520: if ((t = v->x - v->a) < *minx)
| 06B2 302D 000A MOVE.W 000A(A5),D0
| 06B6 322D 0006 MOVE.W 0006(A5),D1
| 06BA 2401 MOVE.L D1,D2
| 06BC 9440 SUB.W D0,D2
| 06BE B451 CMP.W (A1),D2
| 06C0 6C02 BGE.B 06C4
; 521: *minx = t;
| 06C2 3282 MOVE.W D2,(A1)
; 522: if ((t = v->x + v->a) > *maxx)
| 06C4 302D 0006 MOVE.W 0006(A5),D0
| 06C8 D06D 000A ADD.W 000A(A5),D0
| 06CC 206F 0020 MOVEA.L 0020(A7),A0
| 06D0 B050 CMP.W (A0),D0
| 06D2 6F02 BLE.B 06D6
; 523: *maxx = t;
| 06D4 3080 MOVE.W D0,(A0)
; 524: if ((t = v->y - v->b) < *miny)
| 06D6 302D 000C MOVE.W 000C(A5),D0
| 06DA 322D 0008 MOVE.W 0008(A5),D1
| 06DE 2401 MOVE.L D1,D2
| 06E0 9440 SUB.W D0,D2
| 06E2 B452 CMP.W (A2),D2
| 06E4 6C02 BGE.B 06E8
; 525: *miny = t;
| 06E6 3482 MOVE.W D2,(A2)
; 526: if ((t = v->y + v->b) > *maxy)
| 06E8 302D 0008 MOVE.W 0008(A5),D0
| 06EC D06D 000C ADD.W 000C(A5),D0
| 06F0 206F 0024 MOVEA.L 0024(A7),A0
| 06F4 B050 CMP.W (A0),D0
| 06F6 6F02 BLE.B 06FA
; 527: *maxy = t;
| 06F8 3080 MOVE.W D0,(A0)
; 528: break;
; 529: }
; 530: v = v->next;
| 06FA 2A55 MOVEA.L (A5),A5
; 531: }
| 06FC 200D MOVE.L A5,D0
| 06FE 6600 FF64 BNE.W 0664
; 532: return(n);
| 0702 3007 MOVE.W D7,D0
| 0704 4CDF 24C4 MOVEM.L (A7)+,D2/D6-D7/A2/A5
| 0708 584F ADDQ.W #4,A7
| 070A 4E75 RTS
; 533: }
; 534:
; 535: /**
; 536: *
; 537: * Allocate a new vtx structure, and add to list.
; 538: *
; 539: **/
; 540: struct vtx *AddVertex(v)
; 541: struct vtx *v;
| 070C 594F SUBQ.W #4,A7
| 070E 48E7 0016 MOVEM.L A3/A5-A6,-(A7)
| 0712 2A48 MOVEA.L A0,A5
| 0714 2F4E 000C MOVE.L A6,000C(A7)
; 542: {
; 543: struct vtx *t, *m;
; 544:
; 545: if (v)
| 0718 200D MOVE.L A5,D0
| 071A 670A BEQ.B 0726
; 546: {
; 547: t = v;
| 071C 264D MOVEA.L A5,A3
; 548: while (t->next)
| 071E 0C40 2653 CMPI.W #2653,D0
; 549: t = t->next;
| 0722 4A93 TST.L (A3)
| 0724 66FA BNE.B 0720
; 550: }
; 551:
; 552: m = (struct vtx *) AllocMem((long) sizeof(struct vtx), MEMF_CLEAR);
| 0726 700E MOVEQ #0E,D0
| 0728 7201 MOVEQ #01,D1
| 072A 4841 SWAP D1
| 072C 2C78 0004 MOVEA.L 0004,A6
| 0730 4EAE FF3A JSR FF3A(A6)
| 0734 2040 MOVEA.L D0,A0
| 0736 2C6F 000C MOVEA.L 000C(A7),A6
; 553:
; 554: if (v)
| 073A 200D MOVE.L A5,D0
| 073C 6702 BEQ.B 0740
; 555: t->next = m;
| 073E 2688 MOVE.L A0,(A3)
; 556:
; 557: return(m);
| 0740 2008 MOVE.L A0,D0
| 0742 4CDF 6800 MOVEM.L (A7)+,A3/A5-A6
| 0746 584F ADDQ.W #4,A7
| 0748 4E75 RTS
; 558: }
; 559:
; 560: /**
; 561: *
; 562: * Delete vtx structure list.
; 563: *
; 564: **/
; 565: struct vtx *KillVertex(v)
; 566: struct vtx *v;
| 074A 594F SUBQ.W #4,A7
| 074C 48E7 0016 MOVEM.L A3/A5-A6,-(A7)
| 0750 2A48 MOVEA.L A0,A5
| 0752 2F4E 000C MOVE.L A6,000C(A7)
; 567: {
; 568: struct vtx *t;
; 569:
; 570: while (v)
| 0756 6014 BRA.B 076C
; 571: {
; 572: t = v->next;
| 0758 2655 MOVEA.L (A5),A3
; 573: FreeMem(v, (long) sizeof(struct vtx));
| 075A 224D MOVEA.L A5,A1
| 075C 700E MOVEQ #0E,D0
| 075E 2C78 0004 MOVEA.L 0004,A6
| 0762 4EAE FF2E JSR FF2E(A6)
; 574: v = t;
| 0766 2A4B MOVEA.L A3,A5
| 0768 2C6F 000C MOVEA.L 000C(A7),A6
; 575: }
| 076C 200D MOVE.L A5,D0
| 076E 66E8 BNE.B 0758
; 576:
; 577: return(NULL);
| 0770 7000 MOVEQ #00,D0
| 0772 4CDF 6800 MOVEM.L (A7)+,A3/A5-A6
| 0776 584F ADDQ.W #4,A7
| 0778 4E75 RTS
; 578: }
; 579:
; 580:
; 581:
; 582: /**
; 583: *
; 584: * This function calculates a dithering pattern for color n,
; 585: * where n is a number between 0 and 124 (inclusive) according to
; 586: *
; 587: * n = r * 25 + g * 5 + b,
; 588: *
; 589: * with r, g, and b between 0 and 4 (inclusive).
; 590: *
; 591: **/
; 592: static unsigned int bits[16][2] =
; 593: {
; 594: {0x0000, 0x0000
; 595: }
; 596: ,
; 597: {
; 598: 0xaaaa, 0x0000
; 599: }
; 600: ,
; 601: {
; 602: 0x5555, 0x0000
; 603: }
; 604: ,
; 605: {
; 606: 0xffff, 0x0000
; 607: }
; 608: ,
; 609: {
; 610: 0x0000, 0xaaaa
; 611: }
; 612: ,
; 613: {
; 614: 0xaaaa, 0xaaaa
; 615: }
; 616: ,
; 617: {
; 618: 0x5555, 0xaaaa
; 619: }
; 620: ,
; 621: {
; 622: 0xffff, 0xaaaa
; 623: }
; 624: ,
; 625: {
; 626: 0x0000, 0x5555
; 627: }
; 628: ,
; 629: {
; 630: 0xaaaa, 0x5555
; 631: }
; 632: ,
; 633: {
; 634: 0x5555, 0x5555
; 635: }
; 636: ,
; 637: {
; 638: 0xffff, 0x5555
; 639: }
; 640: ,
; 641: {
; 642: 0x0000, 0xffff
; 643: }
; 644: ,
; 645: {
; 646: 0xaaaa, 0xffff
; 647: }
; 648: ,
; 649: {
; 650: 0x5555, 0xffff
; 651: }
; 652: ,
; 653: {
; 654: 0xffff, 0xffff
; 655: }
; 656: };
; 657:
; 658: static int setdither(ptdata, n)
; 659: unsigned int ptdata[];
; 660: int n;
| 077A 9EFC 0014 SUBA.W #0014,A7
| 077E 48E7 3F14 MOVEM.L D2-D7/A3/A5,-(A7)
| 0782 2A48 MOVEA.L A0,A5
| 0784 3E00 MOVE.W D0,D7
; 661: {
; 662: int r, g, b;
; 663: int l, m, nblack, nwhite, nmagenta, ncyan, nyellow;
; 664: static int indices[4];
; 665: static int map[4] =
; 666: {
; 667: 0, 3, 1, 2
; 668: };
; 669:
; 670: /*
; 671: * Argument tests
; 672: */
; 673: if (ptdata == 0L)
| 0786 3F40 002E MOVE.W D0,002E(A7)
| 078A 2F4E 0030 MOVE.L A6,0030(A7)
| 078E 200D MOVE.L A5,D0
| 0790 6700 029E BEQ.W 0A30
; 674: return;
; 675: if (n < 0)
| 0794 4A47 TST.W D7
| 0796 6B00 0298 BMI.W 0A30
; 676: return;
; 677:
; 678: n = (n & 0x7f);
| 079A 0247 007F ANDI.W #007F,D7
; 679: if (n > 124)
| 079E 707C MOVEQ #7C,D0
| 07A0 BE40 CMP.W D0,D7
| 07A2 6F02 BLE.B 07A6
; 680: n = 124;
| 07A4 3E00 MOVE.W D0,D7
; 681: /*
; 682: * Extract r, g, and b
; 683: */
; 684: r = n / 25;
| 07A6 3007 MOVE.W D7,D0
| 07A8 48C0 EXT.L D0
| 07AA 7219 MOVEQ #19,D1
| 07AC 81C1 DIVS.W D1,D0
| 07AE 2C00 MOVE.L D0,D6
; 685: b = n - r * 25;
| 07B0 E540 ASL.W #2,D0
| 07B2 D046 ADD.W D6,D0
| 07B4 2400 MOVE.L D0,D2
| 07B6 E542 ASL.W #2,D2
| 07B8 D440 ADD.W D0,D2
| 07BA 3007 MOVE.W D7,D0
| 07BC 9042 SUB.W D2,D0
; 686: g = b / 5;
| 07BE 3F40 0020 MOVE.W D0,0020(A7)
| 07C2 48C0 EXT.L D0
| 07C4 7205 MOVEQ #05,D1
| 07C6 81C1 DIVS.W D1,D0
| 07C8 2E00 MOVE.L D0,D7
; 687: b = b - g * 5;
| 07CA E540 ASL.W #2,D0
| 07CC D047 ADD.W D7,D0
| 07CE 322F 0020 MOVE.W 0020(A7),D1
| 07D2 9240 SUB.W D0,D1
| 07D4 2A01 MOVE.L D1,D5
; 688: /*
; 689: * Initialize number of black pixels in a square
; 690: */
; 691: nblack = 4;
| 07D6 7804 MOVEQ #04,D4
; 692: /*
; 693: * Number of white pixels...
; 694: */
; 695: if (nwhite = min(min(r, g), b))
| 07D8 BC47 CMP.W D7,D6
| 07DA 6F04 BLE.B 07E0
| 07DC 3007 MOVE.W D7,D0
| 07DE 0C40 3006 CMPI.W #3006,D0
| 07E2 B045 CMP.W D5,D0
| 07E4 6F04 BLE.B 07EA
| 07E6 3005 MOVE.W D5,D0
| 07E8 600A BRA.B 07F4
| 07EA BC47 CMP.W D7,D6
| 07EC 6F04 BLE.B 07F2
| 07EE 3007 MOVE.W D7,D0
| 07F0 0C40 3006 CMPI.W #3006,D0
| 07F4 3F40 0026 MOVE.W D0,0026(A7)
| 07F8 670C BEQ.B 0806
; 696: {
; 697: r -= nwhite;
| 07FA 9C40 SUB.W D0,D6
; 698: g -= nwhite;
| 07FC 9E40 SUB.W D0,D7
; 699: b -= nwhite;
| 07FE 9A40 SUB.W D0,D5
; 700: nblack -= nwhite;
| 0800 7204 MOVEQ #04,D1
| 0802 9240 SUB.W D0,D1
| 0804 2801 MOVE.L D1,D4
; 701: }
; 702: /*
; 703: * ...and cyan, magenta or yellow pixels
; 704: */
; 705: ncyan = min(g, b);
| 0806 BE45 CMP.W D5,D7
| 0808 6F04 BLE.B 080E
| 080A 3205 MOVE.W D5,D1
| 080C 0C40 3207 CMPI.W #3207,D0
; 706: nmagenta = min(r, b);
| 0810 3F41 0020 MOVE.W D1,0020(A7)
| 0814 BC45 CMP.W D5,D6
| 0816 6F04 BLE.B 081C
| 0818 3405 MOVE.W D5,D2
| 081A 0C40 3406 CMPI.W #3406,D0
; 707: nyellow = min(r, g);
| 081E 3F42 0022 MOVE.W D2,0022(A7)
| 0822 BC47 CMP.W D7,D6
| 0824 6F04 BLE.B 082A
| 0826 3607 MOVE.W D7,D3
| 0828 0C40 3606 CMPI.W #3606,D0
| 082C 3F43 0024 MOVE.W D3,0024(A7)
; 708:
; 709: if (ncyan)
| 0830 4A41 TST.W D1
| 0832 6708 BEQ.B 083C
; 710: {
; 711: g -= ncyan;
| 0834 9E41 SUB.W D1,D7
; 712: b -= ncyan;
| 0836 9A41 SUB.W D1,D5
; 713: nblack -= ncyan;
| 0838 9841 SUB.W D1,D4
| 083A 6016 BRA.B 0852
; 714: }
; 715: else
; 716: if (nmagenta)
| 083C 4A42 TST.W D2
| 083E 6708 BEQ.B 0848
; 717: {
; 718: r -= nmagenta;
| 0840 9C42 SUB.W D2,D6
; 719: b -= nmagenta;
| 0842 9A42 SUB.W D2,D5
; 720: nblack -= nmagenta;
| 0844 9842 SUB.W D2,D4
| 0846 600A BRA.B 0852
; 721: }
; 722: else
; 723: if (nyellow)
| 0848 4A43 TST.W D3
| 084A 6706 BEQ.B 0852
; 724: {
; 725: r -= nyellow;
| 084C 9C43 SUB.W D3,D6
; 726: g -= nyellow;
| 084E 9E43 SUB.W D3,D7
; 727: nblack -= nyellow;
| 0850 9843 SUB.W D3,D4
; 728: }
; 729: /*
; 730: * ...and red green and blue pixels
; 731: */
; 732: if (r)
| 0852 3F47 0028 MOVE.W D7,0028(A7)
| 0856 2005 MOVE.L D5,D0
| 0858 3F40 002A MOVE.W D0,002A(A7)
| 085C 4A46 TST.W D6
| 085E 6704 BEQ.B 0864
; 733: nblack -= r;
| 0860 9846 SUB.W D6,D4
| 0862 600E BRA.B 0872
; 734: else
; 735: if (g)
| 0864 4A47 TST.W D7
| 0866 6704 BEQ.B 086C
; 736: nblack -= g;
| 0868 9847 SUB.W D7,D4
| 086A 6006 BRA.B 0872
; 737: else
; 738: if (b)
| 086C 4A45 TST.W D5
| 086E 6702 BEQ.B 0872
; 739: nblack -= b;
| 0870 9845 SUB.W D5,D4
; 740: /*
; 741: * Set up the color indices for the four pixels
; 742: */
; 743: m = 0;
| 0872 7400 MOVEQ #00,D2
; 744: for (l = 0; l < nblack; l++, m++)
| 0874 7600 MOVEQ #00,D3
| 0876 47EC 019A-01.2 LEA 01.0000019A(A4),A3
| 087A 6014 BRA.B 0890
; 745: indices[map[m]] = 0;
| 087C 301B MOVE.W (A3)+,D0
| 087E 48C0 EXT.L D0
| 0880 2200 MOVE.L D0,D1
| 0882 D281 ADD.L D1,D1
| 0884 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 0888 4270 1800 CLR.W 00(A0,D1.L)
| 088C 5243 ADDQ.W #1,D3
| 088E 5242 ADDQ.W #1,D2
| 0890 B644 CMP.W D4,D3
| 0892 6DE8 BLT.B 087C
; 746: for (l = 0; l < nwhite; l++, m++)
| 0894 7600 MOVEQ #00,D3
| 0896 48C2 EXT.L D2
| 0898 2002 MOVE.L D2,D0
| 089A D080 ADD.L D0,D0
| 089C 47EC 019A-01.2 LEA 01.0000019A(A4),A3
| 08A0 D7C0 ADDA.L D0,A3
| 08A2 382F 0026 MOVE.W 0026(A7),D4
| 08A6 6016 BRA.B 08BE
; 747: indices[map[m]] = 1;
| 08A8 301B MOVE.W (A3)+,D0
| 08AA 48C0 EXT.L D0
| 08AC 2200 MOVE.L D0,D1
| 08AE D281 ADD.L D1,D1
| 08B0 7001 MOVEQ #01,D0
| 08B2 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 08B6 3180 1800 MOVE.W D0,00(A0,D1.L)
| 08BA 5243 ADDQ.W #1,D3
| 08BC 5242 ADDQ.W #1,D2
| 08BE B644 CMP.W D4,D3
| 08C0 6DE6 BLT.B 08A8
; 748: for (l = 0; l < ncyan; l++, m++)
| 08C2 7600 MOVEQ #00,D3
| 08C4 48C2 EXT.L D2
| 08C6 2002 MOVE.L D2,D0
| 08C8 D080 ADD.L D0,D0
| 08CA 47EC 019A-01.2 LEA 01.0000019A(A4),A3
| 08CE D7C0 ADDA.L D0,A3
| 08D0 382F 0020 MOVE.W 0020(A7),D4
| 08D4 6016 BRA.B 08EC
; 749: indices[map[m]] = 5;
| 08D6 301B MOVE.W (A3)+,D0
| 08D8 48C0 EXT.L D0
| 08DA 2200 MOVE.L D0,D1
| 08DC D281 ADD.L D1,D1
| 08DE 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 08E2 31BC 0005 1800 MOVE.W #0005,00(A0,D1.L)
| 08E8 5243 ADDQ.W #1,D3
| 08EA 5242 ADDQ.W #1,D2
| 08EC B644 CMP.W D4,D3
| 08EE 6DE6 BLT.B 08D6
; 750: for (l = 0; l < nmagenta; l++, m++)
| 08F0 7600 MOVEQ #00,D3
| 08F2 48C2 EXT.L D2
| 08F4 2002 MOVE.L D2,D0
| 08F6 D080 ADD.L D0,D0
| 08F8 47EC 019A-01.2 LEA 01.0000019A(A4),A3
| 08FC D7C0 ADDA.L D0,A3
| 08FE 382F 0022 MOVE.W 0022(A7),D4
| 0902 6016 BRA.B 091A
; 751: indices[map[m]] = 6;
| 0904 301B MOVE.W (A3)+,D0
| 0906 48C0 EXT.L D0
| 0908 2200 MOVE.L D0,D1
| 090A D281 ADD.L D1,D1
| 090C 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 0910 31BC 0006 1800 MOVE.W #0006,00(A0,D1.L)
| 0916 5243 ADDQ.W #1,D3
| 0918 5242 ADDQ.W #1,D2
| 091A B644 CMP.W D4,D3
| 091C 6DE6 BLT.B 0904
; 752: for (l = 0; l < nyellow; l++, m++)
| 091E 7600 MOVEQ #00,D3
| 0920 48C2 EXT.L D2
| 0922 2002 MOVE.L D2,D0
| 0924 D080 ADD.L D0,D0
| 0926 47EC 019A-01.2 LEA 01.0000019A(A4),A3
| 092A D7C0 ADDA.L D0,A3
| 092C 382F 0024 MOVE.W 0024(A7),D4
| 0930 6016 BRA.B 0948
; 753: indices[map[m]] = 7;
| 0932 301B MOVE.W (A3)+,D0
| 0934 48C0 EXT.L D0
| 0936 2200 MOVE.L D0,D1
| 0938 D281 ADD.L D1,D1
| 093A 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 093E 31BC 0007 1800 MOVE.W #0007,00(A0,D1.L)
| 0944 5243 ADDQ.W #1,D3
| 0946 5242 ADDQ.W #1,D2
| 0948 B644 CMP.W D4,D3
| 094A 6DE6 BLT.B 0932
; 754: for (l = 0; l < r; l++, m++)
| 094C 7600 MOVEQ #00,D3
| 094E 48C2 EXT.L D2
| 0950 2002 MOVE.L D2,D0
| 0952 D080 ADD.L D0,D0
| 0954 47EC 019A-01.2 LEA 01.0000019A(A4),A3
| 0958 D7C0 ADDA.L D0,A3
| 095A 6016 BRA.B 0972
; 755: indices[map[m]] = 2;
| 095C 301B MOVE.W (A3)+,D0
| 095E 48C0 EXT.L D0
| 0960 2200 MOVE.L D0,D1
| 0962 D281 ADD.L D1,D1
| 0964 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 0968 31BC 0002 1800 MOVE.W #0002,00(A0,D1.L)
| 096E 5243 ADDQ.W #1,D3
| 0970 5242 ADDQ.W #1,D2
| 0972 B646 CMP.W D6,D3
| 0974 6DE6 BLT.B 095C
; 756: for (l = 0; l < g; l++, m++)
| 0976 7800 MOVEQ #00,D4
| 0978 48C2 EXT.L D2
| 097A 2002 MOVE.L D2,D0
| 097C D080 ADD.L D0,D0
| 097E 47EC 019A-01.2 LEA 01.0000019A(A4),A3
| 0982 D7C0 ADDA.L D0,A3
| 0984 362F 0028 MOVE.W 0028(A7),D3
| 0988 6016 BRA.B 09A0
; 757: indices[map[m]] = 3;
| 098A 301B MOVE.W (A3)+,D0
| 098C 48C0 EXT.L D0
| 098E 2200 MOVE.L D0,D1
| 0990 D281 ADD.L D1,D1
| 0992 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 0996 31BC 0003 1800 MOVE.W #0003,00(A0,D1.L)
| 099C 5244 ADDQ.W #1,D4
| 099E 5242 ADDQ.W #1,D2
| 09A0 B843 CMP.W D3,D4
| 09A2 6DE6 BLT.B 098A
; 758: for (l = 0; l < b; l++, m++)
| 09A4 7600 MOVEQ #00,D3
| 09A6 48C2 EXT.L D2
| 09A8 2002 MOVE.L D2,D0
| 09AA D080 ADD.L D0,D0
| 09AC 47EC 019A-01.2 LEA 01.0000019A(A4),A3
| 09B0 D7C0 ADDA.L D0,A3
| 09B2 342F 002A MOVE.W 002A(A7),D2
| 09B6 6014 BRA.B 09CC
; 759: indices[map[m]] = 4;
| 09B8 301B MOVE.W (A3)+,D0
| 09BA 48C0 EXT.L D0
| 09BC 2200 MOVE.L D0,D1
| 09BE D281 ADD.L D1,D1
| 09C0 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 09C4 31BC 0004 1800 MOVE.W #0004,00(A0,D1.L)
| 09CA 5243 ADDQ.W #1,D3
| 09CC B642 CMP.W D2,D3
| 09CE 6DE8 BLT.B 09B8
; 760: /*
; 761: * Convert to bitmaps and return in ptdata.
; 762: */
; 763: movmem(bits[bm(indices, 0)], &ptdata[0], 4);
| 09D0 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 09D4 7000 MOVEQ #00,D0
| 09D6 6100 0062 BSR.W 0A3A
| 09DA 48C0 EXT.L D0
| 09DC E580 ASL.L #2,D0
| 09DE 41EC 015A-01.2 LEA 01.0000015A(A4),A0
| 09E2 D1C0 ADDA.L D0,A0
| 09E4 224D MOVEA.L A5,A1
| 09E6 7004 MOVEQ #04,D0
| 09E8 6100 0000-XX.1 BSR.W @movmem
; 764: movmem(bits[bm(indices, 1)], &ptdata[2], 4);
| 09EC 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 09F0 7001 MOVEQ #01,D0
| 09F2 6100 0046 BSR.W 0A3A
| 09F6 48C0 EXT.L D0
| 09F8 E580 ASL.L #2,D0
| 09FA 41EC 015A-01.2 LEA 01.0000015A(A4),A0
| 09FE D1C0 ADDA.L D0,A0
| 0A00 43ED 0004 LEA 0004(A5),A1
| 0A04 7004 MOVEQ #04,D0
| 0A06 6100 0000-XX.1 BSR.W @movmem
; 765: movmem(bits[bm(indices, 2)], &ptdata[4], 4);
| 0A0A 41EC 0000-02.2 LEA 02.00000000(A4),A0
| 0A0E 7002 MOVEQ #02,D0
| 0A10 6100 0028 BSR.W 0A3A
| 0A14 48C0 EXT.L D0
| 0A16 E580 ASL.L #2,D0
| 0A18 41EC 015A-01.2 LEA 01.0000015A(A4),A0
| 0A1C D1C0 ADDA.L D0,A0
| 0A1E 43ED 0008 LEA 0008(A5),A1
| 0A22 7004 MOVEQ #04,D0
| 0A24 4CDF 28FC MOVEM.L (A7)+,D2-D7/A3/A5
| 0A28 DEFC 0014 ADDA.W #0014,A7
| 0A2C 6000 0000-XX.1 BRA.W @movmem
; 766:
; 767: return;
| 0A30 4CDF 28FC MOVEM.L (A7)+,D2-D7/A3/A5
| 0A34 DEFC 0014 ADDA.W #0014,A7
| 0A38 4E75 RTS
; 768: }
; 769:
; 770: /**
; 771: *
; 772: * Extract bitmap n from quadruple s
; 773: *
; 774: **/
; 775: static int bm(s, n)
; 776: int s[], n;
| 0A3A 594F SUBQ.W #4,A7
| 0A3C 48E7 3C00 MOVEM.L D2-D5,-(A7)
| 0A40 2400 MOVE.L D0,D2
; 777: {
; 778: int index = 0;
; 779: int mask = 1 << n;
| 0A42 3002 MOVE.W D2,D0
| 0A44 7200 MOVEQ #00,D1
| 0A46 01C1 BSET.L D0,D1
; 780:
; 781:
; 782: index = (( ((s[3] & mask) << 3) +
| 0A48 3028 0006 MOVE.W 0006(A0),D0
| 0A4C C041 AND.W D1,D0
; 783: ((s[2] & mask) << 2) +
| 0A4E 3628 0004 MOVE.W 0004(A0),D3
| 0A52 C641 AND.W D1,D3
; 784: ((s[1] & mask) << 1) +
| 0A54 3828 0002 MOVE.W 0002(A0),D4
| 0A58 C841 AND.W D1,D4
; 785: ((s[0] & mask) ) ) >> n) & 0xf ;
| 0A5A 3A10 MOVE.W (A0),D5
| 0A5C CA41 AND.W D1,D5
| 0A5E D844 ADD.W D4,D4
| 0A60 E543 ASL.W #2,D3
| 0A62 E740 ASL.W #3,D0
| 0A64 D043 ADD.W D3,D0
| 0A66 D044 ADD.W D4,D0
| 0A68 D045 ADD.W D5,D0
| 0A6A E460 ASR.W D2,D0
| 0A6C 0240 000F ANDI.W #000F,D0
; 786:
; 787: return(index);
| 0A70 4CDF 003C MOVEM.L (A7)+,D2-D5
| 0A74 584F ADDQ.W #4,A7
| 0A76 4E75 RTS
; 788: }
; 789:
; 790:
; 791:
; 792: // These are already defined (differently in one case)
; 793: //static struct vtx *addintersect(), *addvtx();
; 794: //int inside();
; 795: //static struct vtx *SHClip();
; 796:
; 797: /**
; 798: *
; 799: * Clip a vertex list against a rectangle
; 800: *
; 801: **/
; 802: static struct vtx *AreaPolyClip(vi, x1, y1, x2, y2)
; 803: struct vtx *vi;
; 804: int x1, y1, x2, y2;
| 0A78 514F SUBQ.W #8,A7
| 0A7A 48E7 0214 MOVEM.L D6/A3/A5,-(A7)
| 0A7E 2C01 MOVE.L D1,D6
| 0A80 2200 MOVE.L D0,D1
; 805: {
; 806: struct vtx *vo = NULL;
; 807:
; 808: vo = SHClip(vi, BD_LEFT, x1);
| 0A82 2F48 000C MOVE.L A0,000C(A7)
| 0A86 2F4E 0010 MOVE.L A6,0010(A7)
| 0A8A 7001 MOVEQ #01,D0
| 0A8C 6100 0048 BSR.W 0AD6
; 809: /*
; 810: * Be careful not to deallocate the input list!
; 811: */
; 812: vi = vo;
| 0A90 2A40 MOVEA.L D0,A5
; 813:
; 814: vo = SHClip(vi, BD_RIGHT, x2);
| 0A92 2040 MOVEA.L D0,A0
| 0A94 322F 0018 MOVE.W 0018(A7),D1
| 0A98 7002 MOVEQ #02,D0
| 0A9A 6100 003A BSR.W 0AD6
| 0A9E 2640 MOVEA.L D0,A3
; 815: KillVertex(vi);
| 0AA0 204D MOVEA.L A5,A0
| 0AA2 6100 FCA6 BSR.W 074A
; 816: vi = vo;
; 817:
; 818: vo = SHClip(vi, BD_TOP, y1);
| 0AA6 2206 MOVE.L D6,D1
| 0AA8 204B MOVEA.L A3,A0
| 0AAA 7003 MOVEQ #03,D0
| 0AAC 6100 0028 BSR.W 0AD6
| 0AB0 2A40 MOVEA.L D0,A5
; 819: KillVertex(vi);
| 0AB2 204B MOVEA.L A3,A0
| 0AB4 6100 FC94 BSR.W 074A
; 820: vi = vo;
; 821:
; 822: vo = SHClip(vi, BD_BOTTOM, y2);
| 0AB8 322F 001A MOVE.W 001A(A7),D1
| 0ABC 204D MOVEA.L A5,A0
| 0ABE 7004 MOVEQ #04,D0
| 0AC0 6100 0014 BSR.W 0AD6
| 0AC4 2640 MOVEA.L D0,A3
; 823: KillVertex(vi);
| 0AC6 204D MOVEA.L A5,A0
| 0AC8 6100 FC80 BSR.W 074A
; 824:
; 825: return(vo);
| 0ACC 200B MOVE.L A3,D0
| 0ACE 4CDF 2840 MOVEM.L (A7)+,D6/A3/A5
| 0AD2 504F ADDQ.W #8,A7
| 0AD4 4E75 RTS
; 826: }
; 827:
; 828: /**
; 829: *
; 830: * Polygon clipping against a single boundary
; 831: * Sutherland-Hodgman, Foley and Van dam page 454
; 832: * Modified to do just rectangular clips.
; 833: *
; 834: **/
; 835: static struct vtx *SHClip(vi, bordertype, bordervalue)
; 836: struct vtx *vi;
; 837: int bordertype, bordervalue;
| 0AD6 9EFC 000C SUBA.W #000C,A7
| 0ADA 48E7 0736 MOVEM.L D5-D7/A2-A3/A5-A6,-(A7)
| 0ADE 2C01 MOVE.L D1,D6
| 0AE0 2E00 MOVE.L D0,D7
| 0AE2 2A48 MOVEA.L A0,A5
; 838: {
; 839: struct vtx *p, *s, *vo, *t, *u;
; 840: int first = 1;
| 0AE4 7A01 MOVEQ #01,D5
; 841: /*
; 842: * Find last vertex s
; 843: */
; 844: s = NULL;
| 0AE6 97CB SUBA.L A3,A3
; 845:
; 846: t = vi;
| 0AE8 244D MOVEA.L A5,A2
| 0AEA 2F4E 0020 MOVE.L A6,0020(A7)
; 847: while (t)
| 0AEE 600C BRA.B 0AFC
; 848: {
; 849: if (t->type == AREADRAW)
| 0AF0 7002 MOVEQ #02,D0
| 0AF2 B06A 0004 CMP.W 0004(A2),D0
| 0AF6 6602 BNE.B 0AFA
; 850: s = t;
| 0AF8 264A MOVEA.L A2,A3
; 851: t = t->next;
| 0AFA 2452 MOVEA.L (A2),A2
; 852: }
| 0AFC 200A MOVE.L A2,D0
| 0AFE 66F0 BNE.B 0AF0
; 853: /*
; 854: * If there is no last vertex, there is nothing to do
; 855: */
; 856: if (s == NULL)
; 857: return(NULL);
| 0B00 95CA SUBA.L A2,A2
| 0B02 200B MOVE.L A3,D0
| 0B04 6700 00DA BEQ.W 0BE0
; 858: /*
; 859: * Set up output vertex array
; 860: */
; 861: vo = AddVertex(NULL);
| 0B08 204A MOVEA.L A2,A0
| 0B0A 6100 FC00 BSR.W 070C
; 862: if (vo == NULL)
| 0B0E 2F40 001C MOVE.L D0,001C(A7)
| 0B12 6606 BNE.B 0B1A
; 863: return(NULL);
| 0B14 7000 MOVEQ #00,D0
| 0B16 6000 00CA BRA.W 0BE2
| 0B1A 2C6F 0020 MOVEA.L 0020(A7),A6
; 864: /*
; 865: * Loop over the list
; 866: */
; 867: while (vi)
| 0B1E 6000 00B2 BRA.W 0BD2
; 868: {
; 869: /*
; 870: * Skip non-vertices.
; 871: */
; 872: if ((vi->type == AREAMOVE) || (vi->type == AREADRAW))
| 0B22 302D 0004 MOVE.W 0004(A5),D0
| 0B26 7201 MOVEQ #01,D1
| 0B28 B041 CMP.W D1,D0
| 0B2A 6706 BEQ.B 0B32
| 0B2C 5540 SUBQ.W #2,D0
| 0B2E 6600 0092 BNE.W 0BC2
; 873: {
; 874: p = vi;
; 875: /*
; 876: * Now s and p correspond to the vertices in Fig. 11.21 in
; 877: * Foley and Van Dam
; 878: */
; 879: if (inside(p, bordertype, bordervalue))
| 0B32 2007 MOVE.L D7,D0
| 0B34 2206 MOVE.L D6,D1
| 0B36 204D MOVEA.L A5,A0
| 0B38 6100 00EC BSR.W 0C26
| 0B3C 4A40 TST.W D0
| 0B3E 675E BEQ.B 0B9E
; 880: {
; 881: if (inside(s, bordertype, bordervalue))
| 0B40 2007 MOVE.L D7,D0
| 0B42 2206 MOVE.L D6,D1
| 0B44 204B MOVEA.L A3,A0
| 0B46 6100 00DE BSR.W 0C26
| 0B4A 4A40 TST.W D0
| 0B4C 670A BEQ.B 0B58
; 882: {
; 883: addvtx(vo, p);
| 0B4E 204A MOVEA.L A2,A0
| 0B50 224D MOVEA.L A5,A1
| 0B52 6100 0098 BSR.W 0BEC
| 0B56 6064 BRA.B 0BBC
; 884: }
; 885: else
; 886: {
; 887: t = addintersect(vo, s, p, bordertype, bordervalue);
| 0B58 2F0D MOVE.L A5,-(A7)
| 0B5A 2007 MOVE.L D7,D0
| 0B5C 2206 MOVE.L D6,D1
| 0B5E 204A MOVEA.L A2,A0
| 0B60 224B MOVEA.L A3,A1
| 0B62 6100 012A BSR.W 0C8E
| 0B66 2640 MOVEA.L D0,A3
; 888: u = addvtx(vo, p);
| 0B68 204A MOVEA.L A2,A0
| 0B6A 224D MOVEA.L A5,A1
| 0B6C 6100 007E BSR.W 0BEC
| 0B70 584F ADDQ.W #4,A7
| 0B72 2240 MOVEA.L D0,A1
; 889: /*
; 890: * Tricky: (only the first time!) if the first point is inside, but the
; 891: * previous point (which is the last point in the list) is outside,
; 892: * we want to reverse the functions of the two added points. The new
; 893: * intersect (t) becomes a "move", whereas the point at hand becomes a
; 894: * "draw" (if they were "draw" and "move" before). Reason: the intersect
; 895: * gets added *first*, even though it is the leftover of the *last* point.
; 896: */
; 897: if (first && t && u)
| 0B74 4A45 TST.W D5
| 0B76 6744 BEQ.B 0BBC
| 0B78 200B MOVE.L A3,D0
| 0B7A 6740 BEQ.B 0BBC
| 0B7C 2009 MOVE.L A1,D0
| 0B7E 673C BEQ.B 0BBC
; 898: {
; 899: if ((s->type == AREADRAW) && (p->type == AREAMOVE))
| 0B80 7002 MOVEQ #02,D0
| 0B82 206F 0024 MOVEA.L 0024(A7),A0
| 0B86 B068 0004 CMP.W 0004(A0),D0
| 0B8A 6630 BNE.B 0BBC
| 0B8C 7201 MOVEQ #01,D1
| 0B8E B26D 0004 CMP.W 0004(A5),D1
| 0B92 6628 BNE.B 0BBC
; 900: {
; 901: t->type = AREAMOVE;
| 0B94 3741 0004 MOVE.W D1,0004(A3)
; 902: u->type = AREADRAW;
| 0B98 3340 0004 MOVE.W D0,0004(A1)
| 0B9C 601E BRA.B 0BBC
; 903: }
; 904: }
; 905: }
; 906: }
; 907: else
; 908: {
; 909: if (inside(s, bordertype, bordervalue))
| 0B9E 2007 MOVE.L D7,D0
| 0BA0 2206 MOVE.L D6,D1
| 0BA2 204B MOVEA.L A3,A0
| 0BA4 6100 0080 BSR.W 0C26
| 0BA8 4A40 TST.W D0
| 0BAA 6710 BEQ.B 0BBC
; 910: {
; 911: addintersect(vo, s, p, bordertype, bordervalue);
| 0BAC 2F0D MOVE.L A5,-(A7)
| 0BAE 2007 MOVE.L D7,D0
| 0BB0 2206 MOVE.L D6,D1
| 0BB2 204A MOVEA.L A2,A0
| 0BB4 224B MOVEA.L A3,A1
| 0BB6 6100 00D6 BSR.W 0C8E
| 0BBA 584F ADDQ.W #4,A7
; 912: }
; 913: }
; 914: first = 0;
| 0BBC 7A00 MOVEQ #00,D5
; 915: /*
; 916: * Advance to next pair of vertices
; 917: */
; 918: s = p;
| 0BBE 264D MOVEA.L A5,A3
| 0BC0 600E BRA.B 0BD0
; 919: }
; 920: else
; 921: if (vi->type)
| 0BC2 4A6D 0004 TST.W 0004(A5)
| 0BC6 6708 BEQ.B 0BD0
; 922: {
; 923: /*
; 924: * If this is something other than AREADRAW or MOVE, but not NULL,
; 925: * copy it straight into the output.
; 926: */
; 927: addvtx(vo, vi);
| 0BC8 204A MOVEA.L A2,A0
| 0BCA 224D MOVEA.L A5,A1
| 0BCC 6100 001E BSR.W 0BEC
; 928: }
; 929: vi = vi->next;
| 0BD0 2A55 MOVEA.L (A5),A5
; 930: }
| 0BD2 2F4B 0024 MOVE.L A3,0024(A7)
| 0BD6 246F 001C MOVEA.L 001C(A7),A2
| 0BDA 200D MOVE.L A5,D0
| 0BDC 6600 FF44 BNE.W 0B22
; 931:
; 932: return(vo);
| 0BE0 200A MOVE.L A2,D0
| 0BE2 4CDF 6CE0 MOVEM.L (A7)+,D5-D7/A2-A3/A5-A6
| 0BE6 DEFC 000C ADDA.W #000C,A7
| 0BEA 4E75 RTS
; 933: }
; 934:
; 935: /**
; 936: *
; 937: * Add a vertex p to list vo.
; 938: *
; 939: **/
; 940: static struct vtx *addvtx(vo, p)
; 941: struct vtx *vo, *p;
| 0BEC 514F SUBQ.W #8,A7
| 0BEE 48E7 0014 MOVEM.L A3/A5,-(A7)
| 0BF2 2A49 MOVEA.L A1,A5
; 942: {
; 943: struct vtx *t;
; 944:
; 945: if (t = AddVertex(vo))
| 0BF4 2F48 0008 MOVE.L A0,0008(A7)
| 0BF8 2F4E 000C MOVE.L A6,000C(A7)
| 0BFC 6100 FB0E BSR.W 070C
| 0C00 2040 MOVEA.L D0,A0
| 0C02 4A80 TST.L D0
| 0C04 6716 BEQ.B 0C1C
; 946: {
; 947: t->type = p->type;
| 0C06 47ED 0004 LEA 0004(A5),A3
; 948: t->x = p->x;
| 0C0A 43E8 0004 LEA 0004(A0),A1
; 949: t->y = p->y;
| 0C0E 32DB MOVE.W (A3)+,(A1)+
; 950: t->a = p->a;
| 0C10 32DB MOVE.W (A3)+,(A1)+
; 951: t->b = p->b;
| 0C12 32DB MOVE.W (A3)+,(A1)+
| 0C14 32ED 000A MOVE.W 000A(A5),(A1)+
| 0C18 32ED 000C MOVE.W 000C(A5),(A1)+
; 952: }
; 953: return(t);
| 0C1C 2008 MOVE.L A0,D0
| 0C1E 4CDF 2800 MOVEM.L (A7)+,A3/A5
| 0C22 504F ADDQ.W #8,A7
| 0C24 4E75 RTS
; 954: }
; 955:
; 956: /**
; 957: *
; 958: * Determine whether a vertex is inside or outside the border
; 959: *
; 960: **/
; 961: static int inside(s, bordertype, bordervalue)
; 962: struct vtx *s;
; 963: int bordertype, bordervalue;
| 0C26 594F SUBQ.W #4,A7
| 0C28 48E7 0300 MOVEM.L D6-D7,-(A7)
| 0C2C 2C01 MOVE.L D1,D6
| 0C2E 2E00 MOVE.L D0,D7
| 0C30 2F4E 0008 MOVE.L A6,0008(A7)
; 964: {
; 965: if (s)
| 0C34 2008 MOVE.L A0,D0
| 0C36 674C BEQ.B 0C84
; 966: {
; 967: switch (bordertype)
| 0C38 3007 MOVE.W D7,D0
| 0C3A 5340 SUBQ.W #1,D0
| 0C3C 670E BEQ.B 0C4C
| 0C3E 5340 SUBQ.W #1,D0
| 0C40 6718 BEQ.B 0C5A
| 0C42 5340 SUBQ.W #1,D0
| 0C44 6722 BEQ.B 0C68
| 0C46 5340 SUBQ.W #1,D0
| 0C48 672C BEQ.B 0C76
| 0C4A 6038 BRA.B 0C84
; 968: {
; 969: case BD_LEFT :
; 970: return(s->x >= bordervalue);
| 0C4C 3228 0006 MOVE.W 0006(A0),D1
| 0C50 B246 CMP.W D6,D1
| 0C52 5CC0 SGE D0
| 0C54 4400 NEG.B D0
| 0C56 4880 EXT.W D0
| 0C58 602C BRA.B 0C86
; 971: break;
; 972: case BD_RIGHT :
; 973: return(s->x < bordervalue);
| 0C5A 3228 0006 MOVE.W 0006(A0),D1
| 0C5E B246 CMP.W D6,D1
| 0C60 5DC0 SLT D0
| 0C62 4400 NEG.B D0
| 0C64 4880 EXT.W D0
| 0C66 601E BRA.B 0C86
; 974: break;
; 975: case BD_TOP :
; 976: return(s->y >= bordervalue);
| 0C68 3228 0008 MOVE.W 0008(A0),D1
| 0C6C B246 CMP.W D6,D1
| 0C6E 5CC0 SGE D0
| 0C70 4400 NEG.B D0
| 0C72 4880 EXT.W D0
| 0C74 6010 BRA.B 0C86
; 977: break;
; 978: case BD_BOTTOM :
; 979: return(s->y < bordervalue);
| 0C76 3228 0008 MOVE.W 0008(A0),D1
| 0C7A B246 CMP.W D6,D1
| 0C7C 5DC0 SLT D0
| 0C7E 4400 NEG.B D0
| 0C80 4880 EXT.W D0
| 0C82 0C40 7000 CMPI.W #7000,D0
; 980: break;
; 981: }
; 982: }
; 983: return(0);
| 0C86 4CDF 00C0 MOVEM.L (A7)+,D6-D7
| 0C8A 584F ADDQ.W #4,A7
| 0C8C 4E75 RTS
; 984: }
; 985:
; 986: /**
; 987: *
; 988: * Add the intersect of vectors s and p with the border to list vo
; 989: * Routine assumes that one vector is inside, the other outside (no
; 990: * particular order).
; 991: *
; 992: **/
; 993: static struct vtx *addintersect(vo, s, p, bordertype, bordervalue)
; 994: struct vtx *vo, *s, *p;
; 995: int bordertype, bordervalue;
| 0C8E 514F SUBQ.W #8,A7
| 0C90 48E7 3B14 MOVEM.L D2-D4/D6-D7/A3/A5,-(A7)
| 0C94 2C01 MOVE.L D1,D6
| 0C96 2E00 MOVE.L D0,D7
| 0C98 266F 0028 MOVEA.L 0028(A7),A3
| 0C9C 2A49 MOVEA.L A1,A5
; 996: {
; 997: struct vtx *v;
; 998:
; 999: v = AddVertex(vo);
| 0C9E 2F48 001C MOVE.L A0,001C(A7)
| 0CA2 2F4E 0020 MOVE.L A6,0020(A7)
| 0CA6 6100 FA64 BSR.W 070C
| 0CAA 2040 MOVEA.L D0,A0
;1000:
;1001: if (s && p && v)
| 0CAC 200D MOVE.L A5,D0
| 0CAE 6700 0092 BEQ.W 0D42
| 0CB2 200B MOVE.L A3,D0
| 0CB4 6700 008C BEQ.W 0D42
| 0CB8 2008 MOVE.L A0,D0
| 0CBA 6700 0086 BEQ.W 0D42
;1002: {
;1003: v->type = p->type;
| 0CBE 316B 0004 0004 MOVE.W 0004(A3),0004(A0)
;1004:
;1005: switch (bordertype)
| 0CC4 3007 MOVE.W D7,D0
| 0CC6 5340 SUBQ.W #1,D0
| 0CC8 670E BEQ.B 0CD8
| 0CCA 5340 SUBQ.W #1,D0
| 0CCC 670A BEQ.B 0CD8
| 0CCE 5340 SUBQ.W #1,D0
| 0CD0 673C BEQ.B 0D0E
| 0CD2 5340 SUBQ.W #1,D0
| 0CD4 6738 BEQ.B 0D0E
| 0CD6 606A BRA.B 0D42
;1006: {
;1007: case BD_LEFT :
;1008: case BD_RIGHT :
;1009: v->x = bordervalue;
| 0CD8 3146 0006 MOVE.W D6,0006(A0)
;1010: v->y = s->y + (int) (((long) (bordervalue - s->x) * (p->y - s->y)) /
| 0CDC 3006 MOVE.W D6,D0
| 0CDE 322D 0006 MOVE.W 0006(A5),D1
| 0CE2 9041 SUB.W D1,D0
| 0CE4 342D 0008 MOVE.W 0008(A5),D2
| 0CE8 362B 0008 MOVE.W 0008(A3),D3
| 0CEC 9642 SUB.W D2,D3
;1011: (p->x - s->x));
| 0CEE 382B 0006 MOVE.W 0006(A3),D4
| 0CF2 9841 SUB.W D1,D4
| 0CF4 48C4 EXT.L D4
| 0CF6 48C3 EXT.L D3
| 0CF8 48C0 EXT.L D0
| 0CFA 2203 MOVE.L D3,D1
| 0CFC 6100 0000-XX.1 BSR.W __CXM33
| 0D00 2204 MOVE.L D4,D1
| 0D02 6100 0000-XX.1 BSR.W __CXD33
| 0D06 D440 ADD.W D0,D2
| 0D08 3142 0008 MOVE.W D2,0008(A0)
;1012: break;
| 0D0C 6034 BRA.B 0D42
;1013: case BD_TOP :
;1014: case BD_BOTTOM :
;1015: v->y = bordervalue;
| 0D0E 3146 0008 MOVE.W D6,0008(A0)
;1016: v->x = s->x + (int) (((long) (bordervalue - s->y) * (p->x - s->x)) /
| 0D12 3006 MOVE.W D6,D0
| 0D14 322D 0008 MOVE.W 0008(A5),D1
| 0D18 9041 SUB.W D1,D0
| 0D1A 342D 0006 MOVE.W 0006(A5),D2
| 0D1E 362B 0006 MOVE.W 0006(A3),D3
| 0D22 9642 SUB.W D2,D3
;1017: (p->y - s->y));
| 0D24 382B 0008 MOVE.W 0008(A3),D4
| 0D28 9841 SUB.W D1,D4
| 0D2A 48C4 EXT.L D4
| 0D2C 48C3 EXT.L D3
| 0D2E 48C0 EXT.L D0
| 0D30 2203 MOVE.L D3,D1
| 0D32 6100 0000-XX.1 BSR.W __CXM33
| 0D36 2204 MOVE.L D4,D1
| 0D38 6100 0000-XX.1 BSR.W __CXD33
| 0D3C D440 ADD.W D0,D2
| 0D3E 3142 0006 MOVE.W D2,0006(A0)
;1018: break;
;1019: }
| 0D42 2008 MOVE.L A0,D0
| 0D44 4CDF 28DC MOVEM.L (A7)+,D2-D4/D6-D7/A3/A5
| 0D48 504F ADDQ.W #8,A7
| 0D4A 4E75 RTS
SECTION 01 "__MERGED" 000001A4 BYTES
0000 04 04 0A 0A 11 11 A0 A0 40 40 A0 A0 11 11 0A 0A ...... @@ ....
0010 04 04 08 08 10 10 20 20 40 40 20 20 10 10 08 08 ...... @@ ....
0020 10 10 00 00 00 00 00 00 01 01 82 82 44 44 28 28 ............DD((
0030 00 00 00 00 FF FF 00 00 00 00 00 00 00 00 00 00 ................
0040 10 10 10 10 10 10 10 10 10 10 FF FF 10 10 10 10 ................
OFFSETS 0050 THROUGH 005F CONTAIN ZERO
0060 04 04 04 04 04 04 FF FF 80 80 80 80 80 80 FF FF ................
OFFSETS 0070 THROUGH 007F CONTAIN ZERO
0080 10 10 80 80 40 40 20 20 10 10 08 08 04 04 02 02 ....@@ ........
0090 01 01 00 00 55 55 00 00 AA AA 11 11 44 44 88 88 ....UU..**..DD..
00A0 44 44 22 22 00 00 44 44 00 00 00 00 00 00 00 00 DD""..DD........
00B0 88 88 11 11 11 11 11 11 00 00 33 33 33 33 33 33 ..........333333
00C0 33 33 33 33 33 33 33 33 33 33 0F 0F 0F 0F 0F 0F 3333333333......
00D0 0F 0F 0F 0F 0F 0F 0F 0F 0F 0F 00 FF 00 FF 00 FF ................
00E0 00 FF 00 FF 00 FF 00 FF 00 FF 81 FC C3 13 7D 22 ...........|C.}"
00F0 20 F2 E1 9F 1F 84 08 C6 7E 62 00 03 ra....F~b..
00FC 00000000-01 01.00000000
0100 00 03 ..
0102 00000010-01 01.00000010
0106 00 03 ..
0108 00000020-01 01.00000020
010C 00 03 ..
010E 00000030-01 01.00000030
0112 00 03 ..
0114 00000040-01 01.00000040
0118 FF FD .}
011A 00000050-01 01.00000050
OFFSETS 011E THROUGH 011F CONTAIN ZERO
0120 00000080-01 01.00000080
0124 00 03 ..
0126 00000082-01 01.00000082
012A 00 02 ..
012C 00000092-01 01.00000092
0130 00 01 ..
0132 0000009A-01 01.0000009A
0136 00 02 ..
0138 0000009E-01 01.0000009E
013C 00 01 ..
013E 000000A6-01 01.000000A6
0142 00 02 ..
0144 000000AA-01 01.000000AA
0148 00 02 ..
014A 000000B2-01 01.000000B2
014E FF FD .}
0150 000000BA-01 01.000000BA
0154 00 03 ..
0156 000000EA-01 01.000000EA
015A 00 00 00 00 AA AA ....**
0160 00 00 55 55 00 00 FF FF 00 00 00 00 AA AA AA AA ..UU........****
0170 AA AA 55 55 AA AA FF FF AA AA 00 00 55 55 AA AA **UU**..**..UU**
0180 55 55 55 55 55 55 FF FF 55 55 00 00 FF FF AA AA UUUUUU..UU....**
0190 FF FF 55 55 FF FF FF FF FF FF 00 00 00 03 00 01 ..UU............
01A0 00 02 00 00 ....
SECTION 02 "__MERGED" 00000008 BYTES