Annotation of hatari/src/blitter.c, revision 1.1.1.4

1.1.1.2   root        1: /*
1.1.1.3   root        2:  * Hatari - blitter.c
1.1.1.2   root        3:  *
                      4:  * This file is distributed under the GNU Public License, version 2 or at
                      5:  * your option any later version. Read the file gpl.txt for details.
                      6:  *
1.1.1.3   root        7:  * Blitter emulation.
                      8:  * This file has originally been taken from STonX.
1.1.1.4 ! root        9:  * 
        !            10:  * Changes 2005-10-21:
        !            11:  * - Convert types and helper functions to SDL and Hatari ones
        !            12:  * - LineNum -> Control (line number is just low nibble of control register)
        !            13:  * - Add defines for register addresses
        !            14:  * - Fix bug with Smudge mode
        !            15:  * - Add documentation
1.1       root       16:  *
                     17:  * Original information text follows:
                     18:  *
                     19:  *
                     20:  * This file is part of STonX, the Atari ST Emulator for Unix/X
                     21:  * ============================================================
                     22:  * STonX is free software and comes with NO WARRANTY - read the file
                     23:  * COPYING for details
                     24:  *
                     25:  *  Blitter Emulator,
                     26:  *  Martin Griffiths, 1995/96.
                     27:  *  
                     28:  *  Here lies the Atari Blitter Emulator - The 'Blitter' chip is found in  
                     29:  *  the STE/MegaSTE and provides a very fast BitBlit in hardware.
                     30:  *
1.1.1.3   root       31:  *  The hardware registers for this chip lie at addresses $ff8a00 - $ff8a3c.
1.1       root       32:  */
1.1.1.4 ! root       33: const char Blitter_rcsid[] = "Hatari $Id: blitter.c,v 1.14 2006/02/17 20:59:30 eerot Exp $";
1.1       root       34: 
                     35: #include <SDL_types.h>
                     36: #include <stdio.h>
                     37: #include <stdlib.h>
                     38: 
1.1.1.2   root       39: #include "main.h"
1.1       root       40: #include "blitter.h"
                     41: #include "hatari-glue.h"
1.1.1.3   root       42: #include "ioMem.h"
                     43: #include "m68000.h"
1.1.1.2   root       44: #include "memorySnapShot.h"
1.1       root       45: #include "stMemory.h"
                     46: 
1.1.1.4 ! root       47: #define DEBUG 0
1.1       root       48: 
1.1.1.4 ! root       49: /* BLiTTER registers, counts and incs are signed, others unsigned */
        !            50: #define REG_HT_RAM     0xff8a00        /* - 0xff8a1e */
1.1       root       51: 
1.1.1.4 ! root       52: #define REG_SRC_X_INC  0xff8a20
        !            53: #define REG_SRC_Y_INC  0xff8a22
        !            54: #define REG_SRC_ADDR   0xff8a24
        !            55: 
        !            56: #define REG_END_MASK1  0xff8a28
        !            57: #define REG_END_MASK2  0xff8a2a
        !            58: #define REG_END_MASK3  0xff8a2c
        !            59: 
        !            60: #define REG_DST_X_INC  0xff8a2e
        !            61: #define REG_DST_Y_INC  0xff8a30
        !            62: #define REG_DST_ADDR   0xff8a32
        !            63: 
        !            64: #define REG_X_COUNT    0xff8a36
        !            65: #define REG_Y_COUNT    0xff8a38
        !            66: 
        !            67: #define REG_BLIT_HOP   0xff8a3a        /* halftone blit operation byte */
        !            68: #define REG_BLIT_LOP   0xff8a3b        /* logical blit operation byte */
        !            69: #define REG_CONTROL    0xff8a3c
        !            70: #define REG_SKEW       0xff8a3d
        !            71: 
        !            72: 
        !            73: static Uint16 halftone_ram[16];
        !            74: static Uint16 end_mask_1, end_mask_2, end_mask_3;
        !            75: static Uint16 x_count, y_count;
        !            76: static Uint8 hop, op, blit_control, skewreg;
        !            77: static Uint8 NFSR, FXSR; 
        !            78: static Uint32 dest_addr_reg = 0;
        !            79: static int halftone_curroffset, halftone_direction;
1.1       root       80: static int source_x_inc, source_y_inc, dest_x_inc, dest_y_inc;
                     81: 
                     82: 
1.1.1.4 ! root       83: #if DEBUG
        !            84: static void show_params(Uint32 source_addr)
1.1       root       85: {
1.1.1.4 ! root       86:        fprintf(stderr, "Source Address:%X\n", source_addr);
        !            87:        fprintf(stderr, "  Dest Address:%X\n", dest_addr_reg);
        !            88:        fprintf(stderr, "       X count:%X\n", x_count);
        !            89:        fprintf(stderr, "       Y count:%X\n", y_count);
        !            90:        fprintf(stderr, "  Source X inc:%X\n", source_x_inc);
        !            91:        fprintf(stderr, "    Dest X inc:%X\n", dest_x_inc);
        !            92:        fprintf(stderr, "  Source Y inc:%X\n", source_y_inc);
        !            93:        fprintf(stderr, "    Dest Y inc:%X\n", dest_y_inc);
        !            94:        fprintf(stderr, "HOP:%2X    OP:%X\n", hop, op);
        !            95:        fprintf(stderr, "   source SKEW:%X\n", skewreg);
        !            96:        fprintf(stderr, "     endmask 1:%X\n", end_mask_1);
        !            97:        fprintf(stderr, "     endmask 2:%X\n", end_mask_2);
        !            98:        fprintf(stderr, "     endmask 3:%X\n", end_mask_3);
        !            99:        fprintf(stderr, "  blit control:%X\n", blit_control);
        !           100:        if (NFSR) fprintf(stderr, "NFSR is Set!\n");
        !           101:        if (FXSR) fprintf(stderr, "FXSR is Set!\n");
        !           102: }
        !           103: 
        !           104: static void show_halftones(void)
        !           105: {
        !           106:        int i, j;
        !           107:        fprintf(stderr, "Halftone registers:\n");
        !           108:        for (i = 0; i < 2; i++) {
        !           109:                for (j = 0; j < 8; j++) {
        !           110:                        fprintf(stderr,"%4X, ", halftone_ram[i*8+j]);
        !           111:                }
        !           112:                fprintf(stderr, "\n");
        !           113:        }
        !           114: }
        !           115: #endif
