|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 8755 (0x2233)
Types: TextFile
Names: »bitblt_apa16.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki
└─⟦526ad3590⟧ »EUUGD11/gnu-31mar87/X.V10.R4.tar.Z«
└─⟦2109abc41⟧
└─⟦this⟧ »./X.V10R4/libibm/bitblt/bitblt_apa16.c«
#ifndef lint
static char *rcsid_bitblt_apa16_c = "$Header: bitblt_apa16.c,v 10.1 86/11/19 10:50:57 jg Exp $";
#endif lint
/*
* This file contains routines to do hardware bit block transfers (bitblt's)
* on the APA-16.
*
* Copyright (c) 1986 Brown University
*
* Permission to use, copy, modify and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appear in all copies, and that both
* that copyright notice and this permission notice appear in supporting
* documentation, and that the name of Brown University not be used in
* advertising or publicity pertaining to distribution of the software without
* specific, written prior permission. Brown University makes no
* representations about the suitability of this software for any purpose.
* It is provided "as-is" without express or implied warranty.
*
* Written by Daniel Stone, Brown University/IRIS, April 23, 1986.
*/
#if (APA16 && USE_APA16_HDWR)
#include "bitblt_int.h"
#include "bitblt_apa16.h"
/*
* This array indicates whether or not the coorisponding combination rule
* can be done in hardware. A non-zero indicates the hardware can do it.
*/
#define NO_FUNC 0
unsigned short execute_cmd[32] = {
BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_CLEAR), /* DstClear 0 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_DSTandSRC),/* SrcAnd 1 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_NotDSTandSRC),/*SrcAndNotDst2*/
BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_COPYSRC), /* SrcCopy 3 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_DSTandNotSRC),/* NotSrcAnd 4 */
NO_FUNC, /* DstCopy 5 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_DSTxorSRC), /* SrcXor 6 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_DSTorSRC), /* SrcOr 7 */
NO_FUNC, /* NotSrcAndNotDst 8 */
NO_FUNC, /* NotSrcXor 9 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_NotDST), /*NotDstCopy 10*/
NO_FUNC, /* SrcOrNotDst 11*/
NO_FUNC, /* NotSrcCopy 12 */
NO_FUNC, /* NotSrcOr 13 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_NotDSTorNotSRC),
/* NotSrcOrNotDst 14*/
BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_SET), /* DstSet 15 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_CLEAR),/* TileDstClear 16 */
NO_FUNC, /* TileAnd 17 */
NO_FUNC, /* TileAndNotDst 18 */
NO_FUNC, /* TileCopy 19 */
NO_FUNC, /* NotTileAnd 20 */
NO_FUNC, /* TileDstCopy 21 */
NO_FUNC, /* TileXor 22 */
NO_FUNC, /* TileOr 23 */
NO_FUNC, /* NotTileAndNotDst 24 */
NO_FUNC, /* NotTileXor 25 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_NotDST),/*TileNotDstCopy 26 */
NO_FUNC, /* TileOrNotDst 27 */
NO_FUNC, /* NotTileCopy 28 */
NO_FUNC, /* NotTileOr 29 */
NO_FUNC, /* NotTileOrNotDst 30 */
BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_SET),/* TileDstSet 31 */
};
/*
* Set up hardware to do screen to screen copy then do it.
* Returns 1 if the hardware couldn't handle it (should never happen) and 0
* if the blt was successful.
*/
apa16_StoS(sv)
register Blt_sysdata *sv; /* System variables */
{
register unsigned short *Qptr = (unsigned short *)LAST_QUE_APA16BASE;
register tmp; /* just a garbage register */
int c;
/*
* Check the destination and source bitmap pointers to the screen.
* If they are different than the start address of the screen then
* offset each rectangle.
*/
if (sv->dst.data > (unsigned short *)APA16BASE) {
/*
* Take apart the address. Note the address is in bytes
* corner_x is in bits so it must be multiplied by 8.
*/
sv->dst.rect.corner_x += (((long)sv->dst.data & 0x7F) << 3);
sv->dst.rect.corner_y += (((long)sv->dst.data & 0x7FF80) >> 7);
}
if (sv->src.data > (unsigned short *)APA16BASE) {
/*
* Take apart the address. Note the address is in bytes
* corner_x is in bits so it must be multiplied by 8.
*/
sv->src.rect.corner_x += (((long)sv->src.data & 0x7F) << 3);
sv->src.rect.corner_y += (((long)sv->src.data & 0x7FF80) >> 7);
}
/*
* Wait for the previous command to finish.
*/
WAIT_QUE(c,sv->rule);
/*
* Load the the instructions that tell the queue command
* processor to load:
* - The X and Y destination registers with the bottom
* right corner of the screen area where the
* destination rectangle resides.
*
* - The X and Y source registers with the bottom right
* corner of the source screen area.
*
* - The destination width and height registers with the
* width and height of the rectangle to be moved.
*
* Then load an execute command instruction with one of the copy source
* logic functions and a Raster Operation Type (ROT) of copy screen
* to screen.
*/
*Qptr-- = BUILD_REGLOAD(XDST_REG,sv->dst.rect.corner_x+1);
*Qptr-- = BUILD_REGLOAD(RECT_YDST_REG,sv->dst.rect.corner_y+1);
*Qptr-- = BUILD_REGLOAD(XSRC_REG,sv->src.rect.corner_x+1);
*Qptr-- = BUILD_REGLOAD(YSRC_REG,sv->src.rect.corner_y+1);
*Qptr-- = BUILD_REGLOAD(WIDTH_REG,(sv->width & 1023));
*Qptr-- = BUILD_REGLOAD(RECT_HEIGHT_REG,(sv->height & 1023));
*Qptr = execute_cmd[sv->rule];
*QUE_PTR_R = SPTR_TO_QPTR(LAST_QUE_APA16BASE);
INCR_QUE_COUNT(tmp);
return(0);
}
#ifdef notdef
/*
* Set up hardware to do memory to screen copy then do it.
* Returns 1 if the hardware couldn't handle it (should never happen) and
* 0 if the blt was successful.
*/
apa16_MtoS(sv)
register Blt_sysdata *sv; /* System variables */
{
register unsigned short *Qptr = (unsigned short *)LAST_QUE_APA16BASE;
register tmp; /* just a garbage register */
int c;
/*
* Wait for the previous command to finish.
*/
WAIT_QUE(c,sv->rule);
/*
* Load the the instructions that tell the queue command
* processor to load:
* - The high,middle and low bytes of the source address into
* the APA-16 hardware registers.
*
* - The starting bit of the starting source word.
*
* - The number of shorts needed to increment the destination
* pointer to the next scanline.
*
* - The X and Y destination corner points plus 1 because
* it uses these points exclusively.
*
* - The destination width and height registers with the
* width and height of the rectangle to be moved.
*
* Then load an execute command instruction with one of the copy source
* logic functions and a Raster Operation Type (ROT) of memory to
* screen (TDMA).
*/
*Qptr-- = BUILD_REGLOAD(REG_HIGHBYTE,HIGH_BYTE(sv->src.data));
*Qptr-- = BUILD_REGLOAD(REG_LOWBYTE,MID_BYTE(sv->src.data));
*Qptr-- = BUILD_REGLOAD(REG_Y_SRC,LOW_BYTE(sv->src.data));
*Qptr-- = BUILD_REGLOAD(REG_GEN_B,MOD_BPW(sv->src.rect.origin_x));
*Qptr-- = BUILD_REGLOAD(REG_GEN_A,sv->src.nextline);
*Qptr-- = BUILD_REGLOAD(REG_X_DST,sv->dst.rect.corner_x+1);
*Qptr-- = BUILD_REGLOAD(REG_Y_DST,sv->dst.rect.corner_y+1);
*Qptr-- = BUILD_REGLOAD(REG_X_SRC,(sv->width & 1023));
*Qptr-- = BUILD_REGLOAD(REG_Y_LOOP,(sv->height & 1023));
/*
* This HACK works, but only because ROT_TDDMA has all the bits
* on anyway. To do this right one would do:
* (execute_cmd[sv->rule] & 0x03f0) | 0x03f0
*/
*Qptr = (execute_cmd[sv->rule] | ROT_TDDMA);
/*
* Set up the queue pointer register and execute the command.
*/
*QUE_PTR_R = SPTR_TO_QPTR(LAST_QUE_APA16BASE);
/*
* I think I have to enable DMA first.
*/
ENABLE_DMA_PROC(tmp);
INCR_QUE_COUNT(tmp);
return(0);
}
#endif notdef
/*
* Depending on the tile rule, copy the tile to the hidden area of the
* screen and then set up a string of queue commands to move the tile to the
* screen.
*/
apa16_copyTile(sv)
register Blt_sysdata *sv; /* System variables */
{
register unsigned short *Qptr = (unsigned short *)LAST_QUE_APA16BASE;
register tmp; /* just a garbage register */
int c;
/*
* Wait for the previous command to finish.
*/
WAIT_QUE(c,sv->rule);
/*
* Check and see if this tile combination rule is a destination only
* rule like DstClear, TileDstClear, NotDstCopy, TileNotDstCopy,
* DstSet, TileDstSet.
*/
if (IS_ROT_WRDST(execute_cmd[sv->rule])) {
*Qptr-- = BUILD_REGLOAD(XDST_REG,sv->dst.rect.corner_x+1);
*Qptr-- = BUILD_REGLOAD(YDST_REG,sv->dst.rect.corner_y+1);
*Qptr-- = BUILD_REGLOAD(WIDTH_REG,(sv->width & 1023));
*Qptr-- = BUILD_REGLOAD(HEIGHT_REG,(sv->height & 1023));
*Qptr = execute_cmd[sv->rule];
/*
* Set up the queue pointer register and execute the command.
*/
*QUE_PTR_R = SPTR_TO_QPTR(LAST_QUE_APA16BASE);
INCR_QUE_COUNT(tmp);
}
else {
/*
* Must copy the tile to the hidden area of the screen
* and then setup a series of que commands to copy it to
* the screen.
*/
return(1);
}
return(0);
}
#endif APA16 && USE_APA16_HDWR