Pararena2/Sources/DissBits.c

1 line
9.1 KiB
C
Executable File

//============================================================
//============================================================
//== ==
//== DissBits Routines ==
//== ==
//============================================================
//============================================================
//======================================================== Includes
#include "Globals.h"
#include "UnivUtilities.h"
#include "DissBits.h"
//======================================================== DissBitsMed13QD
void DissBits13QD (Rect *clippedRect)
{
Rect transRect;
RgnHandle clipRgn;
register short value = 1;
register short mask = 0x0CA0;
short rectH, rectV;
clipRgn = NewRgn();
RectRgn(clipRgn, clippedRect);
do
{
if (value & 1) // pseudo-random # between 1 and 4095
value = (value >> 1) ^ mask;
else
value = (value >> 1);
rectH = (value % 80) * 8; // convert value into screen coords
rectV = ((value / 80) * 10) + clippedRect->top;
SetRect(&transRect, rectH, rectV, rectH + 8, rectV + 10);
if (isColor) // copy bits within rect to mainWndo
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
&transRect, &transRect, srcCopy, clipRgn);
else
CopyBits(&offWorkBits, &(mainWndo->portBits), &transRect, &transRect,
srcCopy, clipRgn);
} while (value != 1);
rectH = 0; // handle special case for zero
rectV = clippedRect->top;
SetRect(&transRect, rectH, rectV, rectH + 8, rectV + 10);
if (isColor)
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
&transRect, &transRect, srcCopy, clipRgn);
else
CopyBits(&offWorkBits, &(mainWndo->portBits), &transRect, &transRect,
srcCopy, clipRgn);
DisposeRgn(clipRgn);
}
//======================================================== DissBits12QD
void DissBits12QD (Rect *clippedRect)
{
Rect transRect;
RgnHandle clipRgn;
register short value = 1;
register short mask = 0x0500;
short rectH, rectV;
clipRgn = NewRgn();
RectRgn(clipRgn, clippedRect);
do
{
if (value & 1) // pseudo-random # between 1 and 2047
value = (value >> 1) ^ mask;
else
value = (value >> 1);
rectH = (value % 64) * 8; // convert # into screen coords
rectV = ((value / 64) * 12) + clippedRect->top;
SetRect(&transRect, rectH, rectV, rectH + 8, rectV + 12);
if (isColor) // copy bits within rect to mainWndo
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
&transRect, &transRect, srcCopy, clipRgn);
else
CopyBits(&offWorkBits, &(mainWndo->portBits), &transRect, &transRect,
srcCopy, clipRgn);
} while (value != 1);
rectH = 0; // handle special case for zero
rectV = clippedRect->top;
SetRect(&transRect, rectH, rectV, rectH + 8, rectV + 12);
if (isColor)
CopyBits(&((GrafPtr)offCWorkPtr)->portBits, &(((GrafPtr)mainWndo)->portBits),
&transRect, &transRect, srcCopy, clipRgn);
else
CopyBits(&offWorkBits, &(mainWndo->portBits), &transRect, &transRect,
srcCopy, clipRgn);
DisposeRgn(clipRgn);
}
//======================================================== DissBits13Assm4
void DissBits13Assm4 (Rect *clippedRect)
{
Point zeroPt;
long screenOffset, workOffset;
short mask = 0x3500;
short value = 1;
short rectH, rectV, rowsThen;
char theMode;
SetPt(&zeroPt, 0, 0);
ShieldCursor(clippedRect, zeroPt);
theMode = true32b;
SwapMMUMode(&theMode);
do
{
if (value & 1) // produces # between 1 and 16383
value = (value >> 1) ^ mask;
else
value = (value >> 1);
rectH = (value % 160) * 4; // convert to screen coords
rectV = ((value / 160) * 5) + clippedRect->top;
if (rectV > (clippedRect->bottom - 5))
{
rowsThen = clippedRect->bottom - rectV;
if (rowsThen > 0)
{
workOffset = (long)((long)rectH >> 1) + workRowOffsets[rectV] +
(long)offWorkPix;
screenOffset = (long)((long)rectH >> 1) + screenRowAddrs[rectV];
asm 68000
{
move.l workOffset, a0 ; source
move.l screenOffset, a1 ; destination
move.w workRowBytes, d0
move.w screenRowBytes, d1
move.w rowsThen, d2 ; how many rows
@1 move.w (a0),(a1) ; move a row
adda.w d0, a0
adda.w d1, a1
subq.w #1, d2 ; decrement counter
bne @1 ; branch if not zero
}
}
}
else
{
workOffset = (long)((long)rectH >> 1) + workRowOffsets[rectV] +
(long)offWorkPix;
screenOffset = (long)((long)rectH >> 1) + screenRowAddrs[rectV];
asm 68000
{
move.l workOffset, a0 ; source
move.l screenOffset, a1 ; dest
move.w workRowBytes, d0
move.w screenRowBytes, d1
move.w (a0),(a1) ; move row 1
adda.w d0, a0
adda.w d1, a1
move.w (a0),(a1) ; move row 2
adda.w d0, a0
adda.w d1, a1
move.w (a0),(a1) ; move row 3
adda.w d0, a0
adda.w d1, a1
move.w (a0),(a1) ; move row 4
adda.w d0, a0
adda.w d1, a1
move.w (a0),(a1) ; move row 5
}
}
} while (value != 1);
rectH = 0; // handle special case for zero
rectV = clippedRect->top;
workOffset = (long)((long)rectH >> 1) + workRowOffsets[rectV] +
(long)offWorkPix;
screenOffset = (long)((long)rectH >> 1) + screenRowAddrs[rectV];
asm 68000
{
move.l workOffset, a0 ; source
move.l screenOffset, a1 ; destination
move.w workRowBytes, d0
move.w screenRowBytes, d1
move.w (a0),(a1) ; move row 1
adda.w d0, a0
adda.w d1, a1
move.w (a0),(a1) ; move row 2
adda.w d0, a0
adda.w d1, a1
move.w (a0),(a1) ; move row 3
adda.w d0, a0
adda.w d1, a1
move.w (a0),(a1) ; move row 4
adda.w d0, a0
adda.w d1, a1
move.w (a0),(a1) ; move row 5
}
SwapMMUMode(&theMode);
ShowCursor();
}
//======================================================== DissBits12Assm4
void DissBits12Assm4 (Rect *clippedRect)
{
Point zeroPt;
long screenOffset, workOffset;
short value = 1;
short mask = 0x1B00;
short rectH, rectV, rowsThen;
char theMode;
SetPt(&zeroPt, 0, 0);
ShieldCursor(clippedRect, zeroPt);
theMode = true32b;
SwapMMUMode(&theMode);
do
{
if (value & 1) // produces value between 1 and 8191
value = (value >> 1) ^ mask;
else
value = (value >> 1);
rectH = (value % 128) << 2; // convert to screen coords
rectV = ((value / 128) * 6) + clippedRect->top;
if (rectV > clippedRect->bottom - 6)
{
rowsThen = clippedRect->bottom - rectV;
if (rowsThen > 0)
{
screenOffset = (rectH >> 1) + screenRowAddrs[rectV];
workOffset = (long)((long)rectH >> 1) + workRowOffsets[rectV] +
(long)offWorkPix;
asm 68000
{
move.l screenOffset, a0
move.l workOffset, a1
move.w screenRowBytes, d0
move.w workRowBytes, d1
move.w rowsThen, d2
@1 move.w (a1),(a0) ; move a row
adda.w d0, a0
adda.w d1, a1
subq.w #1, d2 ; decrement counter
bne @1 ; branch if not zero
}
}
}
else
{
screenOffset = (rectH >> 1) + screenRowAddrs[rectV];
workOffset = (long)((long)rectH >> 1) + workRowOffsets[rectV] +
(long)offWorkPix;
asm 68000
{
move.l screenOffset, a0
move.l workOffset, a1
move.w screenRowBytes, d0
move.w workRowBytes, d1
move.w (a1),(a0) ; move row 1
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 2
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 3
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 4
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 5
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 6
}
}
} while (value != 1);
rectH = 0; // handle special case for zero
rectV = clippedRect->top;
screenOffset = (rectH >> 1) + screenRowAddrs[rectV];
workOffset = (long)((long)rectH >> 1) + workRowOffsets[rectV] +
(long)offWorkPix;
asm 68000
{
move.l screenOffset, a0
move.l workOffset, a1
move.w screenRowBytes, d0
move.w workRowBytes, d1
move.w (a1),(a0) ; move row 1
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 2
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 3
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 4
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 5
adda.w d0, a0
adda.w d1, a1
move.w (a1),(a0) ; move row 6
}
SwapMMUMode(&theMode);
ShowCursor();
}
//======================================================== DissolveWorkToMain
void DissolveWorkToMain (void)
{
switch (displayMode)
{
case kDisplay9Inch:
case kDisplay12Inch:
if (useQD)
DissBits12QD(&offWorkRect);
else
{
if (isColor)
DissBits12Assm4(&offWorkRect);
else
DissBits12QD(&offWorkRect);
}
break;
case kDisplay13Inch:
if (useQD)
DissBits13QD(&offWorkRect);
else
{
if (isColor)
DissBits13Assm4(&offWorkRect);
else
DissBits13QD(&offWorkRect);
}
break;
default:
break;
}
}