1.1.1.3   root      116: 
                    117: 
1.1.1.4 ! root      118: /* called only before halftone operations, for HOP modes 01 and 11 */
        !           119: static void load_halftone_ram(Uint32 source_addr)
        !           120: {
        !           121:        halftone_ram[0]  = STMemory_ReadWord(REG_HT_RAM);
        !           122:        halftone_ram[1]  = STMemory_ReadWord(REG_HT_RAM+2);
        !           123:        halftone_ram[2]  = STMemory_ReadWord(REG_HT_RAM+4);
        !           124:        halftone_ram[3]  = STMemory_ReadWord(REG_HT_RAM+6);
        !           125:        halftone_ram[4]  = STMemory_ReadWord(REG_HT_RAM+8);
        !           126:        halftone_ram[5]  = STMemory_ReadWord(REG_HT_RAM+10);
        !           127:        halftone_ram[6]  = STMemory_ReadWord(REG_HT_RAM+12);
        !           128:        halftone_ram[7]  = STMemory_ReadWord(REG_HT_RAM+14);
        !           129:        halftone_ram[8]  = STMemory_ReadWord(REG_HT_RAM+16);
        !           130:        halftone_ram[9]  = STMemory_ReadWord(REG_HT_RAM+18);
        !           131:        halftone_ram[10] = STMemory_ReadWord(REG_HT_RAM+20);
        !           132:        halftone_ram[11] = STMemory_ReadWord(REG_HT_RAM+22);
        !           133:        halftone_ram[12] = STMemory_ReadWord(REG_HT_RAM+24);
        !           134:        halftone_ram[13] = STMemory_ReadWord(REG_HT_RAM+26);
        !           135:        halftone_ram[14] = STMemory_ReadWord(REG_HT_RAM+28);
        !           136:        halftone_ram[15] = STMemory_ReadWord(REG_HT_RAM+30);
        !           137: 
        !           138:        if (!(blit_control & 0x20)) {
        !           139:                /* No smudge mode: Get halftone offset from control register */
        !           140:                halftone_curroffset = blit_control & 15;
        !           141:        }
        !           142: 
        !           143:        if (dest_y_inc >= 0) {
1.1.1.3   root      144:                halftone_direction = 1;
1.1.1.4 ! root      145:        } else {
1.1.1.3   root      146:                halftone_direction = -1;
1.1.1.4 ! root      147:        }
        !           148: #if DEBUG
        !           149:        show_params(source_addr);
        !           150:        show_halftones();
        !           151: #endif
1.1       root      152: }
                    153: 
                    154: 
                    155: #define HOP_OPS(_fn_name,_op,_do_source_shift,_get_source_data,_shifted_hopd_data, _do_halftone_inc) \
                    156: static void _fn_name (void)  \
                    157: {  \
1.1.1.4 ! root      158:        Uint32 source_addr  = STMemory_ReadLong(REG_SRC_ADDR);   \
        !           159:        Uint32 dest_addr = dest_addr_reg;  \
        !           160:        Uint32 source_buffer = 0;  \
        !           161:        Uint8 skew = skewreg & 15;  \
1.1.1.3   root      162:        /*if(address_space_24)*/  \
1.1.1.4 ! root      163:        { source_addr &= 0x0fffffe; dest_addr &= 0x0fffffe; }  \
        !           164:        source_x_inc = (short) STMemory_ReadWord(REG_SRC_X_INC);  \
        !           165:        source_y_inc = (short) STMemory_ReadWord(REG_SRC_Y_INC);  \
        !           166:        dest_x_inc   = (short) STMemory_ReadWord(REG_DST_X_INC);  \
        !           167:        dest_y_inc   = (short) STMemory_ReadWord(REG_DST_Y_INC);  \
        !           168:        if (hop & 1) load_halftone_ram(source_addr);  \
1.1.1.3   root      169:        do  \
                    170:        {  \
1.1.1.4 ! root      171:                Uint16 x, dst_data, opd_data;  \
1.1.1.3   root      172:                if (FXSR)  \
                    173:                {  \
                    174:                        _do_source_shift;  \
                    175:                        _get_source_data;  \
                    176:                        source_addr += source_x_inc;  \
                    177:                }  \
                    178:                _do_source_shift;  \
                    179:                _get_source_data;  \
1.1.1.4 ! root      180:                dst_data = STMemory_ReadWord(dest_addr);  \
1.1.1.3   root      181:                opd_data =  _shifted_hopd_data;  \
1.1.1.4 ! root      182:                STMemory_WriteWord(dest_addr,(dst_data & ~end_mask_1) | (_op & end_mask_1));  \
1.1.1.3   root      183:                for(x=0 ; x<x_count-2 ; x++)  \
                    184:                {  \
                    185:                        source_addr += source_x_inc;  \
                    186:                        dest_addr += dest_x_inc;  \
                    187:                        _do_source_shift;  \
                    188:                        _get_source_data;  \
1.1.1.4 ! root      189:                        dst_data = STMemory_ReadWord(dest_addr);  \
1.1.1.3   root      190:                        opd_data = _shifted_hopd_data;  \
1.1.1.4 ! root      191:                        STMemory_WriteWord(dest_addr,(dst_data & ~end_mask_2) | (_op & end_mask_2));  \
1.1.1.3   root      192:                }  \
                    193:                if (x_count >= 2)  \
                    194:                {  \
                    195:                        dest_addr += dest_x_inc;  \
                    196:                        _do_source_shift;  \
                    197:                        if ( (!NFSR) || ((~(0xffff>>skew)) > end_mask_3) )  \
                    198:                        {  \
                    199:                                source_addr += source_x_inc;  \
                    200:                                _get_source_data;  \
                    201:                        }  \
1.1.1.4 ! root      202:                        dst_data = STMemory_ReadWord(dest_addr);  \
1.1.1.3   root      203:                        opd_data = _shifted_hopd_data;  \
1.1.1.4 ! root      204:                        STMemory_WriteWord(dest_addr,(((Uint16)dst_data) & ~end_mask_3) | (_op & end_mask_3));  \
1.1.1.3   root      205:                }  \
                    206:                source_addr += source_y_inc;  \
                    207:                dest_addr += dest_y_inc;  \
                    208:                _do_halftone_inc;  \
                    209:        } while (--y_count > 0);  \
1.1.1.4 ! root      210:        STMemory_WriteLong(REG_SRC_ADDR, source_addr);  \
1.1.1.3   root      211:        dest_addr_reg = dest_addr;  \
1.1       root      212: }
                    213: 
                    214: 
