Annotation of 43BSDTahoe/new/X/libibm/bitblt/bitblt_apa16.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char *rcsid_bitblt_apa16_c = "$Header: bitblt_apa16.c,v 10.1 86/11/19 10:50:57 jg Exp $";
        !             3: #endif lint
        !             4: /*
        !             5:  * This file contains routines to do hardware bit block transfers (bitblt's)
        !             6:  *  on the APA-16.
        !             7:  *
        !             8:  *             Copyright (c) 1986 Brown University
        !             9:  *
        !            10:  * Permission to use, copy, modify and distribute this software and its
        !            11:  * documentation for any purpose and without fee is hereby granted, provided
        !            12:  * that the above copyright notice appear in all copies, and that both
        !            13:  * that copyright notice and this permission notice appear in supporting
        !            14:  * documentation, and that the name of Brown University not be used in
        !            15:  * advertising or publicity pertaining to distribution of the software without
        !            16:  * specific, written prior permission. Brown University makes no
        !            17:  * representations about the suitability of this software for any purpose.
        !            18:  * It is provided "as-is" without express or implied warranty.
        !            19:  *
        !            20:  * Written by Daniel Stone, Brown University/IRIS, April 23, 1986.
        !            21:  */
        !            22: 
        !            23: #if (APA16 && USE_APA16_HDWR)
        !            24: 
        !            25: #include "bitblt_int.h"
        !            26: #include "bitblt_apa16.h"
        !            27: 
        !            28: /*
        !            29:  * This array indicates whether or not the coorisponding combination rule
        !            30:  * can be done in hardware.  A non-zero indicates the hardware can do it.
        !            31:  */
        !            32: #define NO_FUNC                0
        !            33: 
        !            34: unsigned short execute_cmd[32] = {
        !            35:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_CLEAR),     /* DstClear 0 */
        !            36:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_DSTandSRC),/* SrcAnd   1 */
        !            37:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_NotDSTandSRC),/*SrcAndNotDst2*/
        !            38:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_COPYSRC),  /* SrcCopy 3 */
        !            39:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_DSTandNotSRC),/* NotSrcAnd 4 */
        !            40:        NO_FUNC,        /* DstCopy         5 */
        !            41:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_DSTxorSRC),   /* SrcXor 6 */
        !            42:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_DSTorSRC),    /* SrcOr 7 */
        !            43:        NO_FUNC,        /* NotSrcAndNotDst 8 */
        !            44:        NO_FUNC,        /* NotSrcXor       9 */
        !            45:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_NotDST),       /*NotDstCopy 10*/
        !            46:        NO_FUNC,        /* SrcOrNotDst     11*/
        !            47:        NO_FUNC,        /* NotSrcCopy      12 */
        !            48:        NO_FUNC,        /* NotSrcOr        13 */
        !            49:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_RECTCP,LF_NotDSTorNotSRC),
        !            50:                                                        /* NotSrcOrNotDst 14*/
        !            51:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_SET),   /* DstSet          15 */
        !            52:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_CLEAR),/* TileDstClear     16 */
        !            53:        NO_FUNC,        /* TileAnd          17 */
        !            54:        NO_FUNC,        /* TileAndNotDst    18 */
        !            55:        NO_FUNC,        /* TileCopy         19 */
        !            56:        NO_FUNC,        /* NotTileAnd       20 */
        !            57:        NO_FUNC,        /* TileDstCopy      21 */
        !            58:        NO_FUNC,        /* TileXor          22 */
        !            59:        NO_FUNC,        /* TileOr           23 */
        !            60:        NO_FUNC,        /* NotTileAndNotDst 24 */
        !            61:        NO_FUNC,        /* NotTileXor       25 */
        !            62:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_NotDST),/*TileNotDstCopy   26 */
        !            63:        NO_FUNC,        /* TileOrNotDst     27 */
        !            64:        NO_FUNC,        /* NotTileCopy      28 */
        !            65:        NO_FUNC,        /* NotTileOr        29 */
        !            66:        NO_FUNC,        /* NotTileOrNotDst  30 */
        !            67:        BUILD_EXCMD(DECR_QUE_COUNT,ROT_WRDST,LF_SET),/* TileDstSet       31 */
        !            68: };
        !            69: 
        !            70: /*
        !            71:  * Set up hardware to do screen to screen copy then do it.
        !            72:  * Returns 1 if the hardware couldn't handle it (should never happen) and 0
        !            73:  * if the blt was successful.
        !            74:  */
        !            75: apa16_StoS(sv)
        !            76: register Blt_sysdata *sv;      /* System variables */
        !            77: {
        !            78:        register unsigned short *Qptr = (unsigned short *)LAST_QUE_APA16BASE;
        !            79:        register tmp;   /* just a garbage register */
        !            80:        int c;
        !            81: 
        !            82:        /*
        !            83:         * Check the destination and source bitmap pointers to the screen.
        !            84:         * If they are different than the start address of the screen then
        !            85:         * offset each rectangle.
        !            86:         */
        !            87:        if (sv->dst.data > (unsigned short *)APA16BASE) {
        !            88:                /*
        !            89:                 * Take apart the address.  Note the address is in bytes
        !            90:                 * corner_x is in bits so it must be multiplied by 8.
        !            91:                 */
        !            92:                sv->dst.rect.corner_x += (((long)sv->dst.data & 0x7F) << 3);
        !            93:                sv->dst.rect.corner_y += (((long)sv->dst.data & 0x7FF80) >> 7);
        !            94:        }
        !            95:  
        !            96:        if (sv->src.data > (unsigned short *)APA16BASE) {
        !            97:                /*
        !            98:                 * Take apart the address.  Note the address is in bytes
        !            99:                 * corner_x is in bits so it must be multiplied by 8.
        !           100:                 */
        !           101:                sv->src.rect.corner_x += (((long)sv->src.data & 0x7F) << 3);
        !           102:                sv->src.rect.corner_y += (((long)sv->src.data & 0x7FF80) >> 7);
        !           103:        }
        !           104: 
        !           105:        /*
        !           106:         * Wait for the previous command to finish.
        !           107:         */
        !           108:        WAIT_QUE(c,sv->rule);
        !           109: 
        !           110:        /*
        !           111:         * Load the the instructions that tell the queue command
        !           112:         * processor to load:
        !           113:         *      - The X and Y destination registers with the bottom
        !           114:         *        right corner of the screen area where the
        !           115:         *        destination rectangle resides.
        !           116:         *
        !           117:         *      - The X and Y source registers with the bottom right
        !           118:         *        corner of the source screen area.
        !           119:         *
        !           120:         *      - The destination width and height registers with the
        !           121:         *        width and height of the rectangle to be moved.
        !           122:         *
        !           123:         * Then load an execute command instruction with one of the copy source
        !           124:         * logic functions and a Raster Operation Type (ROT) of copy screen
        !           125:         * to screen.
        !           126:         */
        !           127:        *Qptr-- = BUILD_REGLOAD(XDST_REG,sv->dst.rect.corner_x+1);
        !           128:        *Qptr-- = BUILD_REGLOAD(RECT_YDST_REG,sv->dst.rect.corner_y+1);
        !           129:        *Qptr-- = BUILD_REGLOAD(XSRC_REG,sv->src.rect.corner_x+1);
        !           130:        *Qptr-- = BUILD_REGLOAD(YSRC_REG,sv->src.rect.corner_y+1);
        !           131:        *Qptr-- = BUILD_REGLOAD(WIDTH_REG,(sv->width & 1023));
        !           132:        *Qptr-- = BUILD_REGLOAD(RECT_HEIGHT_REG,(sv->height & 1023));
        !           133:        *Qptr = execute_cmd[sv->rule];
        !           134: 
        !           135:        *QUE_PTR_R = SPTR_TO_QPTR(LAST_QUE_APA16BASE);
        !           136: 
        !           137:        INCR_QUE_COUNT(tmp);
        !           138:        return(0);
        !           139: }
        !           140: 
        !           141: #ifdef notdef
        !           142: /*
        !           143:  * Set up hardware to do memory to screen copy then do it.
        !           144:  * Returns 1 if the hardware couldn't handle it (should never happen) and
        !           145:  * 0 if the blt was successful.
        !           146:  */
        !           147: apa16_MtoS(sv)
        !           148: register Blt_sysdata *sv;      /* System variables */
        !           149: {
        !           150:        register unsigned short *Qptr = (unsigned short *)LAST_QUE_APA16BASE;
        !           151:        register tmp;   /* just a garbage register */
        !           152:        int c;
        !           153: 
        !           154:        /*
        !           155:         * Wait for the previous command to finish.
        !           156:         */
        !           157:        WAIT_QUE(c,sv->rule);
        !           158: 
        !           159:        /*
        !           160:         * Load the the instructions that tell the queue command
        !           161:         * processor to load:
        !           162:         *      - The high,middle and low bytes of the source address into
        !           163:         *        the APA-16 hardware registers.
        !           164:         *
        !           165:         *      - The starting bit of the starting source word.
        !           166:         *
        !           167:         *      - The number of shorts needed to increment the destination
        !           168:         *        pointer to the next scanline.
        !           169:         *
        !           170:         *      - The X and Y destination corner points plus 1 because
        !           171:         *        it uses these points exclusively.
        !           172:         *
        !           173:         *      - The destination width and height registers with the
        !           174:         *        width and height of the rectangle to be moved.
        !           175:         *
        !           176:         * Then load an execute command instruction with one of the copy source
        !           177:         * logic functions and a Raster Operation Type (ROT) of memory to
        !           178:         * screen (TDMA).
        !           179:         */
        !           180:        *Qptr-- = BUILD_REGLOAD(REG_HIGHBYTE,HIGH_BYTE(sv->src.data));
        !           181:        *Qptr-- = BUILD_REGLOAD(REG_LOWBYTE,MID_BYTE(sv->src.data));
        !           182:        *Qptr-- = BUILD_REGLOAD(REG_Y_SRC,LOW_BYTE(sv->src.data));
        !           183: 
        !           184:        *Qptr-- = BUILD_REGLOAD(REG_GEN_B,MOD_BPW(sv->src.rect.origin_x));
        !           185:        *Qptr-- = BUILD_REGLOAD(REG_GEN_A,sv->src.nextline);
        !           186: 
        !           187:        *Qptr-- = BUILD_REGLOAD(REG_X_DST,sv->dst.rect.corner_x+1);
        !           188:        *Qptr-- = BUILD_REGLOAD(REG_Y_DST,sv->dst.rect.corner_y+1);
        !           189: 
        !           190:        *Qptr-- = BUILD_REGLOAD(REG_X_SRC,(sv->width & 1023));
        !           191:        *Qptr-- = BUILD_REGLOAD(REG_Y_LOOP,(sv->height & 1023));
        !           192: 
        !           193:        /*
        !           194:         * This HACK works, but only because ROT_TDDMA has all the bits
        !           195:         * on anyway.  To do this right one would do:
        !           196:         *      (execute_cmd[sv->rule] & 0x03f0) | 0x03f0
        !           197:         */
        !           198:        *Qptr = (execute_cmd[sv->rule] | ROT_TDDMA);
        !           199: 
        !           200:        /*
        !           201:         * Set up the queue pointer register and execute the command.
        !           202:         */
        !           203:        *QUE_PTR_R = SPTR_TO_QPTR(LAST_QUE_APA16BASE);
        !           204: 
        !           205:        /*
        !           206:         * I think I have to enable DMA first.
        !           207:         */
        !           208:        ENABLE_DMA_PROC(tmp);
        !           209:        INCR_QUE_COUNT(tmp);
        !           210: 
        !           211:        return(0);
        !           212: }
        !           213: #endif notdef
        !           214: 
        !           215: /*
        !           216:  * Depending on the tile rule, copy the tile to the hidden area of the
        !           217:  * screen and then set up a string of queue commands to move the tile to the
        !           218:  * screen.
        !           219:  */
        !           220: apa16_copyTile(sv)
        !           221: register Blt_sysdata *sv;      /* System variables */
        !           222: {
        !           223:        register unsigned short *Qptr = (unsigned short *)LAST_QUE_APA16BASE;
        !           224:        register tmp;   /* just a garbage register */
        !           225:        int c;
        !           226: 
        !           227:        /*
        !           228:         * Wait for the previous command to finish.
        !           229:         */
        !           230:        WAIT_QUE(c,sv->rule);
        !           231: 
        !           232:        /*
        !           233:         * Check and see if this tile combination rule is a destination only
        !           234:         * rule like DstClear, TileDstClear, NotDstCopy, TileNotDstCopy,
        !           235:         * DstSet, TileDstSet.
        !           236:         */
        !           237:        if (IS_ROT_WRDST(execute_cmd[sv->rule])) {
        !           238:                *Qptr-- = BUILD_REGLOAD(XDST_REG,sv->dst.rect.corner_x+1);
        !           239:                *Qptr-- = BUILD_REGLOAD(YDST_REG,sv->dst.rect.corner_y+1);
        !           240:                *Qptr-- = BUILD_REGLOAD(WIDTH_REG,(sv->width & 1023));
        !           241:                *Qptr-- = BUILD_REGLOAD(HEIGHT_REG,(sv->height & 1023));
        !           242:                *Qptr = execute_cmd[sv->rule];
        !           243: 
        !           244:                /*
        !           245:                 * Set up the queue pointer register and execute the command.
        !           246:                 */
        !           247:                *QUE_PTR_R = SPTR_TO_QPTR(LAST_QUE_APA16BASE);
        !           248: 
        !           249:                INCR_QUE_COUNT(tmp);
        !           250:        }
        !           251:        else {
        !           252:                /*
        !           253:                 * Must copy the tile to the hidden area of the screen
        !           254:                 * and then setup a series of que commands to copy it to
        !           255:                 * the screen.
        !           256:                 */
        !           257:                return(1);
        !           258:        }
        !           259: 
        !           260:        return(0);
        !           261: }
        !           262: #endif APA16 && USE_APA16_HDWR

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.