1.1.1.4 ! root      215: /* In smudge mode, the halftone offset is determined by the lowest 4 bits of
        !           216:  * the first source word, after it has been skewed */
        !           217: #define HALFTONE_OFFSET  ((blit_control & 0x20) ? \
        !           218:        ((STMemory_ReadWord(source_addr) >> skew) & 15) : halftone_curroffset)
        !           219: 
        !           220: 
1.1       root      221: HOP_OPS(_HOP_0_OP_00_N,(0), source_buffer >>=16,;, 0xffff, ;)
                    222: HOP_OPS(_HOP_0_OP_01_N,(opd_data & dst_data) ,source_buffer >>=16,; , 0xffff, ;)
                    223: HOP_OPS(_HOP_0_OP_02_N,(opd_data & ~dst_data) ,source_buffer >>=16,; , 0xffff,;)   
                    224: HOP_OPS(_HOP_0_OP_03_N,(opd_data) ,source_buffer >>=16,; , 0xffff,;)
                    225: HOP_OPS(_HOP_0_OP_04_N,(~opd_data & dst_data) ,source_buffer >>=16,;, 0xffff,;)
                    226: HOP_OPS(_HOP_0_OP_05_N,(dst_data) ,source_buffer >>=16,;, 0xffff, ;)
                    227: HOP_OPS(_HOP_0_OP_06_N,(opd_data ^ dst_data) ,source_buffer >>=16,;, 0xffff, ;)
                    228: HOP_OPS(_HOP_0_OP_07_N,(opd_data | dst_data) ,source_buffer >>=16,; , 0xffff, ;)
                    229: HOP_OPS(_HOP_0_OP_08_N,(~opd_data & ~dst_data) ,source_buffer >>=16,;, 0xffff, ;)
                    230: HOP_OPS(_HOP_0_OP_09_N,(~opd_data ^ dst_data) ,source_buffer >>=16,;, 0xffff, ;)
                    231: HOP_OPS(_HOP_0_OP_10_N,(~dst_data) ,source_buffer >>=16,;, 0xffff, ;)
                    232: HOP_OPS(_HOP_0_OP_11_N,(opd_data | ~dst_data) ,source_buffer >>=16,;, 0xffff, ;)
                    233: HOP_OPS(_HOP_0_OP_12_N,(~opd_data) ,source_buffer >>=16,;, 0xffff, ;)
                    234: HOP_OPS(_HOP_0_OP_13_N,(~opd_data | dst_data) ,source_buffer >>=16,;, 0xffff, ;)   
                    235: HOP_OPS(_HOP_0_OP_14_N,(~opd_data | ~dst_data) ,source_buffer >>=16,;, 0xffff, ;)
                    236: HOP_OPS(_HOP_0_OP_15_N,(0xffff) ,source_buffer >>=16,;, 0xffff, ;)
                    237: 
1.1.1.4 ! root      238: HOP_OPS(_HOP_1_OP_00_N,(0) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           239: HOP_OPS(_HOP_1_OP_01_N,(opd_data & dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           240: HOP_OPS(_HOP_1_OP_02_N,(opd_data & ~dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           241: HOP_OPS(_HOP_1_OP_03_N,(opd_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           242: HOP_OPS(_HOP_1_OP_04_N,(~opd_data & dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           243: HOP_OPS(_HOP_1_OP_05_N,(dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           244: HOP_OPS(_HOP_1_OP_06_N,(opd_data ^ dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           245: HOP_OPS(_HOP_1_OP_07_N,(opd_data | dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           246: HOP_OPS(_HOP_1_OP_08_N,(~opd_data & ~dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           247: HOP_OPS(_HOP_1_OP_09_N,(~opd_data ^ dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           248: HOP_OPS(_HOP_1_OP_10_N,(~dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           249: HOP_OPS(_HOP_1_OP_11_N,(opd_data | ~dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           250: HOP_OPS(_HOP_1_OP_12_N,(~opd_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           251: HOP_OPS(_HOP_1_OP_13_N,(~opd_data | dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           252: HOP_OPS(_HOP_1_OP_14_N,(~opd_data | ~dst_data) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           253: HOP_OPS(_HOP_1_OP_15_N,(0xffff) ,source_buffer >>=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           254: 
        !           255: HOP_OPS(_HOP_2_OP_00_N,(0) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           256: HOP_OPS(_HOP_2_OP_01_N,(opd_data & dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           257: HOP_OPS(_HOP_2_OP_02_N,(opd_data & ~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           258: HOP_OPS(_HOP_2_OP_03_N,(opd_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           259: HOP_OPS(_HOP_2_OP_04_N,(~opd_data & dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           260: HOP_OPS(_HOP_2_OP_05_N,(dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           261: HOP_OPS(_HOP_2_OP_06_N,(opd_data ^ dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           262: HOP_OPS(_HOP_2_OP_07_N,(opd_data | dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           263: HOP_OPS(_HOP_2_OP_08_N,(~opd_data & ~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           264: HOP_OPS(_HOP_2_OP_09_N,(~opd_data ^ dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           265: HOP_OPS(_HOP_2_OP_10_N,(~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           266: HOP_OPS(_HOP_2_OP_11_N,(opd_data | ~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           267: HOP_OPS(_HOP_2_OP_12_N,(~opd_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           268: HOP_OPS(_HOP_2_OP_13_N,(~opd_data | dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           269: HOP_OPS(_HOP_2_OP_14_N,(~opd_data | ~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           270: HOP_OPS(_HOP_2_OP_15_N,(0xffff) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew),;)
        !           271: 
        !           272: HOP_OPS(_HOP_3_OP_00_N,(0) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           273: HOP_OPS(_HOP_3_OP_01_N,(opd_data & dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           274: HOP_OPS(_HOP_3_OP_02_N,(opd_data & ~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           275: HOP_OPS(_HOP_3_OP_03_N,(opd_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           276: HOP_OPS(_HOP_3_OP_04_N,(~opd_data & dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           277: HOP_OPS(_HOP_3_OP_05_N,(dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           278: HOP_OPS(_HOP_3_OP_06_N,(opd_data ^ dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           279: HOP_OPS(_HOP_3_OP_07_N,(opd_data | dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           280: HOP_OPS(_HOP_3_OP_08_N,(~opd_data & ~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           281: HOP_OPS(_HOP_3_OP_09_N,(~opd_data ^ dst_data) , source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           282: HOP_OPS(_HOP_3_OP_10_N,(~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           283: HOP_OPS(_HOP_3_OP_11_N,(opd_data | ~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           284: HOP_OPS(_HOP_3_OP_12_N,(~opd_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           285: HOP_OPS(_HOP_3_OP_13_N,(~opd_data | dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
        !           286: HOP_OPS(_HOP_3_OP_14_N,(~opd_data | ~dst_data) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15) 
        !           287: HOP_OPS(_HOP_3_OP_15_N,(0xffff) ,source_buffer >>=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) << 16) ,(source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15)
1.1       root      288: 
                    289: 
                    290: HOP_OPS(_HOP_0_OP_00_P,(0) ,source_buffer <<=16,;, 0xffff,;)
                    291: HOP_OPS(_HOP_0_OP_01_P,(opd_data & dst_data) ,source_buffer <<=16,;, 0xffff,;)  
                    292: HOP_OPS(_HOP_0_OP_02_P,(opd_data & ~dst_data) ,source_buffer <<=16,;, 0xffff,;) 
                    293: HOP_OPS(_HOP_0_OP_03_P,(opd_data) ,source_buffer <<=16,;, 0xffff,;) 
                    294: HOP_OPS(_HOP_0_OP_04_P,(~opd_data & dst_data) ,source_buffer <<=16,;, 0xffff,;) 
                    295: HOP_OPS(_HOP_0_OP_05_P,(dst_data) ,source_buffer <<=16,;, 0xffff,;) 
                    296: HOP_OPS(_HOP_0_OP_06_P,(opd_data ^ dst_data) ,source_buffer <<=16,;, 0xffff,;)  
                    297: HOP_OPS(_HOP_0_OP_07_P,(opd_data | dst_data) ,source_buffer <<=16,;, 0xffff,;)  
                    298: HOP_OPS(_HOP_0_OP_08_P,(~opd_data & ~dst_data) ,source_buffer <<=16,;, 0xffff,;)  
                    299: HOP_OPS(_HOP_0_OP_09_P,(~opd_data ^ dst_data) ,source_buffer <<=16,;, 0xffff,;) 
                    300: HOP_OPS(_HOP_0_OP_10_P,(~dst_data) ,source_buffer <<=16,;, 0xffff,;)  
                    301: HOP_OPS(_HOP_0_OP_11_P,(opd_data | ~dst_data) ,source_buffer <<=16,;, 0xffff,;) 
                    302: HOP_OPS(_HOP_0_OP_12_P,(~opd_data) ,source_buffer <<=16,;, 0xffff,;)  
                    303: HOP_OPS(_HOP_0_OP_13_P,(~opd_data | dst_data) ,source_buffer <<=16,;, 0xffff,;) 
                    304: HOP_OPS(_HOP_0_OP_14_P,(~opd_data | ~dst_data) ,source_buffer <<=16,;, 0xffff,;)  
                    305: HOP_OPS(_HOP_0_OP_15_P,(0xffff) ,source_buffer <<=16,;, 0xffff,;) 
                    306: 
1.1.1.4 ! root      307: HOP_OPS(_HOP_1_OP_00_P,(0) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           308: HOP_OPS(_HOP_1_OP_01_P,(opd_data & dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           309: HOP_OPS(_HOP_1_OP_02_P,(opd_data & ~dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           310: HOP_OPS(_HOP_1_OP_03_P,(opd_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           311: HOP_OPS(_HOP_1_OP_04_P,(~opd_data & dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           312: HOP_OPS(_HOP_1_OP_05_P,(dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           313: HOP_OPS(_HOP_1_OP_06_P,(opd_data ^ dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           314: HOP_OPS(_HOP_1_OP_07_P,(opd_data | dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           315: HOP_OPS(_HOP_1_OP_08_P,(~opd_data & ~dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )\
        !           316: HOP_OPS(_HOP_1_OP_09_P,(~opd_data ^ dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           317: HOP_OPS(_HOP_1_OP_10_P,(~dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           318: HOP_OPS(_HOP_1_OP_11_P,(opd_data | ~dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           319: HOP_OPS(_HOP_1_OP_12_P,(~opd_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           320: HOP_OPS(_HOP_1_OP_13_P,(~opd_data | dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           321: HOP_OPS(_HOP_1_OP_14_P,(~opd_data | ~dst_data) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           322: HOP_OPS(_HOP_1_OP_15_P,(0xffff) ,source_buffer <<=16,;,halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 )
        !           323: 
        !           324: HOP_OPS(_HOP_2_OP_00_P,(0) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           325: HOP_OPS(_HOP_2_OP_01_P,(opd_data & dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           326: HOP_OPS(_HOP_2_OP_02_P,(opd_data & ~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           327: HOP_OPS(_HOP_2_OP_03_P,(opd_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           328: HOP_OPS(_HOP_2_OP_04_P,(~opd_data & dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           329: HOP_OPS(_HOP_2_OP_05_P,(dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           330: HOP_OPS(_HOP_2_OP_06_P,(opd_data ^ dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           331: HOP_OPS(_HOP_2_OP_07_P,(opd_data | dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           332: HOP_OPS(_HOP_2_OP_08_P,(~opd_data & ~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           333: HOP_OPS(_HOP_2_OP_09_P,(~opd_data ^ dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           334: HOP_OPS(_HOP_2_OP_10_P,(~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           335: HOP_OPS(_HOP_2_OP_11_P,(opd_data | ~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           336: 
        !           337: HOP_OPS(_HOP_2_OP_12_P,(~opd_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           338: HOP_OPS(_HOP_2_OP_13_P,(~opd_data | dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           339: HOP_OPS(_HOP_2_OP_14_P,(~opd_data | ~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           340: HOP_OPS(_HOP_2_OP_15_P,(0xffff) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ) , (source_buffer >> skew),;)
        !           341: 
        !           342: HOP_OPS(_HOP_3_OP_00_P,(0) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           343: HOP_OPS(_HOP_3_OP_01_P,(opd_data & dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           344: HOP_OPS(_HOP_3_OP_02_P,(opd_data & ~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           345: HOP_OPS(_HOP_3_OP_03_P,(opd_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           346: HOP_OPS(_HOP_3_OP_04_P,(~opd_data & dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           347: HOP_OPS(_HOP_3_OP_05_P,(dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           348: HOP_OPS(_HOP_3_OP_06_P,(opd_data ^ dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           349: HOP_OPS(_HOP_3_OP_07_P,(opd_data | dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           350: HOP_OPS(_HOP_3_OP_08_P,(~opd_data & ~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           351: HOP_OPS(_HOP_3_OP_09_P,(~opd_data ^ dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           352: HOP_OPS(_HOP_3_OP_10_P,(~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           353: HOP_OPS(_HOP_3_OP_11_P,(opd_data | ~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           354: HOP_OPS(_HOP_3_OP_12_P,(~opd_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           355: HOP_OPS(_HOP_3_OP_13_P,(~opd_data | dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           356: HOP_OPS(_HOP_3_OP_14_P,(~opd_data | ~dst_data) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
        !           357: HOP_OPS(_HOP_3_OP_15_P,(0xffff) ,source_buffer <<=16,source_buffer |= ((Uint32) STMemory_ReadWord(source_addr) ), (source_buffer >> skew) & halftone_ram[HALFTONE_OFFSET],halftone_curroffset=(halftone_curroffset+halftone_direction) & 15 ) 
1.1       root      358: 
1.1.1.4 ! root      359: static void (* const do_hop_op_N[4][16])(void) =
1.1       root      360: {
                    361:   { _HOP_0_OP_00_N, _HOP_0_OP_01_N, _HOP_0_OP_02_N, _HOP_0_OP_03_N, _HOP_0_OP_04_N, _HOP_0_OP_05_N, _HOP_0_OP_06_N, _HOP_0_OP_07_N, _HOP_0_OP_08_N, _HOP_0_OP_09_N, _HOP_0_OP_10_N, _HOP_0_OP_11_N, _HOP_0_OP_12_N, _HOP_0_OP_13_N, _HOP_0_OP_14_N, _HOP_0_OP_15_N,},
                    362:   { _HOP_1_OP_00_N, _HOP_1_OP_01_N, _HOP_1_OP_02_N, _HOP_1_OP_03_N, _HOP_1_OP_04_N, _HOP_1_OP_05_N, _HOP_1_OP_06_N, _HOP_1_OP_07_N, _HOP_1_OP_08_N, _HOP_1_OP_09_N, _HOP_1_OP_10_N, _HOP_1_OP_11_N, _HOP_1_OP_12_N, _HOP_1_OP_13_N, _HOP_1_OP_14_N, _HOP_1_OP_15_N,},
                    363:   { _HOP_2_OP_00_N, _HOP_2_OP_01_N, _HOP_2_OP_02_N, _HOP_2_OP_03_N, _HOP_2_OP_04_N, _HOP_2_OP_05_N, _HOP_2_OP_06_N, _HOP_2_OP_07_N, _HOP_2_OP_08_N, _HOP_2_OP_09_N, _HOP_2_OP_10_N, _HOP_2_OP_11_N, _HOP_2_OP_12_N, _HOP_2_OP_13_N, _HOP_2_OP_14_N, _HOP_2_OP_15_N,},
                    364:   { _HOP_3_OP_00_N, _HOP_3_OP_01_N, _HOP_3_OP_02_N, _HOP_3_OP_03_N, _HOP_3_OP_04_N, _HOP_3_OP_05_N, _HOP_3_OP_06_N, _HOP_3_OP_07_N, _HOP_3_OP_08_N, _HOP_3_OP_09_N, _HOP_3_OP_10_N, _HOP_3_OP_11_N, _HOP_3_OP_12_N, _HOP_3_OP_13_N, _HOP_3_OP_14_N, _HOP_3_OP_15_N,}
                    365: };
                    366: 
1.1.1.4 ! root      367: static void (* const do_hop_op_P[4][16])(void) =
1.1       root      368: {
                    369:   { _HOP_0_OP_00_P, _HOP_0_OP_01_P, _HOP_0_OP_02_P, _HOP_0_OP_03_P, _HOP_0_OP_04_P, _HOP_0_OP_05_P, _HOP_0_OP_06_P, _HOP_0_OP_07_P, _HOP_0_OP_08_P, _HOP_0_OP_09_P, _HOP_0_OP_10_P, _HOP_0_OP_11_P, _HOP_0_OP_12_P, _HOP_0_OP_13_P, _HOP_0_OP_14_P, _HOP_0_OP_15_P,},
                    370:   { _HOP_1_OP_00_P, _HOP_1_OP_01_P, _HOP_1_OP_02_P, _HOP_1_OP_03_P, _HOP_1_OP_04_P, _HOP_1_OP_05_P, _HOP_1_OP_06_P, _HOP_1_OP_07_P, _HOP_1_OP_08_P, _HOP_1_OP_09_P, _HOP_1_OP_10_P, _HOP_1_OP_11_P, _HOP_1_OP_12_P, _HOP_1_OP_13_P, _HOP_1_OP_14_P, _HOP_1_OP_15_P,},
                    371:   { _HOP_2_OP_00_P, _HOP_2_OP_01_P, _HOP_2_OP_02_P, _HOP_2_OP_03_P, _HOP_2_OP_04_P, _HOP_2_OP_05_P, _HOP_2_OP_06_P, _HOP_2_OP_07_P, _HOP_2_OP_08_P, _HOP_2_OP_09_P, _HOP_2_OP_10_P, _HOP_2_OP_11_P, _HOP_2_OP_12_P, _HOP_2_OP_13_P, _HOP_2_OP_14_P, _HOP_2_OP_15_P,},
                    372:   { _HOP_3_OP_00_P, _HOP_3_OP_01_P, _HOP_3_OP_02_P, _HOP_3_OP_03_P, _HOP_3_OP_04_P, _HOP_3_OP_05_P, _HOP_3_OP_06_P, _HOP_3_OP_07_P, _HOP_3_OP_08_P, _HOP_3_OP_09_P, _HOP_3_OP_10_P, _HOP_3_OP_11_P, _HOP_3_OP_12_P, _HOP_3_OP_13_P, _HOP_3_OP_14_P, _HOP_3_OP_15_P,}
                    373: };
                    374: 
                    375: 
                    376: 
1.1.1.3   root      377: /*-----------------------------------------------------------------------*/
                    378: /*
1.1.1.4 ! root      379:   Do the blit.
        !           380: */
        !           381: static void Do_Blit(void)
        !           382: {
        !           383:        if (((short)STMemory_ReadWord(REG_SRC_X_INC)) < 0)
        !           384:                do_hop_op_N[hop][op]();
        !           385:        else
        !           386:                do_hop_op_P[hop][op]();
        !           387: }
        !           388: 
        !           389: /*-----------------------------------------------------------------------*/
        !           390: /*
1.1.1.3   root      391:   Read blitter endmask 1.
                    392: */
                    393: void Blitter_Endmask1_ReadWord(void)
1.1       root      394: {
1.1.1.4 ! root      395:        IoMem_WriteWord(REG_END_MASK1, end_mask_1);
1.1       root      396: }
                    397: 
1.1.1.3   root      398: /*-----------------------------------------------------------------------*/
                    399: /*
                    400:   Read blitter endmask 2.
                    401: */
                    402: void Blitter_Endmask2_ReadWord(void)
1.1       root      403: {
1.1.1.4 ! root      404:        IoMem_WriteWord(REG_END_MASK2, end_mask_2);
1.1       root      405: }
                    406: 
1.1.1.3   root      407: /*-----------------------------------------------------------------------*/
                    408: /*
                    409:   Read blitter endmask 3.
                    410: */
                    411: void Blitter_Endmask3_ReadWord(void)
1.1       root      412: {
1.1.1.4 ! root      413:        IoMem_WriteWord(REG_END_MASK3, end_mask_3);
1.1       root      414: }
                    415: 
1.1.1.3   root      416: /*-----------------------------------------------------------------------*/
                    417: /*
                    418:   Read blitter destination address.
                    419: */
                    420: void Blitter_DestAddr_ReadLong(void)
1.1       root      421: {
1.1.1.4 ! root      422:        IoMem_WriteLong(REG_DST_ADDR, dest_addr_reg);
1.1       root      423: }
                    424: 
1.1.1.3   root      425: /*-----------------------------------------------------------------------*/
                    426: /*
                    427:   Read blitter words-per-line register.
                    428: */
                    429: void Blitter_WordsPerLine_ReadWord(void)
1.1       root      430: {
1.1.1.4 ! root      431:        IoMem_WriteWord(REG_X_COUNT, x_count);
1.1       root      432: }
                    433: 
1.1.1.3   root      434: /*-----------------------------------------------------------------------*/
                    435: /*
                    436:   Read blitter lines-per-bitblock register.
                    437: */
                    438: void Blitter_LinesPerBitblock_ReadWord(void)
1.1       root      439: {
1.1.1.4 ! root      440:        IoMem_WriteWord(REG_Y_COUNT, y_count);
1.1       root      441: }
                    442: 
1.1.1.3   root      443: /*-----------------------------------------------------------------------*/
                    444: /*
1.1.1.4 ! root      445:   Read blitter halftone operation register.
1.1.1.3   root      446: */
                    447: void Blitter_HalftoneOp_ReadByte(void)
1.1       root      448: {
1.1.1.4 ! root      449:        IoMem_WriteByte(REG_BLIT_HOP, hop);
1.1       root      450: }
                    451: 
1.1.1.3   root      452: /*-----------------------------------------------------------------------*/
                    453: /*
                    454:   Read blitter logical operation register.
                    455: */
                    456: void Blitter_LogOp_ReadByte(void)
1.1       root      457: {
1.1.1.4 ! root      458:        IoMem_WriteByte(REG_BLIT_LOP, op);
1.1       root      459: }
                    460: 
1.1.1.3   root      461: /*-----------------------------------------------------------------------*/
                    462: /*
1.1.1.4 ! root      463:   Read blitter control register.
1.1.1.3   root      464: */
1.1.1.4 ! root      465: void Blitter_Control_ReadByte(void)
1.1       root      466: {
1.1.1.4 ! root      467:        /* we don't implement Blit mode so this can never be
        !           468:         * busy when application gets the return value
        !           469:         * %11101111
        !           470:         * busy, hog/blit, smudge, n/a, 4bits for line number
        !           471:         */
        !           472:        //IoMem_WriteByte(REG_CONTROL, (blit_control & 0x6f));
        !           473:        IoMem_WriteByte(REG_CONTROL, (blit_control & 0x3f));
1.1       root      474: }
                    475: 
1.1.1.3   root      476: /*-----------------------------------------------------------------------*/
                    477: /*
                    478:   Read blitter skew register.
                    479: */
                    480: void Blitter_Skew_ReadByte(void)
1.1       root      481: {
1.1.1.4 ! root      482:        IoMem_WriteByte(REG_SKEW, skewreg);
1.1       root      483: }
                    484: 
                    485: 
1.1.1.3   root      486: /*-----------------------------------------------------------------------*/
                    487: /*
                    488:   Write to blitter endmask 1.
                    489: */
                    490: void Blitter_Endmask1_WriteWord(void)
1.1       root      491: {
1.1.1.4 ! root      492:        end_mask_1 = IoMem_ReadWord(REG_END_MASK1);
1.1       root      493: }
                    494: 
1.1.1.3   root      495: /*-----------------------------------------------------------------------*/
                    496: /*
                    497:   Write to blitter endmask 2.
                    498: */
                    499: void Blitter_Endmask2_WriteWord(void)
1.1       root      500: {
1.1.1.4 ! root      501:        end_mask_2 = IoMem_ReadWord(REG_END_MASK2);
1.1       root      502: }
                    503: 
1.1.1.3   root      504: /*-----------------------------------------------------------------------*/
                    505: /*
                    506:   Write to blitter endmask 3.
                    507: */
                    508: void Blitter_Endmask3_WriteWord(void)
1.1       root      509: {
1.1.1.4 ! root      510:        end_mask_3 = IoMem_ReadWord(REG_END_MASK3);
1.1       root      511: }
                    512: 
1.1.1.3   root      513: /*-----------------------------------------------------------------------*/
                    514: /*
                    515:   Write to blitter destination address register.
                    516: */
                    517: void Blitter_DestAddr_WriteLong(void)
                    518: {
1.1.1.4 ! root      519:        dest_addr_reg = IoMem_ReadLong(REG_DST_ADDR) & 0x0fffffe;
1.1       root      520: }
                    521: 
1.1.1.3   root      522: /*-----------------------------------------------------------------------*/
                    523: /*
                    524:   Write to blitter words-per-line register.
                    525: */
                    526: void Blitter_WordsPerLine_WriteWord(void)
1.1       root      527: {
1.1.1.4 ! root      528:        x_count = IoMem_ReadWord(REG_X_COUNT);
1.1       root      529: }
                    530: 
1.1.1.3   root      531: /*-----------------------------------------------------------------------*/
                    532: /*
                    533:   Write to blitter words-per-bitblock register.
                    534: */
                    535: void Blitter_LinesPerBitblock_WriteWord(void)
1.1       root      536: {
1.1.1.4 ! root      537:        y_count = IoMem_ReadWord(REG_Y_COUNT);
1.1       root      538: }
                    539: 
1.1.1.3   root      540: /*-----------------------------------------------------------------------*/
                    541: /*
                    542:   Write to blitter halftone operation register.
                    543: */
                    544: void Blitter_HalftoneOp_WriteByte(void)
1.1       root      545: {
1.1.1.4 ! root      546:        /* h/ware reg masks out the top 6 bits! */
        !           547:        hop = IoMem_ReadByte(REG_BLIT_HOP) & 3;
1.1       root      548: }
                    549: 
1.1.1.3   root      550: /*-----------------------------------------------------------------------*/
                    551: /*
                    552:   Write to blitter logical operation register.
                    553: */
                    554: void Blitter_LogOp_WriteByte(void)
1.1.1.4 ! root      555: {      
        !           556:        /* h/ware reg masks out the top 4 bits! */
        !           557:        op = IoMem_ReadByte(REG_BLIT_LOP) & 15;
1.1       root      558: }
                    559: 
1.1.1.3   root      560: /*-----------------------------------------------------------------------*/
                    561: /*
1.1.1.4 ! root      562:   Write to blitter control register.
        !           563: */
        !           564: void Blitter_Control_WriteByte(void)
        !           565: {
        !           566:        /* Control register bits:
        !           567:         * 0x80: busy bit
        !           568:         * - Turn on Blitter activity and stay "1" until copy finished
        !           569:         * 0x40: Blit-mode bit
        !           570:         * - 0: Blit mode, CPU and Blitter get 64 clockcycles in turns
        !           571:         * - 1: HOG Mode, Blitter reserves and hogs the bus for as long
        !           572:         *      as the copy takes, CPU and DMA get no Bus access
        !           573:         * 0x20: Smudge mode
        !           574:         * - Which line of the halftone pattern to start with is
        !           575:         *   read from the first source word when the copy starts
        !           576:         * 0x10: not used
        !           577:         * 0x0f
        !           578:         *
        !           579:         * The lowest 4 bits contain the Halftone pattern line number
        !           580:         */
        !           581:        blit_control = IoMem_ReadByte(REG_CONTROL) & 0xef;
        !           582:        
        !           583:        /* Lines to blit and busy bit set? */
        !           584:        if((y_count !=0) && (blit_control & 0x80))
1.1.1.3   root      585:        {
1.1.1.4 ! root      586:                /* Needed if a program executes for example
        !           587:                 * move.W #xxxx,$ff8a3c
        !           588:                 */
        !           589:                Blitter_Skew_WriteByte();
        !           590: 
        !           591:                /* TODO:
        !           592:                 * - Emulate the shared bus mode when HOG flag is cleared 
        !           593:                 * - Add proper blitter timings
        !           594:                 */
1.1.1.3   root      595:                M68000_AddCycles(y_count);
                    596: 
                    597:                Do_Blit();
                    598:        }
1.1       root      599: }
                    600: 
1.1.1.3   root      601: /*-----------------------------------------------------------------------*/
                    602: /*
                    603:   Write to blitter skew register.
                    604: */
                    605: void Blitter_Skew_WriteByte(void)
                    606: {
1.1.1.4 ! root      607:        Uint8 v = IoMem_ReadByte(REG_SKEW);
1.1.1.3   root      608:        NFSR = (v & 0x40) != 0;
                    609:        FXSR = (v & 0x80) != 0;
1.1.1.4 ! root      610:        skewreg = v & 0xcf;        /* h/ware reg mask %11001111 !*/
1.1       root      611: }
1.1.1.2   root      612: 
                    613: 
                    614: /*-----------------------------------------------------------------------*/
                    615: /*
                    616:   Save/Restore snapshot of Blitter variables.
                    617: */
                    618: void Blitter_MemorySnapShot_Capture(BOOL bSave)
                    619: {
1.1.1.3   root      620:        /* Save/Restore details */
                    621:        MemorySnapShot_Store(halftone_ram, sizeof(halftone_ram));
                    622:        MemorySnapShot_Store(&end_mask_1, sizeof(end_mask_1));
                    623:        MemorySnapShot_Store(&end_mask_2, sizeof(end_mask_2));
                    624:        MemorySnapShot_Store(&end_mask_3, sizeof(end_mask_3));
                    625:        MemorySnapShot_Store(&NFSR, sizeof(NFSR));
                    626:        MemorySnapShot_Store(&FXSR, sizeof(FXSR));
                    627:        MemorySnapShot_Store(&x_count, sizeof(y_count));
                    628:        MemorySnapShot_Store(&hop, sizeof(hop));
                    629:        MemorySnapShot_Store(&op, sizeof(op));
1.1.1.4 ! root      630:        MemorySnapShot_Store(&blit_control, sizeof(blit_control));
1.1.1.3   root      631:        MemorySnapShot_Store(&skewreg, sizeof(skewreg));
                    632:        MemorySnapShot_Store(&dest_addr_reg, sizeof(dest_addr_reg));
                    633:        MemorySnapShot_Store(&halftone_curroffset, sizeof(halftone_curroffset));
                    634:        MemorySnapShot_Store(&halftone_direction, sizeof(halftone_direction));
                    635:        MemorySnapShot_Store(&source_x_inc, sizeof(source_x_inc));
                    636:        MemorySnapShot_Store(&source_y_inc, sizeof(source_y_inc));
                    637:        MemorySnapShot_Store(&dest_x_inc, sizeof(dest_x_inc));
                    638:        MemorySnapShot_Store(&dest_y_inc, sizeof(dest_y_inc));
1.1.1.2   root      639: }

unix.superglobalmegacorp.com

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