diff --git a/waterbox/pcfx/.vscode/settings.json b/waterbox/pcfx/.vscode/settings.json deleted file mode 100644 index 63ffa1793c..0000000000 --- a/waterbox/pcfx/.vscode/settings.json +++ /dev/null @@ -1,16 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "editor.tabSize": 4, - "editor.insertSpaces": false, - "editor.detectIndentation": false, - "files.associations": { - "*.inc": "cpp", - "system_error": "cpp", - "ios": "cpp", - "xiosbase": "cpp", - "iosfwd": "cpp", - "xlocale": "cpp", - "xstring": "cpp", - "queue": "cpp" - } -} \ No newline at end of file diff --git a/waterbox/pcfx/Makefile b/waterbox/pcfx/Makefile deleted file mode 100644 index 7e7b6bd8fa..0000000000 --- a/waterbox/pcfx/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -CXXFLAGS := \ - -Wall -Werror=int-to-pointer-cast \ - -std=c++0x -fomit-frame-pointer -fno-exceptions -fno-rtti \ - -DLSB_FIRST - -TARGET = pcfx.wbx - -SRCS = $(shell find $(ROOT_DIR) -type f -name '*.cpp') - -include ../common.mak diff --git a/waterbox/pcfx/cdrom/CDUtility.cpp b/waterbox/pcfx/cdrom/CDUtility.cpp deleted file mode 100644 index 67698749cc..0000000000 --- a/waterbox/pcfx/cdrom/CDUtility.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * Subchannel Q CRC Code: Copyright (C) 1998 Andreas Mueller - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "../defs.h" -#include "CDUtility.h" -#include "dvdisaster.h" -#include "lec.h" - -#include - -namespace CDUtility -{ - -// lookup table for crc calculation -static uint16 subq_crctab[256] = -{ - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, - 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, - 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, - 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, - 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, - 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, - 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, - 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, - 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, - 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, - 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, - 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, - 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, - 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, - 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, - 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, - 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, - 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, - 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, - 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, - 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, - 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, - 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, - 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, - 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, - 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, - 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 -}; - - -static uint8 scramble_table[2352 - 12]; - -static bool CDUtility_Inited = false; - -static void InitScrambleTable(void) -{ - unsigned cv = 1; - - for(unsigned i = 12; i < 2352; i++) - { - unsigned char z = 0; - - for(int b = 0; b < 8; b++) - { - z |= (cv & 1) << b; - - int feedback = ((cv >> 1) & 1) ^ (cv & 1); - cv = (cv >> 1) | (feedback << 14); - } - - scramble_table[i - 12] = z; - } - - //for(int i = 0; i < 2352 - 12; i++) - // printf("0x%02x, ", scramble_table[i]); -} - -void CDUtility_Init(void) -{ - if(!CDUtility_Inited) - { - //Init_LEC_Correct(); - - InitScrambleTable(); - - CDUtility_Inited = true; - } -} - -void encode_mode0_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode0_sector(aba, sector_data); -} - -void encode_mode1_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode1_sector(aba, sector_data); -} - -void encode_mode2_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode2_sector(aba, sector_data); -} - -void encode_mode2_form1_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode2_form1_sector(aba, sector_data); -} - -void encode_mode2_form2_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode2_form2_sector(aba, sector_data); -} - -bool edc_check(const uint8 *sector_data, bool xa) -{ - CDUtility_Init(); - - return(CheckEDC(sector_data, xa)); -} - -bool edc_lec_check_and_correct(uint8 *sector_data, bool xa) -{ - CDUtility_Init(); - - return(ValidateRawSector(sector_data, xa)); -} - - -bool subq_check_checksum(const uint8 *SubQBuf) -{ - uint16 crc = 0; - uint16 stored_crc = 0; - - stored_crc = SubQBuf[0xA] << 8; - stored_crc |= SubQBuf[0xB]; - - for(int i = 0; i < 0xA; i++) - crc = subq_crctab[(crc >> 8) ^ SubQBuf[i]] ^ (crc << 8); - - crc = ~crc; - - return(crc == stored_crc); -} - -void subq_generate_checksum(uint8 *buf) -{ - uint16 crc = 0; - - for(int i = 0; i < 0xA; i++) - crc = subq_crctab[(crc >> 8) ^ buf[i]] ^ (crc << 8); - - // Checksum - buf[0xa] = ~(crc >> 8); - buf[0xb] = ~(crc); -} - -void subq_deinterleave(const uint8 *SubPWBuf, uint8 *qbuf) -{ - memset(qbuf, 0, 0xC); - - for(int i = 0; i < 96; i++) - { - qbuf[i >> 3] |= ((SubPWBuf[i] >> 6) & 0x1) << (7 - (i & 0x7)); - } -} - - -// Deinterleaves 96 bytes of subchannel P-W data from 96 bytes of interleaved subchannel PW data. -void subpw_deinterleave(const uint8 *in_buf, uint8 *out_buf) -{ - assert(in_buf != out_buf); - - memset(out_buf, 0, 96); - - for(unsigned ch = 0; ch < 8; ch++) - { - for(unsigned i = 0; i < 96; i++) - { - out_buf[(ch * 12) + (i >> 3)] |= ((in_buf[i] >> (7 - ch)) & 0x1) << (7 - (i & 0x7)); - } - } - -} - -// Interleaves 96 bytes of subchannel P-W data from 96 bytes of uninterleaved subchannel PW data. -void subpw_interleave(const uint8 *in_buf, uint8 *out_buf) -{ - assert(in_buf != out_buf); - - for(unsigned d = 0; d < 12; d++) - { - for(unsigned bitpoodle = 0; bitpoodle < 8; bitpoodle++) - { - uint8 rawb = 0; - - for(unsigned ch = 0; ch < 8; ch++) - { - rawb |= ((in_buf[ch * 12 + d] >> (7 - bitpoodle)) & 1) << (7 - ch); - } - out_buf[(d << 3) + bitpoodle] = rawb; - } - } -} - -// NOTES ON LEADOUT AREA SYNTHESIS -// -// I'm not trusting that the "control" field for the TOC leadout entry will always be set properly, so | the control fields for the last track entry -// and the leadout entry together before extracting the D2 bit. Audio track->data leadout is fairly benign though maybe noisy(especially if we ever implement -// data scrambling properly), but data track->audio leadout could break things in an insidious manner for the more accurate drive emulation code). -// -void subpw_synth_leadout_lba(const TOC& toc, const int32 lba, uint8* SubPWBuf) -{ - uint8 buf[0xC]; - uint32 lba_relative; - uint32 ma, sa, fa; - uint32 m, s, f; - - lba_relative = lba - toc.tracks[100].lba; - - f = (lba_relative % 75); - s = ((lba_relative / 75) % 60); - m = (lba_relative / 75 / 60); - - fa = (lba + 150) % 75; - sa = ((lba + 150) / 75) % 60; - ma = ((lba + 150) / 75 / 60); - - uint8 adr = 0x1; // Q channel data encodes position - uint8 control = toc.tracks[100].control; - - if(toc.tracks[toc.last_track].valid) - control |= toc.tracks[toc.last_track].control & 0x4; - else if(toc.disc_type == DISC_TYPE_CD_I) - control |= 0x4; - - memset(buf, 0, 0xC); - buf[0] = (adr << 0) | (control << 4); - buf[1] = 0xAA; - buf[2] = 0x01; - - // Track relative MSF address - buf[3] = U8_to_BCD(m); - buf[4] = U8_to_BCD(s); - buf[5] = U8_to_BCD(f); - - buf[6] = 0; // Zerroooo - - // Absolute MSF address - buf[7] = U8_to_BCD(ma); - buf[8] = U8_to_BCD(sa); - buf[9] = U8_to_BCD(fa); - - subq_generate_checksum(buf); - - for(int i = 0; i < 96; i++) - SubPWBuf[i] = (((buf[i >> 3] >> (7 - (i & 0x7))) & 1) ? 0x40 : 0x00) | 0x80; -} - -void synth_leadout_sector_lba(uint8 mode, const TOC& toc, const int32 lba, uint8* out_buf) -{ - memset(out_buf, 0, 2352 + 96); - subpw_synth_leadout_lba(toc, lba, out_buf + 2352); - - if(out_buf[2352 + 1] & 0x40) - { - if(mode == 0xFF) - { - if(toc.disc_type == DISC_TYPE_CD_XA || toc.disc_type == DISC_TYPE_CD_I) - mode = 0x02; - else - mode = 0x01; - } - - switch(mode) - { - default: - encode_mode0_sector(LBA_to_ABA(lba), out_buf); - break; - - case 0x01: - encode_mode1_sector(LBA_to_ABA(lba), out_buf); - break; - - case 0x02: - out_buf[12 + 6] = 0x20; - out_buf[12 + 10] = 0x20; - encode_mode2_form2_sector(LBA_to_ABA(lba), out_buf); - break; - } - } -} - -// ISO/IEC 10149:1995 (E): 20.2 -// -void subpw_synth_udapp_lba(const TOC& toc, const int32 lba, const int32 lba_subq_relative_offs, uint8* SubPWBuf) -{ - uint8 buf[0xC]; - uint32 lba_relative; - uint32 ma, sa, fa; - uint32 m, s, f; - - if(lba < -150 || lba >= 0) - printf("[BUG] subpw_synth_udapp_lba() lba out of range --- %d\n", lba); - - { - int32 lba_tmp = lba + lba_subq_relative_offs; - - if(lba_tmp < 0) - lba_relative = 0 - 1 - lba_tmp; - else - lba_relative = lba_tmp - 0; - } - - f = (lba_relative % 75); - s = ((lba_relative / 75) % 60); - m = (lba_relative / 75 / 60); - - fa = (lba + 150) % 75; - sa = ((lba + 150) / 75) % 60; - ma = ((lba + 150) / 75 / 60); - - uint8 adr = 0x1; // Q channel data encodes position - uint8 control; - - if(toc.disc_type == DISC_TYPE_CD_I && toc.first_track > 1) - control = 0x4; - else if(toc.tracks[toc.first_track].valid) - control = toc.tracks[toc.first_track].control; - else - control = 0x0; - - memset(buf, 0, 0xC); - buf[0] = (adr << 0) | (control << 4); - buf[1] = U8_to_BCD(toc.first_track); - buf[2] = U8_to_BCD(0x00); - - // Track relative MSF address - buf[3] = U8_to_BCD(m); - buf[4] = U8_to_BCD(s); - buf[5] = U8_to_BCD(f); - - buf[6] = 0; // Zerroooo - - // Absolute MSF address - buf[7] = U8_to_BCD(ma); - buf[8] = U8_to_BCD(sa); - buf[9] = U8_to_BCD(fa); - - subq_generate_checksum(buf); - - for(int i = 0; i < 96; i++) - SubPWBuf[i] = (((buf[i >> 3] >> (7 - (i & 0x7))) & 1) ? 0x40 : 0x00) | 0x80; -} - -void synth_udapp_sector_lba(uint8 mode, const TOC& toc, const int32 lba, int32 lba_subq_relative_offs, uint8* out_buf) -{ - memset(out_buf, 0, 2352 + 96); - subpw_synth_udapp_lba(toc, lba, lba_subq_relative_offs, out_buf + 2352); - - if(out_buf[2352 + 1] & 0x40) - { - if(mode == 0xFF) - { - if(toc.disc_type == DISC_TYPE_CD_XA || toc.disc_type == DISC_TYPE_CD_I) - mode = 0x02; - else - mode = 0x01; - } - - switch(mode) - { - default: - encode_mode0_sector(LBA_to_ABA(lba), out_buf); - break; - - case 0x01: - encode_mode1_sector(LBA_to_ABA(lba), out_buf); - break; - - case 0x02: - out_buf[12 + 6] = 0x20; - out_buf[12 + 10] = 0x20; - encode_mode2_form2_sector(LBA_to_ABA(lba), out_buf); - break; - } - } -} - -#if 0 -bool subq_extrapolate(const uint8 *subq_input, int32 position_delta, uint8 *subq_output) -{ - assert(subq_check_checksum(subq_input)); - - - subq_generate_checksum(subq_output); -} -#endif - -void scrambleize_data_sector(uint8 *sector_data) -{ - for(unsigned i = 12; i < 2352; i++) - sector_data[i] ^= scramble_table[i - 12]; -} - -} diff --git a/waterbox/pcfx/cdrom/CDUtility.h b/waterbox/pcfx/cdrom/CDUtility.h deleted file mode 100644 index 6539dc622d..0000000000 --- a/waterbox/pcfx/cdrom/CDUtility.h +++ /dev/null @@ -1,237 +0,0 @@ -#ifndef __MDFN_CDROM_CDUTILITY_H -#define __MDFN_CDROM_CDUTILITY_H - -namespace CDUtility -{ - // Call once at app startup before creating any threads that could potentially cause re-entrancy to these functions. - // It will also be called automatically if needed for the first time a function in this namespace that requires - // the initialization function to be called is called, for potential - // usage in constructors of statically-declared objects. - void CDUtility_Init(void) MDFN_COLD; - - // Quick definitions here: - // - // ABA - Absolute block address, synonymous to absolute MSF - // aba = (m_a * 60 * 75) + (s_a * 75) + f_a - // - // LBA - Logical block address(related: data CDs are required to have a pregap of 2 seconds, IE 150 frames/sectors) - // lba = aba - 150 - - - enum - { - ADR_NOQINFO = 0x00, - ADR_CURPOS = 0x01, - ADR_MCN = 0x02, - ADR_ISRC = 0x03 - }; - - - struct TOC_Track - { - uint8 adr; - uint8 control; - uint32 lba; - bool valid; // valid/present; oh CD-i... - }; - - // SubQ control field flags. - enum - { - SUBQ_CTRLF_PRE = 0x01, // With 50/15us pre-emphasis. - SUBQ_CTRLF_DCP = 0x02, // Digital copy permitted. - SUBQ_CTRLF_DATA = 0x04, // Data track. - SUBQ_CTRLF_4CH = 0x08, // 4-channel CD-DA. - }; - - enum - { - DISC_TYPE_CDDA_OR_M1 = 0x00, - DISC_TYPE_CD_I = 0x10, - DISC_TYPE_CD_XA = 0x20 - }; - - struct TOC - { - INLINE TOC() - { - Clear(); - } - - INLINE void Clear(void) - { - first_track = last_track = 0; - disc_type = 0; - - memset(tracks, 0, sizeof(tracks)); // FIXME if we change TOC_Track to non-POD type. - } - - INLINE int FindTrackByLBA(uint32 LBA) const - { - int32 lvt = 0; - - for(int32 track = 1; track <= 100; track++) - { - if(!tracks[track].valid) - continue; - - if(LBA < tracks[track].lba) - break; - - lvt = track; - } - - return(lvt); - } - - uint8 first_track; - uint8 last_track; - uint8 disc_type; - TOC_Track tracks[100 + 1]; // [0] is unused, [100] is for the leadout track. - }; - - // - // Address conversion functions. - // - static INLINE uint32 AMSF_to_ABA(int32 m_a, int32 s_a, int32 f_a) - { - return(f_a + 75 * s_a + 75 * 60 * m_a); - } - - static INLINE void ABA_to_AMSF(uint32 aba, uint8 *m_a, uint8 *s_a, uint8 *f_a) - { - *m_a = aba / 75 / 60; - *s_a = (aba - *m_a * 75 * 60) / 75; - *f_a = aba - (*m_a * 75 * 60) - (*s_a * 75); - } - - static INLINE int32 ABA_to_LBA(uint32 aba) - { - return(aba - 150); - } - - static INLINE uint32 LBA_to_ABA(int32 lba) - { - return(lba + 150); - } - - static INLINE int32 AMSF_to_LBA(uint8 m_a, uint8 s_a, uint8 f_a) - { - return(ABA_to_LBA(AMSF_to_ABA(m_a, s_a, f_a))); - } - - static INLINE void LBA_to_AMSF(int32 lba, uint8 *m_a, uint8 *s_a, uint8 *f_a) - { - ABA_to_AMSF(LBA_to_ABA(lba), m_a, s_a, f_a); - } - - // - // BCD conversion functions - // - static INLINE bool BCD_is_valid(uint8 bcd_number) - { - if((bcd_number & 0xF0) >= 0xA0) - return(false); - - if((bcd_number & 0x0F) >= 0x0A) - return(false); - - return(true); - } - - static INLINE uint8 BCD_to_U8(uint8 bcd_number) - { - return( ((bcd_number >> 4) * 10) + (bcd_number & 0x0F) ); - } - - static INLINE uint8 U8_to_BCD(uint8 num) - { - return( ((num / 10) << 4) + (num % 10) ); - } - - // should always perform the conversion, even if the bcd number is invalid. - static INLINE bool BCD_to_U8_check(uint8 bcd_number, uint8 *out_number) - { - *out_number = BCD_to_U8(bcd_number); - - if(!BCD_is_valid(bcd_number)) - return(false); - - return(true); - } - - // - // Sector data encoding functions(to full 2352 bytes raw sector). - // - // sector_data must be able to contain at least 2352 bytes. - void encode_mode0_sector(uint32 aba, uint8 *sector_data); - void encode_mode1_sector(uint32 aba, uint8 *sector_data); // 2048 bytes of user data at offset 16 - void encode_mode2_sector(uint32 aba, uint8 *sector_data); // 2336 bytes of user data at offset 16 - void encode_mode2_form1_sector(uint32 aba, uint8 *sector_data); // 2048+8 bytes of user data at offset 16 - void encode_mode2_form2_sector(uint32 aba, uint8 *sector_data); // 2324+8 bytes of user data at offset 16 - - - // User data area pre-pause(MSF 00:00:00 through 00:01:74), lba -150 through -1 - // out_buf must be able to contain 2352+96 bytes. - // "mode" is not used if the area is to be encoded as audio. - // pass 0xFF for "mode" for "don't know", and to make guess based on the TOC. - void synth_udapp_sector_lba(uint8 mode, const TOC& toc, const int32 lba, int32 lba_subq_relative_offs, uint8* out_buf); - void subpw_synth_udapp_lba(const TOC& toc, const int32 lba, const int32 lba_subq_relative_offs, uint8* SubPWBuf); - - // out_buf must be able to contain 2352+96 bytes. - // "mode" is not used if the area is to be encoded as audio. - // pass 0xFF for "mode" for "don't know", and to make guess based on the TOC. - void synth_leadout_sector_lba(uint8 mode, const TOC& toc, const int32 lba, uint8* out_buf); - void subpw_synth_leadout_lba(const TOC& toc, const int32 lba, uint8* SubPWBuf); - - - // - // User data error detection and correction - // - - // Check EDC of a mode 1 or mode 2 form 1 sector. - // Returns "true" if checksum is ok(matches). - // Returns "false" if checksum mismatch. - // sector_data should contain 2352 bytes of raw sector data. - bool edc_check(const uint8 *sector_data, bool xa); - - // Check EDC and L-EC data of a mode 1 or mode 2 form 1 sector, and correct bit errors if any exist. - // Returns "true" if errors weren't detected, or they were corrected succesfully. - // Returns "false" if errors couldn't be corrected. - // sector_data should contain 2352 bytes of raw sector data. - // - // Note: mode 2 form 1 L-EC data can't correct errors in the 4-byte sector header(address + mode), - // but the error(s) will still be detected by EDC. - bool edc_lec_check_and_correct(uint8 *sector_data, bool xa); - - // - // Subchannel(Q in particular) functions - // - - // Returns false on checksum mismatch, true on match. - bool subq_check_checksum(const uint8 *subq_buf); - - // Calculates the checksum of Q subchannel data(not including the checksum bytes of course ;)) from subq_buf, and stores it into the appropriate position - // in subq_buf. - void subq_generate_checksum(uint8 *subq_buf); - - // Deinterleaves 12 bytes of subchannel Q data from 96 bytes of interleaved subchannel PW data. - void subq_deinterleave(const uint8 *subpw_buf, uint8 *subq_buf); - - // Deinterleaves 96 bytes of subchannel P-W data from 96 bytes of interleaved subchannel PW data. - void subpw_deinterleave(const uint8 *in_buf, uint8 *out_buf); - - // Interleaves 96 bytes of subchannel P-W data from 96 bytes of uninterleaved subchannel PW data. - void subpw_interleave(const uint8 *in_buf, uint8 *out_buf); - - // Extrapolates Q subchannel current position data from subq_input, with frame/sector delta position_delta, and writes to subq_output. - // Only valid for ADR_CURPOS. - // subq_input must pass subq_check_checksum(). - // TODO - //void subq_extrapolate(const uint8 *subq_input, int32 position_delta, uint8 *subq_output); - - // (De)Scrambles data sector. - void scrambleize_data_sector(uint8 *sector_data); -} - -#endif diff --git a/waterbox/pcfx/cdrom/SimpleFIFO.h b/waterbox/pcfx/cdrom/SimpleFIFO.h deleted file mode 100644 index b12082b312..0000000000 --- a/waterbox/pcfx/cdrom/SimpleFIFO.h +++ /dev/null @@ -1,114 +0,0 @@ -#ifndef __MDFN_SIMPLEFIFO_H -#define __MDFN_SIMPLEFIFO_H - -#include -#include - -#include "../math_ops.h" - -template -class SimpleFIFO -{ - public: - - // Constructor - SimpleFIFO(uint32 the_size) // Size should be a power of 2! - { - data.resize(round_up_pow2(the_size)); - size = the_size; - read_pos = 0; - write_pos = 0; - in_count = 0; - } - - // Destructor - INLINE ~SimpleFIFO() - { - - } - - INLINE void SaveStatePostLoad(void) - { - read_pos %= data.size(); - write_pos %= data.size(); - in_count %= (data.size() + 1); - } - - INLINE uint32 CanRead(void) - { - return(in_count); - } - - INLINE uint32 CanWrite(void) - { - return(size - in_count); - } - - INLINE T ReadUnit(bool peek = false) - { - T ret; - - assert(in_count > 0); - - ret = data[read_pos]; - - if(!peek) - { - read_pos = (read_pos + 1) & (data.size() - 1); - in_count--; - } - - return(ret); - } - - INLINE uint8 ReadByte(bool peek = false) - { - assert(sizeof(T) == 1); - - return(ReadUnit(peek)); - } - - INLINE void Write(const T *happy_data, uint32 happy_count) - { - assert(CanWrite() >= happy_count); - - while(happy_count) - { - data[write_pos] = *happy_data; - - write_pos = (write_pos + 1) & (data.size() - 1); - in_count++; - happy_data++; - happy_count--; - } - } - - INLINE void WriteUnit(const T& wr_data) - { - Write(&wr_data, 1); - } - - INLINE void WriteByte(const T& wr_data) - { - assert(sizeof(T) == 1); - Write(&wr_data, 1); - } - - - INLINE void Flush(void) - { - read_pos = 0; - write_pos = 0; - in_count = 0; - } - - //private: - std::vector data; - uint32 size; - uint32 read_pos; // Read position - uint32 write_pos; // Write position - uint32 in_count; // Number of units in the FIFO -}; - - -#endif diff --git a/waterbox/pcfx/cdrom/cdromif.cpp b/waterbox/pcfx/cdrom/cdromif.cpp deleted file mode 100644 index 940708aa57..0000000000 --- a/waterbox/pcfx/cdrom/cdromif.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "../defs.h" -#include -#include -#include "cdromif.h" -//#include "CDAccess.h" -//#include "../general.h" - -#include - -using namespace CDUtility; - -enum -{ - // Status/Error messages - CDIF_MSG_DONE = 0, // Read -> emu. args: No args. - CDIF_MSG_INFO, // Read -> emu. args: str_message - CDIF_MSG_FATAL_ERROR, // Read -> emu. args: *TODO ARGS* - - // - // Command messages. - // - CDIF_MSG_DIEDIEDIE, // Emu -> read - - CDIF_MSG_READ_SECTOR, /* Emu -> read - args[0] = lba - */ -}; - - -typedef struct -{ - bool valid; - bool error; - int32 lba; - uint8 data[2352 + 96]; -} CDIF_Sector_Buffer; - - -CDIF::CDIF() : UnrecoverableError(false) -{ - -} - -CDIF::~CDIF() -{ - -} - -bool CDIF::ValidateRawSector(uint8 *buf) -{ - int mode = buf[12 + 3]; - - if(mode != 0x1 && mode != 0x2) - return(false); - - if(!edc_lec_check_and_correct(buf, mode == 2)) - return(false); - - return(true); -} - -int CDIF::ReadSector(uint8* buf, int32 lba, uint32 sector_count, bool suppress_uncorrectable_message) -{ - int ret = 0; - - if(UnrecoverableError) - return(false); - - while(sector_count--) - { - uint8 tmpbuf[2352 + 96]; - - if(!ReadRawSector(tmpbuf, lba)) - { - puts("CDIF Raw Read error"); - return(FALSE); - } - - if(!ValidateRawSector(tmpbuf)) - { - /*if(!suppress_uncorrectable_message) - { - MDFN_DispMessage(_("Uncorrectable data at sector %d"), lba); - MDFN_PrintError(_("Uncorrectable data at sector %d"), lba); - }*/ - - return(false); - } - - const int mode = tmpbuf[12 + 3]; - - if(!ret) - ret = mode; - - if(mode == 1) - { - memcpy(buf, &tmpbuf[12 + 4], 2048); - } - else if(mode == 2) - { - memcpy(buf, &tmpbuf[12 + 4 + 8], 2048); - } - else - { - printf("CDIF_ReadSector() invalid sector type at LBA=%u\n", (unsigned int)lba); - return(false); - } - - buf += 2048; - lba++; - } - - return(ret); -} diff --git a/waterbox/pcfx/cdrom/cdromif.h b/waterbox/pcfx/cdrom/cdromif.h deleted file mode 100644 index aa07a4f189..0000000000 --- a/waterbox/pcfx/cdrom/cdromif.h +++ /dev/null @@ -1,58 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __MDFN_CDROM_CDROMIF_H -#define __MDFN_CDROM_CDROMIF_H - -#include "CDUtility.h" - -#include - -typedef CDUtility::TOC CD_TOC; - -class CDIF -{ - public: - - CDIF(); - virtual ~CDIF(); - - static const int32 LBA_Read_Minimum = -150; - static const int32 LBA_Read_Maximum = 449849; // 100 * 75 * 60 - 150 - 1 - - inline void ReadTOC(CDUtility::TOC *read_target) - { - *read_target = disc_toc; - } - - virtual void HintReadSector(int32 lba) = 0; - virtual bool ReadRawSector(uint8 *buf, int32 lba) = 0; // Reads 2352+96 bytes of data into buf. - - // Call for mode 1 or mode 2 form 1 only. - bool ValidateRawSector(uint8 *buf); - - // Utility/Wrapped functions - // Reads mode 1 and mode2 form 1 sectors(2048 bytes per sector returned) - // Will return the type(1, 2) of the first sector read to the buffer supplied, 0 on error - int ReadSector(uint8* buf, int32 lba, uint32 sector_count, bool suppress_uncorrectable_message = false); - - protected: - bool UnrecoverableError; - CDUtility::TOC disc_toc; -}; - -#endif diff --git a/waterbox/pcfx/cdrom/crc32.cpp b/waterbox/pcfx/cdrom/crc32.cpp deleted file mode 100644 index 2aa4ee14a3..0000000000 --- a/waterbox/pcfx/cdrom/crc32.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * CRC32 code based upon public domain code by Ross Williams (see notes below) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#include "dvdisaster.h" - -/*** - *** EDC checksum used in CDROM sectors - ***/ - -/*****************************************************************/ -/* */ -/* CRC LOOKUP TABLE */ -/* ================ */ -/* The following CRC lookup table was generated automagically */ -/* by the Rocksoft^tm Model CRC Algorithm Table Generation */ -/* Program V1.0 using the following model parameters: */ -/* */ -/* Width : 4 bytes. */ -/* Poly : 0x8001801BL */ -/* Reverse : TRUE. */ -/* */ -/* For more information on the Rocksoft^tm Model CRC Algorithm, */ -/* see the document titled "A Painless Guide to CRC Error */ -/* Detection Algorithms" by Ross Williams */ -/* (ross@guest.adelaide.edu.au.). This document is likely to be */ -/* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */ -/* */ -/*****************************************************************/ - -static const unsigned long edctable[256] = -{ - 0x00000000L, 0x90910101L, 0x91210201L, 0x01B00300L, - 0x92410401L, 0x02D00500L, 0x03600600L, 0x93F10701L, - 0x94810801L, 0x04100900L, 0x05A00A00L, 0x95310B01L, - 0x06C00C00L, 0x96510D01L, 0x97E10E01L, 0x07700F00L, - 0x99011001L, 0x09901100L, 0x08201200L, 0x98B11301L, - 0x0B401400L, 0x9BD11501L, 0x9A611601L, 0x0AF01700L, - 0x0D801800L, 0x9D111901L, 0x9CA11A01L, 0x0C301B00L, - 0x9FC11C01L, 0x0F501D00L, 0x0EE01E00L, 0x9E711F01L, - 0x82012001L, 0x12902100L, 0x13202200L, 0x83B12301L, - 0x10402400L, 0x80D12501L, 0x81612601L, 0x11F02700L, - 0x16802800L, 0x86112901L, 0x87A12A01L, 0x17302B00L, - 0x84C12C01L, 0x14502D00L, 0x15E02E00L, 0x85712F01L, - 0x1B003000L, 0x8B913101L, 0x8A213201L, 0x1AB03300L, - 0x89413401L, 0x19D03500L, 0x18603600L, 0x88F13701L, - 0x8F813801L, 0x1F103900L, 0x1EA03A00L, 0x8E313B01L, - 0x1DC03C00L, 0x8D513D01L, 0x8CE13E01L, 0x1C703F00L, - 0xB4014001L, 0x24904100L, 0x25204200L, 0xB5B14301L, - 0x26404400L, 0xB6D14501L, 0xB7614601L, 0x27F04700L, - 0x20804800L, 0xB0114901L, 0xB1A14A01L, 0x21304B00L, - 0xB2C14C01L, 0x22504D00L, 0x23E04E00L, 0xB3714F01L, - 0x2D005000L, 0xBD915101L, 0xBC215201L, 0x2CB05300L, - 0xBF415401L, 0x2FD05500L, 0x2E605600L, 0xBEF15701L, - 0xB9815801L, 0x29105900L, 0x28A05A00L, 0xB8315B01L, - 0x2BC05C00L, 0xBB515D01L, 0xBAE15E01L, 0x2A705F00L, - 0x36006000L, 0xA6916101L, 0xA7216201L, 0x37B06300L, - 0xA4416401L, 0x34D06500L, 0x35606600L, 0xA5F16701L, - 0xA2816801L, 0x32106900L, 0x33A06A00L, 0xA3316B01L, - 0x30C06C00L, 0xA0516D01L, 0xA1E16E01L, 0x31706F00L, - 0xAF017001L, 0x3F907100L, 0x3E207200L, 0xAEB17301L, - 0x3D407400L, 0xADD17501L, 0xAC617601L, 0x3CF07700L, - 0x3B807800L, 0xAB117901L, 0xAAA17A01L, 0x3A307B00L, - 0xA9C17C01L, 0x39507D00L, 0x38E07E00L, 0xA8717F01L, - 0xD8018001L, 0x48908100L, 0x49208200L, 0xD9B18301L, - 0x4A408400L, 0xDAD18501L, 0xDB618601L, 0x4BF08700L, - 0x4C808800L, 0xDC118901L, 0xDDA18A01L, 0x4D308B00L, - 0xDEC18C01L, 0x4E508D00L, 0x4FE08E00L, 0xDF718F01L, - 0x41009000L, 0xD1919101L, 0xD0219201L, 0x40B09300L, - 0xD3419401L, 0x43D09500L, 0x42609600L, 0xD2F19701L, - 0xD5819801L, 0x45109900L, 0x44A09A00L, 0xD4319B01L, - 0x47C09C00L, 0xD7519D01L, 0xD6E19E01L, 0x46709F00L, - 0x5A00A000L, 0xCA91A101L, 0xCB21A201L, 0x5BB0A300L, - 0xC841A401L, 0x58D0A500L, 0x5960A600L, 0xC9F1A701L, - 0xCE81A801L, 0x5E10A900L, 0x5FA0AA00L, 0xCF31AB01L, - 0x5CC0AC00L, 0xCC51AD01L, 0xCDE1AE01L, 0x5D70AF00L, - 0xC301B001L, 0x5390B100L, 0x5220B200L, 0xC2B1B301L, - 0x5140B400L, 0xC1D1B501L, 0xC061B601L, 0x50F0B700L, - 0x5780B800L, 0xC711B901L, 0xC6A1BA01L, 0x5630BB00L, - 0xC5C1BC01L, 0x5550BD00L, 0x54E0BE00L, 0xC471BF01L, - 0x6C00C000L, 0xFC91C101L, 0xFD21C201L, 0x6DB0C300L, - 0xFE41C401L, 0x6ED0C500L, 0x6F60C600L, 0xFFF1C701L, - 0xF881C801L, 0x6810C900L, 0x69A0CA00L, 0xF931CB01L, - 0x6AC0CC00L, 0xFA51CD01L, 0xFBE1CE01L, 0x6B70CF00L, - 0xF501D001L, 0x6590D100L, 0x6420D200L, 0xF4B1D301L, - 0x6740D400L, 0xF7D1D501L, 0xF661D601L, 0x66F0D700L, - 0x6180D800L, 0xF111D901L, 0xF0A1DA01L, 0x6030DB00L, - 0xF3C1DC01L, 0x6350DD00L, 0x62E0DE00L, 0xF271DF01L, - 0xEE01E001L, 0x7E90E100L, 0x7F20E200L, 0xEFB1E301L, - 0x7C40E400L, 0xECD1E501L, 0xED61E601L, 0x7DF0E700L, - 0x7A80E800L, 0xEA11E901L, 0xEBA1EA01L, 0x7B30EB00L, - 0xE8C1EC01L, 0x7850ED00L, 0x79E0EE00L, 0xE971EF01L, - 0x7700F000L, 0xE791F101L, 0xE621F201L, 0x76B0F300L, - 0xE541F401L, 0x75D0F500L, 0x7460F600L, 0xE4F1F701L, - 0xE381F801L, 0x7310F900L, 0x72A0FA00L, 0xE231FB01L, - 0x71C0FC00L, 0xE151FD01L, 0xE0E1FE01L, 0x7070FF00L -}; - -/* - * CDROM EDC calculation - */ - -uint32 EDCCrc32(const unsigned char *data, int len) -{ - uint32 crc = 0; - - while(len--) - crc = edctable[(crc ^ *data++) & 0xFF] ^ (crc >> 8); - - return crc; -} diff --git a/waterbox/pcfx/cdrom/dvdisaster.h b/waterbox/pcfx/cdrom/dvdisaster.h deleted file mode 100644 index bed440fca3..0000000000 --- a/waterbox/pcfx/cdrom/dvdisaster.h +++ /dev/null @@ -1,171 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#ifndef DVDISASTER_H -#define DVDISASTER_H - -/* "Dare to be gorgeous and unique. - * But don't ever be cryptic or otherwise unfathomable. - * Make it unforgettably great." - * - * From "A Final Note on Style", - * Amiga Intuition Reference Manual, 1986, p. 231 - */ - -/*** - *** I'm too lazy to mess with #include dependencies. - *** Everything #includeable is rolled up herein... - */ - -#include "../defs.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/*** - *** dvdisaster.c - ***/ - -void PrepareDeadSector(void); - -void CreateEcc(void); -void FixEcc(void); -void Verify(void); - -uint32 EDCCrc32(const unsigned char*, int); - -/*** - *** galois.c - *** - * This is currently the hardcoded GF(2**8). - * int32 gives abundant space for the GF. - * Squeezing it down to uint8 won't probably gain much, - * so we implement this defensively here. - * - * Note that some performance critical stuff needs to - * be #included from galois-inlines.h - */ - -/* Galois field parameters for 8bit symbol Reed-Solomon code */ - -#define GF_SYMBOLSIZE 8 -#define GF_FIELDSIZE (1<= GF_FIELDMAX) - { - x -= GF_FIELDMAX; - x = (x >> GF_SYMBOLSIZE) + (x & GF_FIELDMAX); - } - - return x; -} diff --git a/waterbox/pcfx/cdrom/galois.cpp b/waterbox/pcfx/cdrom/galois.cpp deleted file mode 100644 index 2792cfc341..0000000000 --- a/waterbox/pcfx/cdrom/galois.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * The Reed-Solomon error correction draws a lot of inspiration - and even code - - * from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#include "dvdisaster.h" - -#include "galois-inlines.h" - -/*** - *** Galois field arithmetic. - *** - * Calculations are done over the extension field GF(2**n). - * Be careful not to overgeneralize these arithmetics; - * they only work for the case of GF(p**n) with p being prime. - */ - -/* Initialize the Galois field tables */ - - -GaloisTables* CreateGaloisTables(int32 gf_generator) -{ - GaloisTables *gt = (GaloisTables *)calloc(1, sizeof(GaloisTables)); - int32 b,log; - - /* Allocate the tables. - The encoder uses a special version of alpha_to which has the mod_fieldmax() - folded into the table. */ - - gt->gfGenerator = gf_generator; - - gt->indexOf = (int32 *)calloc(GF_FIELDSIZE, sizeof(int32)); - gt->alphaTo = (int32 *)calloc(GF_FIELDSIZE, sizeof(int32)); - gt->encAlphaTo = (int32 *)calloc(2*GF_FIELDSIZE, sizeof(int32)); - - /* create the log/ilog values */ - - for(b=1, log=0; logindexOf[b] = log; - gt->alphaTo[log] = b; - b = b << 1; - if(b & GF_FIELDSIZE) - b = b ^ gf_generator; - } - - if(b!=1) - { - printf("Failed to create the Galois field log tables!\n"); - exit(1); - } - - /* we're even closed using infinity (makes things easier) */ - - gt->indexOf[0] = GF_ALPHA0; /* log(0) = inf */ - gt->alphaTo[GF_ALPHA0] = 0; /* and the other way around */ - - for(b=0; b<2*GF_FIELDSIZE; b++) - gt->encAlphaTo[b] = gt->alphaTo[mod_fieldmax(b)]; - - return gt; -} - -void FreeGaloisTables(GaloisTables *gt) -{ - if(gt->indexOf) free(gt->indexOf); - if(gt->alphaTo) free(gt->alphaTo); - if(gt->encAlphaTo) free(gt->encAlphaTo); - - free(gt); -} - -/*** - *** Create the the Reed-Solomon generator polynomial - *** and some auxiliary data structures. - */ - -ReedSolomonTables *CreateReedSolomonTables(GaloisTables *gt, - int32 first_consecutive_root, - int32 prim_elem, - int nroots_in) -{ ReedSolomonTables *rt = (ReedSolomonTables *)calloc(1, sizeof(ReedSolomonTables)); - int32 i,j,root; - - rt->gfTables = gt; - rt->fcr = first_consecutive_root; - rt->primElem = prim_elem; - rt->nroots = nroots_in; - rt->ndata = GF_FIELDMAX - rt->nroots; - - rt->gpoly = (int32 *)calloc((rt->nroots+1), sizeof(int32)); - - /* Create the RS code generator polynomial */ - - rt->gpoly[0] = 1; - - for(i=0, root=first_consecutive_root*prim_elem; inroots; i++, root+=prim_elem) - { rt->gpoly[i+1] = 1; - - /* Multiply gpoly by alpha**(root+x) */ - - for(j=i; j>0; j--) - { - if(rt->gpoly[j] != 0) - rt->gpoly[j] = rt->gpoly[j-1] ^ gt->alphaTo[mod_fieldmax(gt->indexOf[rt->gpoly[j]] + root)]; - else - rt->gpoly[j] = rt->gpoly[j-1]; - } - - rt->gpoly[0] = gt->alphaTo[mod_fieldmax(gt->indexOf[rt->gpoly[0]] + root)]; - } - - /* Store the polynomials index for faster encoding */ - - for(i=0; i<=rt->nroots; i++) - rt->gpoly[i] = gt->indexOf[rt->gpoly[i]]; - -#if 0 - /* for the precalculated unrolled loops only */ - - for(i=gt->nroots-1; i>0; i--) - PrintCLI( - " par_idx[((++spk)&%d)] ^= enc_alpha_to[feedback + %3d];\n", - nroots-1,gt->gpoly[i]); - - PrintCLI(" par_idx[sp] = enc_alpha_to[feedback + %3d];\n", - gt->gpoly[0]); -#endif - - return rt; -} - -void FreeReedSolomonTables(ReedSolomonTables *rt) -{ - if(rt->gpoly) free(rt->gpoly); - - free(rt); -} diff --git a/waterbox/pcfx/cdrom/l-ec.cpp b/waterbox/pcfx/cdrom/l-ec.cpp deleted file mode 100644 index 5c035ce4ab..0000000000 --- a/waterbox/pcfx/cdrom/l-ec.cpp +++ /dev/null @@ -1,478 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * The Reed-Solomon error correction draws a lot of inspiration - and even code - - * from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#include "dvdisaster.h" - -#include "galois-inlines.h" - -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -/*** - *** Mapping between cd frame and parity vectors - ***/ - -/* - * Mapping of frame bytes to P/Q Vectors - */ - -int PToByteIndex(int p, int i) -{ return 12 + p + i*86; -} - -void ByteIndexToP(int b, int *p, int *i) -{ *p = (b-12)%86; - *i = (b-12)/86; -} - -int QToByteIndex(int q, int i) -{ int offset = 12 + (q & 1); - - if(i == 43) return 2248+q; - if(i == 44) return 2300+q; - - q&=~1; - return offset + (q*43 + i*88) % 2236; -} - -void ByteIndexToQ(int b, int *q, int *i) -{ int x,y,offset; - - if(b >= 2300) - { *i = 44; - *q = (b-2300); - return; - } - - if(b >= 2248) - { *i = 43; - *q = (b-2248); - return; - } - - offset = b&1; - b = (b-12)/2; - x = b/43; - y = (b-(x*43))%26; - *i = b-(x*43); - *q = 2*((x+26-y)%26)+offset; -} - -/* - * There are 86 vectors of P-parity, yielding a RS(26,24) code. - */ - -void GetPVector(unsigned char *frame, unsigned char *data, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - data[i] = frame[w_idx]; -} - -void SetPVector(unsigned char *frame, unsigned char *data, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - frame[w_idx] = data[i]; -} - -void FillPVector(unsigned char *frame, unsigned char data, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - frame[w_idx] = data; -} - -void OrPVector(unsigned char *frame, unsigned char value, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - frame[w_idx] |= value; -} - -void AndPVector(unsigned char *frame, unsigned char value, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - frame[w_idx] &= value; -} - -/* - * There are 52 vectors of Q-parity, yielding a RS(45,43) code. - */ - -void GetQVector(unsigned char *frame, unsigned char *data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - data[i] = frame[(w_idx % 2236) + offset]; - - data[43] = frame[2248 + n]; - data[44] = frame[2300 + n]; -} - -void SetQVector(unsigned char *frame, unsigned char *data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - frame[(w_idx % 2236) + offset] = data[i]; - - frame[2248 + n] = data[43]; - frame[2300 + n] = data[44]; -} - -void FillQVector(unsigned char *frame, unsigned char data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - frame[(w_idx % 2236) + offset] = data; - - frame[2248 + n] = data; - frame[2300 + n] = data; -} - -void OrQVector(unsigned char *frame, unsigned char data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - frame[(w_idx % 2236) + offset] |= data; - - frame[2248 + n] |= data; - frame[2300 + n] |= data; -} - -void AndQVector(unsigned char *frame, unsigned char data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - frame[(w_idx % 2236) + offset] &= data; - - frame[2248 + n] &= data; - frame[2300 + n] &= data; -} - -/*** - *** C2 error counting - ***/ - -int CountC2Errors(unsigned char *frame) -{ int i,count = 0; - frame += 2352; - - for(i=0; i<294; i++, frame++) - { if(*frame & 0x01) count++; - if(*frame & 0x02) count++; - if(*frame & 0x04) count++; - if(*frame & 0x08) count++; - if(*frame & 0x10) count++; - if(*frame & 0x20) count++; - if(*frame & 0x40) count++; - if(*frame & 0x80) count++; - } - - return count; -} - -/*** - *** L-EC error correction for CD raw data sectors - ***/ - -/* - * These could be used from ReedSolomonTables, - * but hardcoding them is faster. - */ - -#define NROOTS 2 -#define LEC_FIRST_ROOT 0 //GF_ALPHA0 -#define LEC_PRIM_ELEM 1 -#define LEC_PRIMTH_ROOT 1 - -/* - * Calculate the error syndrome - */ - -int DecodePQ(ReedSolomonTables *rt, unsigned char *data, int padding, - int *erasure_list, int erasure_count) -{ GaloisTables *gt = rt->gfTables; - int syndrome[NROOTS]; - int lambda[NROOTS+1]; - int omega[NROOTS+1]; - int b[NROOTS+1]; - int reg[NROOTS+1]; - int root[NROOTS]; - int loc[NROOTS]; - int syn_error; - int deg_lambda,lambda_roots; - int deg_omega; - int shortened_size = GF_FIELDMAX - padding; - int corrected = 0; - int i,j,k; - int r,el; - - /*** Form the syndromes: Evaluate data(x) at roots of g(x) */ - - for(i=0; ialphaTo[mod_fieldmax(gt->indexOf[syndrome[i]] - + (LEC_FIRST_ROOT+i)*LEC_PRIM_ELEM)]; - - /*** Convert syndrome to index form, check for nonzero condition. */ - - syn_error = 0; - for(i=0; iindexOf[syndrome[i]]; - } - - /*** If the syndrome is zero, everything is fine. */ - - if(!syn_error) - return 0; - - /*** Initialize lambda to be the erasure locator polynomial */ - - lambda[0] = 1; - lambda[1] = lambda[2] = 0; - - erasure_list[0] += padding; - erasure_list[1] += padding; - - if(erasure_count > 2) /* sanity check */ - erasure_count = 0; - - if(erasure_count > 0) - { lambda[1] = gt->alphaTo[mod_fieldmax(LEC_PRIM_ELEM*(GF_FIELDMAX-1-erasure_list[0]))]; - - for(i=1; i0; j--) - { int tmp = gt->indexOf[lambda[j-1]]; - - if(tmp != GF_ALPHA0) - lambda[j] ^= gt->alphaTo[mod_fieldmax(u + tmp)]; - } - } - } - - for(i=0; iindexOf[lambda[i]]; - - /*** Berlekamp-Massey algorithm to determine error+erasure locator polynomial */ - - r = erasure_count; /* r is the step number */ - el = erasure_count; - - /* Compute discrepancy at the r-th step in poly-form */ - - while(++r <= NROOTS) - { int discr_r = 0; - - for(i=0; ialphaTo[mod_fieldmax(gt->indexOf[lambda[i]] + syndrome[r-i-1])]; - - discr_r = gt->indexOf[discr_r]; - - if(discr_r == GF_ALPHA0) - { /* B(x) = x*B(x) */ - memmove(b+1, b, NROOTS*sizeof(b[0])); - b[0] = GF_ALPHA0; - } - else - { int t[NROOTS+1]; - - /* T(x) = lambda(x) - discr_r*x*b(x) */ - t[0] = lambda[0]; - for(i=0; ialphaTo[mod_fieldmax(discr_r + b[i])]; - else t[i+1] = lambda[i+1]; - } - - if(2*el <= r+erasure_count-1) - { el = r + erasure_count - el; - - /* B(x) <-- inv(discr_r) * lambda(x) */ - for(i=0; i<=NROOTS; i++) - b[i] = (lambda[i] == 0) ? GF_ALPHA0 - : mod_fieldmax(gt->indexOf[lambda[i]] - discr_r + GF_FIELDMAX); - } - else - { /* 2 lines below: B(x) <-- x*B(x) */ - memmove(b+1, b, NROOTS*sizeof(b[0])); - b[0] = GF_ALPHA0; - } - - memcpy(lambda, t, (NROOTS+1)*sizeof(t[0])); - } - } - - /*** Convert lambda to index form and compute deg(lambda(x)) */ - - deg_lambda = 0; - for(i=0; iindexOf[lambda[i]]; - if(lambda[i] != GF_ALPHA0) - deg_lambda = i; - } - - /*** Find roots of the error+erasure locator polynomial by Chien search */ - - memcpy(reg+1, lambda+1, NROOTS*sizeof(reg[0])); - lambda_roots = 0; /* Number of roots of lambda(x) */ - - for(i=1, k=LEC_PRIMTH_ROOT-1; i<=GF_FIELDMAX; i++, k=mod_fieldmax(k+LEC_PRIMTH_ROOT)) - { int q=1; /* lambda[0] is always 0 */ - - for(j=deg_lambda; j>0; j--) - { if(reg[j] != GF_ALPHA0) - { reg[j] = mod_fieldmax(reg[j] + j); - q ^= gt->alphaTo[reg[j]]; - } - } - - if(q != 0) continue; /* Not a root */ - - /* store root in index-form and the error location number */ - - root[lambda_roots] = i; - loc[lambda_roots] = k; - - /* If we've already found max possible roots, abort the search to save time */ - - if(++lambda_roots == deg_lambda) break; - } - - /* deg(lambda) unequal to number of roots => uncorrectable error detected - This is not reliable for very small numbers of roots, e.g. nroots = 2 */ - - if(deg_lambda != lambda_roots) - { return -1; - } - - /* Compute err+eras evaluator poly omega(x) = syn(x)*lambda(x) - (modulo x**nroots). in index form. Also find deg(omega). */ - - deg_omega = deg_lambda-1; - - for(i=0; i<=deg_omega; i++) - { int tmp = 0; - - for(j=i; j>=0; j--) - { if((syndrome[i - j] != GF_ALPHA0) && (lambda[j] != GF_ALPHA0)) - tmp ^= gt->alphaTo[mod_fieldmax(syndrome[i - j] + lambda[j])]; - } - - omega[i] = gt->indexOf[tmp]; - } - - /* Compute error values in poly-form. - num1 = omega(inv(X(l))), - num2 = inv(X(l))**(FIRST_ROOT-1) and - den = lambda_pr(inv(X(l))) all in poly-form. */ - - for(j=lambda_roots-1; j>=0; j--) - { int num1 = 0; - int num2; - int den; - int location = loc[j]; - - for(i=deg_omega; i>=0; i--) - { if(omega[i] != GF_ALPHA0) - num1 ^= gt->alphaTo[mod_fieldmax(omega[i] + i * root[j])]; - } - - num2 = gt->alphaTo[mod_fieldmax(root[j] * (LEC_FIRST_ROOT - 1) + GF_FIELDMAX)]; - den = 0; - - /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ - - for(i=MIN(deg_lambda, NROOTS-1) & ~1; i>=0; i-=2) - { if(lambda[i+1] != GF_ALPHA0) - den ^= gt->alphaTo[mod_fieldmax(lambda[i+1] + i * root[j])]; - } - - /* Apply error to data */ - - if(num1 != 0 && location >= padding) - { - corrected++; - data[location-padding] ^= gt->alphaTo[mod_fieldmax(gt->indexOf[num1] + gt->indexOf[num2] - + GF_FIELDMAX - gt->indexOf[den])]; - - /* If no erasures were given, at most one error was corrected. - Return its position in erasure_list[0]. */ - - if(!erasure_count) - erasure_list[0] = location-padding; - } -#if 1 - else return -3; -#endif - } - - /*** Form the syndromes: Evaluate data(x) at roots of g(x) */ - - for(i=0; ialphaTo[mod_fieldmax(gt->indexOf[syndrome[i]] - + (LEC_FIRST_ROOT+i)*LEC_PRIM_ELEM)]; - } - - /*** Convert syndrome to index form, check for nonzero condition. */ -#if 1 - for(i=0; i - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include "lec.h" - -#define GF8_PRIM_POLY 0x11d /* x^8 + x^4 + x^3 + x^2 + 1 */ - -#define EDC_POLY 0x8001801b /* (x^16 + x^15 + x^2 + 1) (x^16 + x^2 + x + 1) */ - -#define LEC_HEADER_OFFSET 12 -#define LEC_DATA_OFFSET 16 -#define LEC_MODE1_DATA_LEN 2048 -#define LEC_MODE1_EDC_OFFSET 2064 -#define LEC_MODE1_INTERMEDIATE_OFFSET 2068 -#define LEC_MODE1_P_PARITY_OFFSET 2076 -#define LEC_MODE1_Q_PARITY_OFFSET 2248 -#define LEC_MODE2_FORM1_DATA_LEN (2048+8) -#define LEC_MODE2_FORM1_EDC_OFFSET 2072 -#define LEC_MODE2_FORM2_DATA_LEN (2324+8) -#define LEC_MODE2_FORM2_EDC_OFFSET 2348 - - -typedef u_int8_t gf8_t; - -static u_int8_t GF8_LOG[256]; -static gf8_t GF8_ILOG[256]; - -static const class Gf8_Q_Coeffs_Results_01 { -private: - u_int16_t table[43][256]; -public: - Gf8_Q_Coeffs_Results_01(); - ~Gf8_Q_Coeffs_Results_01() {} - const u_int16_t *operator[] (int i) const { return &table[i][0]; } - operator const u_int16_t *() const { return &table[0][0]; } -} CF8_Q_COEFFS_RESULTS_01; - -static const class CrcTable { -private: - u_int32_t table[256]; -public: - CrcTable(); - ~CrcTable() {} - u_int32_t operator[](int i) const { return table[i]; } - operator const u_int32_t *() const { return table; } -} CRCTABLE; - -static const class ScrambleTable { -private: - u_int8_t table[2340]; -public: - ScrambleTable(); - ~ScrambleTable() {} - u_int8_t operator[](int i) const { return table[i]; } - operator const u_int8_t *() const { return table; } -} SCRAMBLE_TABLE; - -/* Creates the logarithm and inverse logarithm table that is required - * for performing multiplication in the GF(8) domain. - */ -static void gf8_create_log_tables() -{ - u_int8_t log; - u_int16_t b; - - for (b = 0; b <= 255; b++) { - GF8_LOG[b] = 0; - GF8_ILOG[b] = 0; - } - - b = 1; - - for (log = 0; log < 255; log++) { - GF8_LOG[(u_int8_t)b] = log; - GF8_ILOG[log] = (u_int8_t)b; - - b <<= 1; - - if ((b & 0x100) != 0) - b ^= GF8_PRIM_POLY; - } -} - -/* Addition in the GF(8) domain: just the XOR of the values. - */ -#define gf8_add(a, b) (a) ^ (b) - - -/* Multiplication in the GF(8) domain: add the logarithms (modulo 255) - * and return the inverse logarithm. Not used! - */ -#if 0 -static gf8_t gf8_mult(gf8_t a, gf8_t b) -{ - int16_t sum; - - if (a == 0 || b == 0) - return 0; - - sum = GF8_LOG[a] + GF8_LOG[b]; - - if (sum >= 255) - sum -= 255; - - return GF8_ILOG[sum]; -} -#endif - -/* Division in the GF(8) domain: Like multiplication but logarithms a - * subtracted. - */ -static gf8_t gf8_div(gf8_t a, gf8_t b) -{ - int16_t sum; - - assert(b != 0); - - if (a == 0) - return 0; - - sum = GF8_LOG[a] - GF8_LOG[b]; - - if (sum < 0) - sum += 255; - - return GF8_ILOG[sum]; -} - -Gf8_Q_Coeffs_Results_01::Gf8_Q_Coeffs_Results_01() -{ - int i, j; - u_int16_t c; - gf8_t GF8_COEFFS_HELP[2][45]; - u_int8_t GF8_Q_COEFFS[2][45]; - - - gf8_create_log_tables(); - - /* build matrix H: - * 1 1 ... 1 1 - * a^44 a^43 ... a^1 a^0 - * - * - */ - - for (j = 0; j < 45; j++) { - GF8_COEFFS_HELP[0][j] = 1; /* e0 */ - GF8_COEFFS_HELP[1][j] = GF8_ILOG[44-j]; /* e1 */ - } - - - /* resolve equation system for parity byte 0 and 1 */ - - /* e1' = e1 + e0 */ - for (j = 0; j < 45; j++) { - GF8_Q_COEFFS[1][j] = gf8_add(GF8_COEFFS_HELP[1][j], - GF8_COEFFS_HELP[0][j]); - } - - /* e1'' = e1' / (a^1 + 1) */ - for (j = 0; j < 45; j++) { - GF8_Q_COEFFS[1][j] = gf8_div(GF8_Q_COEFFS[1][j], GF8_Q_COEFFS[1][43]); - } - - /* e0' = e0 + e1 / a^1 */ - for (j = 0; j < 45; j++) { - GF8_Q_COEFFS[0][j] = gf8_add(GF8_COEFFS_HELP[0][j], - gf8_div(GF8_COEFFS_HELP[1][j], - GF8_ILOG[1])); - } - - /* e0'' = e0' / (1 + 1 / a^1) */ - for (j = 0; j < 45; j++) { - GF8_Q_COEFFS[0][j] = gf8_div(GF8_Q_COEFFS[0][j], GF8_Q_COEFFS[0][44]); - } - - /* - * Compute the products of 0..255 with all of the Q coefficients in - * advance. When building the scalar product between the data vectors - * and the P/Q vectors the individual products can be looked up in - * this table - * - * The P parity coefficients are just a subset of the Q coefficients so - * that we do not need to create a separate table for them. - */ - - for (j = 0; j < 43; j++) { - - table[j][0] = 0; - - for (i = 1; i < 256; i++) { - c = GF8_LOG[i] + GF8_LOG[GF8_Q_COEFFS[0][j]]; - if (c >= 255) c -= 255; - table[j][i] = GF8_ILOG[c]; - - c = GF8_LOG[i] + GF8_LOG[GF8_Q_COEFFS[1][j]]; - if (c >= 255) c -= 255; - table[j][i] |= GF8_ILOG[c]<<8; - } - } -} - -/* Reverses the bits in 'd'. 'bits' defines the bit width of 'd'. - */ -static u_int32_t mirror_bits(u_int32_t d, int bits) -{ - int i; - u_int32_t r = 0; - - for (i = 0; i < bits; i++) { - r <<= 1; - - if ((d & 0x1) != 0) - r |= 0x1; - - d >>= 1; - } - - return r; -} - -/* Build the CRC lookup table for EDC_POLY poly. The CRC is 32 bit wide - * and reversed (i.e. the bit stream is divided by the EDC_POLY with the - * LSB first order). - */ -CrcTable::CrcTable () -{ - u_int32_t i, j; - u_int32_t r; - - for (i = 0; i < 256; i++) { - r = mirror_bits(i, 8); - - r <<= 24; - - for (j = 0; j < 8; j++) { - if ((r & 0x80000000) != 0) { - r <<= 1; - r ^= EDC_POLY; - } - else { - r <<= 1; - } - } - - r = mirror_bits(r, 32); - - table[i] = r; - } -} - -/* Calculates the CRC of given data with given lengths based on the - * table lookup algorithm. - */ -static u_int32_t calc_edc(u_int8_t *data, int len) -{ - u_int32_t crc = 0; - - while (len--) { - crc = CRCTABLE[(int)(crc ^ *data++) & 0xff] ^ (crc >> 8); - } - - return crc; -} - -/* Build the scramble table as defined in the yellow book. The bytes - 12 to 2351 of a sector will be XORed with the data of this table. - */ -ScrambleTable::ScrambleTable() -{ - u_int16_t i, j; - u_int16_t reg = 1; - u_int8_t d; - - for (i = 0; i < 2340; i++) { - d = 0; - - for (j = 0; j < 8; j++) { - d >>= 1; - - if ((reg & 0x1) != 0) - d |= 0x80; - - if ((reg & 0x1) != ((reg >> 1) & 0x1)) { - reg >>= 1; - reg |= 0x4000; /* 15-bit register */ - } - else { - reg >>= 1; - } - } - - table[i] = d; - } -} - -/* Calc EDC for a MODE 1 sector - */ -static void calc_mode1_edc(u_int8_t *sector) -{ - u_int32_t crc = calc_edc(sector, LEC_MODE1_DATA_LEN + 16); - - sector[LEC_MODE1_EDC_OFFSET] = crc & 0xffL; - sector[LEC_MODE1_EDC_OFFSET + 1] = (crc >> 8) & 0xffL; - sector[LEC_MODE1_EDC_OFFSET + 2] = (crc >> 16) & 0xffL; - sector[LEC_MODE1_EDC_OFFSET + 3] = (crc >> 24) & 0xffL; -} - -/* Calc EDC for a XA form 1 sector - */ -static void calc_mode2_form1_edc(u_int8_t *sector) -{ - u_int32_t crc = calc_edc(sector + LEC_DATA_OFFSET, - LEC_MODE2_FORM1_DATA_LEN); - - sector[LEC_MODE2_FORM1_EDC_OFFSET] = crc & 0xffL; - sector[LEC_MODE2_FORM1_EDC_OFFSET + 1] = (crc >> 8) & 0xffL; - sector[LEC_MODE2_FORM1_EDC_OFFSET + 2] = (crc >> 16) & 0xffL; - sector[LEC_MODE2_FORM1_EDC_OFFSET + 3] = (crc >> 24) & 0xffL; -} - -/* Calc EDC for a XA form 2 sector - */ -static void calc_mode2_form2_edc(u_int8_t *sector) -{ - u_int32_t crc = calc_edc(sector + LEC_DATA_OFFSET, - LEC_MODE2_FORM2_DATA_LEN); - - sector[LEC_MODE2_FORM2_EDC_OFFSET] = crc & 0xffL; - sector[LEC_MODE2_FORM2_EDC_OFFSET + 1] = (crc >> 8) & 0xffL; - sector[LEC_MODE2_FORM2_EDC_OFFSET + 2] = (crc >> 16) & 0xffL; - sector[LEC_MODE2_FORM2_EDC_OFFSET + 3] = (crc >> 24) & 0xffL; -} - -/* Writes the sync pattern to the given sector. - */ -static void set_sync_pattern(u_int8_t *sector) -{ - sector[0] = 0; - - sector[1] = sector[2] = sector[3] = sector[4] = sector[5] = - sector[6] = sector[7] = sector[8] = sector[9] = sector[10] = 0xff; - - sector[11] = 0; -} - - -static u_int8_t bin2bcd(u_int8_t b) -{ - return (((b/10) << 4) & 0xf0) | ((b%10) & 0x0f); -} - -/* Builds the sector header. - */ -static void set_sector_header(u_int8_t mode, u_int32_t adr, u_int8_t *sector) -{ - sector[LEC_HEADER_OFFSET] = bin2bcd(adr / (60*75)); - sector[LEC_HEADER_OFFSET + 1] = bin2bcd((adr / 75) % 60); - sector[LEC_HEADER_OFFSET + 2] = bin2bcd(adr % 75); - sector[LEC_HEADER_OFFSET + 3] = mode; -} - -/* Calculate the P parities for the sector. - * The 43 P vectors of length 24 are combined with the GF8_P_COEFFS. - */ -static void calc_P_parity(u_int8_t *sector) -{ - int i, j; - u_int16_t p01_msb, p01_lsb; - u_int8_t *p_lsb_start; - u_int8_t *p_lsb; - u_int8_t *p0, *p1; - u_int8_t d0,d1; - - p_lsb_start = sector + LEC_HEADER_OFFSET; - - p1 = sector + LEC_MODE1_P_PARITY_OFFSET; - p0 = sector + LEC_MODE1_P_PARITY_OFFSET + 2 * 43; - - for (i = 0; i <= 42; i++) { - p_lsb = p_lsb_start; - - p01_lsb = p01_msb = 0; - - for (j = 19; j <= 42; j++) { - d0 = *p_lsb; - d1 = *(p_lsb+1); - - p01_lsb ^= CF8_Q_COEFFS_RESULTS_01[j][d0]; - p01_msb ^= CF8_Q_COEFFS_RESULTS_01[j][d1]; - - p_lsb += 2 * 43; - } - - *p0 = p01_lsb; - *(p0 + 1) = p01_msb; - - *p1 = p01_lsb>>8; - *(p1 + 1) = p01_msb>>8; - - p0 += 2; - p1 += 2; - - p_lsb_start += 2; - } -} - -/* Calculate the Q parities for the sector. - * The 26 Q vectors of length 43 are combined with the GF8_Q_COEFFS. - */ -static void calc_Q_parity(u_int8_t *sector) -{ - int i, j; - u_int16_t q01_lsb, q01_msb; - u_int8_t *q_lsb_start; - u_int8_t *q_lsb; - u_int8_t *q0, *q1, *q_start; - u_int8_t d0,d1; - - q_lsb_start = sector + LEC_HEADER_OFFSET; - - q_start = sector + LEC_MODE1_Q_PARITY_OFFSET; - q1 = sector + LEC_MODE1_Q_PARITY_OFFSET; - q0 = sector + LEC_MODE1_Q_PARITY_OFFSET + 2 * 26; - - for (i = 0; i <= 25; i++) { - q_lsb = q_lsb_start; - - q01_lsb = q01_msb = 0; - - for (j = 0; j <= 42; j++) { - d0 = *q_lsb; - d1 = *(q_lsb+1); - - q01_lsb ^= CF8_Q_COEFFS_RESULTS_01[j][d0]; - q01_msb ^= CF8_Q_COEFFS_RESULTS_01[j][d1]; - - q_lsb += 2 * 44; - - if (q_lsb >= q_start) { - q_lsb -= 2 * 1118; - } - } - - *q0 = q01_lsb; - *(q0 + 1) = q01_msb; - - *q1 = q01_lsb>>8; - *(q1 + 1) = q01_msb>>8; - - q0 += 2; - q1 += 2; - - q_lsb_start += 2 * 43; - } -} - -/* Encodes a MODE 0 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide - */ -void lec_encode_mode0_sector(u_int32_t adr, u_int8_t *sector) -{ - u_int16_t i; - - set_sync_pattern(sector); - set_sector_header(0, adr, sector); - - sector += 16; - - for (i = 0; i < 2336; i++) - *sector++ = 0; -} - -/* Encodes a MODE 1 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2048 bytes user data at - * offset 16 - */ -void lec_encode_mode1_sector(u_int32_t adr, u_int8_t *sector) -{ - set_sync_pattern(sector); - set_sector_header(1, adr, sector); - - calc_mode1_edc(sector); - - /* clear the intermediate field */ - sector[LEC_MODE1_INTERMEDIATE_OFFSET] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 1] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 2] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 3] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 4] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 5] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 6] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 7] = 0; - - calc_P_parity(sector); - calc_Q_parity(sector); -} - -/* Encodes a MODE 2 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2336 bytes user data at - * offset 16 - */ -void lec_encode_mode2_sector(u_int32_t adr, u_int8_t *sector) -{ - set_sync_pattern(sector); - set_sector_header(2, adr, sector); -} - -/* Encodes a XA form 1 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2048+8 bytes user data at - * offset 16 - */ -void lec_encode_mode2_form1_sector(u_int32_t adr, u_int8_t *sector) -{ - set_sync_pattern(sector); - - calc_mode2_form1_edc(sector); - - /* P/Q partiy must not contain the sector header so clear it */ - sector[LEC_HEADER_OFFSET] = - sector[LEC_HEADER_OFFSET + 1] = - sector[LEC_HEADER_OFFSET + 2] = - sector[LEC_HEADER_OFFSET + 3] = 0; - - calc_P_parity(sector); - calc_Q_parity(sector); - - /* finally add the sector header */ - set_sector_header(2, adr, sector); -} - -/* Encodes a XA form 2 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2324+8 bytes user data at - * offset 16 - */ -void lec_encode_mode2_form2_sector(u_int32_t adr, u_int8_t *sector) -{ - set_sync_pattern(sector); - - calc_mode2_form2_edc(sector); - - set_sector_header(2, adr, sector); -} - -/* Scrambles and byte swaps an encoded sector. - * 'sector' must be 2352 byte wide. - */ -void lec_scramble(u_int8_t *sector) -{ - u_int16_t i; - const u_int8_t *stable = SCRAMBLE_TABLE; - u_int8_t *p = sector; - u_int8_t tmp; - - - for (i = 0; i < 6; i++) { - /* just swap bytes of sector sync */ - tmp = *p; - *p = *(p + 1); - p++; - *p++ = tmp; - } - for (;i < (2352 / 2); i++) { - /* scramble and swap bytes */ - tmp = *p ^ *stable++; - *p = *(p + 1) ^ *stable++; - p++; - *p++ = tmp; - } -} - -#if 0 -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - char *infile; - char *outfile; - int fd_in, fd_out; - u_int8_t buffer1[2352]; - u_int8_t buffer2[2352]; - u_int32_t lba; - int i; - -#if 0 - for (i = 0; i < 2048; i++) - buffer1[i + 16] = 234; - - lba = 150; - - for (i = 0; i < 100000; i++) { - lec_encode_mode1_sector(lba, buffer1); - lec_scramble(buffer2); - lba++; - } - -#else - - if (argc != 3) - return 1; - - infile = argv[1]; - outfile = argv[2]; - - - if ((fd_in = open(infile, O_RDONLY)) < 0) { - perror("Cannot open input file"); - return 1; - } - - if ((fd_out = open(outfile, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) { - perror("Cannot open output file"); - return 1; - } - - lba = 150; - - do { - if (read(fd_in, buffer1, 2352) != 2352) - break; - - switch (*(buffer1 + 12 + 3)) { - case 1: - memcpy(buffer2 + 16, buffer1 + 16, 2048); - - lec_encode_mode1_sector(lba, buffer2); - break; - - case 2: - if ((*(buffer1 + 12 + 4 + 2) & 0x20) != 0) { - /* form 2 sector */ - memcpy(buffer2 + 16, buffer1 + 16, 2324 + 8); - lec_encode_mode2_form2_sector(lba, buffer2); - } - else { - /* form 1 sector */ - memcpy(buffer2 + 16, buffer1 + 16, 2048 + 8); - lec_encode_mode2_form1_sector(lba, buffer2); - } - break; - } - - if (memcmp(buffer1, buffer2, 2352) != 0) { - printf("Verify error at lba %ld\n", lba); - } - - lec_scramble(buffer2); - write(fd_out, buffer2, 2352); - - lba++; - } while (1); - - close(fd_in); - close(fd_out); - -#endif - - return 0; -} -#endif diff --git a/waterbox/pcfx/cdrom/lec.h b/waterbox/pcfx/cdrom/lec.h deleted file mode 100644 index c5e874c3f3..0000000000 --- a/waterbox/pcfx/cdrom/lec.h +++ /dev/null @@ -1,77 +0,0 @@ -/* cdrdao - write audio CD-Rs in disc-at-once mode - * - * Copyright (C) 1998-2002 Andreas Mueller - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __LEC_H__ -#define __LEC_H__ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -typedef uint32_t u_int32_t; -typedef uint16_t u_int16_t; -typedef uint8_t u_int8_t; - -#ifndef TRUE -#define TRUE 1 -#endif - -/* Encodes a MODE 0 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide - */ -void lec_encode_mode0_sector(u_int32_t adr, u_int8_t *sector); - -/* Encodes a MODE 1 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2048 bytes user data at - * offset 16 - */ -void lec_encode_mode1_sector(u_int32_t adr, u_int8_t *sector); - -/* Encodes a MODE 2 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2336 bytes user data at - * offset 16 - */ -void lec_encode_mode2_sector(u_int32_t adr, u_int8_t *sector); - -/* Encodes a XA form 1 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2048+8 bytes user data at - * offset 16 - */ -void lec_encode_mode2_form1_sector(u_int32_t adr, u_int8_t *sector); - -/* Encodes a XA form 2 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2324+8 bytes user data at - * offset 16 - */ -void lec_encode_mode2_form2_sector(u_int32_t adr, u_int8_t *sector); - -/* Scrambles and byte swaps an encoded sector. - * 'sector' must be 2352 byte wide. - */ -void lec_scramble(u_int8_t *sector); - -#endif diff --git a/waterbox/pcfx/cdrom/recover-raw.cpp b/waterbox/pcfx/cdrom/recover-raw.cpp deleted file mode 100644 index 689f1f3c8f..0000000000 --- a/waterbox/pcfx/cdrom/recover-raw.cpp +++ /dev/null @@ -1,210 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#include "dvdisaster.h" - -static GaloisTables *gt = NULL; /* for L-EC Reed-Solomon */ -static ReedSolomonTables *rt = NULL; - -bool Init_LEC_Correct(void) -{ - gt = CreateGaloisTables(0x11d); - rt = CreateReedSolomonTables(gt, 0, 1, 10); - - return(1); -} - - - -/*** - *** CD level CRC calculation - ***/ - -/* - * Test raw sector against its 32bit CRC. - * Returns TRUE if frame is good. - */ - -int CheckEDC(const unsigned char *cd_frame, bool xa_mode) -{ - unsigned int expected_crc, real_crc; - unsigned int crc_base = xa_mode ? 2072 : 2064; - - expected_crc = cd_frame[crc_base + 0] << 0; - expected_crc |= cd_frame[crc_base + 1] << 8; - expected_crc |= cd_frame[crc_base + 2] << 16; - expected_crc |= cd_frame[crc_base + 3] << 24; - - if(xa_mode) - real_crc = EDCCrc32(cd_frame+16, 2056); - else - real_crc = EDCCrc32(cd_frame, 2064); - - if(expected_crc == real_crc) - return(1); - else - { - //printf("Bad EDC CRC: Calculated: %08x, Recorded: %08x\n", real_crc, expected_crc); - return(0); - } -} - -/*** - *** A very simple L-EC error correction. - *** - * Perform just one pass over the Q and P vectors to see if everything - * is okay respectively correct minor errors. This is pretty much the - * same stuff the drive is supposed to do in the final L-EC stage. - */ - -static int simple_lec(unsigned char *frame) -{ - unsigned char byte_state[2352]; - unsigned char p_vector[P_VECTOR_SIZE]; - unsigned char q_vector[Q_VECTOR_SIZE]; - unsigned char p_state[P_VECTOR_SIZE]; - int erasures[Q_VECTOR_SIZE], erasure_count; - int ignore[2]; - int p_failures, q_failures; - int p_corrected, q_corrected; - int p,q; - - /* Setup */ - - memset(byte_state, 0, 2352); - - p_failures = q_failures = 0; - p_corrected = q_corrected = 0; - - /* Perform Q-Parity error correction */ - - for(q=0; q 2) - { GetPVector(byte_state, p_state, p); - erasure_count = 0; - - for(i=0; i 0 && erasure_count <= 2) - { GetPVector(frame, p_vector, p); - err = DecodePQ(rt, p_vector, P_PADDING, erasures, erasure_count); - } - } - - /* See what we've got */ - - if(err < 0) /* Uncorrectable. */ - { p_failures++; - } - else /* Correctable. */ - { if(err == 1 || err == 2) /* Store back corrected vector */ - { SetPVector(frame, p_vector, p); - p_corrected++; - } - } - } - - /* Sum up */ - - if(q_failures || p_failures || q_corrected || p_corrected) - { - return 1; - } - - return 0; -} - -/*** - *** Validate CD raw sector - ***/ - -int ValidateRawSector(unsigned char *frame, bool xaMode) -{ - int lec_did_sth = FALSE; - - /* Do simple L-EC. - It seems that drives stop their internal L-EC as soon as the - EDC is okay, so we may see uncorrected errors in the parity bytes. - Since we are also interested in the user data only and doing the - L-EC is expensive, we skip our L-EC as well when the EDC is fine. */ - - if(!CheckEDC(frame, xaMode)) - { - unsigned char header[4]; - - if(xaMode) - { - memcpy(header, frame + 12, 4); - memset(frame + 12, 0, 4); - } - - lec_did_sth = simple_lec(frame); - - if(xaMode) - memcpy(frame + 12, header, 4); - } - - /* Test internal sector checksum again */ - if(!CheckEDC(frame, xaMode)) - { - /* EDC failure in RAW sector */ - return FALSE; - } - - return TRUE; -} - diff --git a/waterbox/pcfx/cdrom/scsicd-pce-commands.inc b/waterbox/pcfx/cdrom/scsicd-pce-commands.inc deleted file mode 100644 index 4441e9304b..0000000000 --- a/waterbox/pcfx/cdrom/scsicd-pce-commands.inc +++ /dev/null @@ -1,259 +0,0 @@ -/******************************************************** -* * -* PC Engine CD Command 0xD8 - SAPSP * -* * -********************************************************/ -static void DoNEC_PCE_SAPSP(const uint8 *cdb) -{ - uint32 new_read_sec_start; - - //printf("Set audio start: %02x %02x %02x %02x %02x %02x %02x\n", cdb[9], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6]); - switch (cdb[9] & 0xc0) - { - default: //SCSIDBG("Unknown SAPSP 9: %02x\n", cdb[9]); - case 0x00: - new_read_sec_start = (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - break; - - case 0x40: - new_read_sec_start = AMSF_to_LBA(BCD_to_U8(cdb[2]), BCD_to_U8(cdb[3]), BCD_to_U8(cdb[4])); - break; - - case 0x80: - { - int track = BCD_to_U8(cdb[2]); - - if(!track) - track = 1; - else if(track >= toc.last_track + 1) - track = 100; - new_read_sec_start = toc.tracks[track].lba; - } - break; - } - - //printf("%lld\n", (long long)(monotonic_timestamp - pce_lastsapsp_timestamp) * 1000 / System_Clock); - if(cdda.CDDAStatus == CDDASTATUS_PLAYING && new_read_sec_start == read_sec_start && ((int64)(monotonic_timestamp - pce_lastsapsp_timestamp) * 1000 / System_Clock) < 190) - { - pce_lastsapsp_timestamp = monotonic_timestamp; - - SendStatusAndMessage(STATUS_GOOD, 0x00); - CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_DONE); - return; - } - - pce_lastsapsp_timestamp = monotonic_timestamp; - - read_sec = read_sec_start = new_read_sec_start; - read_sec_end = toc.tracks[100].lba; - - - cdda.CDDAReadPos = 588; - - cdda.CDDAStatus = CDDASTATUS_PAUSED; - cdda.PlayMode = PLAYMODE_SILENT; - - if(cdb[1]) - { - cdda.PlayMode = PLAYMODE_NORMAL; - cdda.CDDAStatus = CDDASTATUS_PLAYING; - } - - if(read_sec < toc.tracks[100].lba) - Cur_CDIF->HintReadSector(read_sec); - - SendStatusAndMessage(STATUS_GOOD, 0x00); - CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_DONE); -} - - - -/******************************************************** -* * -* PC Engine CD Command 0xD9 - SAPEP * -* * -********************************************************/ -static void DoNEC_PCE_SAPEP(const uint8 *cdb) -{ - uint32 new_read_sec_end; - - //printf("Set audio end: %02x %02x %02x %02x %02x %02x %02x\n", cdb[9], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6]); - - switch (cdb[9] & 0xc0) - { - default: //SCSIDBG("Unknown SAPEP 9: %02x\n", cdb[9]); - - case 0x00: - new_read_sec_end = (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - break; - - case 0x40: - new_read_sec_end = BCD_to_U8(cdb[4]) + 75 * (BCD_to_U8(cdb[3]) + 60 * BCD_to_U8(cdb[2])); - new_read_sec_end -= 150; - break; - - case 0x80: - { - int track = BCD_to_U8(cdb[2]); - - if(!track) - track = 1; - else if(track >= toc.last_track + 1) - track = 100; - new_read_sec_end = toc.tracks[track].lba; - } - break; - } - - read_sec_end = new_read_sec_end; - - switch(cdb[1]) // PCE CD(TODO: Confirm these, and check the mode mask): - { - default: - case 0x03: cdda.PlayMode = PLAYMODE_NORMAL; - cdda.CDDAStatus = CDDASTATUS_PLAYING; - break; - - case 0x02: cdda.PlayMode = PLAYMODE_INTERRUPT; - cdda.CDDAStatus = CDDASTATUS_PLAYING; - break; - - case 0x01: cdda.PlayMode = PLAYMODE_LOOP; - cdda.CDDAStatus = CDDASTATUS_PLAYING; - break; - - case 0x00: cdda.PlayMode = PLAYMODE_SILENT; - cdda.CDDAStatus = CDDASTATUS_STOPPED; - break; - } - - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - - - -/******************************************************** -* * -* PC Engine CD Command 0xDA - Pause * -* * -********************************************************/ -static void DoNEC_PCE_PAUSE(const uint8 *cdb) -{ - if(cdda.CDDAStatus != CDDASTATUS_STOPPED) // Hmm, should we give an error if it tries to pause and it's already paused? - { - cdda.CDDAStatus = CDDASTATUS_PAUSED; - SendStatusAndMessage(STATUS_GOOD, 0x00); - } - else // Definitely give an error if it tries to pause when no track is playing! - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_AUDIO_NOT_PLAYING); - } -} - - - -/******************************************************** -* * -* PC Engine CD Command 0xDD - Read Subchannel Q * -* * -********************************************************/ -static void DoNEC_PCE_READSUBQ(const uint8 *cdb) -{ - uint8 *SubQBuf = cd.SubQBuf[QMode_Time]; - uint8 data_in[8192]; - - memset(data_in, 0x00, 10); - - data_in[2] = SubQBuf[1]; // Track - data_in[3] = SubQBuf[2]; // Index - data_in[4] = SubQBuf[3]; // M(rel) - data_in[5] = SubQBuf[4]; // S(rel) - data_in[6] = SubQBuf[5]; // F(rel) - data_in[7] = SubQBuf[7]; // M(abs) - data_in[8] = SubQBuf[8]; // S(abs) - data_in[9] = SubQBuf[9]; // F(abs) - - if(cdda.CDDAStatus == CDDASTATUS_PAUSED) - data_in[0] = 2; // Pause - else if(cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) // FIXME: Is this the correct status code for scanning playback? - data_in[0] = 0; // Playing - else - data_in[0] = 3; // Stopped - - DoSimpleDataIn(data_in, 10); -} - - - -/******************************************************** -* * -* PC Engine CD Command 0xDE - Get Directory Info * -* * -********************************************************/ -static void DoNEC_PCE_GETDIRINFO(const uint8 *cdb) -{ - // Problems: - // Returned data lengths on real PCE are not confirmed. - // Mode 0x03 behavior not tested on real PCE - - uint8 data_in[2048]; - uint32 data_in_size = 0; - - memset(data_in, 0, sizeof(data_in)); - - switch(cdb[1]) - { - default: //MDFN_DispMessage("Unknown GETDIRINFO Mode: %02x", cdb[1]); - //printf("Unknown GETDIRINFO Mode: %02x", cdb[1]); - case 0x0: - data_in[0] = U8_to_BCD(toc.first_track); - data_in[1] = U8_to_BCD(toc.last_track); - - data_in_size = 2; - break; - - case 0x1: - { - uint8 m, s, f; - - LBA_to_AMSF(toc.tracks[100].lba, &m, &s, &f); - - data_in[0] = U8_to_BCD(m); - data_in[1] = U8_to_BCD(s); - data_in[2] = U8_to_BCD(f); - - data_in_size = 3; - } - break; - - case 0x2: - { - uint8 m, s, f; - int track = BCD_to_U8(cdb[2]); - - if(!track) - track = 1; - else if(cdb[2] == 0xAA) - { - track = 100; - } - else if(track > 99) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - LBA_to_AMSF(toc.tracks[track].lba, &m, &s, &f); - - data_in[0] = U8_to_BCD(m); - data_in[1] = U8_to_BCD(s); - data_in[2] = U8_to_BCD(f); - data_in[3] = toc.tracks[track].control; - data_in_size = 4; - } - break; - } - - DoSimpleDataIn(data_in, data_in_size); -} - diff --git a/waterbox/pcfx/cdrom/scsicd.cpp b/waterbox/pcfx/cdrom/scsicd.cpp deleted file mode 100644 index c5a7667883..0000000000 --- a/waterbox/pcfx/cdrom/scsicd.cpp +++ /dev/null @@ -1,3081 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "../defs.h" -#include -#include -#include "cdromif.h" -#include "scsicd.h" -#include "SimpleFIFO.h" - -#if defined(__SSE2__) -#include -#include -#endif - -//#define SCSIDBG(format, ...) { printf("[SCSICD] " format "\n", ## __VA_ARGS__); } -//#define SCSIDBG(format, ...) { } - -using namespace CDUtility; - -static uint32 CD_DATA_TRANSFER_RATE; -static uint32 System_Clock; -static void (*CDIRQCallback)(int); -static void (*CDStuffSubchannels)(uint8, int); -static int32 *HRBufs[2]; -static int WhichSystem; - -static CDIF *Cur_CDIF; -static bool TrayOpen; - -// Internal operation to the SCSI CD unit. Only pass 1 or 0 to these macros! -#define SetIOP(mask, set) \ - { \ - cd_bus.signals &= ~mask; \ - if (set) \ - cd_bus.signals |= mask; \ - } - -#define SetBSY(set) SetIOP(SCSICD_BSY_mask, set) -#define SetIO(set) SetIOP(SCSICD_IO_mask, set) -#define SetCD(set) SetIOP(SCSICD_CD_mask, set) -#define SetMSG(set) SetIOP(SCSICD_MSG_mask, set) - -static INLINE void SetREQ(bool set) -{ - if (set && !REQ_signal) - CDIRQCallback(SCSICD_IRQ_MAGICAL_REQ); - - SetIOP(SCSICD_REQ_mask, set); -} - -#define SetkingACK(set) SetIOP(SCSICD_kingACK_mask, set) -#define SetkingRST(set) SetIOP(SCSICD_kingRST_mask, set) -#define SetkingSEL(set) SetIOP(SCSICD_kingSEL_mask, set) -#define SetkingATN(set) SetIOP(SCSICD_kingATN_mask, set) - -enum -{ - QMode_Zero = 0, - QMode_Time = 1, - QMode_MCN = 2, // Media Catalog Number - QMode_ISRC = 3 // International Standard Recording Code -}; - -typedef struct -{ - bool last_RST_signal; - - // The pending message to send(in the message phase) - uint8 message_pending; - - bool status_sent, message_sent; - - // Pending error codes - uint8 key_pending, asc_pending, ascq_pending, fru_pending; - - uint8 command_buffer[256]; - uint8 command_buffer_pos; - uint8 command_size_left; - - // FALSE if not all pending data is in the FIFO, TRUE if it is. - // Used for multiple sector CD reads. - bool data_transfer_done; - - // To target(the cd unit); for "MODE SELECT". - uint8 data_out[256]; // Technically it only needs to be 255, but powers of 2 are better than those degenerate powers of 2 minus one goons. - uint8 data_out_pos; // Current index for writing into data_out. - uint8 data_out_want; // Total number of bytes to buffer into data_out. - - bool DiscChanged; - - uint8 SubQBuf[4][0xC]; // One for each of the 4 most recent q-Modes. - uint8 SubQBuf_Last[0xC]; // The most recent q subchannel data, regardless of q-mode. - - uint8 SubPWBuf[96]; - -} scsicd_t; - -enum -{ - CDDASTATUS_PAUSED = -1, - CDDASTATUS_STOPPED = 0, - CDDASTATUS_PLAYING = 1, - CDDASTATUS_SCANNING = 2, -}; - -enum -{ - PLAYMODE_SILENT = 0x00, - PLAYMODE_NORMAL, - PLAYMODE_INTERRUPT, - PLAYMODE_LOOP, -}; - -typedef struct -{ - uint32 CDDADivAcc; - uint8 CDDADivAccVolFudge; // For PC-FX CD-DA rate control RE impulses and resampling; 100 = 1.0. - uint32 scan_sec_end; - - uint8 PlayMode; - int32 CDDAVolume[2]; // 65536 = 1.0, the maximum. - int16 CDDASectorBuffer[1176]; - uint32 CDDAReadPos; - - int8 CDDAStatus; - uint8 ScanMode; - int64 CDDADiv; - int CDDATimeDiv; - - int16 OversampleBuffer[2][0x10 * 2]; // *2 so our MAC loop can blast through without masking the index. - unsigned OversamplePos; - - int16 sr[2]; - - uint8 OutPortChSelect[2]; - uint32 OutPortChSelectCache[2]; - int32 OutPortVolumeCache[2]; - - float DeemphState[2][2]; -} cdda_t; - -void MakeSense(uint8 *target, uint8 key, uint8 asc, uint8 ascq, uint8 fru) -{ - memset(target, 0, 18); - - target[0] = 0x70; // Current errors and sense data is not SCSI compliant - target[2] = key; - target[7] = 0x0A; - target[12] = asc; // Additional Sense Code - target[13] = ascq; // Additional Sense Code Qualifier - target[14] = fru; // Field Replaceable Unit code -} - -static void (*SCSILog)(const char *, const char *format, ...); -static void InitModePages(void); - -static scsicd_timestamp_t lastts; -static int64 monotonic_timestamp; -static int64 pce_lastsapsp_timestamp; - -scsicd_t cd; -scsicd_bus_t cd_bus; -static cdda_t cdda; - -static SimpleFIFO *din = NULL; - -static CDUtility::TOC toc; - -static uint32 read_sec_start; -static uint32 read_sec; -static uint32 read_sec_end; - -static int32 CDReadTimer; -static uint32 SectorAddr; -static uint32 SectorCount; - -enum -{ - PHASE_BUS_FREE = 0, - PHASE_COMMAND, - PHASE_DATA_IN, - PHASE_DATA_OUT, - PHASE_STATUS, - PHASE_MESSAGE_IN, - PHASE_MESSAGE_OUT -}; -static unsigned int CurrentPhase; -static void ChangePhase(const unsigned int new_phase); - -static void FixOPV(void) -{ - for (int port = 0; port < 2; port++) - { - int32 tmpvol = cdda.CDDAVolume[port] * 100 / (2 * cdda.CDDADivAccVolFudge); - - //printf("TV: %d\n", tmpvol); - - cdda.OutPortVolumeCache[port] = tmpvol; - - if (cdda.OutPortChSelect[port] & 0x01) - cdda.OutPortChSelectCache[port] = 0; - else if (cdda.OutPortChSelect[port] & 0x02) - cdda.OutPortChSelectCache[port] = 1; - else - { - cdda.OutPortChSelectCache[port] = 0; - cdda.OutPortVolumeCache[port] = 0; - } - } -} - -static void VirtualReset(void) -{ - InitModePages(); - - din->Flush(); - - CDReadTimer = 0; - - pce_lastsapsp_timestamp = monotonic_timestamp; - - SectorAddr = SectorCount = 0; - read_sec_start = read_sec = 0; - read_sec_end = ~0; - - cdda.PlayMode = PLAYMODE_SILENT; - cdda.CDDAReadPos = 0; - cdda.CDDAStatus = CDDASTATUS_STOPPED; - cdda.CDDADiv = 1; - - cdda.ScanMode = 0; - cdda.scan_sec_end = 0; - - cdda.OversamplePos = 0; - memset(cdda.sr, 0, sizeof(cdda.sr)); - memset(cdda.OversampleBuffer, 0, sizeof(cdda.OversampleBuffer)); - memset(cdda.DeemphState, 0, sizeof(cdda.DeemphState)); - - memset(cd.data_out, 0, sizeof(cd.data_out)); - cd.data_out_pos = 0; - cd.data_out_want = 0; - - FixOPV(); - - ChangePhase(PHASE_BUS_FREE); -} - -void SCSICD_Power(scsicd_timestamp_t system_timestamp) -{ - memset(&cd, 0, sizeof(scsicd_t)); - memset(&cd_bus, 0, sizeof(scsicd_bus_t)); - - monotonic_timestamp = system_timestamp; - - cd.DiscChanged = false; - - if (Cur_CDIF && !TrayOpen) - Cur_CDIF->ReadTOC(&toc); - - CurrentPhase = PHASE_BUS_FREE; - - VirtualReset(); -} - -void SCSICD_SetDB(uint8 data) -{ - cd_bus.DB = data; - //printf("Set DB: %02x\n", data); -} - -void SCSICD_SetACK(bool set) -{ - SetkingACK(set); - //printf("Set ACK: %d\n", set); -} - -void SCSICD_SetSEL(bool set) -{ - SetkingSEL(set); - //printf("Set SEL: %d\n", set); -} - -void SCSICD_SetRST(bool set) -{ - SetkingRST(set); - //printf("Set RST: %d\n", set); -} - -void SCSICD_SetATN(bool set) -{ - SetkingATN(set); - //printf("Set ATN: %d\n", set); -} - -static void GenSubQFromSubPW(void) -{ - uint8 SubQBuf[0xC]; - - memset(SubQBuf, 0, 0xC); - - for (int i = 0; i < 96; i++) - SubQBuf[i >> 3] |= ((cd.SubPWBuf[i] & 0x40) >> 6) << (7 - (i & 7)); - - //printf("Real %d/ SubQ %d - ", read_sec, BCD_to_U8(SubQBuf[7]) * 75 * 60 + BCD_to_U8(SubQBuf[8]) * 75 + BCD_to_U8(SubQBuf[9]) - 150); - // Debug code, remove me. - //for(int i = 0; i < 0xC; i++) - // printf("%02x ", SubQBuf[i]); - //printf("\n"); - - if (!subq_check_checksum(SubQBuf)) - { - //SCSIDBG("SubQ checksum error!"); - } - else - { - memcpy(cd.SubQBuf_Last, SubQBuf, 0xC); - - uint8 adr = SubQBuf[0] & 0xF; - - if (adr <= 0x3) - memcpy(cd.SubQBuf[adr], SubQBuf, 0xC); - - //if(adr == 0x02) - //for(int i = 0; i < 12; i++) - // printf("%02x\n", cd.SubQBuf[0x2][i]); - } -} - -#define STATUS_GOOD 0 -#define STATUS_CHECK_CONDITION 1 -#define STATUS_CONDITION_MET 2 -#define STATUS_BUSY 4 -#define STATUS_INTERMEDIATE 8 - -#define SENSEKEY_NO_SENSE 0x0 -#define SENSEKEY_NOT_READY 0x2 -#define SENSEKEY_MEDIUM_ERROR 0x3 -#define SENSEKEY_HARDWARE_ERROR 0x4 -#define SENSEKEY_ILLEGAL_REQUEST 0x5 -#define SENSEKEY_UNIT_ATTENTION 0x6 -#define SENSEKEY_ABORTED_COMMAND 0xB - -#define ASC_MEDIUM_NOT_PRESENT 0x3A - -// NEC sub-errors(ASC), no ASCQ. -#define NSE_NO_DISC 0x0B // Used with SENSEKEY_NOT_READY - This condition occurs when tray is closed with no disc present. -#define NSE_TRAY_OPEN 0x0D // Used with SENSEKEY_NOT_READY -#define NSE_SEEK_ERROR 0x15 -#define NSE_HEADER_READ_ERROR 0x16 // Used with SENSEKEY_MEDIUM_ERROR -#define NSE_NOT_AUDIO_TRACK 0x1C // Used with SENSEKEY_MEDIUM_ERROR -#define NSE_NOT_DATA_TRACK 0x1D // Used with SENSEKEY_MEDIUM_ERROR -#define NSE_INVALID_COMMAND 0x20 -#define NSE_INVALID_ADDRESS 0x21 -#define NSE_INVALID_PARAMETER 0x22 -#define NSE_END_OF_VOLUME 0x25 -#define NSE_INVALID_REQUEST_IN_CDB 0x27 -#define NSE_DISC_CHANGED 0x28 // Used with SENSEKEY_UNIT_ATTENTION -#define NSE_AUDIO_NOT_PLAYING 0x2C - -// ASC, ASCQ pair -#define AP_UNRECOVERED_READ_ERROR 0x11, 0x00 -#define AP_LEC_UNCORRECTABLE_ERROR 0x11, 0x05 -#define AP_CIRC_UNRECOVERED_ERROR 0x11, 0x06 - -#define AP_UNKNOWN_MEDIUM_FORMAT 0x30, 0x01 -#define AP_INCOMPAT_MEDIUM_FORMAT 0x30, 0x02 - -static void ChangePhase(const unsigned int new_phase) -{ - //printf("New phase: %d %lld\n", new_phase, monotonic_timestamp); - switch (new_phase) - { - case PHASE_BUS_FREE: - SetBSY(false); - SetMSG(false); - SetCD(false); - SetIO(false); - SetREQ(false); - - CDIRQCallback(0x8000 | SCSICD_IRQ_DATA_TRANSFER_DONE); - break; - - case PHASE_DATA_IN: // Us to them - SetBSY(true); - SetMSG(false); - SetCD(false); - SetIO(true); - //SetREQ(true); - SetREQ(false); - break; - - case PHASE_STATUS: // Us to them - SetBSY(true); - SetMSG(false); - SetCD(true); - SetIO(true); - SetREQ(true); - break; - - case PHASE_MESSAGE_IN: // Us to them - SetBSY(true); - SetMSG(true); - SetCD(true); - SetIO(true); - SetREQ(true); - break; - - case PHASE_DATA_OUT: // Them to us - SetBSY(true); - SetMSG(false); - SetCD(false); - SetIO(false); - SetREQ(true); - break; - - case PHASE_COMMAND: // Them to us - SetBSY(true); - SetMSG(false); - SetCD(true); - SetIO(false); - SetREQ(true); - break; - - case PHASE_MESSAGE_OUT: // Them to us - SetBSY(true); - SetMSG(true); - SetCD(true); - SetIO(false); - SetREQ(true); - break; - } - CurrentPhase = new_phase; -} - -static void SendStatusAndMessage(uint8 status, uint8 message) -{ - // This should never ever happen, but that doesn't mean it won't. ;) - if (din->CanRead()) - { - //printf("[SCSICD] BUG: %d bytes still in SCSI CD FIFO\n", din->CanRead()); - din->Flush(); - } - - cd.message_pending = message; - - cd.status_sent = FALSE; - cd.message_sent = FALSE; - - if (WhichSystem == SCSICD_PCE) - { - if (status == STATUS_GOOD || status == STATUS_CONDITION_MET) - cd_bus.DB = 0x00; - else - cd_bus.DB = 0x01; - } - else - cd_bus.DB = status << 1; - - ChangePhase(PHASE_STATUS); -} - -static void DoSimpleDataIn(const uint8 *data_in, uint32 len) -{ - din->Write(data_in, len); - - cd.data_transfer_done = true; - - ChangePhase(PHASE_DATA_IN); -} - -void SCSICD_SetDisc(bool new_tray_open, CDIF *cdif, bool no_emu_side_effects) -{ - Cur_CDIF = cdif; - - // Closing the tray. - if (TrayOpen && !new_tray_open) - { - TrayOpen = false; - - if (cdif) - { - cdif->ReadTOC(&toc); - - if (!no_emu_side_effects) - { - memset(cd.SubQBuf, 0, sizeof(cd.SubQBuf)); - memset(cd.SubQBuf_Last, 0, sizeof(cd.SubQBuf_Last)); - cd.DiscChanged = true; - } - } - } - else if (!TrayOpen && new_tray_open) // Opening the tray - { - TrayOpen = true; - } -} - -static void CommandCCError(int key, int asc = 0, int ascq = 0) -{ - //printf("[SCSICD] CC Error: %02x %02x %02x\n", key, asc, ascq); - - cd.key_pending = key; - cd.asc_pending = asc; - cd.ascq_pending = ascq; - cd.fru_pending = 0x00; - - SendStatusAndMessage(STATUS_CHECK_CONDITION, 0x00); -} - -static bool ValidateRawDataSector(uint8 *data, const uint32 lba) -{ - if (!Cur_CDIF->ValidateRawSector(data)) - { - printf("Uncorrectable data at sector %d", lba); - - din->Flush(); - cd.data_transfer_done = false; - - CommandCCError(SENSEKEY_MEDIUM_ERROR, AP_LEC_UNCORRECTABLE_ERROR); - return (false); - } - - return (true); -} - -static void DoMODESELECT6(const uint8 *cdb) -{ - if (cdb[4]) - { - cd.data_out_pos = 0; - cd.data_out_want = cdb[4]; - //printf("Switch to DATA OUT phase, len: %d\n", cd.data_out_want); - - ChangePhase(PHASE_DATA_OUT); - } - else - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -/* - All Japan Female Pro Wrestle: - Datumama: 10, 00 00 00 00 00 00 00 00 00 0a - - Kokuu Hyouryuu Nirgends: - Datumama: 10, 00 00 00 00 00 00 00 00 00 0f - Datumama: 10, 00 00 00 00 00 00 00 00 00 0f - - Last Imperial Prince: - Datumama: 10, 00 00 00 00 00 00 00 00 00 0f - Datumama: 10, 00 00 00 00 00 00 00 00 00 0f - - Megami Paradise II: - Datumama: 10, 00 00 00 00 00 00 00 00 00 0a - - Miraculum: - Datumama: 7, 00 00 00 00 29 01 00 - Datumama: 10, 00 00 00 00 00 00 00 00 00 0f - Datumama: 7, 00 00 00 00 29 01 00 - Datumama: 10, 00 00 00 00 00 00 00 00 00 00 - Datumama: 7, 00 00 00 00 29 01 00 - - Pachio Kun FX: - Datumama: 10, 00 00 00 00 00 00 00 00 00 14 - - Return to Zork: - Datumama: 10, 00 00 00 00 00 00 00 00 00 00 - - Sotsugyou II: - Datumama: 10, 00 00 00 00 01 00 00 00 00 01 - - Tokimeki Card Paradise: - Datumama: 10, 00 00 00 00 00 00 00 00 00 14 - Datumama: 10, 00 00 00 00 00 00 00 00 00 07 - - Tonari no Princess Rolfee: - Datumama: 10, 00 00 00 00 00 00 00 00 00 00 - - Zoku Hakutoi Monogatari: - Datumama: 10, 00 00 00 00 00 00 00 00 00 14 -*/ - -// Page 151: MODE SENSE(6) -// PC = 0 current -// PC = 1 Changeable -// PC = 2 Default -// PC = 3 Saved -// Page 183: Mode parameter header. -// Page 363: CD-ROM density codes. -// Page 364: CD-ROM mode page codes. -// Page 469: ASC and ASCQ table - -struct ModePageParam -{ - uint8 default_value; - uint8 alterable_mask; // Alterable mask reported when PC == 1 - uint8 real_mask; // Real alterable mask. -}; - -struct ModePage -{ - const uint8 code; - const uint8 param_length; - const ModePageParam params[64]; // 64 should be more than enough - uint8 current_value[64]; -}; - -/* - Mode pages present: - 0x00: - 0x0E: - 0x28: - 0x29: - 0x2A: - 0x2B: - 0x3F(Yes, not really a mode page but a fetch method) -*/ -static const int NumModePages = 5; -static ModePage ModePages[NumModePages] = - { - // Unknown - {0x28, - 0x04, - { - {0x00, 0x00, 0xFF}, - {0x00, 0x00, 0xFF}, - {0x00, 0x00, 0xFF}, - {0x00, 0x00, 0xFF}, - }}, - - // Unknown - {0x29, - 0x01, - { - {0x00, 0x00, 0xFF}, - }}, - - // Unknown - {0x2a, - 0x02, - { - {0x00, 0x00, 0xFF}, - {0x11, 0x00, 0xFF}, - }}, - - // CD-DA playback speed modifier - {0x2B, - 0x01, - { - {0x00, 0x00, 0xFF}, - }}, - - // 0x0E goes last, for correct order of return data when page code == 0x3F - // Real mask values are probably not right; some functionality not emulated yet. - // CD-ROM audio control parameters - {0x0E, - 0x0E, - { - {0x04, 0x04, 0x04}, // Immed - {0x00, 0x00, 0x00}, // Reserved - {0x00, 0x00, 0x00}, // Reserved - {0x00, 0x01, 0x01}, // Reserved? - {0x00, 0x00, 0x00}, // MSB of LBA per second. - {0x00, 0x00, 0x00}, // LSB of LBA per second. - {0x01, 0x01, 0x03}, // Outport port 0 channel selection. - {0xFF, 0x00, 0x00}, // Outport port 0 volume. - {0x02, 0x02, 0x03}, // Outport port 1 channel selection. - {0xFF, 0x00, 0x00}, // Outport port 1 volume. - {0x00, 0x00, 0x00}, // Outport port 2 channel selection. - {0x00, 0x00, 0x00}, // Outport port 2 volume. - {0x00, 0x00, 0x00}, // Outport port 3 channel selection. - {0x00, 0x00, 0x00}, // Outport port 3 volume. - }}, -}; - -static void UpdateMPCacheP(const ModePage *mp) -{ - switch (mp->code) - { - case 0x0E: - { - const uint8 *pd = &mp->current_value[0]; - - for (int i = 0; i < 2; i++) - cdda.OutPortChSelect[i] = pd[6 + i * 2]; - FixOPV(); - } - break; - - case 0x28: - break; - - case 0x29: - break; - - case 0x2A: - break; - - case 0x2B: - { - int speed; - int rate; - - // - // Not sure what the actual limits are, or what happens when exceeding them, but these will at least keep the - // CD-DA playback system from imploding in on itself. - // - // The range of speed values accessible via the BIOS CD-DA player is apparently -10 to 10. - // - // No game is known to use the CD-DA playback speed control. It may be useful in homebrew to lower the rate for fitting more CD-DA onto the disc, - // is implemented on the PC-FX in such a way that it degrades audio quality, so it wouldn't really make sense to increase the rate in homebrew. - // - // Due to performance considerations, we only partially emulate the CD-DA oversampling filters used on the PC Engine and PC-FX, and instead - // blast impulses into the 1.78MHz buffer, relying on the final sound resampler to kill spectrum mirrors. This is less than ideal, but generally - // works well in practice, except when lowering CD-DA playback rate...which causes the spectrum mirrors to enter the non-murder zone, causing - // the sound output amplitude to approach overflow levels. - // But, until there's a killer PC-FX homebrew game that necessitates more computationally-expensive CD-DA handling, - // I don't see a good reason to change how CD-DA resampling is currently implemented. - // - speed = std::max(-32, std::min(32, (int8)mp->current_value[0])); - rate = 44100 + 441 * speed; - - //printf("[SCSICD] Speed: %d(pre-clamped=%d) %d\n", speed, (int8)mp->current_value[0], rate); - cdda.CDDADivAcc = ((int64)System_Clock * (1024 * 1024) / (2 * rate)); - cdda.CDDADivAccVolFudge = 100 + speed; - FixOPV(); // Resampler impulse amplitude volume adjustment(call after setting cdda.CDDADivAccVolFudge) - } - break; - } -} - -static void UpdateMPCache(uint8 code) -{ - for (int pi = 0; pi < NumModePages; pi++) - { - const ModePage *mp = &ModePages[pi]; - - if (mp->code == code) - { - UpdateMPCacheP(mp); - break; - } - } -} - -static void InitModePages(void) -{ - for (int pi = 0; pi < NumModePages; pi++) - { - ModePage *mp = &ModePages[pi]; - const ModePageParam *params = &ModePages[pi].params[0]; - - for (int parami = 0; parami < mp->param_length; parami++) - mp->current_value[parami] = params[parami].default_value; - - UpdateMPCacheP(mp); - } -} - -static void FinishMODESELECT6(const uint8 *data, const uint8 data_len) -{ - uint8 mode_data_length, medium_type, device_specific, block_descriptor_length; - uint32 offset = 0; - - //printf("[SCSICD] Mode Select (6) Data: Length=0x%02x, ", data_len); - //for(uint32 i = 0; i < data_len; i++) - // printf("0x%02x ", data[i]); - //printf("\n"); - - if (data_len < 4) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - mode_data_length = data[offset++]; - medium_type = data[offset++]; - device_specific = data[offset++]; - block_descriptor_length = data[offset++]; - - // For now, shut up gcc. - (void)mode_data_length; - (void)medium_type; - (void)device_specific; - - if (block_descriptor_length & 0x7) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if ((offset + block_descriptor_length) > data_len) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - // TODO: block descriptors. - offset += block_descriptor_length; - - // Now handle mode pages - while (offset < data_len) - { - const uint8 code = data[offset++]; - uint8 param_len = 0; - bool page_found = false; - - if (code == 0x00) - { - if ((offset + 0x5) > data_len) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - UpdateMPCache(0x00); - - offset += 0x5; - continue; - } - - if (offset >= data_len) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - param_len = data[offset++]; - - for (int pi = 0; pi < NumModePages; pi++) - { - ModePage *mp = &ModePages[pi]; - - if (code == mp->code) - { - page_found = true; - - if (param_len != mp->param_length) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if ((param_len + offset) > data_len) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - for (int parami = 0; parami < mp->param_length; parami++) - { - mp->current_value[parami] &= ~mp->params[parami].real_mask; - mp->current_value[parami] |= (data[offset++]) & mp->params[parami].real_mask; - } - - UpdateMPCacheP(mp); - break; - } - } - - if (!page_found) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - } - - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -static void DoMODESENSE6(const uint8 *cdb) -{ - unsigned int PC = (cdb[2] >> 6) & 0x3; - unsigned int PageCode = cdb[2] & 0x3F; - bool DBD = cdb[1] & 0x08; - int AllocSize = cdb[4]; - int index = 0; - uint8 data_in[8192]; - uint8 PageMatchOR = 0x00; - bool AnyPageMatch = false; - - //SCSIDBG("Mode sense 6: %02x %d %d %d", PageCode, PC, DBD, AllocSize); - - if (!AllocSize) - { - SendStatusAndMessage(STATUS_GOOD, 0x00); - return; - } - - if (PC == 3) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (PageCode == 0x00) // Special weird case. - { - if (DBD || PC) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - memset(data_in, 0, 0xA); - data_in[0] = 0x09; - data_in[2] = 0x80; - data_in[9] = 0x0F; - - if (AllocSize > 0xA) - AllocSize = 0xA; - - DoSimpleDataIn(data_in, AllocSize); - return; - } - - data_in[0] = 0x00; // Fill this in later. - data_in[1] = 0x00; // Medium type - data_in[2] = 0x00; // Device-specific parameter. - data_in[3] = DBD ? 0x00 : 0x08; // Block descriptor length. - index += 4; - - if (!DBD) - { - data_in[index++] = 0x00; // Density code. - MDFN_en24msb(&data_in[index], 0x6E); // FIXME: Number of blocks? - index += 3; - - data_in[index++] = 0x00; // Reserved - MDFN_en24msb(&data_in[index], 0x800); // Block length; - index += 3; - } - - PageMatchOR = 0x00; - if (PageCode == 0x3F) - PageMatchOR = 0x3F; - - for (int pi = 0; pi < NumModePages; pi++) - { - const ModePage *mp = &ModePages[pi]; - const ModePageParam *params = &ModePages[pi].params[0]; - - if ((mp->code | PageMatchOR) != PageCode) - continue; - - AnyPageMatch = true; - - data_in[index++] = mp->code; - data_in[index++] = mp->param_length; - - for (int parami = 0; parami < mp->param_length; parami++) - { - uint8 data; - - if (PC == 0x02) - data = params[parami].default_value; - else if (PC == 0x01) - data = params[parami].alterable_mask; - else - data = mp->current_value[parami]; - - data_in[index++] = data; - } - } - - if (!AnyPageMatch) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (AllocSize > index) - AllocSize = index; - - data_in[0] = AllocSize - 1; - - DoSimpleDataIn(data_in, AllocSize); -} - -static void DoSTARTSTOPUNIT6(const uint8 *cdb) -{ - //bool Immed = cdb[1] & 0x01; - //bool LoEj = cdb[4] & 0x02; - //bool Start = cdb[4] & 0x01; - - //SCSIDBG("Do start stop unit 6: %d %d %d\n", Immed, LoEj, Start); - - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -static void DoREZEROUNIT(const uint8 *cdb) -{ - //SCSIDBG("Rezero Unit: %02x\n", cdb[5]); - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -// This data was originally taken from a PC-FXGA software loader, but -// while it was mostly correct(maybe it is correct for the FXGA, but not for the PC-FX?), -// it was 3 bytes too long, and the last real byte was 0x45 instead of 0x20. -// TODO: Investigate this discrepancy by testing an FXGA with the official loader software. -#if 0 -static const uint8 InqData[0x24] = -{ - // Standard - 0x05, 0x80, 0x02, 0x00, - - // Additional Length - 0x1F, - - // Vendor Specific - 0x00, 0x00, 0x00, 0x4E, 0x45, 0x43, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x43, 0x44, 0x2D, 0x52, 0x4F, - 0x4D, 0x20, 0x44, 0x52, 0x49, 0x56, 0x45, 0x3A, - 0x46, 0x58, 0x20, 0x31, 0x2E, 0x30, 0x20 -}; -#endif - -// Miraculum behaves differently if the last byte(offset 0x23) of the inquiry data is 0x45(ASCII character 'E'). Relavent code is at PC=0x3E382 -// If it's = 0x45, it will run MODE SELECT, and transfer this data to the CD unit: 00 00 00 00 29 01 00 -static const uint8 InqData[0x24] = - { - // Peripheral device-type: CD-ROM/read-only direct access device - 0x05, - - // Removable media: yes - // Device-type qualifier: 0 - 0x80, - - // ISO version: 0 - // ECMA version: 0 - // ANSI version: 2 (SCSI-2? ORLY?) - 0x02, - - // Supports asynchronous event notification: no - // Supports the terminate I/O process message: no - // Response data format: 0 (not exactly correct, not exactly incorrect, meh. :b) - 0x00, - - // Additional Length - 0x1F, - - // Reserved - 0x00, 0x00, - - // Yay, no special funky features. - 0x00, - - // 8-15, vendor ID - // NEC - 0x4E, 0x45, 0x43, 0x20, 0x20, 0x20, 0x20, 0x20, - - // 16-31, product ID - // CD-ROM DRIVE:FX - 0x43, 0x44, 0x2D, 0x52, 0x4F, 0x4D, 0x20, 0x44, 0x52, 0x49, 0x56, 0x45, 0x3A, 0x46, 0x58, 0x20, - - // 32-35, product revision level - // 1.0 - 0x31, 0x2E, 0x30, 0x20}; - -static void DoINQUIRY(const uint8 *cdb) -{ - unsigned int AllocSize = (cdb[4] < sizeof(InqData)) ? cdb[4] : sizeof(InqData); - - if (AllocSize) - DoSimpleDataIn(InqData, AllocSize); - else - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -static void DoNEC_NOP(const uint8 *cdb) -{ - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -/******************************************************** -* * -* PC-FX CD Command 0xDC - EJECT * -* * -********************************************************/ -static void DoNEC_EJECT(const uint8 *cdb) -{ - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_REQUEST_IN_CDB); -} - -static void DoREQUESTSENSE(const uint8 *cdb) -{ - uint8 data_in[8192]; - - MakeSense(data_in, cd.key_pending, cd.asc_pending, cd.ascq_pending, cd.fru_pending); - - DoSimpleDataIn(data_in, 18); - - cd.key_pending = 0; - cd.asc_pending = 0; - cd.ascq_pending = 0; - cd.fru_pending = 0; -} - -static void EncodeM3TOC(uint8 *buf, uint8 POINTER_RAW, int32 LBA, uint32 PLBA, uint8 control) -{ - uint8 MIN, SEC, FRAC; - uint8 PMIN, PSEC, PFRAC; - - LBA_to_AMSF(LBA, &MIN, &SEC, &FRAC); - LBA_to_AMSF(PLBA, &PMIN, &PSEC, &PFRAC); - - buf[0x0] = control << 4; - buf[0x1] = 0x00; // TNO - buf[0x2] = POINTER_RAW; - buf[0x3] = U8_to_BCD(MIN); - buf[0x4] = U8_to_BCD(SEC); - buf[0x5] = U8_to_BCD(FRAC); - buf[0x6] = 0x00; // Zero - buf[0x7] = U8_to_BCD(PMIN); - buf[0x8] = U8_to_BCD(PSEC); - buf[0x9] = U8_to_BCD(PFRAC); -} - -/******************************************************** -* * -* PC-FX CD Command 0xDE - Get Directory Info * -* * -********************************************************/ -static void DoNEC_GETDIRINFO(const uint8 *cdb) -{ - // Problems: - // Mode 0x03 has a few semi-indeterminate(but within a range, and they only change when the disc is reloaded) fields on a real PC-FX, that correspond to where in the lead-in area the data - // was read, that we don't bother to handle here. - // Mode 0x03 returns weird/wrong control field data for the "last track" and "leadout" entries in the "Blue Breaker" TOC. - // A bug in the PC-FX CD firmware, or an oddity of the disc(maybe other PC-FX discs are similar)? Or maybe it's an undefined field in that context? - // "Match" value of 0xB0 is probably not handled properly. Is it to return the catalog number, or something else? - - uint8 data_in[2048]; - uint32 data_in_size = 0; - - memset(data_in, 0, sizeof(data_in)); - - switch (cdb[1] & 0x03) - { - // This commands returns relevant raw TOC data as encoded in the Q subchannel(sans the CRC bytes). - case 0x3: - { - int offset = 0; - int32 lilba = -150; - uint8 match = cdb[2]; - - if (match != 0x00 && match != 0xA0 && match != 0xA1 && match != 0xA2 && match != 0xB0) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_ADDRESS); - return; - } - memset(data_in, 0, sizeof(data_in)); - - data_in[0] = 0x00; // Size MSB??? - data_in[1] = 0x00; // Total Size - 2(we'll fill it in later). - offset = 2; - - if (!match || match == 0xA0) - { - EncodeM3TOC(&data_in[offset], 0xA0, lilba, toc.first_track * 75 * 60 - 150, toc.tracks[toc.first_track].control); - lilba++; - offset += 0xA; - } - - if (!match || match == 0xA1) - { - EncodeM3TOC(&data_in[offset], 0xA1, lilba, toc.last_track * 75 * 60 - 150, toc.tracks[toc.last_track].control); - lilba++; - offset += 0xA; - } - - if (!match || match == 0xA2) - { - EncodeM3TOC(&data_in[offset], 0xA2, lilba, toc.tracks[100].lba, toc.tracks[100].control); - lilba++; - offset += 0xA; - } - - if (!match) - for (int track = toc.first_track; track <= toc.last_track; track++) - { - EncodeM3TOC(&data_in[offset], U8_to_BCD(track), lilba, toc.tracks[track].lba, toc.tracks[track].control); - lilba++; - offset += 0xA; - } - - if (match == 0xB0) - { - memset(&data_in[offset], 0, 0x14); - offset += 0x14; - } - - assert((unsigned int)offset <= sizeof(data_in)); - data_in_size = offset; - MDFN_en16msb(&data_in[0], offset - 2); - } - break; - - case 0x0: - data_in[0] = U8_to_BCD(toc.first_track); - data_in[1] = U8_to_BCD(toc.last_track); - - data_in_size = 4; - break; - - case 0x1: - { - uint8 m, s, f; - - LBA_to_AMSF(toc.tracks[100].lba, &m, &s, &f); - - data_in[0] = U8_to_BCD(m); - data_in[1] = U8_to_BCD(s); - data_in[2] = U8_to_BCD(f); - - data_in_size = 4; - } - break; - - case 0x2: - { - uint8 m, s, f; - int track = BCD_to_U8(cdb[2]); - - if (track < toc.first_track || track > toc.last_track) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_ADDRESS); - return; - } - - LBA_to_AMSF(toc.tracks[track].lba, &m, &s, &f); - - data_in[0] = U8_to_BCD(m); - data_in[1] = U8_to_BCD(s); - data_in[2] = U8_to_BCD(f); - data_in[3] = toc.tracks[track].control; - data_in_size = 4; - } - break; - } - - DoSimpleDataIn(data_in, data_in_size); -} - -static void DoREADTOC(const uint8 *cdb) -{ - uint8 data_in[8192]; - int FirstTrack = toc.first_track; - int LastTrack = toc.last_track; - int StartingTrack = cdb[6]; - unsigned int AllocSize = (cdb[7] << 8) | cdb[8]; - unsigned int RealSize = 0; - const bool WantInMSF = cdb[1] & 0x2; - - if (!AllocSize) - { - SendStatusAndMessage(STATUS_GOOD, 0x00); - return; - } - - if ((cdb[1] & ~0x2) || cdb[2] || cdb[3] || cdb[4] || cdb[5] || cdb[9]) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (!StartingTrack) - StartingTrack = 1; - else if (StartingTrack == 0xAA) - { - StartingTrack = LastTrack + 1; - } - else if (StartingTrack > toc.last_track) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - data_in[2] = FirstTrack; - data_in[3] = LastTrack; - - RealSize += 4; - - // Read leadout track too LastTrack + 1 ??? - for (int track = StartingTrack; track <= (LastTrack + 1); track++) - { - uint8 *subptr = &data_in[RealSize]; - uint32 lba; - uint8 m, s, f; - uint32 eff_track; - - if (track == (LastTrack + 1)) - eff_track = 100; - else - eff_track = track; - - lba = toc.tracks[eff_track].lba; - LBA_to_AMSF(lba, &m, &s, &f); - - subptr[0] = 0; - subptr[1] = toc.tracks[eff_track].control | (toc.tracks[eff_track].adr << 4); - - if (eff_track == 100) - subptr[2] = 0xAA; - else - subptr[2] = track; - - subptr[3] = 0; - - if (WantInMSF) - { - subptr[4] = 0; - subptr[5] = m; // Min - subptr[6] = s; // Sec - subptr[7] = f; // Frames - } - else - { - subptr[4] = lba >> 24; - subptr[5] = lba >> 16; - subptr[6] = lba >> 8; - subptr[7] = lba >> 0; - } - RealSize += 8; - } - - // PC-FX: AllocSize too small doesn't reflect in this. - data_in[0] = (RealSize - 2) >> 8; - data_in[1] = (RealSize - 2) >> 0; - - DoSimpleDataIn(data_in, (AllocSize < RealSize) ? AllocSize : RealSize); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x25 - READ CD-ROM CAPACITY * -* * -********************************************************/ -static void DoREADCDCAP10(const uint8 *cdb) -{ - bool pmi = cdb[8] & 0x1; - uint32 lba = MDFN_de32msb(cdb + 0x2); - uint32 ret_lba; - uint32 ret_bl; - uint8 data_in[8]; - - memset(data_in, 0, sizeof(data_in)); - - if (lba > 0x05FF69) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); - return; - } - - ret_lba = toc.tracks[100].lba - 1; - - if (pmi) - { - // Look for the track containing the LBA specified, then search for the first track afterwards that has a different track type(audio, data), - // and set the returned LBA to the sector preceding that track. - // - // If the specified LBA is >= leadout track, return the LBA of the sector immediately before the leadout track. - // - // If the specified LBA is < than the LBA of the first track, then return the LBA of sector preceding the first track. (I don't know if PC-FX can even handle discs like this, though) - if (lba >= toc.tracks[100].lba) - ret_lba = toc.tracks[100].lba - 1; - else if (lba < toc.tracks[toc.first_track].lba) - ret_lba = toc.tracks[toc.first_track].lba - 1; - else - { - const int track = toc.FindTrackByLBA(lba); - - for (int st = track + 1; st <= toc.last_track; st++) - { - if ((toc.tracks[st].control ^ toc.tracks[track].control) & 0x4) - { - ret_lba = toc.tracks[st].lba - 1; - break; - } - } - } - } - - ret_bl = 2048; - - MDFN_en32msb(&data_in[0], ret_lba); - MDFN_en32msb(&data_in[4], ret_bl); - - cdda.CDDAStatus = CDDASTATUS_STOPPED; - - DoSimpleDataIn(data_in, 8); -} - -static void DoREADHEADER10(const uint8 *cdb) -{ - uint8 data_in[8192]; - bool WantInMSF = cdb[1] & 0x2; - uint32 HeaderLBA = MDFN_de32msb(cdb + 0x2); - int AllocSize = MDFN_de16msb(cdb + 0x7); - uint8 raw_buf[2352 + 96]; - uint8 mode; - int m, s, f; - uint32 lba; - - // Don't run command at all if AllocSize == 0(FIXME: On a real PC-FX, this command will return success - // if there's no CD when AllocSize == 0, implement this here, might require refactoring). - if (!AllocSize) - { - SendStatusAndMessage(STATUS_GOOD, 0x00); - return; - } - - if (HeaderLBA >= toc.tracks[100].lba) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (HeaderLBA < toc.tracks[toc.first_track].lba) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - Cur_CDIF->ReadRawSector(raw_buf, HeaderLBA); //, HeaderLBA + 1); - if (!ValidateRawDataSector(raw_buf, HeaderLBA)) - return; - - m = BCD_to_U8(raw_buf[12 + 0]); - s = BCD_to_U8(raw_buf[12 + 1]); - f = BCD_to_U8(raw_buf[12 + 2]); - mode = raw_buf[12 + 3]; - lba = AMSF_to_LBA(m, s, f); - - //printf("%d:%d:%d(LBA=%08x) %02x\n", m, s, f, lba, mode); - - data_in[0] = mode; - data_in[1] = 0; - data_in[2] = 0; - data_in[3] = 0; - - if (WantInMSF) - { - data_in[4] = 0; - data_in[5] = m; // Min - data_in[6] = s; // Sec - data_in[7] = f; // Frames - } - else - { - data_in[4] = lba >> 24; - data_in[5] = lba >> 16; - data_in[6] = lba >> 8; - data_in[7] = lba >> 0; - } - - cdda.CDDAStatus = CDDASTATUS_STOPPED; - - DoSimpleDataIn(data_in, 8); -} - -static void DoNEC_SST(const uint8 *cdb) // Command 0xDB, Set Stop Time -{ - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -static void DoPABase(const uint32 lba, const uint32 length, unsigned int status = CDDASTATUS_PLAYING, unsigned int mode = PLAYMODE_NORMAL) -{ - if (lba > toc.tracks[100].lba) // > is not a typo, it's a PC-FX bug apparently. - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (lba < toc.tracks[toc.first_track].lba) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (!length) // FIXME to return good status in this case even if no CD is present - { - SendStatusAndMessage(STATUS_GOOD, 0x00); - return; - } - else - { - if (toc.tracks[toc.FindTrackByLBA(lba)].control & 0x04) - { - CommandCCError(SENSEKEY_MEDIUM_ERROR, NSE_NOT_AUDIO_TRACK); - return; - } - - cdda.CDDAReadPos = 588; - read_sec = read_sec_start = lba; - read_sec_end = read_sec_start + length; - - cdda.CDDAStatus = status; - cdda.PlayMode = mode; - - if (read_sec < toc.tracks[100].lba) - { - Cur_CDIF->HintReadSector(read_sec); //, read_sec_end, read_sec_start); - } - } - - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -/******************************************************** -* * -* PC-FX CD Command 0xD8 - SAPSP * -* * -********************************************************/ -static void DoNEC_SAPSP(const uint8 *cdb) -{ - uint32 lba; - - switch (cdb[9] & 0xc0) - { - default: - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - break; - - case 0x00: - lba = MDFN_de24msb(&cdb[3]); - break; - - case 0x40: - { - uint8 m, s, f; - - if (!BCD_to_U8_check(cdb[2], &m) || !BCD_to_U8_check(cdb[3], &s) || !BCD_to_U8_check(cdb[4], &f)) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - lba = AMSF_to_LBA(m, s, f); - } - break; - - case 0x80: - { - uint8 track; - - if (!cdb[2] || !BCD_to_U8_check(cdb[2], &track)) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (track == toc.last_track + 1) - track = 100; - else if (track > toc.last_track) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); - return; - } - lba = toc.tracks[track].lba; - } - break; - } - - if (cdb[1] & 0x01) - DoPABase(lba, toc.tracks[100].lba - lba, CDDASTATUS_PLAYING, PLAYMODE_NORMAL); - else - DoPABase(lba, toc.tracks[100].lba - lba, CDDASTATUS_PAUSED, PLAYMODE_SILENT); -} - -/******************************************************** -* * -* PC-FX CD Command 0xD9 - SAPEP * -* * -********************************************************/ -static void DoNEC_SAPEP(const uint8 *cdb) -{ - uint32 lba; - - if (cdda.CDDAStatus == CDDASTATUS_STOPPED) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_AUDIO_NOT_PLAYING); - return; - } - - switch (cdb[9] & 0xc0) - { - default: - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - break; - - case 0x00: - lba = MDFN_de24msb(&cdb[3]); - break; - - case 0x40: - { - uint8 m, s, f; - - if (!BCD_to_U8_check(cdb[2], &m) || !BCD_to_U8_check(cdb[3], &s) || !BCD_to_U8_check(cdb[4], &f)) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - lba = AMSF_to_LBA(m, s, f); - } - break; - - case 0x80: - { - uint8 track; - - if (!cdb[2] || !BCD_to_U8_check(cdb[2], &track)) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (track == toc.last_track + 1) - track = 100; - else if (track > toc.last_track) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); - return; - } - lba = toc.tracks[track].lba; - } - break; - } - - switch (cdb[1] & 0x7) - { - case 0x00: - cdda.PlayMode = PLAYMODE_SILENT; - break; - - case 0x04: - cdda.PlayMode = PLAYMODE_LOOP; - break; - - default: - cdda.PlayMode = PLAYMODE_NORMAL; - break; - } - cdda.CDDAStatus = CDDASTATUS_PLAYING; - - read_sec_end = lba; - - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x45 - PLAY AUDIO(10) * -* * -********************************************************/ -static void DoPA10(const uint8 *cdb) -{ - // Real PC-FX Bug: Error out on LBA >(not >=) leadout sector number - const uint32 lba = MDFN_de32msb(cdb + 0x2); - const uint16 length = MDFN_de16msb(cdb + 0x7); - - DoPABase(lba, length); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0xA5 - PLAY AUDIO(12) * -* * -********************************************************/ -static void DoPA12(const uint8 *cdb) -{ - // Real PC-FX Bug: Error out on LBA >(not >=) leadout sector number - const uint32 lba = MDFN_de32msb(cdb + 0x2); - const uint32 length = MDFN_de32msb(cdb + 0x6); - - DoPABase(lba, length); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x47 - PLAY AUDIO MSF * -* * -********************************************************/ -static void DoPAMSF(const uint8 *cdb) -{ - int32 lba_start, lba_end; - - lba_start = AMSF_to_LBA(cdb[3], cdb[4], cdb[5]); - lba_end = AMSF_to_LBA(cdb[6], cdb[7], cdb[8]); - - if (lba_start < 0 || lba_end < 0 || lba_start >= (int32)toc.tracks[100].lba) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); - return; - } - - if (lba_start == lba_end) - { - SendStatusAndMessage(STATUS_GOOD, 0x00); - return; - } - else if (lba_start > lba_end) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_ADDRESS); - return; - } - - cdda.CDDAReadPos = 588; - read_sec = read_sec_start = lba_start; - read_sec_end = lba_end; - - cdda.CDDAStatus = CDDASTATUS_PLAYING; - cdda.PlayMode = PLAYMODE_NORMAL; - - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -static void DoPATI(const uint8 *cdb) -{ - // "Boundary Gate" uses this command. - // Problems: - // The index fields aren't handled. The ending index wouldn't be too bad, but the starting index would require a bit of work and code uglyfying(to scan for the index), and may be highly - // problematic when Mednafen is used with a physical CD. - int StartTrack = cdb[4]; - int EndTrack = cdb[7]; - //int StartIndex = cdb[5]; - //int EndIndex = cdb[8]; - - if (!StartTrack || StartTrack < toc.first_track || StartTrack > toc.last_track) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - //printf("PATI: %d %d %d SI: %d, EI: %d\n", StartTrack, EndTrack, Cur_CDIF->GetTrackStartPositionLBA(StartTrack), StartIndex, EndIndex); - - DoPABase(toc.tracks[StartTrack].lba, toc.tracks[EndTrack].lba - toc.tracks[StartTrack].lba); -} - -static void DoPATRBase(const uint32 lba, const uint32 length) -{ - if (lba >= toc.tracks[100].lba) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (lba < toc.tracks[toc.first_track].lba) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (!length) // FIXME to return good status in this case even if no CD is present - { - SendStatusAndMessage(STATUS_GOOD, 0x00); - return; - } - else - { - if (toc.tracks[toc.FindTrackByLBA(lba)].control & 0x04) - { - CommandCCError(SENSEKEY_MEDIUM_ERROR, NSE_NOT_AUDIO_TRACK); - return; - } - - cdda.CDDAReadPos = 588; - read_sec = read_sec_start = lba; - read_sec_end = read_sec_start + length; - - cdda.CDDAStatus = CDDASTATUS_PLAYING; - cdda.PlayMode = PLAYMODE_NORMAL; - } - - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x49 - PLAY AUDIO TRACK * -* RELATIVE(10) * -********************************************************/ -static void DoPATR10(const uint8 *cdb) -{ - const int32 rel_lba = MDFN_de32msb(cdb + 0x2); - const int StartTrack = cdb[6]; - const uint16 length = MDFN_de16msb(cdb + 0x7); - - if (!StartTrack || StartTrack < toc.first_track || StartTrack > toc.last_track) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - DoPATRBase(toc.tracks[StartTrack].lba + rel_lba, length); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0xA9 - PLAY AUDIO TRACK * -* RELATIVE(12) * -********************************************************/ -static void DoPATR12(const uint8 *cdb) -{ - const int32 rel_lba = MDFN_de32msb(cdb + 0x2); - const int StartTrack = cdb[10]; - const uint32 length = MDFN_de32msb(cdb + 0x6); - - if (!StartTrack || StartTrack < toc.first_track || StartTrack > toc.last_track) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - DoPATRBase(toc.tracks[StartTrack].lba + rel_lba, length); -} - -static void DoPAUSERESUME(const uint8 *cdb) -{ - // Pause/resume - // "It shall not be considered an error to request a pause when a pause is already in effect, - // or to request a resume when a play operation is in progress." - - if (cdda.CDDAStatus == CDDASTATUS_STOPPED) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_AUDIO_NOT_PLAYING); - return; - } - - if (cdb[8] & 1) // Resume - cdda.CDDAStatus = CDDASTATUS_PLAYING; - else - cdda.CDDAStatus = CDDASTATUS_PAUSED; - - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -static void DoREADBase(uint32 sa, uint32 sc) -{ - int track; - - if (sa > toc.tracks[100].lba) // Another one of those off-by-one PC-FX CD bugs. - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); - return; - } - - if ((track = toc.FindTrackByLBA(sa)) == 0) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); - return; - } - - if (!(toc.tracks[track].control) & 0x4) - { - CommandCCError(SENSEKEY_MEDIUM_ERROR, NSE_NOT_DATA_TRACK); - return; - } - - // Case for READ(10) and READ(12) where sc == 0, and sa == toc.tracks[100].lba - if (!sc && sa == toc.tracks[100].lba) - { - CommandCCError(SENSEKEY_MEDIUM_ERROR, NSE_HEADER_READ_ERROR); - return; - } - - if (SCSILog) - { - int Track = toc.FindTrackByLBA(sa); - uint32 Offset = sa - toc.tracks[Track].lba; //Cur_CDIF->GetTrackStartPositionLBA(Track); - SCSILog("SCSI", "Read: start=0x%08x(track=%d, offs=0x%08x), cnt=0x%08x", sa, Track, Offset, sc); - } - - SectorAddr = sa; - SectorCount = sc; - if (SectorCount) - { - Cur_CDIF->HintReadSector(sa); //, sa + sc); - - CDReadTimer = (uint64)((WhichSystem == SCSICD_PCE) ? 3 : 1) * 2048 * System_Clock / CD_DATA_TRANSFER_RATE; - } - else - { - CDReadTimer = 0; - SendStatusAndMessage(STATUS_GOOD, 0x00); - } - cdda.CDDAStatus = CDDASTATUS_STOPPED; -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x08 - READ(6) * -* * -********************************************************/ -static void DoREAD6(const uint8 *cdb) -{ - uint32 sa = ((cdb[1] & 0x1F) << 16) | (cdb[2] << 8) | (cdb[3] << 0); - uint32 sc = cdb[4]; - - // TODO: confirm real PCE does this(PC-FX does at least). - if (!sc) - { - //SCSIDBG("READ(6) with count == 0.\n"); - sc = 256; - } - - DoREADBase(sa, sc); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x28 - READ(10) * -* * -********************************************************/ -static void DoREAD10(const uint8 *cdb) -{ - uint32 sa = MDFN_de32msb(cdb + 0x2); - uint32 sc = MDFN_de16msb(cdb + 0x7); - - DoREADBase(sa, sc); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0xA8 - READ(12) * -* * -********************************************************/ -static void DoREAD12(const uint8 *cdb) -{ - uint32 sa = MDFN_de32msb(cdb + 0x2); - uint32 sc = MDFN_de32msb(cdb + 0x6); - - DoREADBase(sa, sc); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x34 - PREFETCH(10) * -* * -********************************************************/ -static void DoPREFETCH(const uint8 *cdb) -{ - uint32 lba = MDFN_de32msb(cdb + 0x2); - //uint32 len = MDFN_de16msb(cdb + 0x7); - //bool reladdr = cdb[1] & 0x1; - //bool immed = cdb[1] & 0x2; - - // Note: This command appears to lock up the CD unit to some degree on a real PC-FX if the (lba + len) >= leadout_track_lba, - // more testing is needed if we ever try to fully emulate this command. - if (lba >= toc.tracks[100].lba) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); - return; - } - - //printf("Prefetch: %08x %08x %d %d %d %d\n", lba, len, link, flag, reladdr, immed); - //SendStatusAndMessage(STATUS_GOOD, 0x00); - SendStatusAndMessage(STATUS_CONDITION_MET, 0x00); -} - -// SEEK functions are mostly just stubs for now, until(if) we emulate seek delays. -static void DoSEEKBase(uint32 lba) -{ - if (lba >= toc.tracks[100].lba) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); - return; - } - - cdda.CDDAStatus = CDDASTATUS_STOPPED; - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x0B - SEEK(6) * -* * -********************************************************/ -static void DoSEEK6(const uint8 *cdb) -{ - uint32 lba = ((cdb[1] & 0x1F) << 16) | (cdb[2] << 8) | cdb[3]; - - DoSEEKBase(lba); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x2B - SEEK(10) * -* * -********************************************************/ -static void DoSEEK10(const uint8 *cdb) -{ - uint32 lba = MDFN_de32msb(cdb + 0x2); - - DoSEEKBase(lba); -} - -// 353 -/******************************************************** -* * -* SCSI-2 CD Command 0x42 - READ SUB-CHANNEL(10) * -* * -********************************************************/ -static void DoREADSUBCHANNEL(const uint8 *cdb) -{ - uint8 data_in[8192]; - int DataFormat = cdb[3]; - int TrackNum = cdb[6]; - unsigned AllocSize = (cdb[7] << 8) | cdb[8]; - bool WantQ = cdb[2] & 0x40; - bool WantMSF = cdb[1] & 0x02; - uint32 offset = 0; - - if (!AllocSize) - { - SendStatusAndMessage(STATUS_GOOD, 0x00); - return; - } - - if (DataFormat > 0x3) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - if (DataFormat == 0x3 && (TrackNum < toc.first_track || TrackNum > toc.last_track)) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_PARAMETER); - return; - } - - data_in[offset++] = 0; - - // FIXME: Is this audio status code correct for scanning playback?? - if (cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) - data_in[offset++] = 0x11; // Audio play operation in progress - else if (cdda.CDDAStatus == CDDASTATUS_PAUSED) - data_in[offset++] = 0x12; // Audio play operation paused - else - data_in[offset++] = 0x13; // 0x13(audio play operation completed successfully) or 0x15(no current audio status to return)? :( - - // Subchannel data length(at data_in[0x2], filled out at the end of the function) - data_in[offset++] = 0x00; - data_in[offset++] = 0x00; - - //printf("42Read SubChannel: %02x %02x %d %d %d\n", DataFormat, TrackNum, AllocSize, WantQ, WantMSF); - if (WantQ) - { - // Sub-channel format code - data_in[offset++] = DataFormat; - if (!DataFormat || DataFormat == 0x01) - { - uint8 *SubQBuf = cd.SubQBuf[QMode_Time]; - - data_in[offset++] = ((SubQBuf[0] & 0x0F) << 4) | ((SubQBuf[0] & 0xF0) >> 4); // Control/adr - data_in[offset++] = SubQBuf[1]; // Track - data_in[offset++] = SubQBuf[2]; // Index - - // Absolute CD-ROM address - if (WantMSF) - { - data_in[offset++] = 0; - data_in[offset++] = BCD_to_U8(SubQBuf[7]); // M - data_in[offset++] = BCD_to_U8(SubQBuf[8]); // S - data_in[offset++] = BCD_to_U8(SubQBuf[9]); // F - } - else - { - uint32 tmp_lba = BCD_to_U8(SubQBuf[7]) * 60 * 75 + BCD_to_U8(SubQBuf[8]) * 75 + BCD_to_U8(SubQBuf[9]) - 150; - - data_in[offset++] = tmp_lba >> 24; - data_in[offset++] = tmp_lba >> 16; - data_in[offset++] = tmp_lba >> 8; - data_in[offset++] = tmp_lba >> 0; - } - - // Relative CD-ROM address - if (WantMSF) - { - data_in[offset++] = 0; - data_in[offset++] = BCD_to_U8(SubQBuf[3]); // M - data_in[offset++] = BCD_to_U8(SubQBuf[4]); // S - data_in[offset++] = BCD_to_U8(SubQBuf[5]); // F - } - else - { - uint32 tmp_lba = BCD_to_U8(SubQBuf[3]) * 60 * 75 + BCD_to_U8(SubQBuf[4]) * 75 + BCD_to_U8(SubQBuf[5]); // Don't subtract 150 in the conversion! - - data_in[offset++] = tmp_lba >> 24; - data_in[offset++] = tmp_lba >> 16; - data_in[offset++] = tmp_lba >> 8; - data_in[offset++] = tmp_lba >> 0; - } - } - - if (!DataFormat || DataFormat == 0x02) - { - if (DataFormat == 0x02) - { - data_in[offset++] = 0x00; - data_in[offset++] = 0x00; - data_in[offset++] = 0x00; - } - data_in[offset++] = 0x00; // MCVal and reserved. - for (int i = 0; i < 15; i++) - data_in[offset++] = 0x00; - } - - // Track ISRC - if (!DataFormat || DataFormat == 0x03) - { - if (DataFormat == 0x03) - { - uint8 *SubQBuf = cd.SubQBuf[QMode_Time]; // FIXME - data_in[offset++] = ((SubQBuf[0] & 0x0F) << 4) | ((SubQBuf[0] & 0xF0) >> 4); // Control/adr - data_in[offset++] = TrackNum; // From sub Q or from parameter? - data_in[offset++] = 0x00; // Reserved. - } - data_in[offset++] = 0x00; // TCVal and reserved - for (int i = 0; i < 15; i++) - data_in[offset++] = 0x00; - } - } - - MDFN_en16msb(&data_in[0x2], offset - 0x4); - - DoSimpleDataIn(data_in, (AllocSize > offset) ? offset : AllocSize); -} - -/******************************************************** -* * -* PC-FX CD Command 0xDD - READ SUB Q * -* * -********************************************************/ -static void DoNEC_READSUBQ(const uint8 *cdb) -{ - uint8 *SubQBuf = cd.SubQBuf[QMode_Time]; - uint8 data_in[10]; - const uint8 alloc_size = (cdb[1] < 10) ? cdb[1] : 10; - - memset(data_in, 0x00, 10); - - if (cdda.CDDAStatus == CDDASTATUS_PAUSED) - data_in[0] = 2; // Pause - else if (cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) // FIXME: Is this the correct status code for scanning playback? - data_in[0] = 0; // Playing - else - data_in[0] = 3; // Stopped - - data_in[1] = SubQBuf[0]; // Control/adr - data_in[2] = SubQBuf[1]; // Track - data_in[3] = SubQBuf[2]; // Index - data_in[4] = SubQBuf[3]; // M(rel) - data_in[5] = SubQBuf[4]; // S(rel) - data_in[6] = SubQBuf[5]; // F(rel) - data_in[7] = SubQBuf[7]; // M(abs) - data_in[8] = SubQBuf[8]; // S(abs) - data_in[9] = SubQBuf[9]; // F(abs) - - DoSimpleDataIn(data_in, alloc_size); -} - -static void DoTESTUNITREADY(const uint8 *cdb) -{ - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -static void DoNEC_PAUSE(const uint8 *cdb) -{ - if (cdda.CDDAStatus != CDDASTATUS_STOPPED) // Hmm, should we give an error if it tries to pause and it's already paused? - { - cdda.CDDAStatus = CDDASTATUS_PAUSED; - SendStatusAndMessage(STATUS_GOOD, 0x00); - } - else // Definitely give an error if it tries to pause when no track is playing! - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_AUDIO_NOT_PLAYING); - } -} - -static void DoNEC_SCAN(const uint8 *cdb) -{ - uint32 sector_tmp = 0; - - // 0: 0xD2 - // 1: 0x03 = reverse scan, 0x02 = forward scan - // 2: End M - // 3: End S - // 4: End F - - switch (cdb[9] & 0xc0) - { - default: - //SCSIDBG("Unknown NECSCAN format"); - break; - - case 0x00: - sector_tmp = (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; - break; - - case 0x40: - sector_tmp = AMSF_to_LBA(BCD_to_U8(cdb[2]), BCD_to_U8(cdb[3]), BCD_to_U8(cdb[4])); - break; - - case 0x80: // FIXME: error on invalid track number??? - sector_tmp = toc.tracks[BCD_to_U8(cdb[2])].lba; - break; - } - - cdda.ScanMode = cdb[1] & 0x3; - cdda.scan_sec_end = sector_tmp; - - if (cdda.CDDAStatus != CDDASTATUS_STOPPED) - { - if (cdda.ScanMode) - { - cdda.CDDAStatus = CDDASTATUS_SCANNING; - } - } - SendStatusAndMessage(STATUS_GOOD, 0x00); -} - -/******************************************************** -* * -* SCSI-2 CD Command 0x1E - PREVENT/ALLOW MEDIUM * -* REMOVAL * -********************************************************/ -static void DoPREVENTALLOWREMOVAL(const uint8 *cdb) -{ - //bool prevent = cdb[4] & 0x01; - //const int logical_unit = cdb[1] >> 5; - //SCSIDBG("PREVENT ALLOW MEDIUM REMOVAL: %d for %d\n", cdb[4] & 0x1, logical_unit); - //SendStatusAndMessage(STATUS_GOOD, 0x00); - - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_REQUEST_IN_CDB); -} - -// -// -// -#include "scsicd-pce-commands.inc" - -#define SCF_REQUIRES_MEDIUM 0x0001 -#define SCF_INCOMPLETE 0x4000 -#define SCF_UNTESTED 0x8000 - -typedef struct -{ - uint8 cmd; - uint32 flags; - void (*func)(const uint8 *cdb); - const char *pretty_name; - const char *format_string; -} SCSICH; - -static const int32 RequiredCDBLen[16] = - { - 6, // 0x0n - 6, // 0x1n - 10, // 0x2n - 10, // 0x3n - 10, // 0x4n - 10, // 0x5n - 10, // 0x6n - 10, // 0x7n - 10, // 0x8n - 10, // 0x9n - 12, // 0xAn - 12, // 0xBn - 10, // 0xCn - 10, // 0xDn - 10, // 0xEn - 10, // 0xFn -}; - -static SCSICH PCFXCommandDefs[] = - { - {0x00, SCF_REQUIRES_MEDIUM, DoTESTUNITREADY, "Test Unit Ready"}, - {0x01, 0 /* ? */, DoREZEROUNIT, "Rezero Unit"}, - {0x03, 0, DoREQUESTSENSE, "Request Sense"}, - {0x08, SCF_REQUIRES_MEDIUM, DoREAD6, "Read(6)"}, - {0x0B, SCF_REQUIRES_MEDIUM, DoSEEK6, "Seek(6)"}, - {0x0D, 0, DoNEC_NOP, "No Operation"}, - {0x12, 0, DoINQUIRY, "Inquiry"}, - {0x15, 0, DoMODESELECT6, "Mode Select(6)"}, - // TODO: { 0x16, 0 /* ? */, DoRESERVE, "Reserve" }, // 9.2.12 - // TODO: { 0x17, 0 /* ? */, DoRELEASE, "Release" }, // 9.2.11 - {0x1A, 0, DoMODESENSE6, "Mode Sense(6)"}, - {0x1B, SCF_REQUIRES_MEDIUM, DoSTARTSTOPUNIT6, "Start/Stop Unit"}, // 9.2.17 - // TODO: { 0x1D, , DoSENDDIAG, "Send Diagnostic" }, // 8.2.15 - {0x1E, 0, DoPREVENTALLOWREMOVAL, "Prevent/Allow Media Removal"}, - - {0x25, SCF_REQUIRES_MEDIUM, DoREADCDCAP10, "Read CD-ROM Capacity"}, // 14.2.8 - {0x28, SCF_REQUIRES_MEDIUM, DoREAD10, "Read(10)"}, - {0x2B, SCF_REQUIRES_MEDIUM, DoSEEK10, "Seek(10)"}, - - // TODO: { 0x2F, SCF_REQUIRES_MEDIUM, DoVERIFY10, "Verify(10)" }, // 16.2.11 - - {0x34, SCF_REQUIRES_MEDIUM, DoPREFETCH, "Prefetch"}, - // TODO: { 0x3B, 0, 10, DoWRITEBUFFER, "Write Buffer" }, // 8.2.17 - // TODO: { 0x3C, 0, 10, DoREADBUFFER, "Read Buffer" }, // 8.2.12 - - {0x42, SCF_REQUIRES_MEDIUM, DoREADSUBCHANNEL, "Read Subchannel"}, - {0x43, SCF_REQUIRES_MEDIUM, DoREADTOC, "Read TOC"}, - {0x44, SCF_REQUIRES_MEDIUM, DoREADHEADER10, "Read Header"}, - - {0x45, SCF_REQUIRES_MEDIUM, DoPA10, "Play Audio(10)"}, - {0x47, SCF_REQUIRES_MEDIUM, DoPAMSF, "Play Audio MSF"}, - {0x48, SCF_REQUIRES_MEDIUM, DoPATI, "Play Audio Track Index"}, - {0x49, SCF_REQUIRES_MEDIUM, DoPATR10, "Play Audio Track Relative(10)"}, - {0x4B, SCF_REQUIRES_MEDIUM, DoPAUSERESUME, "Pause/Resume"}, - - {0xA5, SCF_REQUIRES_MEDIUM, DoPA12, "Play Audio(12)"}, - {0xA8, SCF_REQUIRES_MEDIUM, DoREAD12, "Read(12)"}, - {0xA9, SCF_REQUIRES_MEDIUM, DoPATR12, "Play Audio Track Relative(12)"}, - - // TODO: { 0xAF, SCF_REQUIRES_MEDIUM, DoVERIFY12, "Verify(12)" }, // 16.2.12 - - {0xD2, SCF_REQUIRES_MEDIUM, DoNEC_SCAN, "Scan"}, - {0xD8, SCF_REQUIRES_MEDIUM, DoNEC_SAPSP, "Set Audio Playback Start Position"}, // "Audio track search" - {0xD9, SCF_REQUIRES_MEDIUM, DoNEC_SAPEP, "Set Audio Playback End Position"}, // "Play" - {0xDA, SCF_REQUIRES_MEDIUM, DoNEC_PAUSE, "Pause"}, // "Still" - {0xDB, SCF_REQUIRES_MEDIUM | SCF_UNTESTED, DoNEC_SST, "Set Stop Time"}, - {0xDC, SCF_REQUIRES_MEDIUM, DoNEC_EJECT, "Eject"}, - {0xDD, SCF_REQUIRES_MEDIUM, DoNEC_READSUBQ, "Read Subchannel Q"}, - {0xDE, SCF_REQUIRES_MEDIUM, DoNEC_GETDIRINFO, "Get Dir Info"}, - - {0xFF, 0, 0, NULL, NULL}, -}; - -static SCSICH PCECommandDefs[] = - { - {0x00, SCF_REQUIRES_MEDIUM, DoTESTUNITREADY, "Test Unit Ready"}, - {0x03, 0, DoREQUESTSENSE, "Request Sense"}, - {0x08, SCF_REQUIRES_MEDIUM, DoREAD6, "Read(6)"}, - //{ 0x15, DoMODESELECT6, "Mode Select(6)" }, - {0xD8, SCF_REQUIRES_MEDIUM, DoNEC_PCE_SAPSP, "Set Audio Playback Start Position"}, - {0xD9, SCF_REQUIRES_MEDIUM, DoNEC_PCE_SAPEP, "Set Audio Playback End Position"}, - {0xDA, SCF_REQUIRES_MEDIUM, DoNEC_PCE_PAUSE, "Pause"}, - {0xDD, SCF_REQUIRES_MEDIUM, DoNEC_PCE_READSUBQ, "Read Subchannel Q"}, - {0xDE, SCF_REQUIRES_MEDIUM, DoNEC_PCE_GETDIRINFO, "Get Dir Info"}, - - {0xFF, 0, 0, NULL, NULL}, -}; - -void SCSICD_ResetTS(uint32 ts_base) -{ - lastts = ts_base; -} - -void SCSICD_GetCDDAValues(int16 &left, int16 &right) -{ - if (cdda.CDDAStatus) - { - left = cdda.sr[0]; - right = cdda.sr[1]; - } - else - left = right = 0; -} - -#define CDDA_FILTER_NUMCONVOLUTIONS 7 -#define CDDA_FILTER_NUMCONVOLUTIONS_PADDED 8 - -#define CDDA_FILTER_NUMPHASES_SHIFT 6 -#define CDDA_FILTER_NUMPHASES (1 << CDDA_FILTER_NUMPHASES_SHIFT) - -alignas(16) static const int16 CDDA_Filter[1 + CDDA_FILTER_NUMPHASES + 1][CDDA_FILTER_NUMCONVOLUTIONS_PADDED] = - { -#include "scsicd_cdda_filter.inc" -}; - -alignas(16) static const int16 OversampleFilter[2][0x10] = - { - { - -82, 217, -463, 877, -1562, 2783, -5661, 29464, 9724, -3844, 2074, -1176, 645, -323, 138, -43, - }, /* sum=32768, sum_abs=59076 */ - { - -43, 138, -323, 645, -1176, 2074, -3844, 9724, 29464, -5661, 2783, -1562, 877, -463, 217, -82, - }, /* sum=32768, sum_abs=59076 */ -}; - -static INLINE void RunCDDA(uint32 system_timestamp, int32 run_time) -{ - if (cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) - { - cdda.CDDADiv -= (int64)run_time << 20; - - while (cdda.CDDADiv <= 0) - { - const uint32 synthtime_ex = (((uint64)system_timestamp << 20) + (int64)cdda.CDDADiv) / cdda.CDDATimeDiv; - const int synthtime = (synthtime_ex >> 16) & 0xFFFF; // & 0xFFFF(or equivalent) to prevent overflowing HRBufs[] - const int synthtime_phase = (int)(synthtime_ex & 0xFFFF) - 0x80; - const int synthtime_phase_int = synthtime_phase >> (16 - CDDA_FILTER_NUMPHASES_SHIFT); - const int synthtime_phase_fract = synthtime_phase & ((1 << (16 - CDDA_FILTER_NUMPHASES_SHIFT)) - 1); - int32 sample_va[2]; - - cdda.CDDADiv += cdda.CDDADivAcc; - - if (!(cdda.OversamplePos & 1)) - { - if (cdda.CDDAReadPos == 588) - { - if (read_sec >= read_sec_end || (cdda.CDDAStatus == CDDASTATUS_SCANNING && read_sec == cdda.scan_sec_end)) - { - switch (cdda.PlayMode) - { - case PLAYMODE_SILENT: - case PLAYMODE_NORMAL: - cdda.CDDAStatus = CDDASTATUS_STOPPED; - break; - - case PLAYMODE_INTERRUPT: - cdda.CDDAStatus = CDDASTATUS_STOPPED; - CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_DONE); - break; - - case PLAYMODE_LOOP: - read_sec = read_sec_start; - break; - } - - // If CDDA playback is stopped, break out of our while(CDDADiv ...) loop and don't play any more sound! - if (cdda.CDDAStatus == CDDASTATUS_STOPPED) - break; - } - - // Don't play past the user area of the disc. - if (read_sec >= toc.tracks[100].lba) - { - cdda.CDDAStatus = CDDASTATUS_STOPPED; - break; - } - - if (TrayOpen || !Cur_CDIF) - { - cdda.CDDAStatus = CDDASTATUS_STOPPED; - -#if 0 - cd.data_transfer_done = FALSE; - cd.key_pending = SENSEKEY_NOT_READY; - cd.asc_pending = ASC_MEDIUM_NOT_PRESENT; - cd.ascq_pending = 0x00; - cd.fru_pending = 0x00; - SendStatusAndMessage(STATUS_CHECK_CONDITION, 0x00); -#endif - - break; - } - - cdda.CDDAReadPos = 0; - - { - uint8 tmpbuf[2352 + 96]; - - Cur_CDIF->ReadRawSector(tmpbuf, read_sec); //, read_sec_end, read_sec_start); - - for (int i = 0; i < 588 * 2; i++) - cdda.CDDASectorBuffer[i] = MDFN_de16lsb(&tmpbuf[i * 2]); - - memcpy(cd.SubPWBuf, tmpbuf + 2352, 96); - } - GenSubQFromSubPW(); - - if (!(cd.SubQBuf_Last[0] & 0x10)) - { - // Not using de-emphasis, so clear the de-emphasis filter state. - memset(cdda.DeemphState, 0, sizeof(cdda.DeemphState)); - } - - if (cdda.CDDAStatus == CDDASTATUS_SCANNING) - { - int64 tmp_read_sec = read_sec; - - if (cdda.ScanMode & 1) - { - tmp_read_sec -= 24; - if (tmp_read_sec < cdda.scan_sec_end) - tmp_read_sec = cdda.scan_sec_end; - } - else - { - tmp_read_sec += 24; - if (tmp_read_sec > cdda.scan_sec_end) - tmp_read_sec = cdda.scan_sec_end; - } - read_sec = tmp_read_sec; - } - else - read_sec++; - } // End if(CDDAReadPos == 588) - - if (!(cdda.CDDAReadPos % 6)) - { - int subindex = cdda.CDDAReadPos / 6 - 2; - - if (subindex >= 0) - CDStuffSubchannels(cd.SubPWBuf[subindex], subindex); - else // The system-specific emulation code should handle what value the sync bytes are. - CDStuffSubchannels(0x00, subindex); - } - - // If the last valid sub-Q data decoded indicate that the corresponding sector is a data sector, don't output the - // current sector as audio. - if (!(cd.SubQBuf_Last[0] & 0x40) && cdda.PlayMode != PLAYMODE_SILENT) - { - cdda.sr[0] = cdda.CDDASectorBuffer[cdda.CDDAReadPos * 2 + cdda.OutPortChSelectCache[0]]; - cdda.sr[1] = cdda.CDDASectorBuffer[cdda.CDDAReadPos * 2 + cdda.OutPortChSelectCache[1]]; - } - -#if 0 - { - static int16 wv = 0x7FFF; //0x5000; - static unsigned counter = 0; - static double phase = 0; - static double phase_inc = 0; - static const double phase_inc_inc = 0.000003 / 2; - - cdda.sr[0] = 32767 * sin(phase); - cdda.sr[1] = 32767 * sin(phase); - - //cdda.sr[0] = wv; - //cdda.sr[1] = wv; - - if(counter == 0) - wv = -wv; - counter = (counter + 1) & 1; - phase += phase_inc; - phase_inc += phase_inc_inc; - } -#endif - - { - const unsigned obwp = cdda.OversamplePos >> 1; - cdda.OversampleBuffer[0][obwp] = cdda.OversampleBuffer[0][0x10 + obwp] = cdda.sr[0]; - cdda.OversampleBuffer[1][obwp] = cdda.OversampleBuffer[1][0x10 + obwp] = cdda.sr[1]; - } - - cdda.CDDAReadPos++; - } // End if(!(cdda.OversamplePos & 1)) - - { - const int16 *f = OversampleFilter[cdda.OversamplePos & 1]; -#if defined(__SSE2__) - __m128i f0 = _mm_load_si128((__m128i *)&f[0]); - __m128i f1 = _mm_load_si128((__m128i *)&f[8]); -#endif - - for (unsigned lr = 0; lr < 2; lr++) - { - const int16 *b = &cdda.OversampleBuffer[lr][((cdda.OversamplePos >> 1) + 1) & 0xF]; -#if defined(__SSE2__) - union { - int32 accum; - float accum_f; - //__m128i accum_m128; - }; - - { - __m128i b0; - __m128i b1; - __m128i sum; - - b0 = _mm_loadu_si128((__m128i *)&b[0]); - b1 = _mm_loadu_si128((__m128i *)&b[8]); - - sum = _mm_add_epi32(_mm_madd_epi16(f0, b0), _mm_madd_epi16(f1, b1)); - sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, (3 << 0) | (2 << 2) | (1 << 4) | (0 << 6))); - sum = _mm_add_epi32(sum, _mm_shuffle_epi32(sum, (1 << 0) | (0 << 2) | (3 << 4) | (2 << 6))); - _mm_store_ss(&accum_f, (__m128)sum); - //_mm_store_si128(&accum_m128, sum); - } -#else - int32 accum = 0; - - for (unsigned i = 0; i < 0x10; i++) - accum += f[i] * b[i]; -#endif - // sum_abs * cdda_min = - // 59076 * -32768 = -1935802368 - // OPVC can have a maximum value of 65536. - // -1935802368 * 65536 = -126864743989248 - // - // -126864743989248 / 65536 = -1935802368 - sample_va[lr] = ((int64)accum * cdda.OutPortVolumeCache[lr]) >> 16; - // Output of this stage will be (approximate max ranges) -2147450880 through 2147385345. - } - } - - // - // This de-emphasis filter's frequency response isn't totally correct, but it's much better than nothing(and it's not like any known PCE CD/TG16 CD/PC-FX games - // utilize pre-emphasis anyway). - // - if (MDFN_UNLIKELY(cd.SubQBuf_Last[0] & 0x10)) - { - //puts("Deemph"); - for (unsigned lr = 0; lr < 2; lr++) - { - float inv = sample_va[lr] * 0.35971507338824012f; - - cdda.DeemphState[lr][1] = (cdda.DeemphState[lr][0] - 0.4316395666f * inv) + (0.7955522347f * cdda.DeemphState[lr][1]); - cdda.DeemphState[lr][0] = inv; - - sample_va[lr] = std::max(-2147483648.0, std::min(2147483647.0, cdda.DeemphState[lr][1])); - //printf("%u: %f, %d\n", lr, cdda.DeemphState[lr][1], sample_va[lr]); - } - } - - if (HRBufs[0] && HRBufs[1]) - { -// -// FINAL_OUT_SHIFT should be 32 so we can take advantage of 32x32->64 multipliers on 32-bit CPUs. -// -#define FINAL_OUT_SHIFT 32 -#define MULT_SHIFT_ADJ (32 - (26 + (8 - CDDA_FILTER_NUMPHASES_SHIFT))) - -#if (((1 << (16 - CDDA_FILTER_NUMPHASES_SHIFT)) - 0) << MULT_SHIFT_ADJ) > 32767 -#error "COEFF MULT OVERFLOW" -#endif - - const int16 mult_a = ((1 << (16 - CDDA_FILTER_NUMPHASES_SHIFT)) - synthtime_phase_fract) << MULT_SHIFT_ADJ; - const int16 mult_b = synthtime_phase_fract << MULT_SHIFT_ADJ; - int32 coeff[CDDA_FILTER_NUMCONVOLUTIONS]; - - //if(synthtime_phase_fract == 0) - // printf("%5d: %d %d\n", synthtime_phase_fract, mult_a, mult_b); - - for (unsigned c = 0; c < CDDA_FILTER_NUMCONVOLUTIONS; c++) - { - coeff[c] = (CDDA_Filter[1 + synthtime_phase_int + 0][c] * mult_a + - CDDA_Filter[1 + synthtime_phase_int + 1][c] * mult_b); - } - - int32 *tb0 = &HRBufs[0][synthtime]; - int32 *tb1 = &HRBufs[1][synthtime]; - - for (unsigned c = 0; c < CDDA_FILTER_NUMCONVOLUTIONS; c++) - { - tb0[c] += ((int64)coeff[c] * sample_va[0]) >> FINAL_OUT_SHIFT; - tb1[c] += ((int64)coeff[c] * sample_va[1]) >> FINAL_OUT_SHIFT; - } -#undef FINAL_OUT_SHIFT -#undef MULT_SHIFT_ADJ - } - - cdda.OversamplePos = (cdda.OversamplePos + 1) & 0x1F; - } // end while(cdda.CDDADiv <= 0) - } -} - -static INLINE void RunCDRead(uint32 system_timestamp, int32 run_time) -{ - if (CDReadTimer > 0) - { - CDReadTimer -= run_time; - - if (CDReadTimer <= 0) - { - if (din->CanWrite() < ((WhichSystem == SCSICD_PCFX) ? 2352 : 2048)) // +96 if we find out the PC-FX can read subchannel data along with raw data too. ;) - { - //printf("Carp: %d %d %d\n", din->CanWrite(), SectorCount, CDReadTimer); - //CDReadTimer = (cd.data_in_size - cd.data_in_pos) * 10; - - CDReadTimer += (uint64)1 * 2048 * System_Clock / CD_DATA_TRANSFER_RATE; - - //CDReadTimer += (uint64) 1 * 128 * System_Clock / CD_DATA_TRANSFER_RATE; - } - else - { - uint8 tmp_read_buf[2352 + 96]; - - if (TrayOpen) - { - din->Flush(); - cd.data_transfer_done = FALSE; - - CommandCCError(SENSEKEY_NOT_READY, NSE_TRAY_OPEN); - } - else if (!Cur_CDIF) - { - CommandCCError(SENSEKEY_NOT_READY, NSE_NO_DISC); - } - else if (SectorAddr >= toc.tracks[100].lba) - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_END_OF_VOLUME); - } - else if (!Cur_CDIF->ReadRawSector(tmp_read_buf, SectorAddr)) //, SectorAddr + SectorCount)) - { - cd.data_transfer_done = FALSE; - - CommandCCError(SENSEKEY_ILLEGAL_REQUEST); - } - else if (ValidateRawDataSector(tmp_read_buf, SectorAddr)) - { - memcpy(cd.SubPWBuf, tmp_read_buf + 2352, 96); - - if (tmp_read_buf[12 + 3] == 0x2) - din->Write(tmp_read_buf + 24, 2048); - else - din->Write(tmp_read_buf + 16, 2048); - - GenSubQFromSubPW(); - - CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_READY); - - SectorAddr++; - SectorCount--; - - if (CurrentPhase != PHASE_DATA_IN) - ChangePhase(PHASE_DATA_IN); - - if (SectorCount) - { - cd.data_transfer_done = FALSE; - CDReadTimer += (uint64)1 * 2048 * System_Clock / CD_DATA_TRANSFER_RATE; - } - else - { - cd.data_transfer_done = TRUE; - } - } - } // end else to if(!Cur_CDIF->ReadSector - } - } -} - -uint32 SCSICD_Run(scsicd_timestamp_t system_timestamp) -{ - int32 run_time = system_timestamp - lastts; - - if (system_timestamp < lastts) - { - fprintf(stderr, "Meow: %d %d\n", system_timestamp, lastts); - assert(system_timestamp >= lastts); - } - - monotonic_timestamp += run_time; - - lastts = system_timestamp; - - RunCDRead(system_timestamp, run_time); - RunCDDA(system_timestamp, run_time); - - bool ResetNeeded = false; - - if (RST_signal && !cd.last_RST_signal) - ResetNeeded = true; - - cd.last_RST_signal = RST_signal; - - if (ResetNeeded) - { - //puts("RST"); - VirtualReset(); - } - else if (CurrentPhase == PHASE_BUS_FREE) - { - if (SEL_signal) - { - if (WhichSystem == SCSICD_PCFX) - { - //if(cd_bus.DB == 0x84) - { - ChangePhase(PHASE_COMMAND); - } - } - else // PCE - { - ChangePhase(PHASE_COMMAND); - } - } - } - else if (ATN_signal && !REQ_signal && !ACK_signal) - { - //printf("Yay: %d %d\n", REQ_signal, ACK_signal); - ChangePhase(PHASE_MESSAGE_OUT); - } - else - switch (CurrentPhase) - { - case PHASE_COMMAND: - if (REQ_signal && ACK_signal) // Data bus is valid nowww - { - //printf("Command Phase Byte I->T: %02x, %d\n", cd_bus.DB, cd.command_buffer_pos); - cd.command_buffer[cd.command_buffer_pos++] = cd_bus.DB; - SetREQ(FALSE); - } - - if (!REQ_signal && !ACK_signal && cd.command_buffer_pos) // Received at least one byte, what should we do? - { - if (cd.command_buffer_pos == RequiredCDBLen[cd.command_buffer[0] >> 4]) - { - const SCSICH *cmd_info_ptr; - - if (WhichSystem == SCSICD_PCFX) - cmd_info_ptr = PCFXCommandDefs; - else - cmd_info_ptr = PCECommandDefs; - - while (cmd_info_ptr->pretty_name && cmd_info_ptr->cmd != cd.command_buffer[0]) - cmd_info_ptr++; - - if (SCSILog) - { - char log_buffer[1024]; - int lb_pos; - - log_buffer[0] = 0; - - lb_pos = trio_snprintf(log_buffer, 1024, "Command: %02x, %s%s ", cd.command_buffer[0], cmd_info_ptr->pretty_name ? cmd_info_ptr->pretty_name : "!!BAD COMMAND!!", - (cmd_info_ptr->flags & SCF_UNTESTED) ? "(UNTESTED)" : ""); - - for (int i = 0; i < RequiredCDBLen[cd.command_buffer[0] >> 4]; i++) - lb_pos += trio_snprintf(log_buffer + lb_pos, 1024 - lb_pos, "%02x ", cd.command_buffer[i]); - - SCSILog("SCSI", "%s", log_buffer); - //puts(log_buffer); - } - - if (cmd_info_ptr->pretty_name == NULL) // Command not found! - { - CommandCCError(SENSEKEY_ILLEGAL_REQUEST, NSE_INVALID_COMMAND); - - //SCSIDBG("Bad Command: %02x\n", cd.command_buffer[0]); - - if (SCSILog) - SCSILog("SCSI", "Bad Command: %02x", cd.command_buffer[0]); - - cd.command_buffer_pos = 0; - } - else - { - if (cmd_info_ptr->flags & SCF_UNTESTED) - { - //SCSIDBG("Untested SCSI command: %02x, %s", cd.command_buffer[0], cmd_info_ptr->pretty_name); - } - - if (TrayOpen && (cmd_info_ptr->flags & SCF_REQUIRES_MEDIUM)) - { - CommandCCError(SENSEKEY_NOT_READY, NSE_TRAY_OPEN); - } - else if (!Cur_CDIF && (cmd_info_ptr->flags & SCF_REQUIRES_MEDIUM)) - { - CommandCCError(SENSEKEY_NOT_READY, NSE_NO_DISC); - } - else if (cd.DiscChanged && (cmd_info_ptr->flags & SCF_REQUIRES_MEDIUM)) - { - CommandCCError(SENSEKEY_UNIT_ATTENTION, NSE_DISC_CHANGED); - cd.DiscChanged = false; - } - else - { - bool prev_ps = (cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING); - - cmd_info_ptr->func(cd.command_buffer); - - bool new_ps = (cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING); - - // A bit kludgey, but ehhhh. - if (!prev_ps && new_ps) - { - memset(cdda.sr, 0, sizeof(cdda.sr)); - memset(cdda.OversampleBuffer, 0, sizeof(cdda.OversampleBuffer)); - memset(cdda.DeemphState, 0, sizeof(cdda.DeemphState)); - //printf("CLEAR BUFFERS LALALA\n"); - } - } - - cd.command_buffer_pos = 0; - } - } // end if(cd.command_buffer_pos == RequiredCDBLen[cd.command_buffer[0] >> 4]) - else // Otherwise, get more data for the command! - SetREQ(TRUE); - } - break; - - case PHASE_DATA_OUT: - if (REQ_signal && ACK_signal) // Data bus is valid nowww - { - //printf("DATAOUT-SCSIIN: %d %02x\n", cd.data_out_pos, cd_bus.DB); - cd.data_out[cd.data_out_pos++] = cd_bus.DB; - SetREQ(FALSE); - } - else if (!REQ_signal && !ACK_signal && cd.data_out_pos) - { - if (cd.data_out_pos == cd.data_out_want) - { - cd.data_out_pos = 0; - - if (cd.command_buffer[0] == 0x15) - FinishMODESELECT6(cd.data_out, cd.data_out_want); - else // Error out here? It shouldn't be reached: - SendStatusAndMessage(STATUS_GOOD, 0x00); - } - else - SetREQ(TRUE); - } - break; - - case PHASE_MESSAGE_OUT: - //printf("%d %d, %02x\n", REQ_signal, ACK_signal, cd_bus.DB); - if (REQ_signal && ACK_signal) - { - SetREQ(FALSE); - - // ABORT message is 0x06, but the code isn't set up to be able to recover from a MESSAGE OUT phase back to the previous phase, so we treat any message as an ABORT. - // Real tests are needed on the PC-FX to determine its behavior. - // (Previously, ATN emulation was a bit broken, which resulted in the wrong data on the data bus in this code path in at least "Battle Heat", but it's fixed now and 0x06 is on the data bus). - //if(cd_bus.DB == 0x6) // ABORT message! - if (1) - { - //printf("[SCSICD] Abort Received(DB=0x%02x)\n", cd_bus.DB); - din->Flush(); - cd.data_out_pos = cd.data_out_want = 0; - - CDReadTimer = 0; - cdda.CDDAStatus = CDDASTATUS_STOPPED; - ChangePhase(PHASE_BUS_FREE); - } - //else - // printf("[SCSICD] Message to target: 0x%02x\n", cd_bus.DB); - } - break; - - case PHASE_STATUS: - if (REQ_signal && ACK_signal) - { - SetREQ(FALSE); - cd.status_sent = TRUE; - } - - if (!REQ_signal && !ACK_signal && cd.status_sent) - { - // Status sent, so get ready to send the message! - cd.status_sent = FALSE; - cd_bus.DB = cd.message_pending; - - ChangePhase(PHASE_MESSAGE_IN); - } - break; - - case PHASE_DATA_IN: - if (!REQ_signal && !ACK_signal) - { - //puts("REQ and ACK false"); - if (din->CanRead() == 0) // aaand we're done! - { - CDIRQCallback(0x8000 | SCSICD_IRQ_DATA_TRANSFER_READY); - - if (cd.data_transfer_done) - { - SendStatusAndMessage(STATUS_GOOD, 0x00); - cd.data_transfer_done = FALSE; - CDIRQCallback(SCSICD_IRQ_DATA_TRANSFER_DONE); - } - } - else - { - cd_bus.DB = din->ReadByte(); - SetREQ(TRUE); - } - } - if (REQ_signal && ACK_signal) - { - //puts("REQ and ACK true"); - SetREQ(FALSE); - } - break; - - case PHASE_MESSAGE_IN: - if (REQ_signal && ACK_signal) - { - SetREQ(FALSE); - cd.message_sent = TRUE; - } - - if (!REQ_signal && !ACK_signal && cd.message_sent) - { - cd.message_sent = FALSE; - ChangePhase(PHASE_BUS_FREE); - } - break; - } - - int32 next_time = 0x7fffffff; - - if (CDReadTimer > 0 && CDReadTimer < next_time) - next_time = CDReadTimer; - - if (cdda.CDDAStatus == CDDASTATUS_PLAYING || cdda.CDDAStatus == CDDASTATUS_SCANNING) - { - int32 cdda_div_sexytime = (cdda.CDDADiv + (cdda.CDDADivAcc * (cdda.OversamplePos & 1)) + ((1 << 20) - 1)) >> 20; - if (cdda_div_sexytime > 0 && cdda_div_sexytime < next_time) - next_time = cdda_div_sexytime; - } - - assert(next_time >= 0); - - return (next_time); -} - -void SCSICD_SetLog(void (*logfunc)(const char *, const char *, ...)) -{ - SCSILog = logfunc; -} - -void SCSICD_SetTransferRate(uint32 TransferRate) -{ - CD_DATA_TRANSFER_RATE = TransferRate; -} - -void SCSICD_Init(int type, int cdda_time_div, int32 *left_hrbuf, int32 *right_hrbuf, uint32 TransferRate, uint32 SystemClock, void (*IRQFunc)(int), void (*SSCFunc)(uint8, int)) -{ - Cur_CDIF = NULL; - TrayOpen = true; - - assert(SystemClock < 30000000); // 30 million, sanity check. - - monotonic_timestamp = 0; - lastts = 0; - - SCSILog = NULL; - - if (type == SCSICD_PCFX) - din = new SimpleFIFO(65536); //4096); - else - din = new SimpleFIFO(2048); //8192); //1024); /2048); - - WhichSystem = type; - - cdda.CDDADivAcc = (int64)System_Clock * (1024 * 1024) / 88200; - cdda.CDDADivAccVolFudge = 100; - cdda.CDDATimeDiv = cdda_time_div * (1 << (4 + 2)); - - cdda.CDDAVolume[0] = 65536; - cdda.CDDAVolume[1] = 65536; - - FixOPV(); - - HRBufs[0] = left_hrbuf; - HRBufs[1] = right_hrbuf; - - CD_DATA_TRANSFER_RATE = TransferRate; - System_Clock = SystemClock; - CDIRQCallback = IRQFunc; - CDStuffSubchannels = SSCFunc; -} - -void SCSICD_SetCDDAVolume(double left, double right) -{ - cdda.CDDAVolume[0] = 65536 * left; - cdda.CDDAVolume[1] = 65536 * right; - - for (int i = 0; i < 2; i++) - { - if (cdda.CDDAVolume[i] > 65536) - { - printf("[SCSICD] Debug Warning: CD-DA volume %d too large: %d\n", i, cdda.CDDAVolume[i]); - cdda.CDDAVolume[i] = 65536; - } - } - - FixOPV(); -} diff --git a/waterbox/pcfx/cdrom/scsicd.h b/waterbox/pcfx/cdrom/scsicd.h deleted file mode 100644 index fe168da6e9..0000000000 --- a/waterbox/pcfx/cdrom/scsicd.h +++ /dev/null @@ -1,97 +0,0 @@ -#ifndef __PCFX_SCSICD_H -#define __PCFX_SCSICD_H - -typedef int32 scsicd_timestamp_t; - -typedef struct -{ - // Data bus(FIXME: we should have a variable for the target and the initiator, and OR them together to be truly accurate). - uint8 DB; - - uint32 signals; - - // Signals under our(the "target") control. - //bool BSY, MSG, CD, REQ, IO; - - // Signals under the control of the initiator(not us!) - //bool kingACK, kingRST, kingSEL, kingATN; -} scsicd_bus_t; - -extern scsicd_bus_t cd_bus; // Don't access this structure directly by name outside of scsicd.c, but use the macros below. - -// Signals under our(the "target") control. -#define SCSICD_IO_mask 0x001 -#define SCSICD_CD_mask 0x002 -#define SCSICD_MSG_mask 0x004 -#define SCSICD_REQ_mask 0x008 -#define SCSICD_BSY_mask 0x010 - -// Signals under the control of the initiator(not us!) -#define SCSICD_kingRST_mask 0x020 -#define SCSICD_kingACK_mask 0x040 -#define SCSICD_kingATN_mask 0x080 -#define SCSICD_kingSEL_mask 0x100 - -#define BSY_signal ((const bool)(cd_bus.signals & SCSICD_BSY_mask)) -#define ACK_signal ((const bool)(cd_bus.signals & SCSICD_kingACK_mask)) -#define RST_signal ((const bool)(cd_bus.signals & SCSICD_kingRST_mask)) -#define MSG_signal ((const bool)(cd_bus.signals & SCSICD_MSG_mask)) -#define SEL_signal ((const bool)(cd_bus.signals & SCSICD_kingSEL_mask)) -#define REQ_signal ((const bool)(cd_bus.signals & SCSICD_REQ_mask)) -#define IO_signal ((const bool)(cd_bus.signals & SCSICD_IO_mask)) -#define CD_signal ((const bool)(cd_bus.signals & SCSICD_CD_mask)) -#define ATN_signal ((const bool)(cd_bus.signals & SCSICD_kingATN_mask)) - -#define DB_signal ((const uint8)cd_bus.DB) - -#define SCSICD_GetDB() DB_signal -#define SCSICD_GetBSY() BSY_signal -#define SCSICD_GetIO() IO_signal -#define SCSICD_GetCD() CD_signal -#define SCSICD_GetMSG() MSG_signal -#define SCSICD_GetREQ() REQ_signal - -// Should we phase out getting these initiator-driven signals like this(the initiator really should keep track of them itself)? -#define SCSICD_GetACK() ACK_signal -#define SCSICD_GetRST() RST_signal -#define SCSICD_GetSEL() SEL_signal -#define SCSICD_GetATN() ATN_signal - -void SCSICD_Power(scsicd_timestamp_t system_timestamp); -void SCSICD_SetDB(uint8 data); - -// These SCSICD_Set* functions are kind of misnomers, at least in comparison to the SCSICD_Get* functions... -// They will set/clear the bits corresponding to the KING's side of the bus. -void SCSICD_SetACK(bool set); -void SCSICD_SetSEL(bool set); -void SCSICD_SetRST(bool set); -void SCSICD_SetATN(bool set); - -uint32 SCSICD_Run(scsicd_timestamp_t); -void SCSICD_ResetTS(uint32 ts_base); - -enum -{ - SCSICD_PCE = 1, - SCSICD_PCFX -}; - -enum -{ - SCSICD_IRQ_DATA_TRANSFER_DONE = 1, - SCSICD_IRQ_DATA_TRANSFER_READY, - SCSICD_IRQ_MAGICAL_REQ, -}; - -void SCSICD_GetCDDAValues(int16 &left, int16 &right); - -void SCSICD_SetLog(void (*logfunc)(const char *, const char *, ...)); - -void SCSICD_Init(int type, int CDDATimeDiv, int32* left_hrbuf, int32* right_hrbuf, uint32 TransferRate, uint32 SystemClock, void (*IRQFunc)(int), void (*SSCFunc)(uint8, int)) MDFN_COLD; - -void SCSICD_SetTransferRate(uint32 TransferRate); -void SCSICD_SetCDDAVolume(double left, double right); - -void SCSICD_SetDisc(bool tray_open, CDIF *cdif, bool no_emu_side_effects = false); - -#endif diff --git a/waterbox/pcfx/cdrom/scsicd_cdda_filter.inc b/waterbox/pcfx/cdrom/scsicd_cdda_filter.inc deleted file mode 100644 index bef57166d3..0000000000 --- a/waterbox/pcfx/cdrom/scsicd_cdda_filter.inc +++ /dev/null @@ -1,69 +0,0 @@ -// WARNING: Check resampling algorithm in scsicd.cpp for overflows if any value in here is negative. - - /* -1 */ { 1777, 12211, 27812, 27640, 11965, 1703, 9, 0 }, // 83117 83119.332059(diff = 2.332059) - /* 0 */ { 1702, 11965, 27640, 27811, 12211, 1777, 11, 0 }, // 83117 83121.547903(diff = 4.547903) - /* 1 */ { 1630, 11720, 27463, 27977, 12459, 1854, 14, 0 }, // 83117 83123.444392(diff = 6.444392) - /* 2 */ { 1560, 11478, 27282, 28139, 12708, 1933, 17, 0 }, // 83117 83125.036510(diff = 8.036510) - /* 3 */ { 1492, 11238, 27098, 28296, 12959, 2014, 20, 0 }, // 83117 83126.338722(diff = 9.338722) - /* 4 */ { 1427, 11000, 26909, 28448, 13212, 2098, 23, 0 }, // 83117 83127.364983(diff = 10.364983) - /* 5 */ { 1363, 10764, 26716, 28595, 13467, 2185, 27, 0 }, // 83117 83128.128743(diff = 11.128743) - /* 6 */ { 1302, 10530, 26519, 28738, 13723, 2274, 31, 0 }, // 83117 83128.642956(diff = 11.642956) - /* 7 */ { 1242, 10299, 26319, 28876, 13981, 2365, 35, 0 }, // 83117 83128.920096(diff = 11.920096) - /* 8 */ { 1185, 10071, 26115, 29009, 14239, 2459, 39, 0 }, // 83117 83128.972128(diff = 11.972128) - /* 9 */ { 1129, 9844, 25907, 29137, 14499, 2556, 45, 0 }, // 83117 83128.810568(diff = 11.810568) - /* 10 */ { 1076, 9620, 25695, 29260, 14761, 2655, 50, 0 }, // 83117 83128.446456(diff = 11.446456) - /* 11 */ { 1024, 9399, 25481, 29377, 15023, 2757, 56, 0 }, // 83117 83127.890369(diff = 10.890369) - /* 12 */ { 975, 9180, 25263, 29489, 15287, 2861, 62, 0 }, // 83117 83127.152431(diff = 10.152431) - /* 13 */ { 927, 8964, 25041, 29596, 15552, 2968, 69, 0 }, // 83117 83126.242312(diff = 9.242312) - /* 14 */ { 880, 8750, 24817, 29698, 15818, 3078, 76, 0 }, // 83117 83125.169251(diff = 8.169251) - /* 15 */ { 836, 8539, 24590, 29794, 16083, 3191, 84, 0 }, // 83117 83123.942037(diff = 6.942037) - /* 16 */ { 793, 8331, 24359, 29884, 16350, 3307, 93, 0 }, // 83117 83122.569034(diff = 5.569034) - /* 17 */ { 752, 8125, 24126, 29969, 16618, 3425, 102, 0 }, // 83117 83121.058175(diff = 4.058175) - /* 18 */ { 712, 7923, 23890, 30049, 16886, 3546, 111, 0 }, // 83117 83119.416975(diff = 2.416975) - /* 19 */ { 674, 7723, 23651, 30123, 17154, 3670, 122, 0 }, // 83117 83117.652622(diff = 0.652622) - /* 20 */ { 638, 7526, 23410, 30191, 17422, 3797, 133, 0 }, // 83117 83115.771622(diff = 1.228378) - /* 21 */ { 603, 7331, 23167, 30254, 17691, 3927, 144, 0 }, // 83117 83113.780335(diff = 3.219665) - /* 22 */ { 569, 7140, 22922, 30310, 17960, 4059, 157, 0 }, // 83117 83111.684630(diff = 5.315370) - /* 23 */ { 537, 6951, 22674, 30361, 18229, 4195, 170, 0 }, // 83117 83109.489972(diff = 7.510028) - /* 24 */ { 506, 6766, 22424, 30407, 18497, 4334, 183, 0 }, // 83117 83107.201429(diff = 9.798571) - /* 25 */ { 477, 6583, 22172, 30446, 18766, 4475, 198, 0 }, // 83117 83104.823668(diff = 12.176332) - /* 26 */ { 449, 6403, 21919, 30479, 19034, 4619, 214, 0 }, // 83117 83102.360963(diff = 14.639037) - /* 27 */ { 422, 6226, 21664, 30507, 19301, 4767, 230, 0 }, // 83117 83099.817193(diff = 17.182807) - /* 28 */ { 396, 6053, 21407, 30529, 19568, 4917, 247, 0 }, // 83117 83097.195820(diff = 19.804180) - /* 29 */ { 372, 5882, 21148, 30545, 19834, 5071, 265, 0 }, // 83117 83094.499993(diff = 22.500007) - /* 30 */ { 348, 5714, 20888, 30555, 20100, 5227, 285, 0 }, // 83117 83091.732389(diff = 25.267611) - /* 31 */ { 326, 5549, 20627, 30559, 20365, 5386, 305, 0 }, // 83117 83088.895321(diff = 28.104679) - /* 32 */ { 305, 5386, 20365, 30559, 20627, 5549, 326, 0 }, // 83117 83088.895321(diff = 28.104679) - /* 33 */ { 285, 5227, 20100, 30555, 20888, 5714, 348, 0 }, // 83117 83091.732389(diff = 25.267611) - /* 34 */ { 265, 5071, 19834, 30545, 21148, 5882, 372, 0 }, // 83117 83094.499993(diff = 22.500007) - /* 35 */ { 247, 4917, 19568, 30529, 21407, 6053, 396, 0 }, // 83117 83097.195820(diff = 19.804180) - /* 36 */ { 230, 4767, 19301, 30507, 21664, 6226, 422, 0 }, // 83117 83099.817193(diff = 17.182807) - /* 37 */ { 214, 4619, 19034, 30479, 21919, 6403, 449, 0 }, // 83117 83102.360963(diff = 14.639037) - /* 38 */ { 198, 4475, 18766, 30446, 22172, 6583, 477, 0 }, // 83117 83104.823668(diff = 12.176332) - /* 39 */ { 183, 4334, 18497, 30407, 22424, 6766, 506, 0 }, // 83117 83107.201429(diff = 9.798571) - /* 40 */ { 170, 4195, 18229, 30361, 22674, 6951, 537, 0 }, // 83117 83109.489972(diff = 7.510028) - /* 41 */ { 157, 4059, 17960, 30310, 22922, 7140, 569, 0 }, // 83117 83111.684630(diff = 5.315370) - /* 42 */ { 144, 3927, 17691, 30254, 23167, 7331, 603, 0 }, // 83117 83113.780335(diff = 3.219665) - /* 43 */ { 133, 3797, 17422, 30191, 23410, 7526, 638, 0 }, // 83117 83115.771622(diff = 1.228378) - /* 44 */ { 122, 3670, 17154, 30123, 23651, 7723, 674, 0 }, // 83117 83117.652622(diff = 0.652622) - /* 45 */ { 111, 3546, 16886, 30049, 23890, 7923, 712, 0 }, // 83117 83119.416975(diff = 2.416975) - /* 46 */ { 102, 3425, 16618, 29969, 24126, 8125, 752, 0 }, // 83117 83121.058175(diff = 4.058175) - /* 47 */ { 93, 3307, 16350, 29884, 24359, 8331, 793, 0 }, // 83117 83122.569034(diff = 5.569034) - /* 48 */ { 84, 3191, 16083, 29794, 24590, 8539, 836, 0 }, // 83117 83123.942037(diff = 6.942037) - /* 49 */ { 76, 3078, 15818, 29698, 24817, 8750, 880, 0 }, // 83117 83125.169251(diff = 8.169251) - /* 50 */ { 69, 2968, 15552, 29596, 25041, 8964, 927, 0 }, // 83117 83126.242312(diff = 9.242312) - /* 51 */ { 62, 2861, 15287, 29489, 25263, 9180, 975, 0 }, // 83117 83127.152431(diff = 10.152431) - /* 52 */ { 56, 2757, 15023, 29377, 25481, 9399, 1024, 0 }, // 83117 83127.890369(diff = 10.890369) - /* 53 */ { 50, 2655, 14761, 29260, 25695, 9620, 1076, 0 }, // 83117 83128.446456(diff = 11.446456) - /* 54 */ { 45, 2556, 14499, 29137, 25907, 9844, 1129, 0 }, // 83117 83128.810568(diff = 11.810568) - /* 55 */ { 39, 2459, 14239, 29009, 26115, 10071, 1185, 0 }, // 83117 83128.972128(diff = 11.972128) - /* 56 */ { 35, 2365, 13981, 28876, 26319, 10299, 1242, 0 }, // 83117 83128.920096(diff = 11.920096) - /* 57 */ { 31, 2274, 13723, 28738, 26519, 10530, 1302, 0 }, // 83117 83128.642956(diff = 11.642956) - /* 58 */ { 27, 2185, 13467, 28595, 26716, 10764, 1363, 0 }, // 83117 83128.128743(diff = 11.128743) - /* 59 */ { 23, 2098, 13212, 28448, 26909, 11000, 1427, 0 }, // 83117 83127.364983(diff = 10.364983) - /* 60 */ { 20, 2014, 12959, 28296, 27098, 11238, 1492, 0 }, // 83117 83126.338722(diff = 9.338722) - /* 61 */ { 17, 1933, 12708, 28139, 27282, 11478, 1560, 0 }, // 83117 83125.036510(diff = 8.036510) - /* 62 */ { 14, 1854, 12459, 27977, 27463, 11720, 1630, 0 }, // 83117 83123.444392(diff = 6.444392) - /* 63 */ { 11, 1777, 12211, 27811, 27640, 11965, 1702, 0 }, // 83117 83121.547903(diff = 4.547903) - /* 64 */ { 9, 1703, 11965, 27640, 27812, 12211, 1777, 0 }, // 83117 83119.332059(diff = 2.332059) - diff --git a/waterbox/pcfx/defs.h b/waterbox/pcfx/defs.h deleted file mode 100644 index 3c29642f0e..0000000000 --- a/waterbox/pcfx/defs.h +++ /dev/null @@ -1,123 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -typedef uint8_t uint8; -typedef uint16_t uint16; -typedef uint32_t uint32; -typedef uint64_t uint64; -typedef int8_t int8; -typedef int16_t int16; -typedef int32_t int32; -typedef int64_t int64; - -#define MDFN_FASTCALL -#define INLINE inline -#define MDFN_COLD -#define MDFN_HOT -#define NO_INLINE -#define NO_CLONE -#define MDFN_WARN_UNUSED_RESULT -#define MDFN_NOWARN_UNUSED __attribute__((unused)) -#define MDFN_UNLIKELY(p) (p) -#define MDFN_LIKELY(p) (p) -//#define MDFN_ASSUME_ALIGNED(p, align) ((decltype(p))__builtin_assume_aligned((p), (align))) -#define MDFN_ASSUME_ALIGNED(p, align) (p) -#define trio_snprintf snprintf -#define trio_vprintf vprintf -#define trio_printf printf -#define trio_sprintf sprintf -#define TRUE true -#define FALSE false -#ifndef __alignas_is_defined -#define alignas(p) -#endif -#define override // remove for gcc 4.7 -#define final -#define gettext_noop(s) (s) -#define MDFN_MASTERCLOCK_FIXED(n) ((int64)((double)(n) * (1LL << 32))) -static INLINE void MDFN_FastArraySet(uint32 *dst, const uint32 value, const size_t count) -{ - uint32 *const end = dst + count; - while (dst < end) - *dst++ = value; -} -#define _(a) (a) - -typedef struct -{ - // Pitch(32-bit) must be equal to width and >= the "fb_width" specified in the MDFNGI struct for the emulated system. - // Height must be >= to the "fb_height" specified in the MDFNGI struct for the emulated system. - // The framebuffer pointed to by surface->pixels is written to by the system emulation code. - uint32 *pixels; - int pitch32; - - // Pointer to an array of int32, number of elements = fb_height, set by the driver code. Individual elements written - // to by system emulation code. If the emulated system doesn't support multiple screen widths per frame, or if you handle - // such a situation by outputting at a constant width-per-frame that is the least-common-multiple of the screen widths, then - // you can ignore this. If you do wish to use this, you must set all elements every frame. - int32 *LineWidths; - - // Pointer to sound buffer, set by the driver code, that the emulation code should render sound to. - int16 *SoundBuf; - - // Number of cycles that this frame consumed, using MDFNGI::MasterClock as a time base. - // Set by emulation code. - int64 MasterCycles; - - // Maximum size of the sound buffer, in frames. Set by the driver code. - int32 SoundBufMaxSize; - - // Number of frames currently in internal sound buffer. Set by the system emulation code, to be read by the driver code. - int32 SoundBufSize; - - // Set by the system emulation code every frame, to denote the horizontal and vertical offsets of the image, and the size - // of the image. If the emulated system sets the elements of LineWidths, then the width(w) of this structure - // is ignored while drawing the image. - int32 y, w, h; - - // Set(optionally) by emulation code. If InterlaceOn is true, then assume field height is 1/2 DisplayRect.h, and - // only every other line in surface (with the start line defined by InterlacedField) has valid data - // (it's up to internal Mednafen code to deinterlace it). - bool InterlaceOn; - bool InterlaceField; - - // if true, sip rendering - bool skip; -} EmulateSpecStruct; - -#define MDFN_printf printf -#define MDFN_PrintError(...) printf - -#include "endian.h" - -#include "math_ops.h" - -#include "../emulibc/emulibc.h" -#include "../emulibc/waterboxcore.h" - -// settings -extern int Setting_HighDotclockWidth; -extern int Setting_CdSpeed; -extern int Setting_SlStart; -extern int Setting_SlEnd; - -extern double Setting_ResampRateError; -extern int Setting_ResampQuality; - -extern int Setting_CpuEmulation; // 0 = fast, 1 = accurate, 2 = auto -extern bool Setting_NoSpriteLimit; -extern bool Setting_AdpcmBuggy; -extern bool Setting_AdpcmNoClicks; -extern bool Setting_ChromaInterpolate; - -extern int Setting_PortDevice[2]; - -extern bool Setting_PixelPro; diff --git a/waterbox/pcfx/endian.h b/waterbox/pcfx/endian.h deleted file mode 100644 index e78a0c577f..0000000000 --- a/waterbox/pcfx/endian.h +++ /dev/null @@ -1,494 +0,0 @@ -/******************************************************************************/ -/* Mednafen - Multi-system Emulator */ -/******************************************************************************/ -/* endian.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_ENDIAN_H -#define __MDFN_ENDIAN_H - -void Endian_A16_Swap(void *src, uint32 nelements); -void Endian_A32_Swap(void *src, uint32 nelements); -void Endian_A64_Swap(void *src, uint32 nelements); - -void Endian_A16_NE_LE(void *src, uint32 nelements); -void Endian_A32_NE_LE(void *src, uint32 nelements); -void Endian_A64_NE_LE(void *src, uint32 nelements); - -void Endian_A16_NE_BE(void *src, uint32 nelements); -void Endian_A32_NE_BE(void *src, uint32 nelements); -void Endian_A64_NE_BE(void *src, uint32 nelements); - -void Endian_V_NE_LE(void* p, size_t len); -void Endian_V_NE_BE(void* p, size_t len); - -// -// -// - -static INLINE uint32 BitsExtract(const uint8* ptr, const size_t bit_offset, const size_t bit_count) -{ - uint32 ret = 0; - - for(size_t x = 0; x < bit_count; x++) - { - size_t co = bit_offset + x; - bool b = (ptr[co >> 3] >> (co & 7)) & 1; - - ret |= (uint64)b << x; - } - - return ret; -} - -static INLINE void BitsIntract(uint8* ptr, const size_t bit_offset, const size_t bit_count, uint32 value) -{ - for(size_t x = 0; x < bit_count; x++) - { - size_t co = bit_offset + x; - bool b = (value >> x) & 1; - uint8 tmp = ptr[co >> 3]; - - tmp &= ~(1 << (co & 7)); - tmp |= b << (co & 7); - - ptr[co >> 3] = tmp; - } -} - -/* - Regarding safety of calling MDFN_*sb on dynamically-allocated memory with new uint8[], see C++ standard 3.7.3.1(i.e. it should be - safe provided the offsets into the memory are aligned/multiples of the MDFN_*sb access type). malloc()'d and calloc()'d - memory should be safe as well. - - Statically-allocated arrays/memory should be unioned with a big POD type or C++11 "alignas"'d. (May need to audit code to ensure - this is being done). -*/ - -static INLINE uint16 MDFN_bswap16(uint16 v) -{ - return (v << 8) | (v >> 8); -} - -static INLINE uint32 MDFN_bswap32(uint32 v) -{ - return (v << 24) | ((v & 0xFF00) << 8) | ((v >> 8) & 0xFF00) | (v >> 24); -} - -static INLINE uint64 MDFN_bswap64(uint64 v) -{ - return (v << 56) | (v >> 56) | ((v & 0xFF00) << 40) | ((v >> 40) & 0xFF00) | ((uint64)MDFN_bswap32(v >> 16) << 16); -} - -#ifdef LSB_FIRST - #define MDFN_ENDIANH_IS_BIGENDIAN 0 -#else - #define MDFN_ENDIANH_IS_BIGENDIAN 1 -#endif - -// -// X endian. -// -template -static INLINE T MDFN_deXsb(const void* ptr) -{ - T tmp; - - memcpy(&tmp, MDFN_ASSUME_ALIGNED(ptr, (aligned ? sizeof(T) : 1)), sizeof(T)); - - if(isbigendian != -1 && isbigendian != MDFN_ENDIANH_IS_BIGENDIAN) - { - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Gummy penguins."); - - if(sizeof(T) == 8) - return MDFN_bswap64(tmp); - else if(sizeof(T) == 4) - return MDFN_bswap32(tmp); - else if(sizeof(T) == 2) - return MDFN_bswap16(tmp); - } - - return tmp; -} - -// -// Native endian. -// -template -static INLINE T MDFN_densb(const void* ptr) -{ - return MDFN_deXsb<-1, T, aligned>(ptr); -} - -// -// Little endian. -// -template -static INLINE T MDFN_delsb(const void* ptr) -{ - return MDFN_deXsb<0, T, aligned>(ptr); -} - -template -static INLINE uint16 MDFN_de16lsb(const void* ptr) -{ - return MDFN_delsb(ptr); -} - -static INLINE uint32 MDFN_de24lsb(const void* ptr) -{ - const uint8* ptr_u8 = (const uint8*)ptr; - - return (ptr_u8[0] << 0) | (ptr_u8[1] << 8) | (ptr_u8[2] << 16); -} - -template -static INLINE uint32 MDFN_de32lsb(const void* ptr) -{ - return MDFN_delsb(ptr); -} - -template -static INLINE uint64 MDFN_de64lsb(const void* ptr) -{ - return MDFN_delsb(ptr); -} - -// -// Big endian. -// -template -static INLINE T MDFN_demsb(const void* ptr) -{ - return MDFN_deXsb<1, T, aligned>(ptr); -} - -template -static INLINE uint16 MDFN_de16msb(const void* ptr) -{ - return MDFN_demsb(ptr); -} - -static INLINE uint32 MDFN_de24msb(const void* ptr) -{ - const uint8* ptr_u8 = (const uint8*)ptr; - - return (ptr_u8[0] << 16) | (ptr_u8[1] << 8) | (ptr_u8[2] << 0); -} - -template -static INLINE uint32 MDFN_de32msb(const void* ptr) -{ - return MDFN_demsb(ptr); -} - -template -static INLINE uint64 MDFN_de64msb(const void* ptr) -{ - return MDFN_demsb(ptr); -} - -// -// -// -// -// -// -// -// - -// -// X endian. -// -template -static INLINE void MDFN_enXsb(void* ptr, T value) -{ - T tmp = value; - - if(isbigendian != -1 && isbigendian != MDFN_ENDIANH_IS_BIGENDIAN) - { - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Gummy penguins."); - - if(sizeof(T) == 8) - tmp = MDFN_bswap64(value); - else if(sizeof(T) == 4) - tmp = MDFN_bswap32(value); - else if(sizeof(T) == 2) - tmp = MDFN_bswap16(value); - } - - memcpy(MDFN_ASSUME_ALIGNED(ptr, (aligned ? sizeof(T) : 1)), &tmp, sizeof(T)); -} - -// -// Native endian. -// -template -static INLINE void MDFN_ennsb(void* ptr, T value) -{ - MDFN_enXsb<-1, T, aligned>(ptr, value); -} - -// -// Little endian. -// -template -static INLINE void MDFN_enlsb(void* ptr, T value) -{ - MDFN_enXsb<0, T, aligned>(ptr, value); -} - -template -static INLINE void MDFN_en16lsb(void* ptr, uint16 value) -{ - MDFN_enlsb(ptr, value); -} - -static INLINE void MDFN_en24lsb(void* ptr, uint32 value) -{ - uint8* ptr_u8 = (uint8*)ptr; - - ptr_u8[0] = value >> 0; - ptr_u8[1] = value >> 8; - ptr_u8[2] = value >> 16; -} - -template -static INLINE void MDFN_en32lsb(void* ptr, uint32 value) -{ - MDFN_enlsb(ptr, value); -} - -template -static INLINE void MDFN_en64lsb(void* ptr, uint64 value) -{ - MDFN_enlsb(ptr, value); -} - - -// -// Big endian. -// -template -static INLINE void MDFN_enmsb(void* ptr, T value) -{ - MDFN_enXsb<1, T, aligned>(ptr, value); -} - -template -static INLINE void MDFN_en16msb(void* ptr, uint16 value) -{ - MDFN_enmsb(ptr, value); -} - -static INLINE void MDFN_en24msb(void* ptr, uint32 value) -{ - uint8* ptr_u8 = (uint8*)ptr; - - ptr_u8[0] = value >> 16; - ptr_u8[1] = value >> 8; - ptr_u8[2] = value >> 0; -} - -template -static INLINE void MDFN_en32msb(void* ptr, uint32 value) -{ - MDFN_enmsb(ptr, value); -} - -template -static INLINE void MDFN_en64msb(void* ptr, uint64 value) -{ - MDFN_enmsb(ptr, value); -} - - -// -// -// -// -// -// - -template -static INLINE uint8* ne16_ptr_be(BT* const base, const size_t byte_offset) -{ -#ifdef MSB_FIRST - return (uint8*)base + (byte_offset &~ (sizeof(T) - 1)); -#else - return (uint8*)base + (((byte_offset &~ (sizeof(T) - 1)) ^ (2 - std::min(2, sizeof(T))))); -#endif -} - -template -static INLINE void ne16_wbo_be(uint16* const base, const size_t byte_offset, const T value) -{ - uint8* const ptr = ne16_ptr_be(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - if(sizeof(T) == 4) - { - uint16* const ptr16 = (uint16*)ptr; - - ptr16[0] = value >> 16; - ptr16[1] = value; - } - else - *(T*)ptr = value; -} - -template -static INLINE T ne16_rbo_be(const uint16* const base, const size_t byte_offset) -{ - uint8* const ptr = ne16_ptr_be(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - if(sizeof(T) == 4) - { - uint16* const ptr16 = (uint16*)ptr; - T tmp; - - tmp = ptr16[0] << 16; - tmp |= ptr16[1]; - - return tmp; - } - else - return *(T*)ptr; -} - -template -static INLINE void ne16_rwbo_be(uint16* const base, const size_t byte_offset, T* value) -{ - if(IsWrite) - ne16_wbo_be(base, byte_offset, *value); - else - *value = ne16_rbo_be(base, byte_offset); -} - -// -// -// - -template -static INLINE uint8* ne16_ptr_le(BT* const base, const size_t byte_offset) -{ -#ifdef LSB_FIRST - return (uint8*)base + (byte_offset &~ (sizeof(T) - 1)); -#else - return (uint8*)base + (((byte_offset &~ (sizeof(T) - 1)) ^ (2 - std::min(2, sizeof(T))))); -#endif -} - -template -static INLINE void ne16_wbo_le(uint16* const base, const size_t byte_offset, const T value) -{ - uint8* const ptr = ne16_ptr_le(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - if(sizeof(T) == 4) - { - uint16* const ptr16 = (uint16*)ptr; - - ptr16[0] = value; - ptr16[1] = value >> 16; - } - else - *(T*)ptr = value; -} - -template -static INLINE T ne16_rbo_le(const uint16* const base, const size_t byte_offset) -{ - uint8* const ptr = ne16_ptr_le(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - if(sizeof(T) == 4) - { - uint16* const ptr16 = (uint16*)ptr; - T tmp; - - tmp = ptr16[0]; - tmp |= ptr16[1] << 16; - - return tmp; - } - else - return *(T*)ptr; -} - - -template -static INLINE void ne16_rwbo_le(uint16* const base, const size_t byte_offset, T* value) -{ - if(IsWrite) - ne16_wbo_le(base, byte_offset, *value); - else - *value = ne16_rbo_le(base, byte_offset); -} - -// -// -// -template -static INLINE uint8* ne64_ptr_be(uint64* const base, const size_t byte_offset) -{ -#ifdef MSB_FIRST - return (uint8*)base + (byte_offset &~ (sizeof(T) - 1)); -#else - return (uint8*)base + (((byte_offset &~ (sizeof(T) - 1)) ^ (8 - sizeof(T)))); -#endif -} - -template -static INLINE void ne64_wbo_be(uint64* const base, const size_t byte_offset, const T value) -{ - uint8* const ptr = ne64_ptr_be(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Unsupported type size"); - - memcpy(MDFN_ASSUME_ALIGNED(ptr, sizeof(T)), &value, sizeof(T)); -} - -template -static INLINE T ne64_rbo_be(uint64* const base, const size_t byte_offset) -{ - uint8* const ptr = ne64_ptr_be(base, byte_offset); - T ret; - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - memcpy(&ret, MDFN_ASSUME_ALIGNED(ptr, sizeof(T)), sizeof(T)); - - return ret; -} - -template -static INLINE void ne64_rwbo_be(uint64* const base, const size_t byte_offset, T* value) -{ - if(IsWrite) - ne64_wbo_be(base, byte_offset, *value); - else - *value = ne64_rbo_be(base, byte_offset); -} - -#endif diff --git a/waterbox/pcfx/fxscsi.cpp b/waterbox/pcfx/fxscsi.cpp deleted file mode 100644 index bf516c90d1..0000000000 --- a/waterbox/pcfx/fxscsi.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* fxscsi.cpp: -** Copyright (C) 2009-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "pcfx.h" -#include "fxscsi.h" - -namespace MDFN_IEN_PCFX -{ - -bool FXSCSI_Init(void) -{ - - return true; -} - -uint8 FXSCSI_CtrlRead(uint32 A) -{ - uint8 ret = 0; //rand(); - //printf("FXSCSI: %08x(ret=%02x)\n", A, ret); - return(ret); -} - - -void FXSCSI_CtrlWrite(uint32 A, uint8 V) -{ - printf("FXSCSI Write: %08x %02x\n", A, V); -} - -} diff --git a/waterbox/pcfx/fxscsi.h b/waterbox/pcfx/fxscsi.h deleted file mode 100644 index 5741e3afcb..0000000000 --- a/waterbox/pcfx/fxscsi.h +++ /dev/null @@ -1,33 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* fxscsi.h: -** Copyright (C) 2009-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_FXSCSI_H -#define __MDFN_FXSCSI_H - -namespace MDFN_IEN_PCFX -{ - -bool FXSCSI_Init(void) MDFN_COLD; -uint8 FXSCSI_CtrlRead(uint32 A); -void FXSCSI_CtrlWrite(uint32 A, uint8 V); - -} -#endif diff --git a/waterbox/pcfx/gamedb.inc b/waterbox/pcfx/gamedb.inc deleted file mode 100644 index 20a4db091b..0000000000 --- a/waterbox/pcfx/gamedb.inc +++ /dev/null @@ -1,1731 +0,0 @@ -// Names taken from http://pcecp.com/ and http://www.necstasy.net/ - -{ - "Aa! Megami Sama", - "ああっ女神さまっ", - 0, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 10504 }, - { 3, CDGE_FORMAT_DATA, 10890 }, - { -1, -1, 240939 }, - }, - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 10163 }, - { 3, CDGE_FORMAT_DATA, 10890 }, - { -1, -1, 211853 }, - } - } -}, - -{ - "Akazukin Cha Cha", - "赤ずきんちゃちゃ ーお騒かせ!パニックレース!ー", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 5088 }, - { 3, CDGE_FORMAT_AUDIO, 203157 }, - { 4, CDGE_FORMAT_AUDIO, 207261 }, - { 5, CDGE_FORMAT_AUDIO, 209849 }, - { 6, CDGE_FORMAT_AUDIO, 216868 }, - { -1, -1, 220342 }, - } - } -}, - -{ - "All Japan Female Pro Wrestle - Queen of Queens", - "全日本女子プロレス Queen of Queens", - 0, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2368 }, - { -1, -1, 254165 }, - }, - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2368 }, - { -1, -1, 326478 }, - } - } -}, - -{ - "Angelique Special", - "アンジェリークスペシャル", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 4829 }, - { 4, CDGE_FORMAT_DATA, 8963 }, - { 5, CDGE_FORMAT_DATA, 66446 }, - { 6, CDGE_FORMAT_AUDIO, 194334 }, - { -1, -1, 198505 }, - } - } -}, - -{ - "Angelique Special 2", - "アンジェリークスペシャル2", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 4737 }, - { -1, -1, 313941 }, - } - } -}, - -{ - "Angelique Tenkuu No Requim", - "アンジェリーク天空のレクイエム", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 4737 }, - { 4, CDGE_FORMAT_DATA, 110846 }, - { -1, -1, 263180 }, - } - } -}, - -{ - "Anime Freak FX Volume 1", - "アニメフリークFX Vol.1", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 5140 }, - { -1, -1, 323367 }, - } - } -}, - -{ - "Anime Freak FX Volume 2", - "アニメフリークFX Vol.2", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 1523 }, - { -1, -1, 306483 }, - } - } -}, - -{ - "Anime Freak FX Volume 2 (Sample)", - NULL, - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 5140 }, - { -1, -1, 309756 }, - } - } -}, - -{ - "Anime Freak FX Volume 3", - "アニメフリークFX Vol.3", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 1964 }, - { -1, -1, 322351 }, - } - } -}, - -{ - "Anime Freak FX Volume 4", - "アニメフリークFX Vol.4", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 3286 }, - { -1, -1, 312713 }, - } - } -}, - -{ - "Anime Freak FX Volume 5", - "アニメフリークFX Vol.5", - 0, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2943 }, - { -1, -1, 231075 }, - }, - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 5268 }, - { -1, -1, 267842 }, - } - } -}, - -{ - "Anime Freak FX Volume 6", - "アニメフリークFX Vol.6", - 0, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4732 }, - { -1, -1, 290461 }, - }, - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 17408 }, - { -1, -1, 306629 }, - } - } -}, - -{ - "Aruberea's Maiden", - "アルバレアの乙女", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2381 }, - { 3, CDGE_FORMAT_DATA, 3729 }, - { 4, CDGE_FORMAT_DATA, 11919 }, - { 5, CDGE_FORMAT_DATA, 67010 }, - { 6, CDGE_FORMAT_DATA, 68706 }, - { 7, CDGE_FORMAT_DATA, 69119 }, - { 8, CDGE_FORMAT_DATA, 69538 }, - { 9, CDGE_FORMAT_DATA, 69958 }, - { 10, CDGE_FORMAT_DATA, 70425 }, - { 11, CDGE_FORMAT_DATA, 72558 }, - { 12, CDGE_FORMAT_DATA, 74956 }, - { 13, CDGE_FORMAT_DATA, 77246 }, - { 14, CDGE_FORMAT_DATA, 83332 }, - { 15, CDGE_FORMAT_DATA, 101273 }, - { 16, CDGE_FORMAT_DATA, 113096 }, - { 17, CDGE_FORMAT_DATA, 125676 }, - { 18, CDGE_FORMAT_DATA, 144119 }, - { 19, CDGE_FORMAT_DATA, 163556 }, - { -1, -1, 234498 }, - } - } -}, - -{ - "Battle Heat", - "バトルヒート", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 6253 }, - { 4, CDGE_FORMAT_AUDIO, 16083 }, - { 5, CDGE_FORMAT_DATA, 35549 }, - { 6, CDGE_FORMAT_DATA, 39544 }, - { 7, CDGE_FORMAT_DATA, 40834 }, - { 8, CDGE_FORMAT_DATA, 101620 }, - { 9, CDGE_FORMAT_DATA, 120156 }, - { 10, CDGE_FORMAT_DATA, 142691 }, - { 11, CDGE_FORMAT_DATA, 154690 }, - { 12, CDGE_FORMAT_DATA, 164535 }, - { 13, CDGE_FORMAT_DATA, 178064 }, - { 14, CDGE_FORMAT_DATA, 194891 }, - { 15, CDGE_FORMAT_DATA, 205807 }, - { 16, CDGE_FORMAT_DATA, 216414 }, - { 17, CDGE_FORMAT_DATA, 234950 }, - { 18, CDGE_FORMAT_DATA, 257485 }, - { 19, CDGE_FORMAT_DATA, 269642 }, - { 20, CDGE_FORMAT_DATA, 280175 }, - { 21, CDGE_FORMAT_DATA, 293704 }, - { 22, CDGE_FORMAT_DATA, 310531 }, - { -1, -1, 311822 }, - } - } -}, - -{ - "Blue Breaker", - "ブルーブレイカー 剣よりも微笑みを", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 5804 }, - { -1, -1, 314954 }, - } - } -}, - -{ - "Blue Chicago Blues", - "J.B. Harold ブルーシカゴブルース", - 0, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 241908 }, - { -1, -1, 242250 }, - }, - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 308890 }, - { 3, CDGE_FORMAT_AUDIO, 322135 }, - { -1, -1, 322477 }, - } - } -}, - -{ - "Boundary Gate - Daughter of Kingdom", - "バウンダリーゲート Daughter of Kingdom", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 31797 }, - { 4, CDGE_FORMAT_AUDIO, 34840 }, - { 5, CDGE_FORMAT_AUDIO, 38383 }, - { 6, CDGE_FORMAT_AUDIO, 38898 }, - { 7, CDGE_FORMAT_AUDIO, 40365 }, - { 8, CDGE_FORMAT_AUDIO, 41223 }, - { 9, CDGE_FORMAT_AUDIO, 41543 }, - { 10, CDGE_FORMAT_AUDIO, 44293 }, - { 11, CDGE_FORMAT_AUDIO, 47722 }, - { 12, CDGE_FORMAT_AUDIO, 48042 }, - { 13, CDGE_FORMAT_AUDIO, 50396 }, - { 14, CDGE_FORMAT_AUDIO, 50716 }, - { 15, CDGE_FORMAT_AUDIO, 51078 }, - { 16, CDGE_FORMAT_AUDIO, 51477 }, - { 17, CDGE_FORMAT_AUDIO, 52240 }, - { 18, CDGE_FORMAT_AUDIO, 53430 }, - { 19, CDGE_FORMAT_AUDIO, 54573 }, - { 20, CDGE_FORMAT_AUDIO, 56949 }, - { 21, CDGE_FORMAT_AUDIO, 59248 }, - { 22, CDGE_FORMAT_AUDIO, 61753 }, - { 23, CDGE_FORMAT_AUDIO, 62577 }, - { 24, CDGE_FORMAT_AUDIO, 63746 }, - { 25, CDGE_FORMAT_AUDIO, 64827 }, - { 26, CDGE_FORMAT_AUDIO, 66673 }, - { 27, CDGE_FORMAT_AUDIO, 69156 }, - { 28, CDGE_FORMAT_AUDIO, 71742 }, - { 29, CDGE_FORMAT_AUDIO, 74427 }, - { 30, CDGE_FORMAT_AUDIO, 76953 }, - { 31, CDGE_FORMAT_AUDIO, 78144 }, - { 32, CDGE_FORMAT_AUDIO, 78464 }, - { 33, CDGE_FORMAT_AUDIO, 83018 }, - { 34, CDGE_FORMAT_AUDIO, 83528 }, - { 35, CDGE_FORMAT_AUDIO, 87939 }, - { 36, CDGE_FORMAT_AUDIO, 88861 }, - { 37, CDGE_FORMAT_AUDIO, 91647 }, - { 38, CDGE_FORMAT_AUDIO, 92172 }, - { 39, CDGE_FORMAT_AUDIO, 94556 }, - { 40, CDGE_FORMAT_AUDIO, 97820 }, - { 41, CDGE_FORMAT_AUDIO, 98140 }, - { 42, CDGE_FORMAT_AUDIO, 98614 }, - { 43, CDGE_FORMAT_AUDIO, 98951 }, - { 44, CDGE_FORMAT_AUDIO, 99691 }, - { 45, CDGE_FORMAT_AUDIO, 100379 }, - { 46, CDGE_FORMAT_AUDIO, 100699 }, - { 47, CDGE_FORMAT_AUDIO, 101019 }, - { 48, CDGE_FORMAT_AUDIO, 101339 }, - { 49, CDGE_FORMAT_AUDIO, 103185 }, - { 50, CDGE_FORMAT_AUDIO, 103500 }, - { 51, CDGE_FORMAT_AUDIO, 107791 }, - { 52, CDGE_FORMAT_AUDIO, 108111 }, - { 53, CDGE_FORMAT_AUDIO, 108583 }, - { 54, CDGE_FORMAT_AUDIO, 109161 }, - { 55, CDGE_FORMAT_AUDIO, 113732 }, - { 56, CDGE_FORMAT_AUDIO, 114657 }, - { 57, CDGE_FORMAT_AUDIO, 115080 }, - { 58, CDGE_FORMAT_AUDIO, 115645 }, - { 59, CDGE_FORMAT_AUDIO, 115996 }, - { 60, CDGE_FORMAT_AUDIO, 117096 }, - { 61, CDGE_FORMAT_AUDIO, 117649 }, - { 62, CDGE_FORMAT_AUDIO, 117969 }, - { 63, CDGE_FORMAT_AUDIO, 118832 }, - { 64, CDGE_FORMAT_AUDIO, 120283 }, - { 65, CDGE_FORMAT_AUDIO, 122653 }, - { 66, CDGE_FORMAT_AUDIO, 122973 }, - { 67, CDGE_FORMAT_AUDIO, 123340 }, - { 68, CDGE_FORMAT_AUDIO, 123676 }, - { 69, CDGE_FORMAT_AUDIO, 123996 }, - { 70, CDGE_FORMAT_AUDIO, 126275 }, - { 71, CDGE_FORMAT_AUDIO, 130217 }, - { 72, CDGE_FORMAT_AUDIO, 137425 }, - { 73, CDGE_FORMAT_AUDIO, 143256 }, - { 74, CDGE_FORMAT_AUDIO, 145854 }, - { 75, CDGE_FORMAT_AUDIO, 149728 }, - { 76, CDGE_FORMAT_AUDIO, 151589 }, - { 77, CDGE_FORMAT_AUDIO, 151909 }, - { 78, CDGE_FORMAT_AUDIO, 152356 }, - { 79, CDGE_FORMAT_AUDIO, 156214 }, - { 80, CDGE_FORMAT_AUDIO, 158157 }, - { 81, CDGE_FORMAT_AUDIO, 159612 }, - { 82, CDGE_FORMAT_AUDIO, 162307 }, - { 83, CDGE_FORMAT_AUDIO, 163569 }, - { 84, CDGE_FORMAT_AUDIO, 166452 }, - { 85, CDGE_FORMAT_AUDIO, 169513 }, - { 86, CDGE_FORMAT_AUDIO, 174406 }, - { 87, CDGE_FORMAT_AUDIO, 191526 }, - { 88, CDGE_FORMAT_AUDIO, 197689 }, - { 89, CDGE_FORMAT_AUDIO, 197990 }, - { 90, CDGE_FORMAT_AUDIO, 198291 }, - { 91, CDGE_FORMAT_AUDIO, 201334 }, - { -1, -1, 201636 }, - } - } -}, - -{ - "Can Can Bunny Extra DX", - "きゃんきゃんバニーエクストラDX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2936 }, - { 3, CDGE_FORMAT_DATA, 3322 }, - { 4, CDGE_FORMAT_AUDIO, 279473 }, - { 5, CDGE_FORMAT_AUDIO, 291019 }, - { 6, CDGE_FORMAT_AUDIO, 303173 }, - { 7, CDGE_FORMAT_AUDIO, 309557 }, - { -1, -1, 316447 }, - } - } -}, - -{ - "Chip Chan Kick", - "チップきゃんキイーック", - CDGE_FLAG_ACCURATE_V810, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 5128 }, - { 3, CDGE_FORMAT_AUDIO, 66911 }, - { 4, CDGE_FORMAT_AUDIO, 68734 }, - { 5, CDGE_FORMAT_AUDIO, 73420 }, - { 6, CDGE_FORMAT_AUDIO, 78046 }, - { 7, CDGE_FORMAT_AUDIO, 83671 }, - { 8, CDGE_FORMAT_AUDIO, 103981 }, - { 9, CDGE_FORMAT_AUDIO, 123333 }, - { 10, CDGE_FORMAT_AUDIO, 139735 }, - { 11, CDGE_FORMAT_AUDIO, 143207 }, - { 12, CDGE_FORMAT_AUDIO, 145857 }, - { 13, CDGE_FORMAT_AUDIO, 158775 }, - { 14, CDGE_FORMAT_AUDIO, 177806 }, - { 15, CDGE_FORMAT_AUDIO, 194978 }, - { 16, CDGE_FORMAT_AUDIO, 195667 }, - { 17, CDGE_FORMAT_AUDIO, 197608 }, - { 18, CDGE_FORMAT_AUDIO, 198320 }, - { 19, CDGE_FORMAT_AUDIO, 203445 }, - { 20, CDGE_FORMAT_AUDIO, 221182 }, - { 21, CDGE_FORMAT_AUDIO, 237322 }, - { 22, CDGE_FORMAT_AUDIO, 256767 }, - { 23, CDGE_FORMAT_AUDIO, 257949 }, - { -1, -1, 274921 }, - } - } -}, - -{ - "Comic Road", - "こみっくろーど", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4232 }, - { 3, CDGE_FORMAT_DATA, 5258 }, - { -1, -1, 330932 }, - } - } -}, - -{ - "Cutey Honey FX", - "キューテイーハニー FX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { -1, -1, 283315 }, - } - } -}, - -{ - "Deep Blue Fleet", - "紺碧の艦隊", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2284 }, - { 3, CDGE_FORMAT_AUDIO, 183701 }, - { 4, CDGE_FORMAT_AUDIO, 184477 }, - { 5, CDGE_FORMAT_AUDIO, 191254 }, - { 6, CDGE_FORMAT_AUDIO, 197407 }, - { 7, CDGE_FORMAT_AUDIO, 206666 }, - { 8, CDGE_FORMAT_AUDIO, 211927 }, - { 9, CDGE_FORMAT_AUDIO, 217685 }, - { 10, CDGE_FORMAT_AUDIO, 225936 }, - { 11, CDGE_FORMAT_AUDIO, 229784 }, - { -1, -1, 230085 }, - } - } -}, - -{ - "Der Langrisser FX", - "デアラングリッサーFX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 1971 }, - { 3, CDGE_FORMAT_AUDIO, 323127 }, - { -1, -1, 330256 }, - } - } -}, - -{ - "Doukyusei II", - "同級生2", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 4909 }, - { 4, CDGE_FORMAT_DATA, 5941 }, - { 5, CDGE_FORMAT_DATA, 42059 }, - { 6, CDGE_FORMAT_AUDIO, 220795 }, - { 7, CDGE_FORMAT_AUDIO, 225646 }, - { 8, CDGE_FORMAT_AUDIO, 235498 }, - { -1, -1, 246680 }, - } - } -}, - -{ - "Dragon Knight IV", - "ドラゴンナイト4", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 177212 }, - { 4, CDGE_FORMAT_AUDIO, 196193 }, - { -1, -1, 218037 }, - } - } -}, - -{ - "Farland Story FX", - "ファーランドストーリー", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 232538 }, - { 4, CDGE_FORMAT_AUDIO, 236403 }, - { 5, CDGE_FORMAT_AUDIO, 238396 }, - { -1, -1, 242433 }, - } - } -}, - -{ - "Fire Woman Matoi-gumi", - "ファイアーウーマン纏組", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 5119 }, - { -1, -1, 257764 }, - } - } -}, - -{ - "First Kiss Monogatari", - "ファーストKiss物語", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 1356 }, - { 3, CDGE_FORMAT_AUDIO, 318011 }, - { 4, CDGE_FORMAT_AUDIO, 324526 }, - { -1, -1, 325039 }, - } - } -}, - -{ - "Fushigi No Kuni No Angelique", - "ふしぎの国のアンジェリーク", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 4829 }, - { 4, CDGE_FORMAT_DATA, 5202 }, - { 5, CDGE_FORMAT_DATA, 7172 }, - { 6, CDGE_FORMAT_DATA, 53781 }, - { -1, -1, 142498 }, - } - } -}, - -{ - "Ginga Ojousama Densetsu Yuna FX", - "銀河お嬢様伝説ユナFX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2276 }, - { -1, -1, 301707 }, - } - } -}, - -{ - "Ginga Ojousama Densetsu Yuna FX Special Edition", - "銀河お嬢様伝説ユナFX Special Edition", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 52049 }, - { -1, -1, 61102 }, - } - } -}, - -{ - "Graduation REAL", - "卒業R Graduation Real", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 5165 }, - { -1, -1, 213907 }, - } - } -}, - -{ - "Kishin Douji Zenki FX", - "鬼神童子 ZENKI FX", - CDGE_FLAG_ACCURATE_V810, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 7171 }, - { 3, CDGE_FORMAT_AUDIO, 107872 }, - { 4, CDGE_FORMAT_AUDIO, 110438 }, - { 5, CDGE_FORMAT_AUDIO, 112940 }, - { 6, CDGE_FORMAT_AUDIO, 131362 }, - { 7, CDGE_FORMAT_AUDIO, 147425 }, - { 8, CDGE_FORMAT_AUDIO, 163839 }, - { 9, CDGE_FORMAT_AUDIO, 174752 }, - { 10, CDGE_FORMAT_AUDIO, 190392 }, - { 11, CDGE_FORMAT_AUDIO, 201880 }, - { 12, CDGE_FORMAT_AUDIO, 220717 }, - { 13, CDGE_FORMAT_AUDIO, 230587 }, - { 14, CDGE_FORMAT_AUDIO, 247515 }, - { 15, CDGE_FORMAT_AUDIO, 263803 }, - { 16, CDGE_FORMAT_AUDIO, 265987 }, - { 17, CDGE_FORMAT_AUDIO, 272735 }, - { 18, CDGE_FORMAT_AUDIO, 290382 }, - { 19, CDGE_FORMAT_AUDIO, 305690 }, - { 20, CDGE_FORMAT_AUDIO, 322430 }, - { -1, -1, 329141 }, - } - } -}, - -{ - "Kokuu Hyouryuu Nirgends", - "虚空漂流ニルゲンツ", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4492 }, - { -1, -1, 330162 }, - } - } -}, - - -{ - "Last Imperial Prince", - "ラストインペリアルプリンス", - 0, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 10187 }, - { 4, CDGE_FORMAT_AUDIO, 24124 }, - { 5, CDGE_FORMAT_AUDIO, 40686 }, - { 6, CDGE_FORMAT_AUDIO, 56583 }, - { 7, CDGE_FORMAT_AUDIO, 63025 }, - { 8, CDGE_FORMAT_AUDIO, 69646 }, - { 9, CDGE_FORMAT_AUDIO, 75144 }, - { 10, CDGE_FORMAT_AUDIO, 81208 }, - { 11, CDGE_FORMAT_AUDIO, 86132 }, - { 12, CDGE_FORMAT_AUDIO, 101745 }, - { 13, CDGE_FORMAT_AUDIO, 107871 }, - { 14, CDGE_FORMAT_AUDIO, 121487 }, - { 15, CDGE_FORMAT_AUDIO, 134835 }, - { 16, CDGE_FORMAT_AUDIO, 148385 }, - { 17, CDGE_FORMAT_AUDIO, 163372 }, - { 18, CDGE_FORMAT_AUDIO, 176996 }, - { 19, CDGE_FORMAT_AUDIO, 216456 }, - { 20, CDGE_FORMAT_AUDIO, 238672 }, - { 21, CDGE_FORMAT_AUDIO, 241036 }, - { 22, CDGE_FORMAT_AUDIO, 242389 }, - { 23, CDGE_FORMAT_DATA, 246767 }, - { 24, CDGE_FORMAT_DATA, 277470 }, - { -1, -1, 290164 }, - }, - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 10187 }, - { 4, CDGE_FORMAT_AUDIO, 24124 }, - { 5, CDGE_FORMAT_AUDIO, 40686 }, - { 6, CDGE_FORMAT_AUDIO, 56583 }, - { 7, CDGE_FORMAT_AUDIO, 63025 }, - { 8, CDGE_FORMAT_AUDIO, 69646 }, - { 9, CDGE_FORMAT_AUDIO, 75144 }, - { 10, CDGE_FORMAT_AUDIO, 81208 }, - { 11, CDGE_FORMAT_AUDIO, 86132 }, - { 12, CDGE_FORMAT_AUDIO, 100599 }, - { 13, CDGE_FORMAT_AUDIO, 114101 }, - { 14, CDGE_FORMAT_AUDIO, 128505 }, - { 15, CDGE_FORMAT_AUDIO, 142903 }, - { 16, CDGE_FORMAT_AUDIO, 156648 }, - { 17, CDGE_FORMAT_AUDIO, 170424 }, - { 18, CDGE_FORMAT_AUDIO, 188071 }, - { 19, CDGE_FORMAT_AUDIO, 230603 }, - { 20, CDGE_FORMAT_AUDIO, 254521 }, - { 21, CDGE_FORMAT_AUDIO, 259922 }, - { 22, CDGE_FORMAT_DATA, 262475 }, - { -1, -1, 318842 }, - } - } -}, - -{ - "Lunatic Dawn", - "ルナテイックドーンFX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 69072 }, - { 4, CDGE_FORMAT_AUDIO, 73053 }, - { 5, CDGE_FORMAT_AUDIO, 81372 }, - { 6, CDGE_FORMAT_AUDIO, 95658 }, - { 7, CDGE_FORMAT_AUDIO, 107310 }, - { 8, CDGE_FORMAT_AUDIO, 113597 }, - { 9, CDGE_FORMAT_AUDIO, 123146 }, - { 10, CDGE_FORMAT_AUDIO, 133358 }, - { 11, CDGE_FORMAT_AUDIO, 144357 }, - { 12, CDGE_FORMAT_AUDIO, 154059 }, - { 13, CDGE_FORMAT_AUDIO, 164189 }, - { 14, CDGE_FORMAT_AUDIO, 172197 }, - { 15, CDGE_FORMAT_AUDIO, 182157 }, - { 16, CDGE_FORMAT_AUDIO, 186336 }, - { 17, CDGE_FORMAT_AUDIO, 192222 }, - { 18, CDGE_FORMAT_AUDIO, 202203 }, - { 19, CDGE_FORMAT_AUDIO, 208274 }, - { 20, CDGE_FORMAT_AUDIO, 212338 }, - { 21, CDGE_FORMAT_AUDIO, 220499 }, - { 22, CDGE_FORMAT_AUDIO, 229850 }, - { 23, CDGE_FORMAT_AUDIO, 240178 }, - { 24, CDGE_FORMAT_AUDIO, 241376 }, - { 25, CDGE_FORMAT_AUDIO, 242050 }, - { 26, CDGE_FORMAT_AUDIO, 246855 }, - { 27, CDGE_FORMAT_AUDIO, 253026 }, - { 28, CDGE_FORMAT_AUDIO, 260509 }, - { 29, CDGE_FORMAT_AUDIO, 260844 }, - { 30, CDGE_FORMAT_AUDIO, 261554 }, - { 31, CDGE_FORMAT_AUDIO, 262591 }, - { -1, -1, 263219 }, - } - } -}, - -{ - "Mahjong Goku Tenjiku", - "麻雀悟空天竺", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 8376 }, - { 4, CDGE_FORMAT_AUDIO, 11607 }, - { 5, CDGE_FORMAT_AUDIO, 19873 }, - { 6, CDGE_FORMAT_AUDIO, 24171 }, - { 7, CDGE_FORMAT_AUDIO, 29994 }, - { 8, CDGE_FORMAT_AUDIO, 34978 }, - { 9, CDGE_FORMAT_AUDIO, 41359 }, - { 10, CDGE_FORMAT_AUDIO, 47803 }, - { 11, CDGE_FORMAT_AUDIO, 54204 }, - { 12, CDGE_FORMAT_AUDIO, 60619 }, - { 13, CDGE_FORMAT_AUDIO, 67006 }, - { 14, CDGE_FORMAT_AUDIO, 73397 }, - { 15, CDGE_FORMAT_AUDIO, 79790 }, - { 16, CDGE_FORMAT_AUDIO, 86179 }, - { 17, CDGE_FORMAT_AUDIO, 92574 }, - { 18, CDGE_FORMAT_AUDIO, 115478 }, - { 19, CDGE_FORMAT_AUDIO, 138537 }, - { 20, CDGE_FORMAT_AUDIO, 161434 }, - { 21, CDGE_FORMAT_AUDIO, 184314 }, - { 22, CDGE_FORMAT_AUDIO, 197815 }, - { 23, CDGE_FORMAT_AUDIO, 216216 }, - { 24, CDGE_FORMAT_AUDIO, 230140 }, - { 25, CDGE_FORMAT_AUDIO, 239554 }, - { 26, CDGE_FORMAT_AUDIO, 240045 }, - { 27, CDGE_FORMAT_AUDIO, 240661 }, - { 28, CDGE_FORMAT_AUDIO, 241040 }, - { 29, CDGE_FORMAT_AUDIO, 241632 }, - { 30, CDGE_FORMAT_AUDIO, 242579 }, - { 31, CDGE_FORMAT_AUDIO, 243054 }, - { 32, CDGE_FORMAT_AUDIO, 243354 }, - { 33, CDGE_FORMAT_AUDIO, 243796 }, - { 34, CDGE_FORMAT_AUDIO, 245294 }, - { 35, CDGE_FORMAT_AUDIO, 247298 }, - { 36, CDGE_FORMAT_AUDIO, 249208 }, - { 37, CDGE_FORMAT_AUDIO, 250388 }, - { 38, CDGE_FORMAT_AUDIO, 251862 }, - { 39, CDGE_FORMAT_AUDIO, 253227 }, - { 40, CDGE_FORMAT_AUDIO, 254796 }, - { 41, CDGE_FORMAT_AUDIO, 256032 }, - { -1, -1, 264625 }, - } - } -}, - -{ - "Makeruna! Makendou Z", - "負けるな!魔剣道Z", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 5165 }, - { 4, CDGE_FORMAT_DATA, 5677 }, - { 5, CDGE_FORMAT_DATA, 6477 }, - { 6, CDGE_FORMAT_DATA, 7645 }, - { 7, CDGE_FORMAT_DATA, 8157 }, - { 8, CDGE_FORMAT_DATA, 16349 }, - { 9, CDGE_FORMAT_DATA, 52294 }, - { 10, CDGE_FORMAT_AUDIO, 174749 }, - { 11, CDGE_FORMAT_DATA, 191888 }, - { -1, -1, 192401 }, - } - } -}, - -{ - "Megami Paradise II", - "女神天国II", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 3381 }, - { 3, CDGE_FORMAT_AUDIO, 296237 }, - { 4, CDGE_FORMAT_DATA, 306322 }, - { -1, -1, 306835 }, - } - } -}, - -{ - "Minimum Nanonic", - "みにまむなのにっく", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 208813 }, - { 4, CDGE_FORMAT_AUDIO, 227341 }, - { 5, CDGE_FORMAT_AUDIO, 245834 }, - { -1, -1, 250005 }, - } - } -}, - -{ - "Miraculum: The Last Revelation", - "ミラークルム ーサ・ラスト・レベレーションー", - 0, //CDGE_FLAG_ACCURATE_V810, // 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { -1, -1, 315726 }, - } - } -}, - -{ - "Nnyuu", - NULL, - CDGE_FLAG_FXGA, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 13517 }, - { 4, CDGE_FORMAT_AUDIO, 25819 }, - { 5, CDGE_FORMAT_AUDIO, 32862 }, - { 6, CDGE_FORMAT_AUDIO, 42340 }, - { 7, CDGE_FORMAT_AUDIO, 51288 }, - { 8, CDGE_FORMAT_AUDIO, 63538 }, - { 9, CDGE_FORMAT_AUDIO, 72521 }, - { 10, CDGE_FORMAT_AUDIO, 83392 }, - { -1, -1, 91836 }, - }, - { - { 1, CDGE_FORMAT_DATA, 0 }, - { -1, -1, 9495 }, - } - } -}, - -{ - "Ojousama Sousamou", - "お嬢様捜査網", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 9083 }, - { 3, CDGE_FORMAT_DATA, 10935 }, - { 4, CDGE_FORMAT_DATA, 12489 }, - { 5, CDGE_FORMAT_DATA, 13054 }, - { 6, CDGE_FORMAT_DATA, 38195 }, - { 7, CDGE_FORMAT_AUDIO, 120164 }, - { 8, CDGE_FORMAT_AUDIO, 127204 }, - { 9, CDGE_FORMAT_AUDIO, 134263 }, - { 10, CDGE_FORMAT_AUDIO, 134597 }, - { 11, CDGE_FORMAT_AUDIO, 136291 }, - { 12, CDGE_FORMAT_AUDIO, 137881 }, - { 13, CDGE_FORMAT_AUDIO, 143424 }, - { 14, CDGE_FORMAT_AUDIO, 150212 }, - { 15, CDGE_FORMAT_AUDIO, 156807 }, - { 16, CDGE_FORMAT_AUDIO, 163988 }, - { 17, CDGE_FORMAT_AUDIO, 170768 }, - { 18, CDGE_FORMAT_AUDIO, 177616 }, - { 19, CDGE_FORMAT_AUDIO, 183555 }, - { 20, CDGE_FORMAT_AUDIO, 185138 }, - { 21, CDGE_FORMAT_AUDIO, 185557 }, - { 22, CDGE_FORMAT_AUDIO, 187160 }, - { 23, CDGE_FORMAT_AUDIO, 187507 }, - { 24, CDGE_FORMAT_AUDIO, 188122 }, - { 25, CDGE_FORMAT_AUDIO, 196158 }, - { 26, CDGE_FORMAT_AUDIO, 204161 }, - { 27, CDGE_FORMAT_AUDIO, 206297 }, - { 28, CDGE_FORMAT_AUDIO, 224106 }, - { 29, CDGE_FORMAT_AUDIO, 227826 }, - { 30, CDGE_FORMAT_AUDIO, 235934 }, - { 31, CDGE_FORMAT_AUDIO, 237516 }, - { -1, -1, 244557 }, - } - } -}, - -{ - "Pachio-kun FX", - "パチ夫くんFX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 5037 }, - { 4, CDGE_FORMAT_DATA, 7830 }, - { 5, CDGE_FORMAT_DATA, 157279 }, - { 6, CDGE_FORMAT_DATA, 158364 }, - { 7, CDGE_FORMAT_DATA, 180499 }, - { 8, CDGE_FORMAT_AUDIO, 205401 }, - { 9, CDGE_FORMAT_AUDIO, 206401 }, - { 10, CDGE_FORMAT_AUDIO, 219890 }, - { 11, CDGE_FORMAT_AUDIO, 224061 }, - { 12, CDGE_FORMAT_AUDIO, 228389 }, - { 13, CDGE_FORMAT_AUDIO, 232550 }, - { 14, CDGE_FORMAT_AUDIO, 239291 }, - { -1, -1, 253825 }, - } - } -}, - -{ - "PCE Fan Special CD-Rom Vol. 2", - "PC Engine Fan Special CDROM Vol.2", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2938 }, - { 3, CDGE_FORMAT_DATA, 4778 }, - { 4, CDGE_FORMAT_DATA, 62548 }, - { 5, CDGE_FORMAT_DATA, 125244 }, - { 6, CDGE_FORMAT_AUDIO, 144311 }, - { 7, CDGE_FORMAT_AUDIO, 150877 }, - { 8, CDGE_FORMAT_AUDIO, 210027 }, - { 9, CDGE_FORMAT_AUDIO, 213928 }, - { 10, CDGE_FORMAT_AUDIO, 217629 }, - { 11, CDGE_FORMAT_AUDIO, 220644 }, - { 12, CDGE_FORMAT_AUDIO, 224512 }, - { 13, CDGE_FORMAT_AUDIO, 231187 }, - { 14, CDGE_FORMAT_AUDIO, 234309 }, - { 15, CDGE_FORMAT_AUDIO, 239072 }, - { -1, -1, 240786 }, - } - } -}, - -{ - "PCE Fan Special CD-Rom Vol. 3", - "PC Engine Fan Special CDROM Vol.3", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 1831 }, - { 3, CDGE_FORMAT_DATA, 5239 }, - { 4, CDGE_FORMAT_DATA, 12377 }, - { 5, CDGE_FORMAT_AUDIO, 25381 }, - { 6, CDGE_FORMAT_AUDIO, 29358 }, - { 7, CDGE_FORMAT_AUDIO, 35924 }, - { 8, CDGE_FORMAT_AUDIO, 93272 }, - { 9, CDGE_FORMAT_DATA, 144485 }, - { -1, -1, 146604 }, - } - } -}, - -{ - "Pia Carrot He Youkoso", - "PIAキャロットへようこそ!!", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 6923 }, - { 3, CDGE_FORMAT_AUDIO, 294030 }, - { 4, CDGE_FORMAT_AUDIO, 300770 }, - { 5, CDGE_FORMAT_AUDIO, 307627 }, - { -1, -1, 314486 }, - } - } -}, - -{ - "Power Dolls FX", - "パワードールFX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 5165 }, - { 4, CDGE_FORMAT_DATA, 5507 }, - { 5, CDGE_FORMAT_DATA, 6279 }, - { 6, CDGE_FORMAT_DATA, 6647 }, - { 7, CDGE_FORMAT_DATA, 7079 }, - { 8, CDGE_FORMAT_DATA, 9480 }, - { 9, CDGE_FORMAT_DATA, 9854 }, - { 10, CDGE_FORMAT_DATA, 10366 }, - { 11, CDGE_FORMAT_DATA, 11184 }, - { 12, CDGE_FORMAT_DATA, 11952 }, - { 13, CDGE_FORMAT_DATA, 12499 }, - { 14, CDGE_FORMAT_AUDIO, 33090 }, - { 15, CDGE_FORMAT_AUDIO, 47464 }, - { 16, CDGE_FORMAT_DATA, 67672 }, - { 17, CDGE_FORMAT_DATA, 68440 }, - { 18, CDGE_FORMAT_DATA, 73582 }, - { 19, CDGE_FORMAT_AUDIO, 74650 }, - { 20, CDGE_FORMAT_AUDIO, 86120 }, - { 21, CDGE_FORMAT_AUDIO, 115719 }, - { 22, CDGE_FORMAT_AUDIO, 130093 }, - { 23, CDGE_FORMAT_AUDIO, 143954 }, - { 24, CDGE_FORMAT_AUDIO, 162477 }, - { 25, CDGE_FORMAT_AUDIO, 180206 }, - { 26, CDGE_FORMAT_AUDIO, 192167 }, - { 27, CDGE_FORMAT_AUDIO, 208417 }, - { 28, CDGE_FORMAT_AUDIO, 218607 }, - { 29, CDGE_FORMAT_AUDIO, 238590 }, - { 30, CDGE_FORMAT_AUDIO, 258179 }, - { -1, -1, 258734 }, - } - } -}, - -{ - "Return to Zork", - "Return to Zork", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { -1, -1, 166265 }, - } - } -}, - -{ - "Ruruli Ra Rura", - "ルルリ・ラ・ルラ", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 3230 }, - { 3, CDGE_FORMAT_AUDIO, 158649 }, - { 4, CDGE_FORMAT_AUDIO, 169395 }, - { 5, CDGE_FORMAT_AUDIO, 184829 }, - { 6, CDGE_FORMAT_AUDIO, 197368 }, - { 7, CDGE_FORMAT_AUDIO, 210123 }, - { 8, CDGE_FORMAT_AUDIO, 223314 }, - { 9, CDGE_FORMAT_AUDIO, 237257 }, - { 10, CDGE_FORMAT_AUDIO, 251315 }, - { 11, CDGE_FORMAT_AUDIO, 266763 }, - { 12, CDGE_FORMAT_AUDIO, 281719 }, - { 13, CDGE_FORMAT_AUDIO, 295240 }, - { 14, CDGE_FORMAT_AUDIO, 295721 }, - { 15, CDGE_FORMAT_AUDIO, 296390 }, - { 16, CDGE_FORMAT_AUDIO, 297080 }, - { 17, CDGE_FORMAT_AUDIO, 297655 }, - { 18, CDGE_FORMAT_AUDIO, 298209 }, - { 19, CDGE_FORMAT_AUDIO, 301612 }, - { 20, CDGE_FORMAT_AUDIO, 303020 }, - { 21, CDGE_FORMAT_AUDIO, 303964 }, - { -1, -1, 322241 }, - } - } -}, - -{ - "Same Game FX", - NULL, - CDGE_FLAG_FXGA, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 3270 }, - { -1, -1, 3859 }, - } - } -}, - -{ - "Shanghai: The Great Wall", - "上海 万里の長城", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 9611 }, - { 4, CDGE_FORMAT_AUDIO, 15872 }, - { 5, CDGE_FORMAT_AUDIO, 21570 }, - { 6, CDGE_FORMAT_AUDIO, 27001 }, - { 7, CDGE_FORMAT_AUDIO, 32506 }, - { 8, CDGE_FORMAT_AUDIO, 38675 }, - { 9, CDGE_FORMAT_AUDIO, 44503 }, - { 10, CDGE_FORMAT_AUDIO, 49867 }, - { 11, CDGE_FORMAT_AUDIO, 55328 }, - { 12, CDGE_FORMAT_AUDIO, 61187 }, - { 13, CDGE_FORMAT_AUDIO, 66669 }, - { 14, CDGE_FORMAT_AUDIO, 72147 }, - { 15, CDGE_FORMAT_AUDIO, 77654 }, - { 16, CDGE_FORMAT_AUDIO, 83325 }, - { 17, CDGE_FORMAT_AUDIO, 89000 }, - { 18, CDGE_FORMAT_AUDIO, 94305 }, - { 19, CDGE_FORMAT_AUDIO, 97879 }, - { 20, CDGE_FORMAT_AUDIO, 103439 }, - { 21, CDGE_FORMAT_AUDIO, 108929 }, - { 22, CDGE_FORMAT_AUDIO, 114689 }, - { 23, CDGE_FORMAT_AUDIO, 115109 }, - { 24, CDGE_FORMAT_AUDIO, 115553 }, - { 25, CDGE_FORMAT_AUDIO, 117222 }, - { 26, CDGE_FORMAT_AUDIO, 117672 }, - { 27, CDGE_FORMAT_AUDIO, 122812 }, - { 28, CDGE_FORMAT_AUDIO, 123948 }, - { 29, CDGE_FORMAT_AUDIO, 124631 }, - { -1, -1, 130162 }, - } - } -}, - -{ - "Neo Generation II FX", - "卒業II FX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 13481 }, - { 3, CDGE_FORMAT_AUDIO, 209349 }, - { 4, CDGE_FORMAT_AUDIO, 215587 }, - { 5, CDGE_FORMAT_AUDIO, 227412 }, - { 6, CDGE_FORMAT_AUDIO, 239413 }, - { 7, CDGE_FORMAT_AUDIO, 243045 }, - { -1, -1, 243387 }, - } - } -}, - -{ - "Sparkling Feather", - "スパークリングフェザー", - CDGE_FLAG_ACCURATE_V810, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 1661 }, - { 3, CDGE_FORMAT_DATA, 182640 }, - { 4, CDGE_FORMAT_DATA, 183177 }, - { 5, CDGE_FORMAT_DATA, 183670 }, - { 6, CDGE_FORMAT_DATA, 184717 }, - { 7, CDGE_FORMAT_DATA, 185671 }, - { 8, CDGE_FORMAT_DATA, 187043 }, - { 9, CDGE_FORMAT_DATA, 187983 }, - { 10, CDGE_FORMAT_DATA, 188881 }, - { 11, CDGE_FORMAT_DATA, 189642 }, - { 12, CDGE_FORMAT_DATA, 194036 }, - { 13, CDGE_FORMAT_DATA, 195380 }, - { 14, CDGE_FORMAT_DATA, 196675 }, - { 15, CDGE_FORMAT_DATA, 197976 }, - { 16, CDGE_FORMAT_DATA, 199266 }, - { 17, CDGE_FORMAT_DATA, 200580 }, - { 18, CDGE_FORMAT_DATA, 201926 }, - { 19, CDGE_FORMAT_DATA, 203260 }, - { 20, CDGE_FORMAT_DATA, 204619 }, - { 21, CDGE_FORMAT_DATA, 206050 }, - { 22, CDGE_FORMAT_DATA, 209018 }, - { 23, CDGE_FORMAT_DATA, 211978 }, - { 24, CDGE_FORMAT_DATA, 214198 }, - { 25, CDGE_FORMAT_DATA, 215837 }, - { 26, CDGE_FORMAT_DATA, 217272 }, - { -1, -1, 218870 }, - } - } -}, - -{ - "Super PCE Fan Deluxe Special CD-Rom Vol. 1", - "SUPER PCエンジンファン DELUXE VOL.1", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 52049 }, - { 4, CDGE_FORMAT_DATA, 61101 }, - { 5, CDGE_FORMAT_DATA, 62381 }, - { 6, CDGE_FORMAT_DATA, 156844 }, - { 7, CDGE_FORMAT_DATA, 228449 }, - { 8, CDGE_FORMAT_DATA, 249299 }, - { 9, CDGE_FORMAT_DATA, 254167 }, - { 10, CDGE_FORMAT_DATA, 266033 }, - { 11, CDGE_FORMAT_DATA, 276018 }, - { 12, CDGE_FORMAT_DATA, 282558 }, - { 13, CDGE_FORMAT_AUDIO, 299212 }, - { -1, -1, 305779 }, - } - } -}, - -{ - "Super PCE Fan Deluxe Special CD-Rom Vol. 2", - "SUPER PCエンジンファン DELUXE VOL.2", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 10251 }, - { 4, CDGE_FORMAT_DATA, 26494 }, - { 5, CDGE_FORMAT_DATA, 51756 }, - { 6, CDGE_FORMAT_DATA, 57179 }, - { 7, CDGE_FORMAT_DATA, 68238 }, - { 8, CDGE_FORMAT_DATA, 76683 }, - { 9, CDGE_FORMAT_DATA, 82991 }, - { 10, CDGE_FORMAT_DATA, 89072 }, - { 11, CDGE_FORMAT_DATA, 96938 }, - { 12, CDGE_FORMAT_DATA, 104587 }, - { 13, CDGE_FORMAT_DATA, 115120 }, - { 14, CDGE_FORMAT_DATA, 137766 }, - { 15, CDGE_FORMAT_DATA, 169372 }, - { 16, CDGE_FORMAT_DATA, 191451 }, - { 17, CDGE_FORMAT_AUDIO, 193018 }, - { 18, CDGE_FORMAT_AUDIO, 206955 }, - { 19, CDGE_FORMAT_AUDIO, 223517 }, - { 20, CDGE_FORMAT_AUDIO, 229959 }, - { 21, CDGE_FORMAT_AUDIO, 236580 }, - { 22, CDGE_FORMAT_AUDIO, 242078 }, - { 23, CDGE_FORMAT_AUDIO, 247002 }, - { 24, CDGE_FORMAT_DATA, 260851 }, - { 25, CDGE_FORMAT_DATA, 273544 }, - { 26, CDGE_FORMAT_AUDIO, 304547 }, - { -1, -1, 311114 }, - } - } -}, - -{ - "Super Power League FX", - "スーパーパワーリーグFX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 3590 }, - { 3, CDGE_FORMAT_DATA, 4344 }, - { 4, CDGE_FORMAT_AUDIO, 14637 }, - { 5, CDGE_FORMAT_DATA, 102512 }, - { -1, -1, 166532 }, - } - } -}, - -{ - "Super Real Mahjong P V FX", - "スーパーリアル麻雀P5", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2590 }, - { 3, CDGE_FORMAT_DATA, 2976 }, - { 4, CDGE_FORMAT_DATA, 3350 }, - { 5, CDGE_FORMAT_DATA, 89885 }, - { 6, CDGE_FORMAT_DATA, 90695 }, - { 7, CDGE_FORMAT_AUDIO, 94331 }, - { 8, CDGE_FORMAT_AUDIO, 105090 }, - { 9, CDGE_FORMAT_AUDIO, 114148 }, - { 10, CDGE_FORMAT_AUDIO, 125335 }, - { 11, CDGE_FORMAT_AUDIO, 136932 }, - { 12, CDGE_FORMAT_AUDIO, 147480 }, - { 13, CDGE_FORMAT_AUDIO, 160406 }, - { 14, CDGE_FORMAT_AUDIO, 171875 }, - { 15, CDGE_FORMAT_AUDIO, 178636 }, - { 16, CDGE_FORMAT_AUDIO, 180766 }, - { -1, -1, 183547 }, - } - } -}, - - -{ - "Team Innocent", - "チームイノセント The point of no return", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 218041 }, - { 4, CDGE_FORMAT_AUDIO, 241208 }, - { 5, CDGE_FORMAT_AUDIO, 247705 }, - { 6, CDGE_FORMAT_AUDIO, 254586 }, - { 7, CDGE_FORMAT_AUDIO, 260797 }, - { 8, CDGE_FORMAT_AUDIO, 267971 }, - { 9, CDGE_FORMAT_AUDIO, 275080 }, - { 10, CDGE_FORMAT_AUDIO, 285655 }, - { 11, CDGE_FORMAT_AUDIO, 289111 }, - { 12, CDGE_FORMAT_AUDIO, 300772 }, - { 13, CDGE_FORMAT_AUDIO, 305057 }, - { 14, CDGE_FORMAT_AUDIO, 317734 }, - { -1, -1, 324695 }, - } - } -}, - -{ - "Tekipaki Working Love", - "はたらく☆少女 てきぱきワーキンラブ FX", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 2474 }, - { 3, CDGE_FORMAT_DATA, 3500 }, - { 4, CDGE_FORMAT_AUDIO, 181612 }, - { 5, CDGE_FORMAT_AUDIO, 194776 }, - { -1, -1, 211869 }, - }, - } -}, - -{ - "Tenchi Muyo FX", - "天地無用! 魎皇鬼 FX", - 0, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4135 }, - { -1, -1, 301916 }, - }, - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4621 }, - { -1, -1, 74055 }, - } - } -}, - -{ - "Tengai Makyou Karakuri Kakutouden", - "天外魔境電脳結繰格闘伝", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 9515 }, - { 4, CDGE_FORMAT_DATA, 27125 }, - { 5, CDGE_FORMAT_DATA, 49259 }, - { 6, CDGE_FORMAT_DATA, 74712 }, - { 7, CDGE_FORMAT_DATA, 101125 }, - { 8, CDGE_FORMAT_DATA, 129079 }, - { 9, CDGE_FORMAT_DATA, 156743 }, - { 10, CDGE_FORMAT_DATA, 192741 }, - { 11, CDGE_FORMAT_DATA, 215240 }, - { 12, CDGE_FORMAT_DATA, 240217 }, - { 13, CDGE_FORMAT_DATA, 260898 }, - { -1, -1, 279663 }, - } - } -}, - -{ - "Tokimeki Card Paradise", - "ときめきカードパラダイス", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_AUDIO, 9731 }, - { 4, CDGE_FORMAT_AUDIO, 10223 }, - { 5, CDGE_FORMAT_AUDIO, 10676 }, - { 6, CDGE_FORMAT_AUDIO, 11182 }, - { 7, CDGE_FORMAT_AUDIO, 11813 }, - { 8, CDGE_FORMAT_AUDIO, 12472 }, - { 9, CDGE_FORMAT_AUDIO, 18522 }, - { 10, CDGE_FORMAT_AUDIO, 31943 }, - { 11, CDGE_FORMAT_AUDIO, 45364 }, - { 12, CDGE_FORMAT_AUDIO, 58258 }, - { 13, CDGE_FORMAT_AUDIO, 69409 }, - { 14, CDGE_FORMAT_AUDIO, 80560 }, - { 15, CDGE_FORMAT_AUDIO, 91711 }, - { 16, CDGE_FORMAT_AUDIO, 95691 }, - { 17, CDGE_FORMAT_DATA, 99896 }, - { 18, CDGE_FORMAT_DATA, 105396 }, - { 19, CDGE_FORMAT_DATA, 106280 }, - { 20, CDGE_FORMAT_DATA, 107391 }, - { 21, CDGE_FORMAT_DATA, 108375 }, - { 22, CDGE_FORMAT_DATA, 109360 }, - { 23, CDGE_FORMAT_DATA, 110659 }, - { 24, CDGE_FORMAT_DATA, 111616 }, - { 25, CDGE_FORMAT_DATA, 113281 }, - { 26, CDGE_FORMAT_DATA, 113745 }, - { 27, CDGE_FORMAT_DATA, 115386 }, - { 28, CDGE_FORMAT_DATA, 119952 }, - { 29, CDGE_FORMAT_DATA, 121377 }, - { 30, CDGE_FORMAT_DATA, 123944 }, - { 31, CDGE_FORMAT_DATA, 125477 }, - { 32, CDGE_FORMAT_DATA, 126472 }, - { 33, CDGE_FORMAT_DATA, 127545 }, - { 34, CDGE_FORMAT_DATA, 128993 }, - { 35, CDGE_FORMAT_DATA, 130345 }, - { 36, CDGE_FORMAT_DATA, 132774 }, - { 37, CDGE_FORMAT_DATA, 133299 }, - { 38, CDGE_FORMAT_DATA, 134847 }, - { 39, CDGE_FORMAT_DATA, 139225 }, - { 40, CDGE_FORMAT_DATA, 142224 }, - { 41, CDGE_FORMAT_DATA, 143967 }, - { 42, CDGE_FORMAT_DATA, 145100 }, - { 43, CDGE_FORMAT_DATA, 146002 }, - { 44, CDGE_FORMAT_DATA, 147556 }, - { 45, CDGE_FORMAT_DATA, 148650 }, - { 46, CDGE_FORMAT_DATA, 150461 }, - { 47, CDGE_FORMAT_DATA, 151891 }, - { 48, CDGE_FORMAT_DATA, 152514 }, - { 49, CDGE_FORMAT_DATA, 153988 }, - { 50, CDGE_FORMAT_DATA, 157541 }, - { 51, CDGE_FORMAT_DATA, 158440 }, - { 52, CDGE_FORMAT_DATA, 161036 }, - { 53, CDGE_FORMAT_DATA, 162032 }, - { 54, CDGE_FORMAT_DATA, 162793 }, - { 55, CDGE_FORMAT_DATA, 164308 }, - { 56, CDGE_FORMAT_DATA, 165420 }, - { 57, CDGE_FORMAT_DATA, 167152 }, - { 58, CDGE_FORMAT_DATA, 168284 }, - { 59, CDGE_FORMAT_DATA, 169303 }, - { 60, CDGE_FORMAT_DATA, 169718 }, - { 61, CDGE_FORMAT_DATA, 173432 }, - { 62, CDGE_FORMAT_DATA, 177351 }, - { 63, CDGE_FORMAT_DATA, 178477 }, - { 64, CDGE_FORMAT_DATA, 179599 }, - { 65, CDGE_FORMAT_DATA, 180174 }, - { 66, CDGE_FORMAT_DATA, 181222 }, - { 67, CDGE_FORMAT_DATA, 182108 }, - { 68, CDGE_FORMAT_DATA, 182838 }, - { 69, CDGE_FORMAT_DATA, 183745 }, - { 70, CDGE_FORMAT_DATA, 184759 }, - { 71, CDGE_FORMAT_DATA, 185526 }, - { -1, -1, 186254 }, - } - } -}, - -{ - "Tonari no Princess Rolfee", - "となりのプリンセス ロルフィー", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 1431 }, - { -1, -1, 330127 }, - } - } -}, - -{ - "Tyoushin Heiki Zeroigar", - "超神兵器セロイガー", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 1982 }, - { 3, CDGE_FORMAT_AUDIO, 180819 }, - { 4, CDGE_FORMAT_AUDIO, 193570 }, - { 5, CDGE_FORMAT_AUDIO, 213671 }, - { -1, -1, 269144 }, - } - } -}, - - -{ - "Voice Paradise", - "ボイスパラダイス", - 0, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 5165 }, - { 4, CDGE_FORMAT_DATA, 19592 }, - { 5, CDGE_FORMAT_AUDIO, 149410 }, - { 6, CDGE_FORMAT_AUDIO, 159592 }, - { 7, CDGE_FORMAT_AUDIO, 164141 }, - { 8, CDGE_FORMAT_AUDIO, 180174 }, - { 9, CDGE_FORMAT_AUDIO, 195993 }, - { 10, CDGE_FORMAT_AUDIO, 212538 }, - { 11, CDGE_FORMAT_AUDIO, 217086 }, - { 12, CDGE_FORMAT_AUDIO, 232175 }, - { 13, CDGE_FORMAT_AUDIO, 253002 }, - { 14, CDGE_FORMAT_AUDIO, 268287 }, - { 15, CDGE_FORMAT_AUDIO, 283159 }, - { 16, CDGE_FORMAT_AUDIO, 284331 }, - { 17, CDGE_FORMAT_AUDIO, 285878 }, - { 18, CDGE_FORMAT_AUDIO, 300515 }, - { -1, -1, 300890 }, - }, - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { 3, CDGE_FORMAT_DATA, 5165 }, - { 4, CDGE_FORMAT_DATA, 19592 }, - { 5, CDGE_FORMAT_AUDIO, 153285 }, - { 6, CDGE_FORMAT_AUDIO, 163467 }, - { 7, CDGE_FORMAT_AUDIO, 168016 }, - { 8, CDGE_FORMAT_AUDIO, 184049 }, - { 9, CDGE_FORMAT_AUDIO, 199868 }, - { 10, CDGE_FORMAT_AUDIO, 216413 }, - { 11, CDGE_FORMAT_AUDIO, 220961 }, - { 12, CDGE_FORMAT_AUDIO, 236050 }, - { 13, CDGE_FORMAT_AUDIO, 256877 }, - { 14, CDGE_FORMAT_AUDIO, 272162 }, - { 15, CDGE_FORMAT_AUDIO, 287034 }, - { 16, CDGE_FORMAT_AUDIO, 288206 }, - { 17, CDGE_FORMAT_AUDIO, 289753 }, - { 18, CDGE_FORMAT_AUDIO, 304390 }, - { -1, -1, 304765 }, - } - } -}, - -{ - "Wakusei-koukitai Little Cats", - "惑星攻機隊りとるキャッツ", - 0, - 1, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 5163 }, - { 3, CDGE_FORMAT_DATA, 5933 }, - { 4, CDGE_FORMAT_DATA, 95878 }, - { 5, CDGE_FORMAT_AUDIO, 209401 }, - { 6, CDGE_FORMAT_AUDIO, 213777 }, - { 7, CDGE_FORMAT_AUDIO, 219527 }, - { 8, CDGE_FORMAT_AUDIO, 225871 }, - { 9, CDGE_FORMAT_AUDIO, 232693 }, - { 10, CDGE_FORMAT_AUDIO, 242452 }, - { 11, CDGE_FORMAT_AUDIO, 248960 }, - { 12, CDGE_FORMAT_AUDIO, 255249 }, - { 13, CDGE_FORMAT_AUDIO, 265891 }, - { 14, CDGE_FORMAT_AUDIO, 268646 }, - { 15, CDGE_FORMAT_AUDIO, 282287 }, - { 16, CDGE_FORMAT_AUDIO, 282743 }, - { -1, -1, 283044 }, - } - } -}, - -{ - "Zoku Hakutoi Monogatari", - "続初恋物語", - 0, - 2, - { - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { -1, -1, 332106 }, - }, - { - { 1, CDGE_FORMAT_AUDIO, 0 }, - { 2, CDGE_FORMAT_DATA, 4395 }, - { -1, -1, 333025 }, - } - } -}, - diff --git a/waterbox/pcfx/huc6270/vdc.cpp b/waterbox/pcfx/huc6270/vdc.cpp deleted file mode 100644 index ffe33ecfdd..0000000000 --- a/waterbox/pcfx/huc6270/vdc.cpp +++ /dev/null @@ -1,1796 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* VDC emulation */ - -#include "../defs.h" -//#include - -#include -#include "vdc.h" - -#define VDC_DEBUG(x, ...) { } -//#define VDC_DEBUG(x, ...) printf(x ": HPhase=%d, HPhaseCounter=%d, RCRCount=%d\n", ## __VA_ARGS__, HPhase, HPhaseCounter, RCRCount); - -#define VDC_UNDEFINED(format, ...) { } -//#define VDC_UNDEFINED(format, ...) printf(format " RCRCount=%d" "\n", ## __VA_ARGS__, RCRCount) - -#define VDC_WARNING(format, ...) { } -//#define VDC_WARNING(format, ...) { printf(format "\n", ## __VA_ARGS__); } - -#define ULE_BG 1 -#define ULE_SPR 2 - -static const unsigned int bat_width_tab[4] = { 32, 64, 128, 128 }; -static const unsigned int bat_width_shift_tab[4] = { 5, 6, 7, 7 }; -static const unsigned int bat_height_tab[2] = { 32, 64 }; - -void VDC::FixTileCache(uint16 A) -{ - uint32 charname = (A >> 4); - uint32 y = (A & 0x7); - uint8 *tc = bg_tile_cache[charname][y]; - - uint32 bitplane01 = VRAM[y + charname * 16]; - uint32 bitplane23 = VRAM[y+ 8 + charname * 16]; - - for(int x = 0; x < 8; x++) - { - uint32 raw_pixel = ((bitplane01 >> x) & 1); - raw_pixel |= ((bitplane01 >> (x + 8)) & 1) << 1; - raw_pixel |= ((bitplane23 >> x) & 1) << 2; - raw_pixel |= ((bitplane23 >> (x + 8)) & 1) << 3; - tc[7 - x] = raw_pixel; - } -} - -// Some virtual vdc macros to make code simpler to read -#define M_vdc_HSW (HSR & 0x1F) // Horizontal Synchro Width -#define M_vdc_HDS ((HSR >> 8) & 0x7F) // Horizontal Display Start -#define M_vdc_HDW (HDR & 0x7F) // Horizontal Display Width -#define M_vdc_HDE ((HDR >> 8) & 0x7F) // Horizontal Display End - -#define M_vdc_VSW (VSR & 0x1F) // Vertical synchro width -#define M_vdc_VDS ((VSR >> 8) & 0xFF) // Vertical Display Start -#define M_vdc_VDW (VDR & 0x1FF) // Vertical Display Width(Height? :b) -#define M_vdc_VCR (VCR & 0xFF) - -#define M_vdc_EX ((CR >> 4) & 0x3) -#define M_vdc_TE ((CR >> 8) & 0x3) - -#define VDCS_CR 0x01 // Sprite #0 collision interrupt occurred -#define VDCS_OR 0x02 // sprite overflow "" "" -#define VDCS_RR 0x04 // RCR "" "" -#define VDCS_DS 0x08 // VRAM to SAT DMA completion interrupt occurred -#define VDCS_DV 0x10 // VRAM to VRAM DMA completion interrupt occurred -#define VDCS_VD 0x20 // Vertical blank interrupt occurred -#define VDCS_BSY 0x40 // VDC is waiting for a CPU access slot during the active display area?? - -uint32 VDC::GetRegister(const unsigned int id, char *special, const uint32 special_len) -{ - uint32 value = 0xDEADBEEF; - - switch(id) - { - case GSREG_SELECT: - value = select; - break; - - case GSREG_STATUS: - value = status; - break; - - case GSREG_MAWR: - value = MAWR; - break; - - case GSREG_MARR: - value = MARR; - break; - - case GSREG_CR: - value = CR; - - if(special) - { - trio_snprintf(special, special_len, "Sprite Hit IRQ: %s, Sprite Overflow IRQ: %s, RCR IRQ: %s, VBlank IRQ: %s, Sprites: %s, Background: %s", (value & 1) ? "On" : "Off", (value & 2) ? "On" : "Off", - (value & 4) ? "On" : "Off", (value & 8) ? "On" : "Off", (value & 0x40) ? "On" : "Off", (value & 0x80) ? "On" : "Off"); - } - break; - - case GSREG_RCR: - value = RCR; - break; - - case GSREG_BXR: - value = BXR; - break; - - case GSREG_BYR: - value = BYR; - break; - - case GSREG_MWR: - value = MWR; - - if(special) - { - trio_snprintf(special, special_len, "CG Mode: %d, BAT Width: %d(tiles), BAT Height: %d(tiles)", (int)(bool)(value & 0x80), - bat_width_tab[(value >> 4) & 0x3], - bat_height_tab[(value >> 6) & 0x1]); - } - break; - - case GSREG_HSR: - value = HSR; - if(special) - { - trio_snprintf(special, special_len, "HSW: %02x, HDS: %02x", value & 0x1F, (value >> 8) & 0x7F); - } - break; - - case GSREG_HDR: - value = HDR; - if(special) - { - trio_snprintf(special, special_len, "HDW: %02x, HDE: %02x", value & 0x7F, (value >> 8) & 0x7F); - } - break; - - - case GSREG_VSR: - value = VSR; - if(special) - { - trio_snprintf(special, special_len, "VSW: %02x, VDS: %02x", value & 0x1F, (value >> 8) & 0xFF); - } - break; - - case GSREG_VDR: - value = VDR; - break; - - case GSREG_VCR: - value = VCR; - break; - - case GSREG_DCR: - value = DCR; - if(special) - { - trio_snprintf(special, special_len, "SATB DMA IRQ: %s, VRAM DMA IRQ: %s, DMA Source Address: %s, DMA Dest Address: %s, Auto SATB DMA: %s", - (DCR & 0x1) ? "On" : "Off", (DCR & 0x2) ? "On" : "Off", (DCR & 0x4) ? "Decrement" : "Increment", (DCR & 0x8) ? "Decrement" : "Increment", - (DCR & 0x10) ? "On" : "Off"); - } - break; - - case GSREG_SOUR: - value = SOUR; - break; - - case GSREG_DESR: - value = DESR; - break; - - case GSREG_LENR: - value = LENR; - break; - - case GSREG_DVSSR: - value = DVSSR; - break; - } - - return(value); -} - -void VDC::SetRegister(const unsigned int id, const uint32 value) -{ - switch(id) - { - default: break; - - case GSREG_STATUS: - status = value & 0x3F; - break; - - case GSREG_SELECT: - select = value & 0x1F; - break; - - case GSREG_MAWR: - MAWR = value & 0xFFFF; - break; - - case GSREG_MARR: - MARR = value & 0xFFFF; - break; - - case GSREG_CR: - CR = value & 0xFFFF; - break; - - case GSREG_RCR: - RCR = value & 0x3FF; - break; - - case GSREG_BXR: - BXR = value & 0x3FF; - break; - - case GSREG_BYR: - BYR = value & 0x1FF; - break; - - case GSREG_MWR: - MWR = value & 0xFFFF; - break; - - case GSREG_HSR: - HSR = value & 0xFFFF; - break; - - case GSREG_HDR: - HDR = value & 0xFFFF; - break; - - case GSREG_VSR: - VSR = value & 0xFFFF; - break; - - case GSREG_VDR: - VDR = value & 0xFFFF; - break; - - case GSREG_VCR: - VCR = value & 0xFFFF; - break; - - case GSREG_DCR: - DCR = value & 0xFFFF; - break; - - case GSREG_SOUR: - SOUR = value & 0xFFFF; - break; - - case GSREG_DESR: - DESR = value & 0xFFFF; - break; - - case GSREG_LENR: - LENR = value & 0xFFFF; - break; - - case GSREG_DVSSR: - DVSSR = value & 0xFFFF; - break; - } -} - -void VDC::SetLayerEnableMask(uint64 mask) -{ - userle = mask; -} - -void VDC::RunSATDMA(int32 cycles, bool force_completion) -{ - assert(sat_dma_counter > 0); - - if(force_completion) - cycles = sat_dma_counter; - - sat_dma_counter -= cycles; - if(sat_dma_counter <= 0) - { - if(DCR & 0x01) - { - VDC_DEBUG("Sprite DMA IRQ"); - status |= VDCS_DS; - IRQHook(TRUE); - } - CheckAndCommitPending(); - burst_mode = true; - } -} - -void VDC::RunDMA(int32 cycles, bool force_completion) -{ - int num_transfers = 0; - - if(force_completion) - { - VDMA_CycleCounter = 0; - - num_transfers = 65536 * 2; - } - else - { - VDMA_CycleCounter += cycles; - num_transfers = VDMA_CycleCounter >> 1; - VDMA_CycleCounter -= num_transfers << 1; - } - - while(num_transfers--) - { - if(!DMAReadWrite) - { - if(SOUR >= VRAM_Size) - VDC_UNDEFINED("Unmapped VRAM DMA read"); - - DMAReadBuffer = VRAM[SOUR]; - //printf("DMA Read: %04x, %04x\n", SOUR, DMAReadBuffer); - } - else - { - if(DESR < VRAM_Size) - { - VRAM[DESR] = DMAReadBuffer; - FixTileCache(DESR); - } - - SOUR += (((DCR & 0x4) >> 1) ^ 2) - 1; - DESR += (((DCR & 0x8) >> 2) ^ 2) - 1; - LENR--; - - if(LENR == 0xFFFF) // DMA is done. - { - DMARunning = 0; // Clear this BEFORE CheckAndCommitPending() - - CheckAndCommitPending(); - - if(DCR & 0x02) - { - status |= VDCS_DV; - IRQHook(TRUE); - VDC_DEBUG("DMA IRQ"); - } - break; - } - } - DMAReadWrite ^= 1; - } -} - -/* - ChrlyMac: Was it you who determined exactly how many VDC clocks the SAT DMA took? - I know someone did, but I can't remember the results... - 1024 - It happens at the VDW->VCR transition -*/ - -void VDC::IncRCR(void) -{ - if(NeedBGYInc) - { - NeedBGYInc = false; - if(0 == RCRCount) - BG_YMoo = BYR; - else - BG_YMoo++; - } - - NeedBGYInc = true; - RCRCount++; - - VPhaseCounter--; - - if(VPhaseCounter <= 0) - { - VPhase = (VPhase + 1) % VPHASE_COUNT; - switch(VPhase) - { - case VPHASE_VDS: VPhaseCounter = VDS_cache + 2; - break; - - case VPHASE_VDW: VPhaseCounter = VDW_cache + 1; - //BG_YMoo = BYR - 1; - RCRCount = 0; - burst_mode = !(CR & 0xC0); - NeedVBIRQTest = true; - NeedSATDMATest = true; - - if(!burst_mode) - { - if(sat_dma_counter > 0) - { - printf("SAT DMA cancelled???\n"); - sat_dma_counter = 0; - CheckAndCommitPending(); - } - if(DMARunning) - { - printf("DMA Running Cancelled\n"); - DMARunning = false; - CheckAndCommitPending(); - } - } - break; - - case VPHASE_VCR: VPhaseCounter = VCR_cache; - break; - - case VPHASE_VSW: VPhaseCounter = VSW_cache + 1; - MWR_cache = MWR; - VDS_cache = M_vdc_VDS; - VSW_cache = M_vdc_VSW; - VDW_cache = M_vdc_VDW; - VCR_cache = M_vdc_VCR; - //VDC_WARNING("VSW Started"); - break; - } - } - - if(VPhase == VPHASE_VDW && !burst_mode) - { - FetchSpriteData(); - } - - if((int)RCRCount == ((int)RCR - 0x40) && (CR & 0x04)) - { - VDC_DEBUG("RCR IRQ"); - status |= VDCS_RR; - IRQHook(TRUE); - } -} - -void VDC::DoVBIRQTest(void) -{ - if(CR & 0x08) - { - VDC_DEBUG("VBlank IRQ"); - status |= VDCS_VD; - IRQHook(TRUE); - } -} - -static const int Cycles_Between_RCRIRQ_And_HDWEnd = 4; - -int VDC::TimeFromHDSStartToBYRLatch(void) -{ - int ret = 1; - - if(HDS_cache > 2) - ret += ((HDS_cache + 1) * 8) - 24 + 2; - - - //printf("%d, %d\n", HDS_cache, ret); - - return(ret); -} - -int VDC::TimeFromBYRLatchToBXRLatch(void) -{ - int ret = 2; - - if(HDS_cache > 2) - ret = 1; - - return(ret); -} - -void VDC::HDS_Start(void) -{ - if(NeedRCRInc) - { - IncRCR(); - NeedRCRInc = false; - } - - if(sprite_cg_fetch_counter > 0) - { - VDC_WARNING("Sprite truncation on %d. Wanted sprites: %d, cycles needed but not left: %d\n", RCRCount, active_sprites, sprite_cg_fetch_counter); - sprite_cg_fetch_counter = 0; - CheckAndCommitPending(); - } - - HSW_cache = M_vdc_HSW; - HDS_cache = M_vdc_HDS; - HDW_cache = M_vdc_HDW; - HDE_cache = M_vdc_HDE; - - VDC_DEBUG("HDS Start! HSW: %d, HDW: %d, HDW: %d, HDE: %d\n", HSW_cache, HDS_cache, HDW_cache, HDE_cache); - - CR_cache = CR; - - HPhase = HPHASE_HDS; - HPhaseCounter = TimeFromHDSStartToBYRLatch(); -} - -int32 VDC::HSync(bool hb) -{ - if(M_vdc_EX) - { - in_exhsync = 0; - return(CalcNextEvent()); - } - in_exhsync = hb; - - if(hb) // Going into hsync - { - mystery_counter = 48; - mystery_phase = false; - } - else // Leaving hsync - { - HPhase = HPHASE_HSW; - HPhaseCounter = 8; - - //HDS_Start(); - //HPhaseCounter += 8; - - pixel_copy_count = 0; - } - - - return(CalcNextEvent()); -} - -int32 VDC::VSync(bool vb) -{ - if(M_vdc_EX >= 0x2) - { - in_exvsync = 0; - return(CalcNextEvent()); - } - in_exvsync = vb; - - //printf("VBlank: %d\n", vb); - if(vb) // Going into vsync - { - NeedRCRInc = false; - NeedBGYInc = false; -/* if(NeedRCRInc) - { - IncRCR(); - NeedRCRInc = false; - } -*/ - MWR_cache = MWR; - - VDS_cache = M_vdc_VDS; - VSW_cache = M_vdc_VSW; - VDW_cache = M_vdc_VDW; - VCR_cache = M_vdc_VCR; - - VPhase = VPHASE_VSW; - VPhaseCounter = VSW_cache + 1; - } - else // Leaving vsync - { - - } - return(CalcNextEvent()); -} - -//int32 VDC::Run(int32 clocks, bool hs, bool vs, uint16 *pixels, bool skip) -int32 VDC::Run(int32 clocks, uint16 *pixels, bool skip) -{ - //uint16 *spixels = pixels; - - //puts("Run begin"); - //fflush(stdout); - - while(clocks > 0) - { - int32 chunk_clocks = clocks; - - if(chunk_clocks > HPhaseCounter) - { - chunk_clocks = HPhaseCounter; - } - - if(sat_dma_counter > 0 && chunk_clocks > sat_dma_counter) - chunk_clocks = sat_dma_counter; - - if(sprite_cg_fetch_counter > 0 && chunk_clocks > sprite_cg_fetch_counter) - chunk_clocks = sprite_cg_fetch_counter; - - if(mystery_counter > 0 && chunk_clocks > mystery_counter) - chunk_clocks = mystery_counter; - - if(mystery_counter > 0) - { - mystery_counter -= chunk_clocks; - if(mystery_counter <= 0) - { - mystery_phase = !mystery_phase; - if(mystery_phase) - mystery_counter = 16; - else - CheckAndCommitPending(); - } - } - - if(sprite_cg_fetch_counter > 0) - { - sprite_cg_fetch_counter -= chunk_clocks; - if(sprite_cg_fetch_counter <= 0) - CheckAndCommitPending(); - } - - if(VPhase != VPHASE_VDW) - { - if(NeedSATDMATest) - { - NeedSATDMATest = false; - if(SATBPending || (DCR & 0x10)) - { - SATBPending = 0; - - sat_dma_counter = 1024; - - if(DVSSR > (VRAM_Size - 0x100)) - VDC_UNDEFINED("Unmapped VRAM DVSSR DMA read"); - - if(DVSSR < VRAM_Size) - { - uint32 len = 256; - if(DVSSR > (VRAM_Size - 0x100)) - len = VRAM_Size - DVSSR; - memcpy(SAT, &VRAM[DVSSR], len * sizeof(uint16)); - } - } - else - burst_mode = true; - } - } - - - - - if(DMAPending && burst_mode) - { - VDC_DEBUG("DMA Started"); - DMAPending = false; - DMARunning = true; - VDMA_CycleCounter = 0; - DMAReadWrite = 0; - } - - if(sat_dma_counter > 0) - RunSATDMA(chunk_clocks); - else if(DMARunning) - RunDMA(chunk_clocks); - - if(pixel_copy_count > 0) - { - if(!skip) - { - for(int i = 0; i < chunk_clocks; i++) - pixels[i] = linebuf[pixel_desu + i]; - //memcpy(pixels, linebuf + pixel_desu, chunk_clocks * sizeof(uint16)); - - if(M_vdc_TE == 0x1) - for(int i = 0; i < chunk_clocks; i++) - pixels[i] |= VDC_DISP_OUT_MASK; - } - - pixel_desu += chunk_clocks; - pixel_copy_count -= chunk_clocks; - } - else - { - uint16 pix = 0x100; - - if(M_vdc_TE == 0x1) - { - if(HPhase != HPHASE_HDS && HPhase != HPHASE_HDS_PART2 && HPhase != HPHASE_HDS_PART3) - pix |= VDC_DISP_OUT_MASK; - } - - if(HPhase == HPHASE_HSW) - { - if(M_vdc_EX >= 0x1) - pix |= VDC_HSYNC_OUT_MASK; - - if(M_vdc_TE >= 0x2) - pix |= VDC_DISP_OUT_MASK; - } - if(VPhase == VPHASE_VSW && M_vdc_EX >= 0x2) - pix |= VDC_VSYNC_OUT_MASK; - - if(!(userle & 1)) - pix |= VDC_BGDISABLE_OUT_MASK; - - if(!skip) - { - for(int i = 0; i < chunk_clocks; i++) - pixels[i] = pix; - } - } - - HPhaseCounter -= chunk_clocks; - - assert(HPhaseCounter >= 0); - - while(HPhaseCounter <= 0) - { - HPhase = (HPhase + 1) % HPHASE_COUNT; - - switch(HPhase) - { - case HPHASE_HDS: HDS_Start(); - break; - - - case HPHASE_HDS_PART2: - HPhaseCounter = TimeFromBYRLatchToBXRLatch(); - - if(NeedBGYInc && !in_exhsync) - { - NeedBGYInc = false; - - if(0 == RCRCount) - BG_YMoo = BYR; - else - BG_YMoo++; - } - BG_YOffset = BG_YMoo; - break; - - case HPHASE_HDS_PART3: - HPhaseCounter = (HDS_cache + 1) * 8 - TimeFromHDSStartToBYRLatch() - TimeFromBYRLatchToBXRLatch(); - - assert(HPhaseCounter > 0); - - BG_XOffset = BXR; - break; - - case HPHASE_HDW: - NeedRCRInc = true; - if(VPhase != VPHASE_VDW && NeedVBIRQTest) - { - DoVBIRQTest(); - NeedVBIRQTest = false; - } - CheckAndCommitPending(); - - HPhaseCounter = (HDW_cache + 1) * 8 - Cycles_Between_RCRIRQ_And_HDWEnd; - if(VPhase == VPHASE_VDW) - { - if(!burst_mode) - { - pixel_desu = 0; - pixel_copy_count = (HDW_cache + 1) * 8; - - // BG off, sprite on: fill = 0x100. bg off, sprite off: fill = 0x000 - if(!(CR_cache & 0x80)) - { - uint16 fill_val; - - if(!(CR_cache & 0xC0)) // Sprites and BG off - fill_val = 0x000; - else // Only BG off - fill_val = 0x100 | ((userle & ULE_BG) ? 0 : VDC_BGDISABLE_OUT_MASK); - - if(!(userle & ULE_BG)) - fill_val |= VDC_BGDISABLE_OUT_MASK; - - for(int i = 0; i < pixel_copy_count; i++) - linebuf[i] = fill_val; - } - - if(!skip) - if(CR_cache & 0x80) - { - DrawBG(linebuf, userle & ULE_BG); - } - //printf("%d %02x %02x\n", RCRCount, CR, CR_cache); - if(CR_cache & 0x40) - DrawSprites(linebuf, (userle & ULE_SPR) && !skip); - } - } - break; - - case HPHASE_HDW_FINAL: - if(NeedRCRInc) - { - IncRCR(); - NeedRCRInc = false; - } - HPhaseCounter = Cycles_Between_RCRIRQ_And_HDWEnd; - break; - - case HPHASE_HDE: //if(!burst_mode) //if(VPhase == VPHASE_VDW) //if(!burst_mode) - // lastats = 16; // + 16; - //else - // lastats = 16; - HPhaseCounter = (HDE_cache + 1) * 8; - break; - - case HPHASE_HSW: HPhaseCounter = (HSW_cache + 1) * 8; break; - } - } - pixels += chunk_clocks; - clocks -= chunk_clocks; - } - - //puts("Run end"); - //fflush(stdout); - - return(CalcNextEvent()); -} - - -void VDC::CalcWidthStartEnd(uint32 &display_width, uint32 &start, uint32 &end) -{ - display_width = (M_vdc_HDW + 1) * 8; - - start = 0; - end = start + display_width; -} - -void VDC::DrawBG(uint16 *target, int enabled) -{ - uint32 width; - uint32 start; - uint32 end; - int bat_width = bat_width_tab[(MWR_cache >> 4) & 3]; - int bat_width_mask = bat_width - 1; - int bat_width_shift = bat_width_shift_tab[(MWR_cache >> 4) & 3]; - int bat_height_mask = bat_height_tab[(MWR_cache >> 6) & 1] - 1; - - CalcWidthStartEnd(width, start, end); - - if(!enabled) - { - for(uint32 x = start; x < end; x++) - target[x] = 0x000 | VDC_BGDISABLE_OUT_MASK; - return; - } - - { - int bat_y = ((BG_YOffset >> 3) & bat_height_mask) << bat_width_shift; - uint32 first_end = start + 8 - (BG_XOffset & 7); - uint32 dohmask = 0xFFFFFFFF; - - if((MWR_cache & 0x3) == 0x3) - { - if(MWR_cache & 0x80) - dohmask = 0xCCCCCCCC; - else - dohmask = 0x33333333; - } - - // Draw the first pixels of the first tile, depending on the lower 3 bits of the xscroll/xoffset register, to - // we can render the rest of the line in 8x1 chunks, which is faster. - for(uint32 x = start; x < first_end; x++) - { - int bat_x = (BG_XOffset >> 3) & bat_width_mask; - uint16 bat = VRAM[bat_x | bat_y]; - const uint8 pal_or = ((bat >> 8) & 0xF0); - int palette_index = ((bat >> 12) & 0x0F) << 4; - uint32 raw_pixel; - - raw_pixel = bg_tile_cache[bat & 0xFFF][BG_YOffset & 7][BG_XOffset & 0x7] & dohmask; - target[x] = palette_index | raw_pixel | pal_or; - - if((bat & 0xFFF) > VRAM_BGTileNoMask) - VDC_UNDEFINED("Unmapped BG tile read"); - - BG_XOffset++; - } - - int bat_boom = (BG_XOffset >> 3) & bat_width_mask; - int line_sub = BG_YOffset & 7; - - if((MWR_cache & 0x3) == 0x3) - { - for(uint32 x = first_end; x < end; x+=8) - { - const uint16 bat = VRAM[bat_boom | bat_y]; - const uint8 pal_or = ((bat >> 8) & 0xF0); - uint8 *pix_lut = bg_tile_cache[bat & 0xFFF][line_sub]; - - if((bat & 0xFFF) > VRAM_BGTileNoMask) - VDC_UNDEFINED("Unmapped BG tile read"); - - - (target + 0)[x] = (pix_lut[0] & dohmask) | pal_or; - (target + 1)[x] = (pix_lut[1] & dohmask) | pal_or; - (target + 2)[x] = (pix_lut[2] & dohmask) | pal_or; - (target + 3)[x] = (pix_lut[3] & dohmask) | pal_or; - (target + 4)[x] = (pix_lut[4] & dohmask) | pal_or; - (target + 5)[x] = (pix_lut[5] & dohmask) | pal_or; - (target + 6)[x] = (pix_lut[6] & dohmask) | pal_or; - (target + 7)[x] = (pix_lut[7] & dohmask) | pal_or; - - bat_boom = (bat_boom + 1) & bat_width_mask; - BG_XOffset++; - - } - } - else - for(uint32 x = first_end; x < end; x+=8) // This will draw past the right side of the buffer, but since our pitch is 1024, and max width is ~512, we're safe. Also, - // any overflow that is on the visible screen are will be hidden by the overscan color code below this code. - { - const uint16 bat = VRAM[bat_boom | bat_y]; - const uint8 pal_or = ((bat >> 8) & 0xF0); - uint8 *pix_lut = bg_tile_cache[bat & 0xFFF][line_sub]; - - if((bat & 0xFFF) > VRAM_BGTileNoMask) - VDC_UNDEFINED("Unmapped BG tile read"); - - (target + 0)[x] = pix_lut[0] | pal_or; - (target + 1)[x] = pix_lut[1] | pal_or; - (target + 2)[x] = pix_lut[2] | pal_or; - (target + 3)[x] = pix_lut[3] | pal_or; - (target + 4)[x] = pix_lut[4] | pal_or; - (target + 5)[x] = pix_lut[5] | pal_or; - (target + 6)[x] = pix_lut[6] | pal_or; - (target + 7)[x] = pix_lut[7] | pal_or; - - bat_boom = (bat_boom + 1) & bat_width_mask; - BG_XOffset++; - } - } -} - -#define SPRF_PRIORITY 0x00080 -#define SPRF_HFLIP 0x00800 -#define SPRF_VFLIP 0x08000 -#define SPRF_SPRITE0 0x10000 - -static const unsigned int sprite_height_tab[4] = { 16, 32, 64, 64 }; -static const unsigned int sprite_height_no_mask[4] = { ~0U, ~2U, ~6U, ~6U }; -static const unsigned int sprite_width_tab[2] = { 16, 32 }; - -void VDC::FetchSpriteData(void) -{ - active_sprites = 0; - - // First, grab the up to 16 sprites. - for(int i = 0; i < 64; i++) - { - int16 y = (SAT[i * 4 + 0] & 0x3FF) - 0x40; - uint16 x = (SAT[i * 4 + 1] & 0x3FF); - uint16 no = (SAT[i * 4 + 2] >> 1) & 0x3FF; // Todo, cg mode bit - uint16 flags = (SAT[i * 4 + 3]); - - uint32 palette_index = (flags & 0xF) << 4; - uint32 height = sprite_height_tab[(flags >> 12) & 3]; - uint32 width = sprite_width_tab[(flags >> 8) & 1]; - - if((int32)RCRCount >= y && (int32)RCRCount < (int32)(y + height)) - { - bool second_half = 0; - uint32 y_offset = RCRCount - y; - if(y_offset > height) continue; - - - breepbreep: - - if(active_sprites == 16) - { - if(CR & 0x2) - { - status |= VDCS_OR; - IRQHook(TRUE); - VDC_DEBUG("Overflow IRQ"); - } - if(!unlimited_sprites) - break; - } - - - { - if(flags & SPRF_VFLIP) - y_offset = height - 1 - y_offset; - - no &= sprite_height_no_mask[(flags >> 12) & 3]; - no |= (y_offset & 0x30) >> 3; - if(width == 32) no &= ~1; - if(second_half) - no |= 1; - - SpriteList[active_sprites].flags = flags; - - if(flags & SPRF_HFLIP && width == 32) - no ^= 1; - //printf("Found: %d %d\n", RCRCount, x); - SpriteList[active_sprites].x = x; - SpriteList[active_sprites].palette_index = palette_index; - - if((no * 64) >= VRAM_Size) - VDC_UNDEFINED("Unmapped VRAM sprite tile read"); - - if((MWR_cache & 0xC) == 4) - { - if(SAT[i * 4 + 2] & 1) - { - SpriteList[active_sprites].pattern_data[0] = VRAM[no * 64 + (y_offset & 15) + 32]; - SpriteList[active_sprites].pattern_data[1] = VRAM[no * 64 + (y_offset & 15) + 48]; - SpriteList[active_sprites].pattern_data[2] = 0; - SpriteList[active_sprites].pattern_data[3] = 0; - } - else - { - SpriteList[active_sprites].pattern_data[0] = VRAM[no * 64 + (y_offset & 15) ]; - SpriteList[active_sprites].pattern_data[1] = VRAM[no * 64 + (y_offset & 15) + 16]; - SpriteList[active_sprites].pattern_data[2] = 0; - SpriteList[active_sprites].pattern_data[3] = 0; - } - } - else - { - SpriteList[active_sprites].pattern_data[0] = VRAM[no * 64 + (y_offset & 15) ]; - SpriteList[active_sprites].pattern_data[1] = VRAM[no * 64 + (y_offset & 15) + 16]; - SpriteList[active_sprites].pattern_data[2] = VRAM[no * 64 + (y_offset & 15) + 32]; - SpriteList[active_sprites].pattern_data[3] = VRAM[no * 64 + (y_offset & 15) + 48]; - } - - SpriteList[active_sprites].flags |= i ? 0 : SPRF_SPRITE0; - - active_sprites++; - - if(width == 32 && !second_half) - { - second_half = 1; - x += 16; - y_offset = RCRCount - y; // Fix the y offset so that sprites that are hflipped + vflipped display properly - goto breepbreep; - } - } - } - } - - sprite_cg_fetch_counter = ((active_sprites < 16) ? active_sprites : 16) * 4; -} - -void VDC::DrawSprites(uint16 *target, int enabled) -{ - alignas(16) uint16 sprite_line_buf[1024]; - - uint32 display_width, start, end; - - CalcWidthStartEnd(display_width, start, end); - - for(unsigned int i = start; i < end; i++) - sprite_line_buf[i] = 0; - - for(int i = (active_sprites - 1) ; i >= 0; i--) - { - int32 pos = SpriteList[i].x - 0x20 + start; - uint32 prio_or = 0; - - if(SpriteList[i].flags & SPRF_PRIORITY) - prio_or = 0x200; - - if((SpriteList[i].flags & SPRF_SPRITE0) && (CR & 0x01)) - { - for(uint32 x = 0; x < 16; x++) - { - uint32 raw_pixel; - uint32 pi = SpriteList[i].palette_index; - uint32 rev_x = 15 - x; - - if(SpriteList[i].flags & SPRF_HFLIP) - rev_x = x; - - raw_pixel = (SpriteList[i].pattern_data[0] >> rev_x) & 1; - raw_pixel |= ((SpriteList[i].pattern_data[1] >> rev_x) & 1) << 1; - raw_pixel |= ((SpriteList[i].pattern_data[2] >> rev_x) & 1) << 2; - raw_pixel |= ((SpriteList[i].pattern_data[3] >> rev_x) & 1) << 3; - - if(raw_pixel) - { - pi |= 0x100; - uint32 tx = pos + x; - - if(tx >= end) // Covers negative and overflowing the right side. - continue; - - if(sprite_line_buf[tx] & 0xF) - { - status |= VDCS_CR; - VDC_DEBUG("Sprite hit IRQ"); - IRQHook(TRUE); - } - sprite_line_buf[tx] = pi | raw_pixel | prio_or; - } - } - } // End sprite hit loop - else - { - for(uint32 x = 0; x < 16; x++) - { - uint32 raw_pixel; - uint32 pi = SpriteList[i].palette_index; - uint32 rev_x = 15 - x; - - if(SpriteList[i].flags & SPRF_HFLIP) - rev_x = x; - - raw_pixel = (SpriteList[i].pattern_data[0] >> rev_x) & 1; - raw_pixel |= ((SpriteList[i].pattern_data[1] >> rev_x) & 1) << 1; - raw_pixel |= ((SpriteList[i].pattern_data[2] >> rev_x) & 1) << 2; - raw_pixel |= ((SpriteList[i].pattern_data[3] >> rev_x) & 1) << 3; - - if(raw_pixel) - { - pi |= 0x100; - uint32 tx = pos + x; - - if(tx >= end) // Covers negative and overflowing the right side. - continue; - sprite_line_buf[tx] = pi | raw_pixel | prio_or; - } - } - } // End non-sprite-hit loop - } - - if(enabled) - { - for(unsigned int x = start; x < end; x++) - { - if(sprite_line_buf[x] & 0x0F) - { - if(!(target[x] & 0x0F) || (sprite_line_buf[x] & 0x200)) - target[x] = sprite_line_buf[x] & 0x1FF; - } - } - } - active_sprites = 0; -} - -/* - Caution: If we ever add something to Write() or Read() that will affect the timing of the next event, make sure - to set the passed-by-reference next_event BEFORE calling this function, or otherwise re-engineer this convoluted setup. -*/ -void VDC::DoWaitStates(void) -{ - //bool did_wait = VDC_IS_BSY; - - while(VDC_IS_BSY) - { - //int32 to_wait = CalcNextEvent(); - //if(!WSHook || !WSHook(to_wait)) - if(!WSHook || !WSHook(-1)) // Event-counter-based wait-stating - { - if(DMARunning) - { - VDC_WARNING("VRAM DMA completion forced."); - RunDMA(0, TRUE); - } - - if(sat_dma_counter > 0) - { - VDC_WARNING("SAT DMA completion forced."); - RunSATDMA(0, TRUE); - } - - if(mystery_phase) - { - bool backup_mystery_phase = mystery_phase; - mystery_phase = false; - CheckAndCommitPending(); - mystery_phase = backup_mystery_phase; - } - - break; - } - } - - //if(did_wait) - // printf("End of wait stating: %d %d\n", VDMA_CycleCounter, sat_dma_counter); - - assert(!pending_read); - assert(!pending_write); -} - -uint8 VDC::Read(uint32 A, int32 &next_event, bool peek) -{ - uint8 ret = 0; - int msb = A & 1; - - A &= 0x3; - - switch(A) - { - case 0x0: ret = status | (VDC_IS_BSY ? 0x40 : 0x00); - - if(!peek) - { - status &= ~0x3F; - IRQHook(FALSE); - } - break; - - case 0x2: - case 0x3: - if(!peek) - { - // Should we only wait on MSB reads... - DoWaitStates(); - } - - ret = VDC_REGGETP(read_buffer, msb); - - if(select == 0x2) // VRR - VRAM Read Register - { - if(msb) - { - if(!peek) - { - pending_read = TRUE; - pending_read_addr = MARR; - MARR += vram_inc_tab[(CR >> 11) & 0x3]; - - CheckAndCommitPending(); - } - } - } - break; - } - - return(ret); -} - -uint16 VDC::Read16(bool A, bool peek) -{ - uint16 ret = 0; - - if(!A) - { - ret = status | (VDC_IS_BSY ? 0x40 : 0x00); - - if(!peek) - { - status &= ~0x3F; - IRQHook(FALSE); - } - } - else - { - if(!peek) - DoWaitStates(); - - ret = read_buffer; - - if(select == 0x2) // VRR - VRAM Read Register - { - if(!peek) - { - pending_read = TRUE; - pending_read_addr = MARR; - MARR += vram_inc_tab[(CR >> 11) & 0x3]; - - CheckAndCommitPending(); - } - } - } - - return(ret); -} - - -void VDC::CheckAndCommitPending(void) -{ - if(sat_dma_counter <= 0 && !DMARunning /* && sprite_cg_fetch_counter <= 0*/ && !mystery_phase) - { - if(pending_write) - { - if(pending_write_addr < VRAM_Size) - { - VRAM[pending_write_addr] = pending_write_latch; - FixTileCache(pending_write_addr); - } - //else - // VDC_UNDEFINED("Unmapped VRAM write"); - - pending_write = FALSE; - } - - if(pending_read) - { - if(pending_read_addr >= VRAM_Size) - VDC_UNDEFINED("Unmapped VRAM VRR read"); - - read_buffer = VRAM[pending_read_addr]; - pending_read = FALSE; - } - } -} - - -void VDC::Write(uint32 A, uint8 V, int32 &next_event) -{ - int msb = A & 1; - - A &= 0x3; - - //if((A == 0x2 || A == 0x3) && (select >= 0xF && select <= 0x12)) - //if((A == 2 || A == 3) && select != 2) - // printf("VDC Write(RCRCount=%d): A=%02x, Select=%02x, V=%02x\n", RCRCount, A, select, V); - - switch(A) - { - case 0x0: select = V & 0x1F; - break; - - case 0x2: - case 0x3: - //if((select & 0x1F) >= 0x9 && (select & 0x1F) <= 0x1F) - // VDC_DEBUG("%02x %d, %02x", select & 0x1F, msb, V); - - switch(select & 0x1F) - { - case 0x00: VDC_REGSETP(MAWR, V, msb); - break; - - case 0x01: VDC_REGSETP(MARR, V, msb); - if(msb) - { - DoWaitStates(); - - pending_read = TRUE; - pending_read_addr = MARR; - MARR += vram_inc_tab[(CR >> 11) & 0x3]; - - CheckAndCommitPending(); - } - break; - - case 0x02: if(!msb) - { - write_latch = V; - } - else - { - // We must call CommitPendingWrite at the end of SAT/VRAM DMA for this to work! - DoWaitStates(); - - pending_write = TRUE; - pending_write_addr = MAWR; - pending_write_latch = write_latch | (V << 8); - MAWR += vram_inc_tab[(CR >> 11) & 0x3]; - - CheckAndCommitPending(); - } - break; - - case 0x05: VDC_REGSETP(CR, V, msb); - //printf("CR: %04x, %d\n", CR, msb); - break; - - case 0x06: VDC_REGSETP(RCR, V, msb); - RCR &= 0x3FF; - break; - - case 0x07: VDC_REGSETP(BXR, V, msb); - BXR &= 0x3FF; - //VDC_DEBUG("BXR Set"); - break; - - case 0x08: VDC_REGSETP(BYR, V, msb); - BYR &= 0x1FF; - BG_YMoo = BYR; // Set it on LSB and MSB writes(only changing on MSB breaks Youkai Douchuuki) - //VDC_DEBUG("BYR Set"); - break; - - case 0x09: VDC_REGSETP(MWR, V, msb); break; - case 0x0a: VDC_REGSETP(HSR, V, msb); break; - case 0x0b: VDC_REGSETP(HDR, V, msb); break; - case 0x0c: VDC_REGSETP(VSR, V, msb); break; - case 0x0d: VDC_REGSETP(VDR, V, msb); break; - case 0x0e: VDC_REGSETP(VCR, V, msb); break; - case 0x0f: VDC_REGSETP(DCR, V, msb); - if(DMARunning) - { - VDC_UNDEFINED("Set DCR during DMA: %04x\n", DCR); - } - - if(DMAPending) - { - VDC_UNDEFINED("Set DCR while DMAPending: %04x\n", DCR); - } - - break; - - case 0x10: VDC_REGSETP(SOUR, V, msb); - if(DMARunning) - { - VDC_UNDEFINED("Set SOUR during DMA: %04x\n", SOUR); - } - - if(DMAPending) - { - VDC_UNDEFINED("Set SOUR while DMAPending: %04x\n", SOUR); - } - break; - - case 0x11: VDC_REGSETP(DESR, V, msb); - if(DMARunning) - { - VDC_UNDEFINED("Set DESR during DMA: %04x\n", DESR); - } - if(DMAPending) - { - VDC_UNDEFINED("Set DESR while DMAPending: %04x\n", DESR); - } - break; - - case 0x12: VDC_REGSETP(LENR, V, msb); - if(DMARunning) - { - VDC_UNDEFINED("Set LENR during DMA: %04x\n", LENR); - } - - if(DMAPending) - { - VDC_UNDEFINED("Set LENR while DMAPending: %04x\n", LENR); - } - - if(msb) - { - VDC_DEBUG("DMA: %04x %04x %04x, %02x", SOUR, DESR, LENR, DCR); - DMAPending = 1; - } - break; - - case 0x13: VDC_REGSETP(DVSSR, V, msb); - SATBPending = 1; - break; - - default: VDC_WARNING("Unknown VDC register write: %04x %02x", select, V); - break; - } - break; - } -} - - -void VDC::Write16(bool A, uint16 V) -{ - if(!A) - select = V & 0x1F; - else - { - switch(select & 0x1F) - { - case 0x00: MAWR = V; - break; - - - case 0x01: MARR = V; - - DoWaitStates(); - - pending_read = TRUE; - pending_read_addr = MARR; - - MARR += vram_inc_tab[(CR >> 11) & 0x3]; - - CheckAndCommitPending(); - break; - - - case 0x02: // We must call CommitPendingWrite at the end of SAT/VRAM DMA for this to work! - DoWaitStates(); - - pending_write = TRUE; - pending_write_addr = MAWR; - pending_write_latch = V; - MAWR += vram_inc_tab[(CR >> 11) & 0x3]; - - CheckAndCommitPending(); - break; - - case 0x05: CR = V; - break; - - case 0x06: RCR = V & 0x3FF; - break; - - case 0x07: BXR = V & 0x3FF; - //VDC_DEBUG("BXR Set"); - break; - - case 0x08: BYR = V & 0x1FF; - BG_YMoo = BYR; - //VDC_DEBUG("BYR Set"); - break; - - case 0x09: MWR = V; break; - case 0x0a: HSR = V; break; - case 0x0b: HDR = V; break; - case 0x0c: VSR = V; break; - case 0x0d: VDR = V; break; - case 0x0e: VCR = V; break; - - case 0x0f: DCR = V; - if(DMARunning) - { - VDC_UNDEFINED("Set DCR during DMA: %04x\n", DCR); - } - - if(DMAPending) - { - VDC_UNDEFINED("Set DCR while DMAPending: %04x\n", DCR); - } - - break; - - case 0x10: SOUR = V; - if(DMARunning) - { - VDC_UNDEFINED("Set SOUR during DMA: %04x\n", SOUR); - } - - if(DMAPending) - { - VDC_UNDEFINED("Set SOUR while DMAPending: %04x\n", SOUR); - } - break; - - case 0x11: DESR = V; - if(DMARunning) - { - VDC_UNDEFINED("Set DESR during DMA: %04x\n", DESR); - } - if(DMAPending) - { - VDC_UNDEFINED("Set DESR while DMAPending: %04x\n", DESR); - } - break; - - case 0x12: LENR = V; - if(DMARunning) - { - VDC_UNDEFINED("Set LENR during DMA: %04x\n", LENR); - } - - if(DMAPending) - { - VDC_UNDEFINED("Set LENR while DMAPending: %04x\n", LENR); - } - - VDC_DEBUG("DMA: %04x %04x %04x, %02x", SOUR, DESR, LENR, DCR); - - DMAPending = 1; - break; - - case 0x13: DVSSR = V; - SATBPending = 1; - break; - - default: VDC_WARNING("Oops 2: %04x %02x", select, V); - break; - } - } - -} - - - -int32 VDC::Reset(void) -{ - memset(VRAM, 0, sizeof(VRAM)); - memset(SAT, 0, sizeof(SAT)); - memset(SpriteList, 0, sizeof(SpriteList)); - - for(uint32 A = 0; A < 65536; A += 16) - FixTileCache(A); - - pending_read = false; - pending_read_addr = 0xFFFF; - read_buffer = 0xFFFF; - write_latch = 0; - - pending_write = false; - pending_write_addr = 0xFFFF; - pending_write_latch = 0xFFFF; - - status = 0; - - HSR = 0; - HDR = 0; - VSR = 0; - VDR = 0; - VCR = 0; - - HSW_cache = M_vdc_HSW; - HDS_cache = M_vdc_HDS; - HDW_cache = M_vdc_HDW; - HDE_cache = M_vdc_HDE; - - VDS_cache = M_vdc_VDS; - VSW_cache = M_vdc_VSW; - VDW_cache = M_vdc_VDW; - VCR_cache = M_vdc_VCR; - - - - MAWR = 0; - MARR = 0; - - CR = CR_cache = 0; - RCR = 0; - BXR = 0; - BYR = 0; - MWR = 0; - MWR_cache = 0; - - DCR = 0; - SOUR = 0; - DESR = 0; - LENR = 0; - DVSSR = 0; - - VDMA_CycleCounter = 0; - - RCRCount = 0; - - DMAReadBuffer = 0; - DMAReadWrite = 0; - DMARunning = 0; - DMAPending = 0; - SATBPending = 0; - burst_mode = 0; - - BG_XOffset = 0; - BG_YOffset = 0; - BG_YMoo = 0; - - sat_dma_counter = 0; - select = 0; - - pixel_copy_count = 0; - - - NeedRCRInc = false; - NeedVBIRQTest = false; - NeedSATDMATest = false; - NeedBGYInc = false; - - HPhase = 0; - VPhase = 0; - HPhaseCounter = 1; - VPhaseCounter = 1; - - sprite_cg_fetch_counter = 0; - - mystery_counter = 0; - mystery_phase = false; - - pixel_desu = 0; - pixel_copy_count = 0; - active_sprites = 0; - - return(CalcNextEvent()); -} - -VDC::VDC() -{ - SetUnlimitedSprites(false); - SetVRAMSize(65536); - userle = ~0; - - WSHook = NULL; - IRQHook = NULL; - - in_exhsync = false; - in_exvsync = false; -} - -void VDC::SetUnlimitedSprites(const bool nospritelimit) -{ - unlimited_sprites = nospritelimit; -} - -void VDC::SetVRAMSize(const uint32 par_VRAM_Size) -{ - //const uint32 old_VRAM_Size; - - assert(par_VRAM_Size == round_up_pow2(par_VRAM_Size)); - assert(par_VRAM_Size >= 16 && par_VRAM_Size <= 65536); - - VRAM_Size = par_VRAM_Size; - VRAM_SizeMask = VRAM_Size - 1; - VRAM_BGTileNoMask = VRAM_SizeMask / 16; - - // for(uint32 A = std::min(old_VRAM_Size, par_VRAM_Size); A < 65536; A += 16) - // FixTileCache(A); -} - -VDC::~VDC() -{ - -} - -#ifdef WANT_DEBUGGER -bool VDC::DoGfxDecode(uint32 *target, const uint32 *color_table, const uint32 TransparentColor, bool DecodeSprites, - int32 w, int32 h, int32 scroll) -{ - const uint32 *palette_ptr = color_table; - - if(DecodeSprites) - { - for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x += 16) - { - int which_tile = (x / 16) + (scroll + (y / 16)) * (w / 16); - - if(which_tile >= VRAM_Size / 64) - { - for(int sx = 0; sx < 16; sx++) - { - target[x + sx] = TransparentColor; - target[x + w * 1 + sx] = 0; - target[x + w * 2 + sx] = 0; - } - continue; - } - - uint16 cg[4]; - cg[0] = VRAM[which_tile * 64 + (y & 15)]; - cg[1] = VRAM[which_tile * 64 + (y & 15) + 16]; - cg[2] = VRAM[which_tile * 64 + (y & 15) + 32]; - cg[3] = VRAM[which_tile * 64 + (y & 15) + 48]; - for(int sx = 0; sx < 16; sx++) - { - int rev_sx = 15 - sx; - target[x + sx] = palette_ptr[(((cg[0] >> rev_sx) & 1) << 0) | - (((cg[1] >> rev_sx) & 1) << 1) | (((cg[2] >> rev_sx) & 1) << 2) | (((cg[3] >> rev_sx) & 1) << 3)]; - target[x + w * 1 + sx] = which_tile; - target[x + w * 2 + sx] = which_tile * 64; - } - } - target += w * 3; - } - } - else for(int y = 0; y < h; y++) - { - for(int x = 0; x < w; x+=8) - { - int which_tile = (x / 8) + (scroll + (y / 8)) * (w / 8); - - if(which_tile >= (VRAM_Size / 16)) - { - for(int sx = 0; sx < 8; sx++) - { - target[x + sx] = TransparentColor; - target[x + w * 1 + sx] = 0; - target[x + w * 2 + sx] = 0; - } - continue; - } - - target[x + 0] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][0]]; - target[x + 1] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][1]]; - target[x + 2] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][2]]; - target[x + 3] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][3]]; - target[x + 4] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][4]]; - target[x + 5] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][5]]; - target[x + 6] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][6]]; - target[x + 7] = palette_ptr[ bg_tile_cache[which_tile][y & 0x7][7]]; - - target[x + w*1 + 0]=target[x + w*1 + 1]=target[x + w*1 + 2]=target[x + w*1 + 3] = - target[x + w*1 + 4]=target[x + w*1 + 5]=target[x + w*1 + 6]=target[x + w*1 + 7] = which_tile; - - target[x + w*2 + 0]=target[x + w*2 + 1]=target[x + w*2 + 2]=target[x + w*2 + 3] = - target[x + w*2 + 4]=target[x + w*2 + 5]=target[x + w*2 + 6]=target[x + w*2 + 7] = which_tile * 16; - } - target += w * 3; - } - - return(1); -} -#endif - diff --git a/waterbox/pcfx/huc6270/vdc.h b/waterbox/pcfx/huc6270/vdc.h deleted file mode 100644 index 28a6895cba..0000000000 --- a/waterbox/pcfx/huc6270/vdc.h +++ /dev/null @@ -1,530 +0,0 @@ -#ifndef __PCE_VDC_H -#define __PCE_VDC_H - -#define VDC_PIXEL_OUT_MASK 0x01FF - -// This bit will be set for a non-sprite pixel if the BG layer is disabled(via ToggleLayer()), -#define VDC_BGDISABLE_OUT_MASK 0x0200 - -// HSync and VSync out bits are only valid when the EX bits in VDC's CR -// are set so that the VDC will output sync signals rather than -// input them. If it is not configured in this manner, the bit(s) shall always be 0. -#define VDC_HSYNC_OUT_MASK 0x2000 -#define VDC_VSYNC_OUT_MASK 0x4000 - -// The DISP bit can either denote active display area(1 = active, 0 = inactive), -// colorburst insertion period(0 = insert colorburst, 1 = not in colorburst period; may not be emulated correctly), -// or "internal horizontal synchronous signal"(may not be emulated correctly), depending on the TE -// bits in the VDC's CR. -#define VDC_DISP_OUT_MASK 0x8000 - -#define VDC_REGSETP(_reg, _data, _msb) \ - { \ - _reg &= 0xFF << ((_msb) ? 0 : 8); \ - _reg |= (_data) << ((_msb) ? 8 : 0); \ - } -#define VDC_REGGETP(_reg, _msb) ((_reg >> ((_msb) ? 8 : 0)) & 0xFF) - -static const unsigned int vram_inc_tab[4] = {1, 32, 64, 128}; - -#define VDC_IS_BSY (pending_read || pending_write) - -typedef struct -{ - uint32 x; - uint32 flags; - uint8 palette_index; - uint16 pattern_data[4]; -} SPRLE; - -typedef struct -{ - // In the case the VDC access doesn't cause a VRAM read/write, only ReadCount/WriteCount will be set to 0. - uint32 ReadStart; - uint32 ReadCount; - uint32 WriteStart; - uint32 WriteCount; - - uint32 RegRWIndex; - bool RegWriteDone; - bool RegReadDone; -} VDC_SimulateResult; - -class VDC -{ - public: - VDC() - MDFN_COLD; - ~VDC() MDFN_COLD; - - // Default false. - void SetUnlimitedSprites(const bool nospritelimit); - - // The VRAM size is specified in 16-bit words. Default 65536. - // Reset() should be called after changing this setting, otherwise things may be broken. - void SetVRAMSize(const uint32 par_VRAM_size); - - int32 Reset(void) MDFN_WARN_UNUSED_RESULT; - - // ResetSimulate(), SimulateWrite(), and SimulateRead() are intended to handle VRAM read/write breakpoints. - // SimulateWrite() and SimulateRead() will return the VRAM address that will EVENTUALLY be written(upper 32-bits) and/or read(lower 32-bits) to - // due to the access, or 0xFFFFFFFF in the upper or lower 32-bits if no VRAM access of that type occurs. - // - // The feature is intended to support block moves to VRAM in a single instruction. It may not function properly if the address passed to SimulateRead() - // or SimulateWrite() alternates(even if just once) between the data port high byte and control port between calls to ResetSimulate() - // Call to reset simulation state. - - INLINE void ResetSimulate(void) - { - Simulate_MAWR = MAWR; - Simulate_MARR = MARR; - - Simulate_select = select; - Simulate_CR = CR; - - Simulate_LENR = LENR; - } - - INLINE void SimulateRead(uint32 A, VDC_SimulateResult *result) - { - result->ReadCount = 0; - result->WriteCount = 0; - result->RegReadDone = false; - result->RegWriteDone = false; - - if (A & 0x2) - { - result->RegReadDone = true; - result->RegRWIndex = Simulate_select; - } - - if ((A & 0x3) == 0x3 && Simulate_select == 0x02) - { - Simulate_MARR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; - - result->ReadStart = Simulate_MARR; - result->ReadCount = 1; - } - } - - INLINE void SimulateWrite(uint32 A, uint8 V, VDC_SimulateResult *result) - { - result->ReadCount = 0; - result->WriteCount = 0; - result->RegReadDone = false; - result->RegWriteDone = false; - - const unsigned int msb = A & 1; - - switch (A & 0x3) - { - case 0x00: - Simulate_select = V & 0x1F; - break; - - case 0x02: - case 0x03: - result->RegWriteDone = true; - result->RegRWIndex = Simulate_select; - - switch (Simulate_select) - { - case 0x00: - VDC_REGSETP(Simulate_MAWR, V, msb); - break; - - case 0x01: - VDC_REGSETP(Simulate_MARR, V, msb); - Simulate_MARR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; - - result->ReadStart = Simulate_MARR; - result->ReadCount = 1; - break; - - case 0x02: - if (msb) - { - result->WriteStart = Simulate_MAWR; - result->WriteCount = 1; - - Simulate_MAWR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; - } - break; - - case 0x12: - VDC_REGSETP(Simulate_LENR, V, msb); - if (msb) - { - result->ReadStart = SOUR; - result->ReadCount = Simulate_LENR + 1; - - if (DCR & 0x4) - result->ReadStart = (result->ReadStart - (result->ReadCount - 1)) & 0xFFFF; - - result->WriteStart = DESR; - result->WriteCount = Simulate_LENR + 1; - - if (DCR & 0x8) - result->WriteStart = (result->WriteStart - (result->WriteCount - 1)) & 0xFFFF; - } - break; - } - break; - } - } - - INLINE void SimulateRead16(bool A, VDC_SimulateResult *result) - { - result->ReadCount = 0; - result->WriteCount = 0; - result->RegReadDone = false; - result->RegWriteDone = false; - - if (A & 0x2) - { - result->RegReadDone = true; - result->RegRWIndex = Simulate_select; - } - - if (A && Simulate_select == 0x02) - { - Simulate_MARR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; - - result->ReadStart = Simulate_MARR; - result->ReadCount = 1; - } - } - - INLINE void SimulateWrite16(bool A, uint16 V, VDC_SimulateResult *result) - { - result->ReadCount = 0; - result->WriteCount = 0; - result->RegReadDone = false; - result->RegWriteDone = false; - - if (!A) - Simulate_select = V & 0x1F; - else - { - result->RegWriteDone = true; - result->RegRWIndex = Simulate_select; - - switch (Simulate_select) - { - case 0x00: - Simulate_MAWR = V; - break; - - case 0x01: - Simulate_MARR = V; - Simulate_MARR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; - - result->ReadStart = Simulate_MARR; - result->ReadCount = 1; - break; - - case 0x02: - result->WriteStart = Simulate_MAWR; - result->WriteCount = 1; - - Simulate_MAWR += vram_inc_tab[(Simulate_CR >> 11) & 0x3]; - break; - - case 0x12: - Simulate_LENR = V; - result->ReadStart = SOUR; - result->ReadCount = Simulate_LENR + 1; - - if (DCR & 0x4) - result->ReadStart = (result->ReadStart - (result->ReadCount - 1)) & 0xFFFF; - - result->WriteStart = DESR; - result->WriteCount = Simulate_LENR + 1; - - if (DCR & 0x8) - result->WriteStart = (result->WriteStart - (result->WriteCount - 1)) & 0xFFFF; - break; - } - } - } - - int32 HSync(bool); - int32 VSync(bool); - - void Write(uint32 A, uint8 V, int32 &next_event); - uint8 Read(uint32 A, int32 &next_event, bool peek = FALSE); - - void Write16(bool A, uint16 V); - uint16 Read16(bool A, bool peek = FALSE); - - int32 Run(int32 clocks, /*bool hs, bool vs,*/ uint16 *pixels, bool skip); - - void FixTileCache(uint16); - void SetLayerEnableMask(uint64 mask); - - void RunDMA(int32, bool force_completion = FALSE); - void RunSATDMA(int32, bool force_completion = FALSE); - - void IncRCR(void); - void DoVBIRQTest(void); - void HDS_Start(void); - - // Peek(VRAM/SAT) and Poke(VRAM/SAT) work in 16-bit VRAM word units. - INLINE uint16 PeekVRAM(uint16 Address) - { - if (Address < VRAM_Size) - return (VRAM[Address]); - else - return (0); - } - - INLINE uint16 PeekSAT(uint8 Address) - { - return (SAT[Address]); - } - - INLINE void PokeVRAM(uint16 Address, const uint16 Data) - { - if (Address < VRAM_Size) - { - VRAM[Address] = Data; - FixTileCache(Address); - } - } - - INLINE void PokeSAT(uint8 Address, const uint16 Data) - { - SAT[Address] = Data; - } - - // Register enums for GetRegister() and SetRegister() - enum - { - GSREG_MAWR = 0, - GSREG_MARR, - GSREG_CR, - GSREG_RCR, - GSREG_BXR, - GSREG_BYR, - GSREG_MWR, - GSREG_HSR, - GSREG_HDR, - GSREG_VSR, - GSREG_VDR, - GSREG_VCR, - GSREG_DCR, - GSREG_SOUR, - GSREG_DESR, - GSREG_LENR, - GSREG_DVSSR, - - GSREG_SELECT, - GSREG_STATUS, - - __GSREG_COUNT - }; - - // Pass NULL if you don't want more information about the special meaning of the value in the specified - // register. Otherwise, pass a buffer of at least 256 bytes in size. - uint32 GetRegister(const unsigned int id, char *special, const uint32 special_len); - void SetRegister(const unsigned int id, const uint32 value); - -#ifdef WANT_DEBUGGER - bool DoGfxDecode(uint32 *target, const uint32 *color_table, const uint32 TransparentColor, bool DecodeSprites, - int32 w, int32 h, int32 scroll); -#endif - - INLINE bool PeekIRQ(void) - { - return ((bool)(status & 0x3F)); - } - - INLINE void SetIRQHook(void (*irqh)(bool)) - { - IRQHook = irqh; - } - - INLINE void SetWSHook(bool (*wsh)(int32)) - { - WSHook = wsh; - } - - INLINE uint16_t* GetVramPointer() - { - return VRAM; - } - INLINE int GetVramByteSize() - { - return VRAM_Size * 2; - } - - private: - int TimeFromHDSStartToBYRLatch(void); - int TimeFromBYRLatchToBXRLatch(void); - - enum - { - HPHASE_HDS = 0, - HPHASE_HDS_PART2, - HPHASE_HDS_PART3, - HPHASE_HDW, - HPHASE_HDW_FINAL, - HPHASE_HDE, - HPHASE_HSW, - HPHASE_COUNT - }; - - enum - { - VPHASE_VDS = 0, - VPHASE_VDW, - VPHASE_VCR, - VPHASE_VSW, - VPHASE_COUNT - }; - - int VRAM_Size; // = 0x8000; - int VRAM_SizeMask; // = VRAM_Size - 1; //0x7FFF; - int VRAM_BGTileNoMask; // = VRAM_SizeMask / 16; //0x7FF; - - void (*IRQHook)(bool); - bool (*WSHook)(int32); - - void DoWaitStates(void); - void CheckAndCommitPending(void); - - INLINE int32 CalcNextEvent(void) - { - int32 next_event = HPhaseCounter; - - if (sat_dma_counter > 0 && sat_dma_counter < next_event) - next_event = sat_dma_counter; - - if (sprite_cg_fetch_counter > 0 && sprite_cg_fetch_counter < next_event) - next_event = sprite_cg_fetch_counter; - - if (DMARunning) - { - assert(VDMA_CycleCounter < 2); - - int32 next_vram_dma_event = ((LENR + 1) * 4) - (DMAReadWrite * 2) - VDMA_CycleCounter; - - assert(next_vram_dma_event > 0); - - if (next_vram_dma_event > 0 && next_vram_dma_event < next_event) - next_event = next_vram_dma_event; - - //printf("Next VRAM DMA event: %d(LENR = %d)\n", next_vram_dma_event, LENR); - } - - assert(next_event > 0); - return (next_event); - } - - bool in_exhsync, in_exvsync; - - void CalcWidthStartEnd(uint32 &display_width, uint32 &start, uint32 &end); - void DrawBG(uint16 *target, int enabled); - void DrawSprites(uint16 *target, int enabled); - void FetchSpriteData(void); - - uint8 Simulate_select; - uint16 Simulate_MAWR; - uint16 Simulate_MARR; - uint16 Simulate_CR; - uint16 Simulate_LENR; - - int32 sat_dma_counter; - - uint8 select; - uint16 MAWR; // Memory Address Write Register - uint16 MARR; // Memory Address Read Register - - uint16 CR; // Control Register - uint16 CR_cache; // Cache for BG/SPR enable - uint16 RCR; // Raster Compare Register - uint16 BXR; // Background X-Scroll Register - uint16 BYR; // Background Y-Scroll Register - uint16 MWR; // Memory Width Register - - uint16 HSR; // Horizontal Sync Register - uint16 HDR; // Horizontal Display Register - uint16 VSR; - uint16 VDR; - - uint16 VCR; - uint16 DCR; - uint16 SOUR; - uint16 DESR; - uint16 LENR; - uint16 DVSSR; - - // Internal SAT DMA transfer variables. - //uint16 SAT_SOUR; - //uint16 SAT_DESR; - //uint16 SAT_LENR; - - int32 VDMA_CycleCounter; - - uint32 RCRCount; - - bool pending_read; - uint16 pending_read_addr; - uint16 read_buffer; - - uint8 write_latch; // LSB - - bool pending_write; - uint16 pending_write_addr; - uint16 pending_write_latch; - - uint8 status; - - uint16 SAT[0x100]; - - uint16 VRAM[65536]; //VRAM_Size]; - - union { - uint64 bg_tile_cache64[65536 / 16][8]; // Tile, y, x - uint8 bg_tile_cache[65536 / 16][8][8]; - }; - - uint16 DMAReadBuffer; - bool DMAReadWrite; - bool DMARunning; - bool DMAPending; - bool SATBPending; - bool burst_mode; - - uint32 BG_YOffset; // Reloaded from BYR at start of display area? - uint32 BG_XOffset; // Reloaded from BXR at each scanline, methinks. - - uint32 HSW_cache, HDS_cache, HDW_cache, HDE_cache; - - uint32 VDS_cache; - uint32 VSW_cache; - uint32 VDW_cache; - uint32 VCR_cache; - uint16 MWR_cache; - - uint32 BG_YMoo; - bool NeedRCRInc, NeedVBIRQTest, NeedSATDMATest, NeedBGYInc; - int HPhase, VPhase; - int32 HPhaseCounter, VPhaseCounter; - - int32 sprite_cg_fetch_counter; - - int32 mystery_counter; - bool mystery_phase; - - uint16 linebuf[1024 + 512]; - uint32 pixel_desu; - int32 pixel_copy_count; - uint32 userle; // User layer enable. - bool unlimited_sprites; - - int active_sprites; - SPRLE SpriteList[64 * 2]; // (see unlimited_sprites option, *2 to accommodate 32-pixel-width sprites ) //16]; -}; - -#endif diff --git a/waterbox/pcfx/huc6273.cpp b/waterbox/pcfx/huc6273.cpp deleted file mode 100644 index 04f8eae954..0000000000 --- a/waterbox/pcfx/huc6273.cpp +++ /dev/null @@ -1,260 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* huc6273.cpp - Unfinished emulation of the HuC6273, 3D chip in the PC-FXGA -** Copyright (C) 2007-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* Definitions: - CMT = Command Macro Table -*/ - -#include "pcfx.h" -#include "huc6273.h" - -namespace MDFN_IEN_PCFX -{ - -enum -{ - OP_NOP = 0x00, - OP_TRIANGLE_STRIP = 0x01, - OP_TRIANGLE_LIST = 0x02, - OP_POLY_LINE = 0x03, - OP_LINE_LIST = 0x04, - OP_RESERVED0 = 0x05, - OP_PUT_IMAGE = 0x06, - OP_READ_PIXEL = 0x07, - OP_WRITE_TE_REGISTERS = 0x08, - OP_WRITE_PE_REGISTERS = 0x09, - OP_MISC = 0x0A, - OP_RESERVED1 = 0x0B, - OP_READ_TE_REGISTERS = 0x0C, - OP_READ_PE_REGISTERS = 0x0D, - OP_WRITE_LUT = 0x0E, - OP_READ_LUT = 0x0F, -}; - -enum -{ - INT_RHIT = 15, // Raster Hit - INT_HBL = 14, // H blank - INT_VBL = 13, // V blank - INT_HSY = 12, // H sync - INT_VSY = 11, // V sync - INT_RBDONE = 10, // Read back done - INT_TESYNC = 9, // TE Sync - INT_SPDONE = 8, // Sprite done - INT_CMDONE = 7, // Command macro done - INT_PESYNC = 6, // PE sync - INT_AEMP = 5, // Almost empty - INT_CSE = 4, // Command sync error - INT_AFL = 3, // Almost full - INT_OVF = 2, // Overflow - INT_FSY = 1, // Frame sync -}; - -static uint16 FIFO[0x20]; -static uint8 InFIFO; -#define AFW (0x20 - InFIFO) - -#define AEMPWD ((FIFOControl >> 4) & 0xFF) -#define AFLWD (FIFOControl & 0xF) -static uint16 FIFOControl; // 0x00004 - -static uint8 CMTBankSelect; -static uint16 CMTStartAddress; -static uint16 CMTByteCount; - -static uint16 InterruptMask; -static uint16 InterruptStatus; - -static uint16 ReadBack; - -static uint16 HorizontalTiming, VerticalTiming; - -static uint16 SCTAddressHi; -static uint16 SpriteControl; -static uint16 CDResult[2]; -static uint16 SPWindowX[2]; // left and right -static uint16 SPWindowY[2]; // top and bottom -static uint16 MiscStatus; -static uint16 ErrorStatus; // Read only! -static uint16 DisplayControl; -static uint16 StatusControl; -static uint16 Config; - -static uint16 RasterHit; - - -static uint16 Results[0x10]; - -static void CheckIRQ(void) -{ - //uint16 MaskedResults = InterruptStatus & InterruptMask; - - - -} - - -static void ProcessFIFO(void) -{ - uint8 length = FIFO[0] & 0xFF; - - if(length > 0x20) - { - length = 0x20; - puts("Length too long"); - } - - if(InFIFO >= length) - { - int opcode = FIFO[0] >> 12; - int option = (FIFO[0] >> 8) & 0x0F; - - printf("Op: %02x, option: %02x\n", opcode, option); - - InFIFO -= length; - for(int i = 0; i < InFIFO; i++) - FIFO[i] = FIFO[length + i]; - } -} - - -static void StoreInFIFO(uint16 V) -{ - if(AFW > 0) - { - FIFO[InFIFO] = V; - InFIFO++; - - ProcessFIFO(); - } -} - -uint8 HuC6273_Read8(uint32 A) -{ - puts("73 Read8"); - return(0); -} - -uint16 HuC6273_Read16(uint32 A) -{ - A &= 0xfffff; - - printf("HuC6273 Read: %04x\n", A); - - switch(A) - { - case 0x00000: - case 0x00002: return(AFW); // Command FIFO status - - case 0x00004: return(FIFOControl); - case 0x00006: return(CMTBankSelect); - case 0x00008: return(CMTStartAddress); - case 0x0000A: return(CMTByteCount); - case 0x0000C: return(InterruptMask); - case 0x0000E: return(0); - case 0x00010: return(InterruptStatus); - case 0x00012: return(ReadBack); - case 0x00014: return(HorizontalTiming); - case 0x00016: return(VerticalTiming); - case 0x00018: return(SCTAddressHi); - case 0x0001A: return(SpriteControl); - case 0x0001C: return(CDResult[0]); - case 0x0001E: return(CDResult[1]); - case 0x00020: return(SPWindowX[0]); - case 0x00022: return(SPWindowY[0]); - case 0x00024: return(SPWindowX[1]); - case 0x00026: return(SPWindowY[1]); - case 0x00028: return(MiscStatus); - case 0x0002A: return(ErrorStatus); - case 0x0002C: return(DisplayControl); - case 0x0002E: return(Config); - } - if(A >= 0x00060 && A <= 0x0007E) - { - return(Results[(A >> 1) & 0xF]); - } - return(0); -} - - -void HuC6273_Write16(uint32 A, uint16 V) -{ - A &= 0xfffff; - - printf("HuC6273 Write: %04x:%04x\n", A, V); - - switch(A) - { - case 0x00000: - case 0x00002: StoreInFIFO(V); break; - - case 0x00004: FIFOControl = V; break; - case 0x00006: CMTBankSelect = V & 0x1F; break; - case 0x00008: CMTStartAddress = V & 0xFFFE; break; - case 0x0000A: CMTByteCount = V & 0xFFFE; break; - case 0x0000C: InterruptMask = V; - CheckIRQ(); - break; - case 0x0000E: // Interrupt Clear - CheckIRQ(); - break; - case 0x00010: InterruptStatus = V; - CheckIRQ(); - break; - case 0x00012: ReadBack = V; break; - case 0x00014: HorizontalTiming = V; break; - case 0x00016: VerticalTiming = V; break; - case 0x00018: SCTAddressHi = V; break; - case 0x0001A: SpriteControl = V; break; - case 0x0001C: CDResult[0] = V; break; - case 0x0001E: CDResult[1] = V; break; - case 0x00020: SPWindowX[0] = V; break; // X Left - case 0x00022: SPWindowY[0] = V; break; // Y Top - case 0x00024: SPWindowX[1] = V; break; // X Right - case 0x00026: SPWindowY[1] = V; break; // Y Bottom - case 0x00028: MiscStatus = V; break; - case 0x0002C: DisplayControl = V; break; - case 0x0002E: StatusControl = V; break; - - case 0x0003C: RasterHit = V; break; - } -} - -void HuC6273_Write8(uint32 A, uint8 V) -{ - puts("73 Write8"); -} - -void HuC6273_Reset(void) -{ - InFIFO = 0; - FIFOControl = 0x5 | (0x20 << 4); -} - - - -bool HuC6273_Init(void) -{ - - return(TRUE); -} - -} diff --git a/waterbox/pcfx/huc6273.h b/waterbox/pcfx/huc6273.h deleted file mode 100644 index ab4ef73fda..0000000000 --- a/waterbox/pcfx/huc6273.h +++ /dev/null @@ -1,38 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* huc6273.h: -** Copyright (C) 2007-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __PCFX_HUC6273_H -#define __PCFX_HUC6273_H - -namespace MDFN_IEN_PCFX -{ - -bool HuC6273_Init(void) MDFN_COLD; - -uint8 HuC6273_Read8(uint32 A); -uint16 HuC6273_Read16(uint32 A); -void HuC6273_Write16(uint32 A, uint16 V); -void HuC6273_Write8(uint32 A, uint8 V); -void HuC6273_Reset(void) MDFN_COLD; - -} - -#endif diff --git a/waterbox/pcfx/input.cpp b/waterbox/pcfx/input.cpp deleted file mode 100644 index 183e0c6d89..0000000000 --- a/waterbox/pcfx/input.cpp +++ /dev/null @@ -1,340 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* input.cpp: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "pcfx.h" -#include "interrupt.h" -#include "input.h" - -#include "input/gamepad.h" -#include "input/mouse.h" - -namespace MDFN_IEN_PCFX -{ - -#define PCFX_PORTS 2 -#define TOTAL_PORTS 8 - -#define TAP_PORTS 4 - -static const int TapMap[2][TAP_PORTS] = - { - {0, 2, 3, 4}, - {1, 5, 6, 7}, -}; - -static void RemakeDevices(int which = -1); -static uint8 MultiTapEnabled; - -// Mednafen-specific input type numerics -enum -{ - FXIT_NONE = 0, - FXIT_GAMEPAD = 1, - FXIT_MOUSE = 2, -}; - -PCFX_Input_Device::~PCFX_Input_Device() -{ -} - -uint32 PCFX_Input_Device::ReadTransferTime(void) -{ - return (1536); -} - -uint32 PCFX_Input_Device::WriteTransferTime(void) -{ - return (1536); -} - -uint32 PCFX_Input_Device::Read(void) -{ - return (0); -} - -void PCFX_Input_Device::Write(uint32 data) -{ -} - -void PCFX_Input_Device::Power(void) -{ -} - -void PCFX_Input_Device::Frame(uint32_t data) -{ -} - -static PCFX_Input_Device *devices[TOTAL_PORTS] = {NULL}; - -// D0 = TRG, trigger bit -// D1 = MOD, multi-tap clear mode? -// D2 = IOS, data direction. 0 = output, 1 = input - -static uint8 TapCounter[PCFX_PORTS]; -static uint8 control[PCFX_PORTS]; -static bool latched[PCFX_PORTS]; -static int32 LatchPending[PCFX_PORTS]; - -static int InputTypes[TOTAL_PORTS]; -static const uint32_t *data_ptr[TOTAL_PORTS]; -static uint32 data_latch[TOTAL_PORTS]; - -void FXINPUT_Init(void) -{ - RemakeDevices(); -} - -#ifdef WANT_DEBUGGER -uint32 FXINPUT_GetRegister(const unsigned int id, char *special, const uint32 special_len) -{ - uint32 value = 0xDEADBEEF; - - switch (id) - { - case FXINPUT_GSREG_KPCTRL0: - case FXINPUT_GSREG_KPCTRL1: - value = control[id == FXINPUT_GSREG_KPCTRL1]; - if (special) - { - trio_snprintf(special, special_len, "Trigger: %d, MOD: %d, IOS: %s", value & 0x1, value & 0x2, (value & 0x4) ? "Input" : "Output"); - } - break; - } - - return value; -} - -void FXINPUT_SetRegister(const unsigned int id, uint32 value) -{ -} - -#endif - -static INLINE int32 min(int32 a, int32 b, int32 c) -{ - int32 ret = a; - - if (b < ret) - ret = b; - if (c < ret) - ret = c; - - return (ret); -} - -static INLINE int32 CalcNextEventTS(const v810_timestamp_t timestamp) -{ - return (min(LatchPending[0] > 0 ? (timestamp + LatchPending[0]) : PCFX_EVENT_NONONO, LatchPending[1] > 0 ? (timestamp + LatchPending[1]) : PCFX_EVENT_NONONO, PCFX_EVENT_NONONO)); -} - -static uint32_t Dummy; - -static void RemakeDevices(int which) -{ - int s = 0; - int e = TOTAL_PORTS; - - if (which != -1) - { - s = which; - e = which + 1; - } - - for (int i = s; i < e; i++) - { - if (devices[i]) - delete devices[i]; - devices[i] = NULL; - - switch (InputTypes[i]) - { - default: - case FXIT_NONE: - devices[i] = new PCFX_Input_Device(); - data_ptr[i] = &Dummy; - break; - case FXIT_GAMEPAD: - devices[i] = PCFXINPUT_MakeGamepad(); - break; - case FXIT_MOUSE: - devices[i] = PCFXINPUT_MakeMouse(i); - break; - } - } -} - -void FXINPUT_SetInput(unsigned port, int type, const uint32_t* ptr) -{ - data_ptr[port] = ptr; - InputTypes[port] = type; // FXIT_NONE, FXIT_GAMEPAD, FXIT_MOUSE - RemakeDevices(port); -} - -void FXINPUT_SetMultitap(bool port1, bool port2) -{ - MultiTapEnabled = port1 | port2 << 1; -} - - -uint8 FXINPUT_Read8(uint32 A, const v810_timestamp_t timestamp) -{ - //printf("Read8: %04x\n", A); - - return (FXINPUT_Read16(A & ~1, timestamp) >> ((A & 1) * 8)); -} - -uint16 FXINPUT_Read16(uint32 A, const v810_timestamp_t timestamp) -{ - FXINPUT_Update(timestamp); - - uint16 ret = 0; - - A &= 0xC2; - - //printf("Read: %04x\n", A); - - if (A == 0x00 || A == 0x80) - { - int w = (A & 0x80) >> 7; - - if (latched[w]) - ret = 0x8; - else - ret = 0x0; - } - else - { - int which = (A >> 7) & 1; - - ret = data_latch[which] >> ((A & 2) ? 16 : 0); - - // Which way is correct? Clear on low reads, or both? Official docs only say low... - if (!(A & 0x2)) - latched[which] = FALSE; - } - - if (!latched[0] && !latched[1]) - PCFXIRQ_Assert(PCFXIRQ_SOURCE_INPUT, FALSE); - - return (ret); -} - -void FXINPUT_Write16(uint32 A, uint16 V, const v810_timestamp_t timestamp) -{ - FXINPUT_Update(timestamp); - - //printf("Write16: %04x:%02x, %d\n", A, V, timestamp / 1365); - - //PCFXIRQ_Assert(PCFXIRQ_SOURCE_INPUT, FALSE); - //if(V != 7 && V != 5) - //printf("PAD Write16: %04x %04x %d\n", A, V, timestamp); - - switch (A & 0xC0) - { - case 0x80: - case 0x00: - { - int w = (A & 0x80) >> 7; - - if ((V & 0x1) && !(control[w] & 0x1)) - { - //printf("Start: %d\n", w); - if (MultiTapEnabled & (1 << w)) - { - if (V & 0x2) - TapCounter[w] = 0; - } - LatchPending[w] = 1536; - PCFX_SetEvent(PCFX_EVENT_PAD, CalcNextEventTS(timestamp)); - } - control[w] = V & 0x7; - } - break; - } -} - -void FXINPUT_Write8(uint32 A, uint8 V, const v810_timestamp_t timestamp) -{ - FXINPUT_Write16(A, V, timestamp); -} - -void FXINPUT_Frame(void) -{ - for (int i = 0; i < TOTAL_PORTS; i++) - { - devices[i]->Frame(data_ptr[i][0]); - } -} - -static v810_timestamp_t lastts; - -v810_timestamp_t FXINPUT_Update(const v810_timestamp_t timestamp) -{ - int32 run_time = timestamp - lastts; - - for (int i = 0; i < 2; i++) - { - if (LatchPending[i] > 0) - { - LatchPending[i] -= run_time; - if (LatchPending[i] <= 0) - { - //printf("Update: %d, %d\n", i, timestamp / 1365); - - if (MultiTapEnabled & (1 << i)) - { - if (TapCounter[i] >= TAP_PORTS) - data_latch[i] = FX_SIG_TAP << 28; - else - { - data_latch[i] = devices[TapMap[i][TapCounter[i]]]->Read(); - } - } - else - { - data_latch[i] = devices[i]->Read(); - } - // printf("Moo: %d, %d, %08x\n", i, TapCounter[i], data_latch[i]); - latched[i] = TRUE; - control[i] &= ~1; - PCFXIRQ_Assert(PCFXIRQ_SOURCE_INPUT, TRUE); - - if (MultiTapEnabled & (1 << i)) - { - if (TapCounter[i] < TAP_PORTS) - { - TapCounter[i]++; - } - } - } - } - } - - lastts = timestamp; - - return CalcNextEventTS(timestamp); -} - -void FXINPUT_ResetTS(int32 ts_base) -{ - lastts = ts_base; -} -} diff --git a/waterbox/pcfx/input.h b/waterbox/pcfx/input.h deleted file mode 100644 index 731158390b..0000000000 --- a/waterbox/pcfx/input.h +++ /dev/null @@ -1,82 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* input.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_PCFX_INPUT_H -#define __MDFN_PCFX_INPUT_H - -namespace MDFN_IEN_PCFX -{ - -enum -{ - FX_SIG_MOUSE = 0xD, - FX_SIG_TAP = 0xE, - FX_SIG_PAD = 0xF -}; - -class PCFX_Input_Device -{ - public: - // PCFX_Input_Device(int which); // "which" is advisory and only should be used in status messages. - - virtual ~PCFX_Input_Device(); - - virtual uint32 ReadTransferTime(void); - virtual uint32 WriteTransferTime(void); - - virtual uint32 Read(void); - virtual void Write(uint32 data); - - virtual void Power(void); - - virtual void Frame(uint32_t data); -}; - -void FXINPUT_Init(void) MDFN_COLD; - -void FXINPUT_SetInput(unsigned port, int type, const uint32_t* ptr); -void FXINPUT_SetMultitap(bool port1, bool port2); - -uint16 FXINPUT_Read16(uint32 A, const v810_timestamp_t timestamp); -uint8 FXINPUT_Read8(uint32 A, const v810_timestamp_t timestamp); - -void FXINPUT_Write8(uint32 A, uint8 V, const v810_timestamp_t timestamp); -void FXINPUT_Write16(uint32 A, uint16 V, const v810_timestamp_t timestamp); - -void FXINPUT_Frame(void); - -v810_timestamp_t FXINPUT_Update(const v810_timestamp_t timestamp); -void FXINPUT_ResetTS(int32 ts_base); - -#ifdef WANT_DEBUGGER - -enum -{ - FXINPUT_GSREG_KPCTRL0 = 0, - FXINPUT_GSREG_KPCTRL1 -}; - -uint32 FXINPUT_GetRegister(const unsigned int id, char *special, const uint32 special_len); -void FXINPUT_SetRegister(const unsigned int id, uint32 value); -#endif -} - -#endif diff --git a/waterbox/pcfx/input/gamepad.cpp b/waterbox/pcfx/input/gamepad.cpp deleted file mode 100644 index 7d6a10c32b..0000000000 --- a/waterbox/pcfx/input/gamepad.cpp +++ /dev/null @@ -1,80 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* gamepad.cpp: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "../pcfx.h" -#include "../input.h" -#include "gamepad.h" - -namespace MDFN_IEN_PCFX -{ - -class PCFX_Input_Gamepad : public PCFX_Input_Device -{ - public: - PCFX_Input_Gamepad() - { - buttons = 0; - } - - virtual ~PCFX_Input_Gamepad() override - { - } - - virtual uint32 ReadTransferTime(void) override - { - return 1536; - } - - virtual uint32 WriteTransferTime(void) override - { - return 1536; - } - - virtual uint32 Read(void) override - { - return buttons | FX_SIG_PAD << 28; - } - - virtual void Write(uint32 data) override - { - } - - virtual void Power(void) override - { - buttons = 0; - } - - virtual void Frame(uint32_t data) override - { - buttons = data; - } - - private: - // 5....098 7......0 - // m mldru rs654321 - uint16 buttons; -}; - -PCFX_Input_Device *PCFXINPUT_MakeGamepad(void) -{ - return new PCFX_Input_Gamepad(); -} -} diff --git a/waterbox/pcfx/input/gamepad.h b/waterbox/pcfx/input/gamepad.h deleted file mode 100644 index a29dcdbe75..0000000000 --- a/waterbox/pcfx/input/gamepad.h +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* gamepad.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __PCFX_INPUT_GAMEPAD_H -#define __PCFX_INPUT_GAMEPAD_H - -namespace MDFN_IEN_PCFX -{ -PCFX_Input_Device *PCFXINPUT_MakeGamepad(void); -} - -#endif diff --git a/waterbox/pcfx/input/mouse.cpp b/waterbox/pcfx/input/mouse.cpp deleted file mode 100644 index 13e675b8fa..0000000000 --- a/waterbox/pcfx/input/mouse.cpp +++ /dev/null @@ -1,88 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* mouse.cpp: -** Copyright (C) 2007-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "../pcfx.h" -#include "../input.h" -#include "mouse.h" - -namespace MDFN_IEN_PCFX -{ - -class PCFX_Input_Mouse : public PCFX_Input_Device -{ - public: - PCFX_Input_Mouse(int which) - { - dx = 0; - dy = 0; - button = 0; - } - - virtual ~PCFX_Input_Mouse() override - { - } - - virtual uint32 ReadTransferTime(void) override - { - return (1536); - } - - virtual uint32 WriteTransferTime(void) override - { - return (1536); - } - - virtual uint32 Read(void) override - { - return FX_SIG_MOUSE << 28 | button << 16 | dx << 8 | dy; - } - - virtual void Write(uint32 data) override - { - } - - virtual void Power(void) override - { - button = 0; - dx = 0; - dy = 0; - } - - virtual void Frame(uint32_t data) override - { - dx = data; - dy = data >> 8; - button = data >> 16 & 3; - } - - private: - int8 dx, dy; - - // 76543210 - // ......RL - uint8 button; -}; - -PCFX_Input_Device *PCFXINPUT_MakeMouse(int which) -{ - return new PCFX_Input_Mouse(which); -} -} diff --git a/waterbox/pcfx/input/mouse.h b/waterbox/pcfx/input/mouse.h deleted file mode 100644 index 19837873b3..0000000000 --- a/waterbox/pcfx/input/mouse.h +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* mouse.h: -** Copyright (C) 2007-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __PCFX_INPUT_MOUSE_H -#define __PCFX_INPUT_MOUSE_H - -namespace MDFN_IEN_PCFX -{ -PCFX_Input_Device *PCFXINPUT_MakeMouse(int which); -} - -#endif diff --git a/waterbox/pcfx/interrupt.cpp b/waterbox/pcfx/interrupt.cpp deleted file mode 100644 index 4820b8cdf9..0000000000 --- a/waterbox/pcfx/interrupt.cpp +++ /dev/null @@ -1,212 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* interrupt.cpp: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "pcfx.h" -#include "interrupt.h" - -namespace MDFN_IEN_PCFX -{ - -static uint16 InterruptAsserted; -static uint16 InterruptMask; -static uint16 InterruptPriority[2]; - -static void BuildInterruptCache(void) -{ - uint32 iwithmask = InterruptAsserted &~ InterruptMask; - int InterruptCache = -1; - int last_prio = -1; - - for(int level = 8; level < 16; level++) - if(iwithmask & (1 << (15 - level))) - { - int tmp_prio; - - if(level >= 12) - tmp_prio = (InterruptPriority[0] >> ((15 - level) * 3)) & 0x7; - else - tmp_prio = (InterruptPriority[1] >> ((11 - level) * 3)) & 0x7; - - if(tmp_prio >= last_prio) - { - if(tmp_prio == last_prio) - { - FXDBG("Undefined IRQ behavior: %d, %d\n", level, tmp_prio); - } - InterruptCache = 8 + tmp_prio; - last_prio = tmp_prio; - } - } - - PCFX_V810.SetInt(InterruptCache); -} - -void PCFXIRQ_Assert(int source, bool assert) -{ - assert(source >= 0 && source <= 7); - - InterruptAsserted &= ~(1 << (7 - source)); - - if(assert) - InterruptAsserted |= (1 << (7 - source)); - - BuildInterruptCache(); -} - - -uint16 PCFXIRQ_Read16(uint32 A) -{ - uint32 ret = 0x00; - - switch(A & 0xC0) - { - case 0x00: ret = InterruptAsserted; break; - case 0x40: ret = InterruptMask; break; - case 0x80: ret = InterruptPriority[0]; break; - case 0xC0: ret = InterruptPriority[1]; break; - } - - return(ret); -} - -uint8 PCFXIRQ_Read8(uint32 A) -{ - return(PCFXIRQ_Read16(A&~1) >> ((A & 1) * 8)); -} - -void PCFXIRQ_Write16(uint32 A, uint16 V) -{ -// printf("IRQ Controller Write: %08x %04x\n", A, V); - switch(A & 0xC0) - { - case 0x00: puts("Address error clear"); - break; - - case 0x40: InterruptMask = V & 0x7F; - BuildInterruptCache(); - break; - - case 0x80: if(InterruptMask == 0x7F) - { - InterruptPriority[0] = V & 0xFFF; - BuildInterruptCache(); - } - break; - - case 0xC0: if(InterruptMask == 0x7F) - { - InterruptPriority[1] = V & 0x1FF; - BuildInterruptCache(); - } - break; - } -} - -void PCFXIRQ_SetRegister(const unsigned int id, uint32 value) -{ - switch(id) - { - case PCFXIRQ_GSREG_IMASK: - InterruptMask = value & 0x7F; - BuildInterruptCache(); - break; - - case PCFXIRQ_GSREG_IPRIO0: - InterruptPriority[0] = value & 0xFFF; - BuildInterruptCache(); - break; - - case PCFXIRQ_GSREG_IPRIO1: - InterruptPriority[1] = value & 0x1FF; - BuildInterruptCache(); - break; - - case PCFXIRQ_GSREG_IPEND: - InterruptAsserted = value; - BuildInterruptCache(); - break; - } -} - -uint32 PCFXIRQ_GetRegister(const unsigned int id, char *special, const uint32 special_len) -{ - uint32 value = 0xDEADBEEF; - - switch(id) - { - case PCFXIRQ_GSREG_IMASK: - value = InterruptMask; - if(special) - { - trio_snprintf(special, special_len, "IRQ Allowed; HuC6273: %s, HuC6270-B: %s, HuC6272: %s, HuC6270-A: %s, Pad: %s, Timer: %s, Reset: %s", - (InterruptMask & (1 << 0)) ? "No" : "Yes", (InterruptMask & (1 << 1)) ? "No" : "Yes", - (InterruptMask & (1 << 2)) ? "No" : "Yes", (InterruptMask & (1 << 3)) ? "No" : "Yes", - (InterruptMask & (1 << 4)) ? "No" : "Yes", (InterruptMask & (1 << 6)) ? "No" : "Yes", - (InterruptMask & (1 << 7)) ? "No" : "Yes"); - } - break; - - case PCFXIRQ_GSREG_IPRIO0: - value = InterruptPriority[0]; - if(special) - { - trio_snprintf(special, special_len, "HuC6273: %d, HuC6270-B: %d, HuC6272: %d, HuC6270-A: %d", - (InterruptPriority[0] >> 0) & 0x7, (InterruptPriority[0] >> 3) & 0x7, - (InterruptPriority[0] >> 6) & 0x7, (InterruptPriority[0] >> 9) & 0x7); - } - break; - - case PCFXIRQ_GSREG_IPRIO1: - value = InterruptPriority[1]; - if(special) - { - trio_snprintf(special, special_len, "Pad: %d, ??: %d, Timer: %d, Reset: %d", - (InterruptPriority[1] >> 0) & 0x7, (InterruptPriority[1] >> 3) & 0x7, - (InterruptPriority[1] >> 6) & 0x7, (InterruptPriority[1] >> 9) & 0x7); - } - break; - - case PCFXIRQ_GSREG_IPEND: - value = InterruptAsserted; - if(special) - { - trio_snprintf(special, special_len, "HuC6273: %d, HuC6270-B: %d, HuC6272: %d, HuC6270-A: %d, Pad: %d, ??: %d, Timer: %d, Reset: %d", (int)(bool)(value & 0x01), (int)(bool)(value & 0x02), - (int)(bool)(value & 0x04), (int)(bool)(value & 0x08), (int)(bool)(value & 0x10), (int)(bool)(value & 0x20), - (int)(bool)(value & 0x40), (int)(bool)(value & 0x80)); - } - break; - } - - return value; -} - -void PCFXIRQ_Reset(void) -{ - InterruptAsserted = 0; - InterruptMask = 0xFFFF; - - InterruptPriority[0] = 0; - InterruptPriority[1] = 0; - - BuildInterruptCache(); -} - -} diff --git a/waterbox/pcfx/interrupt.h b/waterbox/pcfx/interrupt.h deleted file mode 100644 index da844bb0ed..0000000000 --- a/waterbox/pcfx/interrupt.h +++ /dev/null @@ -1,55 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* interrupt.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __PCFX_INTERRUPT_H -#define __PCFX_INTERRUPT_H - -namespace MDFN_IEN_PCFX -{ -#define PCFXIRQ_SOURCE_TIMER 1 -#define PCFXIRQ_SOURCE_EX 2 -#define PCFXIRQ_SOURCE_INPUT 3 -#define PCFXIRQ_SOURCE_VDCA 4 -#define PCFXIRQ_SOURCE_KING 5 -#define PCFXIRQ_SOURCE_VDCB 6 -#define PCFXIRQ_SOURCE_HUC6273 7 - -void PCFXIRQ_Assert(int source, bool assert); -void PCFXIRQ_Write16(uint32 A, uint16 V); -uint16 PCFXIRQ_Read16(uint32 A); -uint8 PCFXIRQ_Read8(uint32 A); - -void PCFXIRQ_Reset(void) MDFN_COLD; - -enum -{ - PCFXIRQ_GSREG_IMASK = 0, - PCFXIRQ_GSREG_IPRIO0, - PCFXIRQ_GSREG_IPRIO1, - PCFXIRQ_GSREG_IPEND -}; - -uint32 PCFXIRQ_GetRegister(const unsigned int id, char *special, const uint32 special_len); -void PCFXIRQ_SetRegister(const unsigned int id, uint32 value); - -} - -#endif diff --git a/waterbox/pcfx/io-handler.inc b/waterbox/pcfx/io-handler.inc deleted file mode 100644 index 808114f9bb..0000000000 --- a/waterbox/pcfx/io-handler.inc +++ /dev/null @@ -1,309 +0,0 @@ -static uint8 MDFN_FASTCALL port_rbyte(v810_timestamp_t ×tamp, uint32 A) -{ - if (A >= 0x000 && A <= 0x0FF) - { - Lagged = false; - if (InputCallback) - InputCallback(); - return (FXINPUT_Read8(A, timestamp)); - } - else if (A >= 0x100 && A <= 0x1FF) // SOUNDBOX dummy - { - timestamp += 4; - } - else if (A >= 0x200 && A <= 0x2FF) // RAINBOW dummy - { - timestamp += 4; - } - else if (A >= 0x300 && A <= 0x3FF) // FXVCE - { - timestamp += 4; - return (FXVCE_Read16(A)); - } - else if (A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B - { - timestamp += 4; - return (fx_vdc_chips[(A >> 8) & 0x1]->Read16((A & 4) >> 2)); - } - else if (A >= 0x600 && A <= 0x6FF) - { - timestamp += 4; - return (KING_Read8(timestamp, A)); - } - else if (A >= 0x700 && A <= 0x7FF) - { - if (!(A & 1)) - { - FXDBG("ExBusReset B Read"); - return (ExBusReset); - } - return (0); - } - else if (A >= 0xc00 && A <= 0xCFF) // Backup memory control - { - switch (A & 0xC0) - { - case 0x80: - return (BackupControl); - case 0x00: - return (Last_VDC_AR[0]); - case 0x40: - return (Last_VDC_AR[1]); - } - } - else if (A >= 0xe00 && A <= 0xeff) - { - return (PCFXIRQ_Read8(A)); - } - else if (A >= 0xf00 && A <= 0xfff) - { - return (FXTIMER_Read8(A, timestamp)); - } - else if ((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) - { - if (WantHuC6273) - return (HuC6273_Read8(A)); - } - else if (FXSCSIROM && A >= 0x780000 && A <= 0x7FFFFF) - { - return (FXSCSIROM[A & 0x7FFFF]); - } - else if (FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) - { - return (FXSCSI_CtrlRead(A)); - } - FXDBG("Unknown 8-bit port read: %08x", A); - - return (0x00); -} - -static uint16 MDFN_FASTCALL port_rhword(v810_timestamp_t ×tamp, uint32 A) -{ - if (A >= 0x000 && A <= 0x0FF) - { - Lagged = false; - if (InputCallback) - InputCallback(); - return (FXINPUT_Read16(A, timestamp)); - } - else if (A >= 0x100 && A <= 0x1FF) // SOUNDBOX dummy - { - timestamp += 4; - } - else if (A >= 0x200 && A <= 0x2FF) // RAINBOW dummy - { - timestamp += 4; - } - else if (A >= 0x300 && A <= 0x3FF) - { - timestamp += 4; - return (FXVCE_Read16(A)); - } - else if (A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B - { - timestamp += 4; - return (fx_vdc_chips[(A >> 8) & 0x1]->Read16((A & 4) >> 2)); - } - else if (A >= 0x600 && A <= 0x6FF) - { - timestamp += 4; - return (KING_Read16(timestamp, A)); - } - else if (A >= 0x700 && A <= 0x7FF) - { - FXDBG("ExBusReset H Read"); - - return (ExBusReset); - } - else if (A >= 0xc00 && A <= 0xCFF) // Backup memory control - { - switch (A & 0xC0) - { - case 0x80: - return (BackupControl); - case 0x00: - return (Last_VDC_AR[0]); - case 0x40: - return (Last_VDC_AR[1]); - } - } - else if (A >= 0xe00 && A <= 0xeff) - { - return (PCFXIRQ_Read16(A)); - } - else if (A >= 0xf00 && A <= 0xfff) - { - return (FXTIMER_Read16(A, timestamp)); - } - else if ((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) - { - if (WantHuC6273) - return (HuC6273_Read16(A)); - } - else if (FXSCSIROM && A >= 0x780000 && A <= 0x7FFFFF) - { - return MDFN_de16lsb(&FXSCSIROM[A & 0x7FFFF]); - } - else if (FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) - { - puts("FXSCSI 16-bit:"); - return (FXSCSI_CtrlRead(A)); - } - - FXDBG("Unknown 16-bit port read: %08x", A); - - return (0x00); -} - -static void MDFN_FASTCALL port_wbyte(v810_timestamp_t ×tamp, uint32 A, uint8 V) -{ - if (A >= 0x000 && A <= 0x0FF) - FXINPUT_Write8(A, V, timestamp); - else if (A >= 0x100 && A <= 0x1FF) - { - timestamp += 2; - SoundBox_Write(A, V, timestamp); - } - else if (A >= 0x200 && A <= 0x2FF) - { - timestamp += 2; - RAINBOW_Write8(A, V); - } - else if (A >= 0x300 && A <= 0x3FF) // FXVCE - { - timestamp += 2; - FXVCE_Write16(A, V); - } - else if (A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B - { - timestamp += 2; - - if (!(A & 4)) - Last_VDC_AR[(A >> 8) & 0x1] = V; - - fx_vdc_chips[(A >> 8) & 0x1]->Write16((A & 4) >> 2, V); - } - else if (A >= 0x600 && A <= 0x6FF) - { - timestamp += 2; - KING_Write8(timestamp, A, V); - } - else if (A >= 0x700 && A <= 0x7FF) - { - if (!(A & 1)) - { - FXDBG("ExBusReset B Write: %02x", V & 1); - ExBusReset = V & 1; - } - } - else if (A >= 0xc00 && A <= 0xCFF) - { - switch (A & 0xC1) - { - case 0x80: - BackupControl = V & 0x3; - break; - - default: - FXDBG("Port 8-bit write: %08x %02x", A, V); - break; - } - } - else if (A >= 0xe00 && A <= 0xeff) - { - FXDBG("IRQ write8: %08x %02x", A, V); - PCFXIRQ_Write16(A, V); - } - else if ((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) - { - if (WantHuC6273) - HuC6273_Write16(A, V); - } - else if (FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) - { - FXSCSI_CtrlWrite(A, V); - } - else - { - FXDBG("Port 8-bit write: %08x %02x", A, V); - } -} - -static void MDFN_FASTCALL port_whword(v810_timestamp_t ×tamp, uint32 A, uint16 V) -{ - if (A >= 0x000 && A <= 0x0FF) - FXINPUT_Write16(A, V, timestamp); - else if (A >= 0x100 && A <= 0x1FF) - { - timestamp += 2; - SoundBox_Write(A, V, timestamp); - } - else if (A >= 0x200 && A <= 0x2FF) - { - timestamp += 2; - RAINBOW_Write16(A, V); - } - else if (A >= 0x300 && A <= 0x3FF) - { - timestamp += 2; - FXVCE_Write16(A, V); - } - else if (A >= 0x400 && A <= 0x5FF) // 0x400-0x4FF: VDC-A ; 0x500-0x5FF: VDC-B - { - timestamp += 2; - - if (!(A & 4)) - Last_VDC_AR[(A >> 8) & 0x1] = V; - - fx_vdc_chips[(A >> 8) & 0x1]->Write16((A & 4) >> 2, V); - } - else if (A >= 0x600 && A <= 0x6FF) - { - timestamp += 2; - KING_Write16(timestamp, A, V); - } - else if (A >= 0x700 && A <= 0x7FF) - { - ExBusReset = V & 1; - FXDBG("ExBusReset H Write: %04x", V); - } - else if (A >= 0x800 && A <= 0x8FF) // ?? LIP writes here - { - FXDBG("Port 16-bit write: %08x %04x", A, V); - } - else if (A >= 0xc00 && A <= 0xCFF) - { - switch (A & 0xC0) - { - case 0x80: - BackupControl = V & 0x3; - break; - - default: - FXDBG("Port 16-bit write: %08x %04x", A, V); - break; - } - } - else if (A >= 0xe00 && A <= 0xeff) - { - PCFXIRQ_Write16(A, V); - } - else if (A >= 0xF00 && A <= 0xFFF) - { - FXTIMER_Write16(A, V, timestamp); - } - else if ((A & 0x7FFFFFFF) >= 0x500000 && (A & 0x7FFFFFFF) <= 0x52ffff) - { - if (WantHuC6273) - HuC6273_Write16(A, V); - } - else if (FXSCSIROM && A >= 0x600000 && A <= 0x6FFFFF) - { - puts("FXSCSI 16-bit:"); - FXSCSI_CtrlWrite(A, V); - } - else - { - FXDBG("Port 16-bit write: %08x %04x", A, V); - } -} diff --git a/waterbox/pcfx/jrevdct.cpp b/waterbox/pcfx/jrevdct.cpp deleted file mode 100644 index c1164f5aba..0000000000 --- a/waterbox/pcfx/jrevdct.cpp +++ /dev/null @@ -1,284 +0,0 @@ -/* - * jrevdct.c - * - * Copyright (C) 1991, 1992, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains the basic inverse-DCT transformation subroutine. - * - * This implementation is based on an algorithm described in - * C. Loeffler, A. Ligtenberg and G. Moschytz, "Practical Fast 1-D DCT - * Algorithms with 11 Multiplications", Proc. Int'l. Conf. on Acoustics, - * Speech, and Signal Processing 1989 (ICASSP '89), pp. 988-991. - * The primary algorithm described there uses 11 multiplies and 29 adds. - * We use their alternate method with 12 multiplies and 32 adds. - * The advantage of this method is that no data path contains more than one - * multiplication; this allows a very simple and accurate implementation in - * scaled fixed-point arithmetic, with a minimal number of shifts. - */ - -/* Modified 2007-2016 for usage in Mednafen */ - -#include "defs.h" -#include "jrevdct.h" - -namespace MDFN_IEN_PCFX -{ -/* - * This routine is specialized to the case DCTSIZE = 8. - */ -#define DCTSIZE 8 - -/* - * A 2-D IDCT can be done by 1-D IDCT on each row followed by 1-D IDCT - * on each column. Direct algorithms are also available, but they are - * much more complex and seem not to be any faster when reduced to code. - * - * The poop on this scaling stuff is as follows: - * - * Each 1-D IDCT step produces outputs which are a factor of sqrt(N) - * larger than the true IDCT outputs. The final outputs are therefore - * a factor of N larger than desired; since N=8 this can be cured by - * a simple right shift at the end of the algorithm. The advantage of - * this arrangement is that we save two multiplications per 1-D IDCT, - * because the y0 and y4 inputs need not be divided by sqrt(N). - * - * We have to do addition and subtraction of the integer inputs, which - * is no problem, and multiplication by fractional constants, which is - * a problem to do in integer arithmetic. We multiply all the constants - * by CONST_SCALE and convert them to integer constants (thus retaining - * CONST_BITS bits of precision in the constants). After doing a - * multiplication we have to divide the product by CONST_SCALE, with proper - * rounding, to produce the correct output. This division can be done - * cheaply as a right shift of CONST_BITS bits. We postpone shifting - * as long as possible so that partial sums can be added together with - * full fractional precision. - * - * The outputs of the first pass are scaled up by PASS1_BITS bits so that - * they are represented to better-than-integral precision. These outputs - * require BITS_IN_JSAMPLE + PASS1_BITS + 3 bits; this fits in a 16-bit word - * with the recommended scaling. (To scale up 12-bit sample data further, an - * intermediate int32 array would be needed.) - * - * To avoid overflow of the 32-bit intermediate results in pass 2, we must - * have BITS_IN_JSAMPLE + CONST_BITS + PASS1_BITS <= 26. Error analysis - * shows that the values given below are the most effective. - */ - -#define CONST_BITS 13 -#define PASS1_BITS 2 - -#if ((8 + CONST_BITS + PASS1_BITS) > 26) - #error "Too many bits1!" -#endif - -#define ONE ((int32) 1) - -#define CONST_SCALE (ONE << CONST_BITS) - -/* Convert a positive real constant to an integer scaled by CONST_SCALE. */ - -#define FIX(x) ((int32) ((x) * CONST_SCALE + 0.5)) - -/* Some C compilers fail to reduce "FIX(constant)" at compile time, thus - * causing a lot of useless floating-point operations at run time. - * To get around this we use the following pre-calculated constants. - * If you change CONST_BITS you may want to add appropriate values. - * (With a reasonable C compiler, you can just rely on the FIX() macro...) - */ - -#if CONST_BITS == 13 -#define FIX_0_298631336 ((int32) 2446) /* FIX(0.298631336) */ -#define FIX_0_390180644 ((int32) 3196) /* FIX(0.390180644) */ -#define FIX_0_541196100 ((int32) 4433) /* FIX(0.541196100) */ -#define FIX_0_765366865 ((int32) 6270) /* FIX(0.765366865) */ -#define FIX_0_899976223 ((int32) 7373) /* FIX(0.899976223) */ -#define FIX_1_175875602 ((int32) 9633) /* FIX(1.175875602) */ -#define FIX_1_501321110 ((int32) 12299) /* FIX(1.501321110) */ -#define FIX_1_847759065 ((int32) 15137) /* FIX(1.847759065) */ -#define FIX_1_961570560 ((int32) 16069) /* FIX(1.961570560) */ -#define FIX_2_053119869 ((int32) 16819) /* FIX(2.053119869) */ -#define FIX_2_562915447 ((int32) 20995) /* FIX(2.562915447) */ -#define FIX_3_072711026 ((int32) 25172) /* FIX(3.072711026) */ -#else -#define FIX_0_298631336 FIX(0.298631336) -#define FIX_0_390180644 FIX(0.390180644) -#define FIX_0_541196100 FIX(0.541196100) -#define FIX_0_765366865 FIX(0.765366865) -#define FIX_0_899976223 FIX(0.899976223) -#define FIX_1_175875602 FIX(1.175875602) -#define FIX_1_501321110 FIX(1.501321110) -#define FIX_1_847759065 FIX(1.847759065) -#define FIX_1_961570560 FIX(1.961570560) -#define FIX_2_053119869 FIX(2.053119869) -#define FIX_2_562915447 FIX(2.562915447) -#define FIX_3_072711026 FIX(3.072711026) -#endif - - -/* Descale and correctly round an int32 value that's scaled by N bits. - * We assume RIGHT_SHIFT rounds towards minus infinity, so adding - * the fudge factor is correct for either sign of X. - */ - -#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) -#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) -#define MULTIPLY(var,const) ((var) * (const)) - - -/* - * Perform the inverse DCT on one block of coefficients. - */ - -void j_rev_dct(DCTBLOCK data) -{ - int32 tmp0, tmp1, tmp2, tmp3; - int32 tmp10, tmp11, tmp12, tmp13; - int32 z1, z2, z3, z4, z5; - register DCTELEM *dataptr; - int rowctr; - - /* Pass 1: process rows. */ - /* Note results are scaled up by sqrt(8) compared to a true IDCT; */ - /* furthermore, we scale the results by 2**PASS1_BITS. */ - - dataptr = data; - for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) - { - /* Even part: reverse the even part of the forward DCT. */ - /* The rotator is sqrt(2)*c(-6). */ - - z2 = (int32) dataptr[2]; - z3 = (int32) dataptr[6]; - - z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - tmp0 = ((uint32) dataptr[0] + (uint32) dataptr[4]) << CONST_BITS; - tmp1 = ((uint32) dataptr[0] - (uint32) dataptr[4]) << CONST_BITS; - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - /* Odd part per figure 8; the matrix is unitary and hence its - * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. - */ - - tmp0 = (int32) dataptr[7]; - tmp1 = (int32) dataptr[5]; - tmp2 = (int32) dataptr[3]; - tmp3 = (int32) dataptr[1]; - - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - z4 = tmp1 + tmp3; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; - - /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - - dataptr[0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS); - dataptr[7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS); - dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS); - dataptr[6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS); - dataptr[2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS); - dataptr[5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS); - dataptr[3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS); - dataptr[4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS); - - dataptr += DCTSIZE; /* advance pointer to next row */ - } - - /* Pass 2: process columns. */ - /* Note that we must descale the results by a factor of 8 == 2**3, */ - /* and also undo the PASS1_BITS scaling. */ - - dataptr = data; - for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) { - /* Even part: reverse the even part of the forward DCT. */ - /* The rotator is sqrt(2)*c(-6). */ - - z2 = (int32) dataptr[DCTSIZE*2]; - z3 = (int32) dataptr[DCTSIZE*6]; - - z1 = MULTIPLY(z2 + z3, FIX_0_541196100); - tmp2 = z1 + MULTIPLY(z3, - FIX_1_847759065); - tmp3 = z1 + MULTIPLY(z2, FIX_0_765366865); - - tmp0 = ((uint32) dataptr[DCTSIZE*0] + (uint32) dataptr[DCTSIZE*4]) << CONST_BITS; - tmp1 = ((uint32) dataptr[DCTSIZE*0] - (uint32) dataptr[DCTSIZE*4]) << CONST_BITS; - - tmp10 = tmp0 + tmp3; - tmp13 = tmp0 - tmp3; - tmp11 = tmp1 + tmp2; - tmp12 = tmp1 - tmp2; - - /* Odd part per figure 8; the matrix is unitary and hence its - * transpose is its inverse. i0..i3 are y7,y5,y3,y1 respectively. - */ - - tmp0 = (int32) dataptr[DCTSIZE*7]; - tmp1 = (int32) dataptr[DCTSIZE*5]; - tmp2 = (int32) dataptr[DCTSIZE*3]; - tmp3 = (int32) dataptr[DCTSIZE*1]; - - z1 = tmp0 + tmp3; - z2 = tmp1 + tmp2; - z3 = tmp0 + tmp2; - z4 = tmp1 + tmp3; - z5 = MULTIPLY(z3 + z4, FIX_1_175875602); /* sqrt(2) * c3 */ - - tmp0 = MULTIPLY(tmp0, FIX_0_298631336); /* sqrt(2) * (-c1+c3+c5-c7) */ - tmp1 = MULTIPLY(tmp1, FIX_2_053119869); /* sqrt(2) * ( c1+c3-c5+c7) */ - tmp2 = MULTIPLY(tmp2, FIX_3_072711026); /* sqrt(2) * ( c1+c3+c5-c7) */ - tmp3 = MULTIPLY(tmp3, FIX_1_501321110); /* sqrt(2) * ( c1+c3-c5-c7) */ - z1 = MULTIPLY(z1, - FIX_0_899976223); /* sqrt(2) * (c7-c3) */ - z2 = MULTIPLY(z2, - FIX_2_562915447); /* sqrt(2) * (-c1-c3) */ - z3 = MULTIPLY(z3, - FIX_1_961570560); /* sqrt(2) * (-c3-c5) */ - z4 = MULTIPLY(z4, - FIX_0_390180644); /* sqrt(2) * (c5-c3) */ - - z3 += z5; - z4 += z5; - - tmp0 += z1 + z3; - tmp1 += z2 + z4; - tmp2 += z2 + z3; - tmp3 += z1 + z4; - - /* Final output stage: inputs are tmp10..tmp13, tmp0..tmp3 */ - - dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS+PASS1_BITS+1); - dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS+PASS1_BITS+1); - dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS+PASS1_BITS+1); - dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS+PASS1_BITS+1); - dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS+PASS1_BITS+1); - dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS+PASS1_BITS+1); - dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS+PASS1_BITS+1); - dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS+PASS1_BITS+1); - - dataptr++; /* advance pointer to next column */ - } -} - -} diff --git a/waterbox/pcfx/jrevdct.h b/waterbox/pcfx/jrevdct.h deleted file mode 100644 index 64a8ad0882..0000000000 --- a/waterbox/pcfx/jrevdct.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef __MDFN_PCFX_JREVDCT_H -#define __MDFN_PCFX_JREVDCT_H - -namespace MDFN_IEN_PCFX -{ - -typedef int32* DCTBLOCK; -typedef int32 DCTELEM; - -void j_rev_dct(DCTBLOCK data); - -} - -#endif diff --git a/waterbox/pcfx/king-bgfast-blit.inc b/waterbox/pcfx/king-bgfast-blit.inc deleted file mode 100644 index 6e365722ad..0000000000 --- a/waterbox/pcfx/king-bgfast-blit.inc +++ /dev/null @@ -1,124 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* king-bgfast-blit.inc: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - - switch(bgmode & 0x7) - { - case 0x01: // 4 color, 1/4 byte per pixel :b - sexy_y_pos >>= 3; - for(int x = 0; x < 256 + 8; x+= 8) - { - DRAWBG8x1_LPRE(); - const uint16 *cgptr; - uint32 pbn = 0; - - if(BGFAST_BATMODE) - { - uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; - pbn = (bat >> 12) << 2; - bat &= 0x0FFF; - cgptr = &king_cg_base[(cg_offset + (bat * 8) + ysmall) & 0x1FFFF]; - } - else - cgptr = &king_cg_base[(cg_offset + (bat_x * 1) + sexy_y_pos) & 0x1FFFF]; - - DRAWBG8x1_4(target + x, cgptr, palette_ptr + pbn, layer_or); - DRAWBG8x1_LPOST(); - } - break; - case 0x02: // 16 color, 1/2 byte per pixel - sexy_y_pos >>= 2; - for(int x = 0; x < 256 + 8; x+= 8) - { - DRAWBG8x1_LPRE(); - const uint16 *cgptr; - uint32 pbn = 0; - - if(BGFAST_BATMODE) - { - uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; - pbn = ((bat >> 12) << 4); - bat &= 0x0FFF; - cgptr = &king_cg_base[(cg_offset + (bat * 16) + ysmall * 2) & 0x1FFFF]; - } - else - cgptr = &king_cg_base[(cg_offset + (bat_x * 2) + sexy_y_pos) & 0x1FFFF]; - - DRAWBG8x1_16(target + x, cgptr, palette_ptr + pbn, layer_or); - DRAWBG8x1_LPOST(); - } - break; - case 0x03: // 256 color, 1 byte per pixel palettized - OK - sexy_y_pos >>= 1; - for(int x = 0; x < 256 + 8; x+= 8) - { - DRAWBG8x1_LPRE(); - const uint16 *cgptr; - - if(BGFAST_BATMODE) - { - uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; - cgptr = &king_cg_base[(cg_offset + (bat * 32) + ysmall * 4) & 0x1FFFF]; - } - else - cgptr = &king_cg_base[(cg_offset + (bat_x * 4) + sexy_y_pos) & 0x1FFFF]; - - DRAWBG8x1_256(target + x, cgptr, palette_ptr, layer_or); - DRAWBG8x1_LPOST(); - } - break; - - case 0x04: // 64K color, 2 bytes per pixel - OK - for(int x = 0; x < 256 + 8; x+=8) - { - DRAWBG8x1_LPRE(); - const uint16 *cgptr; - - if(BGFAST_BATMODE) - { - uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; - cgptr = &king_cg_base[(cg_offset + (bat * 64) + ysmall * 8) & 0x1FFFF]; - } - else - cgptr = &king_cg_base[(cg_offset + (bat_x * 8) + sexy_y_pos) & 0x1FFFF]; - - DRAWBG8x1_64K(target + x, cgptr, palette_ptr, layer_or); - DRAWBG8x1_LPOST(); - } - break; - - case 0x05: // 16M color, 2 bytes per pixel - OK - for(int x = 0; x < 256 + 8; x+=8) - { - DRAWBG8x1_LPRE(); - const uint16 *cgptr; - if(BGFAST_BATMODE) - { - uint16 bat = king_bat_base[(bat_offset + (bat_x + bat_y)) & 0x1FFFF]; - cgptr = &king_cg_base[(cg_offset + (bat * 64) + ysmall * 8) & 0x1FFFF]; - } - else - cgptr = &king_cg_base[(cg_offset + (bat_x * 8) + sexy_y_pos) & 0x1FFFF]; - - DRAWBG8x1_16M(target + x, cgptr, palette_ptr, layer_or); - DRAWBG8x1_LPOST(); - } - break; - } diff --git a/waterbox/pcfx/king-bgfast.inc b/waterbox/pcfx/king-bgfast.inc deleted file mode 100644 index e1ef41896f..0000000000 --- a/waterbox/pcfx/king-bgfast.inc +++ /dev/null @@ -1,270 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* king-bgfast.inc: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// Loop prefix non-endless -#define DRAWBG8x1_LPRE() if(bat_x < bat_width) { - -// Loop postfix non-endless -#define DRAWBG8x1_LPOST() } bat_x = (bat_x + 1) & bat_width_mask; - -#define CDBG_REASON(format, ...) -//printf("BG%d Reason: " format "\n", n, ## __VA_ARGS__); -static bool CanDrawBG_Fast(int n) -{ - static const int cg_per_mode[0x8] = - { - 0, // Invalid mode - 1, // 2-bit mode - 2, // 4-bit mode - 4, // 8-bit mode - 8, // 16-bit mode - 8, // 16-bit mode - 8, // 16-bit mode - 8, // 16-bit mode - }; - - const unsigned int bgmode = (king->bgmode >> (n * 4)) & 0xF; - const uint32 bat_offset = king->BGBATAddr[n] * 1024; - const uint32 cg_offset = king->BGCGAddr[n] * 1024; - const uint32 bg_width = (king->BGSize[n] & 0xF0) >> 4; - const uint32 bg_height = king->BGSize[n] & 0x0F; - - // If the bgmode is 0, or 6/7(EXT DOT modes), abort. - if(!(bgmode & 0x7) || ((bgmode & 0x7) >= 6)) - { - CDBG_REASON("Mode %02x out of range", bgmode); - return(FALSE); - } - - // BG width out of range? - if(bg_width < 0x3 || bg_width > 0xA) - { - CDBG_REASON("Width %02x out of range", bg_width); - return(FALSE); - } - - // BG height out of range? - if(bg_height < 0x3 || bg_height > 0xA) - { - CDBG_REASON("Height %02x out of range", bg_height); - return(FALSE); - } - - // Time for very stringent checks for BG0! Don't draw if the sub-screen is a different size than the main screen, - // or the subscreen CG base != the main screen CG base, or the subscreen BAT base != main screen BAT base(when bgmode & 0x8 is TRUE) - if(!n) - { - if(king->priority & 0x1000) - { - CDBG_REASON("Affine transform enabled"); - return(FALSE); - } - - if((king->BGSize[0] & 0xFF) != (king->BGSize[0] >> 8)) - { - CDBG_REASON("Main Screen/Sub Screen Size Mismatch"); - return(FALSE); - } - - // Since we already made sure the main screen/sub screen sizes match, we only - // care if BG base or CG base don't match if endless/repeat scrolling is enabled. - // Otherwise, the subscreen won't show at all. - if(king->BGScrollMode & 0x1) - { - if(king->BGCGAddr[0] != king->BG0SubCGAddr) - { - CDBG_REASON("Main Screen/Sub Screen CG base mismatch"); - return(FALSE); - } - - if(bgmode & 0x8) - { - if(king->BGBATAddr[0] != king->BG0SubBATAddr) - { - CDBG_REASON("Main Screen/Sub Screen BAT base mismatch"); - return(FALSE); - } - } - } - } - - - // If microprogram fetching is disabled, abort. - if(!(king->MPROGControl & 0x1)) - { - CDBG_REASON("Microprogram disabled"); - return(FALSE); - } - else - { - int remap_thing = 0; - bool bat_fetch = FALSE; - - for(int x = 0; x < 16; x++) - { - uint16 mpd; - - // Forcing CG and BAT to 0 if the affine bit != rotate_mode is not technically correct. - // If there is a mismatch, it's more likely the effective CG and BAT address for the pixel/segment - // being drawn won't be calculated correctly, likely being just the initial offsets. - - mpd = king->MPROGData[x]; - - // Fetching for this BG number? - if(((mpd >> 6) & 0x3) != n) - continue; - - // NOP - if(mpd & 0x100) - continue; - - // Affine bit. - if(mpd & 0x20) - { - CDBG_REASON("Affine bit set"); - return(FALSE); - } - - // BAT fetch - if(mpd & 0x10) - { - if(((bat_offset & 0x20000) >> 14) != (x & 8)) - { - CDBG_REASON("BAT MPROG/base bank mismatch"); - return(FALSE); - } - - bat_fetch = TRUE; - } - else // CG fetch: - { - // CG offset/bank mismatch... - if(((cg_offset & 0x20000) >> 14) != (x & 8)) - { - CDBG_REASON("CG MPROG/base bank mismatch"); - return(FALSE); - } - - // Mismatch between CG fetch type and BG mode! - if((mpd & 0x8) != (bgmode & 0x8)) - { - CDBG_REASON("Mismatch between CG fetch type and bg mode"); - return(FALSE); - } - - // Skewed CG fetch order - if((mpd & 0x7) != remap_thing) - { - CDBG_REASON("Skewed CG fetch order"); - return(FALSE); - } - remap_thing++; - } - } - - // CG fetch count mismatch - if(remap_thing != cg_per_mode[bgmode & 0x7]) - { - CDBG_REASON("CG fetch count mismatch"); - return(FALSE); - } - - // BG mode demands a BAT fetch, but we don't have one! - if((bgmode & 0x8) && !bat_fetch) - { - CDBG_REASON("Missing BAT fetch"); - return(FALSE); - } - } - - - return(TRUE); -} - -static void DrawBG_Fast(uint32 *target, int n) -{ - const uint16 bgmode = (king->bgmode >> (n * 4)) & 0xF; - const bool endless = (king->BGScrollMode >> n) & 0x1; - const uint32 XScroll = sign_x_to_s32((n ? 10 : 11), king->BGXScroll[n]); - const uint32 YScroll = sign_x_to_s32((n ? 10 : 11), king->BGYScroll[n]); - const uint32 bat_offset = king->BGBATAddr[n] * 1024; - const uint32 cg_offset = king->BGCGAddr[n] * 1024; - const uint32 bat_and_cg_page = (king->PageSetting & 0x0010) ? 1 : 0; - - const uint32 YOffset = (YScroll + (fx_vce.raster_counter - 22)) & 0xFFFF; - const uint32 layer_or = (LAYER_BG0 + n) << 28; - const int ysmall = YOffset & 0x7; - - const unsigned int bat_width_shift = (king->BGSize[n] & 0xF0) >> 4; - const unsigned int bat_width = (1 << bat_width_shift) >> 3; - const unsigned int bat_width_mask = endless ? (bat_width - 1) : ((((1 << 0xA) * 2) / 8) - 1); - - const int bat_height_shift = king->BGSize[n] & 0x0F; - const int bat_height = (1 << bat_height_shift) >> 3; - const int bat_height_mask = endless ? (bat_height - 1) : ((((1 << 0xA) * 2) / 8) - 1); - - // We don't need to &= cg_offset and bat_offset with 0x1ffff after here, as the effective addresses - // calculated with them are anded with 0x1ffff in the rendering code already. - const uint16 * const king_cg_base = &king->KRAM[bat_and_cg_page][cg_offset & 0x20000]; - const uint16 * const king_bat_base = &king->KRAM[bat_and_cg_page][bat_offset & 0x20000]; - - int bat_y = (YOffset >> 3) & bat_height_mask; - uint32 bat_x = (XScroll >> 3) & bat_width_mask; - - target += 8 - (XScroll & 0x7); - - // If we're in non-endless scroll mode, and we've scrolled past our visible area in the vertical direction, so return. - if(!endless && bat_y >= bat_height) // Draw this line as transparency and return? - { - return; - } - - // Adjust/corrupt bat_y to be faster in our blitting code - bat_y = (bat_y << bat_width_shift) >> 3; - - const uint32 palette_offset = ((vce_rendercache.palette_offset[1 + (n >> 1)] >> ((n & 1) ? 8 : 0)) << 1) & 0x1FF; - const uint32 * const palette_ptr = &vce_rendercache.palette_table_cache[palette_offset]; - - { - int wmul = (1 << bat_width_shift), wmask = (1 << bat_height_shift) - 1; - int sexy_y_pos = (YOffset & wmask) * wmul; - - #if 0 - #define BGFAST_BATMODE (bgmode & 0x8) - #include "king-bgfast-blit.inc" - - #else - if(bgmode & 0x8) - { - #define BGFAST_BATMODE 1 - #include "king-bgfast-blit.inc" - #undef BGFAST_BATMODE - } - else - { - #define BGFAST_BATMODE 0 - #include "king-bgfast-blit.inc" - #undef BGFAST_BATMODE - } - #endif - } -} - diff --git a/waterbox/pcfx/king.cpp b/waterbox/pcfx/king.cpp deleted file mode 100644 index c2b67e446e..0000000000 --- a/waterbox/pcfx/king.cpp +++ /dev/null @@ -1,3840 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* king.cpp - Emulation of HuC6261(VCE descendant) and the HuC6272(KING) -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* Note: Some technical comments may be outdated */ - -/* - Current issues: - VCE "natural" priorities for the layers when their priorities are the same(technically an illegal condition) are probably not correct. A game test case: "Miraculum" erroneously sets - up the priority registers like this after exiting the airship(I believe). - - SCSI RST interrupt timing is guessed(and with nothing to go on), so it definitely needs to be tested on the real thing. - - The data bus is not handled/asserted properly. Excluding pseudo-DMA and DMA modes(which I'd need to test), the data bus will only be asserted if the lower bit of register 0x1 is set, and the - phase match bits must match the state of the C/D, I/O, and MSG signals(IE there isn't a bus mismatch state). - - Raw subchannel reading timing is probably wrong. - - KRAM mode register is not emulated(I'm not even sure what it does exactly). -*/ - -#include "pcfx.h" -#include "king.h" -#include "cdrom/cdromif.h" -#include "cdrom/scsicd.h" -#include "interrupt.h" -#include "rainbow.h" -#include "soundbox.h" -#include "input.h" -#include "timer.h" -#include -//#include -#include "sound/OwlResampler.h" - -#ifdef __MMX__ -#include -#endif - -namespace MDFN_IEN_PCFX -{ - -#define KINGDBG(format, ...) (void)0 -//#define KINGDBG FXDBG -#define KING_UNDEF FXDBG -#define ADPCMDBG(format, ...) (void)0 -//FXDBG - -/* - SCSI Questions(this list needs to be revised more and merged into the issues list at the beginning of the file): - - What happens when there is no more data to transfer during DMA and the status SCSI bus phase is entered(before the DMA count reaches 0)? - - Why is the "sequential DMA" bit needed? - - Which SCSI registers return the values of the SCSI bus, and which return latched values(from previous writes or pseudo-DMA)? - - Is real DMA layered on top of pseudo-DMA? Reading the developer documents, it looks that way. - - What triggers the setting of ACK during pseudo-DMA? A timer? Reading from the upper 16-bits of KING register 0x05? The lower bits(in which case, - the value would be latched..)? - -*/ - -// 16 bit YUV format: upper 8 bits Y, next 4 bits U, lower 4 bits V, transformed to 8-bit U and 8-bit V by shifting in 0 in lower bits. - -typedef struct -{ - uint8 AR; - - uint16 priority[2]; /* uint16 0: - bit 3-0: Legacy VDC BG priority? - bit 7-4: Legacy VDC SPR priority? - bit 11-8: RAINBOW(MJPEG) priority - uint16 1: - bit 3-0: KING BG0 priority - bit 7-4: KING BG1 priority - bit 11-8: KING BG2 priority - bit 15-12: KING BG3 priority - */ - - bool odd_field; /* TRUE if interlaced mode is enabled and we're in the odd field, FALSE otherwise. */ - - bool in_hblank; /* TRUE if we're in H-blank */ - bool in_vdc_hsync; - - bool frame_interlaced; - - uint16 picture_mode; - - bool dot_clock; // Cached from picture_mode in hblank - uint32 dot_clock_ratio; // Cached from picture mode in hblank - int32 clock_divider; - - int32 vdc_event[2]; - - uint32 raster_counter; - - uint16 palette_rw_offset; // Read/write offset - uint16 palette_rw_latch; - - uint16 palette_offset[4]; // - // BMG1 and BMG 0 in [1](BMG1 in upper 8 bits, BMG0 in lower), BMG2 and 3 in [2] - // RAINBOW in lower(?) 8 bits of [3]? - - uint16 palette_table[512]; // The YUV palette, woohoo! - - // Chroma keys, minimum value in lower 8 bits, maximum value in upper 8 bits - uint16 ChromaKeyY; // Register 0xA - uint16 ChromaKeyU; // Register 0xB - uint16 ChromaKeyV; // register 0xC - - uint16 CCR; // Register 0x0D, fixed color register, 16-bit YUV - uint16 BLE; // Register 0x0E, cellophane setting register - // 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 - // F/B |E/D | IDU |CTRL BMG3|CTRL BMG2|CTRL BMG1|CTRL BMG0| VDP SP | VDP BG - // IDU is AKA Rainbow - // F/B - // 0 = Back cellophane. - // 1 = Front cellophane. - // E/D - // 0 = Back/Front cellophane off - // 1 = Back/Front cellophane on - // Ctrl format: - // 00 = Cellophane disabled. - // 01 = Cellophane with 1A/1B(Coeffs 0, 1?) - // 02 = Cellophane with 2A/2B(Coeffs 2, 3?) - // 03 = Cellophane with 3A/3B(Coeffs 4, 5?) - - uint16 SPBL; // Register 0x0F, Sprite cellophane setting register - // Specifies a color palette bank for which cellophane will always be disabled. - - uint16 coefficients[6]; // Cellophane coefficients, YUV, 4-bits each, on the least-significant end(xxxxYYYYUUUUVVVV). - // Valid settings: 0(cellophane disabled for layer), 1-8. 9-F are "unsupported". -} fx_vce_t; - -fx_vce_t fx_vce; - -// -// VCE render cache, including registers cached at hblank -// -typedef struct -{ - uint16 priority[2]; - uint16 picture_mode; - - uint16 palette_offset[4]; - uint32 palette_table_cache[512 * 2]; // 24-bit YUV cache for SPEED(HAH), * 2 to remove need for & 0x1FF in rendering code - - uint16 ChromaKeyY; - uint16 ChromaKeyU; - uint16 ChromaKeyV; - - uint16 CCR; - uint16 BLE; - - uint16 SPBL; - - uint16 coefficients[6]; - - uint8 coefficient_mul_table_y[16][256]; - int8 coefficient_mul_table_uv[16][256]; - - uint32 LayerPriority[8]; // [LAYER_n] = ordered_priority_for_n(real priority 0-15 mapped to 1-7) - // priority = 0, layer is disabled(via the layer enable bit not being set) -} vce_rendercache_t; - -static vce_rendercache_t vce_rendercache; - -static int32 scsicd_ne; - -enum -{ - HPHASE_ACTIVE = 0, - HPHASE_HBLANK_PART1, - HPHASE_HBLANK_PART3, - HPHASE_HBLANK_PART4, - HPHASE_COUNT -}; - -static int32 HPhase; -static int32 HPhaseCounter; -static uint32 vdc_lb_pos; - -alignas(8) static uint16 vdc_linebuffers[2][512]; -alignas(8) static uint32 vdc_linebuffer[512]; -alignas(8) static uint32 vdc_linebuffer_yuved[512]; -alignas(8) static uint32 rainbow_linebuffer[256]; - -// 8 * 2 for left + right padding for scrolling -alignas(8) static uint32 bg_linebuffer[256 + 8 + 8]; - -// Don't change these enums, there are some hardcoded values still used(particularly, LAYER_NONE). -enum -{ - LAYER_NONE = 0, - LAYER_BG0, - LAYER_BG1, - LAYER_BG2, - LAYER_BG3, - LAYER_VDC_BG, - LAYER_VDC_SPR, - LAYER_RAINBOW -}; - -static uint8 VCEPrioMap[8][8][8][4]; // [n][n][n][3] is dummy, for padding to a power of 2. - -static void BuildCMT(void) -{ - for (int coeff = 0; coeff < 16; coeff++) - { - for (int value = 0; value < 256; value++) - { - vce_rendercache.coefficient_mul_table_y[coeff][value] = (value * coeff / 8); // Y - vce_rendercache.coefficient_mul_table_uv[coeff][value] = ((value - 128) * coeff / 8); // UV - } - } -} - -static INLINE void RebuildLayerPrioCache(void) -{ - vce_rendercache_t *vr = &vce_rendercache; - - vr->LayerPriority[LAYER_NONE] = 0; - - for (int n = 0; n < 4; n++) - { - if (((fx_vce.picture_mode >> (10 + n)) & 1)) - { - vr->LayerPriority[LAYER_BG0 + n] = (((vce_rendercache.priority[1] >> (n * 4)) & 0xF) + 1); - if (vr->LayerPriority[LAYER_BG0 + n] > 8) - { - printf("KING BG%d Priority Too Large: %d\n", n, vr->LayerPriority[LAYER_BG0 + n] - 1); - vr->LayerPriority[LAYER_BG0 + n] = 0; - } - } - else - vr->LayerPriority[LAYER_BG0 + n] = 0; - } - - if (fx_vce.picture_mode & 0x0100) - { - vr->LayerPriority[LAYER_VDC_BG] = ((vce_rendercache.priority[0] & 0xF) + 1); - if (vr->LayerPriority[LAYER_VDC_BG] > 8) - { - printf("VDC BG Priority Too Large: %d\n", vr->LayerPriority[LAYER_VDC_BG] - 1); - vr->LayerPriority[LAYER_VDC_BG] = 0; - } - } - else - vr->LayerPriority[LAYER_VDC_BG] = 0; - - if (fx_vce.picture_mode & 0x0200) - { - vr->LayerPriority[LAYER_VDC_SPR] = (((vce_rendercache.priority[0] >> 4) & 0xF) + 1); - if (vr->LayerPriority[LAYER_VDC_SPR] > 8) - { - printf("VDC SPR Priority Too Large: %d\n", vr->LayerPriority[LAYER_VDC_SPR] - 1); - vr->LayerPriority[LAYER_VDC_SPR] = 0; - } - } - else - vr->LayerPriority[LAYER_VDC_SPR] = 0; - - if (fx_vce.picture_mode & 0x4000) - { - vr->LayerPriority[LAYER_RAINBOW] = (((vce_rendercache.priority[0] >> 8) & 0xF) + 1); - if (vr->LayerPriority[LAYER_RAINBOW] > 8) - { - printf("RAINBOW Priority Too Large: %d\n", vr->LayerPriority[LAYER_RAINBOW] - 1); - vr->LayerPriority[LAYER_RAINBOW] = 0; - } - } - else - vr->LayerPriority[LAYER_RAINBOW] = 0; - - // At this point, all entries in vr->LayerPriority should be one of 0 through 8(inclusive). - - int RemapPriority = 1; - bool Done[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - - for (unsigned int i = 1; i < (1 + 8); i++) - { - for (int n = 0; n < 4; n++) - { - if (vr->LayerPriority[LAYER_BG0 + n] == i && !Done[LAYER_BG0 + n]) - { - vr->LayerPriority[LAYER_BG0 + n] = RemapPriority++; - Done[LAYER_BG0 + n] = true; - } - } - - if (vr->LayerPriority[LAYER_VDC_BG] == i && !Done[LAYER_VDC_BG]) - { - vr->LayerPriority[LAYER_VDC_BG] = RemapPriority++; - Done[LAYER_VDC_BG] = true; - } - - if (vr->LayerPriority[LAYER_VDC_SPR] == i && !Done[LAYER_VDC_SPR]) - { - vr->LayerPriority[LAYER_VDC_SPR] = RemapPriority++; - Done[LAYER_VDC_SPR] = true; - } - - if (vr->LayerPriority[LAYER_RAINBOW] == i && !Done[LAYER_RAINBOW]) - { - vr->LayerPriority[LAYER_RAINBOW] = RemapPriority++; - Done[LAYER_RAINBOW] = true; - } - } - assert(RemapPriority <= 8); - - //if(fx_vce.raster_counter == 50) - // MDFN_DispMessage("%d BG0: %d %d %d %d, VBG: %d, VSPR: %d, RAIN: %d", vr->LayerPriority[0], vr->LayerPriority[1], vr->LayerPriority[2], vr->LayerPriority[3], - // vr->LayerPriority[4], vr->LayerPriority[5], vr->LayerPriority[6], vr->LayerPriority[7]); -} - -// Call this function in FX VCE hblank(or at the end/immediate start of active display) -static void DoHBlankVCECaching(void) -{ - const fx_vce_t *source = &fx_vce; - vce_rendercache_t *dest = &vce_rendercache; - - dest->picture_mode = source->picture_mode; - - fx_vce.dot_clock = (bool)(fx_vce.picture_mode & 0x08); - fx_vce.dot_clock_ratio = (fx_vce.picture_mode & 0x08) ? 3 : 4; - - for (int i = 0; i < 2; i++) - dest->priority[i] = source->priority[i]; - - for (int i = 0; i < 4; i++) - dest->palette_offset[i] = source->palette_offset[i]; - - dest->ChromaKeyY = source->ChromaKeyY; - dest->ChromaKeyU = source->ChromaKeyU; - dest->ChromaKeyV = source->ChromaKeyV; - - dest->CCR = source->CCR; - dest->BLE = source->BLE; - dest->SPBL = source->SPBL; - - for (int i = 0; i < 6; i++) - dest->coefficients[i] = source->coefficients[i]; - - RebuildLayerPrioCache(); -} - -static INLINE void RedoPaletteCache(int n) -{ - uint32 YUV = fx_vce.palette_table[n]; - uint8 Y = (YUV >> 8) & 0xFF; - uint8 U = (YUV & 0xF0); - uint8 V = (YUV & 0x0F) << 4; - - vce_rendercache.palette_table_cache[n] = - vce_rendercache.palette_table_cache[0x200 | n] = (Y << 16) | (U << 8) | (V << 0); -} - -enum -{ - BGMODE_INVALID = 0, - BGMODE_4 = 1, - BGMODE_16 = 2, - BGMODE_256 = 3, - BGMODE_64K = 4, - BGMODE_16M = 5, - BGMODE_64K_EXTDOT = 6, - BGMODE_16M_EXTDOT = 7, -}; - -typedef struct -{ - uint8 AR; - - uint32 KRAMRA, KRAMWA; - uint8 KRAM_Mode; - - uint32 PageSetting; - uint16 *RainbowPagePtr, *DMAPagePtr; // Calculated off of PageSetting - - uint16 bgmode; // 4 bits each BG: 3333 2222 1111 0000 - /* Possible settings: - 0x0: Invalid? - 0x1: 4-color palette, 1 byte for 4 pixels, transparent on entry 0 - 0x2: 16-color palette, 1 byte for 2 pixels, transparent on entry 0 - 0x3: 256-color palette, 1 byte for 1 pixel, transparent on entry 0 - 0x4: 64K color(Y-8, U-4, V-4), 1 halfword for 1 pixel, transparent on Y=0 - 0x5: 16M colors(Y-8, Y-8, U-8, V-8, 4 bytes for 2 pixels), transparent on Y=0 - - If & 8, enable palette bank mode(only for 4 and 16-colors)??? - BAT format would be PPPPCCCCCCCCCCCC in this mode. - 4 color: 00PPPPnn 16 color: PPPPnnnn, where "n" is the 2 or 4-bit pixel data - */ - uint16 priority; - - uint16 BGScrollMode; // Register 0x16 - uint16 BGSize[4]; - - uint8 BGBATAddr[4]; - uint8 BGCGAddr[4]; - uint8 BG0SubBATAddr, BG0SubCGAddr; - - uint16 BGXScroll[4]; - uint16 BGYScroll[4]; - - uint16 BGAffinA, BGAffinB, BGAffinC, BGAffinD; - uint16 BGAffinCenterX, BGAffinCenterY; - - uint16 ADPCMControl; - uint16 ADPCMBufferMode[2]; - - uint16 ADPCMSAL[2]; - - uint32 ADPCMEndAddress[2]; - uint32 ADPCMPlayAddress[2]; - uint16 ADPCMIntermediateAddress[2]; - uint16 ADPCMStatus[2]; // Register 0x53, a bit maimed :) - bool ADPCMIRQPending; - - uint16 RAINBOWTransferControl; // Register 0x40 - uint32 RAINBOWKRAMA; // Register 0x41 - uint16 RAINBOWTransferStartPosition; // Register 0x42, line number(0-262) - uint16 RAINBOWTransferBlockCount; // Register 0x43 - - bool RAINBOWStartPending; - int32 RAINBOWBusyCount, RAINBOWBlockCount; - - uint16 RasterIRQLine; // Register 0x44 - bool RasterIRQPending; - - uint32 RAINBOWKRAMReadPos; - - bool DMATransferFlipFlop; - uint32 DMATransferAddr; // Register 0x09 - uint32 DMATransferSize; // Register 0x0A - uint16 DMAStatus; // Register 0x0B - uint8 DMALatch; - - uint16 MPROGControl; // register 0x15 - uint16 MPROGControlCache; - uint16 MPROGAddress; - uint16 MPROGData[0x10]; - - bool DMAInterrupt; - uint8 Reg00; - uint8 Reg01; - uint8 Reg02; - uint8 Reg03; - - uint8 SubChannelControl; - - bool CDInterrupt, SubChannelInterrupt; - uint8 SubChannelBuf; - uint8 data_cache; - - bool DRQ; - bool dma_receive_active; - bool dma_send_active; - int32 dma_cycle_counter; - int32 lastts; - - uint16 KRAM[2][262144]; - -#define KING_MAGIC_INTERVAL 10 //4 //32 //10 -} king_t; - -static king_t *king = NULL; - -static uint8 BGLayerDisable; -static bool RAINBOWLayerDisable; - -static void RedoKINGIRQCheck(void); - -static INLINE void REGSETP(uint16 ®, const uint8 data, const bool msb) -{ - reg &= 0xFF << (msb ? 0 : 8); - reg |= data << (msb ? 8 : 0); -} - -#ifdef WANT_DEBUGGER -static bool KRAMReadBPE = FALSE; -static bool KRAMWriteBPE = FALSE; - -void KING_NotifyOfBPE(bool read, bool write) -{ - KRAMReadBPE = read; - KRAMWriteBPE = write; - - //FXVDC_SetAux0BPBpase(fx_vdc_chips[0], (read || write) ? 0x80000 : ~0); - //FXVDC_SetAux0BPBpase(fx_vdc_chips[1], (read || write) ? 0x90000 : ~0); -} - -static void (*KINGLog)(const char *, const char *, ...) = NULL; -void KING_SetLogFunc(void (*logfunc)(const char *, const char *, ...)) -{ - KINGLog = logfunc; -} - -uint8 KING_MemPeek(uint32 A) -{ - uint8 ret = king->KRAM[(A & 0x80000) ? 1 : 0][A >> 1] >> ((A & 1) * 8); - - return (ret); -} - -static void Do16BitGet(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) -{ - int wc = 0; - - if (!strcmp(name, "vdcvram0")) - wc = 0; - else if (!strcmp(name, "vdcvram1")) - wc = 1; - - while (Length) - { - uint16 data; - - data = fx_vdc_chips[wc & 1]->PeekVRAM((Address >> 1) & 0xFFFF); - - if ((Address & 1) || Length == 1) - { - *Buffer = data >> ((Address & 1) << 3); - Buffer++; - Address++; - Length--; - } - else - { - Buffer[0] = data & 0xFF; - Buffer[1] = data >> 8; - - Buffer += 2; - Address += 2; - Length -= 2; - } - } -} - -static void Do16BitPut(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) -{ - int wc = 0; - - if (!strcmp(name, "vdcvram0")) - wc = 0; - else if (!strcmp(name, "vdcvram1")) - wc = 1; - - while (Length) - { - uint16 data; - int inc_amount; - - if ((Address & 1) || Length == 1) - { - data = fx_vdc_chips[wc & 1]->PeekVRAM((Address >> 1) & 0xFFFF); - - data &= ~(0xFF << ((Address & 1) << 3)); - data |= *Buffer << ((Address & 1) << 3); - - inc_amount = 1; - } - else - { - data = Buffer[0] | (Buffer[1] << 8); - inc_amount = 2; - } - - fx_vdc_chips[wc & 1]->PokeVRAM((Address >> 1) & 0xFFFF, data); - - Buffer += inc_amount; - Address += inc_amount; - Length -= inc_amount; - } -} - -static void KING_GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) -{ - if (!strcmp(name, "kram0") || !strcmp(name, "kram1")) - { - int wk = name[4] - '0'; - - while (Length--) - { - *Buffer = king->KRAM[wk][(Address >> 1) & 0x3ffff] >> ((Address & 1) * 8); - Address++; - Buffer++; - } - } - else if (!strcmp(name, "vce")) - { - while (Length--) - { - Address &= 0x3FF; - *Buffer = fx_vce.palette_table[Address >> 1] >> ((Address & 1) * 8); - Address++; - Buffer++; - } - } -} - -static void KING_PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) -{ - if (!strcmp(name, "kram0") || !strcmp(name, "kram1")) - { - int wk = name[4] - '0'; - - while (Length--) - { - REGSETP(king->KRAM[wk][(Address >> 1) & 0x3ffff], *Buffer, Address & 1); - Address++; - Buffer++; - } - } - else if (!strcmp(name, "vce")) - { - while (Length--) - { - Address &= 0x3FF; - REGSETP(fx_vce.palette_table[Address >> 1], *Buffer, Address & 1); - RedoPaletteCache(Address >> 1); - Address++; - Buffer++; - } - } -} -#endif - -static void RecalcKRAMPagePtrs(void) -{ - king->RainbowPagePtr = king->KRAM[(king->PageSetting & 0x1000) ? 1 : 0]; - king->DMAPagePtr = king->KRAM[king->PageSetting & 1]; -} - -uint8 KING_RB_Fetch(void) -{ - uint8 ret = king->RainbowPagePtr[(king->RAINBOWKRAMReadPos >> 1) & 0x3FFFF] >> ((king->RAINBOWKRAMReadPos & 1) * 8); - - king->RAINBOWKRAMReadPos = ((king->RAINBOWKRAMReadPos + 1) & 0x3FFFF) | (king->RAINBOWKRAMReadPos & 0x40000); - - return (ret); -} - -static void DoRealDMA(uint8 db) -{ - if (!king->DMATransferFlipFlop) - king->DMALatch = db; - else - { - king->DMAPagePtr[king->DMATransferAddr & 0x3FFFF] = king->DMALatch | (db << 8); - king->DMATransferAddr = ((king->DMATransferAddr + 1) & 0x1FFFF) | (king->DMATransferAddr & 0x20000); - king->DMATransferSize = (king->DMATransferSize - 2) & 0x3FFFF; - if (!king->DMATransferSize) - { - KINGDBG("DMA Done\n"); - king->DMAInterrupt = TRUE; - RedoKINGIRQCheck(); - king->DMAStatus &= ~1; - return; - } - } - king->DMATransferFlipFlop ^= 1; -} - -uint16 FXVCE_Read16(uint32 A) -{ - // bit 4-0: Register number - // bit 13-5: Raster counter - // bit 14: In interlace mode and when on odd fields set bit. - // bit 15: "0" during blanking(h or v), "1" during active screen area - // Raster counter increments a few cycles after the start of hblank. - - if (!(A & 0x4)) - { - uint16 fullret = 0; - - fullret |= fx_vce.AR; - fullret |= fx_vce.odd_field ? 0x4000 : 0x0000; - fullret |= fx_vce.raster_counter << 5; - - if (fx_vce.in_hblank || fx_vce.raster_counter < 22 || fx_vce.raster_counter == 262) - fullret |= 0 << 15; // Clear on blanking - else - fullret |= 1 << 15; // Set on active display. - - return (fullret); - } - else - { - switch (fx_vce.AR) // No idea which registers are readable, so make them all readable :b - { - default: - break; - case 0x00: - return (fx_vce.picture_mode); - case 0x01: - return (fx_vce.palette_rw_offset); - case 0x03: // Boundary Gate reads from 0x03 expecting palette data... - case 0x02: - { - uint16 ret = fx_vce.palette_rw_latch; - fx_vce.palette_rw_offset = (fx_vce.palette_rw_offset + 1) & 0x1FF; - fx_vce.palette_rw_latch = fx_vce.palette_table[fx_vce.palette_rw_offset]; - return (ret); - } - case 0x04: - return (fx_vce.palette_offset[0]); - case 0x05: - return (fx_vce.palette_offset[1]); - case 0x06: - return (fx_vce.palette_offset[2]); - case 0x07: - return (fx_vce.palette_offset[3]); - case 0x08: - return (fx_vce.priority[0]); - case 0x09: - return (fx_vce.priority[1]); - case 0x0a: - return (fx_vce.ChromaKeyY); - case 0x0b: - return (fx_vce.ChromaKeyU); - case 0x0c: - return (fx_vce.ChromaKeyV); - - case 0x0d: - return (fx_vce.CCR); - case 0x0e: - return (fx_vce.BLE); - case 0x0f: - return (fx_vce.SPBL); - case 0x10: - return (fx_vce.coefficients[0]); - case 0x11: - return (fx_vce.coefficients[1]); - - case 0x12: - return (fx_vce.coefficients[2]); - case 0x13: - return (fx_vce.coefficients[3]); - - case 0x14: - return (fx_vce.coefficients[4]); - case 0x15: - return (fx_vce.coefficients[5]); - } - } - - return (0); -} - -void FXVCE_Write16(uint32 A, uint16 V) -{ - if (!(A & 0x4)) - { - fx_vce.AR = V & 0x1F; - } - else - { - switch (fx_vce.AR) - { - case 0x00: - fx_vce.picture_mode = V; - break; - - case 0x01: - fx_vce.palette_rw_offset = V & 0x1FF; - fx_vce.palette_rw_latch = fx_vce.palette_table[fx_vce.palette_rw_offset]; - break; - - case 0x02: - fx_vce.palette_rw_latch = V; - fx_vce.palette_table[fx_vce.palette_rw_offset] = fx_vce.palette_rw_latch; - RedoPaletteCache(fx_vce.palette_rw_offset); - fx_vce.palette_rw_offset = (fx_vce.palette_rw_offset + 1) & 0x1FF; - break; - - case 0x04: - fx_vce.palette_offset[0] = V; - break; - case 0x05: - fx_vce.palette_offset[1] = V; - break; - case 0x06: - fx_vce.palette_offset[2] = V; - break; - case 0x07: - fx_vce.palette_offset[3] = V & 0x00FF; - break; - case 0x08: - fx_vce.priority[0] = V & 0x0777; - break; - case 0x09: - fx_vce.priority[1] = V & 0x7777; - break; - - case 0x0a: - fx_vce.ChromaKeyY = V; - break; - case 0x0b: - fx_vce.ChromaKeyU = V; - break; - case 0x0c: - fx_vce.ChromaKeyV = V; - break; - - case 0x0d: - fx_vce.CCR = V; - break; - case 0x0e: - fx_vce.BLE = V; - break; - case 0x0f: - fx_vce.SPBL = V; - break; - - case 0x10: - fx_vce.coefficients[0] = V & 0xFFF; - break; - case 0x11: - fx_vce.coefficients[1] = V & 0xFFF; - break; - - case 0x12: - fx_vce.coefficients[2] = V & 0xFFF; - break; - case 0x13: - fx_vce.coefficients[3] = V & 0xFFF; - break; - - case 0x14: - fx_vce.coefficients[4] = V & 0xFFF; - break; - case 0x15: - fx_vce.coefficients[5] = V & 0xFFF; - break; - } - } -} - -static void RedoKINGIRQCheck(void) -{ - bool asserted = 0; - - if (king->ADPCMIRQPending) - { - asserted = 1; - } - - if (king->DMAInterrupt && (king->DMAStatus & 0x2)) - { - asserted = 1; - } - - if (king->CDInterrupt) - { - asserted = 1; - } - - if (king->SubChannelInterrupt) - asserted = 1; - - if (king->RasterIRQPending) - asserted = 1; - - PCFXIRQ_Assert(PCFXIRQ_SOURCE_KING, asserted); -} - -void KING_CDIRQ(int type) -{ - if (type == SCSICD_IRQ_MAGICAL_REQ) - { - if (king->Reg02 & 0x2) - { - if (SCSICD_GetIO() != ((king->Reg03 >> 0) & 1) || - SCSICD_GetCD() != ((king->Reg03 >> 1) & 1) || - SCSICD_GetMSG() != ((king->Reg03 >> 2) & 1)) - { - KINGDBG("Phase mismatch interrupt asserted.\n"); - king->CDInterrupt = TRUE; - RedoKINGIRQCheck(); - } - } - } -} - -void KING_StuffSubchannels(uint8 subchannels, int subindex) -{ - if (king->SubChannelControl & 0x1) - { - if (subindex == -2) - king->SubChannelBuf = 0x00; - else if (subindex == -1) - king->SubChannelBuf = 0x80; - else - king->SubChannelBuf = (subchannels & 0x7F); - - if (king->SubChannelControl & 0x2) - { - king->SubChannelInterrupt = TRUE; - RedoKINGIRQCheck(); - } - } -} - -uint8 KING_Read8(const v810_timestamp_t timestamp, uint32 A) -{ - uint8 ret = KING_Read16(timestamp, A & ~1) >> ((A & 1) * 8); - - //printf("Read8: %04x\n", A); - return (ret); -} - -void KING_EndFrame(v810_timestamp_t timestamp) -{ - PCFX_SetEvent(PCFX_EVENT_KING, KING_Update(timestamp)); - scsicd_ne = SCSICD_Run(timestamp); -} - -void KING_ResetTS(v810_timestamp_t ts_base) -{ - SCSICD_ResetTS(ts_base); - - king->lastts = ts_base; - - if (king->dma_cycle_counter & 0x40000000) - { - king->dma_cycle_counter = 0x7FFFFFFF; - } -} - -//static INLINE void StartKingMagic(void) -//{ -// king->lastts = v810_timestamp; -// king->dma_cycle_counter = KING_MAGIC_INTERVAL; -// PCFX_SetEvent(PCFX_EVENT_KING, KING_MAGIC_INTERVAL); -//} - -static INLINE int32 CalcNextEvent(int32 next_event) -{ - if (king->dma_cycle_counter < next_event) - next_event = king->dma_cycle_counter; - - if (scsicd_ne < next_event) - next_event = scsicd_ne; - - return (next_event); -} - -static int32 CalcNextExternalEvent(int32 next_event) -{ - // 100 = Hack to make the emulator go faster during CD DMA transfers. - if (king->dma_cycle_counter < next_event) - next_event = 100; //king->dma_cycle_counter; - - if (scsicd_ne < next_event) - next_event = scsicd_ne; - - if (next_event > HPhaseCounter) - next_event = HPhaseCounter; - - //printf("KING: %d %d %d; %d\n", king->dma_cycle_counter, scsicd_ne, HPhaseCounter, next_event); - - for (int chip = 0; chip < 2; chip++) - { - int fwoom = (fx_vce.vdc_event[chip] * fx_vce.dot_clock_ratio - fx_vce.clock_divider); - - if (fwoom < 1) - fwoom = 1; - - if (next_event > fwoom) - next_event = fwoom; - } - - return (next_event); -} - -static void MDFN_FASTCALL KING_RunGfx(int32 clocks); - -v810_timestamp_t MDFN_FASTCALL KING_Update(const v810_timestamp_t timestamp) -{ - int32 clocks = timestamp - king->lastts; - uint32 running_timestamp = king->lastts; - - //printf("KING Run for: %d\n", clocks); - - king->lastts = timestamp; - - KING_RunGfx(clocks); - - while (clocks > 0) - { - int32 chunk_clocks = CalcNextEvent(clocks); - - running_timestamp += chunk_clocks; - clocks -= chunk_clocks; - - scsicd_ne -= chunk_clocks; - if (scsicd_ne <= 0) - scsicd_ne = SCSICD_Run(running_timestamp); - - king->dma_cycle_counter -= chunk_clocks; - if (king->dma_cycle_counter <= 0) - { - //assert(king->dma_receive_active || king->dma_send_active); - king->dma_cycle_counter += KING_MAGIC_INTERVAL; - if (king->dma_receive_active) - { - if (!SCSICD_GetCD() && SCSICD_GetIO()) - { - if (SCSICD_GetREQ() && !SCSICD_GetACK()) - { - if (!king->DRQ) - { - king->DRQ = TRUE; - king->data_cache = SCSICD_GetDB(); - //SCSICD_SetACK(TRUE); - //PCFX_SetEvent(PCFX_EVENT_SCSI, SCSICD_Run(timestamp)); - - if (king->DMAStatus & 0x1) - { - king->DRQ = FALSE; - DoRealDMA(king->data_cache); - SCSICD_SetACK(TRUE); - scsicd_ne = SCSICD_Run(running_timestamp); - } - } - } - else if (SCSICD_GetACK() && !SCSICD_GetREQ()) - { - SCSICD_SetACK(FALSE); - scsicd_ne = SCSICD_Run(running_timestamp); - } - } - } - else if (king->dma_send_active) - { - if (!SCSICD_GetIO()) - { - if (SCSICD_GetREQ() && !SCSICD_GetACK()) - { - if (!king->DRQ) - { - //KINGDBG("Did write: %02x\n", king->data_cache); - SCSICD_SetDB(king->data_cache); - SCSICD_SetACK(TRUE); - scsicd_ne = SCSICD_Run(running_timestamp); - king->DRQ = TRUE; - } - } - else if (SCSICD_GetACK() && !SCSICD_GetREQ()) - { - SCSICD_SetACK(FALSE); - scsicd_ne = SCSICD_Run(running_timestamp); - } - } - } - } - } // end while(clocks > 0) - - return (timestamp + CalcNextExternalEvent(0x4FFFFFFF)); -} - -uint16 KING_Read16(const v810_timestamp_t timestamp, uint32 A) -{ - int msh = A & 2; - uint16 ret = 0; - - KING_Update(timestamp); - - //printf("KRead16: %08x, %d; %04x\n", A, timestamp, king->AR); - - switch (A & 0x704) - { - case 0x600: // ?CDSRP?? AAAAAAAA - // C = 0x4000, SCSI interrupt - // D = 0x2000, DMA IRQ - // S = 0x1000, CD Subchannel IRQ? - // R = 0x0800, Raster IRQ - // P = 0x0400, ADPCM IRQ - - if (!msh) - { - ret = king->AR; - - if (king->ADPCMIRQPending) - ret |= 0x400; - - if (king->SubChannelInterrupt) - ret |= 0x1000; - - // Gaaah, this is probably a hack...Anime Freak FX Vol 4 gets confused and crashes - // if both bits are set at once. - if (king->DMAInterrupt && (king->DMAStatus & 0x2)) - ret |= 0x2000; - else if (king->CDInterrupt) - ret |= 0x4000; - - if (king->RasterIRQPending) - ret |= 0x800; - - king->SubChannelInterrupt = FALSE; - king->RasterIRQPending = FALSE; - RedoKINGIRQCheck(); - } - else - { - ret |= SCSICD_GetSEL() ? 0x02 : 0x00; - ret |= SCSICD_GetIO() ? 0x04 : 0x00; - ret |= SCSICD_GetCD() ? 0x08 : 0x00; - ret |= SCSICD_GetMSG() ? 0x10 : 0x00; - ret |= SCSICD_GetREQ() ? 0x20 : 0x00; - ret |= SCSICD_GetBSY() ? 0x40 : 0x00; - ret |= SCSICD_GetRST() ? 0x80 : 0x00; - - ret |= king->SubChannelBuf << 8; - } - break; // status... - - case 0x604: - switch (king->AR) - { - default: - KINGDBG("Unknown 16-bit register read: %02x\n", king->AR); - break; - - case 0x00: - ret = SCSICD_GetDB(); - break; - - case 0x01: - ret = REGGETHW(king->Reg01, msh); - break; - - case 0x02: - ret = REGGETHW(king->Reg02, msh); - break; - - case 0x03: - ret = REGGETHW(king->Reg03, msh); - break; - - case 0x04: - if (!msh) - { - ret |= SCSICD_GetSEL() ? 0x02 : 0x00; - ret |= SCSICD_GetIO() ? 0x04 : 0x00; - ret |= SCSICD_GetCD() ? 0x08 : 0x00; - ret |= SCSICD_GetMSG() ? 0x10 : 0x00; - ret |= SCSICD_GetREQ() ? 0x20 : 0x00; - ret |= SCSICD_GetBSY() ? 0x40 : 0x00; - ret |= SCSICD_GetRST() ? 0x80 : 0x00; - } - break; - - case 0x05: - if (king->Reg01 & 0x80) - { - ret = 0x00; - break; - } - - if (msh) - { - ret = king->data_cache; - //printf("Fooball: %02x\n", ret); - if (king->dma_receive_active) - { - king->DRQ = FALSE; - SCSICD_SetACK(TRUE); - scsicd_ne = 1; - } - } - else - { - ret |= SCSICD_GetACK() ? 0x01 : 0x00; - ret |= SCSICD_GetATN() ? 0x02 : 0x00; - - if (king->dma_receive_active || king->dma_send_active) - if (king->DRQ) - ret |= 0x40; - - // Gaaah, this is probably a hack...Anime Freak FX Vol 4 gets confused and crashes - // if both bits are set at once. - if (!king->DMAInterrupt) - ret |= king->CDInterrupt ? 0x10 : 0x00; - - if (SCSICD_GetIO() == ((king->Reg03 >> 0) & 1) && - SCSICD_GetCD() == ((king->Reg03 >> 1) & 1) && - SCSICD_GetMSG() == ((king->Reg03 >> 2) & 1)) - { - ret |= 0x8; // Phase match - } - } - break; - - case 0x06: // SCSI Input Data Register, same value returned as reading D16-D23 of register 0x05? - KINGDBG("Input data for...?\n"); - ret = king->data_cache; - break; - - case 0x07: - // SCSI IRQ acknowledge/reset - KINGDBG("SCSI IRQ acknowledge\n"); - king->CDInterrupt = FALSE; - RedoKINGIRQCheck(); - ret = 0xFF; - break; - - case 0x08: // Sub-channel data - if (!msh) - { - ret = king->SubChannelBuf; - king->SubChannelBuf = 0; - //puts("Sub-channel data read."); - } - break; - - case 0x09: - ret = REGGETHW(king->DMATransferAddr, msh); - break; - - case 0x0A: - ret = REGGETHW(king->DMATransferSize, msh); - break; - - case 0x0B: // Value read in the BIOS always seems to be discarded... DMA IRQ acknowledge? - if (!msh) - { - ret = king->DMAInterrupt ? 1 : 0; - KINGDBG("DMA IRQ Acknowledge: %d\n", ret); - king->DMAInterrupt = 0; - RedoKINGIRQCheck(); - } - break; - - case 0x0C: - ret = REGGETHW(king->KRAMRA, msh); - break; - - case 0x0D: - ret = REGGETHW(king->KRAMWA, msh); - break; - - case 0x0E: - { - unsigned int page = (king->KRAMRA & 0x80000000) ? 1 : 0; - int32 inc_amount = ((int32)((king->KRAMRA & (0x3FF << 18)) << 4)) >> 22; // Convert from 10-bit signed 2's complement - - ret = king->KRAM[page][king->KRAMRA & 0x3FFFF]; - -#ifdef WANT_DEBUGGER - if (KRAMReadBPE) - PCFXDBG_CheckBP(BPOINT_AUX_READ, (king->KRAMRA & 0x3FFFF) | (page ? 0x40000 : 0), 0, 1); -#endif - - king->KRAMRA = (king->KRAMRA & ~0x1FFFF) | ((king->KRAMRA + inc_amount) & 0x1FFFF); - } - break; - - case 0x0F: - ret = king->PageSetting; - break; - - case 0x10: - ret = REGGETHW(king->bgmode, msh); - break; - - case 0x15: - ret = king->MPROGControl; - break; - - //case 0x40: break; // Super Power League FX reads this, but I think it's write-only. - - case 0x53: - { - ret = king->ADPCMStatus[0] | (king->ADPCMStatus[1] << 2); - - king->ADPCMStatus[0] = king->ADPCMStatus[1] = 0; - king->ADPCMIRQPending = 0; - - RedoKINGIRQCheck(); - - ADPCMDBG("Status read: %02x\n", ret); - } - break; - } - break; - } - - PCFX_SetEvent(PCFX_EVENT_KING, timestamp + CalcNextExternalEvent(0x4FFFFFFF)); // TODO: Optimize this to only be called when necessary. - - return (ret); -} - -void KING_Write8(const v810_timestamp_t timestamp, uint32 A, uint8 V) -{ - KING_Write16(timestamp, A & 0x706, V << ((A & 1) ? 8 : 0)); -} - -static INLINE void SCSI_Reg0_Write(const v810_timestamp_t timestamp, uint8 V, bool delay_run = 0) -{ - king->Reg00 = V; - SCSICD_SetDB(V); - - KINGDBG("WriteDB: %02x\n", V); - - if (!delay_run) - { - scsicd_ne = 1; //SCSICD_Run(timestamp); - } -} - -static INLINE void SCSI_Reg2_Write(const v810_timestamp_t timestamp, uint8 V, bool delay_run = 0) -{ - KINGDBG("SCSI Mode: %04x\n", V); - - /* SCSI Mode Register - D0 = SED: When using with sequential DMA mode, you use. - (It sets the normal DMA mode time to "0".) - Sequential DMA, the number of transfer data bytes which are set to the SCSI device (m) HuC6272 (REG.A) the number - of transfer bytes (n) it sets more largely, abbreviates the status message command phase after the n byte - transferring and being something which makes the transfer after the n + 1 byte possible, it is possible to - increase the transfer performance from the slow SCSI device of CD-ROM and the like. - Sequential DMA cannot use with imitation DMA. When this bit is designated as 1, because -ACK the signal - mandatorily ネゲート it is done, other than the stipulated sequence please do not use. - - D1 = DMA Mode: - When using the SCSI control section with normal DMA mode, "1" is set. - */ - if (!(V & 0x2) && (king->Reg02 & 0x2)) - { - - { // HACK(probably) - king->CDInterrupt = FALSE; - RedoKINGIRQCheck(); - } - - SCSICD_SetACK(0); - - if (!delay_run) - { - scsicd_ne = 1; //SCSICD_Run(timestamp); - } - king->DRQ = FALSE; - - king->dma_receive_active = FALSE; - king->dma_send_active = FALSE; - king->dma_cycle_counter = 0x7FFFFFFF; - } - - king->Reg02 = V; -} - -static INLINE void SCSI_Reg3_Write(const v810_timestamp_t timestamp, uint8 V, bool delay_run = 0) -{ - KINGDBG("Set phase match SCSI bus bits: IO: %d, CD: %d, MSG: %d\n", (int)(bool)(V & 1), (int)(bool)(V & 2), (int)(bool)(V & 4)); - king->Reg03 = V & 0x7; - - if (!delay_run) - { - scsicd_ne = 1; //SCSICD_Run(timestamp); - } -} - -void KING_Write16(const v810_timestamp_t timestamp, uint32 A, uint16 V) -{ - int msh = A & 0x2; - - //printf("Write16: %08x %04x\n", A, V); - - if (!(A & 0x4)) - { - if (!msh) - king->AR = V & 0x7F; - } - else - { - //if(king->AR != 0x0E) - // printf("KING: %02x %04x, %d\n", king->AR, V, fx_vce.raster_counter); - KING_Update(timestamp); - - if (king->AR >= 0x50 && king->AR <= 0x5E) - { - //ADPCMDBG("Write: %02x(%d), %04x", king->AR, msh, V); - } - - switch (king->AR) - { - default: - KINGDBG("Unknown 16-bit register write: %02x %04x %d\n", king->AR, V, msh); - break; - - case 0x00: - if (king->Reg01 & 0x80) - break; - - if (!msh) - { - SCSI_Reg0_Write(timestamp, V); - } - break; - - case 0x01: - if (!msh) - { - KINGDBG("Set SCSI BUS bits; Assert DB: %d, ATN: %d, SEL: %d, ACK: %d, RST: %d, %02x\n", - (int)(bool)(V & 1), (int)(bool)(V & 2), (int)(bool)(V & 4), - (int)(bool)(V & 0x10), (int)(bool)(V & 0x80), SCSICD_GetDB()); - - if (V & 0x80) // RST, silly KING, resets SCSI internal control registers too! - { - if (!(king->Reg01 & 0x80)) - { - SCSI_Reg0_Write(timestamp, 0, TRUE); - SCSI_Reg2_Write(timestamp, 0, TRUE); - SCSI_Reg3_Write(timestamp, 0, TRUE); - king->data_cache = 0x00; - - //king->CDInterrupt = true; - //RedoKINGIRQCheck(); - //puts("KING RST IRQ"); - } - - king->Reg01 = V & 0x80; // Only this bit remains...how lonely. - } - else - { - king->Reg01 = V & (1 | 2 | 4 | 0x10 | 0x80); - - SCSICD_SetATN(V & 2); - SCSICD_SetSEL(V & 4); - SCSICD_SetACK(V & 0x10); - } - SCSICD_SetRST(V & 0x80); - scsicd_ne = 1; - } - break; - - case 0x02: - if (king->Reg01 & 0x80) - break; - - if (!msh) - { - SCSI_Reg2_Write(timestamp, V); - } - break; - - case 0x03: - if (king->Reg01 & 0x80) - break; - - if (!msh) - { - SCSI_Reg3_Write(timestamp, V); - } - break; - - case 0x05: - if (king->Reg01 & 0x80) - break; - - if (!msh) // Start DMA target receive - { - KINGDBG("DMA target receive: %04x, %d\n", V, msh); - king->dma_receive_active = FALSE; - king->dma_send_active = TRUE; - king->DRQ = TRUE; - //StartKingMagic(); - king->dma_cycle_counter = KING_MAGIC_INTERVAL; - } - else - { - if (king->dma_send_active && king->DRQ) - { - //KINGDBG("%02x\n", V); - king->data_cache = V; - king->DRQ = FALSE; - } - } - break; - - case 0x06: - break; // Not used for writes? - - case 0x07: - if (king->Reg01 & 0x80) - break; - - KINGDBG("Start DMA initiator receive: %04x\n", V); - - if (king->Reg02 & 0x2) - { - king->dma_receive_active = TRUE; - king->dma_send_active = FALSE; - //StartKingMagic(); - king->dma_cycle_counter = KING_MAGIC_INTERVAL; - } - break; - - case 0x08: // Sub-channel control - KINGDBG("Sub-channel control: %02x\n", V); - - king->SubChannelControl = V & 0x3; - king->SubChannelInterrupt = FALSE; - RedoKINGIRQCheck(); - break; - - case 0x09: - REGSETHW(king->DMATransferAddr, V, msh); - king->DMATransferAddr &= 0x3FFFF; - break; - case 0x0A: - REGSETHW(king->DMATransferSize, V, msh); - king->DMATransferSize &= 0x3FFFE; - king->DMATransferFlipFlop = 0; - break; - case 0x0B: - REGSETHW(king->DMAStatus, V, msh); - king->DMAStatus &= 0x3; - king->DMAInterrupt = 0; - RedoKINGIRQCheck(); - - king->DMATransferFlipFlop = 0; - - KINGDBG("SCSI DMA: %04x, dest=%06x, page=%d, size=%06x(16-bit words)\n", V, king->DMATransferAddr, king->PageSetting & 1, king->DMATransferSize >> 1); - -#ifdef WANT_DEBUGGER - if (KINGLog) - { - //if(V & 1) - // KINGLog("KING", "SCSI DMA: dest=%06x, page=%d, size=%06x(16-bit words)", king->DMATransferAddr, king->PageSetting & 1, king->DMATransferSize >> 1); - } -#endif - break; - case 0x0C: - REGSETHW(king->KRAMRA, V, msh); - break; - case 0x0D: - REGSETHW(king->KRAMWA, V, msh); - break; - case 0x0E: - { - unsigned int page = (king->KRAMWA & 0x80000000) ? 1 : 0; - int32 inc_amount = ((int32)((king->KRAMWA & (0x3FF << 18)) << 4)) >> 22; // Convert from 10-bit signed 2's complement - -#ifdef WANT_DEBUGGER - if (KRAMWriteBPE) - PCFXDBG_CheckBP(BPOINT_AUX_WRITE, (king->KRAMWA & 0x3FFFF) | (page ? 0x40000 : 0), V, 1); -#endif - - king->KRAM[page][king->KRAMWA & 0x3FFFF] = V; - king->KRAMWA = (king->KRAMWA & ~0x1FFFF) | ((king->KRAMWA + inc_amount) & 0x1FFFF); - } - break; - - // Page settings(0/1) for BG, DMA, ADPCM, and RAINBOW transfers. - case 0x0F: - REGSETHW(king->PageSetting, V, msh); - RecalcKRAMPagePtrs(); - break; - - // Background Modes - case 0x10: - REGSETHW(king->bgmode, V, msh); - break; - - // Background priorities and affine transform master enable. - case 0x12: - if (!msh) - { - king->priority = V; - if (king->priority & ~0x1FFF) - { - KING_UNDEF("Invalid priority bits set: %04x\n", king->priority); - } - } - break; - - // Microprogram Address - case 0x13: - if (!msh) - { - king->MPROGAddress = V & 0xF; - } - break; - - // Microprogram Data Port - case 0x14: - if (!msh) - { - king->MPROGData[king->MPROGAddress] = V; - king->MPROGAddress = (king->MPROGAddress + 1) & 0xF; - } - break; - - case 0x15: - REGSETHW(king->MPROGControl, V, msh); - king->MPROGControl &= 0x1; - break; - - case 0x16: - REGSETHW(king->BGScrollMode, V, msh); - king->BGScrollMode &= 0xF; - break; - - case 0x20: - REGSETHW(king->BGBATAddr[0], V, msh); - break; - case 0x21: - REGSETHW(king->BGCGAddr[0], V, msh); - break; - case 0x22: - REGSETHW(king->BG0SubBATAddr, V, msh); - break; - case 0x23: - REGSETHW(king->BG0SubCGAddr, V, msh); - break; - - case 0x24: - REGSETHW(king->BGBATAddr[1], V, msh); - break; - case 0x25: - REGSETHW(king->BGCGAddr[1], V, msh); - break; - case 0x28: - REGSETHW(king->BGBATAddr[2], V, msh); - break; - case 0x29: - REGSETHW(king->BGCGAddr[2], V, msh); - break; - case 0x2A: - REGSETHW(king->BGBATAddr[3], V, msh); - break; - case 0x2B: - REGSETHW(king->BGCGAddr[3], V, msh); - break; - - case 0x2C: - REGSETHW(king->BGSize[0], V, msh); - break; - case 0x2D: - REGSETHW(king->BGSize[1], V, msh); - king->BGSize[1] &= 0x00FF; - break; - case 0x2E: - REGSETHW(king->BGSize[2], V, msh); - king->BGSize[2] &= 0x00FF; - break; - case 0x2F: - REGSETHW(king->BGSize[3], V, msh); - king->BGSize[3] &= 0x00FF; - break; - - case 0x30: - REGSETHW(king->BGXScroll[0], V, msh); - king->BGXScroll[0] &= 0x7FF; - break; - case 0x31: - REGSETHW(king->BGYScroll[0], V, msh); - king->BGYScroll[0] &= 0x7FF; - break; - - case 0x32: - REGSETHW(king->BGXScroll[1], V, msh); - king->BGXScroll[1] &= 0x3FF; - break; - case 0x33: - REGSETHW(king->BGYScroll[1], V, msh); - king->BGYScroll[1] &= 0x3FF; - break; - - case 0x34: - REGSETHW(king->BGXScroll[2], V, msh); - king->BGXScroll[2] &= 0x3FF; - break; - case 0x35: - REGSETHW(king->BGYScroll[2], V, msh); - king->BGYScroll[2] &= 0x3FF; - break; - - case 0x36: - REGSETHW(king->BGXScroll[3], V, msh); - king->BGXScroll[3] &= 0x3FF; - break; - case 0x37: - REGSETHW(king->BGYScroll[3], V, msh); - king->BGYScroll[3] &= 0x3FF; - break; - - case 0x38: - REGSETHW(king->BGAffinA, V, msh); - break; - case 0x39: - REGSETHW(king->BGAffinB, V, msh); - break; - case 0x3a: - REGSETHW(king->BGAffinC, V, msh); - break; - case 0x3b: - REGSETHW(king->BGAffinD, V, msh); - break; - case 0x3c: - REGSETHW(king->BGAffinCenterX, V, msh); - break; - case 0x3d: - REGSETHW(king->BGAffinCenterY, V, msh); - break; - - case 0x40: // ------IE - // I = 1, interrupt enable?? - // E = 1, rainbow transfer enable - if (!msh) - { - king->RAINBOWTransferControl = V & 0x3; - if (!(V & 1)) - { - //if(king->RAINBOWBusyCount || king->RAINBOWBlockCount) - // puts("RAINBOW transfer reset"); - // Not sure if this is completely correct or not. Test cases: "Tonari no Princess Rolfee", (others?) - //king->RAINBOWBusyCount = 0; - //king->RAINBOWBlockCount = 0; - //RAINBOW_ForceTransferReset(); - king->RAINBOWBlockCount = 0; - } - } - king->RasterIRQPending = FALSE; - RedoKINGIRQCheck(); - //printf("Transfer Control: %d, %08x\n", fx_vce.raster_counter, king->RAINBOWTransferControl); - break; - - // Rainbow transfer address - case 0x41: - REGSETHW(king->RAINBOWKRAMA, V, msh); - king->RAINBOWKRAMA &= 0x3FFFF; - //printf("KRAM Transfer Addr: %d, %08x\n", fx_vce.raster_counter, king->RAINBOWKRAMA); - break; - - // 0-262 - case 0x42: - if (!msh) - { - king->RAINBOWTransferStartPosition = V & 0x1FF; - //fprintf(stderr, "%d\n", king->RAINBOWTransferStartPosition); - //printf("RAINBOW Start Line: %d, %08x\n", fx_vce.raster_counter, king->RAINBOWTransferStartPosition); - } - break; - - case 0x43: - REGSETHW(king->RAINBOWTransferBlockCount, V, msh); - king->RAINBOWTransferBlockCount &= 0x1F; - //printf("KRAM Transfer Block Count: %d, %08x\n", fx_vce.raster_counter, king->RAINBOWTransferBlockCount); - break; - - // Raster IRQ line - case 0x44: - if (!msh) - { - king->RasterIRQLine = V & 0x1FF; - //printf("Raster IRQ scanline: %d, %08x\n", fx_vce.raster_counter, king->RasterIRQLine); - } - break; - - case 0x50: - if (!msh) - { - for (int ch = 0; ch < 2; ch++) - { - if (!(king->ADPCMControl & (1 << ch)) && (V & (1 << ch))) - { - king->ADPCMPlayAddress[ch] = king->ADPCMSAL[ch] * 256; - } - } - king->ADPCMControl = V; - RedoKINGIRQCheck(); - SoundBox_SetKINGADPCMControl(king->ADPCMControl); - } - break; - - case 0x51: - REGSETHW(king->ADPCMBufferMode[0], V, msh); - RedoKINGIRQCheck(); - break; - - case 0x52: - REGSETHW(king->ADPCMBufferMode[1], V, msh); - RedoKINGIRQCheck(); - break; - - case 0x58: - REGSETHW(king->ADPCMSAL[0], V, msh); - king->ADPCMSAL[0] &= 0x3FF; - break; - case 0x59: - REGSETHW(king->ADPCMEndAddress[0], V, msh); - king->ADPCMEndAddress[0] &= 0x3FFFF; - break; - case 0x5A: - REGSETHW(king->ADPCMIntermediateAddress[0], V, msh); - king->ADPCMIntermediateAddress[0] &= 0xFFF; - break; - - case 0x5C: - REGSETHW(king->ADPCMSAL[1], V, msh); - king->ADPCMSAL[1] &= 0x3FF; - break; - case 0x5D: - REGSETHW(king->ADPCMEndAddress[1], V, msh); - king->ADPCMEndAddress[1] &= 0x3FFFF; - break; - case 0x5E: - REGSETHW(king->ADPCMIntermediateAddress[1], V, msh); - king->ADPCMIntermediateAddress[1] &= 0xFFF; - break; - - case 0x61: - if (king->KRAM_Mode ^ V) - { - KINGDBG("KRAM Mode Change To: %02x\n", V & 1); - king->KRAM_Mode = V & 0x1; - } - break; - } - - PCFX_SetEvent(PCFX_EVENT_KING, timestamp + CalcNextExternalEvent(0x4FFFFFFF)); // TODO: Optimize this to only be called when necessary. - } -} - -uint16 KING_GetADPCMHalfWord(int ch) -{ - int page = (king->PageSetting & 0x0100) ? 1 : 0; - uint16 ret = king->KRAM[page][king->ADPCMPlayAddress[ch] & 0x3FFFF]; - - king->ADPCMPlayAddress[ch] = (king->ADPCMPlayAddress[ch] & 0x20000) | ((king->ADPCMPlayAddress[ch] + 1) & 0x1FFFF); - - if (!(king->ADPCMPlayAddress[ch] & 0x1FFFF)) - { - ADPCMDBG("Ch %d Wrapped", ch); - } - - if (king->ADPCMPlayAddress[ch] == (((king->ADPCMEndAddress[ch] + 1) & 0x1FFFF) | (king->ADPCMEndAddress[ch] & 0x20000))) - { - ADPCMDBG("Ch %d End", ch); - - if (!(king->ADPCMBufferMode[ch] & 1)) - { - king->ADPCMControl &= ~(1 << ch); - SoundBox_SetKINGADPCMControl(king->ADPCMControl); - } - else - { - king->ADPCMPlayAddress[ch] = king->ADPCMSAL[ch] << 8; - } - - king->ADPCMStatus[ch] |= 1; - - if (king->ADPCMBufferMode[ch] & (0x1 << 1)) - { - king->ADPCMIRQPending = TRUE; - RedoKINGIRQCheck(); - } - } - else if (king->ADPCMPlayAddress[ch] == ((uint32)king->ADPCMIntermediateAddress[ch] << 6)) - { - ADPCMDBG("Ch %d Intermediate", ch); - king->ADPCMStatus[ch] |= 2; - - if (king->ADPCMBufferMode[ch] & (0x2 << 1)) - { - king->ADPCMIRQPending = TRUE; - RedoKINGIRQCheck(); - } - } - - return (ret); -} - -static uint32 HighDotClockWidth; -extern RavenBuffer *FXCDDABufs[2]; // FIXME, externals are evil! - -void KING_Init(void) -{ - king = new king_t(); - memset(king, 0, sizeof(king_t)); - - king->lastts = 0; - - HighDotClockWidth = Setting_HighDotclockWidth; - BGLayerDisable = 0; - - BuildCMT(); - - // Build VCE priority map. - // Don't change this unless you know what you're doing! - // There may appear to be a bug in the pixel mixing - // code elsewhere, because it accesses this array like [vdc][bg][rainbow], but it's not a bug. - // This multi-dimensional array has no concept of bg, vdc, rainbow, or their orders per-se, it just - // contains priority information for 3 different layers. - - for (int bg_prio = 0; bg_prio < 8; bg_prio++) - { - for (int vdc_prio = 0; vdc_prio < 8; vdc_prio++) - { - for (int rainbow_prio = 0; rainbow_prio < 8; rainbow_prio++) - { - int bg_prio_test = bg_prio ? bg_prio : 0x10; - int vdc_prio_test = vdc_prio ? vdc_prio : 0x10; - int rainbow_prio_test = rainbow_prio ? rainbow_prio : 0x10; - - if (bg_prio_test >= 8) - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][0] = 3; - else - { - if (bg_prio_test < vdc_prio_test && bg_prio_test < rainbow_prio_test) - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][0] = 0; - else if (bg_prio_test > vdc_prio_test && bg_prio_test > rainbow_prio_test) - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][0] = 2; - else - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][0] = 1; - } - - if (vdc_prio_test >= 8) - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][1] = 3; - else - { - if (vdc_prio_test < bg_prio_test && vdc_prio_test < rainbow_prio_test) - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][1] = 0; - else if (vdc_prio_test > bg_prio_test && vdc_prio_test > rainbow_prio_test) - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][1] = 2; - else - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][1] = 1; - } - - if (rainbow_prio_test >= 8) - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][2] = 3; - else - { - if (rainbow_prio_test < bg_prio_test && rainbow_prio_test < vdc_prio_test) - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][2] = 0; - else if (rainbow_prio_test > bg_prio_test && rainbow_prio_test > vdc_prio_test) - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][2] = 2; - else - VCEPrioMap[bg_prio][vdc_prio][rainbow_prio][2] = 1; - } - } - } - } - - /*#ifdef WANT_DEBUGGER - ASpace_Add(KING_GetAddressSpaceBytes, KING_PutAddressSpaceBytes, "kram0", "KRAM Page 0", 19); - ASpace_Add(KING_GetAddressSpaceBytes, KING_PutAddressSpaceBytes, "kram1", "KRAM Page 1", 19); - ASpace_Add(Do16BitGet, Do16BitPut, "vdcvram0", "VDC-A VRAM", 17); - ASpace_Add(Do16BitGet, Do16BitPut, "vdcvram1", "VDC-B VRAM", 17); - ASpace_Add(KING_GetAddressSpaceBytes, KING_PutAddressSpaceBytes, "vce", "VCE Palette RAM", 10); -#endif*/ - - SCSICD_Init(SCSICD_PCFX, 3, FXCDDABufs[0]->Buf(), FXCDDABufs[1]->Buf(), 153600 * Setting_CdSpeed, 21477273, KING_CDIRQ, KING_StuffSubchannels); -} - -void KING_Reset(const v810_timestamp_t timestamp) -{ - KING_Update(timestamp); - - memset(&fx_vce, 0, sizeof(fx_vce)); - - int32 ltssave = king->lastts; - memset(king, 0, sizeof(king_t)); - king->lastts = ltssave; - - king->Reg00 = 0; - king->Reg01 = 0; - king->Reg02 = 0; - king->Reg03 = 0; - king->dma_receive_active = FALSE; - king->dma_send_active = FALSE; - king->dma_cycle_counter = 0x7FFFFFFF; - - RecalcKRAMPagePtrs(); - - HPhase = HPHASE_HBLANK_PART1; - HPhaseCounter = 1; - vdc_lb_pos = 0; - - memset(vdc_linebuffers, 0, sizeof(vdc_linebuffers)); - memset(vdc_linebuffer, 0, sizeof(vdc_linebuffer)); - memset(vdc_linebuffer_yuved, 0, sizeof(vdc_linebuffer_yuved)); - memset(rainbow_linebuffer, 0, sizeof(rainbow_linebuffer)); - memset(bg_linebuffer, 0, sizeof(bg_linebuffer)); - - king->dma_cycle_counter = 0x7FFFFFFF; - scsicd_ne = 1; // FIXME - - RedoKINGIRQCheck(); - - for (unsigned int x = 0; x < 0x200; x++) - RedoPaletteCache(x); - - DoHBlankVCECaching(); - - SoundBox_SetKINGADPCMControl(0); - - SCSICD_Power(timestamp); - - memset(king->KRAM, 0xFF, sizeof(king->KRAM)); -} - -static INLINE void DRAWBG8x1_4(uint32 *target, const uint16 *cg, const uint32 *palette_ptr, const uint32 layer_or) -{ - if (*cg >> 14) - target[0] = palette_ptr[(*cg >> 14)] | layer_or; - if ((*cg >> 12) & 0x3) - target[1] = palette_ptr[((*cg >> 12) & 0x3)] | layer_or; - if ((*cg >> 10) & 0x3) - target[2] = palette_ptr[((*cg >> 10) & 0x3)] | layer_or; - if ((*cg >> 8) & 0x3) - target[3] = palette_ptr[((*cg >> 8) & 0x3)] | layer_or; - if ((*cg >> 6) & 0x3) - target[4] = palette_ptr[((*cg >> 6) & 0x3)] | layer_or; - if ((*cg >> 4) & 0x3) - target[5] = palette_ptr[((*cg >> 4) & 0x3)] | layer_or; - if ((*cg >> 2) & 0x3) - target[6] = palette_ptr[((*cg >> 2) & 0x3)] | layer_or; - if ((*cg >> 0) & 0x3) - target[7] = palette_ptr[((*cg >> 0) & 0x3)] | layer_or; -} - -static INLINE void DRAWBG8x1_16(uint32 *target, const uint16 *cgptr, const uint32 *palette_ptr, const uint32 layer_or) -{ - if (cgptr[0] >> 12) - target[0] = palette_ptr[((cgptr[0] >> 12))] | layer_or; - if ((cgptr[0] >> 8) & 0xF) - target[1] = palette_ptr[(((cgptr[0] >> 8) & 0xF))] | layer_or; - if ((cgptr[0] >> 4) & 0xF) - target[2] = palette_ptr[(((cgptr[0] >> 4) & 0xF))] | layer_or; - if ((cgptr[0] >> 0) & 0xF) - target[3] = palette_ptr[(((cgptr[0] >> 0) & 0xF))] | layer_or; - - if (cgptr[1] >> 12) - target[4] = palette_ptr[((cgptr[1] >> 12))] | layer_or; - if ((cgptr[1] >> 8) & 0xF) - target[5] = palette_ptr[(((cgptr[1] >> 8) & 0xF))] | layer_or; - if ((cgptr[1] >> 4) & 0xF) - target[6] = palette_ptr[(((cgptr[1] >> 4) & 0xF))] | layer_or; - if ((cgptr[1] >> 0) & 0xF) - target[7] = palette_ptr[(((cgptr[1] >> 0) & 0xF))] | layer_or; -} - -static INLINE void DRAWBG8x1_256(uint32 *target, const uint16 *cgptr, const uint32 *palette_ptr, const uint32 layer_or) -{ - if (cgptr[0] >> 8) - target[0] = palette_ptr[(cgptr[0] >> 0x8)] | layer_or; - if (cgptr[0] & 0xFF) - target[1] = palette_ptr[(cgptr[0] & 0xFF)] | layer_or; - if (cgptr[1] >> 8) - target[2] = palette_ptr[(cgptr[1] >> 0x8)] | layer_or; - if (cgptr[1] & 0xFF) - target[3] = palette_ptr[(cgptr[1] & 0xFF)] | layer_or; - if (cgptr[2] >> 8) - target[4] = palette_ptr[(cgptr[2] >> 0x8)] | layer_or; - if (cgptr[2] & 0xFF) - target[5] = palette_ptr[(cgptr[2] & 0xFF)] | layer_or; - if (cgptr[3] >> 8) - target[6] = palette_ptr[(cgptr[3] >> 0x8)] | layer_or; - if (cgptr[3] & 0xFF) - target[7] = palette_ptr[(cgptr[3] & 0xFF)] | layer_or; -} - -static INLINE void DRAWBG8x1_64K(uint32 *target, const uint16 *cgptr, const uint32 *palette_ptr, const uint32 layer_or) -{ - if (cgptr[0] & 0xFF00) - target[0] = ((cgptr[0x0] & 0x00F0) << 8) | ((cgptr[0] & 0x000F) << 4) | ((cgptr[0] & 0xFF00) << 8) | layer_or; - if (cgptr[1] & 0xFF00) - target[1] = ((cgptr[0x1] & 0x00F0) << 8) | ((cgptr[1] & 0x000F) << 4) | ((cgptr[1] & 0xFF00) << 8) | layer_or; - if (cgptr[2] & 0xFF00) - target[2] = ((cgptr[0x2] & 0x00F0) << 8) | ((cgptr[2] & 0x000F) << 4) | ((cgptr[2] & 0xFF00) << 8) | layer_or; - if (cgptr[3] & 0xFF00) - target[3] = ((cgptr[0x3] & 0x00F0) << 8) | ((cgptr[3] & 0x000F) << 4) | ((cgptr[3] & 0xFF00) << 8) | layer_or; - if (cgptr[4] & 0xFF00) - target[4] = ((cgptr[0x4] & 0x00F0) << 8) | ((cgptr[4] & 0x000F) << 4) | ((cgptr[4] & 0xFF00) << 8) | layer_or; - if (cgptr[5] & 0xFF00) - target[5] = ((cgptr[0x5] & 0x00F0) << 8) | ((cgptr[5] & 0x000F) << 4) | ((cgptr[5] & 0xFF00) << 8) | layer_or; - if (cgptr[6] & 0xFF00) - target[6] = ((cgptr[0x6] & 0x00F0) << 8) | ((cgptr[6] & 0x000F) << 4) | ((cgptr[6] & 0xFF00) << 8) | layer_or; - if (cgptr[7] & 0xFF00) - target[7] = ((cgptr[0x7] & 0x00F0) << 8) | ((cgptr[7] & 0x000F) << 4) | ((cgptr[7] & 0xFF00) << 8) | layer_or; -} - -static INLINE void DRAWBG8x1_16M(uint32 *target, const uint16 *cgptr, const uint32 *palette_ptr, const uint32 layer_or) -{ - if (cgptr[0] >> 8) - target[0] = ((cgptr[0x0] & 0xFF00) << 8) | (cgptr[1] & 0xFF00) | (cgptr[1] & 0xFF) | layer_or; - if (cgptr[0] & 0xFF) - target[1] = ((cgptr[0x0] & 0x00FF) << 16) | (cgptr[1] & 0xFF00) | (cgptr[1] & 0xFF) | layer_or; - if (cgptr[2] >> 8) - target[2] = ((cgptr[0x2] & 0xFF00) << 8) | (cgptr[3] & 0xFF00) | (cgptr[3] & 0xFF) | layer_or; - if (cgptr[2] & 0xFF) - target[3] = ((cgptr[0x2] & 0x00FF) << 16) | (cgptr[3] & 0xFF00) | (cgptr[3] & 0xFF) | layer_or; - if (cgptr[4] >> 8) - target[4] = ((cgptr[0x4] & 0xFF00) << 8) | (cgptr[5] & 0xFF00) | (cgptr[5] & 0xFF) | layer_or; - if (cgptr[4] & 0xFF) - target[5] = ((cgptr[0x4] & 0x00FF) << 16) | (cgptr[5] & 0xFF00) | (cgptr[5] & 0xFF) | layer_or; - if (cgptr[6] >> 8) - target[6] = ((cgptr[0x6] & 0xFF00) << 8) | (cgptr[7] & 0xFF00) | (cgptr[7] & 0xFF) | layer_or; - if (cgptr[6] & 0xFF) - target[7] = ((cgptr[0x6] & 0x00FF) << 16) | (cgptr[7] & 0xFF00) | (cgptr[7] & 0xFF) | layer_or; -} - -static bool bgmode_warning = 0; // Debug - -#include "king-bgfast.inc" - -static INLINE int32 max(int32 a, int32 b) -{ - if (a > b) - return (a); - - return (b); -} - -static void DrawBG(uint32 *target, int n, bool sub) -{ - // Size out-of-bounds behaves as if the size is at its minimum, with caveats(TO BE INVESTIGATED). - const uint32 bg_ss_table[0x10] = - { - 0x3, 0x3, 0x3, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0x3, 0x3, 0x3, 0x3, 0x3}; - - const bool bg_ss_invalid_table[0x10] = - { - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1}; - -#if 0 - const uint32 cg_per_mode[0x8] = - { - 0, // Invalid mode - 1, // 2-bit mode - 2, // 4-bit mode - 4, // 8-bit mode - 8, // 16-bit mode - 8, // 16-bit mode - 8, // 16-bit mode - 8, // 16-bit mode - }; -#endif - const uint32 layer_or = (LAYER_BG0 + n) << 28; - - const uint32 palette_offset = ((fx_vce.palette_offset[1 + (n >> 1)] >> ((n & 1) ? 8 : 0)) << 1) & 0x1FF; - const uint32 *palette_ptr = &vce_rendercache.palette_table_cache[palette_offset]; - const uint32 bat_and_cg_page = (king->PageSetting & 0x0010) ? 1 : 0; - - const uint16 bgmode = (king->bgmode >> (n * 4)) & 0xF; - const bool endless = (king->BGScrollMode >> n) & 0x1; - const uint32 XScroll = sign_x_to_s32((n ? 10 : 11), king->BGXScroll[n]); - const uint32 YScroll = sign_x_to_s32((n ? 10 : 11), king->BGYScroll[n]); - - const uint32 YOffset = (YScroll + (fx_vce.raster_counter - 22)) & 0xFFFF; - - const uint32 bat_offset = king->BGBATAddr[n] * 1024; - const uint32 bat_sub_offset = n ? bat_offset : (king->BG0SubBATAddr * 1024); - const uint16 *bat_base = &king->KRAM[bat_and_cg_page][bat_offset & 0x20000]; - const uint16 *bat_sub_base = &king->KRAM[bat_and_cg_page][bat_sub_offset & 0x20000]; - - const uint32 cg_offset = king->BGCGAddr[n] * 1024; - const uint32 cg_sub_offset = n ? cg_offset : (king->BG0SubCGAddr * 1024); - const uint16 *cg_base = &king->KRAM[bat_and_cg_page][cg_offset & 0x20000]; - const uint16 *cg_sub_base = &king->KRAM[bat_and_cg_page][cg_sub_offset & 0x20000]; - - const int bat_bitsize_mask = 0x7FF >> 3; - - const uint32 bat_width_shift = bg_ss_table[(king->BGSize[n] & 0xF0) >> 4]; - const bool bat_width_invalid = bg_ss_invalid_table[(king->BGSize[n] & 0xF0) >> 4]; - const uint32 bat_width = (1 << bat_width_shift) >> 3; - - const int32 bat_height_shift = bg_ss_table[king->BGSize[n] & 0x0F]; - //const bool bat_height_invalid = bg_ss_invalid_table[king->BGSize[n] & 0x0F]; - const int32 bat_height = (1 << bat_height_shift) >> 3; - - const bool bat_sub_width_invalid = n ? bat_width_invalid : bg_ss_invalid_table[(king->BGSize[n] & 0xF000) >> 12]; - const uint32 bat_sub_width_shift = n ? bat_width_shift : bg_ss_table[(king->BGSize[n] & 0xF000) >> 12]; - const uint32 bat_sub_width = (1 << bat_sub_width_shift) >> 3; - const uint32 bat_sub_width_mask = bat_sub_width - 1; - const uint32 bat_sub_width_test = endless ? (bat_bitsize_mask + 1) : max(bat_width, bat_sub_width); - - const int32 bat_sub_height_shift = n ? bat_height_shift : bg_ss_table[(king->BGSize[n] & 0x0F00) >> 8]; - const int32 bat_sub_height = (1 << bat_sub_height_shift) >> 3; - const int32 bat_sub_height_mask = bat_sub_height - 1; - const int32 bat_sub_height_test = endless ? (bat_bitsize_mask + 1) : max(bat_height, bat_sub_height); - - uint16 cg_mask[8]; - uint16 cg_remap[8]; - bool cg_ofbat[8]; - - uint16 cg_sub_mask[8]; - uint16 cg_sub_remap[8]; - bool cg_sub_ofbat[8]; - - bool BATFetchCycle = FALSE; - bool BATSubFetchCycle = FALSE; - - const bool rotate_mode = (n == 0) && (king->priority & 0x1000); - - // If the bg mode is invalid, don't draw this layer, duuhhhh - if (!(bgmode & 0x7)) - return; - - if ((bgmode & 0x7) >= 6) - { - if (!bgmode_warning) - { - printf("Unsupported KING BG Mode for KING BG %d: %02x\n", n, bgmode); - bgmode_warning = TRUE; - } - return; - } - - memset(cg_mask, 0, sizeof(cg_mask)); - memset(cg_remap, 0, sizeof(cg_remap)); - memset(cg_ofbat, 0, sizeof(cg_ofbat)); - memset(cg_sub_mask, 0, sizeof(cg_sub_mask)); - memset(cg_sub_remap, 0, sizeof(cg_sub_remap)); - memset(cg_sub_ofbat, 0, sizeof(cg_sub_ofbat)); - - if (king->MPROGControl & 0x1) - { - int remap_thing = 0; - int remap_sub_thing = 0; - - for (int x = 0; x < 8; x++) - { - uint16 mpd; - - // Forcing CG and BAT to 0 if the affine bit != rotate_mode is not technically correct. - // If there is a mismatch, it's more likely the effective CG and BAT address for the pixel/segment - // being drawn won't be calculated correctly, likely being just the initial offsets. - - mpd = king->MPROGData[((cg_offset & 0x20000) ? 0x8 : 0x0) + x]; - if (((mpd >> 6) & 0x3) == n && !(mpd & 0x100) && !(mpd & 0x010)) - { - cg_mask[remap_thing] = 0xFFFF; - cg_remap[remap_thing] = mpd & 0x7; - cg_ofbat[remap_thing] = mpd & 0x8; - - if ((bool)(mpd & 0x20) != rotate_mode) - { - KINGDBG("Affine bit != rotate_mode?"); - cg_mask[remap_thing] = 0; - } - remap_thing++; - } - - mpd = king->MPROGData[((cg_sub_offset & 0x20000) ? 0x8 : 0x0) + x]; - if (((mpd >> 6) & 0x3) == n && !(mpd & 0x100) && !(mpd & 0x010)) - { - cg_sub_mask[remap_sub_thing] = 0xFFFF; - cg_sub_remap[remap_sub_thing] = mpd & 0x7; - cg_sub_ofbat[remap_sub_thing] = mpd & 0x8; - - if ((bool)(mpd & 0x20) != rotate_mode) - { - KINGDBG("Affine bit != rotate_mode? (SUB)"); - cg_sub_mask[remap_sub_thing] = 0; - } - remap_sub_thing++; - } - } - - for (int x = 0; x < 8; x++) - { - uint16 mpd; - - mpd = king->MPROGData[((bat_offset & 0x20000) ? 0x8 : 0x0) + x]; - if (((mpd >> 6) & 0x3) == n && !(mpd & 0x100) && (mpd & 0x010) && (bool)(mpd & 0x020) == rotate_mode) - BATFetchCycle = TRUE; - - mpd = king->MPROGData[((bat_sub_offset & 0x20000) ? 0x8 : 0x0) + x]; - if (((mpd >> 6) & 0x3) == n && !(mpd & 0x100) && (mpd & 0x010) && (bool)(mpd & 0x020) == rotate_mode) - BATSubFetchCycle = TRUE; - } - } - - int bat_y = (YOffset >> 3) & bat_bitsize_mask; - uint32 bat_x = (XScroll >> 3) & bat_bitsize_mask; - int ysmall = YOffset & 0x7; - - const uint32 bat_invalid_y_mask = bat_width_invalid ? 0 : 0xFFFFFFFF; - const uint32 bat_invalid_sub_y_mask = bat_sub_width_invalid ? 0 : 0xFFFFFFFF; - - if (rotate_mode) - target += 8; - else - target += 8 - (XScroll & 0x7); - - { - int32 wmul = (1 << bat_width_shift), wmask = ((1 << bat_height_shift) - 1) & bat_invalid_y_mask; - int32 sexy_y_pos = (YOffset & wmask) * wmul; - - int32 wmul_sub = (1 << bat_sub_width_shift), wmask_sub = ((1 << bat_sub_height_shift) - 1) & bat_invalid_sub_y_mask; - int32 sexy_y_sub_pos = (YOffset & wmask_sub) * wmul_sub; - -#define ROTCODE_PRE \ - const int32 bat_width_mask = endless ? (bat_width - 1) : 0xFFFF; \ - const int32 bat_height_mask = endless ? (bat_height - 1) : 0xFFFF; \ - int32 a, b, c, d; \ - int32 raw_x_coord = (int32)sign_11_to_s16(XScroll) - (int16)king->BGAffinCenterX; \ - int32 raw_y_coord = fx_vce.raster_counter + (int32)sign_11_to_s16(YScroll) - 22 - (int16)king->BGAffinCenterY; \ - int32 xaccum; \ - int32 yaccum; \ - \ - a = (int16)king->BGAffinA; \ - b = (int16)king->BGAffinB; \ - c = (int16)king->BGAffinC; \ - d = (int16)king->BGAffinD; \ - \ - xaccum = raw_x_coord * a + raw_y_coord * b; \ - yaccum = raw_y_coord * d + raw_x_coord * c; \ - xaccum += (int16)king->BGAffinCenterX << 8; \ - yaccum += (int16)king->BGAffinCenterY << 8; - -#define ROTCODE_LOOP_PRE \ - for (int x = 0; x < 256; x++) \ - { \ - uint16 new_x = (xaccum >> 8); \ - uint16 new_y = (yaccum >> 8); \ - const uint16 *cgptr; \ - bat_x = (new_x >> 3) & bat_width_mask; \ - bat_y = (new_y >> 3) & bat_height_mask; \ - ysmall = new_y & 0x7; - -#define ROTCODE_LOOP_POST \ - xaccum += a; \ - yaccum += c; \ - } - - if ((bgmode & 0x7) == BGMODE_4 && rotate_mode) - { - ROTCODE_PRE; - - ROTCODE_LOOP_PRE; - uint32 pbn = 0; - if (bgmode & 0x8) - { - uint16 bat = bat_base[(bat_offset + (bat_x + ((bat_y << bat_width_shift) >> 3))) & 0x1FFFF]; - pbn = ((bat >> 12) << 2); - bat &= 0x0FFF; - cgptr = &cg_base[(cg_offset + (bat * 8) + ysmall) & 0x1FFFF]; - } - else - { - cgptr = &cg_base[(cg_offset + bat_x + ((new_y & wmask) * wmul / 8)) & 0x1FFFF]; - } - uint8 ze_cg = (cgptr[0] >> ((7 - (new_x & 7)) << 1)) & 0x03; - - if (endless || (bat_x < bat_width && bat_y < bat_height)) - { - if (ze_cg) - target[x] = palette_ptr[pbn + ze_cg] | layer_or; - } - ROTCODE_LOOP_POST; - } - else if ((bgmode & 0x7) == BGMODE_16 && rotate_mode) - { - ROTCODE_PRE; - - ROTCODE_LOOP_PRE; - uint32 pbn = 0; - - if (bgmode & 0x8) - { - uint16 bat = bat_base[(bat_offset + (bat_x + ((bat_y << bat_width_shift) >> 3))) & 0x1FFFF]; - pbn = ((bat >> 12) << 4); - bat &= 0x0FFF; - cgptr = &cg_base[(cg_offset + (bat * 16) + ysmall * 2) & 0x1FFFF]; - } - else - { - cgptr = &cg_base[(cg_offset + (bat_x * 2) + ((new_y & wmask) * wmul / 4)) & 0x1FFFF]; - } - uint8 ze_cg = (cgptr[(new_x >> 2) & 0x1] >> ((3 - (new_x & 3)) << 2)) & 0x0F; - - if (endless || (bat_x < bat_width && bat_y < bat_height)) - { - if (ze_cg) - target[x] = palette_ptr[pbn + ze_cg] | layer_or; - } - ROTCODE_LOOP_POST; - } - else if ((bgmode & 0x7) == BGMODE_256 && rotate_mode) - { - ROTCODE_PRE; - - ROTCODE_LOOP_PRE; - if (bgmode & 0x8) - { - uint16 bat = bat_base[(bat_offset + (bat_x + ((bat_y << bat_width_shift) >> 3))) & 0x1FFFF]; - cgptr = &cg_base[(cg_offset + (bat * 32) + ysmall * 4) & 0x1FFFF]; - } - else - { - cgptr = &cg_base[(cg_offset + (bat_x * 4) + ((new_y & wmask) * wmul / 2)) & 0x1FFFF]; - } - uint8 ze_cg = cgptr[(new_x >> 1) & 0x3] >> (((new_x & 1) ^ 1) << 3); - - if (endless || (bat_x < bat_width && bat_y < bat_height)) - { - if (ze_cg) - target[x] = palette_ptr[ze_cg] | layer_or; - } - ROTCODE_LOOP_POST; - } - else if ((bgmode & 0x7) == BGMODE_64K && rotate_mode) - { - ROTCODE_PRE; - ROTCODE_LOOP_PRE; - if (bgmode & 0x8) - { - uint16 bat = bat_base[(bat_offset + (bat_x + ((bat_y << bat_width_shift) >> 3))) & 0x1FFFF]; - cgptr = &cg_base[(cg_offset + (bat * 64) + ysmall * 8) & 0x1FFFF]; - } - else - { - cgptr = &cg_base[(cg_offset + (bat_x * 8) + ((new_y & wmask) * wmul)) & 0x1FFFF]; - } - uint16 ze_cg = cgptr[new_x & 0x7]; - - if (endless || (bat_x < bat_width && bat_y < bat_height)) - { - if (ze_cg >> 8) - target[x] = ((ze_cg & 0x00F0) << 8) | ((ze_cg & 0x000F) << 4) | ((ze_cg & 0xFF00) << 8) | layer_or; - } - ROTCODE_LOOP_POST; - } - else - switch (bgmode & 0x7) - { -#define DRAWBG8x1_MAC(cg_needed, blit_suffix, pbn_arg) \ - for (int x = 0; x < 256 + 8; x += 8) \ - { \ - if (bat_x < bat_width && bat_y < bat_height) \ - { \ - uint32 eff_bat_loc = bat_offset; \ - uint16 bat = 0; \ - uint16 pbn MDFN_NOWARN_UNUSED = 0; \ - const uint16 *cgptr[2]; \ - uint16 cg[cg_needed]; \ - \ - if (bgmode & 0x8) \ - eff_bat_loc += bat_x + (((bat_y & bat_invalid_y_mask) << bat_width_shift) >> 3); \ - \ - eff_bat_loc &= 0x1FFFF; \ - \ - if (BATFetchCycle) \ - bat = bat_base[eff_bat_loc]; \ - \ - if (bgmode & 0x08) \ - pbn = bat >> 12; \ - bat &= 0xFFF; \ - \ - cgptr[0] = &cg_base[(cg_offset + (bat_x * cg_needed) + sexy_y_pos) & 0x1FFFF]; \ - cgptr[1] = &cg_base[(cg_offset + (bat * 8 * cg_needed) + ysmall * cg_needed) & 0x1FFFF]; \ - \ - for (int cow = 0; cow < cg_needed; cow++) \ - cg[cow] = cgptr[cg_ofbat[cow]][cg_remap[cow]] & cg_mask[cow]; \ - \ - DRAWBG8x1_##blit_suffix(target + x, cg, palette_ptr + pbn_arg, layer_or); \ - } \ - else if (bat_x < bat_sub_width_test && bat_y < bat_sub_height_test) \ - { \ - uint32 eff_bat_loc = bat_sub_offset; \ - uint16 bat = 0; \ - uint16 pbn MDFN_NOWARN_UNUSED = 0; \ - const uint16 *cgptr[2]; \ - uint16 cg[cg_needed]; \ - \ - if (bgmode & 0x8) \ - eff_bat_loc += (bat_x & bat_sub_width_mask) + (((bat_y & bat_invalid_sub_y_mask & bat_sub_height_mask) << bat_sub_width_shift) >> 3); \ - \ - eff_bat_loc &= 0x1FFFF; \ - \ - if (BATSubFetchCycle) \ - bat = bat_sub_base[eff_bat_loc]; \ - \ - if (bgmode & 0x08) \ - pbn = bat >> 12; \ - bat &= 0xFFF; \ - \ - cgptr[0] = &cg_sub_base[(cg_sub_offset + ((bat_x & bat_sub_width_mask) * cg_needed) + sexy_y_sub_pos) & 0x1FFFF]; \ - cgptr[1] = &cg_sub_base[(cg_sub_offset + (bat * 8 * cg_needed) + ysmall * cg_needed) & 0x1FFFF]; \ - \ - for (int cow = 0; cow < cg_needed; cow++) \ - cg[cow] = cgptr[cg_sub_ofbat[cow]][cg_sub_remap[cow]] & cg_sub_mask[cow]; \ - \ - DRAWBG8x1_##blit_suffix(target + x, cg, palette_ptr + pbn_arg, layer_or); \ - } \ - bat_x = (bat_x + 1) & bat_bitsize_mask; \ - } - - case 0x01: // 4 color, 1/4 byte per pixel :b - sexy_y_pos >>= 3; - sexy_y_sub_pos >>= 3; - - DRAWBG8x1_MAC(1, 4, (pbn << 2)); - break; - - case 0x02: // 16 color, 1/2 byte per pixel - sexy_y_pos >>= 2; - sexy_y_sub_pos >>= 2; - - DRAWBG8x1_MAC(2, 16, (pbn << 4)); - break; - - case 0x03: // 256 color, 1 byte per pixel palettized - OK - sexy_y_pos >>= 1; - sexy_y_sub_pos >>= 1; - - DRAWBG8x1_MAC(4, 256, 0); - break; - - case 0x04: // 64K color, 2 bytes per pixel - OK - DRAWBG8x1_MAC(8, 64K, 0); - break; - - case 0x05: // 16M color, 2 bytes per pixel - OK - DRAWBG8x1_MAC(8, 16M, 0); - break; -#if 0 - case BGMODE_64K_EXTDOT: - break; - - case BGMODE_16M_EXTDOT: - { - uint32 fat_bat = ((YOffset & ((1 << bat_height_shift) - 1)) << bat_width_shift) + (((XScroll & ~ 7) & ((1 << bat_width_shift) - 1)); - } - break; -#endif - } - } -} - -static int16 UVLUT[65536][3]; -static uint8 RGBDeflower[1152]; // 0 is at 384 - -static void RebuildUVLUT() -{ - for (int ur = 0; ur < 256; ur++) - { - for (int vr = 0; vr < 256; vr++) - { - int r, g, b; - int u, v; - - u = ur - 128; - v = vr - 128; - - // FIXME: Use lrint() ? - r = (int)(0 - 0.000039457070707 * u + 1.139827967171717 * v); - g = (int)(0 - 0.394610164141414 * u - 0.580500315656566 * v); - b = (int)(0 + 2.031999684343434 * u - 0.000481376262626 * v); - - UVLUT[vr + ur * 256][0] = r; - UVLUT[vr + ur * 256][1] = g; - UVLUT[vr + ur * 256][2] = b; - } - } - for (int x = 0; x < 1152; x++) - { - if (x < 384) - RGBDeflower[x] = 0; - else if (x > (384 + 255)) - RGBDeflower[x] = 255; - else - RGBDeflower[x] = x - 384; - } -} - -// FIXME -static uint32 INLINE YUV888_TO_RGB888(uint32 yuv) -{ - int32 r, g, b; - uint8 y = yuv >> 16; - - r = y + UVLUT[yuv & 0xFFFF][0]; - g = y + UVLUT[yuv & 0xFFFF][1]; - b = y + UVLUT[yuv & 0xFFFF][2]; - - r = clamp_to_u8(r); - g = clamp_to_u8(g); - b = clamp_to_u8(b); - - return b | g << 8 | r << 16 | 0xff000000; - ; -} - -// FIXME: -//static unsigned int lines_per_frame; //= (fx_vce.picture_mode & 0x1) ? 262 : 263; -static VDC **vdc_chips; - -static EmulateSpecStruct *Ess; - -static int32 *LineWidths; -static int skip; - -void KING_StartFrame(VDC **arg_vdc_chips, EmulateSpecStruct *espec) -{ - MDFN_IEN_PCFX::vdc_chips = arg_vdc_chips; - MDFN_IEN_PCFX::LineWidths = espec->LineWidths; - MDFN_IEN_PCFX::skip = espec->skip; - - //MDFN_DispMessage("P0:%06x P1:%06x; I0: %06x I1: %06x", king->ADPCMPlayAddress[0], king->ADPCMPlayAddress[1], king->ADPCMIntermediateAddress[0] << 6, king->ADPCMIntermediateAddress[1] << 6); - //MDFN_DispMessage("%d %d\n", SCSICD_GetACK(), SCSICD_GetREQ()); - - // For the case of interlaced mode(clear ~0 state) - LineWidths[0] = 0; - - // These 2 should be overwritten in the big loop below. - espec->w = 256; - - espec->y = Setting_SlStart; - espec->h = Setting_SlEnd - espec->y + 1; - - if (fx_vce.frame_interlaced) - { - skip = false; - - espec->InterlaceOn = true; - espec->InterlaceField = fx_vce.odd_field; - espec->y *= 2; - espec->h *= 2; - } - - Ess = espec; -} - -static int rb_type; -// unsigned int width = (fx_vce.picture_mode & 0x08) ? 341 : 256; - -static void DrawActive(void) -{ - rb_type = -1; - - if (fx_vce.raster_counter == king->RAINBOWTransferStartPosition && (king->RAINBOWTransferControl & 1)) - { - king->RAINBOWStartPending = TRUE; - - //printf("Rainbow start pending: line=%d, busycount=%d, blockcount=%d\n", fx_vce.raster_counter, king->RAINBOWBusyCount, king->RAINBOWBlockCount); - - //if(fx_vce.raster_counter == 262) - // puts("MOOO"); - } - - if (fx_vce.raster_counter < 262) - { - if (king->RAINBOWBusyCount) - { - king->RAINBOWBusyCount--; - if (!king->RAINBOWBusyCount) - RAINBOW_SwapBuffers(); - } - - if (!king->RAINBOWBusyCount) - { - bool WantDecode = FALSE; - bool FirstDecode = FALSE; - - if (!king->RAINBOWBlockCount && king->RAINBOWStartPending) - { - //printf("Rainbow start real: %d %d\n", fx_vce.raster_counter, king->RAINBOWTransferBlockCount); - king->RAINBOWBlockCount = king->RAINBOWTransferBlockCount; - if (king->RAINBOWBlockCount) - { - king->RAINBOWKRAMReadPos = king->RAINBOWKRAMA << 1; - FirstDecode = TRUE; - } - } - - if (king->RAINBOWBlockCount) - { - king->RAINBOWBlockCount--; - WantDecode = TRUE; - } - - if (WantDecode) - { - king->RAINBOWBusyCount = 16; - - if (fx_vce.raster_counter == 262) - king->RAINBOWBusyCount++; - - // If we ever change the emulation time range from the current 0 through 262/263, we will need to readjust this - // statement to prevent the previous frame's skip value to mess up the current frame's graphics data, since - // RAINBOW data is delayed by 16 scanlines from when it's decoded(16 + 15 maximum delay). - RAINBOW_DecodeBlock(FirstDecode, skip && fx_vce.raster_counter < 246); - } - } - - rb_type = RAINBOW_FetchRaster(skip ? NULL : rainbow_linebuffer, LAYER_RAINBOW << 28, &vce_rendercache.palette_table_cache[((fx_vce.palette_offset[3] >> 0) & 0xFF) << 1]); - - king->RAINBOWStartPending = FALSE; - } // end if(fx_vce.raster_counter < 262) - - if (fx_vce.raster_counter >= 22 && fx_vce.raster_counter < 262) - { - if (!skip) - { - if (rb_type == 1) // YUV - { - // Only chroma key when we're not in 7.16MHz pixel mode - if (!(fx_vce.picture_mode & 0x08)) - { - const unsigned int ymin = fx_vce.ChromaKeyY & 0xFF; - const unsigned int ymax = fx_vce.ChromaKeyY >> 8; - const unsigned int umin = fx_vce.ChromaKeyU & 0xFF; - const unsigned int umax = fx_vce.ChromaKeyU >> 8; - const unsigned int vmin = fx_vce.ChromaKeyV & 0xFF; - const unsigned int vmax = fx_vce.ChromaKeyV >> 8; - - if ((fx_vce.ChromaKeyY | fx_vce.ChromaKeyU | fx_vce.ChromaKeyV) == 0) - { - //puts("Opt: 0 chroma key"); - for (int x = 0; x < 256; x++) - { - if (!(rainbow_linebuffer[x] & 0xFFFFFF)) - rainbow_linebuffer[x] = 0; - } - } - else if (ymin == ymax && umin == umax && vmin == vmax) - { - const uint32 compare_color = (ymin << 16) | (umin << 8) | (vmin << 0); - - //puts("Opt: Single color chroma key"); - - for (int x = 0; x < 256; x++) - { - if ((rainbow_linebuffer[x] & 0xFFFFFF) == compare_color) - rainbow_linebuffer[x] = 0; - } - } - else if (ymin <= ymax && umin <= umax && vmin <= vmax) - { - const uint32 yv_min_sub = (ymin << 16) | vmin; - const uint32 u_min_sub = umin << 8; - const uint32 yv_max_add = ((0xFF - ymax) << 16) | (0xFF - vmax); - const uint32 u_max_add = (0xFF - umax) << 8; - - for (int x = 0; x < 256; x++) - { - const uint32 pixel = rainbow_linebuffer[x]; - const uint32 yv = pixel & 0xFF00FF; - const uint32 u = pixel & 0x00FF00; - uint32 testie; - - testie = ((yv - yv_min_sub) | (yv + yv_max_add)) & 0xFF00FF00; - testie |= ((u - u_min_sub) | (u + u_max_add)) & 0x00FF00FF; - - if (!testie) - rainbow_linebuffer[x] = 0; - } - } - else - { - //puts("Opt: color keying off\n"); - } - } - } - - /* - 4 = Foremost - 1 = Hindmost - 0 = Hidden - */ - - MDFN_FastArraySet(bg_linebuffer + 8, 0, 256); - - // Only bother to draw the BGs if the microprogram is enabled. - if (king->MPROGControl & 0x1) - { - for (int prio = 1; prio <= 7; prio++) - { - for (int x = 0; x < 4; x++) - { - int thisprio = (king->priority >> (x * 3)) & 0x7; - - if (BGLayerDisable & (1 << x)) - continue; - - if (thisprio == prio) - { - //if(fx_vce.raster_counter == 50) - // CanDrawBG_Fast(x); - - // TODO/FIXME: TEST MORE - if (CanDrawBG_Fast(x)) // && (rand() & 1)) - DrawBG_Fast(bg_linebuffer, x); - else - DrawBG(bg_linebuffer, x, 0); - } - } - } - } - - } // end if(!skip) - } // end if(fx_vce.raster_counter >= 22 && fx_vce.raster_counter < 262) -} - -static INLINE void VDC_PIXELMIX(bool SPRCOMBO_ON, bool BGCOMBO_ON) -{ - static const uint32 vdc_layer_num[2] = {LAYER_VDC_BG << 28, LAYER_VDC_SPR << 28}; - const uint32 vdc_poffset[2] = { - (((uint32)fx_vce.palette_offset[0] >> 0) & 0xFF) << 1, // BG - (((uint32)fx_vce.palette_offset[0] >> 8) & 0xFF) << 1 // SPR - }; - - const int width = fx_vce.dot_clock ? 342 : 256; // 342, not 341, to prevent garbage pixels in high dot clock mode. - - for (int x = 0; x < width; x++) - { - const uint32 zort[2] = {vdc_linebuffers[0][x], vdc_linebuffers[1][x]}; - uint32 tmp_pixel; - - /* SPR combination */ - if (SPRCOMBO_ON && (zort[1] & 0x18F) > 0x180) - tmp_pixel = (zort[1] & 0xF) | ((zort[0] & 0xF) << 4) | 0x100; - /* BG combination */ - else if (BGCOMBO_ON && ((zort[1] ^ 0x100) & 0x18F) > 0x180) - tmp_pixel = (zort[1] & 0xF) | ((zort[0] & 0xF) << 4); - else - tmp_pixel = (zort[1] & 0xF) ? zort[1] : zort[0]; - - vdc_linebuffer[x] = tmp_pixel; - vdc_linebuffer_yuved[x] = 0; - if (tmp_pixel & 0xF) - vdc_linebuffer_yuved[x] = vce_rendercache.palette_table_cache[(tmp_pixel & 0xFF) + vdc_poffset[(tmp_pixel >> 8) & 1]] | vdc_layer_num[(tmp_pixel >> 8) & 1]; - } -} - -static void MixVDC(void) NO_INLINE; -static void MixVDC(void) -{ - // Optimization for when both layers are disabled in the VCE. - if (!vce_rendercache.LayerPriority[LAYER_VDC_BG] && !vce_rendercache.LayerPriority[LAYER_VDC_SPR]) - { - MDFN_FastArraySet(vdc_linebuffer_yuved, 0, 512); - } - else - switch (fx_vce.picture_mode & 0xC0) - { - case 0x00: - VDC_PIXELMIX(0, 0); - break; // None on - case 0x40: - VDC_PIXELMIX(0, 1); - break; // BG combo on - case 0x80: - VDC_PIXELMIX(1, 0); - break; // SPR combo on - case 0xC0: - VDC_PIXELMIX(1, 1); - break; // Both on - } -} - -static void MixLayers(void) -{ - uint32 *pXBuf = Ess->pixels; - - // Now we have to mix everything together... I'm scared, mommy. - // We have, vdc_linebuffer[0] and bg_linebuffer - // Which layer is specified in bits 28-31(check the enum earlier on) - uint32 priority_remap[8]; - uint32 ble_cache[8]; - bool ble_cache_any = FALSE; - - for (int n = 0; n < 8; n++) - { - priority_remap[n] = vce_rendercache.LayerPriority[n]; - //printf("%d: %d\n", n, priority_remap[n]); - } - - // Rainbow layer disabled? - if (rb_type == -1 || RAINBOWLayerDisable) - priority_remap[LAYER_RAINBOW] = 0; - - ble_cache[LAYER_NONE] = 0; - for (int x = 0; x < 4; x++) - ble_cache[LAYER_BG0 + x] = (vce_rendercache.BLE >> (4 + x * 2)) & 0x3; - - ble_cache[LAYER_VDC_BG] = (vce_rendercache.BLE >> 0) & 0x3; - ble_cache[LAYER_VDC_SPR] = (vce_rendercache.BLE >> 2) & 0x3; - ble_cache[LAYER_RAINBOW] = (vce_rendercache.BLE >> 12) & 0x3; - - for (int x = 0; x < 8; x++) - if (ble_cache[x]) - { - ble_cache_any = TRUE; - break; - } - - uint8 *coeff_cache_y_back[3]; - int8 *coeff_cache_u_back[3], *coeff_cache_v_back[3]; - uint8 *coeff_cache_y_fore[3]; - int8 *coeff_cache_u_fore[3], *coeff_cache_v_fore[3]; - - for (int x = 0; x < 3; x++) - { - coeff_cache_y_fore[x] = vce_rendercache.coefficient_mul_table_y[(vce_rendercache.coefficients[x * 2 + 0] >> 8) & 0xF]; - coeff_cache_u_fore[x] = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[x * 2 + 0] >> 4) & 0xF]; - coeff_cache_v_fore[x] = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[x * 2 + 0] >> 0) & 0xF]; - - coeff_cache_y_back[x] = vce_rendercache.coefficient_mul_table_y[(vce_rendercache.coefficients[x * 2 + 1] >> 8) & 0xF]; - coeff_cache_u_back[x] = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[x * 2 + 1] >> 4) & 0xF]; - coeff_cache_v_back[x] = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[x * 2 + 1] >> 0) & 0xF]; - } - - uint32 *target; - uint32 BPC_Cache = (LAYER_NONE << 28); // Backmost pixel color(cache) - - if (fx_vce.frame_interlaced) - target = pXBuf + Ess->pitch32 * ((fx_vce.raster_counter - 22) * 2 + fx_vce.odd_field); - else - target = pXBuf + Ess->pitch32 * (fx_vce.raster_counter - 22); - - // If at least one layer is enabled with the HuC6261, hindmost color is palette[0] - // If no layers are on, this color is black. - // If front cellophane is enabled, this color is forced to black(TODO: Confirm on a real system. Black or from CCR). - // If back cellophane is enabled, this color is forced to the value in CCR - // (back and front conditions are handled closer to the pixel mixing loops down below) - // TODO: Test on a real PC-FX to see if CCR is used or not if back cellophane is enabled even if all layers are disabled in the HuC6261, - // or if it just outputs black. - // TODO: See if enabling front/back cellophane in high dot-clock mode will set the hindmost color, even though the cellophane color mixing - // is disabled in high dot-clock mode. - if (vce_rendercache.picture_mode & 0x7F00) - BPC_Cache |= vce_rendercache.palette_table_cache[0]; - else - BPC_Cache |= 0x008080; - -#define DOCELLO(pixpoo) \ - if ((pixel[pixpoo] >> 28) != LAYER_VDC_SPR || ((vce_rendercache.SPBL >> ((vdc_linebuffer[x] & 0xF0) >> 4)) & 1)) \ - { \ - int which_co = (ble_cache[pixel[pixpoo] >> 28] - 1); \ - uint8 back_y = coeff_cache_y_back[which_co][(zeout >> 16) & 0xFF]; \ - int8 back_u = coeff_cache_u_back[which_co][(zeout >> 8) & 0xFF]; \ - int8 back_v = coeff_cache_v_back[which_co][(zeout >> 0) & 0xFF]; \ - uint8 fore_y = coeff_cache_y_fore[which_co][(pixel[pixpoo] >> 16) & 0xFF]; \ - int8 fore_u = coeff_cache_u_fore[which_co][(pixel[pixpoo] >> 8) & 0xFF]; \ - int8 fore_v = coeff_cache_v_fore[which_co][(pixel[pixpoo] >> 0) & 0xFF]; \ - zeout = (pixel[pixpoo] & 0xFF000000) | ((RGBDeflower + 384)[back_y + fore_y] << 16) | ((RGBDeflower + 384)[back_u + fore_u + 128] << 8) | ((RGBDeflower + 384)[back_v + fore_v + 128] << 0); \ - } \ - else \ - zeout = pixel[pixpoo]; - -#define DOCELLOSPECIALFRONT() \ - { \ - uint8 y = coeff_cache_y_back[0][(zeout >> 16) & 0xFF]; \ - int8 u = coeff_cache_u_back[0][(zeout >> 8) & 0xFF]; \ - int8 v = coeff_cache_v_back[0][(zeout >> 0) & 0xFF]; \ - zeout = (zeout & 0xFF000000) | ((RGBDeflower + 384)[CCR_Y_front + y] << 16) | ((RGBDeflower + 384)[CCR_U_front + u + 128] << 8) | \ - ((RGBDeflower + 384)[CCR_V_front + v + 128] << 0); \ - } - -#define LAYER_MIX_BODY(index_256, index_341) \ - { \ - uint32 pixel[4]; \ - uint32 prio[3]; \ - uint32 zeout = BPC_Cache; \ - prio[0] = priority_remap[vdc_linebuffer_yuved[index_341] >> 28]; \ - prio[1] = priority_remap[(bg_linebuffer + 8)[index_256] >> 28]; \ - prio[2] = priority_remap[rainbow_linebuffer[index_256] >> 28]; \ - pixel[0] = 0; \ - pixel[1] = 0; \ - pixel[2] = 0; \ - { \ - uint8 pi0 = VCEPrioMap[prio[0]][prio[1]][prio[2]][0]; \ - uint8 pi1 = VCEPrioMap[prio[0]][prio[1]][prio[2]][1]; \ - uint8 pi2 = VCEPrioMap[prio[0]][prio[1]][prio[2]][2]; \ - /*assert(pi0 == 3 || !pixel[pi0]);*/ pixel[pi0] = vdc_linebuffer_yuved[index_341]; \ - /*assert(pi1 == 3 || !pixel[pi1]);*/ pixel[pi1] = (bg_linebuffer + 8)[index_256]; \ - /*assert(pi2 == 3 || !pixel[pi2]);*/ pixel[pi2] = rainbow_linebuffer[index_256]; \ - } - -#define LAYER_MIX_FINAL_NOCELLO \ - if (pixel[0]) \ - zeout = pixel[0]; \ - if (pixel[1]) \ - zeout = pixel[1]; \ - if (pixel[2]) \ - zeout = pixel[2]; \ - target[x] = YUV888_TO_xxx(zeout); \ - } - -// For back cellophane, the hindmost pixel is always a valid pixel to mix with, a "layer" in its own right, -// so we don't need to check the current pixel value before mixing. -#define LAYER_MIX_FINAL_BACK_CELLO \ - if (pixel[0]) \ - { \ - if (ble_cache[pixel[0] >> 28]) \ - { \ - DOCELLO(0); \ - } \ - else \ - zeout = pixel[0]; \ - } \ - if (pixel[1]) \ - { \ - if (ble_cache[pixel[1] >> 28]) \ - { \ - DOCELLO(1); \ - } \ - else \ - zeout = pixel[1]; \ - } \ - if (pixel[2]) \ - { \ - if (ble_cache[pixel[2] >> 28]) \ - { \ - DOCELLO(2); \ - } \ - else \ - zeout = pixel[2]; \ - } \ - target[x] = YUV888_TO_xxx(zeout); \ - } - -// ..however, for front and "normal" cellophane, we need to make sure that the -// layer is indeed a real layer(KBG, VDC, RAINBOW) before mixing. -// Note: We need to check the upper 4 bits in determining whether the previous pixel is from a real layer or not, because the default -// hindmost non-layer color in front cellophane and normal cellophane modes is black, and black is represented in YUV as non-zero. We COULD bias/XOR each of U/V -// by 0x80 in the rendering code so that it would work if we just tested for the non-zeroness of the previous pixel, and adjust the YUV->RGB -// to compensate...TODO as a future possible optimization(MAYBE, it would obfuscate things more than they already are). -// -// Also, since the hindmost real layer pixel will never mix with anything behind it, we can leave -// out a few checks for the first possible hindmost real pixel. -// -// Also, the front cellophane effect itself doesn't need to check if the effective pixel output is a real layer (TODO: Confirm on real hardware!) -// -#define LAYER_MIX_FINAL_FRONT_CELLO \ - if (pixel[0]) \ - zeout = pixel[0]; \ - if (pixel[1]) \ - { \ - if (ble_cache[pixel[1] >> 28] && (zeout & (0xF << 28))) \ - { \ - DOCELLO(1); \ - } \ - else \ - zeout = pixel[1]; \ - } \ - if (pixel[2]) \ - { \ - if (ble_cache[pixel[2] >> 28] && (zeout & (0xF << 28))) \ - { \ - DOCELLO(2); \ - } \ - else \ - zeout = pixel[2]; \ - } \ - DOCELLOSPECIALFRONT(); \ - target[x] = YUV888_TO_xxx(zeout); \ - } - -#define LAYER_MIX_FINAL_CELLO \ - if (pixel[0]) \ - zeout = pixel[0]; \ - if (pixel[1]) \ - { \ - if (ble_cache[pixel[1] >> 28] && (zeout & (0xF << 28))) \ - { \ - DOCELLO(1); \ - } \ - else \ - zeout = pixel[1]; \ - } \ - if (pixel[2]) \ - { \ - if (ble_cache[pixel[2] >> 28] && (zeout & (0xF << 28))) \ - { \ - DOCELLO(2); \ - } \ - else \ - zeout = pixel[2]; \ - } \ - target[x] = YUV888_TO_xxx(zeout); \ - } - - if (1) - { -#define YUV888_TO_xxx YUV888_TO_RGB888 -#include "king_mix_body.inc" -#undef YUV888_TO_xxx - } - Ess->w = fx_vce.dot_clock ? HighDotClockWidth : 256; - - // FIXME - if (fx_vce.frame_interlaced) - LineWidths[(fx_vce.raster_counter - 22) * 2 + fx_vce.odd_field] = Ess->w; - else - LineWidths[fx_vce.raster_counter - 22] = Ess->w; -} - -static INLINE void RunVDCs(const int master_cycles, uint16 *pixels0, uint16 *pixels1) -{ - int32 div_clocks; - - fx_vce.clock_divider += master_cycles; - div_clocks = fx_vce.clock_divider / fx_vce.dot_clock_ratio; - fx_vce.clock_divider -= div_clocks * fx_vce.dot_clock_ratio; - - if (pixels0) - pixels0 += vdc_lb_pos; - - if (pixels1) - pixels1 += vdc_lb_pos; - - if (MDFN_UNLIKELY(((uint64)vdc_lb_pos + div_clocks) > 512)) - { - //puts("Bug"); - pixels0 = pixels1 = NULL; - } - - fx_vce.vdc_event[0] = vdc_chips[0]->Run(div_clocks, pixels0, pixels0 ? false : true); - fx_vce.vdc_event[1] = vdc_chips[1]->Run(div_clocks, pixels1, pixels1 ? false : true); - - vdc_lb_pos += div_clocks; - - // printf("%d\n", vdc_lb_pos); - // if(fx_vce.dot_clock) - // assert(vdc_lb_pos <= 342); - // else - // assert(vdc_lb_pos <= 257); -} - -static void MDFN_FASTCALL KING_RunGfx(int32 clocks) -{ - while (clocks > 0) - { - int32 chunk_clocks = clocks; - - if (chunk_clocks > HPhaseCounter) - chunk_clocks = HPhaseCounter; - - clocks -= chunk_clocks; - HPhaseCounter -= chunk_clocks; - - if (skip) - RunVDCs(chunk_clocks, NULL, NULL); - else if (fx_vce.in_hblank) - { - static uint16 dummybuf[1024]; - RunVDCs(chunk_clocks, dummybuf, dummybuf); - } - else - { - RunVDCs(chunk_clocks, vdc_linebuffers[0], vdc_linebuffers[1]); - } - - assert(HPhaseCounter >= 0); - - while (HPhaseCounter <= 0) - { - HPhase = (HPhase + 1) % HPHASE_COUNT; - switch (HPhase) - { - case HPHASE_ACTIVE: - vdc_lb_pos = 0; - fx_vce.in_hblank = false; - DoHBlankVCECaching(); - DrawActive(); - HPhaseCounter += 1024; - break; - - case HPHASE_HBLANK_PART1: - if (!skip) - { - if (fx_vce.raster_counter >= 22 && fx_vce.raster_counter < 262) - { - MixVDC(); - MixLayers(); - } - } - fx_vce.in_hblank = true; - fx_vce.in_vdc_hsync = true; - - for (int chip = 0; chip < 2; chip++) - vdc_chips[chip]->HSync(true); - - HPhaseCounter += 48; - break; - - case HPHASE_HBLANK_PART3: - fx_vce.raster_counter = (fx_vce.raster_counter + 1) % ((fx_vce.picture_mode & 0x1) ? 262 : 263); //lines_per_frame; - - if (fx_vce.raster_counter == 0) - for (int chip = 0; chip < 2; chip++) - vdc_chips[chip]->VSync(true); - - if (fx_vce.raster_counter == 3) - for (int chip = 0; chip < 2; chip++) - vdc_chips[chip]->VSync(false); - - if (!fx_vce.raster_counter) - { - bool previous_interlaced = fx_vce.frame_interlaced; - - fx_vce.frame_interlaced = fx_vce.picture_mode & 2; - - if (fx_vce.frame_interlaced && previous_interlaced) - fx_vce.odd_field ^= 1; - - if (!fx_vce.frame_interlaced) - fx_vce.odd_field = 0; - - PCFX_V810.Exit(); - } - - if (fx_vce.raster_counter == king->RasterIRQLine && (king->RAINBOWTransferControl & 0x2)) - { - //printf("Wovely: %d, %d, %d\n", fx_vce.raster_counter, king->RAINBOWRasterCounter, king->RAINBOWTransferControl); - - //if(fx_vce.raster_counter == 262) - //{ - // printf("Rainbow raster IRQ on line 262?\n"); - //} - //else - { - king->RasterIRQPending = TRUE; - RedoKINGIRQCheck(); - } - } - - // This -18(and +18) may or may not be correct in regards to how a real PC-FX adjusts the VDC layer horizontal position - // versus the KING and RAINBOW layers. - - if (fx_vce.dot_clock) - HPhaseCounter += 173 - 18; - else - HPhaseCounter += 165; - break; - - case HPHASE_HBLANK_PART4: - fx_vce.in_vdc_hsync = false; - for (int chip = 0; chip < 2; chip++) - vdc_chips[chip]->HSync(false); - - if (fx_vce.dot_clock) - HPhaseCounter += 120 + 18; - else - HPhaseCounter += 128; - break; - - } // end: switch(HPhase) - } // end: while(HPhaseCounter <= 0) - } // end: while(clocks > 0) -} // end KING_RunGfx() - -void KING_SetPixelFormat() -{ - RebuildUVLUT(); -} - -void KING_SetLayerEnableMask(uint64 mask) -{ - uint64 ms = mask; - // "BG0\0BG1\0BG2\0BG3\0VDC-A BG\0VDC-A SPR\0VDC-B BG\0VDC-B SPR\0RAINBOW\0", - - BGLayerDisable = (~ms) & 0xF; - ms >>= 4; - - for (unsigned chip = 0; chip < 2; chip++) - { - fx_vdc_chips[chip]->SetLayerEnableMask(ms & 0x3); - ms >>= 2; - } - - RAINBOWLayerDisable = (~ms) & 0x1; - ms >>= 1; - -#if 0 - if(which < 4) - { - BGLayerDisable ^= 1 << which; - return( !((BGLayerDisable >> which) & 1)); - } - else if(which == 4 || which == 5) - { - return(fx_vdc_chips[0]->ToggleLayer(which - 4)); - } - else if(which == 6 || which == 7) - { - return(fx_vdc_chips[1]->ToggleLayer(which - 6)); - } - else if(which == 8) - { - RAINBOWLayerDisable = !RAINBOWLayerDisable; - return(!RAINBOWLayerDisable); - } - else - return(0); -#endif -} - -#ifdef WANT_DEBUGGER -void KING_SetRegister(const unsigned int id, uint32 value) -{ - if (id == KING_GSREG_AR) - king->AR = value & 0x7F; - else if (id == KING_GSREG_MPROGADDR) - king->MPROGAddress = value & 0xF; - else if (id == KING_GSREG_MPROGCTRL) - king->MPROGControl = value & 0x1; - else if (id == KING_GSREG_MPROG0 || id == KING_GSREG_MPROG1 || id == KING_GSREG_MPROG2 || id == KING_GSREG_MPROG3 || id == KING_GSREG_MPROG4 || id == KING_GSREG_MPROG5 || id == KING_GSREG_MPROG6 || id == KING_GSREG_MPROG7 || - id == KING_GSREG_MPROG8 || id == KING_GSREG_MPROG9 || id == KING_GSREG_MPROGA || id == KING_GSREG_MPROGB || id == KING_GSREG_MPROGC || id == KING_GSREG_MPROGD || id == KING_GSREG_MPROGE || id == KING_GSREG_MPROGF) - { - king->MPROGData[id - KING_GSREG_MPROG0] = value; - } - else if (id == KING_GSREG_PAGESET) - { - king->PageSetting = value; - RecalcKRAMPagePtrs(); - } - else if (id == KING_GSREG_BGMODE) - { - king->bgmode = value; - } - else if (id == KING_GSREG_BGPRIO) - { - king->priority = value; - } - else if (id == KING_GSREG_BGSCRM) - { - king->BGScrollMode = value; - } - else if (id == KING_GSREG_BGSIZ0) - king->BGSize[0] = value; - else if (id == KING_GSREG_BGSIZ1) - king->BGSize[1] = value & 0x00FF; - else if (id == KING_GSREG_BGSIZ2) - king->BGSize[2] = value & 0x00FF; - else if (id == KING_GSREG_BGSIZ3) - king->BGSize[3] = value & 0x00FF; - else if (id == KING_GSREG_BGXSC0) - king->BGXScroll[0] = value & 0x7FF; - else if (id == KING_GSREG_BGXSC1) - king->BGXScroll[1] = value & 0x3FF; - else if (id == KING_GSREG_BGXSC2) - king->BGXScroll[2] = value & 0x3FF; - else if (id == KING_GSREG_BGXSC3) - king->BGXScroll[3] = value & 0x3FF; - else if (id == KING_GSREG_BGYSC0) - king->BGYScroll[0] = value & 0x7FF; - else if (id == KING_GSREG_BGYSC1) - king->BGYScroll[1] = value & 0x3FF; - else if (id == KING_GSREG_BGYSC2) - king->BGYScroll[2] = value & 0x3FF; - else if (id == KING_GSREG_BGYSC3) - king->BGYScroll[3] = value & 0x3FF; - else if (id == KING_GSREG_AFFINA) - king->BGAffinA = value; - else if (id == KING_GSREG_AFFINB) - king->BGAffinB = value; - else if (id == KING_GSREG_AFFINC) - king->BGAffinC = value; - else if (id == KING_GSREG_AFFIND) - king->BGAffinD = value; - else if (id == KING_GSREG_AFFINX) - king->BGAffinCenterX = value; - else if (id == KING_GSREG_AFFINY) - king->BGAffinCenterY = value; - else if (id == KING_GSREG_BGBATS || id == KING_GSREG_BGBAT0 || id == KING_GSREG_BGBAT1 || id == KING_GSREG_BGBAT2 || id == KING_GSREG_BGBAT3) - { - if (id == KING_GSREG_BGBATS) - king->BG0SubBATAddr = value; - else - king->BGBATAddr[id - KING_GSREG_BGBAT0] = value; - } - else if (id == KING_GSREG_BGCGS || id == KING_GSREG_BGCG0 || id == KING_GSREG_BGCG1 || id == KING_GSREG_BGCG2 || id == KING_GSREG_BGCG3) - { - if (id == KING_GSREG_BGCGS) - king->BG0SubCGAddr = value; - else - king->BGCGAddr[id - KING_GSREG_BGCG0] = value; - } - else if (id == KING_GSREG_RTCTRL) - king->RAINBOWTransferControl = value & 0x3; - else if (id == KING_GSREG_RKRAMA) - king->RAINBOWKRAMA = value & 0x3FFFF; - else if (id == KING_GSREG_RSTART) - king->RAINBOWTransferStartPosition = value & 0x1FF; - else if (id == KING_GSREG_RCOUNT) - king->RAINBOWTransferBlockCount = value & 0x1F; - else if (id == KING_GSREG_RIRQLINE) - king->RasterIRQLine = value; - else if (id == KING_GSREG_KRAMRA) - { - king->KRAMRA = value; - } - else if (id == KING_GSREG_KRAMWA) - { - king->KRAMWA = value; - } - else if (id == KING_GSREG_DMATA) - king->DMATransferAddr = value; - else if (id == KING_GSREG_DMATS) - king->DMATransferSize = value; - else if (id == KING_GSREG_DMASTT) - king->DMAStatus = value; - else if (id == KING_GSREG_ADPCMCTRL) - { - king->ADPCMControl = value; - SoundBox_SetKINGADPCMControl(king->ADPCMControl); - } - else if (id == KING_GSREG_ADPCMBM0 || id == KING_GSREG_ADPCMBM1) - { - king->ADPCMBufferMode[id - KING_GSREG_ADPCMBM0] = value; - } - else if (id == KING_GSREG_ADPCMPA0 || id == KING_GSREG_ADPCMPA1) - { - king->ADPCMPlayAddress[id - KING_GSREG_ADPCMPA0] = value; - } - else if (id == KING_GSREG_ADPCMSA0 || id == KING_GSREG_ADPCMSA1) - { - king->ADPCMSAL[id - KING_GSREG_ADPCMSA0] = value; - } - else if (id == KING_GSREG_ADPCMIA0 || id == KING_GSREG_ADPCMIA1) - { - king->ADPCMIntermediateAddress[id - KING_GSREG_ADPCMIA0] = value; - } - else if (id == KING_GSREG_ADPCMEA0 || id == KING_GSREG_ADPCMEA1) - { - king->ADPCMEndAddress[id - KING_GSREG_ADPCMEA0] = value; - } - else if (id == KING_GSREG_ADPCMStat) - { - } - else if (id == KING_GSREG_Reg01) - { - king->Reg01 = value; - } - else if (id == KING_GSREG_Reg02) - { - king->Reg02 = value; - } - else if (id == KING_GSREG_Reg03) - { - king->Reg03 = value; - } - else if (id == KING_GSREG_SUBCC) - { - king->SubChannelControl = value & 0x3; - } -} - -uint32 KING_GetRegister(const unsigned int id, char *special, const uint32 special_len) -{ - uint32 value = 0xDEADBEEF; - - if (id == KING_GSREG_AR) - { - value = king->AR; - } - else if (id == KING_GSREG_MPROGADDR) - value = king->MPROGAddress; - else if (id == KING_GSREG_MPROGCTRL) - { - value = king->MPROGControl; - } - else if (id == KING_GSREG_MPROG0 || id == KING_GSREG_MPROG1 || id == KING_GSREG_MPROG2 || id == KING_GSREG_MPROG3 || id == KING_GSREG_MPROG4 || id == KING_GSREG_MPROG5 || id == KING_GSREG_MPROG6 || id == KING_GSREG_MPROG7 || - id == KING_GSREG_MPROG8 || id == KING_GSREG_MPROG9 || id == KING_GSREG_MPROGA || id == KING_GSREG_MPROGB || id == KING_GSREG_MPROGC || id == KING_GSREG_MPROGD || id == KING_GSREG_MPROGE || id == KING_GSREG_MPROGF) - { - value = king->MPROGData[id - KING_GSREG_MPROG0]; - - if (special) - { - static const char *atypes[4] = {"CG", "CG of BAT", "BAT", "???"}; - - trio_snprintf(special, special_len, "Offset: %d, Access Type: %s, Rotation: %d, BG Number: %d, NOP: %d", - value & 0x7, atypes[(value >> 3) & 0x3], (int)(bool)(value & 0x20), - (value >> 6) & 0x3, (int)(bool)(value & 0x100)); - } - } - else if (id == KING_GSREG_PAGESET) - { - value = king->PageSetting; - - if (special) - { - trio_snprintf(special, special_len, "SCSI: %d, BG: %d, ADPCM: %d, RAINBOW: %d", (int)(bool)(value & 0x1), (int)(bool)(value & 0x10), (int)(bool)(value & 0x100), (int)(bool)(value & 0x1000)); - } - } - else if (id == KING_GSREG_BGMODE) - { - value = king->bgmode; - if (special) - { - static const char *bgmodes[16] = {"Disabled", "4-color", "16-color", "256-color", "64K-color", "16M-color", "Undefined", "Undefined", - "Disabled", "4-color w/BAT", "16-color w/BAT", "256-color w/BAT", "64K-color w/BAT", "16M-color w/BAT", "Undefined", "Undefined"}; - trio_snprintf(special, special_len, "BG0: %2d(%s), BG1: %2d(%s), BG2: %2d(%s), BG3: %2d(%s)", value & 0xF, bgmodes[value & 0xF], (value >> 4) & 0xF, bgmodes[(value >> 4) & 0xF], (value >> 8) & 0xF, bgmodes[(value >> 8) & 0xf], (value >> 12) & 0xF, bgmodes[(value >> 12) & 0xf]); - } - } - else if (id == KING_GSREG_BGPRIO) - { - value = king->priority; - if (special) - { - trio_snprintf(special, special_len, "Affine enable: %s - BG0: %2d, BG1: %2d, BG2: %2d, BG3: %2d", (value & (1 << 12)) ? "Yes" : "No", value & 0x7, (value >> 3) & 0x7, (value >> 6) & 0x7, (value >> 9) & 0x7); - } - } - else if (id == KING_GSREG_BGSCRM) - { - value = king->BGScrollMode; - if (special) - { - trio_snprintf(special, special_len, "BG0: %s, BG1: %s, BG2: %s, BG3: %s", (value & 1) ? "Endless" : "Non-endless", (value & 2) ? "Endless" : "Non-endless", - (value & 4) ? "Endless" : "Non-endless", (value & 8) ? "Endless" : "Non-endless"); - } - } - else if (id == KING_GSREG_BGSIZ0 || id == KING_GSREG_BGSIZ1 || id == KING_GSREG_BGSIZ2 || id == KING_GSREG_BGSIZ3) - { - value = king->BGSize[id - KING_GSREG_BGSIZ0]; - } - else if (id == KING_GSREG_BGXSC0) - value = king->BGXScroll[0]; - else if (id == KING_GSREG_BGXSC1) - value = king->BGXScroll[1]; - else if (id == KING_GSREG_BGXSC2) - value = king->BGXScroll[2]; - else if (id == KING_GSREG_BGXSC3) - value = king->BGXScroll[3]; - - else if (id == KING_GSREG_BGYSC0) - value = king->BGYScroll[0]; - else if (id == KING_GSREG_BGYSC1) - value = king->BGYScroll[1]; - else if (id == KING_GSREG_BGYSC2) - value = king->BGYScroll[2]; - else if (id == KING_GSREG_BGYSC3) - value = king->BGYScroll[3]; - else if (id == KING_GSREG_AFFINA || id == KING_GSREG_AFFINB || id == KING_GSREG_AFFINC || id == KING_GSREG_AFFIND) - { - const uint16 *coeffs[4] = {&king->BGAffinA, &king->BGAffinB, &king->BGAffinC, &king->BGAffinD}; - value = *coeffs[id - KING_GSREG_AFFINA]; - if (special) - { - trio_snprintf(special, special_len, "%f", (double)(int16)value / 256); - } - } - else if (id == KING_GSREG_AFFINX) - value = king->BGAffinCenterX; - else if (id == KING_GSREG_AFFINY) - value = king->BGAffinCenterY; - else if (id == KING_GSREG_BGBATS || id == KING_GSREG_BGBAT0 || id == KING_GSREG_BGBAT1 || id == KING_GSREG_BGBAT2 || id == KING_GSREG_BGBAT3) - { - if (id == KING_GSREG_BGBATS) - value = king->BG0SubBATAddr; - else - value = king->BGBATAddr[id - KING_GSREG_BGBAT0]; - - if (special) - { - trio_snprintf(special, special_len, "0x%04x * 1024 = 0x%05x", value, (value * 1024) & 0x3FFFF); - } - } - else if (id == KING_GSREG_BGCGS || id == KING_GSREG_BGCG0 || id == KING_GSREG_BGCG1 || id == KING_GSREG_BGCG2 || id == KING_GSREG_BGCG3) - { - if (id == KING_GSREG_BGCGS) - value = king->BG0SubCGAddr; - else - value = king->BGCGAddr[id - KING_GSREG_BGCG0]; - if (special) - { - trio_snprintf(special, special_len, "0x%04x * 1024 = 0x%05x", value, (value * 1024) & 0x3FFFF); - } - } - else if (id == KING_GSREG_RTCTRL) - { - value = king->RAINBOWTransferControl; - if (special) - { - trio_snprintf(special, special_len, "Raster Interrupt: %s, Rainbow Transfer: %s", (value & 2) ? "On" : "Off", (value & 1) ? "On" : "Off"); - } - } - else if (id == KING_GSREG_RKRAMA) - value = king->RAINBOWKRAMA; - else if (id == KING_GSREG_RSTART) - value = king->RAINBOWTransferStartPosition; - else if (id == KING_GSREG_RCOUNT) - value = king->RAINBOWTransferBlockCount; - else if (id == KING_GSREG_RIRQLINE) - value = king->RasterIRQLine; - else if (id == KING_GSREG_KRAMRA) - { - value = king->KRAMRA; - } - else if (id == KING_GSREG_KRAMWA) - { - value = king->KRAMWA; - } - else if (id == KING_GSREG_DMATA) - value = king->DMATransferAddr; - else if (id == KING_GSREG_DMATS) - value = king->DMATransferSize; - else if (id == KING_GSREG_DMASTT) - value = king->DMAStatus; - else if (id == KING_GSREG_ADPCMCTRL) - { - value = king->ADPCMControl; - } - else if (id == KING_GSREG_ADPCMBM0 || id == KING_GSREG_ADPCMBM1) - { - value = king->ADPCMBufferMode[id - KING_GSREG_ADPCMBM0]; - } - else if (id == KING_GSREG_ADPCMPA0 || id == KING_GSREG_ADPCMPA1) - { - value = king->ADPCMPlayAddress[id - KING_GSREG_ADPCMPA0]; - } - else if (id == KING_GSREG_ADPCMSA0 || id == KING_GSREG_ADPCMSA1) - { - value = king->ADPCMSAL[id - KING_GSREG_ADPCMSA0]; - } - else if (id == KING_GSREG_ADPCMIA0 || id == KING_GSREG_ADPCMIA1) - { - value = king->ADPCMIntermediateAddress[id - KING_GSREG_ADPCMIA0]; - - if (special) - { - trio_snprintf(special, special_len, "0x%03x * 64 = 0x%08x", value, value << 6); - } - } - else if (id == KING_GSREG_ADPCMEA0 || id == KING_GSREG_ADPCMEA1) - { - value = king->ADPCMEndAddress[id - KING_GSREG_ADPCMEA0]; - } - else if (id == KING_GSREG_ADPCMStat) - { - value = king->ADPCMStatus[0] | (king->ADPCMStatus[1] << 2); - if (special) - { - trio_snprintf(special, special_len, "Ch0 End: %d, Ch0 Intermediate: %d, Ch1 End: %d, Ch1 Intermediate: %d", (int)(bool)(value & 0x1), - (int)(bool)(value & 0x2), - (int)(bool)(value & 0x4), - (int)(bool)(value & 0x8)); - } - } - else if (id == KING_GSREG_Reg01) - { - value = king->Reg01; - if (special) - { - trio_snprintf(special, special_len, "BSY: %d, ATN: %d, SEL: %d, ACK: %d, RST: %d", (int)(bool)(value & 1), (int)(bool)(value & 2), (int)(bool)(value & 4), - (int)(bool)(value & 0x10), (int)(bool)(value & 0x80)); - } - } - else if (id == KING_GSREG_Reg02) - { - value = king->Reg02; - } - else if (id == KING_GSREG_Reg03) - { - value = king->Reg03; - if (special) - { - - trio_snprintf(special, special_len, "I/O: %d, C/D: %d, MSG: %d", (int)(bool)(value & 1), (int)(bool)(value & 2), (int)(bool)(value & 4)); - } - } - else if (id == KING_GSREG_SUBCC) - { - value = king->SubChannelControl; - if (special) - { - - trio_snprintf(special, special_len, "Subchannel reading: %s, Subchannel read IRQ: %s", (value & 0x1) ? "Enabled" : "Disabled", (value & 0x2) ? "On" : "Off"); - } - } - else if (id == KING_GSREG_DB) - value = SCSICD_GetDB(); - else if (id == KING_GSREG_BSY) - value = SCSICD_GetBSY(); - else if (id == KING_GSREG_REQ) - value = SCSICD_GetREQ(); - else if (id == KING_GSREG_ACK) - value = SCSICD_GetACK(); - else if (id == KING_GSREG_MSG) - value = SCSICD_GetMSG(); - else if (id == KING_GSREG_CD) - value = SCSICD_GetCD(); - else if (id == KING_GSREG_IO) - value = SCSICD_GetIO(); - else if (id == KING_GSREG_SEL) - value = SCSICD_GetSEL(); - - return (value); -} - -void FXVCE_SetRegister(const unsigned int id, uint32 value) -{ - if (id == FXVCE_GSREG_PRIO0) - { - fx_vce.priority[0] = value & 0x0777; - } - else if (id == FXVCE_GSREG_PRIO1) - { - fx_vce.priority[1] = value & 0x7777; - } - else if (id == FXVCE_GSREG_PICMODE) - { - fx_vce.picture_mode = value; - } - else if (id == FXVCE_GSREG_PALRWOF) - { - fx_vce.palette_rw_offset = value; - fx_vce.palette_rw_offset &= 0x1FF; - } - else if (id == FXVCE_GSREG_PALRWLA) - fx_vce.palette_rw_latch = value; - else if (id == FXVCE_GSREG_PALOFS0) - fx_vce.palette_offset[0] = value; - else if (id == FXVCE_GSREG_PALOFS1) - fx_vce.palette_offset[1] = value; - else if (id == FXVCE_GSREG_PALOFS2) - fx_vce.palette_offset[2] = value; - else if (id == FXVCE_GSREG_PALOFS3) - { - fx_vce.palette_offset[3] = value; - fx_vce.palette_offset[3] &= 0x00FF; - } - else if (id == FXVCE_GSREG_CKeyY) - fx_vce.ChromaKeyY = value; - else if (id == FXVCE_GSREG_CKeyU) - fx_vce.ChromaKeyU = value; - else if (id == FXVCE_GSREG_CKeyV) - fx_vce.ChromaKeyV = value; - else if (id == FXVCE_GSREG_CCR) - fx_vce.CCR = value; - else if (id == FXVCE_GSREG_BLE) - fx_vce.BLE = value; - else if (id == FXVCE_GSREG_SPBL) - fx_vce.SPBL = value; - else if (id == FXVCE_GSREG_COEFF0 || id == FXVCE_GSREG_COEFF1 || id == FXVCE_GSREG_COEFF2 || id == FXVCE_GSREG_COEFF3 || id == FXVCE_GSREG_COEFF4 || id == FXVCE_GSREG_COEFF5) - fx_vce.coefficients[id - FXVCE_GSREG_COEFF0] = value & 0xFFF; -} - -uint32 FXVCE_GetRegister(const unsigned int id, char *special, const uint32 special_len) -{ - uint32 value = 0xDEADBEEF; - - if (id == FXVCE_GSREG_PRIO0) - { - value = fx_vce.priority[0]; - if (special) - { - trio_snprintf(special, special_len, "VDC BG: %2d, VDC SPR: %2d, RAINBOW: %2d", value & 0xF, (value >> 4) & 0xF, (value >> 8) & 0xF); - } - } - else if (id == FXVCE_GSREG_PRIO1) - { - value = fx_vce.priority[1]; - if (special) - { - trio_snprintf(special, special_len, "BG0: %2d, BG1: %2d, BG2: %2d, BG3: %2d", value & 0xF, (value >> 4) & 0xF, (value >> 8) & 0xF, (value >> 12) & 0xF); - } - } - else if (id == FXVCE_GSREG_PICMODE) - { - value = fx_vce.picture_mode; - if (special) - { - static const char *DCCModes[4] = - { - "263 lines/frame", "262 lines/frame", "Interlaced", "Interlaced+1/2 dot shift"}; - - trio_snprintf(special, special_len, "BG0: %s, BG1: %s, BG2: %s, BG3: %s, VDC BG: %s%s, VDC SPR: %s%s, RAINBOW: %s, VDC Clk: %sMHz, %s", - (value & (1 << 10)) ? "On" : "Off", (value & (1 << 11)) ? "On" : "Off", - (value & (1 << 12)) ? "On" : "Off", (value & (1 << 13)) ? "On" : "Off", - (value & 0x0100) ? "On" : "Off", (value & 0x0040) ? "+merge mode" : "", (value & 0x0200) ? "On" : "Off", (value & 0x0080) ? "+merge mode" : "", - (value & 0x4000) ? "On" : "Off", (value & 0x0008) ? "7.16" : "5.37", DCCModes[value & 0x3]); - } - } - else if (id == FXVCE_GSREG_Line) - value = fx_vce.raster_counter; - else if (id == FXVCE_GSREG_PALRWOF) - value = fx_vce.palette_rw_offset; - else if (id == FXVCE_GSREG_PALRWLA) - value = fx_vce.palette_rw_latch; - else if (id == FXVCE_GSREG_PALOFS0) - value = fx_vce.palette_offset[0]; - else if (id == FXVCE_GSREG_PALOFS1) - value = fx_vce.palette_offset[1]; - else if (id == FXVCE_GSREG_PALOFS2) - value = fx_vce.palette_offset[2]; - else if (id == FXVCE_GSREG_PALOFS3) - value = fx_vce.palette_offset[3]; - else if (id == FXVCE_GSREG_CKeyY) - value = fx_vce.ChromaKeyY; - else if (id == FXVCE_GSREG_CKeyU) - value = fx_vce.ChromaKeyU; - else if (id == FXVCE_GSREG_CKeyV) - value = fx_vce.ChromaKeyV; - - else if (id == FXVCE_GSREG_CCR) - value = fx_vce.CCR; - else if (id == FXVCE_GSREG_BLE) - { - value = fx_vce.BLE; - if (special) - { - trio_snprintf(special, special_len, "%s(%s), Rainbow: %d, BG3: %d, BG2: %d, BG1: %d, BG0: %d, VDC SP: %d, VDC BG: %d", (value & 0x8000) ? "Front" : "Back", (value & 0x4000) ? "On" : "Off", (value >> 12) & 0x3, - (value >> 10) & 3, (value >> 8) & 3, (value >> 6) & 3, (value >> 4) & 3, (value >> 2) & 3, value & 3); - } - } - else if (id == FXVCE_GSREG_SPBL) - value = fx_vce.SPBL; - else if (id == FXVCE_GSREG_COEFF0 || id == FXVCE_GSREG_COEFF1 || id == FXVCE_GSREG_COEFF2 || id == FXVCE_GSREG_COEFF3 || id == FXVCE_GSREG_COEFF4 || id == FXVCE_GSREG_COEFF5) - { - value = fx_vce.coefficients[id - FXVCE_GSREG_COEFF0]; - - if (special) - { - trio_snprintf(special, special_len, "Y: %1d, U: %1d, V: %1d", (value >> 8) & 0xF, (value >> 4) & 0xf, value & 0xf); - } - } - - return (value); -} - -#endif -} diff --git a/waterbox/pcfx/king.h b/waterbox/pcfx/king.h deleted file mode 100644 index 3e5df4edde..0000000000 --- a/waterbox/pcfx/king.h +++ /dev/null @@ -1,212 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* king.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __PCFX_KING_H -#define __PCFX_KING_H - -namespace MDFN_IEN_PCFX -{ - -// -// Be sure to keep the numbered/lettered *_GSREG_* registers(MPROG0*, AFFIN*, etc.) here in contiguous sequential order(since we do stuff like "- KING_GSREG_MPROG0" -// in king.cpp. -// - -void KING_StartFrame(VDC **, EmulateSpecStruct *espec); -void KING_SetPixelFormat(); -uint16 FXVCE_Read16(uint32 A); -void FXVCE_Write16(uint32 A, uint16 V); - -#ifdef WANT_DEBUGGER -enum -{ - FXVCE_GSREG_Line = 0, - - FXVCE_GSREG_PRIO0, - FXVCE_GSREG_PRIO1, - - FXVCE_GSREG_PICMODE, - FXVCE_GSREG_PALRWOF, - FXVCE_GSREG_PALRWLA, - - FXVCE_GSREG_PALOFS0, - FXVCE_GSREG_PALOFS1, - FXVCE_GSREG_PALOFS2, - FXVCE_GSREG_PALOFS3, - - FXVCE_GSREG_CCR, - FXVCE_GSREG_BLE, - FXVCE_GSREG_SPBL, - - FXVCE_GSREG_COEFF0, - FXVCE_GSREG_COEFF1, - FXVCE_GSREG_COEFF2, - FXVCE_GSREG_COEFF3, - FXVCE_GSREG_COEFF4, - FXVCE_GSREG_COEFF5, - - FXVCE_GSREG_CKeyY, - FXVCE_GSREG_CKeyU, - FXVCE_GSREG_CKeyV -}; - -uint32 FXVCE_GetRegister(const unsigned int id, char* special, const uint32 special_len); -void FXVCE_SetRegister(const unsigned int id, uint32 value); -#endif - -uint8 KING_Read8(const v810_timestamp_t timestamp, uint32 A); -uint16 KING_Read16(const v810_timestamp_t timestamp, uint32 A); - -void KING_Write8(const v810_timestamp_t timestamp, uint32 A, uint8 V); -void KING_Write16(const v810_timestamp_t timestamp, uint32 A, uint16 V); -void KING_Init(void) MDFN_COLD; -void KING_Reset(const v810_timestamp_t timestamp) MDFN_COLD; - -uint16 KING_GetADPCMHalfWord(int ch); - -uint8 KING_MemPeek(uint32 A); - -uint8 KING_RB_Fetch(); - -void KING_SetLayerEnableMask(uint64 mask); - -#ifdef WANT_DEBUGGER -enum -{ - KING_GSREG_AR = 0, - KING_GSREG_MPROGADDR, - KING_GSREG_MPROGCTRL, - - KING_GSREG_PAGESET, - KING_GSREG_RTCTRL, - KING_GSREG_RKRAMA, - KING_GSREG_RSTART, - KING_GSREG_RCOUNT, - KING_GSREG_RIRQLINE, - KING_GSREG_KRAMWA, - KING_GSREG_KRAMRA, - KING_GSREG_DMATA, - KING_GSREG_DMATS, - KING_GSREG_DMASTT, - KING_GSREG_ADPCMCTRL, - - KING_GSREG_ADPCMBM0, - KING_GSREG_ADPCMBM1, - - KING_GSREG_ADPCMPA0, - KING_GSREG_ADPCMPA1, - - KING_GSREG_ADPCMSA0, - KING_GSREG_ADPCMSA1, - - KING_GSREG_ADPCMIA0, - KING_GSREG_ADPCMIA1, - - KING_GSREG_ADPCMEA0, - KING_GSREG_ADPCMEA1, - - KING_GSREG_ADPCMStat, - KING_GSREG_Reg01, - KING_GSREG_Reg02, - KING_GSREG_Reg03, - KING_GSREG_SUBCC, - KING_GSREG_DB, - KING_GSREG_BSY, - KING_GSREG_REQ, - KING_GSREG_ACK, - KING_GSREG_MSG, - KING_GSREG_IO, - KING_GSREG_CD, - KING_GSREG_SEL, - - KING_GSREG_BGMODE, - KING_GSREG_BGPRIO, - KING_GSREG_BGSCRM, - - KING_GSREG_BGSIZ0, - KING_GSREG_BGSIZ1, - KING_GSREG_BGSIZ2, - KING_GSREG_BGSIZ3, - - KING_GSREG_BGXSC0, - KING_GSREG_BGXSC1, - KING_GSREG_BGXSC2, - KING_GSREG_BGXSC3, - - KING_GSREG_BGYSC0, - KING_GSREG_BGYSC1, - KING_GSREG_BGYSC2, - KING_GSREG_BGYSC3, - - KING_GSREG_BGBATS, - KING_GSREG_BGBAT0, - KING_GSREG_BGBAT1, - KING_GSREG_BGBAT2, - KING_GSREG_BGBAT3, - - KING_GSREG_BGCGS, - KING_GSREG_BGCG0, - KING_GSREG_BGCG1, - KING_GSREG_BGCG2, - KING_GSREG_BGCG3, - - KING_GSREG_AFFINA, - KING_GSREG_AFFINB, - KING_GSREG_AFFINC, - KING_GSREG_AFFIND, - - KING_GSREG_AFFINX, - KING_GSREG_AFFINY, - - KING_GSREG_MPROG0, - KING_GSREG_MPROG1, - KING_GSREG_MPROG2, - KING_GSREG_MPROG3, - KING_GSREG_MPROG4, - KING_GSREG_MPROG5, - KING_GSREG_MPROG6, - KING_GSREG_MPROG7, - KING_GSREG_MPROG8, - KING_GSREG_MPROG9, - KING_GSREG_MPROGA, - KING_GSREG_MPROGB, - KING_GSREG_MPROGC, - KING_GSREG_MPROGD, - KING_GSREG_MPROGE, - KING_GSREG_MPROGF -}; - -uint32 KING_GetRegister(const unsigned int id, char* special, const uint32 special_len); -void KING_SetRegister(const unsigned int id, uint32 value); -#endif - -void KING_NotifyOfBPE(bool read, bool write); - -void KING_SetLogFunc(void (*logfunc)(const char *, const char *, ...)); - -void KING_EndFrame(v810_timestamp_t timestamp); -void KING_ResetTS(v810_timestamp_t ts_base); - -v810_timestamp_t MDFN_FASTCALL KING_Update(const v810_timestamp_t timestamp); - -} - -#endif diff --git a/waterbox/pcfx/king_mix_body.inc b/waterbox/pcfx/king_mix_body.inc deleted file mode 100644 index 6ce370c991..0000000000 --- a/waterbox/pcfx/king_mix_body.inc +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* king_mix_body.inc: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - - if(fx_vce.dot_clock) // No cellophane in 7.16MHz pixel mode - { - if(HighDotClockWidth == 341) - for(unsigned int x = 0; x < 341; x++) - { - LAYER_MIX_BODY(x * 256 / 341, x); - LAYER_MIX_FINAL_NOCELLO; - } - else if(HighDotClockWidth == 256) - for(unsigned int x = 0; x < 256; x++) - { - LAYER_MIX_BODY(x, x * 341 / 256); - LAYER_MIX_FINAL_NOCELLO; - } - else - for(unsigned int x = 0; x < 1024; x++) - { - LAYER_MIX_BODY(x / 4, x / 3); - LAYER_MIX_FINAL_NOCELLO; - } - } - else if((vce_rendercache.BLE & 0xC000) == 0xC000) // Front cellophane - { - uint8 CCR_Y_front = vce_rendercache.coefficient_mul_table_y[(vce_rendercache.coefficients[0] >> 8) & 0xF][(vce_rendercache.CCR >> 8) & 0xFF]; - int8 CCR_U_front = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[0] >> 4) & 0xF][(vce_rendercache.CCR & 0xF0)]; - int8 CCR_V_front = vce_rendercache.coefficient_mul_table_uv[(vce_rendercache.coefficients[0] >> 0) & 0xF][(vce_rendercache.CCR << 4) & 0xF0]; - - BPC_Cache = 0x008080 | (LAYER_NONE << 28); - - for(unsigned int x = 0; x < 256; x++) - { - LAYER_MIX_BODY(x, x); - LAYER_MIX_FINAL_FRONT_CELLO; - } - } - else if((vce_rendercache.BLE & 0xC000) == 0x4000) // Back cellophane - { - BPC_Cache = ((vce_rendercache.CCR & 0xFF00) << 8) | ((vce_rendercache.CCR & 0xF0) << 8) | ((vce_rendercache.CCR & 0x0F) << 4) | (LAYER_NONE << 28); - - for(unsigned int x = 0; x < 256; x++) - { - LAYER_MIX_BODY(x, x); - LAYER_MIX_FINAL_BACK_CELLO; - } - } - else if(ble_cache_any) // No front/back cello, but cellophane on at least 1 layer - { - for(unsigned int x = 0; x < 256; x++) - { - LAYER_MIX_BODY(x, x); - LAYER_MIX_FINAL_CELLO - } - } - else // No cellophane at all - { - for(unsigned int x = 0; x < 256; x++) - { - LAYER_MIX_BODY(x, x); - LAYER_MIX_FINAL_NOCELLO - } - } - diff --git a/waterbox/pcfx/math_ops.h b/waterbox/pcfx/math_ops.h deleted file mode 100644 index 4154f2d49b..0000000000 --- a/waterbox/pcfx/math_ops.h +++ /dev/null @@ -1,278 +0,0 @@ -/******************************************************************************/ -/* Mednafen - Multi-system Emulator */ -/******************************************************************************/ -/* math_ops.h: -** Copyright (C) 2007-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* -** Some ideas from: -** blargg -** http://graphics.stanford.edu/~seander/bithacks.html -*/ - -#ifndef __MDFN_MATH_OPS_H -#define __MDFN_MATH_OPS_H - -#if defined(_MSC_VER) - #include -#endif - -static INLINE unsigned MDFN_lzcount16_0UD(uint16 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return 15 ^ 31 ^ __builtin_clz(v); - #elif defined(_MSC_VER) - unsigned long idx; - - _BitScanReverse(&idx, v); - - return 15 ^ idx; - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !(v & 0xFF00) << 3; v <<= tmp; ret += tmp; - tmp = !(v & 0xF000) << 2; v <<= tmp; ret += tmp; - tmp = !(v & 0xC000) << 1; v <<= tmp; ret += tmp; - tmp = !(v & 0x8000) << 0; ret += tmp; - - return(ret); - #endif -} - -static INLINE unsigned MDFN_lzcount32_0UD(uint32 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_clz(v); - #elif defined(_MSC_VER) - unsigned long idx; - - _BitScanReverse(&idx, v); - - return 31 ^ idx; - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !(v & 0xFFFF0000) << 4; v <<= tmp; ret += tmp; - tmp = !(v & 0xFF000000) << 3; v <<= tmp; ret += tmp; - tmp = !(v & 0xF0000000) << 2; v <<= tmp; ret += tmp; - tmp = !(v & 0xC0000000) << 1; v <<= tmp; ret += tmp; - tmp = !(v & 0x80000000) << 0; ret += tmp; - - return(ret); - #endif -} - -static INLINE unsigned MDFN_lzcount64_0UD(uint64 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_clzll(v); - #elif defined(_MSC_VER) - #if defined(_WIN64) - unsigned long idx; - _BitScanReverse64(&idx, v); - return 63 ^ idx; - #else - unsigned long idx0; - unsigned long idx1; - - _BitScanReverse(&idx1, v >> 0); - idx1 -= 32; - if(!_BitScanReverse(&idx0, v >> 32)) - idx0 = idx1; - - idx0 += 32; - - return 63 ^ idx0; - #endif - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !(v & 0xFFFFFFFF00000000ULL) << 5; v <<= tmp; ret += tmp; - tmp = !(v & 0xFFFF000000000000ULL) << 4; v <<= tmp; ret += tmp; - tmp = !(v & 0xFF00000000000000ULL) << 3; v <<= tmp; ret += tmp; - tmp = !(v & 0xF000000000000000ULL) << 2; v <<= tmp; ret += tmp; - tmp = !(v & 0xC000000000000000ULL) << 1; v <<= tmp; ret += tmp; - tmp = !(v & 0x8000000000000000ULL) << 0; ret += tmp; - - return(ret); - #endif -} - -static INLINE unsigned MDFN_tzcount16_0UD(uint16 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_ctz(v); - #elif defined(_MSC_VER) - unsigned long idx; - - _BitScanForward(&idx, v); - - return idx; - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !( (uint8)v) << 3; v >>= tmp; ret += tmp; - tmp = !(v & 0x000F) << 2; v >>= tmp; ret += tmp; - tmp = !(v & 0x0003) << 1; v >>= tmp; ret += tmp; - tmp = !(v & 0x0001) << 0; ret += tmp; - - return ret; - #endif -} - -static INLINE unsigned MDFN_tzcount32_0UD(uint32 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_ctz(v); - #elif defined(_MSC_VER) - unsigned long idx; - - _BitScanForward(&idx, v); - - return idx; - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !((uint16)v) << 4; v >>= tmp; ret += tmp; - tmp = !( (uint8)v) << 3; v >>= tmp; ret += tmp; - tmp = !(v & 0x000F) << 2; v >>= tmp; ret += tmp; - tmp = !(v & 0x0003) << 1; v >>= tmp; ret += tmp; - tmp = !(v & 0x0001) << 0; ret += tmp; - - return ret; - #endif -} - -static INLINE unsigned MDFN_tzcount64_0UD(uint64 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_ctzll(v); - #elif defined(_MSC_VER) - #if defined(_WIN64) - unsigned long idx; - _BitScanForward64(&idx, v); - return idx; - #else - unsigned long idx0, idx1; - - _BitScanForward(&idx1, v >> 32); - idx1 += 32; - if(!_BitScanForward(&idx0, v)) - idx0 = idx1; - - return idx0; - #endif - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !((uint32)v) << 5; v >>= tmp; ret += tmp; - tmp = !((uint16)v) << 4; v >>= tmp; ret += tmp; - tmp = !( (uint8)v) << 3; v >>= tmp; ret += tmp; - tmp = !(v & 0x000F) << 2; v >>= tmp; ret += tmp; - tmp = !(v & 0x0003) << 1; v >>= tmp; ret += tmp; - tmp = !(v & 0x0001) << 0; ret += tmp; - - return ret; - #endif -} - -// -// Result is defined for all possible inputs(including 0). -// -static INLINE unsigned MDFN_lzcount16(uint16 v) { return !v ? 16 : MDFN_lzcount16_0UD(v); } -static INLINE unsigned MDFN_lzcount32(uint32 v) { return !v ? 32 : MDFN_lzcount32_0UD(v); } -static INLINE unsigned MDFN_lzcount64(uint64 v) { return !v ? 64 : MDFN_lzcount64_0UD(v); } - -static INLINE unsigned MDFN_tzcount16(uint16 v) { return !v ? 16 : MDFN_tzcount16_0UD(v); } -static INLINE unsigned MDFN_tzcount32(uint32 v) { return !v ? 32 : MDFN_tzcount32_0UD(v); } -static INLINE unsigned MDFN_tzcount64(uint64 v) { return !v ? 64 : MDFN_tzcount64_0UD(v); } - -static INLINE unsigned MDFN_log2(uint32 v) { return 31 ^ MDFN_lzcount32_0UD(v | 1); } -static INLINE unsigned MDFN_log2(uint64 v) { return 63 ^ MDFN_lzcount64_0UD(v | 1); } - -static INLINE unsigned MDFN_log2(int32 v) { return MDFN_log2((uint32)v); } -static INLINE unsigned MDFN_log2(int64 v) { return MDFN_log2((uint64)v); } - -// Rounds up to the nearest power of 2(treats input as unsigned to a degree, but be aware of integer promotion rules). -// Returns 0 on overflow. -static INLINE uint64 round_up_pow2(uint32 v) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (tmp < v); } -static INLINE uint64 round_up_pow2(uint64 v) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (tmp < v); } - -static INLINE uint64 round_up_pow2(int32 v) { return round_up_pow2((uint32)v); } -static INLINE uint64 round_up_pow2(int64 v) { return round_up_pow2((uint64)v); } - -// Rounds to the nearest power of 2(treats input as unsigned to a degree, but be aware of integer promotion rules). -static INLINE uint64 round_nearest_pow2(uint32 v, bool round_half_up = true) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (v && (((v - tmp) << 1) >= (tmp + !round_half_up))); } -static INLINE uint64 round_nearest_pow2(uint64 v, bool round_half_up = true) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (v && (((v - tmp) << 1) >= (tmp + !round_half_up))); } - -static INLINE uint64 round_nearest_pow2(int32 v, bool round_half_up = true) { return round_nearest_pow2((uint32)v, round_half_up); } -static INLINE uint64 round_nearest_pow2(int64 v, bool round_half_up = true) { return round_nearest_pow2((uint64)v, round_half_up); } - -// Some compilers' optimizers and some platforms might fubar the generated code from these macros, -// so some tests are run in...tests.cpp -#define sign_8_to_s16(_value) ((int16)(int8)(_value)) -#define sign_9_to_s16(_value) (((int16)((unsigned int)(_value) << 7)) >> 7) -#define sign_10_to_s16(_value) (((int16)((uint32)(_value) << 6)) >> 6) -#define sign_11_to_s16(_value) (((int16)((uint32)(_value) << 5)) >> 5) -#define sign_12_to_s16(_value) (((int16)((uint32)(_value) << 4)) >> 4) -#define sign_13_to_s16(_value) (((int16)((uint32)(_value) << 3)) >> 3) -#define sign_14_to_s16(_value) (((int16)((uint32)(_value) << 2)) >> 2) -#define sign_15_to_s16(_value) (((int16)((uint32)(_value) << 1)) >> 1) - -// This obviously won't convert higher-than-32 bit numbers to signed 32-bit ;) -// Also, this shouldn't be used for 8-bit and 16-bit signed numbers, since you can -// convert those faster with typecasts... -#define sign_x_to_s32(_bits, _value) (((int32)((uint32)(_value) << (32 - _bits))) >> (32 - _bits)) - -static INLINE int32 clamp_to_u8(int32 i) -{ - if(i & 0xFFFFFF00) - i = (((~i) >> 30) & 0xFF); - - return(i); -} - -static INLINE int32 clamp_to_u16(int32 i) -{ - if(i & 0xFFFF0000) - i = (((~i) >> 31) & 0xFFFF); - - return(i); -} - -template static INLINE void clamp(T *val, U minimum, V maximum) -{ - if(*val < minimum) - { - //printf("Warning: clamping to minimum(%d)\n", (int)minimum); - *val = minimum; - } - if(*val > maximum) - { - //printf("Warning: clamping to maximum(%d)\n", (int)maximum); - *val = maximum; - } -} - -#endif diff --git a/waterbox/pcfx/mem-handler.inc b/waterbox/pcfx/mem-handler.inc deleted file mode 100644 index ad32196fbf..0000000000 --- a/waterbox/pcfx/mem-handler.inc +++ /dev/null @@ -1,328 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* mem-handler.inc: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -uint8 MDFN_FASTCALL mem_peekbyte(const v810_timestamp_t timestamp, const uint32 A) -{ - if (A <= 0x001FFFFF) - return (RAM[A]); - else if (A <= 0x00FFFFFF) - return (0xFF); - else if (A >= 0xF0000000) - return (BIOSROM[A & 0xFFFFF]); - else if (FXSCSIROM && A >= 0x80780000 && A <= 0x807FFFFF) - { - return (FXSCSIROM[A & 0x7FFFF]); - } - return (0xFF); -} - -uint16 MDFN_FASTCALL mem_peekhword(const v810_timestamp_t timestamp, const uint32 A) // TODO: Full memory map peeking. -{ - if (A <= 0x001FFFFF) - return MDFN_de16lsb(&RAM[A]); - else if (A <= 0x00FFFFFF) - return 0xFFFF; - else if (A >= 0xF0000000) - return MDFN_de16lsb(&BIOSROM[A & 0xFFFFF]); - else if (FXSCSIROM && A >= 0x80780000 && A <= 0x807FFFFF) - return MDFN_de16lsb(&FXSCSIROM[A & 0x7FFFF]); - - return 0xFFFF; -} - -static uint8 MDFN_FASTCALL mem_rbyte(v810_timestamp_t ×tamp, uint32 A) -{ - if (A <= 0x001FFFFF) - { - RAMLPCHECK; - return (RAM[A]); - } - else if (A <= 0x00FFFFFF) - { - RAMLPCHECK; - return (0xFF); - } - else if (A >= 0xF0000000) // BIOS ROM mirrored throughout 0xF0000000-0xFFFFFFFF, the "official" location - // is at 0xFFF00000(what about on a PC-FXGA??) - { - timestamp += 2; - return (BIOSROM[A & 0xFFFFF]); - } - else if (A >= 0xE0000000 && A <= 0xE7FFFFFF && !(A & 1)) - { - //printf("%d\n", (A - 0xE0000000) >> 1); - return (BackupRAM[(A & 0xFFFF) >> 1]); - } - else if (A >= 0xE8000000 && A <= 0xE9FFFFFF) - { - if (!(BackupControl & 0x2)) - { - FXDBG("Read8 from external BRAM when not enabled."); - } - - return (ExBackupRAM[(A & 0xFFFF) >> 1]); - } - else if (A >= 0x80000000 && A <= 0x807FFFFF) - { - //FXDBG("Mem->IO B Read Translation: %08x -> %08x", A, A & 0x7FFFFF); - return (port_rbyte(timestamp, A & 0x7FFFFF)); - } - FXDBG("Unknown byte read: %08x", A); - return (0xFF); -} - -static uint16 MDFN_FASTCALL mem_rhword(v810_timestamp_t ×tamp, uint32 A) -{ - if (A <= 0x001FFFFF) - { - RAMLPCHECK; - return MDFN_de16lsb(&RAM[A]); - } - else if (A <= 0x00FFFFFF) - { - RAMLPCHECK; - return (0xFFFF); - } - else if (A >= 0xF0000000) // BIOS ROM mirrored throughout 0xF0000000-0xFFFFFFFF, the "official" location - // is at 0xFFF00000 - { - timestamp += 2; - return MDFN_de16lsb(&BIOSROM[A & 0xFFFFF]); - } - else if (A >= 0xA0000000 && A <= 0xA3FFFFFF) - { - timestamp += 4; - return (FXVCE_Read16(0x4)); - } - else if (A >= 0xA4000000 && A <= 0xA7FFFFFF) - { - timestamp += 4; - return (fx_vdc_chips[0]->Read16(1)); - } - else if (A >= 0xA8000000 && A <= 0xABFFFFFF) - { - timestamp += 4; - return (fx_vdc_chips[1]->Read16(1)); - } - else if (A >= 0xAC000000 && A <= 0xAFFFFFFF) - { - timestamp += 4; - return (KING_Read16(timestamp, 0x604)); - } - else if (A >= 0xB0000000 && A <= 0xBFFFFFFF) // Write only - { - return (0); - } - else if (A >= 0xE0000000 && A <= 0xE7FFFFFF) - { - //printf("%d\n", (A - 0xE0000000) >> 1); - return (BackupRAM[(A & 0xFFFF) >> 1]); - } - else if (A >= 0xE8000000 && A <= 0xE9FFFFFF) - { - if (!(BackupControl & 0x2)) - { - FXDBG("Read16 from external BRAM when not enabled."); - } - - return (ExBackupRAM[(A & 0xFFFF) >> 1]); - } - else if (A >= 0xF8000000 && A <= 0xFFEFFFFF) // PIO - { - FXDBG("PIO H Read: %08x", A); - - return (0x00); - } - else if (A >= 0x80000000 && A <= 0x807FFFFF) - { - //FXDBG("Mem->IO H Read Translation: %08x -> %08x", A, A & 0x7FFFFF); - - return (port_rhword(timestamp, A & 0x7FFFFF)); - } - FXDBG("Unknown hword read: %08x", A); - - return (0xFFFF); -} - -static uint32 MDFN_FASTCALL mem_rword(v810_timestamp_t ×tamp, uint32 A) -{ - if (A <= 0x001FFFFF) - { - RAMLPCHECK; - return MDFN_de32lsb(&RAM[A]); - } - else if (A <= 0x00FFFFFF) - { - RAMLPCHECK; - return (0xFFFFFFFF); - } - else if (A >= 0xB0000000 && A <= 0xBFFFFFFF) // Write only - { - return (0); - } - else - { - uint32 ret; - - FXDBG("Warning: mem_rword() called for 16-bit bus access: %08x", A); - - ret = mem_rhword(timestamp, A); - ret |= mem_rhword(timestamp, A | 2) << 16; - - return (ret); - } - - FXDBG("Unknown word read: %08x", A); - - return (0xFFFFFFFF); -} - -static void MDFN_FASTCALL mem_wbyte(v810_timestamp_t ×tamp, uint32 A, uint8 V) -{ - if (A <= 0x001FFFFF) - { - RAMLPCHECK; - RAM[A] = V; - } - else if (A <= 0x00FFFFFF) - { - RAMLPCHECK; - } - else if (A >= 0xE0000000 && A <= 0xE7FFFFFF && !(A & 1)) - { - if (BackupControl & 0x1) - { - //BackupSignalDirty |= (BackupRAM[(A & 0xFFFF) >> 1] != V); - BackupRAM[(A & 0xFFFF) >> 1] = V; - } - } - else if (A >= 0xE8000000 && A <= 0xE9FFFFFF) - { - //printf("ExWrite: %08x", A); - if (BackupControl & 0x2) - { - //BackupSignalDirty |= (ExBackupRAM[(A & 0xFFFF) >> 1] != V); - ExBackupRAM[(A & 0xFFFF) >> 1] = V; - } - } - else if (A >= 0xF8000000 && A <= 0xFFEFFFFF) - { - FXDBG("PIO B Write: %08x %02x", A, V); - - // PIO? - } - else if (A >= 0x80000000 && A <= 0x807FFFFF) - { - //FXDBG("Mem->IO B Write Translation: %08x %02x -> %08x", A, V, A & 0x7FFFFF); - port_wbyte(timestamp, A & 0x7FFFFF, V); - } -} - -static void MDFN_FASTCALL mem_whword(v810_timestamp_t ×tamp, uint32 A, uint16 V) -{ - if (A <= 0x001FFFFF) - { - RAMLPCHECK; - MDFN_en16lsb(&RAM[A], V); - } - else if (A <= 0x00FFFFFF) - { - RAMLPCHECK; - } - else if (A >= 0xE0000000 && A <= 0xE7FFFFFF) - { - if (BackupControl & 0x1) - { - //BackupSignalDirty |= (BackupRAM[(A & 0xFFFF) >> 1] != (uint8)V); - BackupRAM[(A & 0xFFFF) >> 1] = (uint8)V; - } - } - else if (A >= 0xE8000000 && A <= 0xE9FFFFFF) - { - //printf("ExWrite16: %08x", A); - if (BackupControl & 0x2) - { - //BackupSignalDirty |= (ExBackupRAM[(A & 0xFFFF) >> 1] != (uint8)V); - ExBackupRAM[(A & 0xFFFF) >> 1] = (uint8)V; - } - } - else if (A >= 0xF8000000 && A <= 0xFFEFFFFF) - { - FXDBG("PIO H Write: %08x %04x", A, V); - - // PIO? - } - else if (A >= 0xA0000000 && A <= 0xAFFFFFFF) // Read only - { - } - else if (A >= 0xB0000000 && A <= 0xB3FFFFFF) - { - timestamp += 2; - FXVCE_Write16(0x4, V); - } - else if (A >= 0xB4000000 && A <= 0xB7FFFFFF) - { - timestamp += 2; - fx_vdc_chips[0]->Write16(1, V); - } - else if (A >= 0xB8000000 && A <= 0xBBFFFFFF) - { - timestamp += 2; - fx_vdc_chips[1]->Write16(1, V); - } - else if (A >= 0xBC000000 && A <= 0xBFFFFFFF) - { - timestamp += 2; - KING_Write16(timestamp, 0x604, V); - } - else if (A >= 0x80000000 && A <= 0x807FFFFF) - { - //FXDBG("Mem->IO H Write Translation: %08x %04x -> %08x", A, V, A & 0x7FFFFF); - - port_whword(timestamp, A & 0x7FFFFF, V); - } - else - { - FXDBG("Unknown hword write: %08x %04x", A, V); - } -} - -static void MDFN_FASTCALL mem_wword(v810_timestamp_t ×tamp, uint32 A, uint32 V) -{ - if (A <= 0x001FFFFF) - { - RAMLPCHECK; - MDFN_en32lsb(&RAM[A], V); - } - else if (A <= 0x00FFFFFF) - { - RAMLPCHECK; - } - else if (A >= 0xA0000000 && A <= 0xAFFFFFFF) // Read only - { - } - else - { - FXDBG("Warning: mem_wword() called for 16-bit bus access: %08x", A); - mem_whword(timestamp, A, V); - mem_whword(timestamp, A | 2, V >> 16); - } -} diff --git a/waterbox/pcfx/notes/GAME_NOTES b/waterbox/pcfx/notes/GAME_NOTES deleted file mode 100644 index 9c5343cce4..0000000000 --- a/waterbox/pcfx/notes/GAME_NOTES +++ /dev/null @@ -1,140 +0,0 @@ -------------------------- -Hardware scaling+rotation -------------------------- - -All Japan Female Pro Wrestling - Crazy zoom effects in the intro. - -Anime Freak FX Vol. 1 - Staff List text special effects. - -Anime Freak FX Vol. 2 - Crazy zoom effects in the intro. - -Anime Freak FX Vol. 3 - Staff List text special effects. - -Chip Chan Kick - Name entry screen. - -Cutey Honey FX - Map zoomin/zoomout. - -Der Langrisser FX - Progress/Map(?) when starting a new scenario. - -First Kiss Monogatari - Billboard current-day transition screen. - -Kishin Douji Zenki Vajura Fight FX - Screen blorping after defeating Marubasu. Outside level where you fight the - possessed frog for effects on one of the backgrounds. (Other places too???) - -Kokuu Hyouryuu Nirgends - While flying. - -Konpeki no Kantai - Overhead map screen. - -Last Imperial Prince - Title screen is flipped into place. - -Lunatic Dawn - Map screen. - -Megami Paradise II - Area transitions. - -Miraculum - Title screen, and in the air ship. - -Return to Zork - Background scaling. - -Super Power League FX - Baseball field. - -Tonari no Princess Rolfee - Scene transitions(sometimes). - -Tyoushin Heiki Zeroigar - Second stage boss. - - - ------------------- -256 color VDC mode ------------------- - -Angelique Tenkuu no Requim - -Angelique Special 2 - -Chip Chan Kick - Cybertech Custom screen, cutscenes. - -Ojousama Sousamou - -Tokimeki Card Paradise - - - ---------------- -Back cellophane ---------------- - -Last Imperial Prince - Screen darkening during dialogue, and upper/lower screen greenish tint bug afterwards...uses a non-black CCR value! - -Lunatic Dawn - Background fadeouts. - -PCE Fan Special CDROM Vol 2 - Fadeouts and fadeins. - -Sotsuguyou 2 - Fadeouts and fadeins. - -Team Innocent - Background fadeins. - - - ------------------------------------------------- -Bitstring Hardware I/O Map Mirrors in Memory Map ------------------------------------------------- - -Boundary Gate - -Super Power League FX - - - ----------------------------------- -KING BG mode/microprogram mismatch ----------------------------------- - -Megami Paradise II - -Tonari no Princess Rolfee - - - ------------------- -KING BG0 Subscreen ------------------- - -Angelique Special - Overhead map(probably a coding error on the game developers' part, but it's still - used to the extent that if it's not emulated, the map won't show). - - - ----------- -BIOS Notes ----------- - -CD+G Playback - Pausing/unpausing playback when playing a CD+G disc will cause corruption of the CD+G graphics. - - Using the scan forward/reverse when playing a CD+G disc will cause massive corruption of the CD+G graphics. diff --git a/waterbox/pcfx/pce_psg/pce_psg.cpp b/waterbox/pcfx/pce_psg/pce_psg.cpp deleted file mode 100644 index 193153d238..0000000000 --- a/waterbox/pcfx/pce_psg/pce_psg.cpp +++ /dev/null @@ -1,821 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * Original skeleton write handler and PSG structure definition: - * Copyright (C) 2001 Charles MacDonald - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "../defs.h" -#include "pce_psg.h" - -#include -#include - -// Frequency cache cutoff optimization threshold (<= FREQC7M_COT) -#define FREQC7M_COT 0x7 //0xA - -void PCE_PSG::SetVolume(double new_volume) -{ - for(int vl = 0; vl < 32; vl++) - { - double flub = 1.0 * new_volume * 8 / 6; - - if(vl) - flub /= pow(2, (double)1 / 4 * vl); // ~1.5dB reduction per increment of vl - - if(vl == 0x1F) - flub = 0; - - for(int samp = 0; samp < 32; samp++) - { - int eff_samp; - - if(revision == REVISION_HUC6280) - eff_samp = samp * 2; - else - eff_samp = samp * 2 - 0x1F; - - dbtable[vl][samp] = (int32)(flub * eff_samp * 128); // * 256); - dbtable_volonly[vl] = (int32)(flub * 65536); - - // dbtable[vl][samp] = (int32)(flub * eff_samp * 128); - // dbtable_volonly[vl] = (int32)(flub * 65536); - } - } -} - -// Note: Changing the 0x1F(not that there should be) would require changing the channel pseudo-off volume check logic later on. -static const int scale_tab[] = -{ - 0x00, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F, - 0x10, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F -}; - -#define CLOCK_LFSR(lfsr) { unsigned int newbit = ((lfsr >> 0) ^ (lfsr >> 1) ^ (lfsr >> 11) ^ (lfsr >> 12) ^ (lfsr >> 17)) & 1; lfsr = (lfsr >> 1) | (newbit << 17); } - -static const int16 Phase_Filter[2][7] = -{ - /* 0 */ { 35, 250, 579, 641, 425, 112, 6 }, // 2048 - /* 1 */ { 6, 112, 425, 641, 579, 250, 35 }, // 2048 -}; - -INLINE void PCE_PSG::UpdateOutputSub(const int32 timestamp, psg_channel *ch, const int32 samp0, const int32 samp1) -{ - int32 delta[2]; - - delta[0] = samp0 - ch->blip_prev_samp[0]; - delta[1] = samp1 - ch->blip_prev_samp[1]; - - const int16* c = Phase_Filter[(timestamp >> 1) & 1]; - const int32 l = (timestamp >> 2) & 0xFFFF; - - HRBufs[0][l + 0] += delta[0] * c[0]; - HRBufs[0][l + 1] += delta[0] * c[1]; - HRBufs[0][l + 2] += delta[0] * c[2]; - HRBufs[0][l + 3] += delta[0] * c[3]; - HRBufs[0][l + 4] += delta[0] * c[4]; - HRBufs[0][l + 5] += delta[0] * c[5]; - HRBufs[0][l + 6] += delta[0] * c[6]; - - HRBufs[1][l + 0] += delta[1] * c[0]; - HRBufs[1][l + 1] += delta[1] * c[1]; - HRBufs[1][l + 2] += delta[1] * c[2]; - HRBufs[1][l + 3] += delta[1] * c[3]; - HRBufs[1][l + 4] += delta[1] * c[4]; - HRBufs[1][l + 5] += delta[1] * c[5]; - HRBufs[1][l + 6] += delta[1] * c[6]; - - ch->blip_prev_samp[0] = samp0; - ch->blip_prev_samp[1] = samp1; -} - -void PCE_PSG::UpdateOutput_Norm(const int32 timestamp, psg_channel *ch) -{ - int sv = ch->dda; - - UpdateOutputSub(timestamp, ch, dbtable[ch->vl[0]][sv], - dbtable[ch->vl[1]][sv]); -} - -void PCE_PSG::UpdateOutput_Noise(const int32 timestamp, psg_channel *ch) -{ - int sv = ((ch->lfsr & 1) << 5) - (ch->lfsr & 1); //(ch->lfsr & 0x1) ? 0x1F : 0; - - UpdateOutputSub(timestamp, ch, dbtable[ch->vl[0]][sv], - dbtable[ch->vl[1]][sv]); -} - -void PCE_PSG::UpdateOutput_Off(const int32 timestamp, psg_channel *ch) -{ - UpdateOutputSub(timestamp, ch, 0, 0); -} - -void PCE_PSG::UpdateOutput_Accum_HuC6280A(const int32 timestamp, psg_channel *ch) -{ - int32 samp[2]; - - // 31(5-bit max) * 32 samples = 992 - // 992 / 2 = 496 - // - // 8 + 5 = 13 - // 13 - 12 = 1 - - samp[0] = ((int32)dbtable_volonly[ch->vl[0]] * ((int32)ch->samp_accum - 496)) >> (8 + 5); - samp[1] = ((int32)dbtable_volonly[ch->vl[1]] * ((int32)ch->samp_accum - 496)) >> (8 + 5); - - UpdateOutputSub(timestamp, ch, samp[0], samp[1]); -} - -void PCE_PSG::UpdateOutput_Accum_HuC6280(const int32 timestamp, psg_channel *ch) -{ - int32 samp[2]; - - samp[0] = ((int32)dbtable_volonly[ch->vl[0]] * (int32)ch->samp_accum) >> (8 + 5); - samp[1] = ((int32)dbtable_volonly[ch->vl[1]] * (int32)ch->samp_accum) >> (8 + 5); - - UpdateOutputSub(timestamp, ch, samp[0], samp[1]); -} - - -// This function should always be called after RecalcFreqCache() (it's not called from RecalcFreqCache to avoid redundant code) -void PCE_PSG::RecalcUOFunc(int chnum) -{ - psg_channel *ch = &channel[chnum]; - - //printf("UO Update: %d, %02x\n", chnum, ch->control); - - if((revision != REVISION_HUC6280 && !(ch->control & 0xC0)) || (revision == REVISION_HUC6280 && !(ch->control & 0x80))) - ch->UpdateOutput = &PCE_PSG::UpdateOutput_Off; - else if(ch->noisectrl & ch->control & 0x80) - ch->UpdateOutput = &PCE_PSG::UpdateOutput_Noise; - // If the control for the channel is in waveform play mode, and the (real) playback frequency is too high, and the channel is either not the LFO modulator channel or - // if the LFO trigger bit(which halts the LFO modulator channel's waveform incrementing when set) is clear - else if((ch->control & 0xC0) == 0x80 && ch->freq_cache <= FREQC7M_COT && (chnum != 1 || !(lfoctrl & 0x80)) ) - ch->UpdateOutput = UpdateOutput_Accum; - else - ch->UpdateOutput = &PCE_PSG::UpdateOutput_Norm; -} - - -void PCE_PSG::RecalcFreqCache(int chnum) -{ - psg_channel *ch = &channel[chnum]; - - if(chnum == 0 && (lfoctrl & 0x03)) - { - const uint32 shift = (((lfoctrl & 0x3) - 1) << 1); - uint8 la = channel[1].dda; - uint32 tmp_freq = (ch->frequency + ((uint32)(la - 0x10) << shift)) & 0xFFF; - - ch->freq_cache = (tmp_freq ? tmp_freq : 4096) << 1; - } - else - { - ch->freq_cache = (ch->frequency ? ch->frequency : 4096) << 1; - - if(chnum == 1 && (lfoctrl & 0x03)) - ch->freq_cache *= lfofreq ? lfofreq : 256; - } -} - -void PCE_PSG::RecalcNoiseFreqCache(int chnum) -{ - psg_channel *ch = &channel[chnum]; - int32 freq = 0x1F - (ch->noisectrl & 0x1F); - - if(!freq) - freq = 0x20; - else - freq <<= 6; - - freq <<= 1; - - ch->noise_freq_cache = freq; -} - -void PCE_PSG::PeekWave(const unsigned int ch, uint32 Address, uint32 Length, uint8 *Buffer) -{ - assert(ch <= 5); - - while(Length--) - { - Address &= 0x1F; - *Buffer = channel[ch].waveform[Address]; - Address++; - Buffer++; - } -} - -void PCE_PSG::PokeWave(const unsigned int ch, uint32 Address, uint32 Length, const uint8 *Buffer) -{ - assert(ch <= 5); - - while(Length--) - { - Address &= 0x1F; - channel[ch].samp_accum -= channel[ch].waveform[Address]; - channel[ch].waveform[Address] = *Buffer & 0x1F; - channel[ch].samp_accum += channel[ch].waveform[Address]; - Address++; - Buffer++; - } -} - -uint32 PCE_PSG::GetRegister(const unsigned int id, char *special, const uint32 special_len) -{ - uint32 value = 0xDEADBEEF; - const int ch = (id >> 8) & 0xF; - - switch(id & 0xF0FF) - { - default: break; - - case PSG_GSREG_SELECT: - value = select; - break; - - case PSG_GSREG_GBALANCE: - value = globalbalance; - break; - - case PSG_GSREG_LFOFREQ: - value = lfofreq; - break; - - case PSG_GSREG_LFOCTRL: - value = lfoctrl; - break; - - case PSG_GSREG_CH0_FREQ: - value = channel[ch].frequency; - break; - - case PSG_GSREG_CH0_CTRL: - value = channel[ch].control; - break; - - case PSG_GSREG_CH0_BALANCE: - value = channel[ch].balance; - break; - - case PSG_GSREG_CH0_WINDEX: - value = channel[ch].waveform_index; - break; - - case PSG_GSREG_CH0_SCACHE: - value = channel[ch].dda; - break; - - case PSG_GSREG_CH0_NCTRL: - value = channel[ch].noisectrl; - break; - - case PSG_GSREG_CH0_LFSR: - value = channel[ch].lfsr & 0x3FFFF; - break; - } - return(value); -} - - -void PCE_PSG::SetRegister(const unsigned int id, const uint32 value) -{ - const int ch = (id >> 8) & 0xF; - - switch(id & 0xF0FF) - { - default: break; - - case PSG_GSREG_SELECT: - select = value & 0x07; - break; - - case PSG_GSREG_GBALANCE: - globalbalance = value & 0xFF; - break; - - case PSG_GSREG_LFOFREQ: - lfofreq = value & 0xFF; - break; - - case PSG_GSREG_LFOCTRL: - lfoctrl = value & 0x83; - RecalcFreqCache(0); - RecalcUOFunc(0); - RecalcFreqCache(1); - RecalcUOFunc(1); - break; - - case PSG_GSREG_CH0_FREQ: - channel[ch].frequency = value & 0xFFF; - RecalcFreqCache(ch); - RecalcUOFunc(ch); - break; - - case PSG_GSREG_CH0_CTRL: - channel[ch].control = value & 0xFF; - RecalcFreqCache(ch); - RecalcUOFunc(ch); - break; - - case PSG_GSREG_CH0_BALANCE: - channel[ch].balance = value & 0xFF; - break; - - case PSG_GSREG_CH0_WINDEX: - channel[ch].waveform_index = value & 0x1F; - break; - - case PSG_GSREG_CH0_SCACHE: - channel[ch].dda = value & 0x1F; - break; - - case PSG_GSREG_CH0_NCTRL: - channel[ch].noisectrl = value & 0xFF; - RecalcNoiseFreqCache(ch); - RecalcUOFunc(ch); - break; - - case PSG_GSREG_CH0_LFSR: - channel[ch].lfsr = value & 0x3FFFF; - break; - } -} - - -#if 0 -void PSG_SetRegister(const unsigned int id, const uint32 value) -{ - - - if(name == "Select") - PSG_Write(0x00, V); - else if(name == "GBalance") - PSG_Write(0x01, V); - else if(name == "LFOFreq") - { - PSG_Write(0x08, V); - } - else if(name == "LFOCtrl") - PSG_Write(0x09, V); - else if(!strncmp(name.c_str(), "CH", 2)) - { - unsigned int psg_sel_save = select; - int ch = name[2] - '0'; - char moomoo[64]; - strncpy(moomoo, name.c_str() + 3, 63); - - PSG_Write(0x00, ch); - - if(!strcmp(moomoo, "Freq")) - { - PSG_Write(0x02, V); - PSG_Write(0x03, V >> 8); - } - else if(!strcmp(moomoo, "Ctrl")) - PSG_Write(0x04, V); - else if(!strcmp(moomoo, "Balance")) - PSG_Write(0x05, V); - else if(!strcmp(moomoo, "WIndex")) - psg.channel[ch].waveform_index = V & 0x1F; - else if(!strcmp(moomoo, "SCache")) - psg.channel[ch].dda = V & 0x1F; - else if(!strcmp(moomoo, "NCtrl") && ch < 4) - psg.channel[ch].noisectrl = V; - else if(!strcmp(moomoo, "LFSR") && ch < 4) - psg.channel[ch].lfsr = V & 0x3FFFF; - - PSG_Write(0x00, psg_sel_save); - } -} -#endif - -PCE_PSG::PCE_PSG(int32* hr_l, int32* hr_r, int want_revision) -{ - //printf("Test: %u, %u\n", sizeof(psg_channel), (uint8*)&channel[0].balance - (uint8*)&channel[0].waveform[0]); - - revision = want_revision; - switch(revision) - { - default: - abort(); - break; - - case REVISION_HUC6280: - UpdateOutput_Accum = &PCE_PSG::UpdateOutput_Accum_HuC6280; - break; - - case REVISION_HUC6280A: - UpdateOutput_Accum = &PCE_PSG::UpdateOutput_Accum_HuC6280A; - break; - } - HRBufs[0] = hr_l; - HRBufs[1] = hr_r; - - lastts = 0; - for(int ch = 0; ch < 6; ch++) - { - channel[ch].blip_prev_samp[0] = 0; - channel[ch].blip_prev_samp[1] = 0; - channel[ch].lastts = 0; - } - - SetVolume(1.0); // Will build dbtable in the process. - Power(0); -} - -PCE_PSG::~PCE_PSG() -{ - - -} - -int32 PCE_PSG::GetVL(const int chnum, const int lr) -{ - psg_channel *ch = &channel[chnum]; - - const int gbal = 0x1F - scale_tab[(globalbalance >> (lr ? 0 : 4)) & 0xF]; - const int bal = 0x1F - scale_tab[(ch->balance >> (lr ? 0 : 4)) & 0xF]; - const int al = 0x1F - (ch->control & 0x1F); - int vol_reduction; - - vol_reduction = gbal + bal + al; - - if(vol_reduction > 0x1F) - vol_reduction = 0x1F; - - return(vol_reduction); -} - -void PCE_PSG::Write(int32 timestamp, uint8 A, uint8 V) -{ - A &= 0x0F; - - if(A == 0x00) - { - select = (V & 0x07); - return; - } - - Update(timestamp); - - psg_channel *ch = &channel[select]; - - //if(A == 0x01 || select == 5) - // printf("Write Ch: %d %04x %02x, %d\n", select, A, V, timestamp); - - switch(A) - { - default: break; - - case 0x01: /* Global sound balance */ - globalbalance = V; - vol_pending = true; - break; - - case 0x02: /* Channel frequency (LSB) */ - if(select > 5) return; // no more than 6 channels, silly game. - - ch->frequency = (ch->frequency & 0x0F00) | V; - RecalcFreqCache(select); - RecalcUOFunc(select); - break; - - case 0x03: /* Channel frequency (MSB) */ - if(select > 5) return; // no more than 6 channels, silly game. - - ch->frequency = (ch->frequency & 0x00FF) | ((V & 0x0F) << 8); - RecalcFreqCache(select); - RecalcUOFunc(select); - break; - - case 0x04: /* Channel enable, DDA, volume */ - if(select > 5) return; // no more than 6 channels, silly game. - - if((ch->control & 0x40) && !(V & 0x40)) - { - ch->waveform_index = 0; - ch->dda = ch->waveform[ch->waveform_index]; - ch->counter = ch->freq_cache; - } - - if(!(ch->control & 0x80) && (V & 0x80)) - { - if(!(V & 0x40)) - { - ch->waveform_index = (ch->waveform_index + 1) & 0x1F; - ch->dda = ch->waveform[ch->waveform_index]; - } - } - - ch->control = V; - RecalcFreqCache(select); - RecalcUOFunc(select); - - vol_pending = true; - break; - - case 0x05: /* Channel balance */ - if(select > 5) return; // no more than 6 channels, silly game. - ch->balance = V; - - vol_pending = true; - break; - - case 0x06: /* Channel waveform data */ - if(select > 5) return; // no more than 6 channels, silly game. - V &= 0x1F; - - if(!(ch->control & 0x40)) - { - ch->samp_accum -= ch->waveform[ch->waveform_index]; - ch->waveform[ch->waveform_index] = V; - ch->samp_accum += ch->waveform[ch->waveform_index]; - } - - if((ch->control & 0xC0) == 0x00) - ch->waveform_index = ((ch->waveform_index + 1) & 0x1F); - - if(ch->control & 0x80) - { - // According to my tests(on SuperGrafx), writing to this channel - // will update the waveform value cache/latch regardless of DDA mode being enabled. - ch->dda = V; - } - break; - - case 0x07: /* Noise enable and frequency */ - if(select > 5) return; // no more than 6 channels, silly game. - if(select >= 4) - { - ch->noisectrl = V; - RecalcNoiseFreqCache(select); - RecalcUOFunc(select); - } - break; - - case 0x08: /* LFO frequency */ - lfofreq = V & 0xFF; - //printf("LFO Freq: %02x\n", V); - break; - - case 0x09: /* LFO trigger and control */ - //printf("LFO Ctrl: %02x\n", V); - if(V & 0x80) - { - channel[1].waveform_index = 0; - channel[1].dda = channel[1].waveform[channel[1].waveform_index]; - channel[1].counter = channel[1].freq_cache; - } - lfoctrl = V; - RecalcFreqCache(0); - RecalcUOFunc(0); - RecalcFreqCache(1); - RecalcUOFunc(1); - break; - } -} - -// Don't use INLINE, which has always_inline in it, due to gcc's inability to cope with the type of recursion -// used in this function. -void PCE_PSG::RunChannel(int chc, int32 timestamp, const bool LFO_On) -{ - psg_channel *ch = &channel[chc]; - int32 running_timestamp = ch->lastts; - int32 run_time = timestamp - ch->lastts; - - ch->lastts = timestamp; - - if(!run_time) - return; - - (this->*ch->UpdateOutput)(running_timestamp, ch); - - if(chc >= 4) - { - int32 freq = ch->noise_freq_cache; - - ch->noisecount -= run_time; - - if(&PCE_PSG::UpdateOutput_Noise == ch->UpdateOutput) - while(ch->noisecount <= 0) - { - CLOCK_LFSR(ch->lfsr); - UpdateOutput_Noise(timestamp + ch->noisecount, ch); - ch->noisecount += freq; - } - else - while(ch->noisecount <= 0) - { - CLOCK_LFSR(ch->lfsr); - ch->noisecount += freq; - } - } - - // D7 of control is 0, don't clock the counter at all. - // D7 of lfocontrol is 1(and chc == 1), don't clock the counter at all(not sure about this) - // In DDA mode, don't clock the counter. - // (Noise being enabled isn't handled here since AFAIK it doesn't disable clocking of the waveform portion, its sound just overrides the sound from - // the waveform portion when the noise enable bit is set, which is handled in our RecalcUOFunc). - if(!(ch->control & 0x80) || (chc == 1 && (lfoctrl & 0x80)) || (ch->control & 0x40)) - return; - - ch->counter -= run_time; - - if(!LFO_On && ch->freq_cache <= FREQC7M_COT) - { - if(ch->counter <= 0) - { - const int32 inc_count = ((0 - ch->counter) / ch->freq_cache) + 1; - - ch->counter += inc_count * ch->freq_cache; - - ch->waveform_index = (ch->waveform_index + inc_count) & 0x1F; - ch->dda = ch->waveform[ch->waveform_index]; - } - } - - while(ch->counter <= 0) - { - ch->waveform_index = (ch->waveform_index + 1) & 0x1F; - ch->dda = ch->waveform[ch->waveform_index]; - - (this->*ch->UpdateOutput)(timestamp + ch->counter, ch); - - if(LFO_On) - { - RunChannel(1, timestamp + ch->counter, false); - RecalcFreqCache(0); - RecalcUOFunc(0); - - ch->counter += (ch->freq_cache <= FREQC7M_COT) ? FREQC7M_COT : ch->freq_cache; // Not particularly accurate, but faster. - } - else - ch->counter += ch->freq_cache; - } -} - -void PCE_PSG::UpdateSubLFO(int32 timestamp) -{ - for(int chc = 0; chc < 6; chc++) - RunChannel(chc, timestamp, chc == 0); -} - -void PCE_PSG::UpdateSubNonLFO(int32 timestamp) -{ - for(int chc = 0; chc < 6; chc++) - RunChannel(chc, timestamp, false); -} - -void PCE_PSG::Update(int32 timestamp) -{ - int32 run_time = timestamp - lastts; - - if(vol_pending && !vol_update_counter && !vol_update_which) - { - vol_update_counter = 1; - vol_pending = false; - } - - bool lfo_on = (bool)(lfoctrl & 0x03); - - if(lfo_on) - { - if(!(channel[1].control & 0x80) || (lfoctrl & 0x80)) - { - lfo_on = 0; - RecalcFreqCache(0); - RecalcUOFunc(0); - } - } - - int32 clocks = run_time; - int32 running_timestamp = lastts; - - while(clocks > 0) - { - int32 chunk_clocks = clocks; - - if(vol_update_counter > 0 && chunk_clocks > vol_update_counter) - chunk_clocks = vol_update_counter; - - running_timestamp += chunk_clocks; - clocks -= chunk_clocks; - - if(lfo_on) - UpdateSubLFO(running_timestamp); - else - UpdateSubNonLFO(running_timestamp); - - if(vol_update_counter > 0) - { - vol_update_counter -= chunk_clocks; - if(!vol_update_counter) - { - const int phase = vol_update_which & 1; - const int lr = ((vol_update_which >> 1) & 1) ^ 1; - const int chnum = vol_update_which >> 2; - - if(!phase) - { - //printf("Volume update(Read, %d since last): ch=%d, lr=%d, ts=%d\n", running_timestamp - last_read, chnum, lr, running_timestamp); - - if(chnum < 6) - { - vol_update_vllatch = GetVL(chnum, lr); - } - //last_read = running_timestamp; - } - else - { - // printf("Volume update(Apply): ch=%d, lr=%d, ts=%d\n", chnum, lr, running_timestamp); - if(chnum < 6) - { - channel[chnum].vl[lr] = vol_update_vllatch; - } - //last_apply = running_timestamp; - } - vol_update_which = (vol_update_which + 1) & 0x1F; - - if(vol_update_which) - vol_update_counter = phase ? 1 : 255; - else if(vol_pending) - { - vol_update_counter = phase ? 1 : 255; - vol_pending = false; - } - } - } - - lastts = running_timestamp; - } -} - -void PCE_PSG::ResetTS(int32 ts_base) -{ - lastts = ts_base; - - for(int chc = 0; chc < 6; chc++) - channel[chc].lastts = ts_base; -} - -void PCE_PSG::Power(const int32 timestamp) -{ - // Not sure about power-on values, these are mostly just intuitive guesses(with some laziness thrown in). - if(timestamp != lastts) - Update(timestamp); - - // Don't memset channel to 0, there's stuff like lastts and blip_prev_samp that shouldn't be altered on Power(). - - select = 0; - globalbalance = 0; - lfofreq = 0; - lfoctrl = 0; - - for(int ch = 0; ch < 6; ch++) - { - channel[ch].frequency = 0; - channel[ch].control = 0x00; - channel[ch].balance = 0; - memset(channel[ch].waveform, 0, 32); - channel[ch].samp_accum = 0; - - channel[ch].waveform_index = 0; - channel[ch].dda = 0x00; - channel[ch].noisectrl = 0x00; - - channel[ch].vl[0] = 0x1F; - channel[ch].vl[1] = 0x1F; - - channel[ch].samp_accum = 0; - - RecalcFreqCache(ch); - RecalcUOFunc(ch); - - channel[ch].counter = channel[ch].freq_cache; - - if(ch >= 4) - { - RecalcNoiseFreqCache(ch); - } - channel[ch].noisecount = 1; - channel[ch].lfsr = 1; - } - - vol_pending = false; - vol_update_counter = 0; - vol_update_which = 0; -} diff --git a/waterbox/pcfx/pce_psg/pce_psg.h b/waterbox/pcfx/pce_psg/pce_psg.h deleted file mode 100644 index 96bb65ef3c..0000000000 --- a/waterbox/pcfx/pce_psg/pce_psg.h +++ /dev/null @@ -1,187 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * Original skeleton write handler and PSG structure definition: - * Copyright (C) 2001 Charles MacDonald - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef _PCE_PSG_H -#define _PCE_PSG_H - -class PCE_PSG; - -struct psg_channel -{ - uint8 waveform[32]; /* Waveform data */ - uint8 waveform_index; /* Waveform data index */ - uint8 dda; - uint8 control; /* Channel enable, DDA, volume */ - uint8 noisectrl; /* Noise enable/ctrl (channels 4,5 only) */ - - int32 vl[2]; //vll, vlr; - - int32 counter; - - void (PCE_PSG::*UpdateOutput)(const int32 timestamp, psg_channel *ch); - - uint32 freq_cache; - uint32 noise_freq_cache; // Channel 4,5 only - int32 noisecount; - uint32 lfsr; - - int32 samp_accum; // The result of adding up all the samples in the waveform buffer(part of an optimization for high-frequency playback). - int32 blip_prev_samp[2]; - int32 lastts; - - uint16 frequency; /* Channel frequency */ - uint8 balance; /* Channel balance */ -}; - -// Only CH4 and CH5 have NCTRL and LFSR, but it's here for the other channels for "consistency". -enum -{ - PSG_GSREG_CH0_FREQ = 0x000, - // PSG_GSREG_CH0_COUNTER, - PSG_GSREG_CH0_CTRL, - PSG_GSREG_CH0_BALANCE, - PSG_GSREG_CH0_WINDEX, - PSG_GSREG_CH0_SCACHE, - PSG_GSREG_CH0_NCTRL, - PSG_GSREG_CH0_LFSR, - - PSG_GSREG_CH1_FREQ = 0x100, - // PSG_GSREG_CH1_COUNTER, - PSG_GSREG_CH1_CTRL, - PSG_GSREG_CH1_BALANCE, - PSG_GSREG_CH1_WINDEX, - PSG_GSREG_CH1_SCACHE, - PSG_GSREG_CH1_NCTRL, - PSG_GSREG_CH1_LFSR, - - PSG_GSREG_CH2_FREQ = 0x200, - // PSG_GSREG_CH2_COUNTER, - PSG_GSREG_CH2_CTRL, - PSG_GSREG_CH2_BALANCE, - PSG_GSREG_CH2_WINDEX, - PSG_GSREG_CH2_SCACHE, - PSG_GSREG_CH2_NCTRL, - PSG_GSREG_CH2_LFSR, - - PSG_GSREG_CH3_FREQ = 0x300, - // PSG_GSREG_CH3_COUNTER, - PSG_GSREG_CH3_CTRL, - PSG_GSREG_CH3_BALANCE, - PSG_GSREG_CH3_WINDEX, - PSG_GSREG_CH3_SCACHE, - PSG_GSREG_CH3_NCTRL, - PSG_GSREG_CH3_LFSR, - - PSG_GSREG_CH4_FREQ = 0x400, - // PSG_GSREG_CH4_COUNTER, - PSG_GSREG_CH4_CTRL, - PSG_GSREG_CH4_BALANCE, - PSG_GSREG_CH4_WINDEX, - PSG_GSREG_CH4_SCACHE, - PSG_GSREG_CH4_NCTRL, - PSG_GSREG_CH4_LFSR, - - PSG_GSREG_CH5_FREQ = 0x500, - // PSG_GSREG_CH5_COUNTER, - PSG_GSREG_CH5_CTRL, - PSG_GSREG_CH5_BALANCE, - PSG_GSREG_CH5_WINDEX, - PSG_GSREG_CH5_SCACHE, - PSG_GSREG_CH5_NCTRL, - PSG_GSREG_CH5_LFSR, - - PSG_GSREG_SELECT = 0x1000, - PSG_GSREG_GBALANCE, - PSG_GSREG_LFOFREQ, - PSG_GSREG_LFOCTRL, - _PSG_GSREG_COUNT -}; - -class PCE_PSG -{ - public: - enum - { - REVISION_HUC6280 = 0, - REVISION_HUC6280A, - _REVISION_COUNT - }; - - PCE_PSG(int32 *hr_l, int32 *hr_r, int want_revision) - MDFN_COLD; - ~PCE_PSG() MDFN_COLD; - - void Power(const int32 timestamp) MDFN_COLD; - void Write(int32 timestamp, uint8 A, uint8 V); - - void SetVolume(double new_volume); - - void Update(int32 timestamp); - void ResetTS(int32 ts_base = 0); - - // TODO: timestamp - uint32 GetRegister(const unsigned int id, char *special, const uint32 special_len); - void SetRegister(const unsigned int id, const uint32 value); - - void PeekWave(const unsigned int ch, uint32 Address, uint32 Length, uint8 *Buffer); - void PokeWave(const unsigned int ch, uint32 Address, uint32 Length, const uint8 *Buffer); - - private: - void UpdateSubLFO(int32 timestamp); - void UpdateSubNonLFO(int32 timestamp); - - void RecalcUOFunc(int chnum); - void UpdateOutputSub(const int32 timestamp, psg_channel *ch, const int32 samp0, const int32 samp1); - void UpdateOutput_Off(const int32 timestamp, psg_channel *ch); - void UpdateOutput_Accum_HuC6280(const int32 timestamp, psg_channel *ch); - void UpdateOutput_Accum_HuC6280A(const int32 timestamp, psg_channel *ch); - void UpdateOutput_Norm(const int32 timestamp, psg_channel *ch); - void UpdateOutput_Noise(const int32 timestamp, psg_channel *ch); - void (PCE_PSG::*UpdateOutput_Accum)(const int32 timestamp, psg_channel *ch); - - int32 GetVL(const int chnum, const int lr); - - void RecalcFreqCache(int chnum); - void RecalcNoiseFreqCache(int chnum); - void RunChannel(int chc, int32 timestamp, bool LFO_On); - - uint8 select; /* Selected channel (0-5) */ - uint8 globalbalance; /* Global sound balance */ - uint8 lfofreq; /* LFO frequency */ - uint8 lfoctrl; /* LFO control */ - - int32 vol_update_counter; - int32 vol_update_which; - int32 vol_update_vllatch; - bool vol_pending; - - psg_channel channel[6]; - - int32 lastts; - int revision; - - int32 *HRBufs[2]; - - int32 dbtable_volonly[32]; - - int32 dbtable[32][32]; -}; - -#endif diff --git a/waterbox/pcfx/pcfx.cpp b/waterbox/pcfx/pcfx.cpp deleted file mode 100644 index f201921d48..0000000000 --- a/waterbox/pcfx/pcfx.cpp +++ /dev/null @@ -1,954 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* pcfx.cpp: -** Copyright (C) 2006-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "pcfx.h" -#include "soundbox.h" -#include "input.h" -#include "king.h" -#include "timer.h" -#include "interrupt.h" -#include "rainbow.h" -#include "huc6273.h" -#include "fxscsi.h" -#include "cdrom/cdromif.h" -#include "cdrom/scsicd.h" -//#include - -#include -#include -#include - -#include "../emulibc/emulibc.h" -#include "../emulibc/waterboxcore.h" - -namespace MDFN_IEN_PCFX -{ - -/* FIXME: soundbox, vce, vdc, rainbow, and king store wait states should be 4, not 2, but V810 has write buffers which can mask wait state penalties. - This is a hack to somewhat address the issue, but to really fix it, we need to handle write buffer emulation in the V810 emulation core itself. -*/ -static std::vector *cdifs = NULL; - -V810 PCFX_V810; - -static uint8 *BIOSROM = NULL; // 1MB -static uint8 *RAM = NULL; // 2MB -static uint8 *FXSCSIROM = NULL; // 512KiB - -static uint32 RAM_LPA; // Last page access - -static const int RAM_PageSize = 2048; -static const int RAM_PageNOTMask = ~(RAM_PageSize - 1); - -static uint16 Last_VDC_AR[2]; - -static bool WantHuC6273 = FALSE; - -//static -VDC *fx_vdc_chips[2]; - -static uint16 BackupControl; -static uint8 BackupRAM[0x8000], ExBackupRAM[0x8000]; -static uint8 ExBusReset; // I/O Register at 0x0700 - -static bool Lagged; -static void (*InputCallback)(); - -// Checks to see if this main-RAM-area access -// is in the same DRAM page as the last access. -#define RAMLPCHECK \ - { \ - if ((A & RAM_PageNOTMask) != RAM_LPA) \ - { \ - timestamp += 3; \ - RAM_LPA = A & RAM_PageNOTMask; \ - } \ - } - -static v810_timestamp_t next_pad_ts, next_timer_ts, next_adpcm_ts, next_king_ts; - -void PCFX_FixNonEvents(void) -{ - if (next_pad_ts & 0x40000000) - next_pad_ts = PCFX_EVENT_NONONO; - - if (next_timer_ts & 0x40000000) - next_timer_ts = PCFX_EVENT_NONONO; - - if (next_adpcm_ts & 0x40000000) - next_adpcm_ts = PCFX_EVENT_NONONO; - - if (next_king_ts & 0x40000000) - next_king_ts = PCFX_EVENT_NONONO; -} - -void PCFX_Event_Reset(void) -{ - next_pad_ts = PCFX_EVENT_NONONO; - next_timer_ts = PCFX_EVENT_NONONO; - next_adpcm_ts = PCFX_EVENT_NONONO; - next_king_ts = PCFX_EVENT_NONONO; -} - -static INLINE uint32 CalcNextTS(void) -{ - v810_timestamp_t next_timestamp = next_king_ts; - - if (next_timestamp > next_pad_ts) - next_timestamp = next_pad_ts; - - if (next_timestamp > next_timer_ts) - next_timestamp = next_timer_ts; - - if (next_timestamp > next_adpcm_ts) - next_timestamp = next_adpcm_ts; - - return (next_timestamp); -} - -static void RebaseTS(const v810_timestamp_t timestamp, const v810_timestamp_t new_base_timestamp) -{ - assert(next_pad_ts > timestamp); - assert(next_timer_ts > timestamp); - assert(next_adpcm_ts > timestamp); - assert(next_king_ts > timestamp); - - next_pad_ts -= (timestamp - new_base_timestamp); - next_timer_ts -= (timestamp - new_base_timestamp); - next_adpcm_ts -= (timestamp - new_base_timestamp); - next_king_ts -= (timestamp - new_base_timestamp); - - //printf("RTS: %d %d %d %d\n", next_pad_ts, next_timer_ts, next_adpcm_ts, next_king_ts); -} - -void PCFX_SetEvent(const int type, const v810_timestamp_t next_timestamp) -{ - //assert(next_timestamp > PCFX_V810.v810_timestamp); - - if (type == PCFX_EVENT_PAD) - next_pad_ts = next_timestamp; - else if (type == PCFX_EVENT_TIMER) - next_timer_ts = next_timestamp; - else if (type == PCFX_EVENT_ADPCM) - next_adpcm_ts = next_timestamp; - else if (type == PCFX_EVENT_KING) - next_king_ts = next_timestamp; - - if (next_timestamp < PCFX_V810.GetEventNT()) - PCFX_V810.SetEventNT(next_timestamp); -} - -int32 MDFN_FASTCALL pcfx_event_handler(const v810_timestamp_t timestamp) -{ - if (timestamp >= next_king_ts) - next_king_ts = KING_Update(timestamp); - - if (timestamp >= next_pad_ts) - next_pad_ts = FXINPUT_Update(timestamp); - - if (timestamp >= next_timer_ts) - next_timer_ts = FXTIMER_Update(timestamp); - - if (timestamp >= next_adpcm_ts) - next_adpcm_ts = SoundBox_ADPCMUpdate(timestamp); - -#if 1 - assert(next_king_ts > timestamp); - assert(next_pad_ts > timestamp); - assert(next_timer_ts > timestamp); - assert(next_adpcm_ts > timestamp); -#endif - return (CalcNextTS()); -} - -static void ForceEventUpdates(const uint32 timestamp) -{ - next_king_ts = KING_Update(timestamp); - next_pad_ts = FXINPUT_Update(timestamp); - next_timer_ts = FXTIMER_Update(timestamp); - next_adpcm_ts = SoundBox_ADPCMUpdate(timestamp); - - //printf("Meow: %d\n", CalcNextTS()); - PCFX_V810.SetEventNT(CalcNextTS()); - - //printf("FEU: %d %d %d %d\n", next_pad_ts, next_timer_ts, next_adpcm_ts, next_king_ts); -} - -#include "io-handler.inc" -#include "mem-handler.inc" - -typedef struct -{ - int8 tracknum; - int8 format; - uint32 lba; -} CDGameEntryTrack; - -typedef struct -{ - const char *name; - const char *name_original; // Original non-Romanized text. - const uint32 flags; // Emulation flags. - const unsigned int discs; // Number of discs for this game. - CDGameEntryTrack tracks[2][100]; // 99 tracks and 1 leadout track -} CDGameEntry; - -#define CDGE_FORMAT_AUDIO 0 -#define CDGE_FORMAT_DATA 1 - -#define CDGE_FLAG_ACCURATE_V810 0x01 -#define CDGE_FLAG_FXGA 0x02 - -static uint32 EmuFlags; - -static const CDGameEntry GameList[] = - { -#include "gamedb.inc" -}; - -static void Emulate(EmulateSpecStruct *espec) -{ - FXINPUT_Frame(); - - KING_StartFrame(fx_vdc_chips, espec); //espec->surface, &espec->DisplayRect, espec->LineWidths, espec->skip); - - v810_timestamp_t v810_timestamp; - v810_timestamp = PCFX_V810.Run(pcfx_event_handler); - - PCFX_FixNonEvents(); - - // Call before resetting v810_timestamp - ForceEventUpdates(v810_timestamp); - - // - // Call KING_EndFrame() before SoundBox_Flush(), otherwise CD-DA audio distortion will occur due to sound data being updated - // after it was needed instead of before. - // - KING_EndFrame(v810_timestamp); - - // - // new_base_ts is guaranteed to be <= v810_timestamp - // - v810_timestamp_t new_base_ts; - espec->SoundBufSize = SoundBox_Flush(v810_timestamp, &new_base_ts, espec->SoundBuf, espec->SoundBufMaxSize, false); - - KING_ResetTS(new_base_ts); - FXTIMER_ResetTS(new_base_ts); - FXINPUT_ResetTS(new_base_ts); - SoundBox_ResetTS(new_base_ts); - - // Call this AFTER all the EndFrame/Flush/ResetTS stuff - RebaseTS(v810_timestamp, new_base_ts); - - espec->MasterCycles = v810_timestamp - new_base_ts; - - PCFX_V810.ResetTS(new_base_ts); -} - -static void PCFX_Reset(void) -{ - const uint32 timestamp = PCFX_V810.v810_timestamp; - - //printf("Reset: %d\n", timestamp); - - // Make sure all devices are synched to current timestamp before calling their Reset()/Power()(though devices should already do this sort of thing on their - // own, but it's not implemented for all of them yet, and even if it was all implemented this is also INSURANCE). - ForceEventUpdates(timestamp); - - PCFX_Event_Reset(); - - RAM_LPA = 0; - - ExBusReset = 0; - BackupControl = 0; - - Last_VDC_AR[0] = 0; - Last_VDC_AR[1] = 0; - - memset(RAM, 0x00, 2048 * 1024); - - for (int i = 0; i < 2; i++) - { - int32 dummy_ne MDFN_NOWARN_UNUSED; - - dummy_ne = fx_vdc_chips[i]->Reset(); - } - - KING_Reset(timestamp); // SCSICD_Power() is called from KING_Reset() - SoundBox_Reset(timestamp); - RAINBOW_Reset(); - - if (WantHuC6273) - HuC6273_Reset(); - - PCFXIRQ_Reset(); - FXTIMER_Reset(); - PCFX_V810.Reset(); - - // Force device updates so we can get new next event timestamp values. - ForceEventUpdates(timestamp); -} - -static void PCFX_Power(void) -{ - PCFX_Reset(); -} - -static void VDCA_IRQHook(bool asserted) -{ - PCFXIRQ_Assert(PCFXIRQ_SOURCE_VDCA, asserted); -} - -static void VDCB_IRQHook(bool asserted) -{ - PCFXIRQ_Assert(PCFXIRQ_SOURCE_VDCB, asserted); -} - -static MDFN_COLD void LoadCommon(std::vector *CDInterfaces, const uint8_t *bios) -{ - V810_Emu_Mode cpu_mode; - - cpu_mode = (V810_Emu_Mode)Setting_CpuEmulation; - if (cpu_mode == _V810_EMU_MODE_COUNT) - { - cpu_mode = (EmuFlags & CDGE_FLAG_ACCURATE_V810) ? V810_EMU_MODE_ACCURATE : V810_EMU_MODE_FAST; - } - - if (EmuFlags & CDGE_FLAG_FXGA) - { - //WantHuC6273 = TRUE; - } - - MDFN_printf(_("V810 Emulation Mode: %s\n"), (cpu_mode == V810_EMU_MODE_ACCURATE) ? _("Accurate") : _("Fast")); - PCFX_V810.Init(cpu_mode, false); - - uint32 RAM_Map_Addresses[1] = {0x00000000}; - uint32 BIOSROM_Map_Addresses[1] = {0xFFF00000}; - - RAM = PCFX_V810.SetFastMap(RAM_Map_Addresses, 0x00200000, 1, _("RAM"), true); - BIOSROM = PCFX_V810.SetFastMap(BIOSROM_Map_Addresses, 0x00100000, 1, _("BIOS ROM"), false); - - memcpy(BIOSROM, bios, 1024 * 1024); - - /*{ - std::string fxscsi_path = MDFN_GetSettingS("pcfx.fxscsi"); // For developers only, so don't make it convenient. - - if (fxscsi_path != "0" && fxscsi_path != "" && fxscsi_path != "none") - { - FileStream FXSCSIFile(fxscsi_path, FileStream::MODE_READ); - uint32 FXSCSI_Map_Addresses[1] = {0x80780000}; - - FXSCSIROM = PCFX_V810.SetFastMap(FXSCSI_Map_Addresses, 0x0080000, 1, _("FX-SCSI ROM"), false); - - FXSCSIFile.read(FXSCSIROM, 1024 * 512); - } - }*/ - - for (int i = 0; i < 2; i++) - { - fx_vdc_chips[i] = new VDC(); - fx_vdc_chips[i]->SetUnlimitedSprites(Setting_NoSpriteLimit); - fx_vdc_chips[i]->SetVRAMSize(65536); - fx_vdc_chips[i]->SetWSHook(NULL); - fx_vdc_chips[i]->SetIRQHook(i ? VDCB_IRQHook : VDCA_IRQHook); - - //fx_vdc_chips[0] = FXVDC_Init(PCFXIRQ_SOURCE_VDCA, Setting_NoSpriteLimit); - //fx_vdc_chips[1] = FXVDC_Init(PCFXIRQ_SOURCE_VDCB, Setting_NoSpriteLimit); - } - - SoundBox_Init(Setting_AdpcmBuggy, Setting_AdpcmNoClicks); - RAINBOW_Init(Setting_ChromaInterpolate); - FXINPUT_Init(); - FXTIMER_Init(); - - if (WantHuC6273) - HuC6273_Init(); - - KING_Init(); - - SCSICD_SetDisc(true, NULL, true); - -#ifdef WANT_DEBUGGER - for (unsigned disc = 0; disc < CDInterfaces->size(); disc++) - { - CDUtility::TOC toc; - - (*CDInterfaces)[disc]->ReadTOC(&toc); - - for (int32 track = toc.first_track; track <= toc.last_track; track++) - { - if (toc.tracks[track].control & 0x4) - { - char tmpn[256], tmpln[256]; - uint32 sectors; - - trio_snprintf(tmpn, 256, "track%d-%d-%d", disc, track, toc.tracks[track].lba); - trio_snprintf(tmpln, 256, "CD - Disc %d/%d - Track %d/%d", disc + 1, (int)CDInterfaces->size(), track, toc.last_track - toc.first_track + 1); - - sectors = toc.tracks[(track == toc.last_track) ? 100 : track + 1].lba - toc.tracks[track].lba; - ASpace_Add(PCFXDBG_GetAddressSpaceBytes, PCFXDBG_PutAddressSpaceBytes, tmpn, tmpln, 0, sectors * 2048); - } - } - } -#endif - - // MDFNGameInfo->fps = (uint32)((double)7159090.90909090 / 455 / 263 * 65536 * 256); - - //BackupSignalDirty = false; - //BackupSaveDelay = 0; - - // Initialize backup RAM - memset(BackupRAM, 0, sizeof(BackupRAM)); - memset(ExBackupRAM, 0, sizeof(ExBackupRAM)); - - static const uint8 BRInit00[] = {0x24, 0x8A, 0xDF, 0x50, 0x43, 0x46, 0x58, 0x53, 0x72, 0x61, 0x6D, 0x80, - 0x00, 0x01, 0x01, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0xF9, 0x03, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}; - static const uint8 BRInit80[] = {0xF9, 0xFF, 0xFF}; - - memcpy(BackupRAM + 0x00, BRInit00, sizeof(BRInit00)); - memcpy(BackupRAM + 0x80, BRInit80, sizeof(BRInit80)); - - static const uint8 ExBRInit00[] = {0x24, 0x8A, 0xDF, 0x50, 0x43, 0x46, 0x58, 0x43, 0x61, 0x72, 0x64, 0x80, - 0x00, 0x01, 0x01, 0x00, 0x01, 0x40, 0x00, 0x00, 0x01, 0xF9, 0x03, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00}; - static const uint8 ExBRInit80[] = {0xF9, 0xFF, 0xFF}; - - memcpy(ExBackupRAM + 0x00, ExBRInit00, sizeof(ExBRInit00)); - memcpy(ExBackupRAM + 0x80, ExBRInit80, sizeof(ExBRInit80)); - - // Default to 16-bit bus. - for (int i = 0; i < 256; i++) - { - PCFX_V810.SetMemReadBus32(i, FALSE); - PCFX_V810.SetMemWriteBus32(i, FALSE); - } - - // 16MiB RAM area. - PCFX_V810.SetMemReadBus32(0, TRUE); - PCFX_V810.SetMemWriteBus32(0, TRUE); - - // Bitstring read range - for (int i = 0xA0; i <= 0xAF; i++) - { - PCFX_V810.SetMemReadBus32(i, FALSE); // Reads to the read range are 16-bit, and - PCFX_V810.SetMemWriteBus32(i, TRUE); // writes are 32-bit. - } - - // Bitstring write range - for (int i = 0xB0; i <= 0xBF; i++) - { - PCFX_V810.SetMemReadBus32(i, TRUE); // Reads to the write range are 32-bit, - PCFX_V810.SetMemWriteBus32(i, FALSE); // but writes are 16-bit! - } - - // BIOS area - for (int i = 0xF0; i <= 0xFF; i++) - { - PCFX_V810.SetMemReadBus32(i, FALSE); - PCFX_V810.SetMemWriteBus32(i, FALSE); - } - - PCFX_V810.SetMemReadHandlers(mem_rbyte, mem_rhword, mem_rword); - PCFX_V810.SetMemWriteHandlers(mem_wbyte, mem_whword, mem_wword); - - PCFX_V810.SetIOReadHandlers(port_rbyte, port_rhword, NULL); - PCFX_V810.SetIOWriteHandlers(port_wbyte, port_whword, NULL); -} - -static void DoMD5CDVoodoo(std::vector *CDInterfaces) -{ - const CDGameEntry *found_entry = NULL; - CDUtility::TOC toc; - -#if 0 - puts("{"); - puts(" ,"); - puts(" ,"); - puts(" 0,"); - puts(" 1,"); - puts(" {"); - puts(" {"); - - for(int i = CDIF_GetFirstTrack(); i <= CDIF_GetLastTrack(); i++) - { - CDIF_Track_Format tf; - - CDIF_GetTrackFormat(i, tf); - - printf(" { %d, %s, %d },\n", i, (tf == CDIF_FORMAT_AUDIO) ? "CDIF_FORMAT_AUDIO" : "CDIF_FORMAT_MODE1", CDIF_GetTrackStartPositionLBA(i)); - } - printf(" { -1, (CDIF_Track_Format)-1, %d },\n", CDIF_GetSectorCountLBA()); - puts(" }"); - puts(" }"); - puts("},"); - //exit(1); -#endif - - for (unsigned if_disc = 0; if_disc < CDInterfaces->size(); if_disc++) - { - (*CDInterfaces)[if_disc]->ReadTOC(&toc); - - if (toc.first_track == 1) - { - for (unsigned int g = 0; g < sizeof(GameList) / sizeof(CDGameEntry); g++) - { - const CDGameEntry *entry = &GameList[g]; - - assert(entry->discs == 1 || entry->discs == 2); - - for (unsigned int disc = 0; disc < entry->discs; disc++) - { - const CDGameEntryTrack *et = entry->tracks[disc]; - bool GameFound = TRUE; - - while (et->tracknum != -1 && GameFound) - { - assert(et->tracknum > 0 && et->tracknum < 100); - - if (toc.tracks[et->tracknum].lba != et->lba) - GameFound = FALSE; - - if (((et->format == CDGE_FORMAT_DATA) ? 0x4 : 0x0) != (toc.tracks[et->tracknum].control & 0x4)) - GameFound = FALSE; - - et++; - } - - if (et->tracknum == -1) - { - if ((et - 1)->tracknum != toc.last_track) - GameFound = FALSE; - - if (et->lba != toc.tracks[100].lba) - GameFound = FALSE; - } - - if (GameFound) - { - found_entry = entry; - goto FoundIt; - } - } // End disc count loop - } - } - - FoundIt:; - - if (found_entry) - { - EmuFlags = found_entry->flags; - - printf("%s\n", found_entry->name); - printf("%s\n", found_entry->name_original); - break; - } - } // end: for(unsigned if_disc = 0; if_disc < CDInterfaces->size(); if_disc++) -} - -// PC-FX BIOS will look at all data tracks(not just the first one), in contrast to the PCE CD BIOS, which only looks -// at the first data track. -static bool TestMagicCD(std::vector *CDInterfaces) -{ - CDIF *cdiface = (*CDInterfaces)[0]; - CDUtility::TOC toc; - uint8 sector_buffer[2048]; - - memset(sector_buffer, 0, sizeof(sector_buffer)); - - cdiface->ReadTOC(&toc); - - for (int32 track = toc.first_track; track <= toc.last_track; track++) - { - if (toc.tracks[track].control & 0x4) - { - cdiface->ReadSector(sector_buffer, toc.tracks[track].lba, 1); - if (!strncmp("PC-FX:Hu_CD-ROM", (char *)sector_buffer, strlen("PC-FX:Hu_CD-ROM"))) - { - return (TRUE); - } - - if (!strncmp((char *)sector_buffer + 64, "PPPPHHHHOOOOTTTTOOOO____CCCCDDDD", 32)) - return (true); - } - } - return (FALSE); -} - -static MDFN_COLD void LoadCD(std::vector *CDInterfaces, const uint8_t *bios) -{ - EmuFlags = 0; - - cdifs = CDInterfaces; - - DoMD5CDVoodoo(CDInterfaces); - - LoadCommon(CDInterfaces, bios); - - MDFN_printf(_("Emulated CD-ROM drive speed: %ux\n"), (unsigned int)Setting_CdSpeed); - - PCFX_Power(); -} -} - -using namespace MDFN_IEN_PCFX; - -#define EXPORT extern "C" ECL_EXPORT - -struct FrontendTOC -{ - int32 FirstTrack; - int32 LastTrack; - int32 DiskType; - struct - { - int32 Adr; - int32 Control; - int32 Lba; - int32 Valid; - } Tracks[101]; -}; - -static void (*ReadTOCCallback)(int disk, FrontendTOC *dest); -static void (*ReadSector2448Callback)(int disk, int lba, uint8 *dest); - -EXPORT void SetCDCallbacks(void (*toccallback)(int disk, FrontendTOC *dest), void (*sectorcallback)(int disk, int lba, uint8 *dest)) -{ - ReadTOCCallback = toccallback; - ReadSector2448Callback = sectorcallback; -} - -class MyCDIF : public CDIF -{ - private: - int disk; - - public: - MyCDIF(int disk) : disk(disk) - { - FrontendTOC t; - ReadTOCCallback(disk, &t); - disc_toc.first_track = t.FirstTrack; - disc_toc.last_track = t.LastTrack; - disc_toc.disc_type = t.DiskType; - for (int i = 0; i < 101; i++) - { - disc_toc.tracks[i].adr = t.Tracks[i].Adr; - disc_toc.tracks[i].control = t.Tracks[i].Control; - disc_toc.tracks[i].lba = t.Tracks[i].Lba; - disc_toc.tracks[i].valid = t.Tracks[i].Valid; - } - } - - virtual void HintReadSector(int32 lba) {} - virtual bool ReadRawSector(uint8 *buf, int32 lba) - { - ReadSector2448Callback(disk, lba, buf); - return true; - } -}; - -static std::vector CDInterfaces; -static uint32_t InputData[8]; - -struct MyFrameInfo : public FrameInfo -{ - uint32_t Buttons[3]; // port 1, port 2, console -}; -static EmulateSpecStruct Ess; -static int32_t LineWidths[480]; -ECL_INVISIBLE static uint32_t FrameBuffer[1024 * 480]; - -EXPORT bool Init(int numDisks, const uint8_t *bios) -{ - for (int i = 0; i < numDisks; i++) - CDInterfaces.push_back(new MyCDIF(i)); - - if (!TestMagicCD(&CDInterfaces)) - return false; - - LoadCD(&CDInterfaces, bios); - KING_SetPixelFormat(); - SoundBox_SetSoundRate(44100); - SCSICD_SetDisc(false, CDInterfaces[0]); - // multitap is experimental emulation for a never release peripheral, so let's ignore it for now - FXINPUT_SetMultitap(false, false); - for (int i = 0; i < 2; i++) - FXINPUT_SetInput(i, Setting_PortDevice[i], &InputData[i]); // FXIT_GAMEPAD - - PCFX_Power(); - Ess.pixels = FrameBuffer; - Ess.pitch32 = 1024; - Ess.LineWidths = LineWidths; - Ess.SoundBufMaxSize = 2048; - - return true; -} - -static int ActiveDisk; -static uint32_t PrevConsoleButtons; - -static void Blit(MyFrameInfo &f) -{ - // two widths to deal with: 256 and "341" (which can be 256, 341, or 1024 wide depending on settings) - // two heights: 240 and 480, but watch out for scanlinestart / scanline end - - // in pixel pro mode, 341 width is forced to 1024. we upsize 256 to 1024 as well, and double 240 tall - - const uint32_t *src = FrameBuffer; - uint32_t *dst = f.VideoBuffer; - const int srcp = 1024; - src += Ess.y * srcp; - - if (Setting_PixelPro) - { - f.Width = 1024; - f.Height = Ess.h; - - const int dstp = 1024; - - if (Ess.h > 240) // interlace - { - if (Ess.w == 256) - { - for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp) - { - for (int i = 0; i < 256; i++) - { - auto c = src[i]; - dst[i * 4 + 0] = c; - dst[i * 4 + 1] = c; - dst[i * 4 + 2] = c; - dst[i * 4 + 3] = c; - } - } - } - else - { - for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp) - { - memcpy(dst, src, LineWidths[j + Ess.y] * sizeof(uint32_t)); - } - } - } - else // progressive: line double - { - f.Height *= 2; - if (Ess.w == 256) - { - for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp * 2) - { - for (int i = 0; i < 256; i++) - { - auto c = src[i]; - dst[i * 4 + 0] = c; - dst[i * 4 + 1] = c; - dst[i * 4 + 2] = c; - dst[i * 4 + 3] = c; - } - memcpy(dst + dstp, dst, 4096); - } - } - else - { - for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp * 2) - { - memcpy(dst, src, 4096); - memcpy(dst + dstp, src, 4096); - } - } - } - } - else - { - f.Width = Ess.w; - f.Height = Ess.h; - - const int dstp = Ess.w; - for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp) - { - memcpy(dst, src, LineWidths[j + Ess.y] * sizeof(uint32_t)); - } - } -} - -EXPORT void FrameAdvance(MyFrameInfo &f) -{ - for (int i = 0; i < 2; i++) - InputData[i] = f.Buttons[i]; - Lagged = true; - uint32_t ConsoleButtons = f.Buttons[2]; - int NewActiveDisk = ActiveDisk; -#define ROSE(n) ((ConsoleButtons & 1 << (n)) > (PrevConsoleButtons & 1 << (n))) - if (ROSE(0)) - PCFX_Power(); - if (ROSE(1)) - PCFX_Reset(); - if (ROSE(2)) - NewActiveDisk--; - if (ROSE(3)) - NewActiveDisk++; -#undef ROSE - NewActiveDisk = std::max(NewActiveDisk, -1); - NewActiveDisk = std::min(NewActiveDisk, CDInterfaces.size() - 1); - if (NewActiveDisk != ActiveDisk) - SCSICD_SetDisc(NewActiveDisk == -1, NewActiveDisk == -1 ? nullptr : CDInterfaces[NewActiveDisk]); - ActiveDisk = NewActiveDisk; - PrevConsoleButtons = ConsoleButtons; - - Ess.SoundBuf = f.SoundBuffer; - Emulate(&Ess); - f.Cycles = Ess.MasterCycles; - f.Samples = Ess.SoundBufSize; - f.Lagged = Lagged; - - Blit(f); -} - -EXPORT void GetMemoryAreas(MemoryArea *m) -{ - m[0].Data = BackupRAM; - m[0].Name = "Backup RAM"; - m[0].Size = sizeof(BackupRAM); - m[0].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE4 | MEMORYAREA_FLAGS_SAVERAMMABLE; - - m[1].Data = ExBackupRAM; - m[1].Name = "Extra Backup RAM"; - m[1].Size = sizeof(ExBackupRAM); - m[1].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE4 | MEMORYAREA_FLAGS_SAVERAMMABLE; - - m[2].Data = BIOSROM; - m[2].Name = "BIOS ROM"; - m[2].Size = 1024 * 1024; - m[2].Flags = MEMORYAREA_FLAGS_WORDSIZE4; - - m[3].Data = RAM; - m[3].Name = "Main RAM"; - m[3].Size = 2 * 1024 * 1024; - m[3].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE4 | MEMORYAREA_FLAGS_PRIMARY; - - // m[4].Data = FXSCSIROM; - // m[4].Name = "Scsi Rom"; - // m[4].Size = 512 * 1024; - // m[4].Flags = MEMORYAREA_FLAGS_WORDSIZE4; - - for (int i = 0; i < 2; i++) - { - m[i + 5].Data = fx_vdc_chips[i]->GetVramPointer(); - m[i + 5].Name = i == 0 ? "VDC A VRAM" : "VDC B VRAM"; - m[i + 5].Size = fx_vdc_chips[i]->GetVramByteSize(); - m[i + 5].Flags = MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE2; - } -} - -EXPORT void EnableLayers(int mask) -{ - // BG0 = 0 - // BG1 - // BG2 - // BG3 - // VDC-A BG - // VDC-A SPR - // VDC-B BG - // VDC-B SPR - // RAINBOW - KING_SetLayerEnableMask(mask); -} - -EXPORT void SetInputCallback(void (*callback)()) -{ - InputCallback = callback; -} - -// settings -ECL_SEALED int Setting_HighDotclockWidth = 341; -ECL_SEALED int Setting_CdSpeed = 2; -ECL_SEALED int Setting_SlStart = 4; -ECL_SEALED int Setting_SlEnd = 235; - -ECL_SEALED double Setting_ResampRateError = 0.0000009; -ECL_SEALED int Setting_ResampQuality = 3; - -ECL_SEALED int Setting_CpuEmulation = 2; // 0 = fast, 1 = accurate, 2 = auto -ECL_SEALED bool Setting_NoSpriteLimit; -ECL_SEALED bool Setting_AdpcmBuggy = false; -ECL_SEALED bool Setting_AdpcmNoClicks = true; -ECL_SEALED bool Setting_ChromaInterpolate = false; - -ECL_SEALED int Setting_PortDevice[2]; - -ECL_SEALED bool Setting_PixelPro; - -struct FrontendSettings -{ - int32_t AdpcmEmulateBuggyCodec; - int32_t AdpcmSuppressChannelResetClicks; - int32_t HiResEmulation; - int32_t DisableSpriteLimit; - int32_t ChromaInterpolation; - int32_t ScanlineStart; - int32_t ScanlineEnd; - int32_t CdSpeed; - int32_t CpuEmulation; - int32_t Port1; - int32_t Port2; - int32_t PixelPro; -}; - -EXPORT void PutSettingsBeforeInit(const FrontendSettings &s) -{ - Setting_AdpcmBuggy = s.AdpcmEmulateBuggyCodec; - Setting_AdpcmNoClicks = s.AdpcmSuppressChannelResetClicks; - Setting_HighDotclockWidth = s.PixelPro ? 1024 : s.HiResEmulation; - Setting_NoSpriteLimit = s.DisableSpriteLimit; - Setting_ChromaInterpolate = s.ChromaInterpolation; - Setting_SlStart = s.ScanlineStart; - Setting_SlEnd = s.ScanlineEnd; - Setting_CdSpeed = s.CdSpeed; - Setting_CpuEmulation = s.CpuEmulation; - Setting_PortDevice[0] = s.Port1; - Setting_PortDevice[1] = s.Port2; - Setting_PixelPro = s.PixelPro; -} - -/*MDFNGI EmulatedPCFX = - { - FXINPUT_SetInput, - SetMedia, - DoSimpleCommand, - NULL, - PCFXSettings, - MDFN_MASTERCLOCK_FIXED(PCFX_MASTER_CLOCK), - 0, - TRUE, // Multires possible? - - 288, // Nominal width - 240, // Nominal height - - 1024, // Framebuffer width - 512, // Framebuffer height - -};*/ - -int main() -{ - return 0; -} diff --git a/waterbox/pcfx/pcfx.h b/waterbox/pcfx/pcfx.h deleted file mode 100644 index 4a67c84313..0000000000 --- a/waterbox/pcfx/pcfx.h +++ /dev/null @@ -1,67 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* pcfx.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __PCFX_PCFX_H -#define __PCFX_PCFX_H - -#include "defs.h" - -#include "v810/v810_cpu.h" -#include "huc6270/vdc.h" - -namespace MDFN_IEN_PCFX -{ - -#define PCFX_MASTER_CLOCK 21477272.72 - -#if 0 - #define FXDBG(format, ...) MDFN_DebugPrint(format, ## __VA_ARGS__) -#else - #define FXDBG(format, ...) ((void)0) -#endif - -extern V810 PCFX_V810; - -uint8 MDFN_FASTCALL mem_peekbyte(const v810_timestamp_t timestamp, const uint32 A); -uint16 MDFN_FASTCALL mem_peekhword(const v810_timestamp_t timestamp, const uint32 A); - -int32 MDFN_FASTCALL pcfx_event_handler(const v810_timestamp_t timestamp); - -extern VDC *fx_vdc_chips[2]; - -#define REGSETHW(_reg, _data, _msh) { _reg &= 0xFFFF << (_msh ? 0 : 16); _reg |= _data << (_msh ? 16 : 0); } -#define REGGETHW(_reg, _msh) ((_reg >> (_msh ? 16 : 0)) & 0xFFFF) - -enum -{ - PCFX_EVENT_PAD = 0, - PCFX_EVENT_TIMER, - PCFX_EVENT_KING, - PCFX_EVENT_ADPCM -}; - -#define PCFX_EVENT_NONONO 0x7fffffff - -void PCFX_SetEvent(const int type, const v810_timestamp_t next_timestamp); - -} - -#endif diff --git a/waterbox/pcfx/rainbow.cpp b/waterbox/pcfx/rainbow.cpp deleted file mode 100644 index 5a887d0ecf..0000000000 --- a/waterbox/pcfx/rainbow.cpp +++ /dev/null @@ -1,819 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* rainbow.cpp: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* -** MJPEG-like decoder based on the algorithm and Huffman data tables provided by David Michel -** of MagicEngine and MagicEngine-FX. -*/ - -#include "pcfx.h" -#include "rainbow.h" -#include "king.h" -#include "interrupt.h" -#include "jrevdct.h" - -namespace MDFN_IEN_PCFX -{ - -static bool ChromaIP; // Bilinearly interpolate chroma channel - -/* Y = luminance/luma, UV = chrominance/chroma */ - -struct HuffmanQuickLUTPair -{ - uint8 val; - uint8 bitc; // Bit count for the code. -}; - -static const uint8 zigzag[63] = - { - 0x01, 0x08, 0x10, 0x09, 0x02, 0x03, 0x0A, 0x11, - 0x18, 0x20, 0x19, 0x12, 0x0B, 0x04, 0x05, 0x0C, - 0x13, 0x1A, 0x21, 0x28, 0x30, 0x29, 0x22, 0x1B, - 0x14, 0x0D, 0x06, 0x07, 0x0E, 0x15, 0x1C, 0x23, - 0x2A, 0x31, 0x38, 0x39, 0x32, 0x2B, 0x24, 0x1D, - 0x16, 0x0F, 0x17, 0x1E, 0x25, 0x2C, 0x33, 0x3A, - 0x3B, 0x34, 0x2D, 0x26, 0x1F, 0x27, 0x2E, 0x35, - 0x3C, 0x3D, 0x36, 0x2F, 0x37, 0x3E, 0x3F}; - -static const HuffmanQuickLUTPair ac_y_qlut[1 << 12] = - { -#include "rainbow_acy.inc" -}; - -static const HuffmanQuickLUTPair ac_uv_qlut[1 << 12] = - { -#include "rainbow_acuv.inc" -}; - -static const HuffmanQuickLUTPair dc_y_qlut[1 << 9] = - { -#include "rainbow_dcy.inc" -}; - -static const HuffmanQuickLUTPair dc_uv_qlut[1 << 8] = - { -#include "rainbow_dcuv.inc" -}; - -static uint8 *DecodeBuffer[2] = {NULL, NULL}; -static int32 DecodeFormat[2]; // The format each buffer is in(-1 = invalid, 0 = palettized 8-bit, 1 = YUV) -static uint32 QuantTables[2][64], QuantTablesBase[2][64]; // 0 = Y, 1 = UV - -static uint32 DecodeBufferWhichRead; - -static int32 RasterReadPos; -static uint16 Control; -static uint16 NullRunY, NullRunU, NullRunV, HSync; -static uint16 HScroll; - -static uint32 bits_buffer; -static uint32 bits_buffered_bits; -static int32 bits_bytes_left; - -static void InitBits(int32 bcount) -{ - bits_bytes_left = bcount; - bits_buffer = 0; - bits_buffered_bits = 0; -} - -static INLINE uint8 FetchWidgywabbit(void) -{ - if (bits_bytes_left <= 0) - return (0); - - uint8 ret = KING_RB_Fetch(); - if (ret == 0xFF) - KING_RB_Fetch(); - - bits_bytes_left--; - - return (ret); -} - -enum -{ - MDFNBITS_PEEK = 1, - MDFNBITS_FUNNYSIGN = 2, -}; - -static INLINE uint32 GetBits(const unsigned int count, const unsigned int how = 0) -{ - uint32 ret; - - while (bits_buffered_bits < count) - { - bits_buffer <<= 8; - bits_buffer |= FetchWidgywabbit(); - bits_buffered_bits += 8; - } - - ret = (bits_buffer >> (bits_buffered_bits - count)) & ((1 << count) - 1); - - if (!(how & MDFNBITS_PEEK)) - bits_buffered_bits -= count; - - if ((how & MDFNBITS_FUNNYSIGN) && count) - { - if (ret < (1U << (count - 1))) - ret += 1 - (1 << count); - } - - return (ret); -} - -// Note: SkipBits is intended to be called right after GetBits() with "how" MDFNBITS_PEEK, -// and the count pass to SkipBits must be less than or equal to the count passed to GetBits(). -static INLINE void SkipBits(const unsigned int count) -{ - bits_buffered_bits -= count; -} - -static uint32 HappyColor; // Cached, calculated from null run yuv registers; -static void CalcHappyColor(void) -{ - uint8 y_c = (int16)NullRunY + 0x80; - uint8 u_c = (int16)NullRunU + 0x80; - uint8 v_c = (int16)NullRunV + 0x80; - - HappyColor = (y_c << 16) | (u_c << 8) | (v_c << 0); -} - -static uint32 get_ac_coeff(const HuffmanQuickLUTPair *table, int32 *zeroes) -{ - unsigned int numbits; - uint32 rawbits; - uint32 code; - - rawbits = GetBits(12, MDFNBITS_PEEK); - code = table[rawbits].val; - SkipBits(table[rawbits].bitc); - - numbits = code & 0xF; - *zeroes = code >> 4; - - return (GetBits(numbits, MDFNBITS_FUNNYSIGN)); -} - -static uint32 get_dc_coeff(const HuffmanQuickLUTPair *table, int32 *zeroes, int maxbits) -{ - uint32 code; - - for (;;) - { - uint32 rawbits; - - rawbits = GetBits(maxbits, MDFNBITS_PEEK); - code = table[rawbits].val; - SkipBits(table[rawbits].bitc); - - if (code < 0xF) - { - *zeroes = 0; - return (GetBits(code, MDFNBITS_FUNNYSIGN)); - } - else if (code == 0xF) - { - get_ac_coeff(ac_y_qlut, zeroes); - (*zeroes)++; - return (0); - } - else if (code >= 0x10) - { - code -= 0x10; - - for (int i = 0; i < 64; i++) - { - // Y - uint32 coeff = (QuantTablesBase[0][i] * code) >> 2; - - if (coeff < 1) - coeff = 1; - else if (coeff > 0xFE) - coeff = 0xFE; - - QuantTables[0][i] = coeff; - - // UV - if (i) - coeff = (QuantTablesBase[1][i] * code) >> 2; - else - coeff = (QuantTablesBase[1][i]) >> 2; - - if (coeff < 1) - coeff = 1; - else if (coeff > 0xFE) - coeff = 0xFE; - - QuantTables[1][i] = coeff; - } - } - } -} - -static INLINE uint32 get_dc_y_coeff(int32 *zeroes) -{ - return (get_dc_coeff(dc_y_qlut, zeroes, 9)); -} - -static uint32 get_dc_uv_coeff(void) -{ - const HuffmanQuickLUTPair *table = dc_uv_qlut; - uint32 code; - uint32 rawbits = GetBits(8, MDFNBITS_PEEK); - - code = table[rawbits].val; - SkipBits(table[rawbits].bitc); - - return (GetBits(code, MDFNBITS_FUNNYSIGN)); -} - -static void decode(int32 *dct, const uint32 *QuantTable, const int32 dc, const HuffmanQuickLUTPair *table) -{ - int32 coeff; - int zeroes; - int count; - int index; - - dct[0] = (int16)(QuantTable[0] * dc); - count = 0; - - do - { - coeff = get_ac_coeff(table, &zeroes); - if (!coeff) - { - if (!zeroes) - { - while (count < 63) - { - dct[zigzag[count++]] = 0; - } - break; - } - else if (zeroes == 1) - zeroes = 0xF; - } - - while (zeroes-- && count < 63) - { - dct[zigzag[count++]] = 0; - } - zeroes = 0; - if (count < 63) - { - index = zigzag[count++]; - dct[index] = (int16)(QuantTable[index] * coeff); - } - } while (count < 63); -} - -#ifdef WANT_DEBUGGER -uint32 RAINBOW_GetRegister(const unsigned int id, char *special, const uint32 special_len) -{ - uint32 value = 0xDEADBEEF; - - if (id == RAINBOW_GSREG_RSCRLL) - value = HScroll; - else if (id == RAINBOW_GSREG_RCTRL) - value = Control; - else if (id == RAINBOW_GSREG_RNRY) - value = NullRunY; - else if (id == RAINBOW_GSREG_RNRU) - value = NullRunU; - else if (id == RAINBOW_GSREG_RNRV) - value = NullRunV; - else if (id == RAINBOW_GSREG_RHSYNC) - value = HSync; - - return (value); -} - -void RAINBOW_SetRegister(const unsigned int id, uint32 value) -{ - if (id == RAINBOW_GSREG_RSCRLL) - HScroll = value & 0x1FF; - else if (id == RAINBOW_GSREG_RCTRL) - Control = value; - else if (id == RAINBOW_GSREG_RNRY) - NullRunY = value; - else if (id == RAINBOW_GSREG_RNRU) - NullRunU = value; - else if (id == RAINBOW_GSREG_RNRV) - NullRunV = value; -} -#endif - -static uint32 LastLine[256]; -static bool FirstDecode; -static bool GarbageData; - -void RAINBOW_Init(bool arg_ChromaIP) -{ - ChromaIP = arg_ChromaIP; - - for (int i = 0; i < 2; i++) - { - DecodeBuffer[i] = new uint8[0x2000 * 4]; - memset(DecodeBuffer[i], 0, 0x2000 * 4); - } - - DecodeFormat[0] = DecodeFormat[1] = -1; - DecodeBufferWhichRead = 0; - GarbageData = FALSE; - FirstDecode = TRUE; - RasterReadPos = 0; -} - -// RAINBOW base I/O port address: 0x200 - -#define REGSETBOFW(_reg, _data, _wb) \ - { \ - (_reg) &= ~(0xFF << ((_wb)*8)); \ - (_reg) |= (_data) << ((_wb)*8); \ - } -#define REGSETBOFH REGSETBOFW - -// The horizontal scroll register is set up kind of weird...D0-D7 of writes to $200 set the lower byte, D0-D7 of writes to $202 set the upper byte - -void RAINBOW_Write8(uint32 A, uint8 V) -{ - //printf("RAINBOW Wr8: %08x %02x\n", A, V); - switch (A & 0x1C) - { - case 0x00: - REGSETBOFH(HScroll, V, (A & 0x2) >> 1); - HScroll &= 0x1FF; - break; - case 0x04: - REGSETBOFH(Control, V, A & 0x3); - break; - case 0x08: - REGSETBOFH(NullRunY, V, A & 0x3); - CalcHappyColor(); - break; - case 0x0C: - REGSETBOFH(NullRunU, V, A & 0x3); - CalcHappyColor(); - break; - case 0x10: - REGSETBOFH(NullRunV, V, A & 0x3); - CalcHappyColor(); - break; - case 0x14: - REGSETBOFH(HSync, V, A & 0x3); - break; - } -} - -void RAINBOW_Write16(uint32 A, uint16 V) -{ - int msh = A & 0x2; - - //printf("RAINBOW Wr16: %08x %04x\n", A, V); - switch (A & 0x1C) - { - case 0x00: - REGSETBOFH(HScroll, V & 0xFF, (A & 0x2) >> 1); - HScroll &= 0x1FF; - break; - case 0x04: - REGSETHW(Control, V, msh); - break; - case 0x08: - REGSETHW(NullRunY, V, msh); - CalcHappyColor(); - break; - case 0x0C: - REGSETHW(NullRunU, V, msh); - CalcHappyColor(); - break; - case 0x10: - REGSETHW(NullRunV, V, msh); - CalcHappyColor(); - break; - case 0x14: - REGSETHW(HSync, V, msh); - break; - } -} - -void RAINBOW_ForceTransferReset(void) -{ - RasterReadPos = 0; - DecodeFormat[0] = DecodeFormat[1] = -1; -} - -void RAINBOW_SwapBuffers(void) -{ - DecodeBufferWhichRead ^= 1; - RasterReadPos = 0; -} - -void RAINBOW_DecodeBlock(bool arg_FirstDecode, bool Skip) -{ - uint8 block_type; - int32 block_size; - int icount; - int which_buffer = DecodeBufferWhichRead ^ 1; - - if (!(Control & 0x01)) - { - puts("Rainbow decode when disabled!!"); - return; - } - - if (arg_FirstDecode) - { - FirstDecode = TRUE; - GarbageData = FALSE; - } - - if (GarbageData) - icount = 0; - else - icount = 0x200; - - do - { - do - { - while (KING_RB_Fetch() != 0xFF && icount > 0) - icount--; - - block_type = KING_RB_Fetch(); - //if(icount > 0 && block_type != 0xF0 && block_type != 0xF1 && block_type != 0xF2 && block_type != 0xF3 && block_type != 0xF8 && block_type != 0xFF) - //if(icount > 0 && block_type == 0x11) - // printf("%02x\n", block_type); - icount--; - } while (block_type != 0xF0 && block_type != 0xF1 && block_type != 0xF2 && block_type != 0xF3 && block_type != 0xF8 && block_type != 0xFF && icount > 0); - - { - uint16 tmp; - - tmp = KING_RB_Fetch() << 8; - tmp |= KING_RB_Fetch() << 0; - - block_size = (int16)tmp; - } - - block_size -= 2; - if (block_type == 0xFF && block_size <= 0) - for (int i = 0; i < 128; i++, icount--) - KING_RB_Fetch(); - - //fprintf(stderr, "Block: %d\n", block_size); - } while (block_size <= 0 && icount > 0); - - //if(!GarbageData && icount < 500) - //{ - // FXDBG("Partial garbage data. %d", icount); - //} - - //printf("%d\n", icount); - if (icount <= 0) - { - FXDBG("Garbage data."); - GarbageData = TRUE; - //printf("Dooom: %d\n"); - DecodeFormat[which_buffer] = 0; - memset(DecodeBuffer[which_buffer], 0, 0x2000); - goto BufferNoDecode; - } - - if (block_type == 0xf8 || block_type == 0xff) - DecodeFormat[which_buffer] = 1; - else - DecodeFormat[which_buffer] = 0; - - if (block_type == 0xF8 || block_type == 0xFF) - { - if (block_type == 0xFF) - { - for (int q = 0; q < 2; q++) - for (int i = 0; i < 64; i++) - { - uint8 meow = KING_RB_Fetch(); - - QuantTables[q][i] = meow; - QuantTablesBase[q][i] = meow; - } - block_size -= 128; - } - - InitBits(block_size); - - int32 dc_y = 0, dc_u = 0, dc_v = 0; - uint32 *dest_base = (uint32 *)DecodeBuffer[which_buffer]; - for (int column = 0; column < 16; column++) - { - uint32 *dest_base_column = &dest_base[column * 16]; - int zeroes = 0; - - dc_y += get_dc_y_coeff(&zeroes); - - if (zeroes) // If set, clear the number of columns - { - do - { - if (column < 16) - { - dest_base_column = &dest_base[column * 16]; - - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) - dest_base_column[y * 256 + x] = HappyColor; - } - column++; - zeroes--; - } while (zeroes); - column--; // Fix for the column autoincrement in the while(zeroes) loop - dc_y = dc_u = dc_v = 0; - } - else - { - int32 dct_y[256]; - int32 dct_u[64]; - int32 dct_v[64]; - - // Y/Luma, 16x16 components - // --------- - // | A | C | - // |-------| - // | B | D | - // --------- - // A (0, 0) - decode(&dct_y[0x00], QuantTables[0], dc_y, ac_y_qlut); - - // B (0, 1) - dc_y += get_dc_y_coeff(&zeroes); - decode(&dct_y[0x40], QuantTables[0], dc_y, ac_y_qlut); - - // C (1, 0) - dc_y += get_dc_y_coeff(&zeroes); - decode(&dct_y[0x80], QuantTables[0], dc_y, ac_y_qlut); - - // D (1, 1) - dc_y += get_dc_y_coeff(&zeroes); - decode(&dct_y[0xC0], QuantTables[0], dc_y, ac_y_qlut); - - // U, 8x8 components - dc_u += get_dc_uv_coeff(); - decode(&dct_u[0x00], QuantTables[1], dc_u, ac_uv_qlut); - - // V, 8x8 components - dc_v += get_dc_uv_coeff(); - decode(&dct_v[0x00], QuantTables[1], dc_v, ac_uv_qlut); - - if (Skip) - continue; - - j_rev_dct(&dct_y[0x00]); - j_rev_dct(&dct_y[0x40]); - j_rev_dct(&dct_y[0x80]); - j_rev_dct(&dct_y[0xC0]); - j_rev_dct(&dct_u[0x00]); - j_rev_dct(&dct_v[0x00]); - - for (int y = 0; y < 16; y++) - for (int x = 0; x < 16; x++) - dest_base_column[y * 256 + x] = clamp_to_u8(dct_y[y * 8 + (x & 0x7) + ((x & 0x8) << 4)] + 0x80) << 16; - - if (!ChromaIP) - { - for (int y = 0; y < 8; y++) - { - for (int x = 0; x < 8; x++) - { - uint32 component_uv = (clamp_to_u8(dct_u[y * 8 + x] + 0x80) << 8) | clamp_to_u8(dct_v[y * 8 + x] + 0x80); - dest_base_column[y * 512 + (256 * 0) + x * 2 + 0] |= component_uv; - dest_base_column[y * 512 + (256 * 0) + x * 2 + 1] |= component_uv; - dest_base_column[y * 512 + (256 * 1) + x * 2 + 0] |= component_uv; - dest_base_column[y * 512 + (256 * 1) + x * 2 + 1] |= component_uv; - } - } - } - else - { - for (int y = 0; y < 8; y++) - { - for (int x = 0; x < 8; x++) - { - uint32 component_uv = (clamp_to_u8(dct_u[y * 8 + x] + 0x80) << 8) | clamp_to_u8(dct_v[y * 8 + x] + 0x80); - dest_base_column[y * 512 + (256 * 1) + x * 2 + 0] |= component_uv; - } - } - } - } - } - - // Do bilinear interpolation on the chroma channels: - if (!Skip && ChromaIP) - { - for (int y = 0; y < 16; y += 2) - { - uint32 *linebase = &dest_base[y * 256]; - uint32 *linebase1 = &dest_base[(y + 1) * 256]; - - for (int x = 0; x < 254; x += 2) - { - unsigned int u, v; - - u = (((linebase1[x] >> 8) & 0xFF) + ((linebase1[x + 2] >> 8) & 0xFF)) >> 1; - v = (((linebase1[x] >> 0) & 0xFF) + ((linebase1[x + 2] >> 0) & 0xFF)) >> 1; - - linebase1[x + 1] = (linebase1[x + 1] & ~0xFFFF) | (u << 8) | v; - } - - linebase1[0xFF] = (linebase1[0xFF] & ~0xFFFF) | (linebase1[0xFE] & 0xFFFF); - - if (FirstDecode) - { - for (int x = 0; x < 256; x++) - linebase[x] = (linebase[x] & ~0xFFFF) | (linebase1[x] & 0xFFFF); - FirstDecode = 0; - } - else - for (int x = 0; x < 256; x++) - { - unsigned int u, v; - - u = (((LastLine[x] >> 8) & 0xFF) + ((linebase1[x] >> 8) & 0xFF)) >> 1; - v = (((LastLine[x] >> 0) & 0xFF) + ((linebase1[x] >> 0) & 0xFF)) >> 1; - - linebase[x] = (linebase[x] & ~0xFFFF) | (u << 8) | v; - } - - memcpy(LastLine, linebase1, 256 * 4); - } - } // End chroma interpolation - } // end jpeg-like decoding - else - { - // Earlier code confines the set to F0,F1,F2, and F3. - // F0 = (4, 0xF), F1 = (3, 0x7), F2 = (0x2, 0x3), F3 = 0x1, 0x1) - const unsigned int plt_shift = 4 - (block_type & 0x3); - const unsigned int crl_mask = (1 << plt_shift) - 1; - int x = 0; - - while (block_size > 0) - { - uint8 boot; - unsigned int rle_count; - - boot = KING_RB_Fetch(); - block_size--; - - if (boot == 0xFF) - { - KING_RB_Fetch(); - block_size--; - } - - if (!(boot & crl_mask)) // Expand mode? - { - rle_count = KING_RB_Fetch(); - block_size--; - if (rle_count == 0xFF) - { - KING_RB_Fetch(); - block_size--; - } - rle_count++; - } - else - rle_count = boot & crl_mask; - - for (unsigned int i = 0; i < rle_count; i++) - { - if (x >= 0x2000) - { - //puts("Oops"); - break; // Don't overflow our decode buffer! - } - DecodeBuffer[which_buffer][x] = (boot >> plt_shift); - x++; - } - } - } // end RLE decoding - -//for(int i = 0; i < 8 + block_size; i++) -// KING_RB_Fetch(); - -BufferNoDecode:; -} - -void KING_Moo(void); - -// NOTE: layer_or and palette_ptr are optimizations, the real RAINBOW chip knows not of such things. -int RAINBOW_FetchRaster(uint32 *linebuffer, uint32 layer_or, uint32 *palette_ptr) -{ - int ret; - - ret = DecodeFormat[DecodeBufferWhichRead]; - - if (linebuffer) - { - linebuffer = MDFN_ASSUME_ALIGNED(linebuffer, 8); - // - if (DecodeFormat[DecodeBufferWhichRead] == -1) // None - { - MDFN_FastArraySet(linebuffer, 0, 256); - } - else if (DecodeFormat[DecodeBufferWhichRead] == 1) // YUV - { - uint32 *in_ptr = (uint32 *)&DecodeBuffer[DecodeBufferWhichRead][RasterReadPos * 256 * 4]; - - if (Control & 0x2) // Endless scroll mode: - { - uint8 tmpss = HScroll; - - for (int x = 0; x < 256; x++) - { - linebuffer[x] = in_ptr[tmpss] | layer_or; - tmpss++; - } - } - else // Non-endless - { - uint16 tmpss = HScroll & 0x1FF; - - for (int x = 0; x < 256; x++) - { - linebuffer[x] = (tmpss < 256) ? (in_ptr[tmpss] | layer_or) : 0; - tmpss = (tmpss + 1) & 0x1FF; - } - } - MDFN_FastArraySet(in_ptr, 0, 256); - } - else if (DecodeFormat[DecodeBufferWhichRead] == 0) // Palette - { - uint8 *in_ptr = &DecodeBuffer[DecodeBufferWhichRead][RasterReadPos * 256]; - - if (Control & 0x2) // Endless scroll mode: - { - uint8 tmpss = HScroll; - - for (int x = 0; x < 256; x++) - { - linebuffer[x] = in_ptr[tmpss] ? (palette_ptr[in_ptr[tmpss]] | layer_or) : 0; - tmpss++; - } - } - else // Non-endless - { - uint16 tmpss = HScroll & 0x1FF; - - for (int x = 0; x < 256; x++) - { - linebuffer[x] = (tmpss < 256 && in_ptr[tmpss]) ? (palette_ptr[in_ptr[tmpss]] | layer_or) : 0; - tmpss = (tmpss + 1) & 0x1FF; - } - } - //MDFN_FastU32MemsetM8((uint32 *)in_ptr, 0, 256 / 4); - } - } - - RasterReadPos = (RasterReadPos + 1) & 0xF; - - if (!RasterReadPos) - DecodeFormat[DecodeBufferWhichRead] = -1; // Invalidate this buffer. - - //printf("Fetch: %d, buffer: %d\n", RasterReadPos, DecodeBufferWhichRead); - return (ret); -} - -void RAINBOW_Reset(void) -{ - Control = 0; - NullRunY = NullRunU = NullRunV = 0; - HScroll = 0; - RasterReadPos = 0; - DecodeBufferWhichRead = 0; - - memset(QuantTables, 0, sizeof(QuantTables)); - memset(QuantTablesBase, 0, sizeof(QuantTablesBase)); - DecodeFormat[0] = DecodeFormat[1] = -1; - - CalcHappyColor(); -} -} diff --git a/waterbox/pcfx/rainbow.h b/waterbox/pcfx/rainbow.h deleted file mode 100644 index 64949a7e45..0000000000 --- a/waterbox/pcfx/rainbow.h +++ /dev/null @@ -1,56 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* rainbow.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __PCFX_RAINBOW_H -#define __PCFX_RAINBOW_H - -namespace MDFN_IEN_PCFX -{ - -void RAINBOW_Write8(uint32 A, uint8 V); -void RAINBOW_Write16(uint32 A, uint16 V); - -void RAINBOW_ForceTransferReset(void); -void RAINBOW_SwapBuffers(void); -void RAINBOW_DecodeBlock(bool arg_FirstDecode, bool Skip); - -int RAINBOW_FetchRaster(uint32 *, uint32 layer_or, uint32 *palette_ptr); - -void RAINBOW_Init(bool arg_ChromaIP) MDFN_COLD; -void RAINBOW_Reset(void) MDFN_COLD; - -#ifdef WANT_DEBUGGER -enum -{ - RAINBOW_GSREG_RSCRLL, - RAINBOW_GSREG_RCTRL, - RAINBOW_GSREG_RNRY, - RAINBOW_GSREG_RNRU, - RAINBOW_GSREG_RNRV, - RAINBOW_GSREG_RHSYNC, -}; -uint32 RAINBOW_GetRegister(const unsigned int id, char* special, const uint32 special_len); -void RAINBOW_SetRegister(const unsigned int id, uint32 value); -#endif - -} - -#endif diff --git a/waterbox/pcfx/rainbow_acuv.inc b/waterbox/pcfx/rainbow_acuv.inc deleted file mode 100644 index b3e29391e7..0000000000 --- a/waterbox/pcfx/rainbow_acuv.inc +++ /dev/null @@ -1,4096 +0,0 @@ - /* 000 */ { 0x01, 0x02 }, - /* 001 */ { 0x01, 0x02 }, - /* 002 */ { 0x01, 0x02 }, - /* 003 */ { 0x01, 0x02 }, - /* 004 */ { 0x01, 0x02 }, - /* 005 */ { 0x01, 0x02 }, - /* 006 */ { 0x01, 0x02 }, - /* 007 */ { 0x01, 0x02 }, - /* 008 */ { 0x01, 0x02 }, - /* 009 */ { 0x01, 0x02 }, - /* 00a */ { 0x01, 0x02 }, - /* 00b */ { 0x01, 0x02 }, - /* 00c */ { 0x01, 0x02 }, - /* 00d */ { 0x01, 0x02 }, - /* 00e */ { 0x01, 0x02 }, - /* 00f */ { 0x01, 0x02 }, - /* 010 */ { 0x01, 0x02 }, - /* 011 */ { 0x01, 0x02 }, - /* 012 */ { 0x01, 0x02 }, - /* 013 */ { 0x01, 0x02 }, - /* 014 */ { 0x01, 0x02 }, - /* 015 */ { 0x01, 0x02 }, - /* 016 */ { 0x01, 0x02 }, - /* 017 */ { 0x01, 0x02 }, - /* 018 */ { 0x01, 0x02 }, - /* 019 */ { 0x01, 0x02 }, - /* 01a */ { 0x01, 0x02 }, - /* 01b */ { 0x01, 0x02 }, - /* 01c */ { 0x01, 0x02 }, - /* 01d */ { 0x01, 0x02 }, - /* 01e */ { 0x01, 0x02 }, - /* 01f */ { 0x01, 0x02 }, - /* 020 */ { 0x01, 0x02 }, - /* 021 */ { 0x01, 0x02 }, - /* 022 */ { 0x01, 0x02 }, - /* 023 */ { 0x01, 0x02 }, - /* 024 */ { 0x01, 0x02 }, - /* 025 */ { 0x01, 0x02 }, - /* 026 */ { 0x01, 0x02 }, - /* 027 */ { 0x01, 0x02 }, - /* 028 */ { 0x01, 0x02 }, - /* 029 */ { 0x01, 0x02 }, - /* 02a */ { 0x01, 0x02 }, - /* 02b */ { 0x01, 0x02 }, - /* 02c */ { 0x01, 0x02 }, - /* 02d */ { 0x01, 0x02 }, - /* 02e */ { 0x01, 0x02 }, - /* 02f */ { 0x01, 0x02 }, - /* 030 */ { 0x01, 0x02 }, - /* 031 */ { 0x01, 0x02 }, - /* 032 */ { 0x01, 0x02 }, - /* 033 */ { 0x01, 0x02 }, - /* 034 */ { 0x01, 0x02 }, - /* 035 */ { 0x01, 0x02 }, - /* 036 */ { 0x01, 0x02 }, - /* 037 */ { 0x01, 0x02 }, - /* 038 */ { 0x01, 0x02 }, - /* 039 */ { 0x01, 0x02 }, - /* 03a */ { 0x01, 0x02 }, - /* 03b */ { 0x01, 0x02 }, - /* 03c */ { 0x01, 0x02 }, - /* 03d */ { 0x01, 0x02 }, - /* 03e */ { 0x01, 0x02 }, - /* 03f */ { 0x01, 0x02 }, - /* 040 */ { 0x01, 0x02 }, - /* 041 */ { 0x01, 0x02 }, - /* 042 */ { 0x01, 0x02 }, - /* 043 */ { 0x01, 0x02 }, - /* 044 */ { 0x01, 0x02 }, - /* 045 */ { 0x01, 0x02 }, - /* 046 */ { 0x01, 0x02 }, - /* 047 */ { 0x01, 0x02 }, - /* 048 */ { 0x01, 0x02 }, - /* 049 */ { 0x01, 0x02 }, - /* 04a */ { 0x01, 0x02 }, - /* 04b */ { 0x01, 0x02 }, - /* 04c */ { 0x01, 0x02 }, - /* 04d */ { 0x01, 0x02 }, - /* 04e */ { 0x01, 0x02 }, - /* 04f */ { 0x01, 0x02 }, - /* 050 */ { 0x01, 0x02 }, - /* 051 */ { 0x01, 0x02 }, - /* 052 */ { 0x01, 0x02 }, - /* 053 */ { 0x01, 0x02 }, - /* 054 */ { 0x01, 0x02 }, - /* 055 */ { 0x01, 0x02 }, - /* 056 */ { 0x01, 0x02 }, - /* 057 */ { 0x01, 0x02 }, - /* 058 */ { 0x01, 0x02 }, - /* 059 */ { 0x01, 0x02 }, - /* 05a */ { 0x01, 0x02 }, - /* 05b */ { 0x01, 0x02 }, - /* 05c */ { 0x01, 0x02 }, - /* 05d */ { 0x01, 0x02 }, - /* 05e */ { 0x01, 0x02 }, - /* 05f */ { 0x01, 0x02 }, - /* 060 */ { 0x01, 0x02 }, - /* 061 */ { 0x01, 0x02 }, - /* 062 */ { 0x01, 0x02 }, - /* 063 */ { 0x01, 0x02 }, - /* 064 */ { 0x01, 0x02 }, - /* 065 */ { 0x01, 0x02 }, - /* 066 */ { 0x01, 0x02 }, - /* 067 */ { 0x01, 0x02 }, - /* 068 */ { 0x01, 0x02 }, - /* 069 */ { 0x01, 0x02 }, - /* 06a */ { 0x01, 0x02 }, - /* 06b */ { 0x01, 0x02 }, - /* 06c */ { 0x01, 0x02 }, - /* 06d */ { 0x01, 0x02 }, - /* 06e */ { 0x01, 0x02 }, - /* 06f */ { 0x01, 0x02 }, - /* 070 */ { 0x01, 0x02 }, - /* 071 */ { 0x01, 0x02 }, - /* 072 */ { 0x01, 0x02 }, - /* 073 */ { 0x01, 0x02 }, - /* 074 */ { 0x01, 0x02 }, - /* 075 */ { 0x01, 0x02 }, - /* 076 */ { 0x01, 0x02 }, - /* 077 */ { 0x01, 0x02 }, - /* 078 */ { 0x01, 0x02 }, - /* 079 */ { 0x01, 0x02 }, - /* 07a */ { 0x01, 0x02 }, - /* 07b */ { 0x01, 0x02 }, - /* 07c */ { 0x01, 0x02 }, - /* 07d */ { 0x01, 0x02 }, - /* 07e */ { 0x01, 0x02 }, - /* 07f */ { 0x01, 0x02 }, - /* 080 */ { 0x01, 0x02 }, - /* 081 */ { 0x01, 0x02 }, - /* 082 */ { 0x01, 0x02 }, - /* 083 */ { 0x01, 0x02 }, - /* 084 */ { 0x01, 0x02 }, - /* 085 */ { 0x01, 0x02 }, - /* 086 */ { 0x01, 0x02 }, - /* 087 */ { 0x01, 0x02 }, - /* 088 */ { 0x01, 0x02 }, - /* 089 */ { 0x01, 0x02 }, - /* 08a */ { 0x01, 0x02 }, - /* 08b */ { 0x01, 0x02 }, - /* 08c */ { 0x01, 0x02 }, - /* 08d */ { 0x01, 0x02 }, - /* 08e */ { 0x01, 0x02 }, - /* 08f */ { 0x01, 0x02 }, - /* 090 */ { 0x01, 0x02 }, - /* 091 */ { 0x01, 0x02 }, - /* 092 */ { 0x01, 0x02 }, - /* 093 */ { 0x01, 0x02 }, - /* 094 */ { 0x01, 0x02 }, - /* 095 */ { 0x01, 0x02 }, - /* 096 */ { 0x01, 0x02 }, - /* 097 */ { 0x01, 0x02 }, - /* 098 */ { 0x01, 0x02 }, - /* 099 */ { 0x01, 0x02 }, - /* 09a */ { 0x01, 0x02 }, - /* 09b */ { 0x01, 0x02 }, - /* 09c */ { 0x01, 0x02 }, - /* 09d */ { 0x01, 0x02 }, - /* 09e */ { 0x01, 0x02 }, - /* 09f */ { 0x01, 0x02 }, - /* 0a0 */ { 0x01, 0x02 }, - /* 0a1 */ { 0x01, 0x02 }, - /* 0a2 */ { 0x01, 0x02 }, - /* 0a3 */ { 0x01, 0x02 }, - /* 0a4 */ { 0x01, 0x02 }, - /* 0a5 */ { 0x01, 0x02 }, - /* 0a6 */ { 0x01, 0x02 }, - /* 0a7 */ { 0x01, 0x02 }, - /* 0a8 */ { 0x01, 0x02 }, - /* 0a9 */ { 0x01, 0x02 }, - /* 0aa */ { 0x01, 0x02 }, - /* 0ab */ { 0x01, 0x02 }, - /* 0ac */ { 0x01, 0x02 }, - /* 0ad */ { 0x01, 0x02 }, - /* 0ae */ { 0x01, 0x02 }, - /* 0af */ { 0x01, 0x02 }, - /* 0b0 */ { 0x01, 0x02 }, - /* 0b1 */ { 0x01, 0x02 }, - /* 0b2 */ { 0x01, 0x02 }, - /* 0b3 */ { 0x01, 0x02 }, - /* 0b4 */ { 0x01, 0x02 }, - /* 0b5 */ { 0x01, 0x02 }, - /* 0b6 */ { 0x01, 0x02 }, - /* 0b7 */ { 0x01, 0x02 }, - /* 0b8 */ { 0x01, 0x02 }, - /* 0b9 */ { 0x01, 0x02 }, - /* 0ba */ { 0x01, 0x02 }, - /* 0bb */ { 0x01, 0x02 }, - /* 0bc */ { 0x01, 0x02 }, - /* 0bd */ { 0x01, 0x02 }, - /* 0be */ { 0x01, 0x02 }, - /* 0bf */ { 0x01, 0x02 }, - /* 0c0 */ { 0x01, 0x02 }, - /* 0c1 */ { 0x01, 0x02 }, - /* 0c2 */ { 0x01, 0x02 }, - /* 0c3 */ { 0x01, 0x02 }, - /* 0c4 */ { 0x01, 0x02 }, - /* 0c5 */ { 0x01, 0x02 }, - /* 0c6 */ { 0x01, 0x02 }, - /* 0c7 */ { 0x01, 0x02 }, - /* 0c8 */ { 0x01, 0x02 }, - /* 0c9 */ { 0x01, 0x02 }, - /* 0ca */ { 0x01, 0x02 }, - /* 0cb */ { 0x01, 0x02 }, - /* 0cc */ { 0x01, 0x02 }, - /* 0cd */ { 0x01, 0x02 }, - /* 0ce */ { 0x01, 0x02 }, - /* 0cf */ { 0x01, 0x02 }, - /* 0d0 */ { 0x01, 0x02 }, - /* 0d1 */ { 0x01, 0x02 }, - /* 0d2 */ { 0x01, 0x02 }, - /* 0d3 */ { 0x01, 0x02 }, - /* 0d4 */ { 0x01, 0x02 }, - /* 0d5 */ { 0x01, 0x02 }, - /* 0d6 */ { 0x01, 0x02 }, - /* 0d7 */ { 0x01, 0x02 }, - /* 0d8 */ { 0x01, 0x02 }, - /* 0d9 */ { 0x01, 0x02 }, - /* 0da */ { 0x01, 0x02 }, - /* 0db */ { 0x01, 0x02 }, - /* 0dc */ { 0x01, 0x02 }, - /* 0dd */ { 0x01, 0x02 }, - /* 0de */ { 0x01, 0x02 }, - /* 0df */ { 0x01, 0x02 }, - /* 0e0 */ { 0x01, 0x02 }, - /* 0e1 */ { 0x01, 0x02 }, - /* 0e2 */ { 0x01, 0x02 }, - /* 0e3 */ { 0x01, 0x02 }, - /* 0e4 */ { 0x01, 0x02 }, - /* 0e5 */ { 0x01, 0x02 }, - /* 0e6 */ { 0x01, 0x02 }, - /* 0e7 */ { 0x01, 0x02 }, - /* 0e8 */ { 0x01, 0x02 }, - /* 0e9 */ { 0x01, 0x02 }, - /* 0ea */ { 0x01, 0x02 }, - /* 0eb */ { 0x01, 0x02 }, - /* 0ec */ { 0x01, 0x02 }, - /* 0ed */ { 0x01, 0x02 }, - /* 0ee */ { 0x01, 0x02 }, - /* 0ef */ { 0x01, 0x02 }, - /* 0f0 */ { 0x01, 0x02 }, - /* 0f1 */ { 0x01, 0x02 }, - /* 0f2 */ { 0x01, 0x02 }, - /* 0f3 */ { 0x01, 0x02 }, - /* 0f4 */ { 0x01, 0x02 }, - /* 0f5 */ { 0x01, 0x02 }, - /* 0f6 */ { 0x01, 0x02 }, - /* 0f7 */ { 0x01, 0x02 }, - /* 0f8 */ { 0x01, 0x02 }, - /* 0f9 */ { 0x01, 0x02 }, - /* 0fa */ { 0x01, 0x02 }, - /* 0fb */ { 0x01, 0x02 }, - /* 0fc */ { 0x01, 0x02 }, - /* 0fd */ { 0x01, 0x02 }, - /* 0fe */ { 0x01, 0x02 }, - /* 0ff */ { 0x01, 0x02 }, - /* 100 */ { 0x01, 0x02 }, - /* 101 */ { 0x01, 0x02 }, - /* 102 */ { 0x01, 0x02 }, - /* 103 */ { 0x01, 0x02 }, - /* 104 */ { 0x01, 0x02 }, - /* 105 */ { 0x01, 0x02 }, - /* 106 */ { 0x01, 0x02 }, - /* 107 */ { 0x01, 0x02 }, - /* 108 */ { 0x01, 0x02 }, - /* 109 */ { 0x01, 0x02 }, - /* 10a */ { 0x01, 0x02 }, - /* 10b */ { 0x01, 0x02 }, - /* 10c */ { 0x01, 0x02 }, - /* 10d */ { 0x01, 0x02 }, - /* 10e */ { 0x01, 0x02 }, - /* 10f */ { 0x01, 0x02 }, - /* 110 */ { 0x01, 0x02 }, - /* 111 */ { 0x01, 0x02 }, - /* 112 */ { 0x01, 0x02 }, - /* 113 */ { 0x01, 0x02 }, - /* 114 */ { 0x01, 0x02 }, - /* 115 */ { 0x01, 0x02 }, - /* 116 */ { 0x01, 0x02 }, - /* 117 */ { 0x01, 0x02 }, - /* 118 */ { 0x01, 0x02 }, - /* 119 */ { 0x01, 0x02 }, - /* 11a */ { 0x01, 0x02 }, - /* 11b */ { 0x01, 0x02 }, - /* 11c */ { 0x01, 0x02 }, - /* 11d */ { 0x01, 0x02 }, - /* 11e */ { 0x01, 0x02 }, - /* 11f */ { 0x01, 0x02 }, - /* 120 */ { 0x01, 0x02 }, - /* 121 */ { 0x01, 0x02 }, - /* 122 */ { 0x01, 0x02 }, - /* 123 */ { 0x01, 0x02 }, - /* 124 */ { 0x01, 0x02 }, - /* 125 */ { 0x01, 0x02 }, - /* 126 */ { 0x01, 0x02 }, - /* 127 */ { 0x01, 0x02 }, - /* 128 */ { 0x01, 0x02 }, - /* 129 */ { 0x01, 0x02 }, - /* 12a */ { 0x01, 0x02 }, - /* 12b */ { 0x01, 0x02 }, - /* 12c */ { 0x01, 0x02 }, - /* 12d */ { 0x01, 0x02 }, - /* 12e */ { 0x01, 0x02 }, - /* 12f */ { 0x01, 0x02 }, - /* 130 */ { 0x01, 0x02 }, - /* 131 */ { 0x01, 0x02 }, - /* 132 */ { 0x01, 0x02 }, - /* 133 */ { 0x01, 0x02 }, - /* 134 */ { 0x01, 0x02 }, - /* 135 */ { 0x01, 0x02 }, - /* 136 */ { 0x01, 0x02 }, - /* 137 */ { 0x01, 0x02 }, - /* 138 */ { 0x01, 0x02 }, - /* 139 */ { 0x01, 0x02 }, - /* 13a */ { 0x01, 0x02 }, - /* 13b */ { 0x01, 0x02 }, - /* 13c */ { 0x01, 0x02 }, - /* 13d */ { 0x01, 0x02 }, - /* 13e */ { 0x01, 0x02 }, - /* 13f */ { 0x01, 0x02 }, - /* 140 */ { 0x01, 0x02 }, - /* 141 */ { 0x01, 0x02 }, - /* 142 */ { 0x01, 0x02 }, - /* 143 */ { 0x01, 0x02 }, - /* 144 */ { 0x01, 0x02 }, - /* 145 */ { 0x01, 0x02 }, - /* 146 */ { 0x01, 0x02 }, - /* 147 */ { 0x01, 0x02 }, - /* 148 */ { 0x01, 0x02 }, - /* 149 */ { 0x01, 0x02 }, - /* 14a */ { 0x01, 0x02 }, - /* 14b */ { 0x01, 0x02 }, - /* 14c */ { 0x01, 0x02 }, - /* 14d */ { 0x01, 0x02 }, - /* 14e */ { 0x01, 0x02 }, - /* 14f */ { 0x01, 0x02 }, - /* 150 */ { 0x01, 0x02 }, - /* 151 */ { 0x01, 0x02 }, - /* 152 */ { 0x01, 0x02 }, - /* 153 */ { 0x01, 0x02 }, - /* 154 */ { 0x01, 0x02 }, - /* 155 */ { 0x01, 0x02 }, - /* 156 */ { 0x01, 0x02 }, - /* 157 */ { 0x01, 0x02 }, - /* 158 */ { 0x01, 0x02 }, - /* 159 */ { 0x01, 0x02 }, - /* 15a */ { 0x01, 0x02 }, - /* 15b */ { 0x01, 0x02 }, - /* 15c */ { 0x01, 0x02 }, - /* 15d */ { 0x01, 0x02 }, - /* 15e */ { 0x01, 0x02 }, - /* 15f */ { 0x01, 0x02 }, - /* 160 */ { 0x01, 0x02 }, - /* 161 */ { 0x01, 0x02 }, - /* 162 */ { 0x01, 0x02 }, - /* 163 */ { 0x01, 0x02 }, - /* 164 */ { 0x01, 0x02 }, - /* 165 */ { 0x01, 0x02 }, - /* 166 */ { 0x01, 0x02 }, - /* 167 */ { 0x01, 0x02 }, - /* 168 */ { 0x01, 0x02 }, - /* 169 */ { 0x01, 0x02 }, - /* 16a */ { 0x01, 0x02 }, - /* 16b */ { 0x01, 0x02 }, - /* 16c */ { 0x01, 0x02 }, - /* 16d */ { 0x01, 0x02 }, - /* 16e */ { 0x01, 0x02 }, - /* 16f */ { 0x01, 0x02 }, - /* 170 */ { 0x01, 0x02 }, - /* 171 */ { 0x01, 0x02 }, - /* 172 */ { 0x01, 0x02 }, - /* 173 */ { 0x01, 0x02 }, - /* 174 */ { 0x01, 0x02 }, - /* 175 */ { 0x01, 0x02 }, - /* 176 */ { 0x01, 0x02 }, - /* 177 */ { 0x01, 0x02 }, - /* 178 */ { 0x01, 0x02 }, - /* 179 */ { 0x01, 0x02 }, - /* 17a */ { 0x01, 0x02 }, - /* 17b */ { 0x01, 0x02 }, - /* 17c */ { 0x01, 0x02 }, - /* 17d */ { 0x01, 0x02 }, - /* 17e */ { 0x01, 0x02 }, - /* 17f */ { 0x01, 0x02 }, - /* 180 */ { 0x01, 0x02 }, - /* 181 */ { 0x01, 0x02 }, - /* 182 */ { 0x01, 0x02 }, - /* 183 */ { 0x01, 0x02 }, - /* 184 */ { 0x01, 0x02 }, - /* 185 */ { 0x01, 0x02 }, - /* 186 */ { 0x01, 0x02 }, - /* 187 */ { 0x01, 0x02 }, - /* 188 */ { 0x01, 0x02 }, - /* 189 */ { 0x01, 0x02 }, - /* 18a */ { 0x01, 0x02 }, - /* 18b */ { 0x01, 0x02 }, - /* 18c */ { 0x01, 0x02 }, - /* 18d */ { 0x01, 0x02 }, - /* 18e */ { 0x01, 0x02 }, - /* 18f */ { 0x01, 0x02 }, - /* 190 */ { 0x01, 0x02 }, - /* 191 */ { 0x01, 0x02 }, - /* 192 */ { 0x01, 0x02 }, - /* 193 */ { 0x01, 0x02 }, - /* 194 */ { 0x01, 0x02 }, - /* 195 */ { 0x01, 0x02 }, - /* 196 */ { 0x01, 0x02 }, - /* 197 */ { 0x01, 0x02 }, - /* 198 */ { 0x01, 0x02 }, - /* 199 */ { 0x01, 0x02 }, - /* 19a */ { 0x01, 0x02 }, - /* 19b */ { 0x01, 0x02 }, - /* 19c */ { 0x01, 0x02 }, - /* 19d */ { 0x01, 0x02 }, - /* 19e */ { 0x01, 0x02 }, - /* 19f */ { 0x01, 0x02 }, - /* 1a0 */ { 0x01, 0x02 }, - /* 1a1 */ { 0x01, 0x02 }, - /* 1a2 */ { 0x01, 0x02 }, - /* 1a3 */ { 0x01, 0x02 }, - /* 1a4 */ { 0x01, 0x02 }, - /* 1a5 */ { 0x01, 0x02 }, - /* 1a6 */ { 0x01, 0x02 }, - /* 1a7 */ { 0x01, 0x02 }, - /* 1a8 */ { 0x01, 0x02 }, - /* 1a9 */ { 0x01, 0x02 }, - /* 1aa */ { 0x01, 0x02 }, - /* 1ab */ { 0x01, 0x02 }, - /* 1ac */ { 0x01, 0x02 }, - /* 1ad */ { 0x01, 0x02 }, - /* 1ae */ { 0x01, 0x02 }, - /* 1af */ { 0x01, 0x02 }, - /* 1b0 */ { 0x01, 0x02 }, - /* 1b1 */ { 0x01, 0x02 }, - /* 1b2 */ { 0x01, 0x02 }, - /* 1b3 */ { 0x01, 0x02 }, - /* 1b4 */ { 0x01, 0x02 }, - /* 1b5 */ { 0x01, 0x02 }, - /* 1b6 */ { 0x01, 0x02 }, - /* 1b7 */ { 0x01, 0x02 }, - /* 1b8 */ { 0x01, 0x02 }, - /* 1b9 */ { 0x01, 0x02 }, - /* 1ba */ { 0x01, 0x02 }, - /* 1bb */ { 0x01, 0x02 }, - /* 1bc */ { 0x01, 0x02 }, - /* 1bd */ { 0x01, 0x02 }, - /* 1be */ { 0x01, 0x02 }, - /* 1bf */ { 0x01, 0x02 }, - /* 1c0 */ { 0x01, 0x02 }, - /* 1c1 */ { 0x01, 0x02 }, - /* 1c2 */ { 0x01, 0x02 }, - /* 1c3 */ { 0x01, 0x02 }, - /* 1c4 */ { 0x01, 0x02 }, - /* 1c5 */ { 0x01, 0x02 }, - /* 1c6 */ { 0x01, 0x02 }, - /* 1c7 */ { 0x01, 0x02 }, - /* 1c8 */ { 0x01, 0x02 }, - /* 1c9 */ { 0x01, 0x02 }, - /* 1ca */ { 0x01, 0x02 }, - /* 1cb */ { 0x01, 0x02 }, - /* 1cc */ { 0x01, 0x02 }, - /* 1cd */ { 0x01, 0x02 }, - /* 1ce */ { 0x01, 0x02 }, - /* 1cf */ { 0x01, 0x02 }, - /* 1d0 */ { 0x01, 0x02 }, - /* 1d1 */ { 0x01, 0x02 }, - /* 1d2 */ { 0x01, 0x02 }, - /* 1d3 */ { 0x01, 0x02 }, - /* 1d4 */ { 0x01, 0x02 }, - /* 1d5 */ { 0x01, 0x02 }, - /* 1d6 */ { 0x01, 0x02 }, - /* 1d7 */ { 0x01, 0x02 }, - /* 1d8 */ { 0x01, 0x02 }, - /* 1d9 */ { 0x01, 0x02 }, - /* 1da */ { 0x01, 0x02 }, - /* 1db */ { 0x01, 0x02 }, - /* 1dc */ { 0x01, 0x02 }, - /* 1dd */ { 0x01, 0x02 }, - /* 1de */ { 0x01, 0x02 }, - /* 1df */ { 0x01, 0x02 }, - /* 1e0 */ { 0x01, 0x02 }, - /* 1e1 */ { 0x01, 0x02 }, - /* 1e2 */ { 0x01, 0x02 }, - /* 1e3 */ { 0x01, 0x02 }, - /* 1e4 */ { 0x01, 0x02 }, - /* 1e5 */ { 0x01, 0x02 }, - /* 1e6 */ { 0x01, 0x02 }, - /* 1e7 */ { 0x01, 0x02 }, - /* 1e8 */ { 0x01, 0x02 }, - /* 1e9 */ { 0x01, 0x02 }, - /* 1ea */ { 0x01, 0x02 }, - /* 1eb */ { 0x01, 0x02 }, - /* 1ec */ { 0x01, 0x02 }, - /* 1ed */ { 0x01, 0x02 }, - /* 1ee */ { 0x01, 0x02 }, - /* 1ef */ { 0x01, 0x02 }, - /* 1f0 */ { 0x01, 0x02 }, - /* 1f1 */ { 0x01, 0x02 }, - /* 1f2 */ { 0x01, 0x02 }, - /* 1f3 */ { 0x01, 0x02 }, - /* 1f4 */ { 0x01, 0x02 }, - /* 1f5 */ { 0x01, 0x02 }, - /* 1f6 */ { 0x01, 0x02 }, - /* 1f7 */ { 0x01, 0x02 }, - /* 1f8 */ { 0x01, 0x02 }, - /* 1f9 */ { 0x01, 0x02 }, - /* 1fa */ { 0x01, 0x02 }, - /* 1fb */ { 0x01, 0x02 }, - /* 1fc */ { 0x01, 0x02 }, - /* 1fd */ { 0x01, 0x02 }, - /* 1fe */ { 0x01, 0x02 }, - /* 1ff */ { 0x01, 0x02 }, - /* 200 */ { 0x01, 0x02 }, - /* 201 */ { 0x01, 0x02 }, - /* 202 */ { 0x01, 0x02 }, - /* 203 */ { 0x01, 0x02 }, - /* 204 */ { 0x01, 0x02 }, - /* 205 */ { 0x01, 0x02 }, - /* 206 */ { 0x01, 0x02 }, - /* 207 */ { 0x01, 0x02 }, - /* 208 */ { 0x01, 0x02 }, - /* 209 */ { 0x01, 0x02 }, - /* 20a */ { 0x01, 0x02 }, - /* 20b */ { 0x01, 0x02 }, - /* 20c */ { 0x01, 0x02 }, - /* 20d */ { 0x01, 0x02 }, - /* 20e */ { 0x01, 0x02 }, - /* 20f */ { 0x01, 0x02 }, - /* 210 */ { 0x01, 0x02 }, - /* 211 */ { 0x01, 0x02 }, - /* 212 */ { 0x01, 0x02 }, - /* 213 */ { 0x01, 0x02 }, - /* 214 */ { 0x01, 0x02 }, - /* 215 */ { 0x01, 0x02 }, - /* 216 */ { 0x01, 0x02 }, - /* 217 */ { 0x01, 0x02 }, - /* 218 */ { 0x01, 0x02 }, - /* 219 */ { 0x01, 0x02 }, - /* 21a */ { 0x01, 0x02 }, - /* 21b */ { 0x01, 0x02 }, - /* 21c */ { 0x01, 0x02 }, - /* 21d */ { 0x01, 0x02 }, - /* 21e */ { 0x01, 0x02 }, - /* 21f */ { 0x01, 0x02 }, - /* 220 */ { 0x01, 0x02 }, - /* 221 */ { 0x01, 0x02 }, - /* 222 */ { 0x01, 0x02 }, - /* 223 */ { 0x01, 0x02 }, - /* 224 */ { 0x01, 0x02 }, - /* 225 */ { 0x01, 0x02 }, - /* 226 */ { 0x01, 0x02 }, - /* 227 */ { 0x01, 0x02 }, - /* 228 */ { 0x01, 0x02 }, - /* 229 */ { 0x01, 0x02 }, - /* 22a */ { 0x01, 0x02 }, - /* 22b */ { 0x01, 0x02 }, - /* 22c */ { 0x01, 0x02 }, - /* 22d */ { 0x01, 0x02 }, - /* 22e */ { 0x01, 0x02 }, - /* 22f */ { 0x01, 0x02 }, - /* 230 */ { 0x01, 0x02 }, - /* 231 */ { 0x01, 0x02 }, - /* 232 */ { 0x01, 0x02 }, - /* 233 */ { 0x01, 0x02 }, - /* 234 */ { 0x01, 0x02 }, - /* 235 */ { 0x01, 0x02 }, - /* 236 */ { 0x01, 0x02 }, - /* 237 */ { 0x01, 0x02 }, - /* 238 */ { 0x01, 0x02 }, - /* 239 */ { 0x01, 0x02 }, - /* 23a */ { 0x01, 0x02 }, - /* 23b */ { 0x01, 0x02 }, - /* 23c */ { 0x01, 0x02 }, - /* 23d */ { 0x01, 0x02 }, - /* 23e */ { 0x01, 0x02 }, - /* 23f */ { 0x01, 0x02 }, - /* 240 */ { 0x01, 0x02 }, - /* 241 */ { 0x01, 0x02 }, - /* 242 */ { 0x01, 0x02 }, - /* 243 */ { 0x01, 0x02 }, - /* 244 */ { 0x01, 0x02 }, - /* 245 */ { 0x01, 0x02 }, - /* 246 */ { 0x01, 0x02 }, - /* 247 */ { 0x01, 0x02 }, - /* 248 */ { 0x01, 0x02 }, - /* 249 */ { 0x01, 0x02 }, - /* 24a */ { 0x01, 0x02 }, - /* 24b */ { 0x01, 0x02 }, - /* 24c */ { 0x01, 0x02 }, - /* 24d */ { 0x01, 0x02 }, - /* 24e */ { 0x01, 0x02 }, - /* 24f */ { 0x01, 0x02 }, - /* 250 */ { 0x01, 0x02 }, - /* 251 */ { 0x01, 0x02 }, - /* 252 */ { 0x01, 0x02 }, - /* 253 */ { 0x01, 0x02 }, - /* 254 */ { 0x01, 0x02 }, - /* 255 */ { 0x01, 0x02 }, - /* 256 */ { 0x01, 0x02 }, - /* 257 */ { 0x01, 0x02 }, - /* 258 */ { 0x01, 0x02 }, - /* 259 */ { 0x01, 0x02 }, - /* 25a */ { 0x01, 0x02 }, - /* 25b */ { 0x01, 0x02 }, - /* 25c */ { 0x01, 0x02 }, - /* 25d */ { 0x01, 0x02 }, - /* 25e */ { 0x01, 0x02 }, - /* 25f */ { 0x01, 0x02 }, - /* 260 */ { 0x01, 0x02 }, - /* 261 */ { 0x01, 0x02 }, - /* 262 */ { 0x01, 0x02 }, - /* 263 */ { 0x01, 0x02 }, - /* 264 */ { 0x01, 0x02 }, - /* 265 */ { 0x01, 0x02 }, - /* 266 */ { 0x01, 0x02 }, - /* 267 */ { 0x01, 0x02 }, - /* 268 */ { 0x01, 0x02 }, - /* 269 */ { 0x01, 0x02 }, - /* 26a */ { 0x01, 0x02 }, - /* 26b */ { 0x01, 0x02 }, - /* 26c */ { 0x01, 0x02 }, - /* 26d */ { 0x01, 0x02 }, - /* 26e */ { 0x01, 0x02 }, - /* 26f */ { 0x01, 0x02 }, - /* 270 */ { 0x01, 0x02 }, - /* 271 */ { 0x01, 0x02 }, - /* 272 */ { 0x01, 0x02 }, - /* 273 */ { 0x01, 0x02 }, - /* 274 */ { 0x01, 0x02 }, - /* 275 */ { 0x01, 0x02 }, - /* 276 */ { 0x01, 0x02 }, - /* 277 */ { 0x01, 0x02 }, - /* 278 */ { 0x01, 0x02 }, - /* 279 */ { 0x01, 0x02 }, - /* 27a */ { 0x01, 0x02 }, - /* 27b */ { 0x01, 0x02 }, - /* 27c */ { 0x01, 0x02 }, - /* 27d */ { 0x01, 0x02 }, - /* 27e */ { 0x01, 0x02 }, - /* 27f */ { 0x01, 0x02 }, - /* 280 */ { 0x01, 0x02 }, - /* 281 */ { 0x01, 0x02 }, - /* 282 */ { 0x01, 0x02 }, - /* 283 */ { 0x01, 0x02 }, - /* 284 */ { 0x01, 0x02 }, - /* 285 */ { 0x01, 0x02 }, - /* 286 */ { 0x01, 0x02 }, - /* 287 */ { 0x01, 0x02 }, - /* 288 */ { 0x01, 0x02 }, - /* 289 */ { 0x01, 0x02 }, - /* 28a */ { 0x01, 0x02 }, - /* 28b */ { 0x01, 0x02 }, - /* 28c */ { 0x01, 0x02 }, - /* 28d */ { 0x01, 0x02 }, - /* 28e */ { 0x01, 0x02 }, - /* 28f */ { 0x01, 0x02 }, - /* 290 */ { 0x01, 0x02 }, - /* 291 */ { 0x01, 0x02 }, - /* 292 */ { 0x01, 0x02 }, - /* 293 */ { 0x01, 0x02 }, - /* 294 */ { 0x01, 0x02 }, - /* 295 */ { 0x01, 0x02 }, - /* 296 */ { 0x01, 0x02 }, - /* 297 */ { 0x01, 0x02 }, - /* 298 */ { 0x01, 0x02 }, - /* 299 */ { 0x01, 0x02 }, - /* 29a */ { 0x01, 0x02 }, - /* 29b */ { 0x01, 0x02 }, - /* 29c */ { 0x01, 0x02 }, - /* 29d */ { 0x01, 0x02 }, - /* 29e */ { 0x01, 0x02 }, - /* 29f */ { 0x01, 0x02 }, - /* 2a0 */ { 0x01, 0x02 }, - /* 2a1 */ { 0x01, 0x02 }, - /* 2a2 */ { 0x01, 0x02 }, - /* 2a3 */ { 0x01, 0x02 }, - /* 2a4 */ { 0x01, 0x02 }, - /* 2a5 */ { 0x01, 0x02 }, - /* 2a6 */ { 0x01, 0x02 }, - /* 2a7 */ { 0x01, 0x02 }, - /* 2a8 */ { 0x01, 0x02 }, - /* 2a9 */ { 0x01, 0x02 }, - /* 2aa */ { 0x01, 0x02 }, - /* 2ab */ { 0x01, 0x02 }, - /* 2ac */ { 0x01, 0x02 }, - /* 2ad */ { 0x01, 0x02 }, - /* 2ae */ { 0x01, 0x02 }, - /* 2af */ { 0x01, 0x02 }, - /* 2b0 */ { 0x01, 0x02 }, - /* 2b1 */ { 0x01, 0x02 }, - /* 2b2 */ { 0x01, 0x02 }, - /* 2b3 */ { 0x01, 0x02 }, - /* 2b4 */ { 0x01, 0x02 }, - /* 2b5 */ { 0x01, 0x02 }, - /* 2b6 */ { 0x01, 0x02 }, - /* 2b7 */ { 0x01, 0x02 }, - /* 2b8 */ { 0x01, 0x02 }, - /* 2b9 */ { 0x01, 0x02 }, - /* 2ba */ { 0x01, 0x02 }, - /* 2bb */ { 0x01, 0x02 }, - /* 2bc */ { 0x01, 0x02 }, - /* 2bd */ { 0x01, 0x02 }, - /* 2be */ { 0x01, 0x02 }, - /* 2bf */ { 0x01, 0x02 }, - /* 2c0 */ { 0x01, 0x02 }, - /* 2c1 */ { 0x01, 0x02 }, - /* 2c2 */ { 0x01, 0x02 }, - /* 2c3 */ { 0x01, 0x02 }, - /* 2c4 */ { 0x01, 0x02 }, - /* 2c5 */ { 0x01, 0x02 }, - /* 2c6 */ { 0x01, 0x02 }, - /* 2c7 */ { 0x01, 0x02 }, - /* 2c8 */ { 0x01, 0x02 }, - /* 2c9 */ { 0x01, 0x02 }, - /* 2ca */ { 0x01, 0x02 }, - /* 2cb */ { 0x01, 0x02 }, - /* 2cc */ { 0x01, 0x02 }, - /* 2cd */ { 0x01, 0x02 }, - /* 2ce */ { 0x01, 0x02 }, - /* 2cf */ { 0x01, 0x02 }, - /* 2d0 */ { 0x01, 0x02 }, - /* 2d1 */ { 0x01, 0x02 }, - /* 2d2 */ { 0x01, 0x02 }, - /* 2d3 */ { 0x01, 0x02 }, - /* 2d4 */ { 0x01, 0x02 }, - /* 2d5 */ { 0x01, 0x02 }, - /* 2d6 */ { 0x01, 0x02 }, - /* 2d7 */ { 0x01, 0x02 }, - /* 2d8 */ { 0x01, 0x02 }, - /* 2d9 */ { 0x01, 0x02 }, - /* 2da */ { 0x01, 0x02 }, - /* 2db */ { 0x01, 0x02 }, - /* 2dc */ { 0x01, 0x02 }, - /* 2dd */ { 0x01, 0x02 }, - /* 2de */ { 0x01, 0x02 }, - /* 2df */ { 0x01, 0x02 }, - /* 2e0 */ { 0x01, 0x02 }, - /* 2e1 */ { 0x01, 0x02 }, - /* 2e2 */ { 0x01, 0x02 }, - /* 2e3 */ { 0x01, 0x02 }, - /* 2e4 */ { 0x01, 0x02 }, - /* 2e5 */ { 0x01, 0x02 }, - /* 2e6 */ { 0x01, 0x02 }, - /* 2e7 */ { 0x01, 0x02 }, - /* 2e8 */ { 0x01, 0x02 }, - /* 2e9 */ { 0x01, 0x02 }, - /* 2ea */ { 0x01, 0x02 }, - /* 2eb */ { 0x01, 0x02 }, - /* 2ec */ { 0x01, 0x02 }, - /* 2ed */ { 0x01, 0x02 }, - /* 2ee */ { 0x01, 0x02 }, - /* 2ef */ { 0x01, 0x02 }, - /* 2f0 */ { 0x01, 0x02 }, - /* 2f1 */ { 0x01, 0x02 }, - /* 2f2 */ { 0x01, 0x02 }, - /* 2f3 */ { 0x01, 0x02 }, - /* 2f4 */ { 0x01, 0x02 }, - /* 2f5 */ { 0x01, 0x02 }, - /* 2f6 */ { 0x01, 0x02 }, - /* 2f7 */ { 0x01, 0x02 }, - /* 2f8 */ { 0x01, 0x02 }, - /* 2f9 */ { 0x01, 0x02 }, - /* 2fa */ { 0x01, 0x02 }, - /* 2fb */ { 0x01, 0x02 }, - /* 2fc */ { 0x01, 0x02 }, - /* 2fd */ { 0x01, 0x02 }, - /* 2fe */ { 0x01, 0x02 }, - /* 2ff */ { 0x01, 0x02 }, - /* 300 */ { 0x01, 0x02 }, - /* 301 */ { 0x01, 0x02 }, - /* 302 */ { 0x01, 0x02 }, - /* 303 */ { 0x01, 0x02 }, - /* 304 */ { 0x01, 0x02 }, - /* 305 */ { 0x01, 0x02 }, - /* 306 */ { 0x01, 0x02 }, - /* 307 */ { 0x01, 0x02 }, - /* 308 */ { 0x01, 0x02 }, - /* 309 */ { 0x01, 0x02 }, - /* 30a */ { 0x01, 0x02 }, - /* 30b */ { 0x01, 0x02 }, - /* 30c */ { 0x01, 0x02 }, - /* 30d */ { 0x01, 0x02 }, - /* 30e */ { 0x01, 0x02 }, - /* 30f */ { 0x01, 0x02 }, - /* 310 */ { 0x01, 0x02 }, - /* 311 */ { 0x01, 0x02 }, - /* 312 */ { 0x01, 0x02 }, - /* 313 */ { 0x01, 0x02 }, - /* 314 */ { 0x01, 0x02 }, - /* 315 */ { 0x01, 0x02 }, - /* 316 */ { 0x01, 0x02 }, - /* 317 */ { 0x01, 0x02 }, - /* 318 */ { 0x01, 0x02 }, - /* 319 */ { 0x01, 0x02 }, - /* 31a */ { 0x01, 0x02 }, - /* 31b */ { 0x01, 0x02 }, - /* 31c */ { 0x01, 0x02 }, - /* 31d */ { 0x01, 0x02 }, - /* 31e */ { 0x01, 0x02 }, - /* 31f */ { 0x01, 0x02 }, - /* 320 */ { 0x01, 0x02 }, - /* 321 */ { 0x01, 0x02 }, - /* 322 */ { 0x01, 0x02 }, - /* 323 */ { 0x01, 0x02 }, - /* 324 */ { 0x01, 0x02 }, - /* 325 */ { 0x01, 0x02 }, - /* 326 */ { 0x01, 0x02 }, - /* 327 */ { 0x01, 0x02 }, - /* 328 */ { 0x01, 0x02 }, - /* 329 */ { 0x01, 0x02 }, - /* 32a */ { 0x01, 0x02 }, - /* 32b */ { 0x01, 0x02 }, - /* 32c */ { 0x01, 0x02 }, - /* 32d */ { 0x01, 0x02 }, - /* 32e */ { 0x01, 0x02 }, - /* 32f */ { 0x01, 0x02 }, - /* 330 */ { 0x01, 0x02 }, - /* 331 */ { 0x01, 0x02 }, - /* 332 */ { 0x01, 0x02 }, - /* 333 */ { 0x01, 0x02 }, - /* 334 */ { 0x01, 0x02 }, - /* 335 */ { 0x01, 0x02 }, - /* 336 */ { 0x01, 0x02 }, - /* 337 */ { 0x01, 0x02 }, - /* 338 */ { 0x01, 0x02 }, - /* 339 */ { 0x01, 0x02 }, - /* 33a */ { 0x01, 0x02 }, - /* 33b */ { 0x01, 0x02 }, - /* 33c */ { 0x01, 0x02 }, - /* 33d */ { 0x01, 0x02 }, - /* 33e */ { 0x01, 0x02 }, - /* 33f */ { 0x01, 0x02 }, - /* 340 */ { 0x01, 0x02 }, - /* 341 */ { 0x01, 0x02 }, - /* 342 */ { 0x01, 0x02 }, - /* 343 */ { 0x01, 0x02 }, - /* 344 */ { 0x01, 0x02 }, - /* 345 */ { 0x01, 0x02 }, - /* 346 */ { 0x01, 0x02 }, - /* 347 */ { 0x01, 0x02 }, - /* 348 */ { 0x01, 0x02 }, - /* 349 */ { 0x01, 0x02 }, - /* 34a */ { 0x01, 0x02 }, - /* 34b */ { 0x01, 0x02 }, - /* 34c */ { 0x01, 0x02 }, - /* 34d */ { 0x01, 0x02 }, - /* 34e */ { 0x01, 0x02 }, - /* 34f */ { 0x01, 0x02 }, - /* 350 */ { 0x01, 0x02 }, - /* 351 */ { 0x01, 0x02 }, - /* 352 */ { 0x01, 0x02 }, - /* 353 */ { 0x01, 0x02 }, - /* 354 */ { 0x01, 0x02 }, - /* 355 */ { 0x01, 0x02 }, - /* 356 */ { 0x01, 0x02 }, - /* 357 */ { 0x01, 0x02 }, - /* 358 */ { 0x01, 0x02 }, - /* 359 */ { 0x01, 0x02 }, - /* 35a */ { 0x01, 0x02 }, - /* 35b */ { 0x01, 0x02 }, - /* 35c */ { 0x01, 0x02 }, - /* 35d */ { 0x01, 0x02 }, - /* 35e */ { 0x01, 0x02 }, - /* 35f */ { 0x01, 0x02 }, - /* 360 */ { 0x01, 0x02 }, - /* 361 */ { 0x01, 0x02 }, - /* 362 */ { 0x01, 0x02 }, - /* 363 */ { 0x01, 0x02 }, - /* 364 */ { 0x01, 0x02 }, - /* 365 */ { 0x01, 0x02 }, - /* 366 */ { 0x01, 0x02 }, - /* 367 */ { 0x01, 0x02 }, - /* 368 */ { 0x01, 0x02 }, - /* 369 */ { 0x01, 0x02 }, - /* 36a */ { 0x01, 0x02 }, - /* 36b */ { 0x01, 0x02 }, - /* 36c */ { 0x01, 0x02 }, - /* 36d */ { 0x01, 0x02 }, - /* 36e */ { 0x01, 0x02 }, - /* 36f */ { 0x01, 0x02 }, - /* 370 */ { 0x01, 0x02 }, - /* 371 */ { 0x01, 0x02 }, - /* 372 */ { 0x01, 0x02 }, - /* 373 */ { 0x01, 0x02 }, - /* 374 */ { 0x01, 0x02 }, - /* 375 */ { 0x01, 0x02 }, - /* 376 */ { 0x01, 0x02 }, - /* 377 */ { 0x01, 0x02 }, - /* 378 */ { 0x01, 0x02 }, - /* 379 */ { 0x01, 0x02 }, - /* 37a */ { 0x01, 0x02 }, - /* 37b */ { 0x01, 0x02 }, - /* 37c */ { 0x01, 0x02 }, - /* 37d */ { 0x01, 0x02 }, - /* 37e */ { 0x01, 0x02 }, - /* 37f */ { 0x01, 0x02 }, - /* 380 */ { 0x01, 0x02 }, - /* 381 */ { 0x01, 0x02 }, - /* 382 */ { 0x01, 0x02 }, - /* 383 */ { 0x01, 0x02 }, - /* 384 */ { 0x01, 0x02 }, - /* 385 */ { 0x01, 0x02 }, - /* 386 */ { 0x01, 0x02 }, - /* 387 */ { 0x01, 0x02 }, - /* 388 */ { 0x01, 0x02 }, - /* 389 */ { 0x01, 0x02 }, - /* 38a */ { 0x01, 0x02 }, - /* 38b */ { 0x01, 0x02 }, - /* 38c */ { 0x01, 0x02 }, - /* 38d */ { 0x01, 0x02 }, - /* 38e */ { 0x01, 0x02 }, - /* 38f */ { 0x01, 0x02 }, - /* 390 */ { 0x01, 0x02 }, - /* 391 */ { 0x01, 0x02 }, - /* 392 */ { 0x01, 0x02 }, - /* 393 */ { 0x01, 0x02 }, - /* 394 */ { 0x01, 0x02 }, - /* 395 */ { 0x01, 0x02 }, - /* 396 */ { 0x01, 0x02 }, - /* 397 */ { 0x01, 0x02 }, - /* 398 */ { 0x01, 0x02 }, - /* 399 */ { 0x01, 0x02 }, - /* 39a */ { 0x01, 0x02 }, - /* 39b */ { 0x01, 0x02 }, - /* 39c */ { 0x01, 0x02 }, - /* 39d */ { 0x01, 0x02 }, - /* 39e */ { 0x01, 0x02 }, - /* 39f */ { 0x01, 0x02 }, - /* 3a0 */ { 0x01, 0x02 }, - /* 3a1 */ { 0x01, 0x02 }, - /* 3a2 */ { 0x01, 0x02 }, - /* 3a3 */ { 0x01, 0x02 }, - /* 3a4 */ { 0x01, 0x02 }, - /* 3a5 */ { 0x01, 0x02 }, - /* 3a6 */ { 0x01, 0x02 }, - /* 3a7 */ { 0x01, 0x02 }, - /* 3a8 */ { 0x01, 0x02 }, - /* 3a9 */ { 0x01, 0x02 }, - /* 3aa */ { 0x01, 0x02 }, - /* 3ab */ { 0x01, 0x02 }, - /* 3ac */ { 0x01, 0x02 }, - /* 3ad */ { 0x01, 0x02 }, - /* 3ae */ { 0x01, 0x02 }, - /* 3af */ { 0x01, 0x02 }, - /* 3b0 */ { 0x01, 0x02 }, - /* 3b1 */ { 0x01, 0x02 }, - /* 3b2 */ { 0x01, 0x02 }, - /* 3b3 */ { 0x01, 0x02 }, - /* 3b4 */ { 0x01, 0x02 }, - /* 3b5 */ { 0x01, 0x02 }, - /* 3b6 */ { 0x01, 0x02 }, - /* 3b7 */ { 0x01, 0x02 }, - /* 3b8 */ { 0x01, 0x02 }, - /* 3b9 */ { 0x01, 0x02 }, - /* 3ba */ { 0x01, 0x02 }, - /* 3bb */ { 0x01, 0x02 }, - /* 3bc */ { 0x01, 0x02 }, - /* 3bd */ { 0x01, 0x02 }, - /* 3be */ { 0x01, 0x02 }, - /* 3bf */ { 0x01, 0x02 }, - /* 3c0 */ { 0x01, 0x02 }, - /* 3c1 */ { 0x01, 0x02 }, - /* 3c2 */ { 0x01, 0x02 }, - /* 3c3 */ { 0x01, 0x02 }, - /* 3c4 */ { 0x01, 0x02 }, - /* 3c5 */ { 0x01, 0x02 }, - /* 3c6 */ { 0x01, 0x02 }, - /* 3c7 */ { 0x01, 0x02 }, - /* 3c8 */ { 0x01, 0x02 }, - /* 3c9 */ { 0x01, 0x02 }, - /* 3ca */ { 0x01, 0x02 }, - /* 3cb */ { 0x01, 0x02 }, - /* 3cc */ { 0x01, 0x02 }, - /* 3cd */ { 0x01, 0x02 }, - /* 3ce */ { 0x01, 0x02 }, - /* 3cf */ { 0x01, 0x02 }, - /* 3d0 */ { 0x01, 0x02 }, - /* 3d1 */ { 0x01, 0x02 }, - /* 3d2 */ { 0x01, 0x02 }, - /* 3d3 */ { 0x01, 0x02 }, - /* 3d4 */ { 0x01, 0x02 }, - /* 3d5 */ { 0x01, 0x02 }, - /* 3d6 */ { 0x01, 0x02 }, - /* 3d7 */ { 0x01, 0x02 }, - /* 3d8 */ { 0x01, 0x02 }, - /* 3d9 */ { 0x01, 0x02 }, - /* 3da */ { 0x01, 0x02 }, - /* 3db */ { 0x01, 0x02 }, - /* 3dc */ { 0x01, 0x02 }, - /* 3dd */ { 0x01, 0x02 }, - /* 3de */ { 0x01, 0x02 }, - /* 3df */ { 0x01, 0x02 }, - /* 3e0 */ { 0x01, 0x02 }, - /* 3e1 */ { 0x01, 0x02 }, - /* 3e2 */ { 0x01, 0x02 }, - /* 3e3 */ { 0x01, 0x02 }, - /* 3e4 */ { 0x01, 0x02 }, - /* 3e5 */ { 0x01, 0x02 }, - /* 3e6 */ { 0x01, 0x02 }, - /* 3e7 */ { 0x01, 0x02 }, - /* 3e8 */ { 0x01, 0x02 }, - /* 3e9 */ { 0x01, 0x02 }, - /* 3ea */ { 0x01, 0x02 }, - /* 3eb */ { 0x01, 0x02 }, - /* 3ec */ { 0x01, 0x02 }, - /* 3ed */ { 0x01, 0x02 }, - /* 3ee */ { 0x01, 0x02 }, - /* 3ef */ { 0x01, 0x02 }, - /* 3f0 */ { 0x01, 0x02 }, - /* 3f1 */ { 0x01, 0x02 }, - /* 3f2 */ { 0x01, 0x02 }, - /* 3f3 */ { 0x01, 0x02 }, - /* 3f4 */ { 0x01, 0x02 }, - /* 3f5 */ { 0x01, 0x02 }, - /* 3f6 */ { 0x01, 0x02 }, - /* 3f7 */ { 0x01, 0x02 }, - /* 3f8 */ { 0x01, 0x02 }, - /* 3f9 */ { 0x01, 0x02 }, - /* 3fa */ { 0x01, 0x02 }, - /* 3fb */ { 0x01, 0x02 }, - /* 3fc */ { 0x01, 0x02 }, - /* 3fd */ { 0x01, 0x02 }, - /* 3fe */ { 0x01, 0x02 }, - /* 3ff */ { 0x01, 0x02 }, - /* 400 */ { 0x02, 0x02 }, - /* 401 */ { 0x02, 0x02 }, - /* 402 */ { 0x02, 0x02 }, - /* 403 */ { 0x02, 0x02 }, - /* 404 */ { 0x02, 0x02 }, - /* 405 */ { 0x02, 0x02 }, - /* 406 */ { 0x02, 0x02 }, - /* 407 */ { 0x02, 0x02 }, - /* 408 */ { 0x02, 0x02 }, - /* 409 */ { 0x02, 0x02 }, - /* 40a */ { 0x02, 0x02 }, - /* 40b */ { 0x02, 0x02 }, - /* 40c */ { 0x02, 0x02 }, - /* 40d */ { 0x02, 0x02 }, - /* 40e */ { 0x02, 0x02 }, - /* 40f */ { 0x02, 0x02 }, - /* 410 */ { 0x02, 0x02 }, - /* 411 */ { 0x02, 0x02 }, - /* 412 */ { 0x02, 0x02 }, - /* 413 */ { 0x02, 0x02 }, - /* 414 */ { 0x02, 0x02 }, - /* 415 */ { 0x02, 0x02 }, - /* 416 */ { 0x02, 0x02 }, - /* 417 */ { 0x02, 0x02 }, - /* 418 */ { 0x02, 0x02 }, - /* 419 */ { 0x02, 0x02 }, - /* 41a */ { 0x02, 0x02 }, - /* 41b */ { 0x02, 0x02 }, - /* 41c */ { 0x02, 0x02 }, - /* 41d */ { 0x02, 0x02 }, - /* 41e */ { 0x02, 0x02 }, - /* 41f */ { 0x02, 0x02 }, - /* 420 */ { 0x02, 0x02 }, - /* 421 */ { 0x02, 0x02 }, - /* 422 */ { 0x02, 0x02 }, - /* 423 */ { 0x02, 0x02 }, - /* 424 */ { 0x02, 0x02 }, - /* 425 */ { 0x02, 0x02 }, - /* 426 */ { 0x02, 0x02 }, - /* 427 */ { 0x02, 0x02 }, - /* 428 */ { 0x02, 0x02 }, - /* 429 */ { 0x02, 0x02 }, - /* 42a */ { 0x02, 0x02 }, - /* 42b */ { 0x02, 0x02 }, - /* 42c */ { 0x02, 0x02 }, - /* 42d */ { 0x02, 0x02 }, - /* 42e */ { 0x02, 0x02 }, - /* 42f */ { 0x02, 0x02 }, - /* 430 */ { 0x02, 0x02 }, - /* 431 */ { 0x02, 0x02 }, - /* 432 */ { 0x02, 0x02 }, - /* 433 */ { 0x02, 0x02 }, - /* 434 */ { 0x02, 0x02 }, - /* 435 */ { 0x02, 0x02 }, - /* 436 */ { 0x02, 0x02 }, - /* 437 */ { 0x02, 0x02 }, - /* 438 */ { 0x02, 0x02 }, - /* 439 */ { 0x02, 0x02 }, - /* 43a */ { 0x02, 0x02 }, - /* 43b */ { 0x02, 0x02 }, - /* 43c */ { 0x02, 0x02 }, - /* 43d */ { 0x02, 0x02 }, - /* 43e */ { 0x02, 0x02 }, - /* 43f */ { 0x02, 0x02 }, - /* 440 */ { 0x02, 0x02 }, - /* 441 */ { 0x02, 0x02 }, - /* 442 */ { 0x02, 0x02 }, - /* 443 */ { 0x02, 0x02 }, - /* 444 */ { 0x02, 0x02 }, - /* 445 */ { 0x02, 0x02 }, - /* 446 */ { 0x02, 0x02 }, - /* 447 */ { 0x02, 0x02 }, - /* 448 */ { 0x02, 0x02 }, - /* 449 */ { 0x02, 0x02 }, - /* 44a */ { 0x02, 0x02 }, - /* 44b */ { 0x02, 0x02 }, - /* 44c */ { 0x02, 0x02 }, - /* 44d */ { 0x02, 0x02 }, - /* 44e */ { 0x02, 0x02 }, - /* 44f */ { 0x02, 0x02 }, - /* 450 */ { 0x02, 0x02 }, - /* 451 */ { 0x02, 0x02 }, - /* 452 */ { 0x02, 0x02 }, - /* 453 */ { 0x02, 0x02 }, - /* 454 */ { 0x02, 0x02 }, - /* 455 */ { 0x02, 0x02 }, - /* 456 */ { 0x02, 0x02 }, - /* 457 */ { 0x02, 0x02 }, - /* 458 */ { 0x02, 0x02 }, - /* 459 */ { 0x02, 0x02 }, - /* 45a */ { 0x02, 0x02 }, - /* 45b */ { 0x02, 0x02 }, - /* 45c */ { 0x02, 0x02 }, - /* 45d */ { 0x02, 0x02 }, - /* 45e */ { 0x02, 0x02 }, - /* 45f */ { 0x02, 0x02 }, - /* 460 */ { 0x02, 0x02 }, - /* 461 */ { 0x02, 0x02 }, - /* 462 */ { 0x02, 0x02 }, - /* 463 */ { 0x02, 0x02 }, - /* 464 */ { 0x02, 0x02 }, - /* 465 */ { 0x02, 0x02 }, - /* 466 */ { 0x02, 0x02 }, - /* 467 */ { 0x02, 0x02 }, - /* 468 */ { 0x02, 0x02 }, - /* 469 */ { 0x02, 0x02 }, - /* 46a */ { 0x02, 0x02 }, - /* 46b */ { 0x02, 0x02 }, - /* 46c */ { 0x02, 0x02 }, - /* 46d */ { 0x02, 0x02 }, - /* 46e */ { 0x02, 0x02 }, - /* 46f */ { 0x02, 0x02 }, - /* 470 */ { 0x02, 0x02 }, - /* 471 */ { 0x02, 0x02 }, - /* 472 */ { 0x02, 0x02 }, - /* 473 */ { 0x02, 0x02 }, - /* 474 */ { 0x02, 0x02 }, - /* 475 */ { 0x02, 0x02 }, - /* 476 */ { 0x02, 0x02 }, - /* 477 */ { 0x02, 0x02 }, - /* 478 */ { 0x02, 0x02 }, - /* 479 */ { 0x02, 0x02 }, - /* 47a */ { 0x02, 0x02 }, - /* 47b */ { 0x02, 0x02 }, - /* 47c */ { 0x02, 0x02 }, - /* 47d */ { 0x02, 0x02 }, - /* 47e */ { 0x02, 0x02 }, - /* 47f */ { 0x02, 0x02 }, - /* 480 */ { 0x02, 0x02 }, - /* 481 */ { 0x02, 0x02 }, - /* 482 */ { 0x02, 0x02 }, - /* 483 */ { 0x02, 0x02 }, - /* 484 */ { 0x02, 0x02 }, - /* 485 */ { 0x02, 0x02 }, - /* 486 */ { 0x02, 0x02 }, - /* 487 */ { 0x02, 0x02 }, - /* 488 */ { 0x02, 0x02 }, - /* 489 */ { 0x02, 0x02 }, - /* 48a */ { 0x02, 0x02 }, - /* 48b */ { 0x02, 0x02 }, - /* 48c */ { 0x02, 0x02 }, - /* 48d */ { 0x02, 0x02 }, - /* 48e */ { 0x02, 0x02 }, - /* 48f */ { 0x02, 0x02 }, - /* 490 */ { 0x02, 0x02 }, - /* 491 */ { 0x02, 0x02 }, - /* 492 */ { 0x02, 0x02 }, - /* 493 */ { 0x02, 0x02 }, - /* 494 */ { 0x02, 0x02 }, - /* 495 */ { 0x02, 0x02 }, - /* 496 */ { 0x02, 0x02 }, - /* 497 */ { 0x02, 0x02 }, - /* 498 */ { 0x02, 0x02 }, - /* 499 */ { 0x02, 0x02 }, - /* 49a */ { 0x02, 0x02 }, - /* 49b */ { 0x02, 0x02 }, - /* 49c */ { 0x02, 0x02 }, - /* 49d */ { 0x02, 0x02 }, - /* 49e */ { 0x02, 0x02 }, - /* 49f */ { 0x02, 0x02 }, - /* 4a0 */ { 0x02, 0x02 }, - /* 4a1 */ { 0x02, 0x02 }, - /* 4a2 */ { 0x02, 0x02 }, - /* 4a3 */ { 0x02, 0x02 }, - /* 4a4 */ { 0x02, 0x02 }, - /* 4a5 */ { 0x02, 0x02 }, - /* 4a6 */ { 0x02, 0x02 }, - /* 4a7 */ { 0x02, 0x02 }, - /* 4a8 */ { 0x02, 0x02 }, - /* 4a9 */ { 0x02, 0x02 }, - /* 4aa */ { 0x02, 0x02 }, - /* 4ab */ { 0x02, 0x02 }, - /* 4ac */ { 0x02, 0x02 }, - /* 4ad */ { 0x02, 0x02 }, - /* 4ae */ { 0x02, 0x02 }, - /* 4af */ { 0x02, 0x02 }, - /* 4b0 */ { 0x02, 0x02 }, - /* 4b1 */ { 0x02, 0x02 }, - /* 4b2 */ { 0x02, 0x02 }, - /* 4b3 */ { 0x02, 0x02 }, - /* 4b4 */ { 0x02, 0x02 }, - /* 4b5 */ { 0x02, 0x02 }, - /* 4b6 */ { 0x02, 0x02 }, - /* 4b7 */ { 0x02, 0x02 }, - /* 4b8 */ { 0x02, 0x02 }, - /* 4b9 */ { 0x02, 0x02 }, - /* 4ba */ { 0x02, 0x02 }, - /* 4bb */ { 0x02, 0x02 }, - /* 4bc */ { 0x02, 0x02 }, - /* 4bd */ { 0x02, 0x02 }, - /* 4be */ { 0x02, 0x02 }, - /* 4bf */ { 0x02, 0x02 }, - /* 4c0 */ { 0x02, 0x02 }, - /* 4c1 */ { 0x02, 0x02 }, - /* 4c2 */ { 0x02, 0x02 }, - /* 4c3 */ { 0x02, 0x02 }, - /* 4c4 */ { 0x02, 0x02 }, - /* 4c5 */ { 0x02, 0x02 }, - /* 4c6 */ { 0x02, 0x02 }, - /* 4c7 */ { 0x02, 0x02 }, - /* 4c8 */ { 0x02, 0x02 }, - /* 4c9 */ { 0x02, 0x02 }, - /* 4ca */ { 0x02, 0x02 }, - /* 4cb */ { 0x02, 0x02 }, - /* 4cc */ { 0x02, 0x02 }, - /* 4cd */ { 0x02, 0x02 }, - /* 4ce */ { 0x02, 0x02 }, - /* 4cf */ { 0x02, 0x02 }, - /* 4d0 */ { 0x02, 0x02 }, - /* 4d1 */ { 0x02, 0x02 }, - /* 4d2 */ { 0x02, 0x02 }, - /* 4d3 */ { 0x02, 0x02 }, - /* 4d4 */ { 0x02, 0x02 }, - /* 4d5 */ { 0x02, 0x02 }, - /* 4d6 */ { 0x02, 0x02 }, - /* 4d7 */ { 0x02, 0x02 }, - /* 4d8 */ { 0x02, 0x02 }, - /* 4d9 */ { 0x02, 0x02 }, - /* 4da */ { 0x02, 0x02 }, - /* 4db */ { 0x02, 0x02 }, - /* 4dc */ { 0x02, 0x02 }, - /* 4dd */ { 0x02, 0x02 }, - /* 4de */ { 0x02, 0x02 }, - /* 4df */ { 0x02, 0x02 }, - /* 4e0 */ { 0x02, 0x02 }, - /* 4e1 */ { 0x02, 0x02 }, - /* 4e2 */ { 0x02, 0x02 }, - /* 4e3 */ { 0x02, 0x02 }, - /* 4e4 */ { 0x02, 0x02 }, - /* 4e5 */ { 0x02, 0x02 }, - /* 4e6 */ { 0x02, 0x02 }, - /* 4e7 */ { 0x02, 0x02 }, - /* 4e8 */ { 0x02, 0x02 }, - /* 4e9 */ { 0x02, 0x02 }, - /* 4ea */ { 0x02, 0x02 }, - /* 4eb */ { 0x02, 0x02 }, - /* 4ec */ { 0x02, 0x02 }, - /* 4ed */ { 0x02, 0x02 }, - /* 4ee */ { 0x02, 0x02 }, - /* 4ef */ { 0x02, 0x02 }, - /* 4f0 */ { 0x02, 0x02 }, - /* 4f1 */ { 0x02, 0x02 }, - /* 4f2 */ { 0x02, 0x02 }, - /* 4f3 */ { 0x02, 0x02 }, - /* 4f4 */ { 0x02, 0x02 }, - /* 4f5 */ { 0x02, 0x02 }, - /* 4f6 */ { 0x02, 0x02 }, - /* 4f7 */ { 0x02, 0x02 }, - /* 4f8 */ { 0x02, 0x02 }, - /* 4f9 */ { 0x02, 0x02 }, - /* 4fa */ { 0x02, 0x02 }, - /* 4fb */ { 0x02, 0x02 }, - /* 4fc */ { 0x02, 0x02 }, - /* 4fd */ { 0x02, 0x02 }, - /* 4fe */ { 0x02, 0x02 }, - /* 4ff */ { 0x02, 0x02 }, - /* 500 */ { 0x02, 0x02 }, - /* 501 */ { 0x02, 0x02 }, - /* 502 */ { 0x02, 0x02 }, - /* 503 */ { 0x02, 0x02 }, - /* 504 */ { 0x02, 0x02 }, - /* 505 */ { 0x02, 0x02 }, - /* 506 */ { 0x02, 0x02 }, - /* 507 */ { 0x02, 0x02 }, - /* 508 */ { 0x02, 0x02 }, - /* 509 */ { 0x02, 0x02 }, - /* 50a */ { 0x02, 0x02 }, - /* 50b */ { 0x02, 0x02 }, - /* 50c */ { 0x02, 0x02 }, - /* 50d */ { 0x02, 0x02 }, - /* 50e */ { 0x02, 0x02 }, - /* 50f */ { 0x02, 0x02 }, - /* 510 */ { 0x02, 0x02 }, - /* 511 */ { 0x02, 0x02 }, - /* 512 */ { 0x02, 0x02 }, - /* 513 */ { 0x02, 0x02 }, - /* 514 */ { 0x02, 0x02 }, - /* 515 */ { 0x02, 0x02 }, - /* 516 */ { 0x02, 0x02 }, - /* 517 */ { 0x02, 0x02 }, - /* 518 */ { 0x02, 0x02 }, - /* 519 */ { 0x02, 0x02 }, - /* 51a */ { 0x02, 0x02 }, - /* 51b */ { 0x02, 0x02 }, - /* 51c */ { 0x02, 0x02 }, - /* 51d */ { 0x02, 0x02 }, - /* 51e */ { 0x02, 0x02 }, - /* 51f */ { 0x02, 0x02 }, - /* 520 */ { 0x02, 0x02 }, - /* 521 */ { 0x02, 0x02 }, - /* 522 */ { 0x02, 0x02 }, - /* 523 */ { 0x02, 0x02 }, - /* 524 */ { 0x02, 0x02 }, - /* 525 */ { 0x02, 0x02 }, - /* 526 */ { 0x02, 0x02 }, - /* 527 */ { 0x02, 0x02 }, - /* 528 */ { 0x02, 0x02 }, - /* 529 */ { 0x02, 0x02 }, - /* 52a */ { 0x02, 0x02 }, - /* 52b */ { 0x02, 0x02 }, - /* 52c */ { 0x02, 0x02 }, - /* 52d */ { 0x02, 0x02 }, - /* 52e */ { 0x02, 0x02 }, - /* 52f */ { 0x02, 0x02 }, - /* 530 */ { 0x02, 0x02 }, - /* 531 */ { 0x02, 0x02 }, - /* 532 */ { 0x02, 0x02 }, - /* 533 */ { 0x02, 0x02 }, - /* 534 */ { 0x02, 0x02 }, - /* 535 */ { 0x02, 0x02 }, - /* 536 */ { 0x02, 0x02 }, - /* 537 */ { 0x02, 0x02 }, - /* 538 */ { 0x02, 0x02 }, - /* 539 */ { 0x02, 0x02 }, - /* 53a */ { 0x02, 0x02 }, - /* 53b */ { 0x02, 0x02 }, - /* 53c */ { 0x02, 0x02 }, - /* 53d */ { 0x02, 0x02 }, - /* 53e */ { 0x02, 0x02 }, - /* 53f */ { 0x02, 0x02 }, - /* 540 */ { 0x02, 0x02 }, - /* 541 */ { 0x02, 0x02 }, - /* 542 */ { 0x02, 0x02 }, - /* 543 */ { 0x02, 0x02 }, - /* 544 */ { 0x02, 0x02 }, - /* 545 */ { 0x02, 0x02 }, - /* 546 */ { 0x02, 0x02 }, - /* 547 */ { 0x02, 0x02 }, - /* 548 */ { 0x02, 0x02 }, - /* 549 */ { 0x02, 0x02 }, - /* 54a */ { 0x02, 0x02 }, - /* 54b */ { 0x02, 0x02 }, - /* 54c */ { 0x02, 0x02 }, - /* 54d */ { 0x02, 0x02 }, - /* 54e */ { 0x02, 0x02 }, - /* 54f */ { 0x02, 0x02 }, - /* 550 */ { 0x02, 0x02 }, - /* 551 */ { 0x02, 0x02 }, - /* 552 */ { 0x02, 0x02 }, - /* 553 */ { 0x02, 0x02 }, - /* 554 */ { 0x02, 0x02 }, - /* 555 */ { 0x02, 0x02 }, - /* 556 */ { 0x02, 0x02 }, - /* 557 */ { 0x02, 0x02 }, - /* 558 */ { 0x02, 0x02 }, - /* 559 */ { 0x02, 0x02 }, - /* 55a */ { 0x02, 0x02 }, - /* 55b */ { 0x02, 0x02 }, - /* 55c */ { 0x02, 0x02 }, - /* 55d */ { 0x02, 0x02 }, - /* 55e */ { 0x02, 0x02 }, - /* 55f */ { 0x02, 0x02 }, - /* 560 */ { 0x02, 0x02 }, - /* 561 */ { 0x02, 0x02 }, - /* 562 */ { 0x02, 0x02 }, - /* 563 */ { 0x02, 0x02 }, - /* 564 */ { 0x02, 0x02 }, - /* 565 */ { 0x02, 0x02 }, - /* 566 */ { 0x02, 0x02 }, - /* 567 */ { 0x02, 0x02 }, - /* 568 */ { 0x02, 0x02 }, - /* 569 */ { 0x02, 0x02 }, - /* 56a */ { 0x02, 0x02 }, - /* 56b */ { 0x02, 0x02 }, - /* 56c */ { 0x02, 0x02 }, - /* 56d */ { 0x02, 0x02 }, - /* 56e */ { 0x02, 0x02 }, - /* 56f */ { 0x02, 0x02 }, - /* 570 */ { 0x02, 0x02 }, - /* 571 */ { 0x02, 0x02 }, - /* 572 */ { 0x02, 0x02 }, - /* 573 */ { 0x02, 0x02 }, - /* 574 */ { 0x02, 0x02 }, - /* 575 */ { 0x02, 0x02 }, - /* 576 */ { 0x02, 0x02 }, - /* 577 */ { 0x02, 0x02 }, - /* 578 */ { 0x02, 0x02 }, - /* 579 */ { 0x02, 0x02 }, - /* 57a */ { 0x02, 0x02 }, - /* 57b */ { 0x02, 0x02 }, - /* 57c */ { 0x02, 0x02 }, - /* 57d */ { 0x02, 0x02 }, - /* 57e */ { 0x02, 0x02 }, - /* 57f */ { 0x02, 0x02 }, - /* 580 */ { 0x02, 0x02 }, - /* 581 */ { 0x02, 0x02 }, - /* 582 */ { 0x02, 0x02 }, - /* 583 */ { 0x02, 0x02 }, - /* 584 */ { 0x02, 0x02 }, - /* 585 */ { 0x02, 0x02 }, - /* 586 */ { 0x02, 0x02 }, - /* 587 */ { 0x02, 0x02 }, - /* 588 */ { 0x02, 0x02 }, - /* 589 */ { 0x02, 0x02 }, - /* 58a */ { 0x02, 0x02 }, - /* 58b */ { 0x02, 0x02 }, - /* 58c */ { 0x02, 0x02 }, - /* 58d */ { 0x02, 0x02 }, - /* 58e */ { 0x02, 0x02 }, - /* 58f */ { 0x02, 0x02 }, - /* 590 */ { 0x02, 0x02 }, - /* 591 */ { 0x02, 0x02 }, - /* 592 */ { 0x02, 0x02 }, - /* 593 */ { 0x02, 0x02 }, - /* 594 */ { 0x02, 0x02 }, - /* 595 */ { 0x02, 0x02 }, - /* 596 */ { 0x02, 0x02 }, - /* 597 */ { 0x02, 0x02 }, - /* 598 */ { 0x02, 0x02 }, - /* 599 */ { 0x02, 0x02 }, - /* 59a */ { 0x02, 0x02 }, - /* 59b */ { 0x02, 0x02 }, - /* 59c */ { 0x02, 0x02 }, - /* 59d */ { 0x02, 0x02 }, - /* 59e */ { 0x02, 0x02 }, - /* 59f */ { 0x02, 0x02 }, - /* 5a0 */ { 0x02, 0x02 }, - /* 5a1 */ { 0x02, 0x02 }, - /* 5a2 */ { 0x02, 0x02 }, - /* 5a3 */ { 0x02, 0x02 }, - /* 5a4 */ { 0x02, 0x02 }, - /* 5a5 */ { 0x02, 0x02 }, - /* 5a6 */ { 0x02, 0x02 }, - /* 5a7 */ { 0x02, 0x02 }, - /* 5a8 */ { 0x02, 0x02 }, - /* 5a9 */ { 0x02, 0x02 }, - /* 5aa */ { 0x02, 0x02 }, - /* 5ab */ { 0x02, 0x02 }, - /* 5ac */ { 0x02, 0x02 }, - /* 5ad */ { 0x02, 0x02 }, - /* 5ae */ { 0x02, 0x02 }, - /* 5af */ { 0x02, 0x02 }, - /* 5b0 */ { 0x02, 0x02 }, - /* 5b1 */ { 0x02, 0x02 }, - /* 5b2 */ { 0x02, 0x02 }, - /* 5b3 */ { 0x02, 0x02 }, - /* 5b4 */ { 0x02, 0x02 }, - /* 5b5 */ { 0x02, 0x02 }, - /* 5b6 */ { 0x02, 0x02 }, - /* 5b7 */ { 0x02, 0x02 }, - /* 5b8 */ { 0x02, 0x02 }, - /* 5b9 */ { 0x02, 0x02 }, - /* 5ba */ { 0x02, 0x02 }, - /* 5bb */ { 0x02, 0x02 }, - /* 5bc */ { 0x02, 0x02 }, - /* 5bd */ { 0x02, 0x02 }, - /* 5be */ { 0x02, 0x02 }, - /* 5bf */ { 0x02, 0x02 }, - /* 5c0 */ { 0x02, 0x02 }, - /* 5c1 */ { 0x02, 0x02 }, - /* 5c2 */ { 0x02, 0x02 }, - /* 5c3 */ { 0x02, 0x02 }, - /* 5c4 */ { 0x02, 0x02 }, - /* 5c5 */ { 0x02, 0x02 }, - /* 5c6 */ { 0x02, 0x02 }, - /* 5c7 */ { 0x02, 0x02 }, - /* 5c8 */ { 0x02, 0x02 }, - /* 5c9 */ { 0x02, 0x02 }, - /* 5ca */ { 0x02, 0x02 }, - /* 5cb */ { 0x02, 0x02 }, - /* 5cc */ { 0x02, 0x02 }, - /* 5cd */ { 0x02, 0x02 }, - /* 5ce */ { 0x02, 0x02 }, - /* 5cf */ { 0x02, 0x02 }, - /* 5d0 */ { 0x02, 0x02 }, - /* 5d1 */ { 0x02, 0x02 }, - /* 5d2 */ { 0x02, 0x02 }, - /* 5d3 */ { 0x02, 0x02 }, - /* 5d4 */ { 0x02, 0x02 }, - /* 5d5 */ { 0x02, 0x02 }, - /* 5d6 */ { 0x02, 0x02 }, - /* 5d7 */ { 0x02, 0x02 }, - /* 5d8 */ { 0x02, 0x02 }, - /* 5d9 */ { 0x02, 0x02 }, - /* 5da */ { 0x02, 0x02 }, - /* 5db */ { 0x02, 0x02 }, - /* 5dc */ { 0x02, 0x02 }, - /* 5dd */ { 0x02, 0x02 }, - /* 5de */ { 0x02, 0x02 }, - /* 5df */ { 0x02, 0x02 }, - /* 5e0 */ { 0x02, 0x02 }, - /* 5e1 */ { 0x02, 0x02 }, - /* 5e2 */ { 0x02, 0x02 }, - /* 5e3 */ { 0x02, 0x02 }, - /* 5e4 */ { 0x02, 0x02 }, - /* 5e5 */ { 0x02, 0x02 }, - /* 5e6 */ { 0x02, 0x02 }, - /* 5e7 */ { 0x02, 0x02 }, - /* 5e8 */ { 0x02, 0x02 }, - /* 5e9 */ { 0x02, 0x02 }, - /* 5ea */ { 0x02, 0x02 }, - /* 5eb */ { 0x02, 0x02 }, - /* 5ec */ { 0x02, 0x02 }, - /* 5ed */ { 0x02, 0x02 }, - /* 5ee */ { 0x02, 0x02 }, - /* 5ef */ { 0x02, 0x02 }, - /* 5f0 */ { 0x02, 0x02 }, - /* 5f1 */ { 0x02, 0x02 }, - /* 5f2 */ { 0x02, 0x02 }, - /* 5f3 */ { 0x02, 0x02 }, - /* 5f4 */ { 0x02, 0x02 }, - /* 5f5 */ { 0x02, 0x02 }, - /* 5f6 */ { 0x02, 0x02 }, - /* 5f7 */ { 0x02, 0x02 }, - /* 5f8 */ { 0x02, 0x02 }, - /* 5f9 */ { 0x02, 0x02 }, - /* 5fa */ { 0x02, 0x02 }, - /* 5fb */ { 0x02, 0x02 }, - /* 5fc */ { 0x02, 0x02 }, - /* 5fd */ { 0x02, 0x02 }, - /* 5fe */ { 0x02, 0x02 }, - /* 5ff */ { 0x02, 0x02 }, - /* 600 */ { 0x02, 0x02 }, - /* 601 */ { 0x02, 0x02 }, - /* 602 */ { 0x02, 0x02 }, - /* 603 */ { 0x02, 0x02 }, - /* 604 */ { 0x02, 0x02 }, - /* 605 */ { 0x02, 0x02 }, - /* 606 */ { 0x02, 0x02 }, - /* 607 */ { 0x02, 0x02 }, - /* 608 */ { 0x02, 0x02 }, - /* 609 */ { 0x02, 0x02 }, - /* 60a */ { 0x02, 0x02 }, - /* 60b */ { 0x02, 0x02 }, - /* 60c */ { 0x02, 0x02 }, - /* 60d */ { 0x02, 0x02 }, - /* 60e */ { 0x02, 0x02 }, - /* 60f */ { 0x02, 0x02 }, - /* 610 */ { 0x02, 0x02 }, - /* 611 */ { 0x02, 0x02 }, - /* 612 */ { 0x02, 0x02 }, - /* 613 */ { 0x02, 0x02 }, - /* 614 */ { 0x02, 0x02 }, - /* 615 */ { 0x02, 0x02 }, - /* 616 */ { 0x02, 0x02 }, - /* 617 */ { 0x02, 0x02 }, - /* 618 */ { 0x02, 0x02 }, - /* 619 */ { 0x02, 0x02 }, - /* 61a */ { 0x02, 0x02 }, - /* 61b */ { 0x02, 0x02 }, - /* 61c */ { 0x02, 0x02 }, - /* 61d */ { 0x02, 0x02 }, - /* 61e */ { 0x02, 0x02 }, - /* 61f */ { 0x02, 0x02 }, - /* 620 */ { 0x02, 0x02 }, - /* 621 */ { 0x02, 0x02 }, - /* 622 */ { 0x02, 0x02 }, - /* 623 */ { 0x02, 0x02 }, - /* 624 */ { 0x02, 0x02 }, - /* 625 */ { 0x02, 0x02 }, - /* 626 */ { 0x02, 0x02 }, - /* 627 */ { 0x02, 0x02 }, - /* 628 */ { 0x02, 0x02 }, - /* 629 */ { 0x02, 0x02 }, - /* 62a */ { 0x02, 0x02 }, - /* 62b */ { 0x02, 0x02 }, - /* 62c */ { 0x02, 0x02 }, - /* 62d */ { 0x02, 0x02 }, - /* 62e */ { 0x02, 0x02 }, - /* 62f */ { 0x02, 0x02 }, - /* 630 */ { 0x02, 0x02 }, - /* 631 */ { 0x02, 0x02 }, - /* 632 */ { 0x02, 0x02 }, - /* 633 */ { 0x02, 0x02 }, - /* 634 */ { 0x02, 0x02 }, - /* 635 */ { 0x02, 0x02 }, - /* 636 */ { 0x02, 0x02 }, - /* 637 */ { 0x02, 0x02 }, - /* 638 */ { 0x02, 0x02 }, - /* 639 */ { 0x02, 0x02 }, - /* 63a */ { 0x02, 0x02 }, - /* 63b */ { 0x02, 0x02 }, - /* 63c */ { 0x02, 0x02 }, - /* 63d */ { 0x02, 0x02 }, - /* 63e */ { 0x02, 0x02 }, - /* 63f */ { 0x02, 0x02 }, - /* 640 */ { 0x02, 0x02 }, - /* 641 */ { 0x02, 0x02 }, - /* 642 */ { 0x02, 0x02 }, - /* 643 */ { 0x02, 0x02 }, - /* 644 */ { 0x02, 0x02 }, - /* 645 */ { 0x02, 0x02 }, - /* 646 */ { 0x02, 0x02 }, - /* 647 */ { 0x02, 0x02 }, - /* 648 */ { 0x02, 0x02 }, - /* 649 */ { 0x02, 0x02 }, - /* 64a */ { 0x02, 0x02 }, - /* 64b */ { 0x02, 0x02 }, - /* 64c */ { 0x02, 0x02 }, - /* 64d */ { 0x02, 0x02 }, - /* 64e */ { 0x02, 0x02 }, - /* 64f */ { 0x02, 0x02 }, - /* 650 */ { 0x02, 0x02 }, - /* 651 */ { 0x02, 0x02 }, - /* 652 */ { 0x02, 0x02 }, - /* 653 */ { 0x02, 0x02 }, - /* 654 */ { 0x02, 0x02 }, - /* 655 */ { 0x02, 0x02 }, - /* 656 */ { 0x02, 0x02 }, - /* 657 */ { 0x02, 0x02 }, - /* 658 */ { 0x02, 0x02 }, - /* 659 */ { 0x02, 0x02 }, - /* 65a */ { 0x02, 0x02 }, - /* 65b */ { 0x02, 0x02 }, - /* 65c */ { 0x02, 0x02 }, - /* 65d */ { 0x02, 0x02 }, - /* 65e */ { 0x02, 0x02 }, - /* 65f */ { 0x02, 0x02 }, - /* 660 */ { 0x02, 0x02 }, - /* 661 */ { 0x02, 0x02 }, - /* 662 */ { 0x02, 0x02 }, - /* 663 */ { 0x02, 0x02 }, - /* 664 */ { 0x02, 0x02 }, - /* 665 */ { 0x02, 0x02 }, - /* 666 */ { 0x02, 0x02 }, - /* 667 */ { 0x02, 0x02 }, - /* 668 */ { 0x02, 0x02 }, - /* 669 */ { 0x02, 0x02 }, - /* 66a */ { 0x02, 0x02 }, - /* 66b */ { 0x02, 0x02 }, - /* 66c */ { 0x02, 0x02 }, - /* 66d */ { 0x02, 0x02 }, - /* 66e */ { 0x02, 0x02 }, - /* 66f */ { 0x02, 0x02 }, - /* 670 */ { 0x02, 0x02 }, - /* 671 */ { 0x02, 0x02 }, - /* 672 */ { 0x02, 0x02 }, - /* 673 */ { 0x02, 0x02 }, - /* 674 */ { 0x02, 0x02 }, - /* 675 */ { 0x02, 0x02 }, - /* 676 */ { 0x02, 0x02 }, - /* 677 */ { 0x02, 0x02 }, - /* 678 */ { 0x02, 0x02 }, - /* 679 */ { 0x02, 0x02 }, - /* 67a */ { 0x02, 0x02 }, - /* 67b */ { 0x02, 0x02 }, - /* 67c */ { 0x02, 0x02 }, - /* 67d */ { 0x02, 0x02 }, - /* 67e */ { 0x02, 0x02 }, - /* 67f */ { 0x02, 0x02 }, - /* 680 */ { 0x02, 0x02 }, - /* 681 */ { 0x02, 0x02 }, - /* 682 */ { 0x02, 0x02 }, - /* 683 */ { 0x02, 0x02 }, - /* 684 */ { 0x02, 0x02 }, - /* 685 */ { 0x02, 0x02 }, - /* 686 */ { 0x02, 0x02 }, - /* 687 */ { 0x02, 0x02 }, - /* 688 */ { 0x02, 0x02 }, - /* 689 */ { 0x02, 0x02 }, - /* 68a */ { 0x02, 0x02 }, - /* 68b */ { 0x02, 0x02 }, - /* 68c */ { 0x02, 0x02 }, - /* 68d */ { 0x02, 0x02 }, - /* 68e */ { 0x02, 0x02 }, - /* 68f */ { 0x02, 0x02 }, - /* 690 */ { 0x02, 0x02 }, - /* 691 */ { 0x02, 0x02 }, - /* 692 */ { 0x02, 0x02 }, - /* 693 */ { 0x02, 0x02 }, - /* 694 */ { 0x02, 0x02 }, - /* 695 */ { 0x02, 0x02 }, - /* 696 */ { 0x02, 0x02 }, - /* 697 */ { 0x02, 0x02 }, - /* 698 */ { 0x02, 0x02 }, - /* 699 */ { 0x02, 0x02 }, - /* 69a */ { 0x02, 0x02 }, - /* 69b */ { 0x02, 0x02 }, - /* 69c */ { 0x02, 0x02 }, - /* 69d */ { 0x02, 0x02 }, - /* 69e */ { 0x02, 0x02 }, - /* 69f */ { 0x02, 0x02 }, - /* 6a0 */ { 0x02, 0x02 }, - /* 6a1 */ { 0x02, 0x02 }, - /* 6a2 */ { 0x02, 0x02 }, - /* 6a3 */ { 0x02, 0x02 }, - /* 6a4 */ { 0x02, 0x02 }, - /* 6a5 */ { 0x02, 0x02 }, - /* 6a6 */ { 0x02, 0x02 }, - /* 6a7 */ { 0x02, 0x02 }, - /* 6a8 */ { 0x02, 0x02 }, - /* 6a9 */ { 0x02, 0x02 }, - /* 6aa */ { 0x02, 0x02 }, - /* 6ab */ { 0x02, 0x02 }, - /* 6ac */ { 0x02, 0x02 }, - /* 6ad */ { 0x02, 0x02 }, - /* 6ae */ { 0x02, 0x02 }, - /* 6af */ { 0x02, 0x02 }, - /* 6b0 */ { 0x02, 0x02 }, - /* 6b1 */ { 0x02, 0x02 }, - /* 6b2 */ { 0x02, 0x02 }, - /* 6b3 */ { 0x02, 0x02 }, - /* 6b4 */ { 0x02, 0x02 }, - /* 6b5 */ { 0x02, 0x02 }, - /* 6b6 */ { 0x02, 0x02 }, - /* 6b7 */ { 0x02, 0x02 }, - /* 6b8 */ { 0x02, 0x02 }, - /* 6b9 */ { 0x02, 0x02 }, - /* 6ba */ { 0x02, 0x02 }, - /* 6bb */ { 0x02, 0x02 }, - /* 6bc */ { 0x02, 0x02 }, - /* 6bd */ { 0x02, 0x02 }, - /* 6be */ { 0x02, 0x02 }, - /* 6bf */ { 0x02, 0x02 }, - /* 6c0 */ { 0x02, 0x02 }, - /* 6c1 */ { 0x02, 0x02 }, - /* 6c2 */ { 0x02, 0x02 }, - /* 6c3 */ { 0x02, 0x02 }, - /* 6c4 */ { 0x02, 0x02 }, - /* 6c5 */ { 0x02, 0x02 }, - /* 6c6 */ { 0x02, 0x02 }, - /* 6c7 */ { 0x02, 0x02 }, - /* 6c8 */ { 0x02, 0x02 }, - /* 6c9 */ { 0x02, 0x02 }, - /* 6ca */ { 0x02, 0x02 }, - /* 6cb */ { 0x02, 0x02 }, - /* 6cc */ { 0x02, 0x02 }, - /* 6cd */ { 0x02, 0x02 }, - /* 6ce */ { 0x02, 0x02 }, - /* 6cf */ { 0x02, 0x02 }, - /* 6d0 */ { 0x02, 0x02 }, - /* 6d1 */ { 0x02, 0x02 }, - /* 6d2 */ { 0x02, 0x02 }, - /* 6d3 */ { 0x02, 0x02 }, - /* 6d4 */ { 0x02, 0x02 }, - /* 6d5 */ { 0x02, 0x02 }, - /* 6d6 */ { 0x02, 0x02 }, - /* 6d7 */ { 0x02, 0x02 }, - /* 6d8 */ { 0x02, 0x02 }, - /* 6d9 */ { 0x02, 0x02 }, - /* 6da */ { 0x02, 0x02 }, - /* 6db */ { 0x02, 0x02 }, - /* 6dc */ { 0x02, 0x02 }, - /* 6dd */ { 0x02, 0x02 }, - /* 6de */ { 0x02, 0x02 }, - /* 6df */ { 0x02, 0x02 }, - /* 6e0 */ { 0x02, 0x02 }, - /* 6e1 */ { 0x02, 0x02 }, - /* 6e2 */ { 0x02, 0x02 }, - /* 6e3 */ { 0x02, 0x02 }, - /* 6e4 */ { 0x02, 0x02 }, - /* 6e5 */ { 0x02, 0x02 }, - /* 6e6 */ { 0x02, 0x02 }, - /* 6e7 */ { 0x02, 0x02 }, - /* 6e8 */ { 0x02, 0x02 }, - /* 6e9 */ { 0x02, 0x02 }, - /* 6ea */ { 0x02, 0x02 }, - /* 6eb */ { 0x02, 0x02 }, - /* 6ec */ { 0x02, 0x02 }, - /* 6ed */ { 0x02, 0x02 }, - /* 6ee */ { 0x02, 0x02 }, - /* 6ef */ { 0x02, 0x02 }, - /* 6f0 */ { 0x02, 0x02 }, - /* 6f1 */ { 0x02, 0x02 }, - /* 6f2 */ { 0x02, 0x02 }, - /* 6f3 */ { 0x02, 0x02 }, - /* 6f4 */ { 0x02, 0x02 }, - /* 6f5 */ { 0x02, 0x02 }, - /* 6f6 */ { 0x02, 0x02 }, - /* 6f7 */ { 0x02, 0x02 }, - /* 6f8 */ { 0x02, 0x02 }, - /* 6f9 */ { 0x02, 0x02 }, - /* 6fa */ { 0x02, 0x02 }, - /* 6fb */ { 0x02, 0x02 }, - /* 6fc */ { 0x02, 0x02 }, - /* 6fd */ { 0x02, 0x02 }, - /* 6fe */ { 0x02, 0x02 }, - /* 6ff */ { 0x02, 0x02 }, - /* 700 */ { 0x02, 0x02 }, - /* 701 */ { 0x02, 0x02 }, - /* 702 */ { 0x02, 0x02 }, - /* 703 */ { 0x02, 0x02 }, - /* 704 */ { 0x02, 0x02 }, - /* 705 */ { 0x02, 0x02 }, - /* 706 */ { 0x02, 0x02 }, - /* 707 */ { 0x02, 0x02 }, - /* 708 */ { 0x02, 0x02 }, - /* 709 */ { 0x02, 0x02 }, - /* 70a */ { 0x02, 0x02 }, - /* 70b */ { 0x02, 0x02 }, - /* 70c */ { 0x02, 0x02 }, - /* 70d */ { 0x02, 0x02 }, - /* 70e */ { 0x02, 0x02 }, - /* 70f */ { 0x02, 0x02 }, - /* 710 */ { 0x02, 0x02 }, - /* 711 */ { 0x02, 0x02 }, - /* 712 */ { 0x02, 0x02 }, - /* 713 */ { 0x02, 0x02 }, - /* 714 */ { 0x02, 0x02 }, - /* 715 */ { 0x02, 0x02 }, - /* 716 */ { 0x02, 0x02 }, - /* 717 */ { 0x02, 0x02 }, - /* 718 */ { 0x02, 0x02 }, - /* 719 */ { 0x02, 0x02 }, - /* 71a */ { 0x02, 0x02 }, - /* 71b */ { 0x02, 0x02 }, - /* 71c */ { 0x02, 0x02 }, - /* 71d */ { 0x02, 0x02 }, - /* 71e */ { 0x02, 0x02 }, - /* 71f */ { 0x02, 0x02 }, - /* 720 */ { 0x02, 0x02 }, - /* 721 */ { 0x02, 0x02 }, - /* 722 */ { 0x02, 0x02 }, - /* 723 */ { 0x02, 0x02 }, - /* 724 */ { 0x02, 0x02 }, - /* 725 */ { 0x02, 0x02 }, - /* 726 */ { 0x02, 0x02 }, - /* 727 */ { 0x02, 0x02 }, - /* 728 */ { 0x02, 0x02 }, - /* 729 */ { 0x02, 0x02 }, - /* 72a */ { 0x02, 0x02 }, - /* 72b */ { 0x02, 0x02 }, - /* 72c */ { 0x02, 0x02 }, - /* 72d */ { 0x02, 0x02 }, - /* 72e */ { 0x02, 0x02 }, - /* 72f */ { 0x02, 0x02 }, - /* 730 */ { 0x02, 0x02 }, - /* 731 */ { 0x02, 0x02 }, - /* 732 */ { 0x02, 0x02 }, - /* 733 */ { 0x02, 0x02 }, - /* 734 */ { 0x02, 0x02 }, - /* 735 */ { 0x02, 0x02 }, - /* 736 */ { 0x02, 0x02 }, - /* 737 */ { 0x02, 0x02 }, - /* 738 */ { 0x02, 0x02 }, - /* 739 */ { 0x02, 0x02 }, - /* 73a */ { 0x02, 0x02 }, - /* 73b */ { 0x02, 0x02 }, - /* 73c */ { 0x02, 0x02 }, - /* 73d */ { 0x02, 0x02 }, - /* 73e */ { 0x02, 0x02 }, - /* 73f */ { 0x02, 0x02 }, - /* 740 */ { 0x02, 0x02 }, - /* 741 */ { 0x02, 0x02 }, - /* 742 */ { 0x02, 0x02 }, - /* 743 */ { 0x02, 0x02 }, - /* 744 */ { 0x02, 0x02 }, - /* 745 */ { 0x02, 0x02 }, - /* 746 */ { 0x02, 0x02 }, - /* 747 */ { 0x02, 0x02 }, - /* 748 */ { 0x02, 0x02 }, - /* 749 */ { 0x02, 0x02 }, - /* 74a */ { 0x02, 0x02 }, - /* 74b */ { 0x02, 0x02 }, - /* 74c */ { 0x02, 0x02 }, - /* 74d */ { 0x02, 0x02 }, - /* 74e */ { 0x02, 0x02 }, - /* 74f */ { 0x02, 0x02 }, - /* 750 */ { 0x02, 0x02 }, - /* 751 */ { 0x02, 0x02 }, - /* 752 */ { 0x02, 0x02 }, - /* 753 */ { 0x02, 0x02 }, - /* 754 */ { 0x02, 0x02 }, - /* 755 */ { 0x02, 0x02 }, - /* 756 */ { 0x02, 0x02 }, - /* 757 */ { 0x02, 0x02 }, - /* 758 */ { 0x02, 0x02 }, - /* 759 */ { 0x02, 0x02 }, - /* 75a */ { 0x02, 0x02 }, - /* 75b */ { 0x02, 0x02 }, - /* 75c */ { 0x02, 0x02 }, - /* 75d */ { 0x02, 0x02 }, - /* 75e */ { 0x02, 0x02 }, - /* 75f */ { 0x02, 0x02 }, - /* 760 */ { 0x02, 0x02 }, - /* 761 */ { 0x02, 0x02 }, - /* 762 */ { 0x02, 0x02 }, - /* 763 */ { 0x02, 0x02 }, - /* 764 */ { 0x02, 0x02 }, - /* 765 */ { 0x02, 0x02 }, - /* 766 */ { 0x02, 0x02 }, - /* 767 */ { 0x02, 0x02 }, - /* 768 */ { 0x02, 0x02 }, - /* 769 */ { 0x02, 0x02 }, - /* 76a */ { 0x02, 0x02 }, - /* 76b */ { 0x02, 0x02 }, - /* 76c */ { 0x02, 0x02 }, - /* 76d */ { 0x02, 0x02 }, - /* 76e */ { 0x02, 0x02 }, - /* 76f */ { 0x02, 0x02 }, - /* 770 */ { 0x02, 0x02 }, - /* 771 */ { 0x02, 0x02 }, - /* 772 */ { 0x02, 0x02 }, - /* 773 */ { 0x02, 0x02 }, - /* 774 */ { 0x02, 0x02 }, - /* 775 */ { 0x02, 0x02 }, - /* 776 */ { 0x02, 0x02 }, - /* 777 */ { 0x02, 0x02 }, - /* 778 */ { 0x02, 0x02 }, - /* 779 */ { 0x02, 0x02 }, - /* 77a */ { 0x02, 0x02 }, - /* 77b */ { 0x02, 0x02 }, - /* 77c */ { 0x02, 0x02 }, - /* 77d */ { 0x02, 0x02 }, - /* 77e */ { 0x02, 0x02 }, - /* 77f */ { 0x02, 0x02 }, - /* 780 */ { 0x02, 0x02 }, - /* 781 */ { 0x02, 0x02 }, - /* 782 */ { 0x02, 0x02 }, - /* 783 */ { 0x02, 0x02 }, - /* 784 */ { 0x02, 0x02 }, - /* 785 */ { 0x02, 0x02 }, - /* 786 */ { 0x02, 0x02 }, - /* 787 */ { 0x02, 0x02 }, - /* 788 */ { 0x02, 0x02 }, - /* 789 */ { 0x02, 0x02 }, - /* 78a */ { 0x02, 0x02 }, - /* 78b */ { 0x02, 0x02 }, - /* 78c */ { 0x02, 0x02 }, - /* 78d */ { 0x02, 0x02 }, - /* 78e */ { 0x02, 0x02 }, - /* 78f */ { 0x02, 0x02 }, - /* 790 */ { 0x02, 0x02 }, - /* 791 */ { 0x02, 0x02 }, - /* 792 */ { 0x02, 0x02 }, - /* 793 */ { 0x02, 0x02 }, - /* 794 */ { 0x02, 0x02 }, - /* 795 */ { 0x02, 0x02 }, - /* 796 */ { 0x02, 0x02 }, - /* 797 */ { 0x02, 0x02 }, - /* 798 */ { 0x02, 0x02 }, - /* 799 */ { 0x02, 0x02 }, - /* 79a */ { 0x02, 0x02 }, - /* 79b */ { 0x02, 0x02 }, - /* 79c */ { 0x02, 0x02 }, - /* 79d */ { 0x02, 0x02 }, - /* 79e */ { 0x02, 0x02 }, - /* 79f */ { 0x02, 0x02 }, - /* 7a0 */ { 0x02, 0x02 }, - /* 7a1 */ { 0x02, 0x02 }, - /* 7a2 */ { 0x02, 0x02 }, - /* 7a3 */ { 0x02, 0x02 }, - /* 7a4 */ { 0x02, 0x02 }, - /* 7a5 */ { 0x02, 0x02 }, - /* 7a6 */ { 0x02, 0x02 }, - /* 7a7 */ { 0x02, 0x02 }, - /* 7a8 */ { 0x02, 0x02 }, - /* 7a9 */ { 0x02, 0x02 }, - /* 7aa */ { 0x02, 0x02 }, - /* 7ab */ { 0x02, 0x02 }, - /* 7ac */ { 0x02, 0x02 }, - /* 7ad */ { 0x02, 0x02 }, - /* 7ae */ { 0x02, 0x02 }, - /* 7af */ { 0x02, 0x02 }, - /* 7b0 */ { 0x02, 0x02 }, - /* 7b1 */ { 0x02, 0x02 }, - /* 7b2 */ { 0x02, 0x02 }, - /* 7b3 */ { 0x02, 0x02 }, - /* 7b4 */ { 0x02, 0x02 }, - /* 7b5 */ { 0x02, 0x02 }, - /* 7b6 */ { 0x02, 0x02 }, - /* 7b7 */ { 0x02, 0x02 }, - /* 7b8 */ { 0x02, 0x02 }, - /* 7b9 */ { 0x02, 0x02 }, - /* 7ba */ { 0x02, 0x02 }, - /* 7bb */ { 0x02, 0x02 }, - /* 7bc */ { 0x02, 0x02 }, - /* 7bd */ { 0x02, 0x02 }, - /* 7be */ { 0x02, 0x02 }, - /* 7bf */ { 0x02, 0x02 }, - /* 7c0 */ { 0x02, 0x02 }, - /* 7c1 */ { 0x02, 0x02 }, - /* 7c2 */ { 0x02, 0x02 }, - /* 7c3 */ { 0x02, 0x02 }, - /* 7c4 */ { 0x02, 0x02 }, - /* 7c5 */ { 0x02, 0x02 }, - /* 7c6 */ { 0x02, 0x02 }, - /* 7c7 */ { 0x02, 0x02 }, - /* 7c8 */ { 0x02, 0x02 }, - /* 7c9 */ { 0x02, 0x02 }, - /* 7ca */ { 0x02, 0x02 }, - /* 7cb */ { 0x02, 0x02 }, - /* 7cc */ { 0x02, 0x02 }, - /* 7cd */ { 0x02, 0x02 }, - /* 7ce */ { 0x02, 0x02 }, - /* 7cf */ { 0x02, 0x02 }, - /* 7d0 */ { 0x02, 0x02 }, - /* 7d1 */ { 0x02, 0x02 }, - /* 7d2 */ { 0x02, 0x02 }, - /* 7d3 */ { 0x02, 0x02 }, - /* 7d4 */ { 0x02, 0x02 }, - /* 7d5 */ { 0x02, 0x02 }, - /* 7d6 */ { 0x02, 0x02 }, - /* 7d7 */ { 0x02, 0x02 }, - /* 7d8 */ { 0x02, 0x02 }, - /* 7d9 */ { 0x02, 0x02 }, - /* 7da */ { 0x02, 0x02 }, - /* 7db */ { 0x02, 0x02 }, - /* 7dc */ { 0x02, 0x02 }, - /* 7dd */ { 0x02, 0x02 }, - /* 7de */ { 0x02, 0x02 }, - /* 7df */ { 0x02, 0x02 }, - /* 7e0 */ { 0x02, 0x02 }, - /* 7e1 */ { 0x02, 0x02 }, - /* 7e2 */ { 0x02, 0x02 }, - /* 7e3 */ { 0x02, 0x02 }, - /* 7e4 */ { 0x02, 0x02 }, - /* 7e5 */ { 0x02, 0x02 }, - /* 7e6 */ { 0x02, 0x02 }, - /* 7e7 */ { 0x02, 0x02 }, - /* 7e8 */ { 0x02, 0x02 }, - /* 7e9 */ { 0x02, 0x02 }, - /* 7ea */ { 0x02, 0x02 }, - /* 7eb */ { 0x02, 0x02 }, - /* 7ec */ { 0x02, 0x02 }, - /* 7ed */ { 0x02, 0x02 }, - /* 7ee */ { 0x02, 0x02 }, - /* 7ef */ { 0x02, 0x02 }, - /* 7f0 */ { 0x02, 0x02 }, - /* 7f1 */ { 0x02, 0x02 }, - /* 7f2 */ { 0x02, 0x02 }, - /* 7f3 */ { 0x02, 0x02 }, - /* 7f4 */ { 0x02, 0x02 }, - /* 7f5 */ { 0x02, 0x02 }, - /* 7f6 */ { 0x02, 0x02 }, - /* 7f7 */ { 0x02, 0x02 }, - /* 7f8 */ { 0x02, 0x02 }, - /* 7f9 */ { 0x02, 0x02 }, - /* 7fa */ { 0x02, 0x02 }, - /* 7fb */ { 0x02, 0x02 }, - /* 7fc */ { 0x02, 0x02 }, - /* 7fd */ { 0x02, 0x02 }, - /* 7fe */ { 0x02, 0x02 }, - /* 7ff */ { 0x02, 0x02 }, - /* 800 */ { 0x11, 0x03 }, - /* 801 */ { 0x11, 0x03 }, - /* 802 */ { 0x11, 0x03 }, - /* 803 */ { 0x11, 0x03 }, - /* 804 */ { 0x11, 0x03 }, - /* 805 */ { 0x11, 0x03 }, - /* 806 */ { 0x11, 0x03 }, - /* 807 */ { 0x11, 0x03 }, - /* 808 */ { 0x11, 0x03 }, - /* 809 */ { 0x11, 0x03 }, - /* 80a */ { 0x11, 0x03 }, - /* 80b */ { 0x11, 0x03 }, - /* 80c */ { 0x11, 0x03 }, - /* 80d */ { 0x11, 0x03 }, - /* 80e */ { 0x11, 0x03 }, - /* 80f */ { 0x11, 0x03 }, - /* 810 */ { 0x11, 0x03 }, - /* 811 */ { 0x11, 0x03 }, - /* 812 */ { 0x11, 0x03 }, - /* 813 */ { 0x11, 0x03 }, - /* 814 */ { 0x11, 0x03 }, - /* 815 */ { 0x11, 0x03 }, - /* 816 */ { 0x11, 0x03 }, - /* 817 */ { 0x11, 0x03 }, - /* 818 */ { 0x11, 0x03 }, - /* 819 */ { 0x11, 0x03 }, - /* 81a */ { 0x11, 0x03 }, - /* 81b */ { 0x11, 0x03 }, - /* 81c */ { 0x11, 0x03 }, - /* 81d */ { 0x11, 0x03 }, - /* 81e */ { 0x11, 0x03 }, - /* 81f */ { 0x11, 0x03 }, - /* 820 */ { 0x11, 0x03 }, - /* 821 */ { 0x11, 0x03 }, - /* 822 */ { 0x11, 0x03 }, - /* 823 */ { 0x11, 0x03 }, - /* 824 */ { 0x11, 0x03 }, - /* 825 */ { 0x11, 0x03 }, - /* 826 */ { 0x11, 0x03 }, - /* 827 */ { 0x11, 0x03 }, - /* 828 */ { 0x11, 0x03 }, - /* 829 */ { 0x11, 0x03 }, - /* 82a */ { 0x11, 0x03 }, - /* 82b */ { 0x11, 0x03 }, - /* 82c */ { 0x11, 0x03 }, - /* 82d */ { 0x11, 0x03 }, - /* 82e */ { 0x11, 0x03 }, - /* 82f */ { 0x11, 0x03 }, - /* 830 */ { 0x11, 0x03 }, - /* 831 */ { 0x11, 0x03 }, - /* 832 */ { 0x11, 0x03 }, - /* 833 */ { 0x11, 0x03 }, - /* 834 */ { 0x11, 0x03 }, - /* 835 */ { 0x11, 0x03 }, - /* 836 */ { 0x11, 0x03 }, - /* 837 */ { 0x11, 0x03 }, - /* 838 */ { 0x11, 0x03 }, - /* 839 */ { 0x11, 0x03 }, - /* 83a */ { 0x11, 0x03 }, - /* 83b */ { 0x11, 0x03 }, - /* 83c */ { 0x11, 0x03 }, - /* 83d */ { 0x11, 0x03 }, - /* 83e */ { 0x11, 0x03 }, - /* 83f */ { 0x11, 0x03 }, - /* 840 */ { 0x11, 0x03 }, - /* 841 */ { 0x11, 0x03 }, - /* 842 */ { 0x11, 0x03 }, - /* 843 */ { 0x11, 0x03 }, - /* 844 */ { 0x11, 0x03 }, - /* 845 */ { 0x11, 0x03 }, - /* 846 */ { 0x11, 0x03 }, - /* 847 */ { 0x11, 0x03 }, - /* 848 */ { 0x11, 0x03 }, - /* 849 */ { 0x11, 0x03 }, - /* 84a */ { 0x11, 0x03 }, - /* 84b */ { 0x11, 0x03 }, - /* 84c */ { 0x11, 0x03 }, - /* 84d */ { 0x11, 0x03 }, - /* 84e */ { 0x11, 0x03 }, - /* 84f */ { 0x11, 0x03 }, - /* 850 */ { 0x11, 0x03 }, - /* 851 */ { 0x11, 0x03 }, - /* 852 */ { 0x11, 0x03 }, - /* 853 */ { 0x11, 0x03 }, - /* 854 */ { 0x11, 0x03 }, - /* 855 */ { 0x11, 0x03 }, - /* 856 */ { 0x11, 0x03 }, - /* 857 */ { 0x11, 0x03 }, - /* 858 */ { 0x11, 0x03 }, - /* 859 */ { 0x11, 0x03 }, - /* 85a */ { 0x11, 0x03 }, - /* 85b */ { 0x11, 0x03 }, - /* 85c */ { 0x11, 0x03 }, - /* 85d */ { 0x11, 0x03 }, - /* 85e */ { 0x11, 0x03 }, - /* 85f */ { 0x11, 0x03 }, - /* 860 */ { 0x11, 0x03 }, - /* 861 */ { 0x11, 0x03 }, - /* 862 */ { 0x11, 0x03 }, - /* 863 */ { 0x11, 0x03 }, - /* 864 */ { 0x11, 0x03 }, - /* 865 */ { 0x11, 0x03 }, - /* 866 */ { 0x11, 0x03 }, - /* 867 */ { 0x11, 0x03 }, - /* 868 */ { 0x11, 0x03 }, - /* 869 */ { 0x11, 0x03 }, - /* 86a */ { 0x11, 0x03 }, - /* 86b */ { 0x11, 0x03 }, - /* 86c */ { 0x11, 0x03 }, - /* 86d */ { 0x11, 0x03 }, - /* 86e */ { 0x11, 0x03 }, - /* 86f */ { 0x11, 0x03 }, - /* 870 */ { 0x11, 0x03 }, - /* 871 */ { 0x11, 0x03 }, - /* 872 */ { 0x11, 0x03 }, - /* 873 */ { 0x11, 0x03 }, - /* 874 */ { 0x11, 0x03 }, - /* 875 */ { 0x11, 0x03 }, - /* 876 */ { 0x11, 0x03 }, - /* 877 */ { 0x11, 0x03 }, - /* 878 */ { 0x11, 0x03 }, - /* 879 */ { 0x11, 0x03 }, - /* 87a */ { 0x11, 0x03 }, - /* 87b */ { 0x11, 0x03 }, - /* 87c */ { 0x11, 0x03 }, - /* 87d */ { 0x11, 0x03 }, - /* 87e */ { 0x11, 0x03 }, - /* 87f */ { 0x11, 0x03 }, - /* 880 */ { 0x11, 0x03 }, - /* 881 */ { 0x11, 0x03 }, - /* 882 */ { 0x11, 0x03 }, - /* 883 */ { 0x11, 0x03 }, - /* 884 */ { 0x11, 0x03 }, - /* 885 */ { 0x11, 0x03 }, - /* 886 */ { 0x11, 0x03 }, - /* 887 */ { 0x11, 0x03 }, - /* 888 */ { 0x11, 0x03 }, - /* 889 */ { 0x11, 0x03 }, - /* 88a */ { 0x11, 0x03 }, - /* 88b */ { 0x11, 0x03 }, - /* 88c */ { 0x11, 0x03 }, - /* 88d */ { 0x11, 0x03 }, - /* 88e */ { 0x11, 0x03 }, - /* 88f */ { 0x11, 0x03 }, - /* 890 */ { 0x11, 0x03 }, - /* 891 */ { 0x11, 0x03 }, - /* 892 */ { 0x11, 0x03 }, - /* 893 */ { 0x11, 0x03 }, - /* 894 */ { 0x11, 0x03 }, - /* 895 */ { 0x11, 0x03 }, - /* 896 */ { 0x11, 0x03 }, - /* 897 */ { 0x11, 0x03 }, - /* 898 */ { 0x11, 0x03 }, - /* 899 */ { 0x11, 0x03 }, - /* 89a */ { 0x11, 0x03 }, - /* 89b */ { 0x11, 0x03 }, - /* 89c */ { 0x11, 0x03 }, - /* 89d */ { 0x11, 0x03 }, - /* 89e */ { 0x11, 0x03 }, - /* 89f */ { 0x11, 0x03 }, - /* 8a0 */ { 0x11, 0x03 }, - /* 8a1 */ { 0x11, 0x03 }, - /* 8a2 */ { 0x11, 0x03 }, - /* 8a3 */ { 0x11, 0x03 }, - /* 8a4 */ { 0x11, 0x03 }, - /* 8a5 */ { 0x11, 0x03 }, - /* 8a6 */ { 0x11, 0x03 }, - /* 8a7 */ { 0x11, 0x03 }, - /* 8a8 */ { 0x11, 0x03 }, - /* 8a9 */ { 0x11, 0x03 }, - /* 8aa */ { 0x11, 0x03 }, - /* 8ab */ { 0x11, 0x03 }, - /* 8ac */ { 0x11, 0x03 }, - /* 8ad */ { 0x11, 0x03 }, - /* 8ae */ { 0x11, 0x03 }, - /* 8af */ { 0x11, 0x03 }, - /* 8b0 */ { 0x11, 0x03 }, - /* 8b1 */ { 0x11, 0x03 }, - /* 8b2 */ { 0x11, 0x03 }, - /* 8b3 */ { 0x11, 0x03 }, - /* 8b4 */ { 0x11, 0x03 }, - /* 8b5 */ { 0x11, 0x03 }, - /* 8b6 */ { 0x11, 0x03 }, - /* 8b7 */ { 0x11, 0x03 }, - /* 8b8 */ { 0x11, 0x03 }, - /* 8b9 */ { 0x11, 0x03 }, - /* 8ba */ { 0x11, 0x03 }, - /* 8bb */ { 0x11, 0x03 }, - /* 8bc */ { 0x11, 0x03 }, - /* 8bd */ { 0x11, 0x03 }, - /* 8be */ { 0x11, 0x03 }, - /* 8bf */ { 0x11, 0x03 }, - /* 8c0 */ { 0x11, 0x03 }, - /* 8c1 */ { 0x11, 0x03 }, - /* 8c2 */ { 0x11, 0x03 }, - /* 8c3 */ { 0x11, 0x03 }, - /* 8c4 */ { 0x11, 0x03 }, - /* 8c5 */ { 0x11, 0x03 }, - /* 8c6 */ { 0x11, 0x03 }, - /* 8c7 */ { 0x11, 0x03 }, - /* 8c8 */ { 0x11, 0x03 }, - /* 8c9 */ { 0x11, 0x03 }, - /* 8ca */ { 0x11, 0x03 }, - /* 8cb */ { 0x11, 0x03 }, - /* 8cc */ { 0x11, 0x03 }, - /* 8cd */ { 0x11, 0x03 }, - /* 8ce */ { 0x11, 0x03 }, - /* 8cf */ { 0x11, 0x03 }, - /* 8d0 */ { 0x11, 0x03 }, - /* 8d1 */ { 0x11, 0x03 }, - /* 8d2 */ { 0x11, 0x03 }, - /* 8d3 */ { 0x11, 0x03 }, - /* 8d4 */ { 0x11, 0x03 }, - /* 8d5 */ { 0x11, 0x03 }, - /* 8d6 */ { 0x11, 0x03 }, - /* 8d7 */ { 0x11, 0x03 }, - /* 8d8 */ { 0x11, 0x03 }, - /* 8d9 */ { 0x11, 0x03 }, - /* 8da */ { 0x11, 0x03 }, - /* 8db */ { 0x11, 0x03 }, - /* 8dc */ { 0x11, 0x03 }, - /* 8dd */ { 0x11, 0x03 }, - /* 8de */ { 0x11, 0x03 }, - /* 8df */ { 0x11, 0x03 }, - /* 8e0 */ { 0x11, 0x03 }, - /* 8e1 */ { 0x11, 0x03 }, - /* 8e2 */ { 0x11, 0x03 }, - /* 8e3 */ { 0x11, 0x03 }, - /* 8e4 */ { 0x11, 0x03 }, - /* 8e5 */ { 0x11, 0x03 }, - /* 8e6 */ { 0x11, 0x03 }, - /* 8e7 */ { 0x11, 0x03 }, - /* 8e8 */ { 0x11, 0x03 }, - /* 8e9 */ { 0x11, 0x03 }, - /* 8ea */ { 0x11, 0x03 }, - /* 8eb */ { 0x11, 0x03 }, - /* 8ec */ { 0x11, 0x03 }, - /* 8ed */ { 0x11, 0x03 }, - /* 8ee */ { 0x11, 0x03 }, - /* 8ef */ { 0x11, 0x03 }, - /* 8f0 */ { 0x11, 0x03 }, - /* 8f1 */ { 0x11, 0x03 }, - /* 8f2 */ { 0x11, 0x03 }, - /* 8f3 */ { 0x11, 0x03 }, - /* 8f4 */ { 0x11, 0x03 }, - /* 8f5 */ { 0x11, 0x03 }, - /* 8f6 */ { 0x11, 0x03 }, - /* 8f7 */ { 0x11, 0x03 }, - /* 8f8 */ { 0x11, 0x03 }, - /* 8f9 */ { 0x11, 0x03 }, - /* 8fa */ { 0x11, 0x03 }, - /* 8fb */ { 0x11, 0x03 }, - /* 8fc */ { 0x11, 0x03 }, - /* 8fd */ { 0x11, 0x03 }, - /* 8fe */ { 0x11, 0x03 }, - /* 8ff */ { 0x11, 0x03 }, - /* 900 */ { 0x11, 0x03 }, - /* 901 */ { 0x11, 0x03 }, - /* 902 */ { 0x11, 0x03 }, - /* 903 */ { 0x11, 0x03 }, - /* 904 */ { 0x11, 0x03 }, - /* 905 */ { 0x11, 0x03 }, - /* 906 */ { 0x11, 0x03 }, - /* 907 */ { 0x11, 0x03 }, - /* 908 */ { 0x11, 0x03 }, - /* 909 */ { 0x11, 0x03 }, - /* 90a */ { 0x11, 0x03 }, - /* 90b */ { 0x11, 0x03 }, - /* 90c */ { 0x11, 0x03 }, - /* 90d */ { 0x11, 0x03 }, - /* 90e */ { 0x11, 0x03 }, - /* 90f */ { 0x11, 0x03 }, - /* 910 */ { 0x11, 0x03 }, - /* 911 */ { 0x11, 0x03 }, - /* 912 */ { 0x11, 0x03 }, - /* 913 */ { 0x11, 0x03 }, - /* 914 */ { 0x11, 0x03 }, - /* 915 */ { 0x11, 0x03 }, - /* 916 */ { 0x11, 0x03 }, - /* 917 */ { 0x11, 0x03 }, - /* 918 */ { 0x11, 0x03 }, - /* 919 */ { 0x11, 0x03 }, - /* 91a */ { 0x11, 0x03 }, - /* 91b */ { 0x11, 0x03 }, - /* 91c */ { 0x11, 0x03 }, - /* 91d */ { 0x11, 0x03 }, - /* 91e */ { 0x11, 0x03 }, - /* 91f */ { 0x11, 0x03 }, - /* 920 */ { 0x11, 0x03 }, - /* 921 */ { 0x11, 0x03 }, - /* 922 */ { 0x11, 0x03 }, - /* 923 */ { 0x11, 0x03 }, - /* 924 */ { 0x11, 0x03 }, - /* 925 */ { 0x11, 0x03 }, - /* 926 */ { 0x11, 0x03 }, - /* 927 */ { 0x11, 0x03 }, - /* 928 */ { 0x11, 0x03 }, - /* 929 */ { 0x11, 0x03 }, - /* 92a */ { 0x11, 0x03 }, - /* 92b */ { 0x11, 0x03 }, - /* 92c */ { 0x11, 0x03 }, - /* 92d */ { 0x11, 0x03 }, - /* 92e */ { 0x11, 0x03 }, - /* 92f */ { 0x11, 0x03 }, - /* 930 */ { 0x11, 0x03 }, - /* 931 */ { 0x11, 0x03 }, - /* 932 */ { 0x11, 0x03 }, - /* 933 */ { 0x11, 0x03 }, - /* 934 */ { 0x11, 0x03 }, - /* 935 */ { 0x11, 0x03 }, - /* 936 */ { 0x11, 0x03 }, - /* 937 */ { 0x11, 0x03 }, - /* 938 */ { 0x11, 0x03 }, - /* 939 */ { 0x11, 0x03 }, - /* 93a */ { 0x11, 0x03 }, - /* 93b */ { 0x11, 0x03 }, - /* 93c */ { 0x11, 0x03 }, - /* 93d */ { 0x11, 0x03 }, - /* 93e */ { 0x11, 0x03 }, - /* 93f */ { 0x11, 0x03 }, - /* 940 */ { 0x11, 0x03 }, - /* 941 */ { 0x11, 0x03 }, - /* 942 */ { 0x11, 0x03 }, - /* 943 */ { 0x11, 0x03 }, - /* 944 */ { 0x11, 0x03 }, - /* 945 */ { 0x11, 0x03 }, - /* 946 */ { 0x11, 0x03 }, - /* 947 */ { 0x11, 0x03 }, - /* 948 */ { 0x11, 0x03 }, - /* 949 */ { 0x11, 0x03 }, - /* 94a */ { 0x11, 0x03 }, - /* 94b */ { 0x11, 0x03 }, - /* 94c */ { 0x11, 0x03 }, - /* 94d */ { 0x11, 0x03 }, - /* 94e */ { 0x11, 0x03 }, - /* 94f */ { 0x11, 0x03 }, - /* 950 */ { 0x11, 0x03 }, - /* 951 */ { 0x11, 0x03 }, - /* 952 */ { 0x11, 0x03 }, - /* 953 */ { 0x11, 0x03 }, - /* 954 */ { 0x11, 0x03 }, - /* 955 */ { 0x11, 0x03 }, - /* 956 */ { 0x11, 0x03 }, - /* 957 */ { 0x11, 0x03 }, - /* 958 */ { 0x11, 0x03 }, - /* 959 */ { 0x11, 0x03 }, - /* 95a */ { 0x11, 0x03 }, - /* 95b */ { 0x11, 0x03 }, - /* 95c */ { 0x11, 0x03 }, - /* 95d */ { 0x11, 0x03 }, - /* 95e */ { 0x11, 0x03 }, - /* 95f */ { 0x11, 0x03 }, - /* 960 */ { 0x11, 0x03 }, - /* 961 */ { 0x11, 0x03 }, - /* 962 */ { 0x11, 0x03 }, - /* 963 */ { 0x11, 0x03 }, - /* 964 */ { 0x11, 0x03 }, - /* 965 */ { 0x11, 0x03 }, - /* 966 */ { 0x11, 0x03 }, - /* 967 */ { 0x11, 0x03 }, - /* 968 */ { 0x11, 0x03 }, - /* 969 */ { 0x11, 0x03 }, - /* 96a */ { 0x11, 0x03 }, - /* 96b */ { 0x11, 0x03 }, - /* 96c */ { 0x11, 0x03 }, - /* 96d */ { 0x11, 0x03 }, - /* 96e */ { 0x11, 0x03 }, - /* 96f */ { 0x11, 0x03 }, - /* 970 */ { 0x11, 0x03 }, - /* 971 */ { 0x11, 0x03 }, - /* 972 */ { 0x11, 0x03 }, - /* 973 */ { 0x11, 0x03 }, - /* 974 */ { 0x11, 0x03 }, - /* 975 */ { 0x11, 0x03 }, - /* 976 */ { 0x11, 0x03 }, - /* 977 */ { 0x11, 0x03 }, - /* 978 */ { 0x11, 0x03 }, - /* 979 */ { 0x11, 0x03 }, - /* 97a */ { 0x11, 0x03 }, - /* 97b */ { 0x11, 0x03 }, - /* 97c */ { 0x11, 0x03 }, - /* 97d */ { 0x11, 0x03 }, - /* 97e */ { 0x11, 0x03 }, - /* 97f */ { 0x11, 0x03 }, - /* 980 */ { 0x11, 0x03 }, - /* 981 */ { 0x11, 0x03 }, - /* 982 */ { 0x11, 0x03 }, - /* 983 */ { 0x11, 0x03 }, - /* 984 */ { 0x11, 0x03 }, - /* 985 */ { 0x11, 0x03 }, - /* 986 */ { 0x11, 0x03 }, - /* 987 */ { 0x11, 0x03 }, - /* 988 */ { 0x11, 0x03 }, - /* 989 */ { 0x11, 0x03 }, - /* 98a */ { 0x11, 0x03 }, - /* 98b */ { 0x11, 0x03 }, - /* 98c */ { 0x11, 0x03 }, - /* 98d */ { 0x11, 0x03 }, - /* 98e */ { 0x11, 0x03 }, - /* 98f */ { 0x11, 0x03 }, - /* 990 */ { 0x11, 0x03 }, - /* 991 */ { 0x11, 0x03 }, - /* 992 */ { 0x11, 0x03 }, - /* 993 */ { 0x11, 0x03 }, - /* 994 */ { 0x11, 0x03 }, - /* 995 */ { 0x11, 0x03 }, - /* 996 */ { 0x11, 0x03 }, - /* 997 */ { 0x11, 0x03 }, - /* 998 */ { 0x11, 0x03 }, - /* 999 */ { 0x11, 0x03 }, - /* 99a */ { 0x11, 0x03 }, - /* 99b */ { 0x11, 0x03 }, - /* 99c */ { 0x11, 0x03 }, - /* 99d */ { 0x11, 0x03 }, - /* 99e */ { 0x11, 0x03 }, - /* 99f */ { 0x11, 0x03 }, - /* 9a0 */ { 0x11, 0x03 }, - /* 9a1 */ { 0x11, 0x03 }, - /* 9a2 */ { 0x11, 0x03 }, - /* 9a3 */ { 0x11, 0x03 }, - /* 9a4 */ { 0x11, 0x03 }, - /* 9a5 */ { 0x11, 0x03 }, - /* 9a6 */ { 0x11, 0x03 }, - /* 9a7 */ { 0x11, 0x03 }, - /* 9a8 */ { 0x11, 0x03 }, - /* 9a9 */ { 0x11, 0x03 }, - /* 9aa */ { 0x11, 0x03 }, - /* 9ab */ { 0x11, 0x03 }, - /* 9ac */ { 0x11, 0x03 }, - /* 9ad */ { 0x11, 0x03 }, - /* 9ae */ { 0x11, 0x03 }, - /* 9af */ { 0x11, 0x03 }, - /* 9b0 */ { 0x11, 0x03 }, - /* 9b1 */ { 0x11, 0x03 }, - /* 9b2 */ { 0x11, 0x03 }, - /* 9b3 */ { 0x11, 0x03 }, - /* 9b4 */ { 0x11, 0x03 }, - /* 9b5 */ { 0x11, 0x03 }, - /* 9b6 */ { 0x11, 0x03 }, - /* 9b7 */ { 0x11, 0x03 }, - /* 9b8 */ { 0x11, 0x03 }, - /* 9b9 */ { 0x11, 0x03 }, - /* 9ba */ { 0x11, 0x03 }, - /* 9bb */ { 0x11, 0x03 }, - /* 9bc */ { 0x11, 0x03 }, - /* 9bd */ { 0x11, 0x03 }, - /* 9be */ { 0x11, 0x03 }, - /* 9bf */ { 0x11, 0x03 }, - /* 9c0 */ { 0x11, 0x03 }, - /* 9c1 */ { 0x11, 0x03 }, - /* 9c2 */ { 0x11, 0x03 }, - /* 9c3 */ { 0x11, 0x03 }, - /* 9c4 */ { 0x11, 0x03 }, - /* 9c5 */ { 0x11, 0x03 }, - /* 9c6 */ { 0x11, 0x03 }, - /* 9c7 */ { 0x11, 0x03 }, - /* 9c8 */ { 0x11, 0x03 }, - /* 9c9 */ { 0x11, 0x03 }, - /* 9ca */ { 0x11, 0x03 }, - /* 9cb */ { 0x11, 0x03 }, - /* 9cc */ { 0x11, 0x03 }, - /* 9cd */ { 0x11, 0x03 }, - /* 9ce */ { 0x11, 0x03 }, - /* 9cf */ { 0x11, 0x03 }, - /* 9d0 */ { 0x11, 0x03 }, - /* 9d1 */ { 0x11, 0x03 }, - /* 9d2 */ { 0x11, 0x03 }, - /* 9d3 */ { 0x11, 0x03 }, - /* 9d4 */ { 0x11, 0x03 }, - /* 9d5 */ { 0x11, 0x03 }, - /* 9d6 */ { 0x11, 0x03 }, - /* 9d7 */ { 0x11, 0x03 }, - /* 9d8 */ { 0x11, 0x03 }, - /* 9d9 */ { 0x11, 0x03 }, - /* 9da */ { 0x11, 0x03 }, - /* 9db */ { 0x11, 0x03 }, - /* 9dc */ { 0x11, 0x03 }, - /* 9dd */ { 0x11, 0x03 }, - /* 9de */ { 0x11, 0x03 }, - /* 9df */ { 0x11, 0x03 }, - /* 9e0 */ { 0x11, 0x03 }, - /* 9e1 */ { 0x11, 0x03 }, - /* 9e2 */ { 0x11, 0x03 }, - /* 9e3 */ { 0x11, 0x03 }, - /* 9e4 */ { 0x11, 0x03 }, - /* 9e5 */ { 0x11, 0x03 }, - /* 9e6 */ { 0x11, 0x03 }, - /* 9e7 */ { 0x11, 0x03 }, - /* 9e8 */ { 0x11, 0x03 }, - /* 9e9 */ { 0x11, 0x03 }, - /* 9ea */ { 0x11, 0x03 }, - /* 9eb */ { 0x11, 0x03 }, - /* 9ec */ { 0x11, 0x03 }, - /* 9ed */ { 0x11, 0x03 }, - /* 9ee */ { 0x11, 0x03 }, - /* 9ef */ { 0x11, 0x03 }, - /* 9f0 */ { 0x11, 0x03 }, - /* 9f1 */ { 0x11, 0x03 }, - /* 9f2 */ { 0x11, 0x03 }, - /* 9f3 */ { 0x11, 0x03 }, - /* 9f4 */ { 0x11, 0x03 }, - /* 9f5 */ { 0x11, 0x03 }, - /* 9f6 */ { 0x11, 0x03 }, - /* 9f7 */ { 0x11, 0x03 }, - /* 9f8 */ { 0x11, 0x03 }, - /* 9f9 */ { 0x11, 0x03 }, - /* 9fa */ { 0x11, 0x03 }, - /* 9fb */ { 0x11, 0x03 }, - /* 9fc */ { 0x11, 0x03 }, - /* 9fd */ { 0x11, 0x03 }, - /* 9fe */ { 0x11, 0x03 }, - /* 9ff */ { 0x11, 0x03 }, - /* a00 */ { 0x03, 0x04 }, - /* a01 */ { 0x03, 0x04 }, - /* a02 */ { 0x03, 0x04 }, - /* a03 */ { 0x03, 0x04 }, - /* a04 */ { 0x03, 0x04 }, - /* a05 */ { 0x03, 0x04 }, - /* a06 */ { 0x03, 0x04 }, - /* a07 */ { 0x03, 0x04 }, - /* a08 */ { 0x03, 0x04 }, - /* a09 */ { 0x03, 0x04 }, - /* a0a */ { 0x03, 0x04 }, - /* a0b */ { 0x03, 0x04 }, - /* a0c */ { 0x03, 0x04 }, - /* a0d */ { 0x03, 0x04 }, - /* a0e */ { 0x03, 0x04 }, - /* a0f */ { 0x03, 0x04 }, - /* a10 */ { 0x03, 0x04 }, - /* a11 */ { 0x03, 0x04 }, - /* a12 */ { 0x03, 0x04 }, - /* a13 */ { 0x03, 0x04 }, - /* a14 */ { 0x03, 0x04 }, - /* a15 */ { 0x03, 0x04 }, - /* a16 */ { 0x03, 0x04 }, - /* a17 */ { 0x03, 0x04 }, - /* a18 */ { 0x03, 0x04 }, - /* a19 */ { 0x03, 0x04 }, - /* a1a */ { 0x03, 0x04 }, - /* a1b */ { 0x03, 0x04 }, - /* a1c */ { 0x03, 0x04 }, - /* a1d */ { 0x03, 0x04 }, - /* a1e */ { 0x03, 0x04 }, - /* a1f */ { 0x03, 0x04 }, - /* a20 */ { 0x03, 0x04 }, - /* a21 */ { 0x03, 0x04 }, - /* a22 */ { 0x03, 0x04 }, - /* a23 */ { 0x03, 0x04 }, - /* a24 */ { 0x03, 0x04 }, - /* a25 */ { 0x03, 0x04 }, - /* a26 */ { 0x03, 0x04 }, - /* a27 */ { 0x03, 0x04 }, - /* a28 */ { 0x03, 0x04 }, - /* a29 */ { 0x03, 0x04 }, - /* a2a */ { 0x03, 0x04 }, - /* a2b */ { 0x03, 0x04 }, - /* a2c */ { 0x03, 0x04 }, - /* a2d */ { 0x03, 0x04 }, - /* a2e */ { 0x03, 0x04 }, - /* a2f */ { 0x03, 0x04 }, - /* a30 */ { 0x03, 0x04 }, - /* a31 */ { 0x03, 0x04 }, - /* a32 */ { 0x03, 0x04 }, - /* a33 */ { 0x03, 0x04 }, - /* a34 */ { 0x03, 0x04 }, - /* a35 */ { 0x03, 0x04 }, - /* a36 */ { 0x03, 0x04 }, - /* a37 */ { 0x03, 0x04 }, - /* a38 */ { 0x03, 0x04 }, - /* a39 */ { 0x03, 0x04 }, - /* a3a */ { 0x03, 0x04 }, - /* a3b */ { 0x03, 0x04 }, - /* a3c */ { 0x03, 0x04 }, - /* a3d */ { 0x03, 0x04 }, - /* a3e */ { 0x03, 0x04 }, - /* a3f */ { 0x03, 0x04 }, - /* a40 */ { 0x03, 0x04 }, - /* a41 */ { 0x03, 0x04 }, - /* a42 */ { 0x03, 0x04 }, - /* a43 */ { 0x03, 0x04 }, - /* a44 */ { 0x03, 0x04 }, - /* a45 */ { 0x03, 0x04 }, - /* a46 */ { 0x03, 0x04 }, - /* a47 */ { 0x03, 0x04 }, - /* a48 */ { 0x03, 0x04 }, - /* a49 */ { 0x03, 0x04 }, - /* a4a */ { 0x03, 0x04 }, - /* a4b */ { 0x03, 0x04 }, - /* a4c */ { 0x03, 0x04 }, - /* a4d */ { 0x03, 0x04 }, - /* a4e */ { 0x03, 0x04 }, - /* a4f */ { 0x03, 0x04 }, - /* a50 */ { 0x03, 0x04 }, - /* a51 */ { 0x03, 0x04 }, - /* a52 */ { 0x03, 0x04 }, - /* a53 */ { 0x03, 0x04 }, - /* a54 */ { 0x03, 0x04 }, - /* a55 */ { 0x03, 0x04 }, - /* a56 */ { 0x03, 0x04 }, - /* a57 */ { 0x03, 0x04 }, - /* a58 */ { 0x03, 0x04 }, - /* a59 */ { 0x03, 0x04 }, - /* a5a */ { 0x03, 0x04 }, - /* a5b */ { 0x03, 0x04 }, - /* a5c */ { 0x03, 0x04 }, - /* a5d */ { 0x03, 0x04 }, - /* a5e */ { 0x03, 0x04 }, - /* a5f */ { 0x03, 0x04 }, - /* a60 */ { 0x03, 0x04 }, - /* a61 */ { 0x03, 0x04 }, - /* a62 */ { 0x03, 0x04 }, - /* a63 */ { 0x03, 0x04 }, - /* a64 */ { 0x03, 0x04 }, - /* a65 */ { 0x03, 0x04 }, - /* a66 */ { 0x03, 0x04 }, - /* a67 */ { 0x03, 0x04 }, - /* a68 */ { 0x03, 0x04 }, - /* a69 */ { 0x03, 0x04 }, - /* a6a */ { 0x03, 0x04 }, - /* a6b */ { 0x03, 0x04 }, - /* a6c */ { 0x03, 0x04 }, - /* a6d */ { 0x03, 0x04 }, - /* a6e */ { 0x03, 0x04 }, - /* a6f */ { 0x03, 0x04 }, - /* a70 */ { 0x03, 0x04 }, - /* a71 */ { 0x03, 0x04 }, - /* a72 */ { 0x03, 0x04 }, - /* a73 */ { 0x03, 0x04 }, - /* a74 */ { 0x03, 0x04 }, - /* a75 */ { 0x03, 0x04 }, - /* a76 */ { 0x03, 0x04 }, - /* a77 */ { 0x03, 0x04 }, - /* a78 */ { 0x03, 0x04 }, - /* a79 */ { 0x03, 0x04 }, - /* a7a */ { 0x03, 0x04 }, - /* a7b */ { 0x03, 0x04 }, - /* a7c */ { 0x03, 0x04 }, - /* a7d */ { 0x03, 0x04 }, - /* a7e */ { 0x03, 0x04 }, - /* a7f */ { 0x03, 0x04 }, - /* a80 */ { 0x03, 0x04 }, - /* a81 */ { 0x03, 0x04 }, - /* a82 */ { 0x03, 0x04 }, - /* a83 */ { 0x03, 0x04 }, - /* a84 */ { 0x03, 0x04 }, - /* a85 */ { 0x03, 0x04 }, - /* a86 */ { 0x03, 0x04 }, - /* a87 */ { 0x03, 0x04 }, - /* a88 */ { 0x03, 0x04 }, - /* a89 */ { 0x03, 0x04 }, - /* a8a */ { 0x03, 0x04 }, - /* a8b */ { 0x03, 0x04 }, - /* a8c */ { 0x03, 0x04 }, - /* a8d */ { 0x03, 0x04 }, - /* a8e */ { 0x03, 0x04 }, - /* a8f */ { 0x03, 0x04 }, - /* a90 */ { 0x03, 0x04 }, - /* a91 */ { 0x03, 0x04 }, - /* a92 */ { 0x03, 0x04 }, - /* a93 */ { 0x03, 0x04 }, - /* a94 */ { 0x03, 0x04 }, - /* a95 */ { 0x03, 0x04 }, - /* a96 */ { 0x03, 0x04 }, - /* a97 */ { 0x03, 0x04 }, - /* a98 */ { 0x03, 0x04 }, - /* a99 */ { 0x03, 0x04 }, - /* a9a */ { 0x03, 0x04 }, - /* a9b */ { 0x03, 0x04 }, - /* a9c */ { 0x03, 0x04 }, - /* a9d */ { 0x03, 0x04 }, - /* a9e */ { 0x03, 0x04 }, - /* a9f */ { 0x03, 0x04 }, - /* aa0 */ { 0x03, 0x04 }, - /* aa1 */ { 0x03, 0x04 }, - /* aa2 */ { 0x03, 0x04 }, - /* aa3 */ { 0x03, 0x04 }, - /* aa4 */ { 0x03, 0x04 }, - /* aa5 */ { 0x03, 0x04 }, - /* aa6 */ { 0x03, 0x04 }, - /* aa7 */ { 0x03, 0x04 }, - /* aa8 */ { 0x03, 0x04 }, - /* aa9 */ { 0x03, 0x04 }, - /* aaa */ { 0x03, 0x04 }, - /* aab */ { 0x03, 0x04 }, - /* aac */ { 0x03, 0x04 }, - /* aad */ { 0x03, 0x04 }, - /* aae */ { 0x03, 0x04 }, - /* aaf */ { 0x03, 0x04 }, - /* ab0 */ { 0x03, 0x04 }, - /* ab1 */ { 0x03, 0x04 }, - /* ab2 */ { 0x03, 0x04 }, - /* ab3 */ { 0x03, 0x04 }, - /* ab4 */ { 0x03, 0x04 }, - /* ab5 */ { 0x03, 0x04 }, - /* ab6 */ { 0x03, 0x04 }, - /* ab7 */ { 0x03, 0x04 }, - /* ab8 */ { 0x03, 0x04 }, - /* ab9 */ { 0x03, 0x04 }, - /* aba */ { 0x03, 0x04 }, - /* abb */ { 0x03, 0x04 }, - /* abc */ { 0x03, 0x04 }, - /* abd */ { 0x03, 0x04 }, - /* abe */ { 0x03, 0x04 }, - /* abf */ { 0x03, 0x04 }, - /* ac0 */ { 0x03, 0x04 }, - /* ac1 */ { 0x03, 0x04 }, - /* ac2 */ { 0x03, 0x04 }, - /* ac3 */ { 0x03, 0x04 }, - /* ac4 */ { 0x03, 0x04 }, - /* ac5 */ { 0x03, 0x04 }, - /* ac6 */ { 0x03, 0x04 }, - /* ac7 */ { 0x03, 0x04 }, - /* ac8 */ { 0x03, 0x04 }, - /* ac9 */ { 0x03, 0x04 }, - /* aca */ { 0x03, 0x04 }, - /* acb */ { 0x03, 0x04 }, - /* acc */ { 0x03, 0x04 }, - /* acd */ { 0x03, 0x04 }, - /* ace */ { 0x03, 0x04 }, - /* acf */ { 0x03, 0x04 }, - /* ad0 */ { 0x03, 0x04 }, - /* ad1 */ { 0x03, 0x04 }, - /* ad2 */ { 0x03, 0x04 }, - /* ad3 */ { 0x03, 0x04 }, - /* ad4 */ { 0x03, 0x04 }, - /* ad5 */ { 0x03, 0x04 }, - /* ad6 */ { 0x03, 0x04 }, - /* ad7 */ { 0x03, 0x04 }, - /* ad8 */ { 0x03, 0x04 }, - /* ad9 */ { 0x03, 0x04 }, - /* ada */ { 0x03, 0x04 }, - /* adb */ { 0x03, 0x04 }, - /* adc */ { 0x03, 0x04 }, - /* add */ { 0x03, 0x04 }, - /* ade */ { 0x03, 0x04 }, - /* adf */ { 0x03, 0x04 }, - /* ae0 */ { 0x03, 0x04 }, - /* ae1 */ { 0x03, 0x04 }, - /* ae2 */ { 0x03, 0x04 }, - /* ae3 */ { 0x03, 0x04 }, - /* ae4 */ { 0x03, 0x04 }, - /* ae5 */ { 0x03, 0x04 }, - /* ae6 */ { 0x03, 0x04 }, - /* ae7 */ { 0x03, 0x04 }, - /* ae8 */ { 0x03, 0x04 }, - /* ae9 */ { 0x03, 0x04 }, - /* aea */ { 0x03, 0x04 }, - /* aeb */ { 0x03, 0x04 }, - /* aec */ { 0x03, 0x04 }, - /* aed */ { 0x03, 0x04 }, - /* aee */ { 0x03, 0x04 }, - /* aef */ { 0x03, 0x04 }, - /* af0 */ { 0x03, 0x04 }, - /* af1 */ { 0x03, 0x04 }, - /* af2 */ { 0x03, 0x04 }, - /* af3 */ { 0x03, 0x04 }, - /* af4 */ { 0x03, 0x04 }, - /* af5 */ { 0x03, 0x04 }, - /* af6 */ { 0x03, 0x04 }, - /* af7 */ { 0x03, 0x04 }, - /* af8 */ { 0x03, 0x04 }, - /* af9 */ { 0x03, 0x04 }, - /* afa */ { 0x03, 0x04 }, - /* afb */ { 0x03, 0x04 }, - /* afc */ { 0x03, 0x04 }, - /* afd */ { 0x03, 0x04 }, - /* afe */ { 0x03, 0x04 }, - /* aff */ { 0x03, 0x04 }, - /* b00 */ { 0x21, 0x04 }, - /* b01 */ { 0x21, 0x04 }, - /* b02 */ { 0x21, 0x04 }, - /* b03 */ { 0x21, 0x04 }, - /* b04 */ { 0x21, 0x04 }, - /* b05 */ { 0x21, 0x04 }, - /* b06 */ { 0x21, 0x04 }, - /* b07 */ { 0x21, 0x04 }, - /* b08 */ { 0x21, 0x04 }, - /* b09 */ { 0x21, 0x04 }, - /* b0a */ { 0x21, 0x04 }, - /* b0b */ { 0x21, 0x04 }, - /* b0c */ { 0x21, 0x04 }, - /* b0d */ { 0x21, 0x04 }, - /* b0e */ { 0x21, 0x04 }, - /* b0f */ { 0x21, 0x04 }, - /* b10 */ { 0x21, 0x04 }, - /* b11 */ { 0x21, 0x04 }, - /* b12 */ { 0x21, 0x04 }, - /* b13 */ { 0x21, 0x04 }, - /* b14 */ { 0x21, 0x04 }, - /* b15 */ { 0x21, 0x04 }, - /* b16 */ { 0x21, 0x04 }, - /* b17 */ { 0x21, 0x04 }, - /* b18 */ { 0x21, 0x04 }, - /* b19 */ { 0x21, 0x04 }, - /* b1a */ { 0x21, 0x04 }, - /* b1b */ { 0x21, 0x04 }, - /* b1c */ { 0x21, 0x04 }, - /* b1d */ { 0x21, 0x04 }, - /* b1e */ { 0x21, 0x04 }, - /* b1f */ { 0x21, 0x04 }, - /* b20 */ { 0x21, 0x04 }, - /* b21 */ { 0x21, 0x04 }, - /* b22 */ { 0x21, 0x04 }, - /* b23 */ { 0x21, 0x04 }, - /* b24 */ { 0x21, 0x04 }, - /* b25 */ { 0x21, 0x04 }, - /* b26 */ { 0x21, 0x04 }, - /* b27 */ { 0x21, 0x04 }, - /* b28 */ { 0x21, 0x04 }, - /* b29 */ { 0x21, 0x04 }, - /* b2a */ { 0x21, 0x04 }, - /* b2b */ { 0x21, 0x04 }, - /* b2c */ { 0x21, 0x04 }, - /* b2d */ { 0x21, 0x04 }, - /* b2e */ { 0x21, 0x04 }, - /* b2f */ { 0x21, 0x04 }, - /* b30 */ { 0x21, 0x04 }, - /* b31 */ { 0x21, 0x04 }, - /* b32 */ { 0x21, 0x04 }, - /* b33 */ { 0x21, 0x04 }, - /* b34 */ { 0x21, 0x04 }, - /* b35 */ { 0x21, 0x04 }, - /* b36 */ { 0x21, 0x04 }, - /* b37 */ { 0x21, 0x04 }, - /* b38 */ { 0x21, 0x04 }, - /* b39 */ { 0x21, 0x04 }, - /* b3a */ { 0x21, 0x04 }, - /* b3b */ { 0x21, 0x04 }, - /* b3c */ { 0x21, 0x04 }, - /* b3d */ { 0x21, 0x04 }, - /* b3e */ { 0x21, 0x04 }, - /* b3f */ { 0x21, 0x04 }, - /* b40 */ { 0x21, 0x04 }, - /* b41 */ { 0x21, 0x04 }, - /* b42 */ { 0x21, 0x04 }, - /* b43 */ { 0x21, 0x04 }, - /* b44 */ { 0x21, 0x04 }, - /* b45 */ { 0x21, 0x04 }, - /* b46 */ { 0x21, 0x04 }, - /* b47 */ { 0x21, 0x04 }, - /* b48 */ { 0x21, 0x04 }, - /* b49 */ { 0x21, 0x04 }, - /* b4a */ { 0x21, 0x04 }, - /* b4b */ { 0x21, 0x04 }, - /* b4c */ { 0x21, 0x04 }, - /* b4d */ { 0x21, 0x04 }, - /* b4e */ { 0x21, 0x04 }, - /* b4f */ { 0x21, 0x04 }, - /* b50 */ { 0x21, 0x04 }, - /* b51 */ { 0x21, 0x04 }, - /* b52 */ { 0x21, 0x04 }, - /* b53 */ { 0x21, 0x04 }, - /* b54 */ { 0x21, 0x04 }, - /* b55 */ { 0x21, 0x04 }, - /* b56 */ { 0x21, 0x04 }, - /* b57 */ { 0x21, 0x04 }, - /* b58 */ { 0x21, 0x04 }, - /* b59 */ { 0x21, 0x04 }, - /* b5a */ { 0x21, 0x04 }, - /* b5b */ { 0x21, 0x04 }, - /* b5c */ { 0x21, 0x04 }, - /* b5d */ { 0x21, 0x04 }, - /* b5e */ { 0x21, 0x04 }, - /* b5f */ { 0x21, 0x04 }, - /* b60 */ { 0x21, 0x04 }, - /* b61 */ { 0x21, 0x04 }, - /* b62 */ { 0x21, 0x04 }, - /* b63 */ { 0x21, 0x04 }, - /* b64 */ { 0x21, 0x04 }, - /* b65 */ { 0x21, 0x04 }, - /* b66 */ { 0x21, 0x04 }, - /* b67 */ { 0x21, 0x04 }, - /* b68 */ { 0x21, 0x04 }, - /* b69 */ { 0x21, 0x04 }, - /* b6a */ { 0x21, 0x04 }, - /* b6b */ { 0x21, 0x04 }, - /* b6c */ { 0x21, 0x04 }, - /* b6d */ { 0x21, 0x04 }, - /* b6e */ { 0x21, 0x04 }, - /* b6f */ { 0x21, 0x04 }, - /* b70 */ { 0x21, 0x04 }, - /* b71 */ { 0x21, 0x04 }, - /* b72 */ { 0x21, 0x04 }, - /* b73 */ { 0x21, 0x04 }, - /* b74 */ { 0x21, 0x04 }, - /* b75 */ { 0x21, 0x04 }, - /* b76 */ { 0x21, 0x04 }, - /* b77 */ { 0x21, 0x04 }, - /* b78 */ { 0x21, 0x04 }, - /* b79 */ { 0x21, 0x04 }, - /* b7a */ { 0x21, 0x04 }, - /* b7b */ { 0x21, 0x04 }, - /* b7c */ { 0x21, 0x04 }, - /* b7d */ { 0x21, 0x04 }, - /* b7e */ { 0x21, 0x04 }, - /* b7f */ { 0x21, 0x04 }, - /* b80 */ { 0x21, 0x04 }, - /* b81 */ { 0x21, 0x04 }, - /* b82 */ { 0x21, 0x04 }, - /* b83 */ { 0x21, 0x04 }, - /* b84 */ { 0x21, 0x04 }, - /* b85 */ { 0x21, 0x04 }, - /* b86 */ { 0x21, 0x04 }, - /* b87 */ { 0x21, 0x04 }, - /* b88 */ { 0x21, 0x04 }, - /* b89 */ { 0x21, 0x04 }, - /* b8a */ { 0x21, 0x04 }, - /* b8b */ { 0x21, 0x04 }, - /* b8c */ { 0x21, 0x04 }, - /* b8d */ { 0x21, 0x04 }, - /* b8e */ { 0x21, 0x04 }, - /* b8f */ { 0x21, 0x04 }, - /* b90 */ { 0x21, 0x04 }, - /* b91 */ { 0x21, 0x04 }, - /* b92 */ { 0x21, 0x04 }, - /* b93 */ { 0x21, 0x04 }, - /* b94 */ { 0x21, 0x04 }, - /* b95 */ { 0x21, 0x04 }, - /* b96 */ { 0x21, 0x04 }, - /* b97 */ { 0x21, 0x04 }, - /* b98 */ { 0x21, 0x04 }, - /* b99 */ { 0x21, 0x04 }, - /* b9a */ { 0x21, 0x04 }, - /* b9b */ { 0x21, 0x04 }, - /* b9c */ { 0x21, 0x04 }, - /* b9d */ { 0x21, 0x04 }, - /* b9e */ { 0x21, 0x04 }, - /* b9f */ { 0x21, 0x04 }, - /* ba0 */ { 0x21, 0x04 }, - /* ba1 */ { 0x21, 0x04 }, - /* ba2 */ { 0x21, 0x04 }, - /* ba3 */ { 0x21, 0x04 }, - /* ba4 */ { 0x21, 0x04 }, - /* ba5 */ { 0x21, 0x04 }, - /* ba6 */ { 0x21, 0x04 }, - /* ba7 */ { 0x21, 0x04 }, - /* ba8 */ { 0x21, 0x04 }, - /* ba9 */ { 0x21, 0x04 }, - /* baa */ { 0x21, 0x04 }, - /* bab */ { 0x21, 0x04 }, - /* bac */ { 0x21, 0x04 }, - /* bad */ { 0x21, 0x04 }, - /* bae */ { 0x21, 0x04 }, - /* baf */ { 0x21, 0x04 }, - /* bb0 */ { 0x21, 0x04 }, - /* bb1 */ { 0x21, 0x04 }, - /* bb2 */ { 0x21, 0x04 }, - /* bb3 */ { 0x21, 0x04 }, - /* bb4 */ { 0x21, 0x04 }, - /* bb5 */ { 0x21, 0x04 }, - /* bb6 */ { 0x21, 0x04 }, - /* bb7 */ { 0x21, 0x04 }, - /* bb8 */ { 0x21, 0x04 }, - /* bb9 */ { 0x21, 0x04 }, - /* bba */ { 0x21, 0x04 }, - /* bbb */ { 0x21, 0x04 }, - /* bbc */ { 0x21, 0x04 }, - /* bbd */ { 0x21, 0x04 }, - /* bbe */ { 0x21, 0x04 }, - /* bbf */ { 0x21, 0x04 }, - /* bc0 */ { 0x21, 0x04 }, - /* bc1 */ { 0x21, 0x04 }, - /* bc2 */ { 0x21, 0x04 }, - /* bc3 */ { 0x21, 0x04 }, - /* bc4 */ { 0x21, 0x04 }, - /* bc5 */ { 0x21, 0x04 }, - /* bc6 */ { 0x21, 0x04 }, - /* bc7 */ { 0x21, 0x04 }, - /* bc8 */ { 0x21, 0x04 }, - /* bc9 */ { 0x21, 0x04 }, - /* bca */ { 0x21, 0x04 }, - /* bcb */ { 0x21, 0x04 }, - /* bcc */ { 0x21, 0x04 }, - /* bcd */ { 0x21, 0x04 }, - /* bce */ { 0x21, 0x04 }, - /* bcf */ { 0x21, 0x04 }, - /* bd0 */ { 0x21, 0x04 }, - /* bd1 */ { 0x21, 0x04 }, - /* bd2 */ { 0x21, 0x04 }, - /* bd3 */ { 0x21, 0x04 }, - /* bd4 */ { 0x21, 0x04 }, - /* bd5 */ { 0x21, 0x04 }, - /* bd6 */ { 0x21, 0x04 }, - /* bd7 */ { 0x21, 0x04 }, - /* bd8 */ { 0x21, 0x04 }, - /* bd9 */ { 0x21, 0x04 }, - /* bda */ { 0x21, 0x04 }, - /* bdb */ { 0x21, 0x04 }, - /* bdc */ { 0x21, 0x04 }, - /* bdd */ { 0x21, 0x04 }, - /* bde */ { 0x21, 0x04 }, - /* bdf */ { 0x21, 0x04 }, - /* be0 */ { 0x21, 0x04 }, - /* be1 */ { 0x21, 0x04 }, - /* be2 */ { 0x21, 0x04 }, - /* be3 */ { 0x21, 0x04 }, - /* be4 */ { 0x21, 0x04 }, - /* be5 */ { 0x21, 0x04 }, - /* be6 */ { 0x21, 0x04 }, - /* be7 */ { 0x21, 0x04 }, - /* be8 */ { 0x21, 0x04 }, - /* be9 */ { 0x21, 0x04 }, - /* bea */ { 0x21, 0x04 }, - /* beb */ { 0x21, 0x04 }, - /* bec */ { 0x21, 0x04 }, - /* bed */ { 0x21, 0x04 }, - /* bee */ { 0x21, 0x04 }, - /* bef */ { 0x21, 0x04 }, - /* bf0 */ { 0x21, 0x04 }, - /* bf1 */ { 0x21, 0x04 }, - /* bf2 */ { 0x21, 0x04 }, - /* bf3 */ { 0x21, 0x04 }, - /* bf4 */ { 0x21, 0x04 }, - /* bf5 */ { 0x21, 0x04 }, - /* bf6 */ { 0x21, 0x04 }, - /* bf7 */ { 0x21, 0x04 }, - /* bf8 */ { 0x21, 0x04 }, - /* bf9 */ { 0x21, 0x04 }, - /* bfa */ { 0x21, 0x04 }, - /* bfb */ { 0x21, 0x04 }, - /* bfc */ { 0x21, 0x04 }, - /* bfd */ { 0x21, 0x04 }, - /* bfe */ { 0x21, 0x04 }, - /* bff */ { 0x21, 0x04 }, - /* c00 */ { 0x04, 0x05 }, - /* c01 */ { 0x04, 0x05 }, - /* c02 */ { 0x04, 0x05 }, - /* c03 */ { 0x04, 0x05 }, - /* c04 */ { 0x04, 0x05 }, - /* c05 */ { 0x04, 0x05 }, - /* c06 */ { 0x04, 0x05 }, - /* c07 */ { 0x04, 0x05 }, - /* c08 */ { 0x04, 0x05 }, - /* c09 */ { 0x04, 0x05 }, - /* c0a */ { 0x04, 0x05 }, - /* c0b */ { 0x04, 0x05 }, - /* c0c */ { 0x04, 0x05 }, - /* c0d */ { 0x04, 0x05 }, - /* c0e */ { 0x04, 0x05 }, - /* c0f */ { 0x04, 0x05 }, - /* c10 */ { 0x04, 0x05 }, - /* c11 */ { 0x04, 0x05 }, - /* c12 */ { 0x04, 0x05 }, - /* c13 */ { 0x04, 0x05 }, - /* c14 */ { 0x04, 0x05 }, - /* c15 */ { 0x04, 0x05 }, - /* c16 */ { 0x04, 0x05 }, - /* c17 */ { 0x04, 0x05 }, - /* c18 */ { 0x04, 0x05 }, - /* c19 */ { 0x04, 0x05 }, - /* c1a */ { 0x04, 0x05 }, - /* c1b */ { 0x04, 0x05 }, - /* c1c */ { 0x04, 0x05 }, - /* c1d */ { 0x04, 0x05 }, - /* c1e */ { 0x04, 0x05 }, - /* c1f */ { 0x04, 0x05 }, - /* c20 */ { 0x04, 0x05 }, - /* c21 */ { 0x04, 0x05 }, - /* c22 */ { 0x04, 0x05 }, - /* c23 */ { 0x04, 0x05 }, - /* c24 */ { 0x04, 0x05 }, - /* c25 */ { 0x04, 0x05 }, - /* c26 */ { 0x04, 0x05 }, - /* c27 */ { 0x04, 0x05 }, - /* c28 */ { 0x04, 0x05 }, - /* c29 */ { 0x04, 0x05 }, - /* c2a */ { 0x04, 0x05 }, - /* c2b */ { 0x04, 0x05 }, - /* c2c */ { 0x04, 0x05 }, - /* c2d */ { 0x04, 0x05 }, - /* c2e */ { 0x04, 0x05 }, - /* c2f */ { 0x04, 0x05 }, - /* c30 */ { 0x04, 0x05 }, - /* c31 */ { 0x04, 0x05 }, - /* c32 */ { 0x04, 0x05 }, - /* c33 */ { 0x04, 0x05 }, - /* c34 */ { 0x04, 0x05 }, - /* c35 */ { 0x04, 0x05 }, - /* c36 */ { 0x04, 0x05 }, - /* c37 */ { 0x04, 0x05 }, - /* c38 */ { 0x04, 0x05 }, - /* c39 */ { 0x04, 0x05 }, - /* c3a */ { 0x04, 0x05 }, - /* c3b */ { 0x04, 0x05 }, - /* c3c */ { 0x04, 0x05 }, - /* c3d */ { 0x04, 0x05 }, - /* c3e */ { 0x04, 0x05 }, - /* c3f */ { 0x04, 0x05 }, - /* c40 */ { 0x04, 0x05 }, - /* c41 */ { 0x04, 0x05 }, - /* c42 */ { 0x04, 0x05 }, - /* c43 */ { 0x04, 0x05 }, - /* c44 */ { 0x04, 0x05 }, - /* c45 */ { 0x04, 0x05 }, - /* c46 */ { 0x04, 0x05 }, - /* c47 */ { 0x04, 0x05 }, - /* c48 */ { 0x04, 0x05 }, - /* c49 */ { 0x04, 0x05 }, - /* c4a */ { 0x04, 0x05 }, - /* c4b */ { 0x04, 0x05 }, - /* c4c */ { 0x04, 0x05 }, - /* c4d */ { 0x04, 0x05 }, - /* c4e */ { 0x04, 0x05 }, - /* c4f */ { 0x04, 0x05 }, - /* c50 */ { 0x04, 0x05 }, - /* c51 */ { 0x04, 0x05 }, - /* c52 */ { 0x04, 0x05 }, - /* c53 */ { 0x04, 0x05 }, - /* c54 */ { 0x04, 0x05 }, - /* c55 */ { 0x04, 0x05 }, - /* c56 */ { 0x04, 0x05 }, - /* c57 */ { 0x04, 0x05 }, - /* c58 */ { 0x04, 0x05 }, - /* c59 */ { 0x04, 0x05 }, - /* c5a */ { 0x04, 0x05 }, - /* c5b */ { 0x04, 0x05 }, - /* c5c */ { 0x04, 0x05 }, - /* c5d */ { 0x04, 0x05 }, - /* c5e */ { 0x04, 0x05 }, - /* c5f */ { 0x04, 0x05 }, - /* c60 */ { 0x04, 0x05 }, - /* c61 */ { 0x04, 0x05 }, - /* c62 */ { 0x04, 0x05 }, - /* c63 */ { 0x04, 0x05 }, - /* c64 */ { 0x04, 0x05 }, - /* c65 */ { 0x04, 0x05 }, - /* c66 */ { 0x04, 0x05 }, - /* c67 */ { 0x04, 0x05 }, - /* c68 */ { 0x04, 0x05 }, - /* c69 */ { 0x04, 0x05 }, - /* c6a */ { 0x04, 0x05 }, - /* c6b */ { 0x04, 0x05 }, - /* c6c */ { 0x04, 0x05 }, - /* c6d */ { 0x04, 0x05 }, - /* c6e */ { 0x04, 0x05 }, - /* c6f */ { 0x04, 0x05 }, - /* c70 */ { 0x04, 0x05 }, - /* c71 */ { 0x04, 0x05 }, - /* c72 */ { 0x04, 0x05 }, - /* c73 */ { 0x04, 0x05 }, - /* c74 */ { 0x04, 0x05 }, - /* c75 */ { 0x04, 0x05 }, - /* c76 */ { 0x04, 0x05 }, - /* c77 */ { 0x04, 0x05 }, - /* c78 */ { 0x04, 0x05 }, - /* c79 */ { 0x04, 0x05 }, - /* c7a */ { 0x04, 0x05 }, - /* c7b */ { 0x04, 0x05 }, - /* c7c */ { 0x04, 0x05 }, - /* c7d */ { 0x04, 0x05 }, - /* c7e */ { 0x04, 0x05 }, - /* c7f */ { 0x04, 0x05 }, - /* c80 */ { 0x12, 0x05 }, - /* c81 */ { 0x12, 0x05 }, - /* c82 */ { 0x12, 0x05 }, - /* c83 */ { 0x12, 0x05 }, - /* c84 */ { 0x12, 0x05 }, - /* c85 */ { 0x12, 0x05 }, - /* c86 */ { 0x12, 0x05 }, - /* c87 */ { 0x12, 0x05 }, - /* c88 */ { 0x12, 0x05 }, - /* c89 */ { 0x12, 0x05 }, - /* c8a */ { 0x12, 0x05 }, - /* c8b */ { 0x12, 0x05 }, - /* c8c */ { 0x12, 0x05 }, - /* c8d */ { 0x12, 0x05 }, - /* c8e */ { 0x12, 0x05 }, - /* c8f */ { 0x12, 0x05 }, - /* c90 */ { 0x12, 0x05 }, - /* c91 */ { 0x12, 0x05 }, - /* c92 */ { 0x12, 0x05 }, - /* c93 */ { 0x12, 0x05 }, - /* c94 */ { 0x12, 0x05 }, - /* c95 */ { 0x12, 0x05 }, - /* c96 */ { 0x12, 0x05 }, - /* c97 */ { 0x12, 0x05 }, - /* c98 */ { 0x12, 0x05 }, - /* c99 */ { 0x12, 0x05 }, - /* c9a */ { 0x12, 0x05 }, - /* c9b */ { 0x12, 0x05 }, - /* c9c */ { 0x12, 0x05 }, - /* c9d */ { 0x12, 0x05 }, - /* c9e */ { 0x12, 0x05 }, - /* c9f */ { 0x12, 0x05 }, - /* ca0 */ { 0x12, 0x05 }, - /* ca1 */ { 0x12, 0x05 }, - /* ca2 */ { 0x12, 0x05 }, - /* ca3 */ { 0x12, 0x05 }, - /* ca4 */ { 0x12, 0x05 }, - /* ca5 */ { 0x12, 0x05 }, - /* ca6 */ { 0x12, 0x05 }, - /* ca7 */ { 0x12, 0x05 }, - /* ca8 */ { 0x12, 0x05 }, - /* ca9 */ { 0x12, 0x05 }, - /* caa */ { 0x12, 0x05 }, - /* cab */ { 0x12, 0x05 }, - /* cac */ { 0x12, 0x05 }, - /* cad */ { 0x12, 0x05 }, - /* cae */ { 0x12, 0x05 }, - /* caf */ { 0x12, 0x05 }, - /* cb0 */ { 0x12, 0x05 }, - /* cb1 */ { 0x12, 0x05 }, - /* cb2 */ { 0x12, 0x05 }, - /* cb3 */ { 0x12, 0x05 }, - /* cb4 */ { 0x12, 0x05 }, - /* cb5 */ { 0x12, 0x05 }, - /* cb6 */ { 0x12, 0x05 }, - /* cb7 */ { 0x12, 0x05 }, - /* cb8 */ { 0x12, 0x05 }, - /* cb9 */ { 0x12, 0x05 }, - /* cba */ { 0x12, 0x05 }, - /* cbb */ { 0x12, 0x05 }, - /* cbc */ { 0x12, 0x05 }, - /* cbd */ { 0x12, 0x05 }, - /* cbe */ { 0x12, 0x05 }, - /* cbf */ { 0x12, 0x05 }, - /* cc0 */ { 0x12, 0x05 }, - /* cc1 */ { 0x12, 0x05 }, - /* cc2 */ { 0x12, 0x05 }, - /* cc3 */ { 0x12, 0x05 }, - /* cc4 */ { 0x12, 0x05 }, - /* cc5 */ { 0x12, 0x05 }, - /* cc6 */ { 0x12, 0x05 }, - /* cc7 */ { 0x12, 0x05 }, - /* cc8 */ { 0x12, 0x05 }, - /* cc9 */ { 0x12, 0x05 }, - /* cca */ { 0x12, 0x05 }, - /* ccb */ { 0x12, 0x05 }, - /* ccc */ { 0x12, 0x05 }, - /* ccd */ { 0x12, 0x05 }, - /* cce */ { 0x12, 0x05 }, - /* ccf */ { 0x12, 0x05 }, - /* cd0 */ { 0x12, 0x05 }, - /* cd1 */ { 0x12, 0x05 }, - /* cd2 */ { 0x12, 0x05 }, - /* cd3 */ { 0x12, 0x05 }, - /* cd4 */ { 0x12, 0x05 }, - /* cd5 */ { 0x12, 0x05 }, - /* cd6 */ { 0x12, 0x05 }, - /* cd7 */ { 0x12, 0x05 }, - /* cd8 */ { 0x12, 0x05 }, - /* cd9 */ { 0x12, 0x05 }, - /* cda */ { 0x12, 0x05 }, - /* cdb */ { 0x12, 0x05 }, - /* cdc */ { 0x12, 0x05 }, - /* cdd */ { 0x12, 0x05 }, - /* cde */ { 0x12, 0x05 }, - /* cdf */ { 0x12, 0x05 }, - /* ce0 */ { 0x12, 0x05 }, - /* ce1 */ { 0x12, 0x05 }, - /* ce2 */ { 0x12, 0x05 }, - /* ce3 */ { 0x12, 0x05 }, - /* ce4 */ { 0x12, 0x05 }, - /* ce5 */ { 0x12, 0x05 }, - /* ce6 */ { 0x12, 0x05 }, - /* ce7 */ { 0x12, 0x05 }, - /* ce8 */ { 0x12, 0x05 }, - /* ce9 */ { 0x12, 0x05 }, - /* cea */ { 0x12, 0x05 }, - /* ceb */ { 0x12, 0x05 }, - /* cec */ { 0x12, 0x05 }, - /* ced */ { 0x12, 0x05 }, - /* cee */ { 0x12, 0x05 }, - /* cef */ { 0x12, 0x05 }, - /* cf0 */ { 0x12, 0x05 }, - /* cf1 */ { 0x12, 0x05 }, - /* cf2 */ { 0x12, 0x05 }, - /* cf3 */ { 0x12, 0x05 }, - /* cf4 */ { 0x12, 0x05 }, - /* cf5 */ { 0x12, 0x05 }, - /* cf6 */ { 0x12, 0x05 }, - /* cf7 */ { 0x12, 0x05 }, - /* cf8 */ { 0x12, 0x05 }, - /* cf9 */ { 0x12, 0x05 }, - /* cfa */ { 0x12, 0x05 }, - /* cfb */ { 0x12, 0x05 }, - /* cfc */ { 0x12, 0x05 }, - /* cfd */ { 0x12, 0x05 }, - /* cfe */ { 0x12, 0x05 }, - /* cff */ { 0x12, 0x05 }, - /* d00 */ { 0x31, 0x05 }, - /* d01 */ { 0x31, 0x05 }, - /* d02 */ { 0x31, 0x05 }, - /* d03 */ { 0x31, 0x05 }, - /* d04 */ { 0x31, 0x05 }, - /* d05 */ { 0x31, 0x05 }, - /* d06 */ { 0x31, 0x05 }, - /* d07 */ { 0x31, 0x05 }, - /* d08 */ { 0x31, 0x05 }, - /* d09 */ { 0x31, 0x05 }, - /* d0a */ { 0x31, 0x05 }, - /* d0b */ { 0x31, 0x05 }, - /* d0c */ { 0x31, 0x05 }, - /* d0d */ { 0x31, 0x05 }, - /* d0e */ { 0x31, 0x05 }, - /* d0f */ { 0x31, 0x05 }, - /* d10 */ { 0x31, 0x05 }, - /* d11 */ { 0x31, 0x05 }, - /* d12 */ { 0x31, 0x05 }, - /* d13 */ { 0x31, 0x05 }, - /* d14 */ { 0x31, 0x05 }, - /* d15 */ { 0x31, 0x05 }, - /* d16 */ { 0x31, 0x05 }, - /* d17 */ { 0x31, 0x05 }, - /* d18 */ { 0x31, 0x05 }, - /* d19 */ { 0x31, 0x05 }, - /* d1a */ { 0x31, 0x05 }, - /* d1b */ { 0x31, 0x05 }, - /* d1c */ { 0x31, 0x05 }, - /* d1d */ { 0x31, 0x05 }, - /* d1e */ { 0x31, 0x05 }, - /* d1f */ { 0x31, 0x05 }, - /* d20 */ { 0x31, 0x05 }, - /* d21 */ { 0x31, 0x05 }, - /* d22 */ { 0x31, 0x05 }, - /* d23 */ { 0x31, 0x05 }, - /* d24 */ { 0x31, 0x05 }, - /* d25 */ { 0x31, 0x05 }, - /* d26 */ { 0x31, 0x05 }, - /* d27 */ { 0x31, 0x05 }, - /* d28 */ { 0x31, 0x05 }, - /* d29 */ { 0x31, 0x05 }, - /* d2a */ { 0x31, 0x05 }, - /* d2b */ { 0x31, 0x05 }, - /* d2c */ { 0x31, 0x05 }, - /* d2d */ { 0x31, 0x05 }, - /* d2e */ { 0x31, 0x05 }, - /* d2f */ { 0x31, 0x05 }, - /* d30 */ { 0x31, 0x05 }, - /* d31 */ { 0x31, 0x05 }, - /* d32 */ { 0x31, 0x05 }, - /* d33 */ { 0x31, 0x05 }, - /* d34 */ { 0x31, 0x05 }, - /* d35 */ { 0x31, 0x05 }, - /* d36 */ { 0x31, 0x05 }, - /* d37 */ { 0x31, 0x05 }, - /* d38 */ { 0x31, 0x05 }, - /* d39 */ { 0x31, 0x05 }, - /* d3a */ { 0x31, 0x05 }, - /* d3b */ { 0x31, 0x05 }, - /* d3c */ { 0x31, 0x05 }, - /* d3d */ { 0x31, 0x05 }, - /* d3e */ { 0x31, 0x05 }, - /* d3f */ { 0x31, 0x05 }, - /* d40 */ { 0x31, 0x05 }, - /* d41 */ { 0x31, 0x05 }, - /* d42 */ { 0x31, 0x05 }, - /* d43 */ { 0x31, 0x05 }, - /* d44 */ { 0x31, 0x05 }, - /* d45 */ { 0x31, 0x05 }, - /* d46 */ { 0x31, 0x05 }, - /* d47 */ { 0x31, 0x05 }, - /* d48 */ { 0x31, 0x05 }, - /* d49 */ { 0x31, 0x05 }, - /* d4a */ { 0x31, 0x05 }, - /* d4b */ { 0x31, 0x05 }, - /* d4c */ { 0x31, 0x05 }, - /* d4d */ { 0x31, 0x05 }, - /* d4e */ { 0x31, 0x05 }, - /* d4f */ { 0x31, 0x05 }, - /* d50 */ { 0x31, 0x05 }, - /* d51 */ { 0x31, 0x05 }, - /* d52 */ { 0x31, 0x05 }, - /* d53 */ { 0x31, 0x05 }, - /* d54 */ { 0x31, 0x05 }, - /* d55 */ { 0x31, 0x05 }, - /* d56 */ { 0x31, 0x05 }, - /* d57 */ { 0x31, 0x05 }, - /* d58 */ { 0x31, 0x05 }, - /* d59 */ { 0x31, 0x05 }, - /* d5a */ { 0x31, 0x05 }, - /* d5b */ { 0x31, 0x05 }, - /* d5c */ { 0x31, 0x05 }, - /* d5d */ { 0x31, 0x05 }, - /* d5e */ { 0x31, 0x05 }, - /* d5f */ { 0x31, 0x05 }, - /* d60 */ { 0x31, 0x05 }, - /* d61 */ { 0x31, 0x05 }, - /* d62 */ { 0x31, 0x05 }, - /* d63 */ { 0x31, 0x05 }, - /* d64 */ { 0x31, 0x05 }, - /* d65 */ { 0x31, 0x05 }, - /* d66 */ { 0x31, 0x05 }, - /* d67 */ { 0x31, 0x05 }, - /* d68 */ { 0x31, 0x05 }, - /* d69 */ { 0x31, 0x05 }, - /* d6a */ { 0x31, 0x05 }, - /* d6b */ { 0x31, 0x05 }, - /* d6c */ { 0x31, 0x05 }, - /* d6d */ { 0x31, 0x05 }, - /* d6e */ { 0x31, 0x05 }, - /* d6f */ { 0x31, 0x05 }, - /* d70 */ { 0x31, 0x05 }, - /* d71 */ { 0x31, 0x05 }, - /* d72 */ { 0x31, 0x05 }, - /* d73 */ { 0x31, 0x05 }, - /* d74 */ { 0x31, 0x05 }, - /* d75 */ { 0x31, 0x05 }, - /* d76 */ { 0x31, 0x05 }, - /* d77 */ { 0x31, 0x05 }, - /* d78 */ { 0x31, 0x05 }, - /* d79 */ { 0x31, 0x05 }, - /* d7a */ { 0x31, 0x05 }, - /* d7b */ { 0x31, 0x05 }, - /* d7c */ { 0x31, 0x05 }, - /* d7d */ { 0x31, 0x05 }, - /* d7e */ { 0x31, 0x05 }, - /* d7f */ { 0x31, 0x05 }, - /* d80 */ { 0x41, 0x05 }, - /* d81 */ { 0x41, 0x05 }, - /* d82 */ { 0x41, 0x05 }, - /* d83 */ { 0x41, 0x05 }, - /* d84 */ { 0x41, 0x05 }, - /* d85 */ { 0x41, 0x05 }, - /* d86 */ { 0x41, 0x05 }, - /* d87 */ { 0x41, 0x05 }, - /* d88 */ { 0x41, 0x05 }, - /* d89 */ { 0x41, 0x05 }, - /* d8a */ { 0x41, 0x05 }, - /* d8b */ { 0x41, 0x05 }, - /* d8c */ { 0x41, 0x05 }, - /* d8d */ { 0x41, 0x05 }, - /* d8e */ { 0x41, 0x05 }, - /* d8f */ { 0x41, 0x05 }, - /* d90 */ { 0x41, 0x05 }, - /* d91 */ { 0x41, 0x05 }, - /* d92 */ { 0x41, 0x05 }, - /* d93 */ { 0x41, 0x05 }, - /* d94 */ { 0x41, 0x05 }, - /* d95 */ { 0x41, 0x05 }, - /* d96 */ { 0x41, 0x05 }, - /* d97 */ { 0x41, 0x05 }, - /* d98 */ { 0x41, 0x05 }, - /* d99 */ { 0x41, 0x05 }, - /* d9a */ { 0x41, 0x05 }, - /* d9b */ { 0x41, 0x05 }, - /* d9c */ { 0x41, 0x05 }, - /* d9d */ { 0x41, 0x05 }, - /* d9e */ { 0x41, 0x05 }, - /* d9f */ { 0x41, 0x05 }, - /* da0 */ { 0x41, 0x05 }, - /* da1 */ { 0x41, 0x05 }, - /* da2 */ { 0x41, 0x05 }, - /* da3 */ { 0x41, 0x05 }, - /* da4 */ { 0x41, 0x05 }, - /* da5 */ { 0x41, 0x05 }, - /* da6 */ { 0x41, 0x05 }, - /* da7 */ { 0x41, 0x05 }, - /* da8 */ { 0x41, 0x05 }, - /* da9 */ { 0x41, 0x05 }, - /* daa */ { 0x41, 0x05 }, - /* dab */ { 0x41, 0x05 }, - /* dac */ { 0x41, 0x05 }, - /* dad */ { 0x41, 0x05 }, - /* dae */ { 0x41, 0x05 }, - /* daf */ { 0x41, 0x05 }, - /* db0 */ { 0x41, 0x05 }, - /* db1 */ { 0x41, 0x05 }, - /* db2 */ { 0x41, 0x05 }, - /* db3 */ { 0x41, 0x05 }, - /* db4 */ { 0x41, 0x05 }, - /* db5 */ { 0x41, 0x05 }, - /* db6 */ { 0x41, 0x05 }, - /* db7 */ { 0x41, 0x05 }, - /* db8 */ { 0x41, 0x05 }, - /* db9 */ { 0x41, 0x05 }, - /* dba */ { 0x41, 0x05 }, - /* dbb */ { 0x41, 0x05 }, - /* dbc */ { 0x41, 0x05 }, - /* dbd */ { 0x41, 0x05 }, - /* dbe */ { 0x41, 0x05 }, - /* dbf */ { 0x41, 0x05 }, - /* dc0 */ { 0x41, 0x05 }, - /* dc1 */ { 0x41, 0x05 }, - /* dc2 */ { 0x41, 0x05 }, - /* dc3 */ { 0x41, 0x05 }, - /* dc4 */ { 0x41, 0x05 }, - /* dc5 */ { 0x41, 0x05 }, - /* dc6 */ { 0x41, 0x05 }, - /* dc7 */ { 0x41, 0x05 }, - /* dc8 */ { 0x41, 0x05 }, - /* dc9 */ { 0x41, 0x05 }, - /* dca */ { 0x41, 0x05 }, - /* dcb */ { 0x41, 0x05 }, - /* dcc */ { 0x41, 0x05 }, - /* dcd */ { 0x41, 0x05 }, - /* dce */ { 0x41, 0x05 }, - /* dcf */ { 0x41, 0x05 }, - /* dd0 */ { 0x41, 0x05 }, - /* dd1 */ { 0x41, 0x05 }, - /* dd2 */ { 0x41, 0x05 }, - /* dd3 */ { 0x41, 0x05 }, - /* dd4 */ { 0x41, 0x05 }, - /* dd5 */ { 0x41, 0x05 }, - /* dd6 */ { 0x41, 0x05 }, - /* dd7 */ { 0x41, 0x05 }, - /* dd8 */ { 0x41, 0x05 }, - /* dd9 */ { 0x41, 0x05 }, - /* dda */ { 0x41, 0x05 }, - /* ddb */ { 0x41, 0x05 }, - /* ddc */ { 0x41, 0x05 }, - /* ddd */ { 0x41, 0x05 }, - /* dde */ { 0x41, 0x05 }, - /* ddf */ { 0x41, 0x05 }, - /* de0 */ { 0x41, 0x05 }, - /* de1 */ { 0x41, 0x05 }, - /* de2 */ { 0x41, 0x05 }, - /* de3 */ { 0x41, 0x05 }, - /* de4 */ { 0x41, 0x05 }, - /* de5 */ { 0x41, 0x05 }, - /* de6 */ { 0x41, 0x05 }, - /* de7 */ { 0x41, 0x05 }, - /* de8 */ { 0x41, 0x05 }, - /* de9 */ { 0x41, 0x05 }, - /* dea */ { 0x41, 0x05 }, - /* deb */ { 0x41, 0x05 }, - /* dec */ { 0x41, 0x05 }, - /* ded */ { 0x41, 0x05 }, - /* dee */ { 0x41, 0x05 }, - /* def */ { 0x41, 0x05 }, - /* df0 */ { 0x41, 0x05 }, - /* df1 */ { 0x41, 0x05 }, - /* df2 */ { 0x41, 0x05 }, - /* df3 */ { 0x41, 0x05 }, - /* df4 */ { 0x41, 0x05 }, - /* df5 */ { 0x41, 0x05 }, - /* df6 */ { 0x41, 0x05 }, - /* df7 */ { 0x41, 0x05 }, - /* df8 */ { 0x41, 0x05 }, - /* df9 */ { 0x41, 0x05 }, - /* dfa */ { 0x41, 0x05 }, - /* dfb */ { 0x41, 0x05 }, - /* dfc */ { 0x41, 0x05 }, - /* dfd */ { 0x41, 0x05 }, - /* dfe */ { 0x41, 0x05 }, - /* dff */ { 0x41, 0x05 }, - /* e00 */ { 0x51, 0x06 }, - /* e01 */ { 0x51, 0x06 }, - /* e02 */ { 0x51, 0x06 }, - /* e03 */ { 0x51, 0x06 }, - /* e04 */ { 0x51, 0x06 }, - /* e05 */ { 0x51, 0x06 }, - /* e06 */ { 0x51, 0x06 }, - /* e07 */ { 0x51, 0x06 }, - /* e08 */ { 0x51, 0x06 }, - /* e09 */ { 0x51, 0x06 }, - /* e0a */ { 0x51, 0x06 }, - /* e0b */ { 0x51, 0x06 }, - /* e0c */ { 0x51, 0x06 }, - /* e0d */ { 0x51, 0x06 }, - /* e0e */ { 0x51, 0x06 }, - /* e0f */ { 0x51, 0x06 }, - /* e10 */ { 0x51, 0x06 }, - /* e11 */ { 0x51, 0x06 }, - /* e12 */ { 0x51, 0x06 }, - /* e13 */ { 0x51, 0x06 }, - /* e14 */ { 0x51, 0x06 }, - /* e15 */ { 0x51, 0x06 }, - /* e16 */ { 0x51, 0x06 }, - /* e17 */ { 0x51, 0x06 }, - /* e18 */ { 0x51, 0x06 }, - /* e19 */ { 0x51, 0x06 }, - /* e1a */ { 0x51, 0x06 }, - /* e1b */ { 0x51, 0x06 }, - /* e1c */ { 0x51, 0x06 }, - /* e1d */ { 0x51, 0x06 }, - /* e1e */ { 0x51, 0x06 }, - /* e1f */ { 0x51, 0x06 }, - /* e20 */ { 0x51, 0x06 }, - /* e21 */ { 0x51, 0x06 }, - /* e22 */ { 0x51, 0x06 }, - /* e23 */ { 0x51, 0x06 }, - /* e24 */ { 0x51, 0x06 }, - /* e25 */ { 0x51, 0x06 }, - /* e26 */ { 0x51, 0x06 }, - /* e27 */ { 0x51, 0x06 }, - /* e28 */ { 0x51, 0x06 }, - /* e29 */ { 0x51, 0x06 }, - /* e2a */ { 0x51, 0x06 }, - /* e2b */ { 0x51, 0x06 }, - /* e2c */ { 0x51, 0x06 }, - /* e2d */ { 0x51, 0x06 }, - /* e2e */ { 0x51, 0x06 }, - /* e2f */ { 0x51, 0x06 }, - /* e30 */ { 0x51, 0x06 }, - /* e31 */ { 0x51, 0x06 }, - /* e32 */ { 0x51, 0x06 }, - /* e33 */ { 0x51, 0x06 }, - /* e34 */ { 0x51, 0x06 }, - /* e35 */ { 0x51, 0x06 }, - /* e36 */ { 0x51, 0x06 }, - /* e37 */ { 0x51, 0x06 }, - /* e38 */ { 0x51, 0x06 }, - /* e39 */ { 0x51, 0x06 }, - /* e3a */ { 0x51, 0x06 }, - /* e3b */ { 0x51, 0x06 }, - /* e3c */ { 0x51, 0x06 }, - /* e3d */ { 0x51, 0x06 }, - /* e3e */ { 0x51, 0x06 }, - /* e3f */ { 0x51, 0x06 }, - /* e40 */ { 0x05, 0x07 }, - /* e41 */ { 0x05, 0x07 }, - /* e42 */ { 0x05, 0x07 }, - /* e43 */ { 0x05, 0x07 }, - /* e44 */ { 0x05, 0x07 }, - /* e45 */ { 0x05, 0x07 }, - /* e46 */ { 0x05, 0x07 }, - /* e47 */ { 0x05, 0x07 }, - /* e48 */ { 0x05, 0x07 }, - /* e49 */ { 0x05, 0x07 }, - /* e4a */ { 0x05, 0x07 }, - /* e4b */ { 0x05, 0x07 }, - /* e4c */ { 0x05, 0x07 }, - /* e4d */ { 0x05, 0x07 }, - /* e4e */ { 0x05, 0x07 }, - /* e4f */ { 0x05, 0x07 }, - /* e50 */ { 0x05, 0x07 }, - /* e51 */ { 0x05, 0x07 }, - /* e52 */ { 0x05, 0x07 }, - /* e53 */ { 0x05, 0x07 }, - /* e54 */ { 0x05, 0x07 }, - /* e55 */ { 0x05, 0x07 }, - /* e56 */ { 0x05, 0x07 }, - /* e57 */ { 0x05, 0x07 }, - /* e58 */ { 0x05, 0x07 }, - /* e59 */ { 0x05, 0x07 }, - /* e5a */ { 0x05, 0x07 }, - /* e5b */ { 0x05, 0x07 }, - /* e5c */ { 0x05, 0x07 }, - /* e5d */ { 0x05, 0x07 }, - /* e5e */ { 0x05, 0x07 }, - /* e5f */ { 0x05, 0x07 }, - /* e60 */ { 0x13, 0x07 }, - /* e61 */ { 0x13, 0x07 }, - /* e62 */ { 0x13, 0x07 }, - /* e63 */ { 0x13, 0x07 }, - /* e64 */ { 0x13, 0x07 }, - /* e65 */ { 0x13, 0x07 }, - /* e66 */ { 0x13, 0x07 }, - /* e67 */ { 0x13, 0x07 }, - /* e68 */ { 0x13, 0x07 }, - /* e69 */ { 0x13, 0x07 }, - /* e6a */ { 0x13, 0x07 }, - /* e6b */ { 0x13, 0x07 }, - /* e6c */ { 0x13, 0x07 }, - /* e6d */ { 0x13, 0x07 }, - /* e6e */ { 0x13, 0x07 }, - /* e6f */ { 0x13, 0x07 }, - /* e70 */ { 0x13, 0x07 }, - /* e71 */ { 0x13, 0x07 }, - /* e72 */ { 0x13, 0x07 }, - /* e73 */ { 0x13, 0x07 }, - /* e74 */ { 0x13, 0x07 }, - /* e75 */ { 0x13, 0x07 }, - /* e76 */ { 0x13, 0x07 }, - /* e77 */ { 0x13, 0x07 }, - /* e78 */ { 0x13, 0x07 }, - /* e79 */ { 0x13, 0x07 }, - /* e7a */ { 0x13, 0x07 }, - /* e7b */ { 0x13, 0x07 }, - /* e7c */ { 0x13, 0x07 }, - /* e7d */ { 0x13, 0x07 }, - /* e7e */ { 0x13, 0x07 }, - /* e7f */ { 0x13, 0x07 }, - /* e80 */ { 0x22, 0x07 }, - /* e81 */ { 0x22, 0x07 }, - /* e82 */ { 0x22, 0x07 }, - /* e83 */ { 0x22, 0x07 }, - /* e84 */ { 0x22, 0x07 }, - /* e85 */ { 0x22, 0x07 }, - /* e86 */ { 0x22, 0x07 }, - /* e87 */ { 0x22, 0x07 }, - /* e88 */ { 0x22, 0x07 }, - /* e89 */ { 0x22, 0x07 }, - /* e8a */ { 0x22, 0x07 }, - /* e8b */ { 0x22, 0x07 }, - /* e8c */ { 0x22, 0x07 }, - /* e8d */ { 0x22, 0x07 }, - /* e8e */ { 0x22, 0x07 }, - /* e8f */ { 0x22, 0x07 }, - /* e90 */ { 0x22, 0x07 }, - /* e91 */ { 0x22, 0x07 }, - /* e92 */ { 0x22, 0x07 }, - /* e93 */ { 0x22, 0x07 }, - /* e94 */ { 0x22, 0x07 }, - /* e95 */ { 0x22, 0x07 }, - /* e96 */ { 0x22, 0x07 }, - /* e97 */ { 0x22, 0x07 }, - /* e98 */ { 0x22, 0x07 }, - /* e99 */ { 0x22, 0x07 }, - /* e9a */ { 0x22, 0x07 }, - /* e9b */ { 0x22, 0x07 }, - /* e9c */ { 0x22, 0x07 }, - /* e9d */ { 0x22, 0x07 }, - /* e9e */ { 0x22, 0x07 }, - /* e9f */ { 0x22, 0x07 }, - /* ea0 */ { 0x61, 0x07 }, - /* ea1 */ { 0x61, 0x07 }, - /* ea2 */ { 0x61, 0x07 }, - /* ea3 */ { 0x61, 0x07 }, - /* ea4 */ { 0x61, 0x07 }, - /* ea5 */ { 0x61, 0x07 }, - /* ea6 */ { 0x61, 0x07 }, - /* ea7 */ { 0x61, 0x07 }, - /* ea8 */ { 0x61, 0x07 }, - /* ea9 */ { 0x61, 0x07 }, - /* eaa */ { 0x61, 0x07 }, - /* eab */ { 0x61, 0x07 }, - /* eac */ { 0x61, 0x07 }, - /* ead */ { 0x61, 0x07 }, - /* eae */ { 0x61, 0x07 }, - /* eaf */ { 0x61, 0x07 }, - /* eb0 */ { 0x61, 0x07 }, - /* eb1 */ { 0x61, 0x07 }, - /* eb2 */ { 0x61, 0x07 }, - /* eb3 */ { 0x61, 0x07 }, - /* eb4 */ { 0x61, 0x07 }, - /* eb5 */ { 0x61, 0x07 }, - /* eb6 */ { 0x61, 0x07 }, - /* eb7 */ { 0x61, 0x07 }, - /* eb8 */ { 0x61, 0x07 }, - /* eb9 */ { 0x61, 0x07 }, - /* eba */ { 0x61, 0x07 }, - /* ebb */ { 0x61, 0x07 }, - /* ebc */ { 0x61, 0x07 }, - /* ebd */ { 0x61, 0x07 }, - /* ebe */ { 0x61, 0x07 }, - /* ebf */ { 0x61, 0x07 }, - /* ec0 */ { 0x71, 0x07 }, - /* ec1 */ { 0x71, 0x07 }, - /* ec2 */ { 0x71, 0x07 }, - /* ec3 */ { 0x71, 0x07 }, - /* ec4 */ { 0x71, 0x07 }, - /* ec5 */ { 0x71, 0x07 }, - /* ec6 */ { 0x71, 0x07 }, - /* ec7 */ { 0x71, 0x07 }, - /* ec8 */ { 0x71, 0x07 }, - /* ec9 */ { 0x71, 0x07 }, - /* eca */ { 0x71, 0x07 }, - /* ecb */ { 0x71, 0x07 }, - /* ecc */ { 0x71, 0x07 }, - /* ecd */ { 0x71, 0x07 }, - /* ece */ { 0x71, 0x07 }, - /* ecf */ { 0x71, 0x07 }, - /* ed0 */ { 0x71, 0x07 }, - /* ed1 */ { 0x71, 0x07 }, - /* ed2 */ { 0x71, 0x07 }, - /* ed3 */ { 0x71, 0x07 }, - /* ed4 */ { 0x71, 0x07 }, - /* ed5 */ { 0x71, 0x07 }, - /* ed6 */ { 0x71, 0x07 }, - /* ed7 */ { 0x71, 0x07 }, - /* ed8 */ { 0x71, 0x07 }, - /* ed9 */ { 0x71, 0x07 }, - /* eda */ { 0x71, 0x07 }, - /* edb */ { 0x71, 0x07 }, - /* edc */ { 0x71, 0x07 }, - /* edd */ { 0x71, 0x07 }, - /* ede */ { 0x71, 0x07 }, - /* edf */ { 0x71, 0x07 }, - /* ee0 */ { 0x32, 0x09 }, - /* ee1 */ { 0x32, 0x09 }, - /* ee2 */ { 0x32, 0x09 }, - /* ee3 */ { 0x32, 0x09 }, - /* ee4 */ { 0x32, 0x09 }, - /* ee5 */ { 0x32, 0x09 }, - /* ee6 */ { 0x32, 0x09 }, - /* ee7 */ { 0x32, 0x09 }, - /* ee8 */ { 0x81, 0x09 }, - /* ee9 */ { 0x81, 0x09 }, - /* eea */ { 0x81, 0x09 }, - /* eeb */ { 0x81, 0x09 }, - /* eec */ { 0x81, 0x09 }, - /* eed */ { 0x81, 0x09 }, - /* eee */ { 0x81, 0x09 }, - /* eef */ { 0x81, 0x09 }, - /* ef0 */ { 0x09, 0x0b }, - /* ef1 */ { 0x09, 0x0b }, - /* ef2 */ { 0x19, 0x0b }, - /* ef3 */ { 0x19, 0x0b }, - /* ef4 */ { 0x29, 0x0b }, - /* ef5 */ { 0x29, 0x0b }, - /* ef6 */ { 0x39, 0x0b }, - /* ef7 */ { 0x39, 0x0b }, - /* ef8 */ { 0x49, 0x0b }, - /* ef9 */ { 0x49, 0x0b }, - /* efa */ { 0x59, 0x0b }, - /* efb */ { 0x59, 0x0b }, - /* efc */ { 0x69, 0x0b }, - /* efd */ { 0x69, 0x0b }, - /* efe */ { 0x79, 0x0b }, - /* eff */ { 0x79, 0x0b }, - /* f00 */ { 0x89, 0x0b }, - /* f01 */ { 0x89, 0x0b }, - /* f02 */ { 0x99, 0x0b }, - /* f03 */ { 0x99, 0x0b }, - /* f04 */ { 0xa9, 0x0b }, - /* f05 */ { 0xa9, 0x0b }, - /* f06 */ { 0xb9, 0x0b }, - /* f07 */ { 0xb9, 0x0b }, - /* f08 */ { 0xc9, 0x0b }, - /* f09 */ { 0xc9, 0x0b }, - /* f0a */ { 0xd9, 0x0b }, - /* f0b */ { 0xd9, 0x0b }, - /* f0c */ { 0xe9, 0x0b }, - /* f0d */ { 0xe9, 0x0b }, - /* f0e */ { 0xf9, 0x0b }, - /* f0f */ { 0xf9, 0x0b }, - /* f10 */ { 0x06, 0x0c }, - /* f11 */ { 0x07, 0x0c }, - /* f12 */ { 0x08, 0x0c }, - /* f13 */ { 0x14, 0x0c }, - /* f14 */ { 0x15, 0x0c }, - /* f15 */ { 0x16, 0x0c }, - /* f16 */ { 0x17, 0x0c }, - /* f17 */ { 0x18, 0x0c }, - /* f18 */ { 0x23, 0x0c }, - /* f19 */ { 0x24, 0x0c }, - /* f1a */ { 0x25, 0x0c }, - /* f1b */ { 0x26, 0x0c }, - /* f1c */ { 0x27, 0x0c }, - /* f1d */ { 0x28, 0x0c }, - /* f1e */ { 0x33, 0x0c }, - /* f1f */ { 0x34, 0x0c }, - /* f20 */ { 0x35, 0x0c }, - /* f21 */ { 0x36, 0x0c }, - /* f22 */ { 0x37, 0x0c }, - /* f23 */ { 0x38, 0x0c }, - /* f24 */ { 0x42, 0x0c }, - /* f25 */ { 0x43, 0x0c }, - /* f26 */ { 0x44, 0x0c }, - /* f27 */ { 0x45, 0x0c }, - /* f28 */ { 0x46, 0x0c }, - /* f29 */ { 0x47, 0x0c }, - /* f2a */ { 0x48, 0x0c }, - /* f2b */ { 0x52, 0x0c }, - /* f2c */ { 0x53, 0x0c }, - /* f2d */ { 0x54, 0x0c }, - /* f2e */ { 0x55, 0x0c }, - /* f2f */ { 0x56, 0x0c }, - /* f30 */ { 0x57, 0x0c }, - /* f31 */ { 0x58, 0x0c }, - /* f32 */ { 0x62, 0x0c }, - /* f33 */ { 0x63, 0x0c }, - /* f34 */ { 0x64, 0x0c }, - /* f35 */ { 0x65, 0x0c }, - /* f36 */ { 0x66, 0x0c }, - /* f37 */ { 0x67, 0x0c }, - /* f38 */ { 0x68, 0x0c }, - /* f39 */ { 0x72, 0x0c }, - /* f3a */ { 0x73, 0x0c }, - /* f3b */ { 0x74, 0x0c }, - /* f3c */ { 0x75, 0x0c }, - /* f3d */ { 0x76, 0x0c }, - /* f3e */ { 0x77, 0x0c }, - /* f3f */ { 0x78, 0x0c }, - /* f40 */ { 0x82, 0x0c }, - /* f41 */ { 0x83, 0x0c }, - /* f42 */ { 0x84, 0x0c }, - /* f43 */ { 0x85, 0x0c }, - /* f44 */ { 0x86, 0x0c }, - /* f45 */ { 0x87, 0x0c }, - /* f46 */ { 0x88, 0x0c }, - /* f47 */ { 0x91, 0x0c }, - /* f48 */ { 0x92, 0x0c }, - /* f49 */ { 0x93, 0x0c }, - /* f4a */ { 0x94, 0x0c }, - /* f4b */ { 0x95, 0x0c }, - /* f4c */ { 0x96, 0x0c }, - /* f4d */ { 0x97, 0x0c }, - /* f4e */ { 0x98, 0x0c }, - /* f4f */ { 0xa1, 0x0c }, - /* f50 */ { 0xa2, 0x0c }, - /* f51 */ { 0xa3, 0x0c }, - /* f52 */ { 0xa4, 0x0c }, - /* f53 */ { 0xa5, 0x0c }, - /* f54 */ { 0xa6, 0x0c }, - /* f55 */ { 0xa7, 0x0c }, - /* f56 */ { 0xa8, 0x0c }, - /* f57 */ { 0xb1, 0x0c }, - /* f58 */ { 0xb2, 0x0c }, - /* f59 */ { 0xb3, 0x0c }, - /* f5a */ { 0xb4, 0x0c }, - /* f5b */ { 0xb5, 0x0c }, - /* f5c */ { 0xb6, 0x0c }, - /* f5d */ { 0xb7, 0x0c }, - /* f5e */ { 0xb8, 0x0c }, - /* f5f */ { 0xc1, 0x0c }, - /* f60 */ { 0xc2, 0x0c }, - /* f61 */ { 0xc3, 0x0c }, - /* f62 */ { 0xc4, 0x0c }, - /* f63 */ { 0xc5, 0x0c }, - /* f64 */ { 0xc6, 0x0c }, - /* f65 */ { 0xc7, 0x0c }, - /* f66 */ { 0xc8, 0x0c }, - /* f67 */ { 0xd1, 0x0c }, - /* f68 */ { 0xd2, 0x0c }, - /* f69 */ { 0xd3, 0x0c }, - /* f6a */ { 0xd4, 0x0c }, - /* f6b */ { 0xd5, 0x0c }, - /* f6c */ { 0xd6, 0x0c }, - /* f6d */ { 0xd7, 0x0c }, - /* f6e */ { 0xd8, 0x0c }, - /* f6f */ { 0xe1, 0x0c }, - /* f70 */ { 0xe2, 0x0c }, - /* f71 */ { 0xe3, 0x0c }, - /* f72 */ { 0xe4, 0x0c }, - /* f73 */ { 0xe5, 0x0c }, - /* f74 */ { 0xe6, 0x0c }, - /* f75 */ { 0xe7, 0x0c }, - /* f76 */ { 0xe8, 0x0c }, - /* f77 */ { 0xf1, 0x0c }, - /* f78 */ { 0xf2, 0x0c }, - /* f79 */ { 0xf3, 0x0c }, - /* f7a */ { 0xf4, 0x0c }, - /* f7b */ { 0xf5, 0x0c }, - /* f7c */ { 0xf6, 0x0c }, - /* f7d */ { 0xf7, 0x0c }, - /* f7e */ { 0xf8, 0x0c }, - /* f7f */ { 0x10, 0x0c }, - /* f80 */ { 0x00, 0x05 }, - /* f81 */ { 0x00, 0x05 }, - /* f82 */ { 0x00, 0x05 }, - /* f83 */ { 0x00, 0x05 }, - /* f84 */ { 0x00, 0x05 }, - /* f85 */ { 0x00, 0x05 }, - /* f86 */ { 0x00, 0x05 }, - /* f87 */ { 0x00, 0x05 }, - /* f88 */ { 0x00, 0x05 }, - /* f89 */ { 0x00, 0x05 }, - /* f8a */ { 0x00, 0x05 }, - /* f8b */ { 0x00, 0x05 }, - /* f8c */ { 0x00, 0x05 }, - /* f8d */ { 0x00, 0x05 }, - /* f8e */ { 0x00, 0x05 }, - /* f8f */ { 0x00, 0x05 }, - /* f90 */ { 0x00, 0x05 }, - /* f91 */ { 0x00, 0x05 }, - /* f92 */ { 0x00, 0x05 }, - /* f93 */ { 0x00, 0x05 }, - /* f94 */ { 0x00, 0x05 }, - /* f95 */ { 0x00, 0x05 }, - /* f96 */ { 0x00, 0x05 }, - /* f97 */ { 0x00, 0x05 }, - /* f98 */ { 0x00, 0x05 }, - /* f99 */ { 0x00, 0x05 }, - /* f9a */ { 0x00, 0x05 }, - /* f9b */ { 0x00, 0x05 }, - /* f9c */ { 0x00, 0x05 }, - /* f9d */ { 0x00, 0x05 }, - /* f9e */ { 0x00, 0x05 }, - /* f9f */ { 0x00, 0x05 }, - /* fa0 */ { 0x00, 0x05 }, - /* fa1 */ { 0x00, 0x05 }, - /* fa2 */ { 0x00, 0x05 }, - /* fa3 */ { 0x00, 0x05 }, - /* fa4 */ { 0x00, 0x05 }, - /* fa5 */ { 0x00, 0x05 }, - /* fa6 */ { 0x00, 0x05 }, - /* fa7 */ { 0x00, 0x05 }, - /* fa8 */ { 0x00, 0x05 }, - /* fa9 */ { 0x00, 0x05 }, - /* faa */ { 0x00, 0x05 }, - /* fab */ { 0x00, 0x05 }, - /* fac */ { 0x00, 0x05 }, - /* fad */ { 0x00, 0x05 }, - /* fae */ { 0x00, 0x05 }, - /* faf */ { 0x00, 0x05 }, - /* fb0 */ { 0x00, 0x05 }, - /* fb1 */ { 0x00, 0x05 }, - /* fb2 */ { 0x00, 0x05 }, - /* fb3 */ { 0x00, 0x05 }, - /* fb4 */ { 0x00, 0x05 }, - /* fb5 */ { 0x00, 0x05 }, - /* fb6 */ { 0x00, 0x05 }, - /* fb7 */ { 0x00, 0x05 }, - /* fb8 */ { 0x00, 0x05 }, - /* fb9 */ { 0x00, 0x05 }, - /* fba */ { 0x00, 0x05 }, - /* fbb */ { 0x00, 0x05 }, - /* fbc */ { 0x00, 0x05 }, - /* fbd */ { 0x00, 0x05 }, - /* fbe */ { 0x00, 0x05 }, - /* fbf */ { 0x00, 0x05 }, - /* fc0 */ { 0x00, 0x05 }, - /* fc1 */ { 0x00, 0x05 }, - /* fc2 */ { 0x00, 0x05 }, - /* fc3 */ { 0x00, 0x05 }, - /* fc4 */ { 0x00, 0x05 }, - /* fc5 */ { 0x00, 0x05 }, - /* fc6 */ { 0x00, 0x05 }, - /* fc7 */ { 0x00, 0x05 }, - /* fc8 */ { 0x00, 0x05 }, - /* fc9 */ { 0x00, 0x05 }, - /* fca */ { 0x00, 0x05 }, - /* fcb */ { 0x00, 0x05 }, - /* fcc */ { 0x00, 0x05 }, - /* fcd */ { 0x00, 0x05 }, - /* fce */ { 0x00, 0x05 }, - /* fcf */ { 0x00, 0x05 }, - /* fd0 */ { 0x00, 0x05 }, - /* fd1 */ { 0x00, 0x05 }, - /* fd2 */ { 0x00, 0x05 }, - /* fd3 */ { 0x00, 0x05 }, - /* fd4 */ { 0x00, 0x05 }, - /* fd5 */ { 0x00, 0x05 }, - /* fd6 */ { 0x00, 0x05 }, - /* fd7 */ { 0x00, 0x05 }, - /* fd8 */ { 0x00, 0x05 }, - /* fd9 */ { 0x00, 0x05 }, - /* fda */ { 0x00, 0x05 }, - /* fdb */ { 0x00, 0x05 }, - /* fdc */ { 0x00, 0x05 }, - /* fdd */ { 0x00, 0x05 }, - /* fde */ { 0x00, 0x05 }, - /* fdf */ { 0x00, 0x05 }, - /* fe0 */ { 0x00, 0x05 }, - /* fe1 */ { 0x00, 0x05 }, - /* fe2 */ { 0x00, 0x05 }, - /* fe3 */ { 0x00, 0x05 }, - /* fe4 */ { 0x00, 0x05 }, - /* fe5 */ { 0x00, 0x05 }, - /* fe6 */ { 0x00, 0x05 }, - /* fe7 */ { 0x00, 0x05 }, - /* fe8 */ { 0x00, 0x05 }, - /* fe9 */ { 0x00, 0x05 }, - /* fea */ { 0x00, 0x05 }, - /* feb */ { 0x00, 0x05 }, - /* fec */ { 0x00, 0x05 }, - /* fed */ { 0x00, 0x05 }, - /* fee */ { 0x00, 0x05 }, - /* fef */ { 0x00, 0x05 }, - /* ff0 */ { 0x00, 0x05 }, - /* ff1 */ { 0x00, 0x05 }, - /* ff2 */ { 0x00, 0x05 }, - /* ff3 */ { 0x00, 0x05 }, - /* ff4 */ { 0x00, 0x05 }, - /* ff5 */ { 0x00, 0x05 }, - /* ff6 */ { 0x00, 0x05 }, - /* ff7 */ { 0x00, 0x05 }, - /* ff8 */ { 0x00, 0x05 }, - /* ff9 */ { 0x00, 0x05 }, - /* ffa */ { 0x00, 0x05 }, - /* ffb */ { 0x00, 0x05 }, - /* ffc */ { 0x00, 0x05 }, - /* ffd */ { 0x00, 0x05 }, - /* ffe */ { 0x00, 0x05 }, - /* fff */ { 0x00, 0x05 }, diff --git a/waterbox/pcfx/rainbow_acy.inc b/waterbox/pcfx/rainbow_acy.inc deleted file mode 100644 index 8c36f55de6..0000000000 --- a/waterbox/pcfx/rainbow_acy.inc +++ /dev/null @@ -1,4096 +0,0 @@ - /* 000 */ { 0x01, 0x02 }, - /* 001 */ { 0x01, 0x02 }, - /* 002 */ { 0x01, 0x02 }, - /* 003 */ { 0x01, 0x02 }, - /* 004 */ { 0x01, 0x02 }, - /* 005 */ { 0x01, 0x02 }, - /* 006 */ { 0x01, 0x02 }, - /* 007 */ { 0x01, 0x02 }, - /* 008 */ { 0x01, 0x02 }, - /* 009 */ { 0x01, 0x02 }, - /* 00a */ { 0x01, 0x02 }, - /* 00b */ { 0x01, 0x02 }, - /* 00c */ { 0x01, 0x02 }, - /* 00d */ { 0x01, 0x02 }, - /* 00e */ { 0x01, 0x02 }, - /* 00f */ { 0x01, 0x02 }, - /* 010 */ { 0x01, 0x02 }, - /* 011 */ { 0x01, 0x02 }, - /* 012 */ { 0x01, 0x02 }, - /* 013 */ { 0x01, 0x02 }, - /* 014 */ { 0x01, 0x02 }, - /* 015 */ { 0x01, 0x02 }, - /* 016 */ { 0x01, 0x02 }, - /* 017 */ { 0x01, 0x02 }, - /* 018 */ { 0x01, 0x02 }, - /* 019 */ { 0x01, 0x02 }, - /* 01a */ { 0x01, 0x02 }, - /* 01b */ { 0x01, 0x02 }, - /* 01c */ { 0x01, 0x02 }, - /* 01d */ { 0x01, 0x02 }, - /* 01e */ { 0x01, 0x02 }, - /* 01f */ { 0x01, 0x02 }, - /* 020 */ { 0x01, 0x02 }, - /* 021 */ { 0x01, 0x02 }, - /* 022 */ { 0x01, 0x02 }, - /* 023 */ { 0x01, 0x02 }, - /* 024 */ { 0x01, 0x02 }, - /* 025 */ { 0x01, 0x02 }, - /* 026 */ { 0x01, 0x02 }, - /* 027 */ { 0x01, 0x02 }, - /* 028 */ { 0x01, 0x02 }, - /* 029 */ { 0x01, 0x02 }, - /* 02a */ { 0x01, 0x02 }, - /* 02b */ { 0x01, 0x02 }, - /* 02c */ { 0x01, 0x02 }, - /* 02d */ { 0x01, 0x02 }, - /* 02e */ { 0x01, 0x02 }, - /* 02f */ { 0x01, 0x02 }, - /* 030 */ { 0x01, 0x02 }, - /* 031 */ { 0x01, 0x02 }, - /* 032 */ { 0x01, 0x02 }, - /* 033 */ { 0x01, 0x02 }, - /* 034 */ { 0x01, 0x02 }, - /* 035 */ { 0x01, 0x02 }, - /* 036 */ { 0x01, 0x02 }, - /* 037 */ { 0x01, 0x02 }, - /* 038 */ { 0x01, 0x02 }, - /* 039 */ { 0x01, 0x02 }, - /* 03a */ { 0x01, 0x02 }, - /* 03b */ { 0x01, 0x02 }, - /* 03c */ { 0x01, 0x02 }, - /* 03d */ { 0x01, 0x02 }, - /* 03e */ { 0x01, 0x02 }, - /* 03f */ { 0x01, 0x02 }, - /* 040 */ { 0x01, 0x02 }, - /* 041 */ { 0x01, 0x02 }, - /* 042 */ { 0x01, 0x02 }, - /* 043 */ { 0x01, 0x02 }, - /* 044 */ { 0x01, 0x02 }, - /* 045 */ { 0x01, 0x02 }, - /* 046 */ { 0x01, 0x02 }, - /* 047 */ { 0x01, 0x02 }, - /* 048 */ { 0x01, 0x02 }, - /* 049 */ { 0x01, 0x02 }, - /* 04a */ { 0x01, 0x02 }, - /* 04b */ { 0x01, 0x02 }, - /* 04c */ { 0x01, 0x02 }, - /* 04d */ { 0x01, 0x02 }, - /* 04e */ { 0x01, 0x02 }, - /* 04f */ { 0x01, 0x02 }, - /* 050 */ { 0x01, 0x02 }, - /* 051 */ { 0x01, 0x02 }, - /* 052 */ { 0x01, 0x02 }, - /* 053 */ { 0x01, 0x02 }, - /* 054 */ { 0x01, 0x02 }, - /* 055 */ { 0x01, 0x02 }, - /* 056 */ { 0x01, 0x02 }, - /* 057 */ { 0x01, 0x02 }, - /* 058 */ { 0x01, 0x02 }, - /* 059 */ { 0x01, 0x02 }, - /* 05a */ { 0x01, 0x02 }, - /* 05b */ { 0x01, 0x02 }, - /* 05c */ { 0x01, 0x02 }, - /* 05d */ { 0x01, 0x02 }, - /* 05e */ { 0x01, 0x02 }, - /* 05f */ { 0x01, 0x02 }, - /* 060 */ { 0x01, 0x02 }, - /* 061 */ { 0x01, 0x02 }, - /* 062 */ { 0x01, 0x02 }, - /* 063 */ { 0x01, 0x02 }, - /* 064 */ { 0x01, 0x02 }, - /* 065 */ { 0x01, 0x02 }, - /* 066 */ { 0x01, 0x02 }, - /* 067 */ { 0x01, 0x02 }, - /* 068 */ { 0x01, 0x02 }, - /* 069 */ { 0x01, 0x02 }, - /* 06a */ { 0x01, 0x02 }, - /* 06b */ { 0x01, 0x02 }, - /* 06c */ { 0x01, 0x02 }, - /* 06d */ { 0x01, 0x02 }, - /* 06e */ { 0x01, 0x02 }, - /* 06f */ { 0x01, 0x02 }, - /* 070 */ { 0x01, 0x02 }, - /* 071 */ { 0x01, 0x02 }, - /* 072 */ { 0x01, 0x02 }, - /* 073 */ { 0x01, 0x02 }, - /* 074 */ { 0x01, 0x02 }, - /* 075 */ { 0x01, 0x02 }, - /* 076 */ { 0x01, 0x02 }, - /* 077 */ { 0x01, 0x02 }, - /* 078 */ { 0x01, 0x02 }, - /* 079 */ { 0x01, 0x02 }, - /* 07a */ { 0x01, 0x02 }, - /* 07b */ { 0x01, 0x02 }, - /* 07c */ { 0x01, 0x02 }, - /* 07d */ { 0x01, 0x02 }, - /* 07e */ { 0x01, 0x02 }, - /* 07f */ { 0x01, 0x02 }, - /* 080 */ { 0x01, 0x02 }, - /* 081 */ { 0x01, 0x02 }, - /* 082 */ { 0x01, 0x02 }, - /* 083 */ { 0x01, 0x02 }, - /* 084 */ { 0x01, 0x02 }, - /* 085 */ { 0x01, 0x02 }, - /* 086 */ { 0x01, 0x02 }, - /* 087 */ { 0x01, 0x02 }, - /* 088 */ { 0x01, 0x02 }, - /* 089 */ { 0x01, 0x02 }, - /* 08a */ { 0x01, 0x02 }, - /* 08b */ { 0x01, 0x02 }, - /* 08c */ { 0x01, 0x02 }, - /* 08d */ { 0x01, 0x02 }, - /* 08e */ { 0x01, 0x02 }, - /* 08f */ { 0x01, 0x02 }, - /* 090 */ { 0x01, 0x02 }, - /* 091 */ { 0x01, 0x02 }, - /* 092 */ { 0x01, 0x02 }, - /* 093 */ { 0x01, 0x02 }, - /* 094 */ { 0x01, 0x02 }, - /* 095 */ { 0x01, 0x02 }, - /* 096 */ { 0x01, 0x02 }, - /* 097 */ { 0x01, 0x02 }, - /* 098 */ { 0x01, 0x02 }, - /* 099 */ { 0x01, 0x02 }, - /* 09a */ { 0x01, 0x02 }, - /* 09b */ { 0x01, 0x02 }, - /* 09c */ { 0x01, 0x02 }, - /* 09d */ { 0x01, 0x02 }, - /* 09e */ { 0x01, 0x02 }, - /* 09f */ { 0x01, 0x02 }, - /* 0a0 */ { 0x01, 0x02 }, - /* 0a1 */ { 0x01, 0x02 }, - /* 0a2 */ { 0x01, 0x02 }, - /* 0a3 */ { 0x01, 0x02 }, - /* 0a4 */ { 0x01, 0x02 }, - /* 0a5 */ { 0x01, 0x02 }, - /* 0a6 */ { 0x01, 0x02 }, - /* 0a7 */ { 0x01, 0x02 }, - /* 0a8 */ { 0x01, 0x02 }, - /* 0a9 */ { 0x01, 0x02 }, - /* 0aa */ { 0x01, 0x02 }, - /* 0ab */ { 0x01, 0x02 }, - /* 0ac */ { 0x01, 0x02 }, - /* 0ad */ { 0x01, 0x02 }, - /* 0ae */ { 0x01, 0x02 }, - /* 0af */ { 0x01, 0x02 }, - /* 0b0 */ { 0x01, 0x02 }, - /* 0b1 */ { 0x01, 0x02 }, - /* 0b2 */ { 0x01, 0x02 }, - /* 0b3 */ { 0x01, 0x02 }, - /* 0b4 */ { 0x01, 0x02 }, - /* 0b5 */ { 0x01, 0x02 }, - /* 0b6 */ { 0x01, 0x02 }, - /* 0b7 */ { 0x01, 0x02 }, - /* 0b8 */ { 0x01, 0x02 }, - /* 0b9 */ { 0x01, 0x02 }, - /* 0ba */ { 0x01, 0x02 }, - /* 0bb */ { 0x01, 0x02 }, - /* 0bc */ { 0x01, 0x02 }, - /* 0bd */ { 0x01, 0x02 }, - /* 0be */ { 0x01, 0x02 }, - /* 0bf */ { 0x01, 0x02 }, - /* 0c0 */ { 0x01, 0x02 }, - /* 0c1 */ { 0x01, 0x02 }, - /* 0c2 */ { 0x01, 0x02 }, - /* 0c3 */ { 0x01, 0x02 }, - /* 0c4 */ { 0x01, 0x02 }, - /* 0c5 */ { 0x01, 0x02 }, - /* 0c6 */ { 0x01, 0x02 }, - /* 0c7 */ { 0x01, 0x02 }, - /* 0c8 */ { 0x01, 0x02 }, - /* 0c9 */ { 0x01, 0x02 }, - /* 0ca */ { 0x01, 0x02 }, - /* 0cb */ { 0x01, 0x02 }, - /* 0cc */ { 0x01, 0x02 }, - /* 0cd */ { 0x01, 0x02 }, - /* 0ce */ { 0x01, 0x02 }, - /* 0cf */ { 0x01, 0x02 }, - /* 0d0 */ { 0x01, 0x02 }, - /* 0d1 */ { 0x01, 0x02 }, - /* 0d2 */ { 0x01, 0x02 }, - /* 0d3 */ { 0x01, 0x02 }, - /* 0d4 */ { 0x01, 0x02 }, - /* 0d5 */ { 0x01, 0x02 }, - /* 0d6 */ { 0x01, 0x02 }, - /* 0d7 */ { 0x01, 0x02 }, - /* 0d8 */ { 0x01, 0x02 }, - /* 0d9 */ { 0x01, 0x02 }, - /* 0da */ { 0x01, 0x02 }, - /* 0db */ { 0x01, 0x02 }, - /* 0dc */ { 0x01, 0x02 }, - /* 0dd */ { 0x01, 0x02 }, - /* 0de */ { 0x01, 0x02 }, - /* 0df */ { 0x01, 0x02 }, - /* 0e0 */ { 0x01, 0x02 }, - /* 0e1 */ { 0x01, 0x02 }, - /* 0e2 */ { 0x01, 0x02 }, - /* 0e3 */ { 0x01, 0x02 }, - /* 0e4 */ { 0x01, 0x02 }, - /* 0e5 */ { 0x01, 0x02 }, - /* 0e6 */ { 0x01, 0x02 }, - /* 0e7 */ { 0x01, 0x02 }, - /* 0e8 */ { 0x01, 0x02 }, - /* 0e9 */ { 0x01, 0x02 }, - /* 0ea */ { 0x01, 0x02 }, - /* 0eb */ { 0x01, 0x02 }, - /* 0ec */ { 0x01, 0x02 }, - /* 0ed */ { 0x01, 0x02 }, - /* 0ee */ { 0x01, 0x02 }, - /* 0ef */ { 0x01, 0x02 }, - /* 0f0 */ { 0x01, 0x02 }, - /* 0f1 */ { 0x01, 0x02 }, - /* 0f2 */ { 0x01, 0x02 }, - /* 0f3 */ { 0x01, 0x02 }, - /* 0f4 */ { 0x01, 0x02 }, - /* 0f5 */ { 0x01, 0x02 }, - /* 0f6 */ { 0x01, 0x02 }, - /* 0f7 */ { 0x01, 0x02 }, - /* 0f8 */ { 0x01, 0x02 }, - /* 0f9 */ { 0x01, 0x02 }, - /* 0fa */ { 0x01, 0x02 }, - /* 0fb */ { 0x01, 0x02 }, - /* 0fc */ { 0x01, 0x02 }, - /* 0fd */ { 0x01, 0x02 }, - /* 0fe */ { 0x01, 0x02 }, - /* 0ff */ { 0x01, 0x02 }, - /* 100 */ { 0x01, 0x02 }, - /* 101 */ { 0x01, 0x02 }, - /* 102 */ { 0x01, 0x02 }, - /* 103 */ { 0x01, 0x02 }, - /* 104 */ { 0x01, 0x02 }, - /* 105 */ { 0x01, 0x02 }, - /* 106 */ { 0x01, 0x02 }, - /* 107 */ { 0x01, 0x02 }, - /* 108 */ { 0x01, 0x02 }, - /* 109 */ { 0x01, 0x02 }, - /* 10a */ { 0x01, 0x02 }, - /* 10b */ { 0x01, 0x02 }, - /* 10c */ { 0x01, 0x02 }, - /* 10d */ { 0x01, 0x02 }, - /* 10e */ { 0x01, 0x02 }, - /* 10f */ { 0x01, 0x02 }, - /* 110 */ { 0x01, 0x02 }, - /* 111 */ { 0x01, 0x02 }, - /* 112 */ { 0x01, 0x02 }, - /* 113 */ { 0x01, 0x02 }, - /* 114 */ { 0x01, 0x02 }, - /* 115 */ { 0x01, 0x02 }, - /* 116 */ { 0x01, 0x02 }, - /* 117 */ { 0x01, 0x02 }, - /* 118 */ { 0x01, 0x02 }, - /* 119 */ { 0x01, 0x02 }, - /* 11a */ { 0x01, 0x02 }, - /* 11b */ { 0x01, 0x02 }, - /* 11c */ { 0x01, 0x02 }, - /* 11d */ { 0x01, 0x02 }, - /* 11e */ { 0x01, 0x02 }, - /* 11f */ { 0x01, 0x02 }, - /* 120 */ { 0x01, 0x02 }, - /* 121 */ { 0x01, 0x02 }, - /* 122 */ { 0x01, 0x02 }, - /* 123 */ { 0x01, 0x02 }, - /* 124 */ { 0x01, 0x02 }, - /* 125 */ { 0x01, 0x02 }, - /* 126 */ { 0x01, 0x02 }, - /* 127 */ { 0x01, 0x02 }, - /* 128 */ { 0x01, 0x02 }, - /* 129 */ { 0x01, 0x02 }, - /* 12a */ { 0x01, 0x02 }, - /* 12b */ { 0x01, 0x02 }, - /* 12c */ { 0x01, 0x02 }, - /* 12d */ { 0x01, 0x02 }, - /* 12e */ { 0x01, 0x02 }, - /* 12f */ { 0x01, 0x02 }, - /* 130 */ { 0x01, 0x02 }, - /* 131 */ { 0x01, 0x02 }, - /* 132 */ { 0x01, 0x02 }, - /* 133 */ { 0x01, 0x02 }, - /* 134 */ { 0x01, 0x02 }, - /* 135 */ { 0x01, 0x02 }, - /* 136 */ { 0x01, 0x02 }, - /* 137 */ { 0x01, 0x02 }, - /* 138 */ { 0x01, 0x02 }, - /* 139 */ { 0x01, 0x02 }, - /* 13a */ { 0x01, 0x02 }, - /* 13b */ { 0x01, 0x02 }, - /* 13c */ { 0x01, 0x02 }, - /* 13d */ { 0x01, 0x02 }, - /* 13e */ { 0x01, 0x02 }, - /* 13f */ { 0x01, 0x02 }, - /* 140 */ { 0x01, 0x02 }, - /* 141 */ { 0x01, 0x02 }, - /* 142 */ { 0x01, 0x02 }, - /* 143 */ { 0x01, 0x02 }, - /* 144 */ { 0x01, 0x02 }, - /* 145 */ { 0x01, 0x02 }, - /* 146 */ { 0x01, 0x02 }, - /* 147 */ { 0x01, 0x02 }, - /* 148 */ { 0x01, 0x02 }, - /* 149 */ { 0x01, 0x02 }, - /* 14a */ { 0x01, 0x02 }, - /* 14b */ { 0x01, 0x02 }, - /* 14c */ { 0x01, 0x02 }, - /* 14d */ { 0x01, 0x02 }, - /* 14e */ { 0x01, 0x02 }, - /* 14f */ { 0x01, 0x02 }, - /* 150 */ { 0x01, 0x02 }, - /* 151 */ { 0x01, 0x02 }, - /* 152 */ { 0x01, 0x02 }, - /* 153 */ { 0x01, 0x02 }, - /* 154 */ { 0x01, 0x02 }, - /* 155 */ { 0x01, 0x02 }, - /* 156 */ { 0x01, 0x02 }, - /* 157 */ { 0x01, 0x02 }, - /* 158 */ { 0x01, 0x02 }, - /* 159 */ { 0x01, 0x02 }, - /* 15a */ { 0x01, 0x02 }, - /* 15b */ { 0x01, 0x02 }, - /* 15c */ { 0x01, 0x02 }, - /* 15d */ { 0x01, 0x02 }, - /* 15e */ { 0x01, 0x02 }, - /* 15f */ { 0x01, 0x02 }, - /* 160 */ { 0x01, 0x02 }, - /* 161 */ { 0x01, 0x02 }, - /* 162 */ { 0x01, 0x02 }, - /* 163 */ { 0x01, 0x02 }, - /* 164 */ { 0x01, 0x02 }, - /* 165 */ { 0x01, 0x02 }, - /* 166 */ { 0x01, 0x02 }, - /* 167 */ { 0x01, 0x02 }, - /* 168 */ { 0x01, 0x02 }, - /* 169 */ { 0x01, 0x02 }, - /* 16a */ { 0x01, 0x02 }, - /* 16b */ { 0x01, 0x02 }, - /* 16c */ { 0x01, 0x02 }, - /* 16d */ { 0x01, 0x02 }, - /* 16e */ { 0x01, 0x02 }, - /* 16f */ { 0x01, 0x02 }, - /* 170 */ { 0x01, 0x02 }, - /* 171 */ { 0x01, 0x02 }, - /* 172 */ { 0x01, 0x02 }, - /* 173 */ { 0x01, 0x02 }, - /* 174 */ { 0x01, 0x02 }, - /* 175 */ { 0x01, 0x02 }, - /* 176 */ { 0x01, 0x02 }, - /* 177 */ { 0x01, 0x02 }, - /* 178 */ { 0x01, 0x02 }, - /* 179 */ { 0x01, 0x02 }, - /* 17a */ { 0x01, 0x02 }, - /* 17b */ { 0x01, 0x02 }, - /* 17c */ { 0x01, 0x02 }, - /* 17d */ { 0x01, 0x02 }, - /* 17e */ { 0x01, 0x02 }, - /* 17f */ { 0x01, 0x02 }, - /* 180 */ { 0x01, 0x02 }, - /* 181 */ { 0x01, 0x02 }, - /* 182 */ { 0x01, 0x02 }, - /* 183 */ { 0x01, 0x02 }, - /* 184 */ { 0x01, 0x02 }, - /* 185 */ { 0x01, 0x02 }, - /* 186 */ { 0x01, 0x02 }, - /* 187 */ { 0x01, 0x02 }, - /* 188 */ { 0x01, 0x02 }, - /* 189 */ { 0x01, 0x02 }, - /* 18a */ { 0x01, 0x02 }, - /* 18b */ { 0x01, 0x02 }, - /* 18c */ { 0x01, 0x02 }, - /* 18d */ { 0x01, 0x02 }, - /* 18e */ { 0x01, 0x02 }, - /* 18f */ { 0x01, 0x02 }, - /* 190 */ { 0x01, 0x02 }, - /* 191 */ { 0x01, 0x02 }, - /* 192 */ { 0x01, 0x02 }, - /* 193 */ { 0x01, 0x02 }, - /* 194 */ { 0x01, 0x02 }, - /* 195 */ { 0x01, 0x02 }, - /* 196 */ { 0x01, 0x02 }, - /* 197 */ { 0x01, 0x02 }, - /* 198 */ { 0x01, 0x02 }, - /* 199 */ { 0x01, 0x02 }, - /* 19a */ { 0x01, 0x02 }, - /* 19b */ { 0x01, 0x02 }, - /* 19c */ { 0x01, 0x02 }, - /* 19d */ { 0x01, 0x02 }, - /* 19e */ { 0x01, 0x02 }, - /* 19f */ { 0x01, 0x02 }, - /* 1a0 */ { 0x01, 0x02 }, - /* 1a1 */ { 0x01, 0x02 }, - /* 1a2 */ { 0x01, 0x02 }, - /* 1a3 */ { 0x01, 0x02 }, - /* 1a4 */ { 0x01, 0x02 }, - /* 1a5 */ { 0x01, 0x02 }, - /* 1a6 */ { 0x01, 0x02 }, - /* 1a7 */ { 0x01, 0x02 }, - /* 1a8 */ { 0x01, 0x02 }, - /* 1a9 */ { 0x01, 0x02 }, - /* 1aa */ { 0x01, 0x02 }, - /* 1ab */ { 0x01, 0x02 }, - /* 1ac */ { 0x01, 0x02 }, - /* 1ad */ { 0x01, 0x02 }, - /* 1ae */ { 0x01, 0x02 }, - /* 1af */ { 0x01, 0x02 }, - /* 1b0 */ { 0x01, 0x02 }, - /* 1b1 */ { 0x01, 0x02 }, - /* 1b2 */ { 0x01, 0x02 }, - /* 1b3 */ { 0x01, 0x02 }, - /* 1b4 */ { 0x01, 0x02 }, - /* 1b5 */ { 0x01, 0x02 }, - /* 1b6 */ { 0x01, 0x02 }, - /* 1b7 */ { 0x01, 0x02 }, - /* 1b8 */ { 0x01, 0x02 }, - /* 1b9 */ { 0x01, 0x02 }, - /* 1ba */ { 0x01, 0x02 }, - /* 1bb */ { 0x01, 0x02 }, - /* 1bc */ { 0x01, 0x02 }, - /* 1bd */ { 0x01, 0x02 }, - /* 1be */ { 0x01, 0x02 }, - /* 1bf */ { 0x01, 0x02 }, - /* 1c0 */ { 0x01, 0x02 }, - /* 1c1 */ { 0x01, 0x02 }, - /* 1c2 */ { 0x01, 0x02 }, - /* 1c3 */ { 0x01, 0x02 }, - /* 1c4 */ { 0x01, 0x02 }, - /* 1c5 */ { 0x01, 0x02 }, - /* 1c6 */ { 0x01, 0x02 }, - /* 1c7 */ { 0x01, 0x02 }, - /* 1c8 */ { 0x01, 0x02 }, - /* 1c9 */ { 0x01, 0x02 }, - /* 1ca */ { 0x01, 0x02 }, - /* 1cb */ { 0x01, 0x02 }, - /* 1cc */ { 0x01, 0x02 }, - /* 1cd */ { 0x01, 0x02 }, - /* 1ce */ { 0x01, 0x02 }, - /* 1cf */ { 0x01, 0x02 }, - /* 1d0 */ { 0x01, 0x02 }, - /* 1d1 */ { 0x01, 0x02 }, - /* 1d2 */ { 0x01, 0x02 }, - /* 1d3 */ { 0x01, 0x02 }, - /* 1d4 */ { 0x01, 0x02 }, - /* 1d5 */ { 0x01, 0x02 }, - /* 1d6 */ { 0x01, 0x02 }, - /* 1d7 */ { 0x01, 0x02 }, - /* 1d8 */ { 0x01, 0x02 }, - /* 1d9 */ { 0x01, 0x02 }, - /* 1da */ { 0x01, 0x02 }, - /* 1db */ { 0x01, 0x02 }, - /* 1dc */ { 0x01, 0x02 }, - /* 1dd */ { 0x01, 0x02 }, - /* 1de */ { 0x01, 0x02 }, - /* 1df */ { 0x01, 0x02 }, - /* 1e0 */ { 0x01, 0x02 }, - /* 1e1 */ { 0x01, 0x02 }, - /* 1e2 */ { 0x01, 0x02 }, - /* 1e3 */ { 0x01, 0x02 }, - /* 1e4 */ { 0x01, 0x02 }, - /* 1e5 */ { 0x01, 0x02 }, - /* 1e6 */ { 0x01, 0x02 }, - /* 1e7 */ { 0x01, 0x02 }, - /* 1e8 */ { 0x01, 0x02 }, - /* 1e9 */ { 0x01, 0x02 }, - /* 1ea */ { 0x01, 0x02 }, - /* 1eb */ { 0x01, 0x02 }, - /* 1ec */ { 0x01, 0x02 }, - /* 1ed */ { 0x01, 0x02 }, - /* 1ee */ { 0x01, 0x02 }, - /* 1ef */ { 0x01, 0x02 }, - /* 1f0 */ { 0x01, 0x02 }, - /* 1f1 */ { 0x01, 0x02 }, - /* 1f2 */ { 0x01, 0x02 }, - /* 1f3 */ { 0x01, 0x02 }, - /* 1f4 */ { 0x01, 0x02 }, - /* 1f5 */ { 0x01, 0x02 }, - /* 1f6 */ { 0x01, 0x02 }, - /* 1f7 */ { 0x01, 0x02 }, - /* 1f8 */ { 0x01, 0x02 }, - /* 1f9 */ { 0x01, 0x02 }, - /* 1fa */ { 0x01, 0x02 }, - /* 1fb */ { 0x01, 0x02 }, - /* 1fc */ { 0x01, 0x02 }, - /* 1fd */ { 0x01, 0x02 }, - /* 1fe */ { 0x01, 0x02 }, - /* 1ff */ { 0x01, 0x02 }, - /* 200 */ { 0x01, 0x02 }, - /* 201 */ { 0x01, 0x02 }, - /* 202 */ { 0x01, 0x02 }, - /* 203 */ { 0x01, 0x02 }, - /* 204 */ { 0x01, 0x02 }, - /* 205 */ { 0x01, 0x02 }, - /* 206 */ { 0x01, 0x02 }, - /* 207 */ { 0x01, 0x02 }, - /* 208 */ { 0x01, 0x02 }, - /* 209 */ { 0x01, 0x02 }, - /* 20a */ { 0x01, 0x02 }, - /* 20b */ { 0x01, 0x02 }, - /* 20c */ { 0x01, 0x02 }, - /* 20d */ { 0x01, 0x02 }, - /* 20e */ { 0x01, 0x02 }, - /* 20f */ { 0x01, 0x02 }, - /* 210 */ { 0x01, 0x02 }, - /* 211 */ { 0x01, 0x02 }, - /* 212 */ { 0x01, 0x02 }, - /* 213 */ { 0x01, 0x02 }, - /* 214 */ { 0x01, 0x02 }, - /* 215 */ { 0x01, 0x02 }, - /* 216 */ { 0x01, 0x02 }, - /* 217 */ { 0x01, 0x02 }, - /* 218 */ { 0x01, 0x02 }, - /* 219 */ { 0x01, 0x02 }, - /* 21a */ { 0x01, 0x02 }, - /* 21b */ { 0x01, 0x02 }, - /* 21c */ { 0x01, 0x02 }, - /* 21d */ { 0x01, 0x02 }, - /* 21e */ { 0x01, 0x02 }, - /* 21f */ { 0x01, 0x02 }, - /* 220 */ { 0x01, 0x02 }, - /* 221 */ { 0x01, 0x02 }, - /* 222 */ { 0x01, 0x02 }, - /* 223 */ { 0x01, 0x02 }, - /* 224 */ { 0x01, 0x02 }, - /* 225 */ { 0x01, 0x02 }, - /* 226 */ { 0x01, 0x02 }, - /* 227 */ { 0x01, 0x02 }, - /* 228 */ { 0x01, 0x02 }, - /* 229 */ { 0x01, 0x02 }, - /* 22a */ { 0x01, 0x02 }, - /* 22b */ { 0x01, 0x02 }, - /* 22c */ { 0x01, 0x02 }, - /* 22d */ { 0x01, 0x02 }, - /* 22e */ { 0x01, 0x02 }, - /* 22f */ { 0x01, 0x02 }, - /* 230 */ { 0x01, 0x02 }, - /* 231 */ { 0x01, 0x02 }, - /* 232 */ { 0x01, 0x02 }, - /* 233 */ { 0x01, 0x02 }, - /* 234 */ { 0x01, 0x02 }, - /* 235 */ { 0x01, 0x02 }, - /* 236 */ { 0x01, 0x02 }, - /* 237 */ { 0x01, 0x02 }, - /* 238 */ { 0x01, 0x02 }, - /* 239 */ { 0x01, 0x02 }, - /* 23a */ { 0x01, 0x02 }, - /* 23b */ { 0x01, 0x02 }, - /* 23c */ { 0x01, 0x02 }, - /* 23d */ { 0x01, 0x02 }, - /* 23e */ { 0x01, 0x02 }, - /* 23f */ { 0x01, 0x02 }, - /* 240 */ { 0x01, 0x02 }, - /* 241 */ { 0x01, 0x02 }, - /* 242 */ { 0x01, 0x02 }, - /* 243 */ { 0x01, 0x02 }, - /* 244 */ { 0x01, 0x02 }, - /* 245 */ { 0x01, 0x02 }, - /* 246 */ { 0x01, 0x02 }, - /* 247 */ { 0x01, 0x02 }, - /* 248 */ { 0x01, 0x02 }, - /* 249 */ { 0x01, 0x02 }, - /* 24a */ { 0x01, 0x02 }, - /* 24b */ { 0x01, 0x02 }, - /* 24c */ { 0x01, 0x02 }, - /* 24d */ { 0x01, 0x02 }, - /* 24e */ { 0x01, 0x02 }, - /* 24f */ { 0x01, 0x02 }, - /* 250 */ { 0x01, 0x02 }, - /* 251 */ { 0x01, 0x02 }, - /* 252 */ { 0x01, 0x02 }, - /* 253 */ { 0x01, 0x02 }, - /* 254 */ { 0x01, 0x02 }, - /* 255 */ { 0x01, 0x02 }, - /* 256 */ { 0x01, 0x02 }, - /* 257 */ { 0x01, 0x02 }, - /* 258 */ { 0x01, 0x02 }, - /* 259 */ { 0x01, 0x02 }, - /* 25a */ { 0x01, 0x02 }, - /* 25b */ { 0x01, 0x02 }, - /* 25c */ { 0x01, 0x02 }, - /* 25d */ { 0x01, 0x02 }, - /* 25e */ { 0x01, 0x02 }, - /* 25f */ { 0x01, 0x02 }, - /* 260 */ { 0x01, 0x02 }, - /* 261 */ { 0x01, 0x02 }, - /* 262 */ { 0x01, 0x02 }, - /* 263 */ { 0x01, 0x02 }, - /* 264 */ { 0x01, 0x02 }, - /* 265 */ { 0x01, 0x02 }, - /* 266 */ { 0x01, 0x02 }, - /* 267 */ { 0x01, 0x02 }, - /* 268 */ { 0x01, 0x02 }, - /* 269 */ { 0x01, 0x02 }, - /* 26a */ { 0x01, 0x02 }, - /* 26b */ { 0x01, 0x02 }, - /* 26c */ { 0x01, 0x02 }, - /* 26d */ { 0x01, 0x02 }, - /* 26e */ { 0x01, 0x02 }, - /* 26f */ { 0x01, 0x02 }, - /* 270 */ { 0x01, 0x02 }, - /* 271 */ { 0x01, 0x02 }, - /* 272 */ { 0x01, 0x02 }, - /* 273 */ { 0x01, 0x02 }, - /* 274 */ { 0x01, 0x02 }, - /* 275 */ { 0x01, 0x02 }, - /* 276 */ { 0x01, 0x02 }, - /* 277 */ { 0x01, 0x02 }, - /* 278 */ { 0x01, 0x02 }, - /* 279 */ { 0x01, 0x02 }, - /* 27a */ { 0x01, 0x02 }, - /* 27b */ { 0x01, 0x02 }, - /* 27c */ { 0x01, 0x02 }, - /* 27d */ { 0x01, 0x02 }, - /* 27e */ { 0x01, 0x02 }, - /* 27f */ { 0x01, 0x02 }, - /* 280 */ { 0x01, 0x02 }, - /* 281 */ { 0x01, 0x02 }, - /* 282 */ { 0x01, 0x02 }, - /* 283 */ { 0x01, 0x02 }, - /* 284 */ { 0x01, 0x02 }, - /* 285 */ { 0x01, 0x02 }, - /* 286 */ { 0x01, 0x02 }, - /* 287 */ { 0x01, 0x02 }, - /* 288 */ { 0x01, 0x02 }, - /* 289 */ { 0x01, 0x02 }, - /* 28a */ { 0x01, 0x02 }, - /* 28b */ { 0x01, 0x02 }, - /* 28c */ { 0x01, 0x02 }, - /* 28d */ { 0x01, 0x02 }, - /* 28e */ { 0x01, 0x02 }, - /* 28f */ { 0x01, 0x02 }, - /* 290 */ { 0x01, 0x02 }, - /* 291 */ { 0x01, 0x02 }, - /* 292 */ { 0x01, 0x02 }, - /* 293 */ { 0x01, 0x02 }, - /* 294 */ { 0x01, 0x02 }, - /* 295 */ { 0x01, 0x02 }, - /* 296 */ { 0x01, 0x02 }, - /* 297 */ { 0x01, 0x02 }, - /* 298 */ { 0x01, 0x02 }, - /* 299 */ { 0x01, 0x02 }, - /* 29a */ { 0x01, 0x02 }, - /* 29b */ { 0x01, 0x02 }, - /* 29c */ { 0x01, 0x02 }, - /* 29d */ { 0x01, 0x02 }, - /* 29e */ { 0x01, 0x02 }, - /* 29f */ { 0x01, 0x02 }, - /* 2a0 */ { 0x01, 0x02 }, - /* 2a1 */ { 0x01, 0x02 }, - /* 2a2 */ { 0x01, 0x02 }, - /* 2a3 */ { 0x01, 0x02 }, - /* 2a4 */ { 0x01, 0x02 }, - /* 2a5 */ { 0x01, 0x02 }, - /* 2a6 */ { 0x01, 0x02 }, - /* 2a7 */ { 0x01, 0x02 }, - /* 2a8 */ { 0x01, 0x02 }, - /* 2a9 */ { 0x01, 0x02 }, - /* 2aa */ { 0x01, 0x02 }, - /* 2ab */ { 0x01, 0x02 }, - /* 2ac */ { 0x01, 0x02 }, - /* 2ad */ { 0x01, 0x02 }, - /* 2ae */ { 0x01, 0x02 }, - /* 2af */ { 0x01, 0x02 }, - /* 2b0 */ { 0x01, 0x02 }, - /* 2b1 */ { 0x01, 0x02 }, - /* 2b2 */ { 0x01, 0x02 }, - /* 2b3 */ { 0x01, 0x02 }, - /* 2b4 */ { 0x01, 0x02 }, - /* 2b5 */ { 0x01, 0x02 }, - /* 2b6 */ { 0x01, 0x02 }, - /* 2b7 */ { 0x01, 0x02 }, - /* 2b8 */ { 0x01, 0x02 }, - /* 2b9 */ { 0x01, 0x02 }, - /* 2ba */ { 0x01, 0x02 }, - /* 2bb */ { 0x01, 0x02 }, - /* 2bc */ { 0x01, 0x02 }, - /* 2bd */ { 0x01, 0x02 }, - /* 2be */ { 0x01, 0x02 }, - /* 2bf */ { 0x01, 0x02 }, - /* 2c0 */ { 0x01, 0x02 }, - /* 2c1 */ { 0x01, 0x02 }, - /* 2c2 */ { 0x01, 0x02 }, - /* 2c3 */ { 0x01, 0x02 }, - /* 2c4 */ { 0x01, 0x02 }, - /* 2c5 */ { 0x01, 0x02 }, - /* 2c6 */ { 0x01, 0x02 }, - /* 2c7 */ { 0x01, 0x02 }, - /* 2c8 */ { 0x01, 0x02 }, - /* 2c9 */ { 0x01, 0x02 }, - /* 2ca */ { 0x01, 0x02 }, - /* 2cb */ { 0x01, 0x02 }, - /* 2cc */ { 0x01, 0x02 }, - /* 2cd */ { 0x01, 0x02 }, - /* 2ce */ { 0x01, 0x02 }, - /* 2cf */ { 0x01, 0x02 }, - /* 2d0 */ { 0x01, 0x02 }, - /* 2d1 */ { 0x01, 0x02 }, - /* 2d2 */ { 0x01, 0x02 }, - /* 2d3 */ { 0x01, 0x02 }, - /* 2d4 */ { 0x01, 0x02 }, - /* 2d5 */ { 0x01, 0x02 }, - /* 2d6 */ { 0x01, 0x02 }, - /* 2d7 */ { 0x01, 0x02 }, - /* 2d8 */ { 0x01, 0x02 }, - /* 2d9 */ { 0x01, 0x02 }, - /* 2da */ { 0x01, 0x02 }, - /* 2db */ { 0x01, 0x02 }, - /* 2dc */ { 0x01, 0x02 }, - /* 2dd */ { 0x01, 0x02 }, - /* 2de */ { 0x01, 0x02 }, - /* 2df */ { 0x01, 0x02 }, - /* 2e0 */ { 0x01, 0x02 }, - /* 2e1 */ { 0x01, 0x02 }, - /* 2e2 */ { 0x01, 0x02 }, - /* 2e3 */ { 0x01, 0x02 }, - /* 2e4 */ { 0x01, 0x02 }, - /* 2e5 */ { 0x01, 0x02 }, - /* 2e6 */ { 0x01, 0x02 }, - /* 2e7 */ { 0x01, 0x02 }, - /* 2e8 */ { 0x01, 0x02 }, - /* 2e9 */ { 0x01, 0x02 }, - /* 2ea */ { 0x01, 0x02 }, - /* 2eb */ { 0x01, 0x02 }, - /* 2ec */ { 0x01, 0x02 }, - /* 2ed */ { 0x01, 0x02 }, - /* 2ee */ { 0x01, 0x02 }, - /* 2ef */ { 0x01, 0x02 }, - /* 2f0 */ { 0x01, 0x02 }, - /* 2f1 */ { 0x01, 0x02 }, - /* 2f2 */ { 0x01, 0x02 }, - /* 2f3 */ { 0x01, 0x02 }, - /* 2f4 */ { 0x01, 0x02 }, - /* 2f5 */ { 0x01, 0x02 }, - /* 2f6 */ { 0x01, 0x02 }, - /* 2f7 */ { 0x01, 0x02 }, - /* 2f8 */ { 0x01, 0x02 }, - /* 2f9 */ { 0x01, 0x02 }, - /* 2fa */ { 0x01, 0x02 }, - /* 2fb */ { 0x01, 0x02 }, - /* 2fc */ { 0x01, 0x02 }, - /* 2fd */ { 0x01, 0x02 }, - /* 2fe */ { 0x01, 0x02 }, - /* 2ff */ { 0x01, 0x02 }, - /* 300 */ { 0x01, 0x02 }, - /* 301 */ { 0x01, 0x02 }, - /* 302 */ { 0x01, 0x02 }, - /* 303 */ { 0x01, 0x02 }, - /* 304 */ { 0x01, 0x02 }, - /* 305 */ { 0x01, 0x02 }, - /* 306 */ { 0x01, 0x02 }, - /* 307 */ { 0x01, 0x02 }, - /* 308 */ { 0x01, 0x02 }, - /* 309 */ { 0x01, 0x02 }, - /* 30a */ { 0x01, 0x02 }, - /* 30b */ { 0x01, 0x02 }, - /* 30c */ { 0x01, 0x02 }, - /* 30d */ { 0x01, 0x02 }, - /* 30e */ { 0x01, 0x02 }, - /* 30f */ { 0x01, 0x02 }, - /* 310 */ { 0x01, 0x02 }, - /* 311 */ { 0x01, 0x02 }, - /* 312 */ { 0x01, 0x02 }, - /* 313 */ { 0x01, 0x02 }, - /* 314 */ { 0x01, 0x02 }, - /* 315 */ { 0x01, 0x02 }, - /* 316 */ { 0x01, 0x02 }, - /* 317 */ { 0x01, 0x02 }, - /* 318 */ { 0x01, 0x02 }, - /* 319 */ { 0x01, 0x02 }, - /* 31a */ { 0x01, 0x02 }, - /* 31b */ { 0x01, 0x02 }, - /* 31c */ { 0x01, 0x02 }, - /* 31d */ { 0x01, 0x02 }, - /* 31e */ { 0x01, 0x02 }, - /* 31f */ { 0x01, 0x02 }, - /* 320 */ { 0x01, 0x02 }, - /* 321 */ { 0x01, 0x02 }, - /* 322 */ { 0x01, 0x02 }, - /* 323 */ { 0x01, 0x02 }, - /* 324 */ { 0x01, 0x02 }, - /* 325 */ { 0x01, 0x02 }, - /* 326 */ { 0x01, 0x02 }, - /* 327 */ { 0x01, 0x02 }, - /* 328 */ { 0x01, 0x02 }, - /* 329 */ { 0x01, 0x02 }, - /* 32a */ { 0x01, 0x02 }, - /* 32b */ { 0x01, 0x02 }, - /* 32c */ { 0x01, 0x02 }, - /* 32d */ { 0x01, 0x02 }, - /* 32e */ { 0x01, 0x02 }, - /* 32f */ { 0x01, 0x02 }, - /* 330 */ { 0x01, 0x02 }, - /* 331 */ { 0x01, 0x02 }, - /* 332 */ { 0x01, 0x02 }, - /* 333 */ { 0x01, 0x02 }, - /* 334 */ { 0x01, 0x02 }, - /* 335 */ { 0x01, 0x02 }, - /* 336 */ { 0x01, 0x02 }, - /* 337 */ { 0x01, 0x02 }, - /* 338 */ { 0x01, 0x02 }, - /* 339 */ { 0x01, 0x02 }, - /* 33a */ { 0x01, 0x02 }, - /* 33b */ { 0x01, 0x02 }, - /* 33c */ { 0x01, 0x02 }, - /* 33d */ { 0x01, 0x02 }, - /* 33e */ { 0x01, 0x02 }, - /* 33f */ { 0x01, 0x02 }, - /* 340 */ { 0x01, 0x02 }, - /* 341 */ { 0x01, 0x02 }, - /* 342 */ { 0x01, 0x02 }, - /* 343 */ { 0x01, 0x02 }, - /* 344 */ { 0x01, 0x02 }, - /* 345 */ { 0x01, 0x02 }, - /* 346 */ { 0x01, 0x02 }, - /* 347 */ { 0x01, 0x02 }, - /* 348 */ { 0x01, 0x02 }, - /* 349 */ { 0x01, 0x02 }, - /* 34a */ { 0x01, 0x02 }, - /* 34b */ { 0x01, 0x02 }, - /* 34c */ { 0x01, 0x02 }, - /* 34d */ { 0x01, 0x02 }, - /* 34e */ { 0x01, 0x02 }, - /* 34f */ { 0x01, 0x02 }, - /* 350 */ { 0x01, 0x02 }, - /* 351 */ { 0x01, 0x02 }, - /* 352 */ { 0x01, 0x02 }, - /* 353 */ { 0x01, 0x02 }, - /* 354 */ { 0x01, 0x02 }, - /* 355 */ { 0x01, 0x02 }, - /* 356 */ { 0x01, 0x02 }, - /* 357 */ { 0x01, 0x02 }, - /* 358 */ { 0x01, 0x02 }, - /* 359 */ { 0x01, 0x02 }, - /* 35a */ { 0x01, 0x02 }, - /* 35b */ { 0x01, 0x02 }, - /* 35c */ { 0x01, 0x02 }, - /* 35d */ { 0x01, 0x02 }, - /* 35e */ { 0x01, 0x02 }, - /* 35f */ { 0x01, 0x02 }, - /* 360 */ { 0x01, 0x02 }, - /* 361 */ { 0x01, 0x02 }, - /* 362 */ { 0x01, 0x02 }, - /* 363 */ { 0x01, 0x02 }, - /* 364 */ { 0x01, 0x02 }, - /* 365 */ { 0x01, 0x02 }, - /* 366 */ { 0x01, 0x02 }, - /* 367 */ { 0x01, 0x02 }, - /* 368 */ { 0x01, 0x02 }, - /* 369 */ { 0x01, 0x02 }, - /* 36a */ { 0x01, 0x02 }, - /* 36b */ { 0x01, 0x02 }, - /* 36c */ { 0x01, 0x02 }, - /* 36d */ { 0x01, 0x02 }, - /* 36e */ { 0x01, 0x02 }, - /* 36f */ { 0x01, 0x02 }, - /* 370 */ { 0x01, 0x02 }, - /* 371 */ { 0x01, 0x02 }, - /* 372 */ { 0x01, 0x02 }, - /* 373 */ { 0x01, 0x02 }, - /* 374 */ { 0x01, 0x02 }, - /* 375 */ { 0x01, 0x02 }, - /* 376 */ { 0x01, 0x02 }, - /* 377 */ { 0x01, 0x02 }, - /* 378 */ { 0x01, 0x02 }, - /* 379 */ { 0x01, 0x02 }, - /* 37a */ { 0x01, 0x02 }, - /* 37b */ { 0x01, 0x02 }, - /* 37c */ { 0x01, 0x02 }, - /* 37d */ { 0x01, 0x02 }, - /* 37e */ { 0x01, 0x02 }, - /* 37f */ { 0x01, 0x02 }, - /* 380 */ { 0x01, 0x02 }, - /* 381 */ { 0x01, 0x02 }, - /* 382 */ { 0x01, 0x02 }, - /* 383 */ { 0x01, 0x02 }, - /* 384 */ { 0x01, 0x02 }, - /* 385 */ { 0x01, 0x02 }, - /* 386 */ { 0x01, 0x02 }, - /* 387 */ { 0x01, 0x02 }, - /* 388 */ { 0x01, 0x02 }, - /* 389 */ { 0x01, 0x02 }, - /* 38a */ { 0x01, 0x02 }, - /* 38b */ { 0x01, 0x02 }, - /* 38c */ { 0x01, 0x02 }, - /* 38d */ { 0x01, 0x02 }, - /* 38e */ { 0x01, 0x02 }, - /* 38f */ { 0x01, 0x02 }, - /* 390 */ { 0x01, 0x02 }, - /* 391 */ { 0x01, 0x02 }, - /* 392 */ { 0x01, 0x02 }, - /* 393 */ { 0x01, 0x02 }, - /* 394 */ { 0x01, 0x02 }, - /* 395 */ { 0x01, 0x02 }, - /* 396 */ { 0x01, 0x02 }, - /* 397 */ { 0x01, 0x02 }, - /* 398 */ { 0x01, 0x02 }, - /* 399 */ { 0x01, 0x02 }, - /* 39a */ { 0x01, 0x02 }, - /* 39b */ { 0x01, 0x02 }, - /* 39c */ { 0x01, 0x02 }, - /* 39d */ { 0x01, 0x02 }, - /* 39e */ { 0x01, 0x02 }, - /* 39f */ { 0x01, 0x02 }, - /* 3a0 */ { 0x01, 0x02 }, - /* 3a1 */ { 0x01, 0x02 }, - /* 3a2 */ { 0x01, 0x02 }, - /* 3a3 */ { 0x01, 0x02 }, - /* 3a4 */ { 0x01, 0x02 }, - /* 3a5 */ { 0x01, 0x02 }, - /* 3a6 */ { 0x01, 0x02 }, - /* 3a7 */ { 0x01, 0x02 }, - /* 3a8 */ { 0x01, 0x02 }, - /* 3a9 */ { 0x01, 0x02 }, - /* 3aa */ { 0x01, 0x02 }, - /* 3ab */ { 0x01, 0x02 }, - /* 3ac */ { 0x01, 0x02 }, - /* 3ad */ { 0x01, 0x02 }, - /* 3ae */ { 0x01, 0x02 }, - /* 3af */ { 0x01, 0x02 }, - /* 3b0 */ { 0x01, 0x02 }, - /* 3b1 */ { 0x01, 0x02 }, - /* 3b2 */ { 0x01, 0x02 }, - /* 3b3 */ { 0x01, 0x02 }, - /* 3b4 */ { 0x01, 0x02 }, - /* 3b5 */ { 0x01, 0x02 }, - /* 3b6 */ { 0x01, 0x02 }, - /* 3b7 */ { 0x01, 0x02 }, - /* 3b8 */ { 0x01, 0x02 }, - /* 3b9 */ { 0x01, 0x02 }, - /* 3ba */ { 0x01, 0x02 }, - /* 3bb */ { 0x01, 0x02 }, - /* 3bc */ { 0x01, 0x02 }, - /* 3bd */ { 0x01, 0x02 }, - /* 3be */ { 0x01, 0x02 }, - /* 3bf */ { 0x01, 0x02 }, - /* 3c0 */ { 0x01, 0x02 }, - /* 3c1 */ { 0x01, 0x02 }, - /* 3c2 */ { 0x01, 0x02 }, - /* 3c3 */ { 0x01, 0x02 }, - /* 3c4 */ { 0x01, 0x02 }, - /* 3c5 */ { 0x01, 0x02 }, - /* 3c6 */ { 0x01, 0x02 }, - /* 3c7 */ { 0x01, 0x02 }, - /* 3c8 */ { 0x01, 0x02 }, - /* 3c9 */ { 0x01, 0x02 }, - /* 3ca */ { 0x01, 0x02 }, - /* 3cb */ { 0x01, 0x02 }, - /* 3cc */ { 0x01, 0x02 }, - /* 3cd */ { 0x01, 0x02 }, - /* 3ce */ { 0x01, 0x02 }, - /* 3cf */ { 0x01, 0x02 }, - /* 3d0 */ { 0x01, 0x02 }, - /* 3d1 */ { 0x01, 0x02 }, - /* 3d2 */ { 0x01, 0x02 }, - /* 3d3 */ { 0x01, 0x02 }, - /* 3d4 */ { 0x01, 0x02 }, - /* 3d5 */ { 0x01, 0x02 }, - /* 3d6 */ { 0x01, 0x02 }, - /* 3d7 */ { 0x01, 0x02 }, - /* 3d8 */ { 0x01, 0x02 }, - /* 3d9 */ { 0x01, 0x02 }, - /* 3da */ { 0x01, 0x02 }, - /* 3db */ { 0x01, 0x02 }, - /* 3dc */ { 0x01, 0x02 }, - /* 3dd */ { 0x01, 0x02 }, - /* 3de */ { 0x01, 0x02 }, - /* 3df */ { 0x01, 0x02 }, - /* 3e0 */ { 0x01, 0x02 }, - /* 3e1 */ { 0x01, 0x02 }, - /* 3e2 */ { 0x01, 0x02 }, - /* 3e3 */ { 0x01, 0x02 }, - /* 3e4 */ { 0x01, 0x02 }, - /* 3e5 */ { 0x01, 0x02 }, - /* 3e6 */ { 0x01, 0x02 }, - /* 3e7 */ { 0x01, 0x02 }, - /* 3e8 */ { 0x01, 0x02 }, - /* 3e9 */ { 0x01, 0x02 }, - /* 3ea */ { 0x01, 0x02 }, - /* 3eb */ { 0x01, 0x02 }, - /* 3ec */ { 0x01, 0x02 }, - /* 3ed */ { 0x01, 0x02 }, - /* 3ee */ { 0x01, 0x02 }, - /* 3ef */ { 0x01, 0x02 }, - /* 3f0 */ { 0x01, 0x02 }, - /* 3f1 */ { 0x01, 0x02 }, - /* 3f2 */ { 0x01, 0x02 }, - /* 3f3 */ { 0x01, 0x02 }, - /* 3f4 */ { 0x01, 0x02 }, - /* 3f5 */ { 0x01, 0x02 }, - /* 3f6 */ { 0x01, 0x02 }, - /* 3f7 */ { 0x01, 0x02 }, - /* 3f8 */ { 0x01, 0x02 }, - /* 3f9 */ { 0x01, 0x02 }, - /* 3fa */ { 0x01, 0x02 }, - /* 3fb */ { 0x01, 0x02 }, - /* 3fc */ { 0x01, 0x02 }, - /* 3fd */ { 0x01, 0x02 }, - /* 3fe */ { 0x01, 0x02 }, - /* 3ff */ { 0x01, 0x02 }, - /* 400 */ { 0x02, 0x02 }, - /* 401 */ { 0x02, 0x02 }, - /* 402 */ { 0x02, 0x02 }, - /* 403 */ { 0x02, 0x02 }, - /* 404 */ { 0x02, 0x02 }, - /* 405 */ { 0x02, 0x02 }, - /* 406 */ { 0x02, 0x02 }, - /* 407 */ { 0x02, 0x02 }, - /* 408 */ { 0x02, 0x02 }, - /* 409 */ { 0x02, 0x02 }, - /* 40a */ { 0x02, 0x02 }, - /* 40b */ { 0x02, 0x02 }, - /* 40c */ { 0x02, 0x02 }, - /* 40d */ { 0x02, 0x02 }, - /* 40e */ { 0x02, 0x02 }, - /* 40f */ { 0x02, 0x02 }, - /* 410 */ { 0x02, 0x02 }, - /* 411 */ { 0x02, 0x02 }, - /* 412 */ { 0x02, 0x02 }, - /* 413 */ { 0x02, 0x02 }, - /* 414 */ { 0x02, 0x02 }, - /* 415 */ { 0x02, 0x02 }, - /* 416 */ { 0x02, 0x02 }, - /* 417 */ { 0x02, 0x02 }, - /* 418 */ { 0x02, 0x02 }, - /* 419 */ { 0x02, 0x02 }, - /* 41a */ { 0x02, 0x02 }, - /* 41b */ { 0x02, 0x02 }, - /* 41c */ { 0x02, 0x02 }, - /* 41d */ { 0x02, 0x02 }, - /* 41e */ { 0x02, 0x02 }, - /* 41f */ { 0x02, 0x02 }, - /* 420 */ { 0x02, 0x02 }, - /* 421 */ { 0x02, 0x02 }, - /* 422 */ { 0x02, 0x02 }, - /* 423 */ { 0x02, 0x02 }, - /* 424 */ { 0x02, 0x02 }, - /* 425 */ { 0x02, 0x02 }, - /* 426 */ { 0x02, 0x02 }, - /* 427 */ { 0x02, 0x02 }, - /* 428 */ { 0x02, 0x02 }, - /* 429 */ { 0x02, 0x02 }, - /* 42a */ { 0x02, 0x02 }, - /* 42b */ { 0x02, 0x02 }, - /* 42c */ { 0x02, 0x02 }, - /* 42d */ { 0x02, 0x02 }, - /* 42e */ { 0x02, 0x02 }, - /* 42f */ { 0x02, 0x02 }, - /* 430 */ { 0x02, 0x02 }, - /* 431 */ { 0x02, 0x02 }, - /* 432 */ { 0x02, 0x02 }, - /* 433 */ { 0x02, 0x02 }, - /* 434 */ { 0x02, 0x02 }, - /* 435 */ { 0x02, 0x02 }, - /* 436 */ { 0x02, 0x02 }, - /* 437 */ { 0x02, 0x02 }, - /* 438 */ { 0x02, 0x02 }, - /* 439 */ { 0x02, 0x02 }, - /* 43a */ { 0x02, 0x02 }, - /* 43b */ { 0x02, 0x02 }, - /* 43c */ { 0x02, 0x02 }, - /* 43d */ { 0x02, 0x02 }, - /* 43e */ { 0x02, 0x02 }, - /* 43f */ { 0x02, 0x02 }, - /* 440 */ { 0x02, 0x02 }, - /* 441 */ { 0x02, 0x02 }, - /* 442 */ { 0x02, 0x02 }, - /* 443 */ { 0x02, 0x02 }, - /* 444 */ { 0x02, 0x02 }, - /* 445 */ { 0x02, 0x02 }, - /* 446 */ { 0x02, 0x02 }, - /* 447 */ { 0x02, 0x02 }, - /* 448 */ { 0x02, 0x02 }, - /* 449 */ { 0x02, 0x02 }, - /* 44a */ { 0x02, 0x02 }, - /* 44b */ { 0x02, 0x02 }, - /* 44c */ { 0x02, 0x02 }, - /* 44d */ { 0x02, 0x02 }, - /* 44e */ { 0x02, 0x02 }, - /* 44f */ { 0x02, 0x02 }, - /* 450 */ { 0x02, 0x02 }, - /* 451 */ { 0x02, 0x02 }, - /* 452 */ { 0x02, 0x02 }, - /* 453 */ { 0x02, 0x02 }, - /* 454 */ { 0x02, 0x02 }, - /* 455 */ { 0x02, 0x02 }, - /* 456 */ { 0x02, 0x02 }, - /* 457 */ { 0x02, 0x02 }, - /* 458 */ { 0x02, 0x02 }, - /* 459 */ { 0x02, 0x02 }, - /* 45a */ { 0x02, 0x02 }, - /* 45b */ { 0x02, 0x02 }, - /* 45c */ { 0x02, 0x02 }, - /* 45d */ { 0x02, 0x02 }, - /* 45e */ { 0x02, 0x02 }, - /* 45f */ { 0x02, 0x02 }, - /* 460 */ { 0x02, 0x02 }, - /* 461 */ { 0x02, 0x02 }, - /* 462 */ { 0x02, 0x02 }, - /* 463 */ { 0x02, 0x02 }, - /* 464 */ { 0x02, 0x02 }, - /* 465 */ { 0x02, 0x02 }, - /* 466 */ { 0x02, 0x02 }, - /* 467 */ { 0x02, 0x02 }, - /* 468 */ { 0x02, 0x02 }, - /* 469 */ { 0x02, 0x02 }, - /* 46a */ { 0x02, 0x02 }, - /* 46b */ { 0x02, 0x02 }, - /* 46c */ { 0x02, 0x02 }, - /* 46d */ { 0x02, 0x02 }, - /* 46e */ { 0x02, 0x02 }, - /* 46f */ { 0x02, 0x02 }, - /* 470 */ { 0x02, 0x02 }, - /* 471 */ { 0x02, 0x02 }, - /* 472 */ { 0x02, 0x02 }, - /* 473 */ { 0x02, 0x02 }, - /* 474 */ { 0x02, 0x02 }, - /* 475 */ { 0x02, 0x02 }, - /* 476 */ { 0x02, 0x02 }, - /* 477 */ { 0x02, 0x02 }, - /* 478 */ { 0x02, 0x02 }, - /* 479 */ { 0x02, 0x02 }, - /* 47a */ { 0x02, 0x02 }, - /* 47b */ { 0x02, 0x02 }, - /* 47c */ { 0x02, 0x02 }, - /* 47d */ { 0x02, 0x02 }, - /* 47e */ { 0x02, 0x02 }, - /* 47f */ { 0x02, 0x02 }, - /* 480 */ { 0x02, 0x02 }, - /* 481 */ { 0x02, 0x02 }, - /* 482 */ { 0x02, 0x02 }, - /* 483 */ { 0x02, 0x02 }, - /* 484 */ { 0x02, 0x02 }, - /* 485 */ { 0x02, 0x02 }, - /* 486 */ { 0x02, 0x02 }, - /* 487 */ { 0x02, 0x02 }, - /* 488 */ { 0x02, 0x02 }, - /* 489 */ { 0x02, 0x02 }, - /* 48a */ { 0x02, 0x02 }, - /* 48b */ { 0x02, 0x02 }, - /* 48c */ { 0x02, 0x02 }, - /* 48d */ { 0x02, 0x02 }, - /* 48e */ { 0x02, 0x02 }, - /* 48f */ { 0x02, 0x02 }, - /* 490 */ { 0x02, 0x02 }, - /* 491 */ { 0x02, 0x02 }, - /* 492 */ { 0x02, 0x02 }, - /* 493 */ { 0x02, 0x02 }, - /* 494 */ { 0x02, 0x02 }, - /* 495 */ { 0x02, 0x02 }, - /* 496 */ { 0x02, 0x02 }, - /* 497 */ { 0x02, 0x02 }, - /* 498 */ { 0x02, 0x02 }, - /* 499 */ { 0x02, 0x02 }, - /* 49a */ { 0x02, 0x02 }, - /* 49b */ { 0x02, 0x02 }, - /* 49c */ { 0x02, 0x02 }, - /* 49d */ { 0x02, 0x02 }, - /* 49e */ { 0x02, 0x02 }, - /* 49f */ { 0x02, 0x02 }, - /* 4a0 */ { 0x02, 0x02 }, - /* 4a1 */ { 0x02, 0x02 }, - /* 4a2 */ { 0x02, 0x02 }, - /* 4a3 */ { 0x02, 0x02 }, - /* 4a4 */ { 0x02, 0x02 }, - /* 4a5 */ { 0x02, 0x02 }, - /* 4a6 */ { 0x02, 0x02 }, - /* 4a7 */ { 0x02, 0x02 }, - /* 4a8 */ { 0x02, 0x02 }, - /* 4a9 */ { 0x02, 0x02 }, - /* 4aa */ { 0x02, 0x02 }, - /* 4ab */ { 0x02, 0x02 }, - /* 4ac */ { 0x02, 0x02 }, - /* 4ad */ { 0x02, 0x02 }, - /* 4ae */ { 0x02, 0x02 }, - /* 4af */ { 0x02, 0x02 }, - /* 4b0 */ { 0x02, 0x02 }, - /* 4b1 */ { 0x02, 0x02 }, - /* 4b2 */ { 0x02, 0x02 }, - /* 4b3 */ { 0x02, 0x02 }, - /* 4b4 */ { 0x02, 0x02 }, - /* 4b5 */ { 0x02, 0x02 }, - /* 4b6 */ { 0x02, 0x02 }, - /* 4b7 */ { 0x02, 0x02 }, - /* 4b8 */ { 0x02, 0x02 }, - /* 4b9 */ { 0x02, 0x02 }, - /* 4ba */ { 0x02, 0x02 }, - /* 4bb */ { 0x02, 0x02 }, - /* 4bc */ { 0x02, 0x02 }, - /* 4bd */ { 0x02, 0x02 }, - /* 4be */ { 0x02, 0x02 }, - /* 4bf */ { 0x02, 0x02 }, - /* 4c0 */ { 0x02, 0x02 }, - /* 4c1 */ { 0x02, 0x02 }, - /* 4c2 */ { 0x02, 0x02 }, - /* 4c3 */ { 0x02, 0x02 }, - /* 4c4 */ { 0x02, 0x02 }, - /* 4c5 */ { 0x02, 0x02 }, - /* 4c6 */ { 0x02, 0x02 }, - /* 4c7 */ { 0x02, 0x02 }, - /* 4c8 */ { 0x02, 0x02 }, - /* 4c9 */ { 0x02, 0x02 }, - /* 4ca */ { 0x02, 0x02 }, - /* 4cb */ { 0x02, 0x02 }, - /* 4cc */ { 0x02, 0x02 }, - /* 4cd */ { 0x02, 0x02 }, - /* 4ce */ { 0x02, 0x02 }, - /* 4cf */ { 0x02, 0x02 }, - /* 4d0 */ { 0x02, 0x02 }, - /* 4d1 */ { 0x02, 0x02 }, - /* 4d2 */ { 0x02, 0x02 }, - /* 4d3 */ { 0x02, 0x02 }, - /* 4d4 */ { 0x02, 0x02 }, - /* 4d5 */ { 0x02, 0x02 }, - /* 4d6 */ { 0x02, 0x02 }, - /* 4d7 */ { 0x02, 0x02 }, - /* 4d8 */ { 0x02, 0x02 }, - /* 4d9 */ { 0x02, 0x02 }, - /* 4da */ { 0x02, 0x02 }, - /* 4db */ { 0x02, 0x02 }, - /* 4dc */ { 0x02, 0x02 }, - /* 4dd */ { 0x02, 0x02 }, - /* 4de */ { 0x02, 0x02 }, - /* 4df */ { 0x02, 0x02 }, - /* 4e0 */ { 0x02, 0x02 }, - /* 4e1 */ { 0x02, 0x02 }, - /* 4e2 */ { 0x02, 0x02 }, - /* 4e3 */ { 0x02, 0x02 }, - /* 4e4 */ { 0x02, 0x02 }, - /* 4e5 */ { 0x02, 0x02 }, - /* 4e6 */ { 0x02, 0x02 }, - /* 4e7 */ { 0x02, 0x02 }, - /* 4e8 */ { 0x02, 0x02 }, - /* 4e9 */ { 0x02, 0x02 }, - /* 4ea */ { 0x02, 0x02 }, - /* 4eb */ { 0x02, 0x02 }, - /* 4ec */ { 0x02, 0x02 }, - /* 4ed */ { 0x02, 0x02 }, - /* 4ee */ { 0x02, 0x02 }, - /* 4ef */ { 0x02, 0x02 }, - /* 4f0 */ { 0x02, 0x02 }, - /* 4f1 */ { 0x02, 0x02 }, - /* 4f2 */ { 0x02, 0x02 }, - /* 4f3 */ { 0x02, 0x02 }, - /* 4f4 */ { 0x02, 0x02 }, - /* 4f5 */ { 0x02, 0x02 }, - /* 4f6 */ { 0x02, 0x02 }, - /* 4f7 */ { 0x02, 0x02 }, - /* 4f8 */ { 0x02, 0x02 }, - /* 4f9 */ { 0x02, 0x02 }, - /* 4fa */ { 0x02, 0x02 }, - /* 4fb */ { 0x02, 0x02 }, - /* 4fc */ { 0x02, 0x02 }, - /* 4fd */ { 0x02, 0x02 }, - /* 4fe */ { 0x02, 0x02 }, - /* 4ff */ { 0x02, 0x02 }, - /* 500 */ { 0x02, 0x02 }, - /* 501 */ { 0x02, 0x02 }, - /* 502 */ { 0x02, 0x02 }, - /* 503 */ { 0x02, 0x02 }, - /* 504 */ { 0x02, 0x02 }, - /* 505 */ { 0x02, 0x02 }, - /* 506 */ { 0x02, 0x02 }, - /* 507 */ { 0x02, 0x02 }, - /* 508 */ { 0x02, 0x02 }, - /* 509 */ { 0x02, 0x02 }, - /* 50a */ { 0x02, 0x02 }, - /* 50b */ { 0x02, 0x02 }, - /* 50c */ { 0x02, 0x02 }, - /* 50d */ { 0x02, 0x02 }, - /* 50e */ { 0x02, 0x02 }, - /* 50f */ { 0x02, 0x02 }, - /* 510 */ { 0x02, 0x02 }, - /* 511 */ { 0x02, 0x02 }, - /* 512 */ { 0x02, 0x02 }, - /* 513 */ { 0x02, 0x02 }, - /* 514 */ { 0x02, 0x02 }, - /* 515 */ { 0x02, 0x02 }, - /* 516 */ { 0x02, 0x02 }, - /* 517 */ { 0x02, 0x02 }, - /* 518 */ { 0x02, 0x02 }, - /* 519 */ { 0x02, 0x02 }, - /* 51a */ { 0x02, 0x02 }, - /* 51b */ { 0x02, 0x02 }, - /* 51c */ { 0x02, 0x02 }, - /* 51d */ { 0x02, 0x02 }, - /* 51e */ { 0x02, 0x02 }, - /* 51f */ { 0x02, 0x02 }, - /* 520 */ { 0x02, 0x02 }, - /* 521 */ { 0x02, 0x02 }, - /* 522 */ { 0x02, 0x02 }, - /* 523 */ { 0x02, 0x02 }, - /* 524 */ { 0x02, 0x02 }, - /* 525 */ { 0x02, 0x02 }, - /* 526 */ { 0x02, 0x02 }, - /* 527 */ { 0x02, 0x02 }, - /* 528 */ { 0x02, 0x02 }, - /* 529 */ { 0x02, 0x02 }, - /* 52a */ { 0x02, 0x02 }, - /* 52b */ { 0x02, 0x02 }, - /* 52c */ { 0x02, 0x02 }, - /* 52d */ { 0x02, 0x02 }, - /* 52e */ { 0x02, 0x02 }, - /* 52f */ { 0x02, 0x02 }, - /* 530 */ { 0x02, 0x02 }, - /* 531 */ { 0x02, 0x02 }, - /* 532 */ { 0x02, 0x02 }, - /* 533 */ { 0x02, 0x02 }, - /* 534 */ { 0x02, 0x02 }, - /* 535 */ { 0x02, 0x02 }, - /* 536 */ { 0x02, 0x02 }, - /* 537 */ { 0x02, 0x02 }, - /* 538 */ { 0x02, 0x02 }, - /* 539 */ { 0x02, 0x02 }, - /* 53a */ { 0x02, 0x02 }, - /* 53b */ { 0x02, 0x02 }, - /* 53c */ { 0x02, 0x02 }, - /* 53d */ { 0x02, 0x02 }, - /* 53e */ { 0x02, 0x02 }, - /* 53f */ { 0x02, 0x02 }, - /* 540 */ { 0x02, 0x02 }, - /* 541 */ { 0x02, 0x02 }, - /* 542 */ { 0x02, 0x02 }, - /* 543 */ { 0x02, 0x02 }, - /* 544 */ { 0x02, 0x02 }, - /* 545 */ { 0x02, 0x02 }, - /* 546 */ { 0x02, 0x02 }, - /* 547 */ { 0x02, 0x02 }, - /* 548 */ { 0x02, 0x02 }, - /* 549 */ { 0x02, 0x02 }, - /* 54a */ { 0x02, 0x02 }, - /* 54b */ { 0x02, 0x02 }, - /* 54c */ { 0x02, 0x02 }, - /* 54d */ { 0x02, 0x02 }, - /* 54e */ { 0x02, 0x02 }, - /* 54f */ { 0x02, 0x02 }, - /* 550 */ { 0x02, 0x02 }, - /* 551 */ { 0x02, 0x02 }, - /* 552 */ { 0x02, 0x02 }, - /* 553 */ { 0x02, 0x02 }, - /* 554 */ { 0x02, 0x02 }, - /* 555 */ { 0x02, 0x02 }, - /* 556 */ { 0x02, 0x02 }, - /* 557 */ { 0x02, 0x02 }, - /* 558 */ { 0x02, 0x02 }, - /* 559 */ { 0x02, 0x02 }, - /* 55a */ { 0x02, 0x02 }, - /* 55b */ { 0x02, 0x02 }, - /* 55c */ { 0x02, 0x02 }, - /* 55d */ { 0x02, 0x02 }, - /* 55e */ { 0x02, 0x02 }, - /* 55f */ { 0x02, 0x02 }, - /* 560 */ { 0x02, 0x02 }, - /* 561 */ { 0x02, 0x02 }, - /* 562 */ { 0x02, 0x02 }, - /* 563 */ { 0x02, 0x02 }, - /* 564 */ { 0x02, 0x02 }, - /* 565 */ { 0x02, 0x02 }, - /* 566 */ { 0x02, 0x02 }, - /* 567 */ { 0x02, 0x02 }, - /* 568 */ { 0x02, 0x02 }, - /* 569 */ { 0x02, 0x02 }, - /* 56a */ { 0x02, 0x02 }, - /* 56b */ { 0x02, 0x02 }, - /* 56c */ { 0x02, 0x02 }, - /* 56d */ { 0x02, 0x02 }, - /* 56e */ { 0x02, 0x02 }, - /* 56f */ { 0x02, 0x02 }, - /* 570 */ { 0x02, 0x02 }, - /* 571 */ { 0x02, 0x02 }, - /* 572 */ { 0x02, 0x02 }, - /* 573 */ { 0x02, 0x02 }, - /* 574 */ { 0x02, 0x02 }, - /* 575 */ { 0x02, 0x02 }, - /* 576 */ { 0x02, 0x02 }, - /* 577 */ { 0x02, 0x02 }, - /* 578 */ { 0x02, 0x02 }, - /* 579 */ { 0x02, 0x02 }, - /* 57a */ { 0x02, 0x02 }, - /* 57b */ { 0x02, 0x02 }, - /* 57c */ { 0x02, 0x02 }, - /* 57d */ { 0x02, 0x02 }, - /* 57e */ { 0x02, 0x02 }, - /* 57f */ { 0x02, 0x02 }, - /* 580 */ { 0x02, 0x02 }, - /* 581 */ { 0x02, 0x02 }, - /* 582 */ { 0x02, 0x02 }, - /* 583 */ { 0x02, 0x02 }, - /* 584 */ { 0x02, 0x02 }, - /* 585 */ { 0x02, 0x02 }, - /* 586 */ { 0x02, 0x02 }, - /* 587 */ { 0x02, 0x02 }, - /* 588 */ { 0x02, 0x02 }, - /* 589 */ { 0x02, 0x02 }, - /* 58a */ { 0x02, 0x02 }, - /* 58b */ { 0x02, 0x02 }, - /* 58c */ { 0x02, 0x02 }, - /* 58d */ { 0x02, 0x02 }, - /* 58e */ { 0x02, 0x02 }, - /* 58f */ { 0x02, 0x02 }, - /* 590 */ { 0x02, 0x02 }, - /* 591 */ { 0x02, 0x02 }, - /* 592 */ { 0x02, 0x02 }, - /* 593 */ { 0x02, 0x02 }, - /* 594 */ { 0x02, 0x02 }, - /* 595 */ { 0x02, 0x02 }, - /* 596 */ { 0x02, 0x02 }, - /* 597 */ { 0x02, 0x02 }, - /* 598 */ { 0x02, 0x02 }, - /* 599 */ { 0x02, 0x02 }, - /* 59a */ { 0x02, 0x02 }, - /* 59b */ { 0x02, 0x02 }, - /* 59c */ { 0x02, 0x02 }, - /* 59d */ { 0x02, 0x02 }, - /* 59e */ { 0x02, 0x02 }, - /* 59f */ { 0x02, 0x02 }, - /* 5a0 */ { 0x02, 0x02 }, - /* 5a1 */ { 0x02, 0x02 }, - /* 5a2 */ { 0x02, 0x02 }, - /* 5a3 */ { 0x02, 0x02 }, - /* 5a4 */ { 0x02, 0x02 }, - /* 5a5 */ { 0x02, 0x02 }, - /* 5a6 */ { 0x02, 0x02 }, - /* 5a7 */ { 0x02, 0x02 }, - /* 5a8 */ { 0x02, 0x02 }, - /* 5a9 */ { 0x02, 0x02 }, - /* 5aa */ { 0x02, 0x02 }, - /* 5ab */ { 0x02, 0x02 }, - /* 5ac */ { 0x02, 0x02 }, - /* 5ad */ { 0x02, 0x02 }, - /* 5ae */ { 0x02, 0x02 }, - /* 5af */ { 0x02, 0x02 }, - /* 5b0 */ { 0x02, 0x02 }, - /* 5b1 */ { 0x02, 0x02 }, - /* 5b2 */ { 0x02, 0x02 }, - /* 5b3 */ { 0x02, 0x02 }, - /* 5b4 */ { 0x02, 0x02 }, - /* 5b5 */ { 0x02, 0x02 }, - /* 5b6 */ { 0x02, 0x02 }, - /* 5b7 */ { 0x02, 0x02 }, - /* 5b8 */ { 0x02, 0x02 }, - /* 5b9 */ { 0x02, 0x02 }, - /* 5ba */ { 0x02, 0x02 }, - /* 5bb */ { 0x02, 0x02 }, - /* 5bc */ { 0x02, 0x02 }, - /* 5bd */ { 0x02, 0x02 }, - /* 5be */ { 0x02, 0x02 }, - /* 5bf */ { 0x02, 0x02 }, - /* 5c0 */ { 0x02, 0x02 }, - /* 5c1 */ { 0x02, 0x02 }, - /* 5c2 */ { 0x02, 0x02 }, - /* 5c3 */ { 0x02, 0x02 }, - /* 5c4 */ { 0x02, 0x02 }, - /* 5c5 */ { 0x02, 0x02 }, - /* 5c6 */ { 0x02, 0x02 }, - /* 5c7 */ { 0x02, 0x02 }, - /* 5c8 */ { 0x02, 0x02 }, - /* 5c9 */ { 0x02, 0x02 }, - /* 5ca */ { 0x02, 0x02 }, - /* 5cb */ { 0x02, 0x02 }, - /* 5cc */ { 0x02, 0x02 }, - /* 5cd */ { 0x02, 0x02 }, - /* 5ce */ { 0x02, 0x02 }, - /* 5cf */ { 0x02, 0x02 }, - /* 5d0 */ { 0x02, 0x02 }, - /* 5d1 */ { 0x02, 0x02 }, - /* 5d2 */ { 0x02, 0x02 }, - /* 5d3 */ { 0x02, 0x02 }, - /* 5d4 */ { 0x02, 0x02 }, - /* 5d5 */ { 0x02, 0x02 }, - /* 5d6 */ { 0x02, 0x02 }, - /* 5d7 */ { 0x02, 0x02 }, - /* 5d8 */ { 0x02, 0x02 }, - /* 5d9 */ { 0x02, 0x02 }, - /* 5da */ { 0x02, 0x02 }, - /* 5db */ { 0x02, 0x02 }, - /* 5dc */ { 0x02, 0x02 }, - /* 5dd */ { 0x02, 0x02 }, - /* 5de */ { 0x02, 0x02 }, - /* 5df */ { 0x02, 0x02 }, - /* 5e0 */ { 0x02, 0x02 }, - /* 5e1 */ { 0x02, 0x02 }, - /* 5e2 */ { 0x02, 0x02 }, - /* 5e3 */ { 0x02, 0x02 }, - /* 5e4 */ { 0x02, 0x02 }, - /* 5e5 */ { 0x02, 0x02 }, - /* 5e6 */ { 0x02, 0x02 }, - /* 5e7 */ { 0x02, 0x02 }, - /* 5e8 */ { 0x02, 0x02 }, - /* 5e9 */ { 0x02, 0x02 }, - /* 5ea */ { 0x02, 0x02 }, - /* 5eb */ { 0x02, 0x02 }, - /* 5ec */ { 0x02, 0x02 }, - /* 5ed */ { 0x02, 0x02 }, - /* 5ee */ { 0x02, 0x02 }, - /* 5ef */ { 0x02, 0x02 }, - /* 5f0 */ { 0x02, 0x02 }, - /* 5f1 */ { 0x02, 0x02 }, - /* 5f2 */ { 0x02, 0x02 }, - /* 5f3 */ { 0x02, 0x02 }, - /* 5f4 */ { 0x02, 0x02 }, - /* 5f5 */ { 0x02, 0x02 }, - /* 5f6 */ { 0x02, 0x02 }, - /* 5f7 */ { 0x02, 0x02 }, - /* 5f8 */ { 0x02, 0x02 }, - /* 5f9 */ { 0x02, 0x02 }, - /* 5fa */ { 0x02, 0x02 }, - /* 5fb */ { 0x02, 0x02 }, - /* 5fc */ { 0x02, 0x02 }, - /* 5fd */ { 0x02, 0x02 }, - /* 5fe */ { 0x02, 0x02 }, - /* 5ff */ { 0x02, 0x02 }, - /* 600 */ { 0x02, 0x02 }, - /* 601 */ { 0x02, 0x02 }, - /* 602 */ { 0x02, 0x02 }, - /* 603 */ { 0x02, 0x02 }, - /* 604 */ { 0x02, 0x02 }, - /* 605 */ { 0x02, 0x02 }, - /* 606 */ { 0x02, 0x02 }, - /* 607 */ { 0x02, 0x02 }, - /* 608 */ { 0x02, 0x02 }, - /* 609 */ { 0x02, 0x02 }, - /* 60a */ { 0x02, 0x02 }, - /* 60b */ { 0x02, 0x02 }, - /* 60c */ { 0x02, 0x02 }, - /* 60d */ { 0x02, 0x02 }, - /* 60e */ { 0x02, 0x02 }, - /* 60f */ { 0x02, 0x02 }, - /* 610 */ { 0x02, 0x02 }, - /* 611 */ { 0x02, 0x02 }, - /* 612 */ { 0x02, 0x02 }, - /* 613 */ { 0x02, 0x02 }, - /* 614 */ { 0x02, 0x02 }, - /* 615 */ { 0x02, 0x02 }, - /* 616 */ { 0x02, 0x02 }, - /* 617 */ { 0x02, 0x02 }, - /* 618 */ { 0x02, 0x02 }, - /* 619 */ { 0x02, 0x02 }, - /* 61a */ { 0x02, 0x02 }, - /* 61b */ { 0x02, 0x02 }, - /* 61c */ { 0x02, 0x02 }, - /* 61d */ { 0x02, 0x02 }, - /* 61e */ { 0x02, 0x02 }, - /* 61f */ { 0x02, 0x02 }, - /* 620 */ { 0x02, 0x02 }, - /* 621 */ { 0x02, 0x02 }, - /* 622 */ { 0x02, 0x02 }, - /* 623 */ { 0x02, 0x02 }, - /* 624 */ { 0x02, 0x02 }, - /* 625 */ { 0x02, 0x02 }, - /* 626 */ { 0x02, 0x02 }, - /* 627 */ { 0x02, 0x02 }, - /* 628 */ { 0x02, 0x02 }, - /* 629 */ { 0x02, 0x02 }, - /* 62a */ { 0x02, 0x02 }, - /* 62b */ { 0x02, 0x02 }, - /* 62c */ { 0x02, 0x02 }, - /* 62d */ { 0x02, 0x02 }, - /* 62e */ { 0x02, 0x02 }, - /* 62f */ { 0x02, 0x02 }, - /* 630 */ { 0x02, 0x02 }, - /* 631 */ { 0x02, 0x02 }, - /* 632 */ { 0x02, 0x02 }, - /* 633 */ { 0x02, 0x02 }, - /* 634 */ { 0x02, 0x02 }, - /* 635 */ { 0x02, 0x02 }, - /* 636 */ { 0x02, 0x02 }, - /* 637 */ { 0x02, 0x02 }, - /* 638 */ { 0x02, 0x02 }, - /* 639 */ { 0x02, 0x02 }, - /* 63a */ { 0x02, 0x02 }, - /* 63b */ { 0x02, 0x02 }, - /* 63c */ { 0x02, 0x02 }, - /* 63d */ { 0x02, 0x02 }, - /* 63e */ { 0x02, 0x02 }, - /* 63f */ { 0x02, 0x02 }, - /* 640 */ { 0x02, 0x02 }, - /* 641 */ { 0x02, 0x02 }, - /* 642 */ { 0x02, 0x02 }, - /* 643 */ { 0x02, 0x02 }, - /* 644 */ { 0x02, 0x02 }, - /* 645 */ { 0x02, 0x02 }, - /* 646 */ { 0x02, 0x02 }, - /* 647 */ { 0x02, 0x02 }, - /* 648 */ { 0x02, 0x02 }, - /* 649 */ { 0x02, 0x02 }, - /* 64a */ { 0x02, 0x02 }, - /* 64b */ { 0x02, 0x02 }, - /* 64c */ { 0x02, 0x02 }, - /* 64d */ { 0x02, 0x02 }, - /* 64e */ { 0x02, 0x02 }, - /* 64f */ { 0x02, 0x02 }, - /* 650 */ { 0x02, 0x02 }, - /* 651 */ { 0x02, 0x02 }, - /* 652 */ { 0x02, 0x02 }, - /* 653 */ { 0x02, 0x02 }, - /* 654 */ { 0x02, 0x02 }, - /* 655 */ { 0x02, 0x02 }, - /* 656 */ { 0x02, 0x02 }, - /* 657 */ { 0x02, 0x02 }, - /* 658 */ { 0x02, 0x02 }, - /* 659 */ { 0x02, 0x02 }, - /* 65a */ { 0x02, 0x02 }, - /* 65b */ { 0x02, 0x02 }, - /* 65c */ { 0x02, 0x02 }, - /* 65d */ { 0x02, 0x02 }, - /* 65e */ { 0x02, 0x02 }, - /* 65f */ { 0x02, 0x02 }, - /* 660 */ { 0x02, 0x02 }, - /* 661 */ { 0x02, 0x02 }, - /* 662 */ { 0x02, 0x02 }, - /* 663 */ { 0x02, 0x02 }, - /* 664 */ { 0x02, 0x02 }, - /* 665 */ { 0x02, 0x02 }, - /* 666 */ { 0x02, 0x02 }, - /* 667 */ { 0x02, 0x02 }, - /* 668 */ { 0x02, 0x02 }, - /* 669 */ { 0x02, 0x02 }, - /* 66a */ { 0x02, 0x02 }, - /* 66b */ { 0x02, 0x02 }, - /* 66c */ { 0x02, 0x02 }, - /* 66d */ { 0x02, 0x02 }, - /* 66e */ { 0x02, 0x02 }, - /* 66f */ { 0x02, 0x02 }, - /* 670 */ { 0x02, 0x02 }, - /* 671 */ { 0x02, 0x02 }, - /* 672 */ { 0x02, 0x02 }, - /* 673 */ { 0x02, 0x02 }, - /* 674 */ { 0x02, 0x02 }, - /* 675 */ { 0x02, 0x02 }, - /* 676 */ { 0x02, 0x02 }, - /* 677 */ { 0x02, 0x02 }, - /* 678 */ { 0x02, 0x02 }, - /* 679 */ { 0x02, 0x02 }, - /* 67a */ { 0x02, 0x02 }, - /* 67b */ { 0x02, 0x02 }, - /* 67c */ { 0x02, 0x02 }, - /* 67d */ { 0x02, 0x02 }, - /* 67e */ { 0x02, 0x02 }, - /* 67f */ { 0x02, 0x02 }, - /* 680 */ { 0x02, 0x02 }, - /* 681 */ { 0x02, 0x02 }, - /* 682 */ { 0x02, 0x02 }, - /* 683 */ { 0x02, 0x02 }, - /* 684 */ { 0x02, 0x02 }, - /* 685 */ { 0x02, 0x02 }, - /* 686 */ { 0x02, 0x02 }, - /* 687 */ { 0x02, 0x02 }, - /* 688 */ { 0x02, 0x02 }, - /* 689 */ { 0x02, 0x02 }, - /* 68a */ { 0x02, 0x02 }, - /* 68b */ { 0x02, 0x02 }, - /* 68c */ { 0x02, 0x02 }, - /* 68d */ { 0x02, 0x02 }, - /* 68e */ { 0x02, 0x02 }, - /* 68f */ { 0x02, 0x02 }, - /* 690 */ { 0x02, 0x02 }, - /* 691 */ { 0x02, 0x02 }, - /* 692 */ { 0x02, 0x02 }, - /* 693 */ { 0x02, 0x02 }, - /* 694 */ { 0x02, 0x02 }, - /* 695 */ { 0x02, 0x02 }, - /* 696 */ { 0x02, 0x02 }, - /* 697 */ { 0x02, 0x02 }, - /* 698 */ { 0x02, 0x02 }, - /* 699 */ { 0x02, 0x02 }, - /* 69a */ { 0x02, 0x02 }, - /* 69b */ { 0x02, 0x02 }, - /* 69c */ { 0x02, 0x02 }, - /* 69d */ { 0x02, 0x02 }, - /* 69e */ { 0x02, 0x02 }, - /* 69f */ { 0x02, 0x02 }, - /* 6a0 */ { 0x02, 0x02 }, - /* 6a1 */ { 0x02, 0x02 }, - /* 6a2 */ { 0x02, 0x02 }, - /* 6a3 */ { 0x02, 0x02 }, - /* 6a4 */ { 0x02, 0x02 }, - /* 6a5 */ { 0x02, 0x02 }, - /* 6a6 */ { 0x02, 0x02 }, - /* 6a7 */ { 0x02, 0x02 }, - /* 6a8 */ { 0x02, 0x02 }, - /* 6a9 */ { 0x02, 0x02 }, - /* 6aa */ { 0x02, 0x02 }, - /* 6ab */ { 0x02, 0x02 }, - /* 6ac */ { 0x02, 0x02 }, - /* 6ad */ { 0x02, 0x02 }, - /* 6ae */ { 0x02, 0x02 }, - /* 6af */ { 0x02, 0x02 }, - /* 6b0 */ { 0x02, 0x02 }, - /* 6b1 */ { 0x02, 0x02 }, - /* 6b2 */ { 0x02, 0x02 }, - /* 6b3 */ { 0x02, 0x02 }, - /* 6b4 */ { 0x02, 0x02 }, - /* 6b5 */ { 0x02, 0x02 }, - /* 6b6 */ { 0x02, 0x02 }, - /* 6b7 */ { 0x02, 0x02 }, - /* 6b8 */ { 0x02, 0x02 }, - /* 6b9 */ { 0x02, 0x02 }, - /* 6ba */ { 0x02, 0x02 }, - /* 6bb */ { 0x02, 0x02 }, - /* 6bc */ { 0x02, 0x02 }, - /* 6bd */ { 0x02, 0x02 }, - /* 6be */ { 0x02, 0x02 }, - /* 6bf */ { 0x02, 0x02 }, - /* 6c0 */ { 0x02, 0x02 }, - /* 6c1 */ { 0x02, 0x02 }, - /* 6c2 */ { 0x02, 0x02 }, - /* 6c3 */ { 0x02, 0x02 }, - /* 6c4 */ { 0x02, 0x02 }, - /* 6c5 */ { 0x02, 0x02 }, - /* 6c6 */ { 0x02, 0x02 }, - /* 6c7 */ { 0x02, 0x02 }, - /* 6c8 */ { 0x02, 0x02 }, - /* 6c9 */ { 0x02, 0x02 }, - /* 6ca */ { 0x02, 0x02 }, - /* 6cb */ { 0x02, 0x02 }, - /* 6cc */ { 0x02, 0x02 }, - /* 6cd */ { 0x02, 0x02 }, - /* 6ce */ { 0x02, 0x02 }, - /* 6cf */ { 0x02, 0x02 }, - /* 6d0 */ { 0x02, 0x02 }, - /* 6d1 */ { 0x02, 0x02 }, - /* 6d2 */ { 0x02, 0x02 }, - /* 6d3 */ { 0x02, 0x02 }, - /* 6d4 */ { 0x02, 0x02 }, - /* 6d5 */ { 0x02, 0x02 }, - /* 6d6 */ { 0x02, 0x02 }, - /* 6d7 */ { 0x02, 0x02 }, - /* 6d8 */ { 0x02, 0x02 }, - /* 6d9 */ { 0x02, 0x02 }, - /* 6da */ { 0x02, 0x02 }, - /* 6db */ { 0x02, 0x02 }, - /* 6dc */ { 0x02, 0x02 }, - /* 6dd */ { 0x02, 0x02 }, - /* 6de */ { 0x02, 0x02 }, - /* 6df */ { 0x02, 0x02 }, - /* 6e0 */ { 0x02, 0x02 }, - /* 6e1 */ { 0x02, 0x02 }, - /* 6e2 */ { 0x02, 0x02 }, - /* 6e3 */ { 0x02, 0x02 }, - /* 6e4 */ { 0x02, 0x02 }, - /* 6e5 */ { 0x02, 0x02 }, - /* 6e6 */ { 0x02, 0x02 }, - /* 6e7 */ { 0x02, 0x02 }, - /* 6e8 */ { 0x02, 0x02 }, - /* 6e9 */ { 0x02, 0x02 }, - /* 6ea */ { 0x02, 0x02 }, - /* 6eb */ { 0x02, 0x02 }, - /* 6ec */ { 0x02, 0x02 }, - /* 6ed */ { 0x02, 0x02 }, - /* 6ee */ { 0x02, 0x02 }, - /* 6ef */ { 0x02, 0x02 }, - /* 6f0 */ { 0x02, 0x02 }, - /* 6f1 */ { 0x02, 0x02 }, - /* 6f2 */ { 0x02, 0x02 }, - /* 6f3 */ { 0x02, 0x02 }, - /* 6f4 */ { 0x02, 0x02 }, - /* 6f5 */ { 0x02, 0x02 }, - /* 6f6 */ { 0x02, 0x02 }, - /* 6f7 */ { 0x02, 0x02 }, - /* 6f8 */ { 0x02, 0x02 }, - /* 6f9 */ { 0x02, 0x02 }, - /* 6fa */ { 0x02, 0x02 }, - /* 6fb */ { 0x02, 0x02 }, - /* 6fc */ { 0x02, 0x02 }, - /* 6fd */ { 0x02, 0x02 }, - /* 6fe */ { 0x02, 0x02 }, - /* 6ff */ { 0x02, 0x02 }, - /* 700 */ { 0x02, 0x02 }, - /* 701 */ { 0x02, 0x02 }, - /* 702 */ { 0x02, 0x02 }, - /* 703 */ { 0x02, 0x02 }, - /* 704 */ { 0x02, 0x02 }, - /* 705 */ { 0x02, 0x02 }, - /* 706 */ { 0x02, 0x02 }, - /* 707 */ { 0x02, 0x02 }, - /* 708 */ { 0x02, 0x02 }, - /* 709 */ { 0x02, 0x02 }, - /* 70a */ { 0x02, 0x02 }, - /* 70b */ { 0x02, 0x02 }, - /* 70c */ { 0x02, 0x02 }, - /* 70d */ { 0x02, 0x02 }, - /* 70e */ { 0x02, 0x02 }, - /* 70f */ { 0x02, 0x02 }, - /* 710 */ { 0x02, 0x02 }, - /* 711 */ { 0x02, 0x02 }, - /* 712 */ { 0x02, 0x02 }, - /* 713 */ { 0x02, 0x02 }, - /* 714 */ { 0x02, 0x02 }, - /* 715 */ { 0x02, 0x02 }, - /* 716 */ { 0x02, 0x02 }, - /* 717 */ { 0x02, 0x02 }, - /* 718 */ { 0x02, 0x02 }, - /* 719 */ { 0x02, 0x02 }, - /* 71a */ { 0x02, 0x02 }, - /* 71b */ { 0x02, 0x02 }, - /* 71c */ { 0x02, 0x02 }, - /* 71d */ { 0x02, 0x02 }, - /* 71e */ { 0x02, 0x02 }, - /* 71f */ { 0x02, 0x02 }, - /* 720 */ { 0x02, 0x02 }, - /* 721 */ { 0x02, 0x02 }, - /* 722 */ { 0x02, 0x02 }, - /* 723 */ { 0x02, 0x02 }, - /* 724 */ { 0x02, 0x02 }, - /* 725 */ { 0x02, 0x02 }, - /* 726 */ { 0x02, 0x02 }, - /* 727 */ { 0x02, 0x02 }, - /* 728 */ { 0x02, 0x02 }, - /* 729 */ { 0x02, 0x02 }, - /* 72a */ { 0x02, 0x02 }, - /* 72b */ { 0x02, 0x02 }, - /* 72c */ { 0x02, 0x02 }, - /* 72d */ { 0x02, 0x02 }, - /* 72e */ { 0x02, 0x02 }, - /* 72f */ { 0x02, 0x02 }, - /* 730 */ { 0x02, 0x02 }, - /* 731 */ { 0x02, 0x02 }, - /* 732 */ { 0x02, 0x02 }, - /* 733 */ { 0x02, 0x02 }, - /* 734 */ { 0x02, 0x02 }, - /* 735 */ { 0x02, 0x02 }, - /* 736 */ { 0x02, 0x02 }, - /* 737 */ { 0x02, 0x02 }, - /* 738 */ { 0x02, 0x02 }, - /* 739 */ { 0x02, 0x02 }, - /* 73a */ { 0x02, 0x02 }, - /* 73b */ { 0x02, 0x02 }, - /* 73c */ { 0x02, 0x02 }, - /* 73d */ { 0x02, 0x02 }, - /* 73e */ { 0x02, 0x02 }, - /* 73f */ { 0x02, 0x02 }, - /* 740 */ { 0x02, 0x02 }, - /* 741 */ { 0x02, 0x02 }, - /* 742 */ { 0x02, 0x02 }, - /* 743 */ { 0x02, 0x02 }, - /* 744 */ { 0x02, 0x02 }, - /* 745 */ { 0x02, 0x02 }, - /* 746 */ { 0x02, 0x02 }, - /* 747 */ { 0x02, 0x02 }, - /* 748 */ { 0x02, 0x02 }, - /* 749 */ { 0x02, 0x02 }, - /* 74a */ { 0x02, 0x02 }, - /* 74b */ { 0x02, 0x02 }, - /* 74c */ { 0x02, 0x02 }, - /* 74d */ { 0x02, 0x02 }, - /* 74e */ { 0x02, 0x02 }, - /* 74f */ { 0x02, 0x02 }, - /* 750 */ { 0x02, 0x02 }, - /* 751 */ { 0x02, 0x02 }, - /* 752 */ { 0x02, 0x02 }, - /* 753 */ { 0x02, 0x02 }, - /* 754 */ { 0x02, 0x02 }, - /* 755 */ { 0x02, 0x02 }, - /* 756 */ { 0x02, 0x02 }, - /* 757 */ { 0x02, 0x02 }, - /* 758 */ { 0x02, 0x02 }, - /* 759 */ { 0x02, 0x02 }, - /* 75a */ { 0x02, 0x02 }, - /* 75b */ { 0x02, 0x02 }, - /* 75c */ { 0x02, 0x02 }, - /* 75d */ { 0x02, 0x02 }, - /* 75e */ { 0x02, 0x02 }, - /* 75f */ { 0x02, 0x02 }, - /* 760 */ { 0x02, 0x02 }, - /* 761 */ { 0x02, 0x02 }, - /* 762 */ { 0x02, 0x02 }, - /* 763 */ { 0x02, 0x02 }, - /* 764 */ { 0x02, 0x02 }, - /* 765 */ { 0x02, 0x02 }, - /* 766 */ { 0x02, 0x02 }, - /* 767 */ { 0x02, 0x02 }, - /* 768 */ { 0x02, 0x02 }, - /* 769 */ { 0x02, 0x02 }, - /* 76a */ { 0x02, 0x02 }, - /* 76b */ { 0x02, 0x02 }, - /* 76c */ { 0x02, 0x02 }, - /* 76d */ { 0x02, 0x02 }, - /* 76e */ { 0x02, 0x02 }, - /* 76f */ { 0x02, 0x02 }, - /* 770 */ { 0x02, 0x02 }, - /* 771 */ { 0x02, 0x02 }, - /* 772 */ { 0x02, 0x02 }, - /* 773 */ { 0x02, 0x02 }, - /* 774 */ { 0x02, 0x02 }, - /* 775 */ { 0x02, 0x02 }, - /* 776 */ { 0x02, 0x02 }, - /* 777 */ { 0x02, 0x02 }, - /* 778 */ { 0x02, 0x02 }, - /* 779 */ { 0x02, 0x02 }, - /* 77a */ { 0x02, 0x02 }, - /* 77b */ { 0x02, 0x02 }, - /* 77c */ { 0x02, 0x02 }, - /* 77d */ { 0x02, 0x02 }, - /* 77e */ { 0x02, 0x02 }, - /* 77f */ { 0x02, 0x02 }, - /* 780 */ { 0x02, 0x02 }, - /* 781 */ { 0x02, 0x02 }, - /* 782 */ { 0x02, 0x02 }, - /* 783 */ { 0x02, 0x02 }, - /* 784 */ { 0x02, 0x02 }, - /* 785 */ { 0x02, 0x02 }, - /* 786 */ { 0x02, 0x02 }, - /* 787 */ { 0x02, 0x02 }, - /* 788 */ { 0x02, 0x02 }, - /* 789 */ { 0x02, 0x02 }, - /* 78a */ { 0x02, 0x02 }, - /* 78b */ { 0x02, 0x02 }, - /* 78c */ { 0x02, 0x02 }, - /* 78d */ { 0x02, 0x02 }, - /* 78e */ { 0x02, 0x02 }, - /* 78f */ { 0x02, 0x02 }, - /* 790 */ { 0x02, 0x02 }, - /* 791 */ { 0x02, 0x02 }, - /* 792 */ { 0x02, 0x02 }, - /* 793 */ { 0x02, 0x02 }, - /* 794 */ { 0x02, 0x02 }, - /* 795 */ { 0x02, 0x02 }, - /* 796 */ { 0x02, 0x02 }, - /* 797 */ { 0x02, 0x02 }, - /* 798 */ { 0x02, 0x02 }, - /* 799 */ { 0x02, 0x02 }, - /* 79a */ { 0x02, 0x02 }, - /* 79b */ { 0x02, 0x02 }, - /* 79c */ { 0x02, 0x02 }, - /* 79d */ { 0x02, 0x02 }, - /* 79e */ { 0x02, 0x02 }, - /* 79f */ { 0x02, 0x02 }, - /* 7a0 */ { 0x02, 0x02 }, - /* 7a1 */ { 0x02, 0x02 }, - /* 7a2 */ { 0x02, 0x02 }, - /* 7a3 */ { 0x02, 0x02 }, - /* 7a4 */ { 0x02, 0x02 }, - /* 7a5 */ { 0x02, 0x02 }, - /* 7a6 */ { 0x02, 0x02 }, - /* 7a7 */ { 0x02, 0x02 }, - /* 7a8 */ { 0x02, 0x02 }, - /* 7a9 */ { 0x02, 0x02 }, - /* 7aa */ { 0x02, 0x02 }, - /* 7ab */ { 0x02, 0x02 }, - /* 7ac */ { 0x02, 0x02 }, - /* 7ad */ { 0x02, 0x02 }, - /* 7ae */ { 0x02, 0x02 }, - /* 7af */ { 0x02, 0x02 }, - /* 7b0 */ { 0x02, 0x02 }, - /* 7b1 */ { 0x02, 0x02 }, - /* 7b2 */ { 0x02, 0x02 }, - /* 7b3 */ { 0x02, 0x02 }, - /* 7b4 */ { 0x02, 0x02 }, - /* 7b5 */ { 0x02, 0x02 }, - /* 7b6 */ { 0x02, 0x02 }, - /* 7b7 */ { 0x02, 0x02 }, - /* 7b8 */ { 0x02, 0x02 }, - /* 7b9 */ { 0x02, 0x02 }, - /* 7ba */ { 0x02, 0x02 }, - /* 7bb */ { 0x02, 0x02 }, - /* 7bc */ { 0x02, 0x02 }, - /* 7bd */ { 0x02, 0x02 }, - /* 7be */ { 0x02, 0x02 }, - /* 7bf */ { 0x02, 0x02 }, - /* 7c0 */ { 0x02, 0x02 }, - /* 7c1 */ { 0x02, 0x02 }, - /* 7c2 */ { 0x02, 0x02 }, - /* 7c3 */ { 0x02, 0x02 }, - /* 7c4 */ { 0x02, 0x02 }, - /* 7c5 */ { 0x02, 0x02 }, - /* 7c6 */ { 0x02, 0x02 }, - /* 7c7 */ { 0x02, 0x02 }, - /* 7c8 */ { 0x02, 0x02 }, - /* 7c9 */ { 0x02, 0x02 }, - /* 7ca */ { 0x02, 0x02 }, - /* 7cb */ { 0x02, 0x02 }, - /* 7cc */ { 0x02, 0x02 }, - /* 7cd */ { 0x02, 0x02 }, - /* 7ce */ { 0x02, 0x02 }, - /* 7cf */ { 0x02, 0x02 }, - /* 7d0 */ { 0x02, 0x02 }, - /* 7d1 */ { 0x02, 0x02 }, - /* 7d2 */ { 0x02, 0x02 }, - /* 7d3 */ { 0x02, 0x02 }, - /* 7d4 */ { 0x02, 0x02 }, - /* 7d5 */ { 0x02, 0x02 }, - /* 7d6 */ { 0x02, 0x02 }, - /* 7d7 */ { 0x02, 0x02 }, - /* 7d8 */ { 0x02, 0x02 }, - /* 7d9 */ { 0x02, 0x02 }, - /* 7da */ { 0x02, 0x02 }, - /* 7db */ { 0x02, 0x02 }, - /* 7dc */ { 0x02, 0x02 }, - /* 7dd */ { 0x02, 0x02 }, - /* 7de */ { 0x02, 0x02 }, - /* 7df */ { 0x02, 0x02 }, - /* 7e0 */ { 0x02, 0x02 }, - /* 7e1 */ { 0x02, 0x02 }, - /* 7e2 */ { 0x02, 0x02 }, - /* 7e3 */ { 0x02, 0x02 }, - /* 7e4 */ { 0x02, 0x02 }, - /* 7e5 */ { 0x02, 0x02 }, - /* 7e6 */ { 0x02, 0x02 }, - /* 7e7 */ { 0x02, 0x02 }, - /* 7e8 */ { 0x02, 0x02 }, - /* 7e9 */ { 0x02, 0x02 }, - /* 7ea */ { 0x02, 0x02 }, - /* 7eb */ { 0x02, 0x02 }, - /* 7ec */ { 0x02, 0x02 }, - /* 7ed */ { 0x02, 0x02 }, - /* 7ee */ { 0x02, 0x02 }, - /* 7ef */ { 0x02, 0x02 }, - /* 7f0 */ { 0x02, 0x02 }, - /* 7f1 */ { 0x02, 0x02 }, - /* 7f2 */ { 0x02, 0x02 }, - /* 7f3 */ { 0x02, 0x02 }, - /* 7f4 */ { 0x02, 0x02 }, - /* 7f5 */ { 0x02, 0x02 }, - /* 7f6 */ { 0x02, 0x02 }, - /* 7f7 */ { 0x02, 0x02 }, - /* 7f8 */ { 0x02, 0x02 }, - /* 7f9 */ { 0x02, 0x02 }, - /* 7fa */ { 0x02, 0x02 }, - /* 7fb */ { 0x02, 0x02 }, - /* 7fc */ { 0x02, 0x02 }, - /* 7fd */ { 0x02, 0x02 }, - /* 7fe */ { 0x02, 0x02 }, - /* 7ff */ { 0x02, 0x02 }, - /* 800 */ { 0x03, 0x03 }, - /* 801 */ { 0x03, 0x03 }, - /* 802 */ { 0x03, 0x03 }, - /* 803 */ { 0x03, 0x03 }, - /* 804 */ { 0x03, 0x03 }, - /* 805 */ { 0x03, 0x03 }, - /* 806 */ { 0x03, 0x03 }, - /* 807 */ { 0x03, 0x03 }, - /* 808 */ { 0x03, 0x03 }, - /* 809 */ { 0x03, 0x03 }, - /* 80a */ { 0x03, 0x03 }, - /* 80b */ { 0x03, 0x03 }, - /* 80c */ { 0x03, 0x03 }, - /* 80d */ { 0x03, 0x03 }, - /* 80e */ { 0x03, 0x03 }, - /* 80f */ { 0x03, 0x03 }, - /* 810 */ { 0x03, 0x03 }, - /* 811 */ { 0x03, 0x03 }, - /* 812 */ { 0x03, 0x03 }, - /* 813 */ { 0x03, 0x03 }, - /* 814 */ { 0x03, 0x03 }, - /* 815 */ { 0x03, 0x03 }, - /* 816 */ { 0x03, 0x03 }, - /* 817 */ { 0x03, 0x03 }, - /* 818 */ { 0x03, 0x03 }, - /* 819 */ { 0x03, 0x03 }, - /* 81a */ { 0x03, 0x03 }, - /* 81b */ { 0x03, 0x03 }, - /* 81c */ { 0x03, 0x03 }, - /* 81d */ { 0x03, 0x03 }, - /* 81e */ { 0x03, 0x03 }, - /* 81f */ { 0x03, 0x03 }, - /* 820 */ { 0x03, 0x03 }, - /* 821 */ { 0x03, 0x03 }, - /* 822 */ { 0x03, 0x03 }, - /* 823 */ { 0x03, 0x03 }, - /* 824 */ { 0x03, 0x03 }, - /* 825 */ { 0x03, 0x03 }, - /* 826 */ { 0x03, 0x03 }, - /* 827 */ { 0x03, 0x03 }, - /* 828 */ { 0x03, 0x03 }, - /* 829 */ { 0x03, 0x03 }, - /* 82a */ { 0x03, 0x03 }, - /* 82b */ { 0x03, 0x03 }, - /* 82c */ { 0x03, 0x03 }, - /* 82d */ { 0x03, 0x03 }, - /* 82e */ { 0x03, 0x03 }, - /* 82f */ { 0x03, 0x03 }, - /* 830 */ { 0x03, 0x03 }, - /* 831 */ { 0x03, 0x03 }, - /* 832 */ { 0x03, 0x03 }, - /* 833 */ { 0x03, 0x03 }, - /* 834 */ { 0x03, 0x03 }, - /* 835 */ { 0x03, 0x03 }, - /* 836 */ { 0x03, 0x03 }, - /* 837 */ { 0x03, 0x03 }, - /* 838 */ { 0x03, 0x03 }, - /* 839 */ { 0x03, 0x03 }, - /* 83a */ { 0x03, 0x03 }, - /* 83b */ { 0x03, 0x03 }, - /* 83c */ { 0x03, 0x03 }, - /* 83d */ { 0x03, 0x03 }, - /* 83e */ { 0x03, 0x03 }, - /* 83f */ { 0x03, 0x03 }, - /* 840 */ { 0x03, 0x03 }, - /* 841 */ { 0x03, 0x03 }, - /* 842 */ { 0x03, 0x03 }, - /* 843 */ { 0x03, 0x03 }, - /* 844 */ { 0x03, 0x03 }, - /* 845 */ { 0x03, 0x03 }, - /* 846 */ { 0x03, 0x03 }, - /* 847 */ { 0x03, 0x03 }, - /* 848 */ { 0x03, 0x03 }, - /* 849 */ { 0x03, 0x03 }, - /* 84a */ { 0x03, 0x03 }, - /* 84b */ { 0x03, 0x03 }, - /* 84c */ { 0x03, 0x03 }, - /* 84d */ { 0x03, 0x03 }, - /* 84e */ { 0x03, 0x03 }, - /* 84f */ { 0x03, 0x03 }, - /* 850 */ { 0x03, 0x03 }, - /* 851 */ { 0x03, 0x03 }, - /* 852 */ { 0x03, 0x03 }, - /* 853 */ { 0x03, 0x03 }, - /* 854 */ { 0x03, 0x03 }, - /* 855 */ { 0x03, 0x03 }, - /* 856 */ { 0x03, 0x03 }, - /* 857 */ { 0x03, 0x03 }, - /* 858 */ { 0x03, 0x03 }, - /* 859 */ { 0x03, 0x03 }, - /* 85a */ { 0x03, 0x03 }, - /* 85b */ { 0x03, 0x03 }, - /* 85c */ { 0x03, 0x03 }, - /* 85d */ { 0x03, 0x03 }, - /* 85e */ { 0x03, 0x03 }, - /* 85f */ { 0x03, 0x03 }, - /* 860 */ { 0x03, 0x03 }, - /* 861 */ { 0x03, 0x03 }, - /* 862 */ { 0x03, 0x03 }, - /* 863 */ { 0x03, 0x03 }, - /* 864 */ { 0x03, 0x03 }, - /* 865 */ { 0x03, 0x03 }, - /* 866 */ { 0x03, 0x03 }, - /* 867 */ { 0x03, 0x03 }, - /* 868 */ { 0x03, 0x03 }, - /* 869 */ { 0x03, 0x03 }, - /* 86a */ { 0x03, 0x03 }, - /* 86b */ { 0x03, 0x03 }, - /* 86c */ { 0x03, 0x03 }, - /* 86d */ { 0x03, 0x03 }, - /* 86e */ { 0x03, 0x03 }, - /* 86f */ { 0x03, 0x03 }, - /* 870 */ { 0x03, 0x03 }, - /* 871 */ { 0x03, 0x03 }, - /* 872 */ { 0x03, 0x03 }, - /* 873 */ { 0x03, 0x03 }, - /* 874 */ { 0x03, 0x03 }, - /* 875 */ { 0x03, 0x03 }, - /* 876 */ { 0x03, 0x03 }, - /* 877 */ { 0x03, 0x03 }, - /* 878 */ { 0x03, 0x03 }, - /* 879 */ { 0x03, 0x03 }, - /* 87a */ { 0x03, 0x03 }, - /* 87b */ { 0x03, 0x03 }, - /* 87c */ { 0x03, 0x03 }, - /* 87d */ { 0x03, 0x03 }, - /* 87e */ { 0x03, 0x03 }, - /* 87f */ { 0x03, 0x03 }, - /* 880 */ { 0x03, 0x03 }, - /* 881 */ { 0x03, 0x03 }, - /* 882 */ { 0x03, 0x03 }, - /* 883 */ { 0x03, 0x03 }, - /* 884 */ { 0x03, 0x03 }, - /* 885 */ { 0x03, 0x03 }, - /* 886 */ { 0x03, 0x03 }, - /* 887 */ { 0x03, 0x03 }, - /* 888 */ { 0x03, 0x03 }, - /* 889 */ { 0x03, 0x03 }, - /* 88a */ { 0x03, 0x03 }, - /* 88b */ { 0x03, 0x03 }, - /* 88c */ { 0x03, 0x03 }, - /* 88d */ { 0x03, 0x03 }, - /* 88e */ { 0x03, 0x03 }, - /* 88f */ { 0x03, 0x03 }, - /* 890 */ { 0x03, 0x03 }, - /* 891 */ { 0x03, 0x03 }, - /* 892 */ { 0x03, 0x03 }, - /* 893 */ { 0x03, 0x03 }, - /* 894 */ { 0x03, 0x03 }, - /* 895 */ { 0x03, 0x03 }, - /* 896 */ { 0x03, 0x03 }, - /* 897 */ { 0x03, 0x03 }, - /* 898 */ { 0x03, 0x03 }, - /* 899 */ { 0x03, 0x03 }, - /* 89a */ { 0x03, 0x03 }, - /* 89b */ { 0x03, 0x03 }, - /* 89c */ { 0x03, 0x03 }, - /* 89d */ { 0x03, 0x03 }, - /* 89e */ { 0x03, 0x03 }, - /* 89f */ { 0x03, 0x03 }, - /* 8a0 */ { 0x03, 0x03 }, - /* 8a1 */ { 0x03, 0x03 }, - /* 8a2 */ { 0x03, 0x03 }, - /* 8a3 */ { 0x03, 0x03 }, - /* 8a4 */ { 0x03, 0x03 }, - /* 8a5 */ { 0x03, 0x03 }, - /* 8a6 */ { 0x03, 0x03 }, - /* 8a7 */ { 0x03, 0x03 }, - /* 8a8 */ { 0x03, 0x03 }, - /* 8a9 */ { 0x03, 0x03 }, - /* 8aa */ { 0x03, 0x03 }, - /* 8ab */ { 0x03, 0x03 }, - /* 8ac */ { 0x03, 0x03 }, - /* 8ad */ { 0x03, 0x03 }, - /* 8ae */ { 0x03, 0x03 }, - /* 8af */ { 0x03, 0x03 }, - /* 8b0 */ { 0x03, 0x03 }, - /* 8b1 */ { 0x03, 0x03 }, - /* 8b2 */ { 0x03, 0x03 }, - /* 8b3 */ { 0x03, 0x03 }, - /* 8b4 */ { 0x03, 0x03 }, - /* 8b5 */ { 0x03, 0x03 }, - /* 8b6 */ { 0x03, 0x03 }, - /* 8b7 */ { 0x03, 0x03 }, - /* 8b8 */ { 0x03, 0x03 }, - /* 8b9 */ { 0x03, 0x03 }, - /* 8ba */ { 0x03, 0x03 }, - /* 8bb */ { 0x03, 0x03 }, - /* 8bc */ { 0x03, 0x03 }, - /* 8bd */ { 0x03, 0x03 }, - /* 8be */ { 0x03, 0x03 }, - /* 8bf */ { 0x03, 0x03 }, - /* 8c0 */ { 0x03, 0x03 }, - /* 8c1 */ { 0x03, 0x03 }, - /* 8c2 */ { 0x03, 0x03 }, - /* 8c3 */ { 0x03, 0x03 }, - /* 8c4 */ { 0x03, 0x03 }, - /* 8c5 */ { 0x03, 0x03 }, - /* 8c6 */ { 0x03, 0x03 }, - /* 8c7 */ { 0x03, 0x03 }, - /* 8c8 */ { 0x03, 0x03 }, - /* 8c9 */ { 0x03, 0x03 }, - /* 8ca */ { 0x03, 0x03 }, - /* 8cb */ { 0x03, 0x03 }, - /* 8cc */ { 0x03, 0x03 }, - /* 8cd */ { 0x03, 0x03 }, - /* 8ce */ { 0x03, 0x03 }, - /* 8cf */ { 0x03, 0x03 }, - /* 8d0 */ { 0x03, 0x03 }, - /* 8d1 */ { 0x03, 0x03 }, - /* 8d2 */ { 0x03, 0x03 }, - /* 8d3 */ { 0x03, 0x03 }, - /* 8d4 */ { 0x03, 0x03 }, - /* 8d5 */ { 0x03, 0x03 }, - /* 8d6 */ { 0x03, 0x03 }, - /* 8d7 */ { 0x03, 0x03 }, - /* 8d8 */ { 0x03, 0x03 }, - /* 8d9 */ { 0x03, 0x03 }, - /* 8da */ { 0x03, 0x03 }, - /* 8db */ { 0x03, 0x03 }, - /* 8dc */ { 0x03, 0x03 }, - /* 8dd */ { 0x03, 0x03 }, - /* 8de */ { 0x03, 0x03 }, - /* 8df */ { 0x03, 0x03 }, - /* 8e0 */ { 0x03, 0x03 }, - /* 8e1 */ { 0x03, 0x03 }, - /* 8e2 */ { 0x03, 0x03 }, - /* 8e3 */ { 0x03, 0x03 }, - /* 8e4 */ { 0x03, 0x03 }, - /* 8e5 */ { 0x03, 0x03 }, - /* 8e6 */ { 0x03, 0x03 }, - /* 8e7 */ { 0x03, 0x03 }, - /* 8e8 */ { 0x03, 0x03 }, - /* 8e9 */ { 0x03, 0x03 }, - /* 8ea */ { 0x03, 0x03 }, - /* 8eb */ { 0x03, 0x03 }, - /* 8ec */ { 0x03, 0x03 }, - /* 8ed */ { 0x03, 0x03 }, - /* 8ee */ { 0x03, 0x03 }, - /* 8ef */ { 0x03, 0x03 }, - /* 8f0 */ { 0x03, 0x03 }, - /* 8f1 */ { 0x03, 0x03 }, - /* 8f2 */ { 0x03, 0x03 }, - /* 8f3 */ { 0x03, 0x03 }, - /* 8f4 */ { 0x03, 0x03 }, - /* 8f5 */ { 0x03, 0x03 }, - /* 8f6 */ { 0x03, 0x03 }, - /* 8f7 */ { 0x03, 0x03 }, - /* 8f8 */ { 0x03, 0x03 }, - /* 8f9 */ { 0x03, 0x03 }, - /* 8fa */ { 0x03, 0x03 }, - /* 8fb */ { 0x03, 0x03 }, - /* 8fc */ { 0x03, 0x03 }, - /* 8fd */ { 0x03, 0x03 }, - /* 8fe */ { 0x03, 0x03 }, - /* 8ff */ { 0x03, 0x03 }, - /* 900 */ { 0x03, 0x03 }, - /* 901 */ { 0x03, 0x03 }, - /* 902 */ { 0x03, 0x03 }, - /* 903 */ { 0x03, 0x03 }, - /* 904 */ { 0x03, 0x03 }, - /* 905 */ { 0x03, 0x03 }, - /* 906 */ { 0x03, 0x03 }, - /* 907 */ { 0x03, 0x03 }, - /* 908 */ { 0x03, 0x03 }, - /* 909 */ { 0x03, 0x03 }, - /* 90a */ { 0x03, 0x03 }, - /* 90b */ { 0x03, 0x03 }, - /* 90c */ { 0x03, 0x03 }, - /* 90d */ { 0x03, 0x03 }, - /* 90e */ { 0x03, 0x03 }, - /* 90f */ { 0x03, 0x03 }, - /* 910 */ { 0x03, 0x03 }, - /* 911 */ { 0x03, 0x03 }, - /* 912 */ { 0x03, 0x03 }, - /* 913 */ { 0x03, 0x03 }, - /* 914 */ { 0x03, 0x03 }, - /* 915 */ { 0x03, 0x03 }, - /* 916 */ { 0x03, 0x03 }, - /* 917 */ { 0x03, 0x03 }, - /* 918 */ { 0x03, 0x03 }, - /* 919 */ { 0x03, 0x03 }, - /* 91a */ { 0x03, 0x03 }, - /* 91b */ { 0x03, 0x03 }, - /* 91c */ { 0x03, 0x03 }, - /* 91d */ { 0x03, 0x03 }, - /* 91e */ { 0x03, 0x03 }, - /* 91f */ { 0x03, 0x03 }, - /* 920 */ { 0x03, 0x03 }, - /* 921 */ { 0x03, 0x03 }, - /* 922 */ { 0x03, 0x03 }, - /* 923 */ { 0x03, 0x03 }, - /* 924 */ { 0x03, 0x03 }, - /* 925 */ { 0x03, 0x03 }, - /* 926 */ { 0x03, 0x03 }, - /* 927 */ { 0x03, 0x03 }, - /* 928 */ { 0x03, 0x03 }, - /* 929 */ { 0x03, 0x03 }, - /* 92a */ { 0x03, 0x03 }, - /* 92b */ { 0x03, 0x03 }, - /* 92c */ { 0x03, 0x03 }, - /* 92d */ { 0x03, 0x03 }, - /* 92e */ { 0x03, 0x03 }, - /* 92f */ { 0x03, 0x03 }, - /* 930 */ { 0x03, 0x03 }, - /* 931 */ { 0x03, 0x03 }, - /* 932 */ { 0x03, 0x03 }, - /* 933 */ { 0x03, 0x03 }, - /* 934 */ { 0x03, 0x03 }, - /* 935 */ { 0x03, 0x03 }, - /* 936 */ { 0x03, 0x03 }, - /* 937 */ { 0x03, 0x03 }, - /* 938 */ { 0x03, 0x03 }, - /* 939 */ { 0x03, 0x03 }, - /* 93a */ { 0x03, 0x03 }, - /* 93b */ { 0x03, 0x03 }, - /* 93c */ { 0x03, 0x03 }, - /* 93d */ { 0x03, 0x03 }, - /* 93e */ { 0x03, 0x03 }, - /* 93f */ { 0x03, 0x03 }, - /* 940 */ { 0x03, 0x03 }, - /* 941 */ { 0x03, 0x03 }, - /* 942 */ { 0x03, 0x03 }, - /* 943 */ { 0x03, 0x03 }, - /* 944 */ { 0x03, 0x03 }, - /* 945 */ { 0x03, 0x03 }, - /* 946 */ { 0x03, 0x03 }, - /* 947 */ { 0x03, 0x03 }, - /* 948 */ { 0x03, 0x03 }, - /* 949 */ { 0x03, 0x03 }, - /* 94a */ { 0x03, 0x03 }, - /* 94b */ { 0x03, 0x03 }, - /* 94c */ { 0x03, 0x03 }, - /* 94d */ { 0x03, 0x03 }, - /* 94e */ { 0x03, 0x03 }, - /* 94f */ { 0x03, 0x03 }, - /* 950 */ { 0x03, 0x03 }, - /* 951 */ { 0x03, 0x03 }, - /* 952 */ { 0x03, 0x03 }, - /* 953 */ { 0x03, 0x03 }, - /* 954 */ { 0x03, 0x03 }, - /* 955 */ { 0x03, 0x03 }, - /* 956 */ { 0x03, 0x03 }, - /* 957 */ { 0x03, 0x03 }, - /* 958 */ { 0x03, 0x03 }, - /* 959 */ { 0x03, 0x03 }, - /* 95a */ { 0x03, 0x03 }, - /* 95b */ { 0x03, 0x03 }, - /* 95c */ { 0x03, 0x03 }, - /* 95d */ { 0x03, 0x03 }, - /* 95e */ { 0x03, 0x03 }, - /* 95f */ { 0x03, 0x03 }, - /* 960 */ { 0x03, 0x03 }, - /* 961 */ { 0x03, 0x03 }, - /* 962 */ { 0x03, 0x03 }, - /* 963 */ { 0x03, 0x03 }, - /* 964 */ { 0x03, 0x03 }, - /* 965 */ { 0x03, 0x03 }, - /* 966 */ { 0x03, 0x03 }, - /* 967 */ { 0x03, 0x03 }, - /* 968 */ { 0x03, 0x03 }, - /* 969 */ { 0x03, 0x03 }, - /* 96a */ { 0x03, 0x03 }, - /* 96b */ { 0x03, 0x03 }, - /* 96c */ { 0x03, 0x03 }, - /* 96d */ { 0x03, 0x03 }, - /* 96e */ { 0x03, 0x03 }, - /* 96f */ { 0x03, 0x03 }, - /* 970 */ { 0x03, 0x03 }, - /* 971 */ { 0x03, 0x03 }, - /* 972 */ { 0x03, 0x03 }, - /* 973 */ { 0x03, 0x03 }, - /* 974 */ { 0x03, 0x03 }, - /* 975 */ { 0x03, 0x03 }, - /* 976 */ { 0x03, 0x03 }, - /* 977 */ { 0x03, 0x03 }, - /* 978 */ { 0x03, 0x03 }, - /* 979 */ { 0x03, 0x03 }, - /* 97a */ { 0x03, 0x03 }, - /* 97b */ { 0x03, 0x03 }, - /* 97c */ { 0x03, 0x03 }, - /* 97d */ { 0x03, 0x03 }, - /* 97e */ { 0x03, 0x03 }, - /* 97f */ { 0x03, 0x03 }, - /* 980 */ { 0x03, 0x03 }, - /* 981 */ { 0x03, 0x03 }, - /* 982 */ { 0x03, 0x03 }, - /* 983 */ { 0x03, 0x03 }, - /* 984 */ { 0x03, 0x03 }, - /* 985 */ { 0x03, 0x03 }, - /* 986 */ { 0x03, 0x03 }, - /* 987 */ { 0x03, 0x03 }, - /* 988 */ { 0x03, 0x03 }, - /* 989 */ { 0x03, 0x03 }, - /* 98a */ { 0x03, 0x03 }, - /* 98b */ { 0x03, 0x03 }, - /* 98c */ { 0x03, 0x03 }, - /* 98d */ { 0x03, 0x03 }, - /* 98e */ { 0x03, 0x03 }, - /* 98f */ { 0x03, 0x03 }, - /* 990 */ { 0x03, 0x03 }, - /* 991 */ { 0x03, 0x03 }, - /* 992 */ { 0x03, 0x03 }, - /* 993 */ { 0x03, 0x03 }, - /* 994 */ { 0x03, 0x03 }, - /* 995 */ { 0x03, 0x03 }, - /* 996 */ { 0x03, 0x03 }, - /* 997 */ { 0x03, 0x03 }, - /* 998 */ { 0x03, 0x03 }, - /* 999 */ { 0x03, 0x03 }, - /* 99a */ { 0x03, 0x03 }, - /* 99b */ { 0x03, 0x03 }, - /* 99c */ { 0x03, 0x03 }, - /* 99d */ { 0x03, 0x03 }, - /* 99e */ { 0x03, 0x03 }, - /* 99f */ { 0x03, 0x03 }, - /* 9a0 */ { 0x03, 0x03 }, - /* 9a1 */ { 0x03, 0x03 }, - /* 9a2 */ { 0x03, 0x03 }, - /* 9a3 */ { 0x03, 0x03 }, - /* 9a4 */ { 0x03, 0x03 }, - /* 9a5 */ { 0x03, 0x03 }, - /* 9a6 */ { 0x03, 0x03 }, - /* 9a7 */ { 0x03, 0x03 }, - /* 9a8 */ { 0x03, 0x03 }, - /* 9a9 */ { 0x03, 0x03 }, - /* 9aa */ { 0x03, 0x03 }, - /* 9ab */ { 0x03, 0x03 }, - /* 9ac */ { 0x03, 0x03 }, - /* 9ad */ { 0x03, 0x03 }, - /* 9ae */ { 0x03, 0x03 }, - /* 9af */ { 0x03, 0x03 }, - /* 9b0 */ { 0x03, 0x03 }, - /* 9b1 */ { 0x03, 0x03 }, - /* 9b2 */ { 0x03, 0x03 }, - /* 9b3 */ { 0x03, 0x03 }, - /* 9b4 */ { 0x03, 0x03 }, - /* 9b5 */ { 0x03, 0x03 }, - /* 9b6 */ { 0x03, 0x03 }, - /* 9b7 */ { 0x03, 0x03 }, - /* 9b8 */ { 0x03, 0x03 }, - /* 9b9 */ { 0x03, 0x03 }, - /* 9ba */ { 0x03, 0x03 }, - /* 9bb */ { 0x03, 0x03 }, - /* 9bc */ { 0x03, 0x03 }, - /* 9bd */ { 0x03, 0x03 }, - /* 9be */ { 0x03, 0x03 }, - /* 9bf */ { 0x03, 0x03 }, - /* 9c0 */ { 0x03, 0x03 }, - /* 9c1 */ { 0x03, 0x03 }, - /* 9c2 */ { 0x03, 0x03 }, - /* 9c3 */ { 0x03, 0x03 }, - /* 9c4 */ { 0x03, 0x03 }, - /* 9c5 */ { 0x03, 0x03 }, - /* 9c6 */ { 0x03, 0x03 }, - /* 9c7 */ { 0x03, 0x03 }, - /* 9c8 */ { 0x03, 0x03 }, - /* 9c9 */ { 0x03, 0x03 }, - /* 9ca */ { 0x03, 0x03 }, - /* 9cb */ { 0x03, 0x03 }, - /* 9cc */ { 0x03, 0x03 }, - /* 9cd */ { 0x03, 0x03 }, - /* 9ce */ { 0x03, 0x03 }, - /* 9cf */ { 0x03, 0x03 }, - /* 9d0 */ { 0x03, 0x03 }, - /* 9d1 */ { 0x03, 0x03 }, - /* 9d2 */ { 0x03, 0x03 }, - /* 9d3 */ { 0x03, 0x03 }, - /* 9d4 */ { 0x03, 0x03 }, - /* 9d5 */ { 0x03, 0x03 }, - /* 9d6 */ { 0x03, 0x03 }, - /* 9d7 */ { 0x03, 0x03 }, - /* 9d8 */ { 0x03, 0x03 }, - /* 9d9 */ { 0x03, 0x03 }, - /* 9da */ { 0x03, 0x03 }, - /* 9db */ { 0x03, 0x03 }, - /* 9dc */ { 0x03, 0x03 }, - /* 9dd */ { 0x03, 0x03 }, - /* 9de */ { 0x03, 0x03 }, - /* 9df */ { 0x03, 0x03 }, - /* 9e0 */ { 0x03, 0x03 }, - /* 9e1 */ { 0x03, 0x03 }, - /* 9e2 */ { 0x03, 0x03 }, - /* 9e3 */ { 0x03, 0x03 }, - /* 9e4 */ { 0x03, 0x03 }, - /* 9e5 */ { 0x03, 0x03 }, - /* 9e6 */ { 0x03, 0x03 }, - /* 9e7 */ { 0x03, 0x03 }, - /* 9e8 */ { 0x03, 0x03 }, - /* 9e9 */ { 0x03, 0x03 }, - /* 9ea */ { 0x03, 0x03 }, - /* 9eb */ { 0x03, 0x03 }, - /* 9ec */ { 0x03, 0x03 }, - /* 9ed */ { 0x03, 0x03 }, - /* 9ee */ { 0x03, 0x03 }, - /* 9ef */ { 0x03, 0x03 }, - /* 9f0 */ { 0x03, 0x03 }, - /* 9f1 */ { 0x03, 0x03 }, - /* 9f2 */ { 0x03, 0x03 }, - /* 9f3 */ { 0x03, 0x03 }, - /* 9f4 */ { 0x03, 0x03 }, - /* 9f5 */ { 0x03, 0x03 }, - /* 9f6 */ { 0x03, 0x03 }, - /* 9f7 */ { 0x03, 0x03 }, - /* 9f8 */ { 0x03, 0x03 }, - /* 9f9 */ { 0x03, 0x03 }, - /* 9fa */ { 0x03, 0x03 }, - /* 9fb */ { 0x03, 0x03 }, - /* 9fc */ { 0x03, 0x03 }, - /* 9fd */ { 0x03, 0x03 }, - /* 9fe */ { 0x03, 0x03 }, - /* 9ff */ { 0x03, 0x03 }, - /* a00 */ { 0x04, 0x04 }, - /* a01 */ { 0x04, 0x04 }, - /* a02 */ { 0x04, 0x04 }, - /* a03 */ { 0x04, 0x04 }, - /* a04 */ { 0x04, 0x04 }, - /* a05 */ { 0x04, 0x04 }, - /* a06 */ { 0x04, 0x04 }, - /* a07 */ { 0x04, 0x04 }, - /* a08 */ { 0x04, 0x04 }, - /* a09 */ { 0x04, 0x04 }, - /* a0a */ { 0x04, 0x04 }, - /* a0b */ { 0x04, 0x04 }, - /* a0c */ { 0x04, 0x04 }, - /* a0d */ { 0x04, 0x04 }, - /* a0e */ { 0x04, 0x04 }, - /* a0f */ { 0x04, 0x04 }, - /* a10 */ { 0x04, 0x04 }, - /* a11 */ { 0x04, 0x04 }, - /* a12 */ { 0x04, 0x04 }, - /* a13 */ { 0x04, 0x04 }, - /* a14 */ { 0x04, 0x04 }, - /* a15 */ { 0x04, 0x04 }, - /* a16 */ { 0x04, 0x04 }, - /* a17 */ { 0x04, 0x04 }, - /* a18 */ { 0x04, 0x04 }, - /* a19 */ { 0x04, 0x04 }, - /* a1a */ { 0x04, 0x04 }, - /* a1b */ { 0x04, 0x04 }, - /* a1c */ { 0x04, 0x04 }, - /* a1d */ { 0x04, 0x04 }, - /* a1e */ { 0x04, 0x04 }, - /* a1f */ { 0x04, 0x04 }, - /* a20 */ { 0x04, 0x04 }, - /* a21 */ { 0x04, 0x04 }, - /* a22 */ { 0x04, 0x04 }, - /* a23 */ { 0x04, 0x04 }, - /* a24 */ { 0x04, 0x04 }, - /* a25 */ { 0x04, 0x04 }, - /* a26 */ { 0x04, 0x04 }, - /* a27 */ { 0x04, 0x04 }, - /* a28 */ { 0x04, 0x04 }, - /* a29 */ { 0x04, 0x04 }, - /* a2a */ { 0x04, 0x04 }, - /* a2b */ { 0x04, 0x04 }, - /* a2c */ { 0x04, 0x04 }, - /* a2d */ { 0x04, 0x04 }, - /* a2e */ { 0x04, 0x04 }, - /* a2f */ { 0x04, 0x04 }, - /* a30 */ { 0x04, 0x04 }, - /* a31 */ { 0x04, 0x04 }, - /* a32 */ { 0x04, 0x04 }, - /* a33 */ { 0x04, 0x04 }, - /* a34 */ { 0x04, 0x04 }, - /* a35 */ { 0x04, 0x04 }, - /* a36 */ { 0x04, 0x04 }, - /* a37 */ { 0x04, 0x04 }, - /* a38 */ { 0x04, 0x04 }, - /* a39 */ { 0x04, 0x04 }, - /* a3a */ { 0x04, 0x04 }, - /* a3b */ { 0x04, 0x04 }, - /* a3c */ { 0x04, 0x04 }, - /* a3d */ { 0x04, 0x04 }, - /* a3e */ { 0x04, 0x04 }, - /* a3f */ { 0x04, 0x04 }, - /* a40 */ { 0x04, 0x04 }, - /* a41 */ { 0x04, 0x04 }, - /* a42 */ { 0x04, 0x04 }, - /* a43 */ { 0x04, 0x04 }, - /* a44 */ { 0x04, 0x04 }, - /* a45 */ { 0x04, 0x04 }, - /* a46 */ { 0x04, 0x04 }, - /* a47 */ { 0x04, 0x04 }, - /* a48 */ { 0x04, 0x04 }, - /* a49 */ { 0x04, 0x04 }, - /* a4a */ { 0x04, 0x04 }, - /* a4b */ { 0x04, 0x04 }, - /* a4c */ { 0x04, 0x04 }, - /* a4d */ { 0x04, 0x04 }, - /* a4e */ { 0x04, 0x04 }, - /* a4f */ { 0x04, 0x04 }, - /* a50 */ { 0x04, 0x04 }, - /* a51 */ { 0x04, 0x04 }, - /* a52 */ { 0x04, 0x04 }, - /* a53 */ { 0x04, 0x04 }, - /* a54 */ { 0x04, 0x04 }, - /* a55 */ { 0x04, 0x04 }, - /* a56 */ { 0x04, 0x04 }, - /* a57 */ { 0x04, 0x04 }, - /* a58 */ { 0x04, 0x04 }, - /* a59 */ { 0x04, 0x04 }, - /* a5a */ { 0x04, 0x04 }, - /* a5b */ { 0x04, 0x04 }, - /* a5c */ { 0x04, 0x04 }, - /* a5d */ { 0x04, 0x04 }, - /* a5e */ { 0x04, 0x04 }, - /* a5f */ { 0x04, 0x04 }, - /* a60 */ { 0x04, 0x04 }, - /* a61 */ { 0x04, 0x04 }, - /* a62 */ { 0x04, 0x04 }, - /* a63 */ { 0x04, 0x04 }, - /* a64 */ { 0x04, 0x04 }, - /* a65 */ { 0x04, 0x04 }, - /* a66 */ { 0x04, 0x04 }, - /* a67 */ { 0x04, 0x04 }, - /* a68 */ { 0x04, 0x04 }, - /* a69 */ { 0x04, 0x04 }, - /* a6a */ { 0x04, 0x04 }, - /* a6b */ { 0x04, 0x04 }, - /* a6c */ { 0x04, 0x04 }, - /* a6d */ { 0x04, 0x04 }, - /* a6e */ { 0x04, 0x04 }, - /* a6f */ { 0x04, 0x04 }, - /* a70 */ { 0x04, 0x04 }, - /* a71 */ { 0x04, 0x04 }, - /* a72 */ { 0x04, 0x04 }, - /* a73 */ { 0x04, 0x04 }, - /* a74 */ { 0x04, 0x04 }, - /* a75 */ { 0x04, 0x04 }, - /* a76 */ { 0x04, 0x04 }, - /* a77 */ { 0x04, 0x04 }, - /* a78 */ { 0x04, 0x04 }, - /* a79 */ { 0x04, 0x04 }, - /* a7a */ { 0x04, 0x04 }, - /* a7b */ { 0x04, 0x04 }, - /* a7c */ { 0x04, 0x04 }, - /* a7d */ { 0x04, 0x04 }, - /* a7e */ { 0x04, 0x04 }, - /* a7f */ { 0x04, 0x04 }, - /* a80 */ { 0x04, 0x04 }, - /* a81 */ { 0x04, 0x04 }, - /* a82 */ { 0x04, 0x04 }, - /* a83 */ { 0x04, 0x04 }, - /* a84 */ { 0x04, 0x04 }, - /* a85 */ { 0x04, 0x04 }, - /* a86 */ { 0x04, 0x04 }, - /* a87 */ { 0x04, 0x04 }, - /* a88 */ { 0x04, 0x04 }, - /* a89 */ { 0x04, 0x04 }, - /* a8a */ { 0x04, 0x04 }, - /* a8b */ { 0x04, 0x04 }, - /* a8c */ { 0x04, 0x04 }, - /* a8d */ { 0x04, 0x04 }, - /* a8e */ { 0x04, 0x04 }, - /* a8f */ { 0x04, 0x04 }, - /* a90 */ { 0x04, 0x04 }, - /* a91 */ { 0x04, 0x04 }, - /* a92 */ { 0x04, 0x04 }, - /* a93 */ { 0x04, 0x04 }, - /* a94 */ { 0x04, 0x04 }, - /* a95 */ { 0x04, 0x04 }, - /* a96 */ { 0x04, 0x04 }, - /* a97 */ { 0x04, 0x04 }, - /* a98 */ { 0x04, 0x04 }, - /* a99 */ { 0x04, 0x04 }, - /* a9a */ { 0x04, 0x04 }, - /* a9b */ { 0x04, 0x04 }, - /* a9c */ { 0x04, 0x04 }, - /* a9d */ { 0x04, 0x04 }, - /* a9e */ { 0x04, 0x04 }, - /* a9f */ { 0x04, 0x04 }, - /* aa0 */ { 0x04, 0x04 }, - /* aa1 */ { 0x04, 0x04 }, - /* aa2 */ { 0x04, 0x04 }, - /* aa3 */ { 0x04, 0x04 }, - /* aa4 */ { 0x04, 0x04 }, - /* aa5 */ { 0x04, 0x04 }, - /* aa6 */ { 0x04, 0x04 }, - /* aa7 */ { 0x04, 0x04 }, - /* aa8 */ { 0x04, 0x04 }, - /* aa9 */ { 0x04, 0x04 }, - /* aaa */ { 0x04, 0x04 }, - /* aab */ { 0x04, 0x04 }, - /* aac */ { 0x04, 0x04 }, - /* aad */ { 0x04, 0x04 }, - /* aae */ { 0x04, 0x04 }, - /* aaf */ { 0x04, 0x04 }, - /* ab0 */ { 0x04, 0x04 }, - /* ab1 */ { 0x04, 0x04 }, - /* ab2 */ { 0x04, 0x04 }, - /* ab3 */ { 0x04, 0x04 }, - /* ab4 */ { 0x04, 0x04 }, - /* ab5 */ { 0x04, 0x04 }, - /* ab6 */ { 0x04, 0x04 }, - /* ab7 */ { 0x04, 0x04 }, - /* ab8 */ { 0x04, 0x04 }, - /* ab9 */ { 0x04, 0x04 }, - /* aba */ { 0x04, 0x04 }, - /* abb */ { 0x04, 0x04 }, - /* abc */ { 0x04, 0x04 }, - /* abd */ { 0x04, 0x04 }, - /* abe */ { 0x04, 0x04 }, - /* abf */ { 0x04, 0x04 }, - /* ac0 */ { 0x04, 0x04 }, - /* ac1 */ { 0x04, 0x04 }, - /* ac2 */ { 0x04, 0x04 }, - /* ac3 */ { 0x04, 0x04 }, - /* ac4 */ { 0x04, 0x04 }, - /* ac5 */ { 0x04, 0x04 }, - /* ac6 */ { 0x04, 0x04 }, - /* ac7 */ { 0x04, 0x04 }, - /* ac8 */ { 0x04, 0x04 }, - /* ac9 */ { 0x04, 0x04 }, - /* aca */ { 0x04, 0x04 }, - /* acb */ { 0x04, 0x04 }, - /* acc */ { 0x04, 0x04 }, - /* acd */ { 0x04, 0x04 }, - /* ace */ { 0x04, 0x04 }, - /* acf */ { 0x04, 0x04 }, - /* ad0 */ { 0x04, 0x04 }, - /* ad1 */ { 0x04, 0x04 }, - /* ad2 */ { 0x04, 0x04 }, - /* ad3 */ { 0x04, 0x04 }, - /* ad4 */ { 0x04, 0x04 }, - /* ad5 */ { 0x04, 0x04 }, - /* ad6 */ { 0x04, 0x04 }, - /* ad7 */ { 0x04, 0x04 }, - /* ad8 */ { 0x04, 0x04 }, - /* ad9 */ { 0x04, 0x04 }, - /* ada */ { 0x04, 0x04 }, - /* adb */ { 0x04, 0x04 }, - /* adc */ { 0x04, 0x04 }, - /* add */ { 0x04, 0x04 }, - /* ade */ { 0x04, 0x04 }, - /* adf */ { 0x04, 0x04 }, - /* ae0 */ { 0x04, 0x04 }, - /* ae1 */ { 0x04, 0x04 }, - /* ae2 */ { 0x04, 0x04 }, - /* ae3 */ { 0x04, 0x04 }, - /* ae4 */ { 0x04, 0x04 }, - /* ae5 */ { 0x04, 0x04 }, - /* ae6 */ { 0x04, 0x04 }, - /* ae7 */ { 0x04, 0x04 }, - /* ae8 */ { 0x04, 0x04 }, - /* ae9 */ { 0x04, 0x04 }, - /* aea */ { 0x04, 0x04 }, - /* aeb */ { 0x04, 0x04 }, - /* aec */ { 0x04, 0x04 }, - /* aed */ { 0x04, 0x04 }, - /* aee */ { 0x04, 0x04 }, - /* aef */ { 0x04, 0x04 }, - /* af0 */ { 0x04, 0x04 }, - /* af1 */ { 0x04, 0x04 }, - /* af2 */ { 0x04, 0x04 }, - /* af3 */ { 0x04, 0x04 }, - /* af4 */ { 0x04, 0x04 }, - /* af5 */ { 0x04, 0x04 }, - /* af6 */ { 0x04, 0x04 }, - /* af7 */ { 0x04, 0x04 }, - /* af8 */ { 0x04, 0x04 }, - /* af9 */ { 0x04, 0x04 }, - /* afa */ { 0x04, 0x04 }, - /* afb */ { 0x04, 0x04 }, - /* afc */ { 0x04, 0x04 }, - /* afd */ { 0x04, 0x04 }, - /* afe */ { 0x04, 0x04 }, - /* aff */ { 0x04, 0x04 }, - /* b00 */ { 0x11, 0x04 }, - /* b01 */ { 0x11, 0x04 }, - /* b02 */ { 0x11, 0x04 }, - /* b03 */ { 0x11, 0x04 }, - /* b04 */ { 0x11, 0x04 }, - /* b05 */ { 0x11, 0x04 }, - /* b06 */ { 0x11, 0x04 }, - /* b07 */ { 0x11, 0x04 }, - /* b08 */ { 0x11, 0x04 }, - /* b09 */ { 0x11, 0x04 }, - /* b0a */ { 0x11, 0x04 }, - /* b0b */ { 0x11, 0x04 }, - /* b0c */ { 0x11, 0x04 }, - /* b0d */ { 0x11, 0x04 }, - /* b0e */ { 0x11, 0x04 }, - /* b0f */ { 0x11, 0x04 }, - /* b10 */ { 0x11, 0x04 }, - /* b11 */ { 0x11, 0x04 }, - /* b12 */ { 0x11, 0x04 }, - /* b13 */ { 0x11, 0x04 }, - /* b14 */ { 0x11, 0x04 }, - /* b15 */ { 0x11, 0x04 }, - /* b16 */ { 0x11, 0x04 }, - /* b17 */ { 0x11, 0x04 }, - /* b18 */ { 0x11, 0x04 }, - /* b19 */ { 0x11, 0x04 }, - /* b1a */ { 0x11, 0x04 }, - /* b1b */ { 0x11, 0x04 }, - /* b1c */ { 0x11, 0x04 }, - /* b1d */ { 0x11, 0x04 }, - /* b1e */ { 0x11, 0x04 }, - /* b1f */ { 0x11, 0x04 }, - /* b20 */ { 0x11, 0x04 }, - /* b21 */ { 0x11, 0x04 }, - /* b22 */ { 0x11, 0x04 }, - /* b23 */ { 0x11, 0x04 }, - /* b24 */ { 0x11, 0x04 }, - /* b25 */ { 0x11, 0x04 }, - /* b26 */ { 0x11, 0x04 }, - /* b27 */ { 0x11, 0x04 }, - /* b28 */ { 0x11, 0x04 }, - /* b29 */ { 0x11, 0x04 }, - /* b2a */ { 0x11, 0x04 }, - /* b2b */ { 0x11, 0x04 }, - /* b2c */ { 0x11, 0x04 }, - /* b2d */ { 0x11, 0x04 }, - /* b2e */ { 0x11, 0x04 }, - /* b2f */ { 0x11, 0x04 }, - /* b30 */ { 0x11, 0x04 }, - /* b31 */ { 0x11, 0x04 }, - /* b32 */ { 0x11, 0x04 }, - /* b33 */ { 0x11, 0x04 }, - /* b34 */ { 0x11, 0x04 }, - /* b35 */ { 0x11, 0x04 }, - /* b36 */ { 0x11, 0x04 }, - /* b37 */ { 0x11, 0x04 }, - /* b38 */ { 0x11, 0x04 }, - /* b39 */ { 0x11, 0x04 }, - /* b3a */ { 0x11, 0x04 }, - /* b3b */ { 0x11, 0x04 }, - /* b3c */ { 0x11, 0x04 }, - /* b3d */ { 0x11, 0x04 }, - /* b3e */ { 0x11, 0x04 }, - /* b3f */ { 0x11, 0x04 }, - /* b40 */ { 0x11, 0x04 }, - /* b41 */ { 0x11, 0x04 }, - /* b42 */ { 0x11, 0x04 }, - /* b43 */ { 0x11, 0x04 }, - /* b44 */ { 0x11, 0x04 }, - /* b45 */ { 0x11, 0x04 }, - /* b46 */ { 0x11, 0x04 }, - /* b47 */ { 0x11, 0x04 }, - /* b48 */ { 0x11, 0x04 }, - /* b49 */ { 0x11, 0x04 }, - /* b4a */ { 0x11, 0x04 }, - /* b4b */ { 0x11, 0x04 }, - /* b4c */ { 0x11, 0x04 }, - /* b4d */ { 0x11, 0x04 }, - /* b4e */ { 0x11, 0x04 }, - /* b4f */ { 0x11, 0x04 }, - /* b50 */ { 0x11, 0x04 }, - /* b51 */ { 0x11, 0x04 }, - /* b52 */ { 0x11, 0x04 }, - /* b53 */ { 0x11, 0x04 }, - /* b54 */ { 0x11, 0x04 }, - /* b55 */ { 0x11, 0x04 }, - /* b56 */ { 0x11, 0x04 }, - /* b57 */ { 0x11, 0x04 }, - /* b58 */ { 0x11, 0x04 }, - /* b59 */ { 0x11, 0x04 }, - /* b5a */ { 0x11, 0x04 }, - /* b5b */ { 0x11, 0x04 }, - /* b5c */ { 0x11, 0x04 }, - /* b5d */ { 0x11, 0x04 }, - /* b5e */ { 0x11, 0x04 }, - /* b5f */ { 0x11, 0x04 }, - /* b60 */ { 0x11, 0x04 }, - /* b61 */ { 0x11, 0x04 }, - /* b62 */ { 0x11, 0x04 }, - /* b63 */ { 0x11, 0x04 }, - /* b64 */ { 0x11, 0x04 }, - /* b65 */ { 0x11, 0x04 }, - /* b66 */ { 0x11, 0x04 }, - /* b67 */ { 0x11, 0x04 }, - /* b68 */ { 0x11, 0x04 }, - /* b69 */ { 0x11, 0x04 }, - /* b6a */ { 0x11, 0x04 }, - /* b6b */ { 0x11, 0x04 }, - /* b6c */ { 0x11, 0x04 }, - /* b6d */ { 0x11, 0x04 }, - /* b6e */ { 0x11, 0x04 }, - /* b6f */ { 0x11, 0x04 }, - /* b70 */ { 0x11, 0x04 }, - /* b71 */ { 0x11, 0x04 }, - /* b72 */ { 0x11, 0x04 }, - /* b73 */ { 0x11, 0x04 }, - /* b74 */ { 0x11, 0x04 }, - /* b75 */ { 0x11, 0x04 }, - /* b76 */ { 0x11, 0x04 }, - /* b77 */ { 0x11, 0x04 }, - /* b78 */ { 0x11, 0x04 }, - /* b79 */ { 0x11, 0x04 }, - /* b7a */ { 0x11, 0x04 }, - /* b7b */ { 0x11, 0x04 }, - /* b7c */ { 0x11, 0x04 }, - /* b7d */ { 0x11, 0x04 }, - /* b7e */ { 0x11, 0x04 }, - /* b7f */ { 0x11, 0x04 }, - /* b80 */ { 0x11, 0x04 }, - /* b81 */ { 0x11, 0x04 }, - /* b82 */ { 0x11, 0x04 }, - /* b83 */ { 0x11, 0x04 }, - /* b84 */ { 0x11, 0x04 }, - /* b85 */ { 0x11, 0x04 }, - /* b86 */ { 0x11, 0x04 }, - /* b87 */ { 0x11, 0x04 }, - /* b88 */ { 0x11, 0x04 }, - /* b89 */ { 0x11, 0x04 }, - /* b8a */ { 0x11, 0x04 }, - /* b8b */ { 0x11, 0x04 }, - /* b8c */ { 0x11, 0x04 }, - /* b8d */ { 0x11, 0x04 }, - /* b8e */ { 0x11, 0x04 }, - /* b8f */ { 0x11, 0x04 }, - /* b90 */ { 0x11, 0x04 }, - /* b91 */ { 0x11, 0x04 }, - /* b92 */ { 0x11, 0x04 }, - /* b93 */ { 0x11, 0x04 }, - /* b94 */ { 0x11, 0x04 }, - /* b95 */ { 0x11, 0x04 }, - /* b96 */ { 0x11, 0x04 }, - /* b97 */ { 0x11, 0x04 }, - /* b98 */ { 0x11, 0x04 }, - /* b99 */ { 0x11, 0x04 }, - /* b9a */ { 0x11, 0x04 }, - /* b9b */ { 0x11, 0x04 }, - /* b9c */ { 0x11, 0x04 }, - /* b9d */ { 0x11, 0x04 }, - /* b9e */ { 0x11, 0x04 }, - /* b9f */ { 0x11, 0x04 }, - /* ba0 */ { 0x11, 0x04 }, - /* ba1 */ { 0x11, 0x04 }, - /* ba2 */ { 0x11, 0x04 }, - /* ba3 */ { 0x11, 0x04 }, - /* ba4 */ { 0x11, 0x04 }, - /* ba5 */ { 0x11, 0x04 }, - /* ba6 */ { 0x11, 0x04 }, - /* ba7 */ { 0x11, 0x04 }, - /* ba8 */ { 0x11, 0x04 }, - /* ba9 */ { 0x11, 0x04 }, - /* baa */ { 0x11, 0x04 }, - /* bab */ { 0x11, 0x04 }, - /* bac */ { 0x11, 0x04 }, - /* bad */ { 0x11, 0x04 }, - /* bae */ { 0x11, 0x04 }, - /* baf */ { 0x11, 0x04 }, - /* bb0 */ { 0x11, 0x04 }, - /* bb1 */ { 0x11, 0x04 }, - /* bb2 */ { 0x11, 0x04 }, - /* bb3 */ { 0x11, 0x04 }, - /* bb4 */ { 0x11, 0x04 }, - /* bb5 */ { 0x11, 0x04 }, - /* bb6 */ { 0x11, 0x04 }, - /* bb7 */ { 0x11, 0x04 }, - /* bb8 */ { 0x11, 0x04 }, - /* bb9 */ { 0x11, 0x04 }, - /* bba */ { 0x11, 0x04 }, - /* bbb */ { 0x11, 0x04 }, - /* bbc */ { 0x11, 0x04 }, - /* bbd */ { 0x11, 0x04 }, - /* bbe */ { 0x11, 0x04 }, - /* bbf */ { 0x11, 0x04 }, - /* bc0 */ { 0x11, 0x04 }, - /* bc1 */ { 0x11, 0x04 }, - /* bc2 */ { 0x11, 0x04 }, - /* bc3 */ { 0x11, 0x04 }, - /* bc4 */ { 0x11, 0x04 }, - /* bc5 */ { 0x11, 0x04 }, - /* bc6 */ { 0x11, 0x04 }, - /* bc7 */ { 0x11, 0x04 }, - /* bc8 */ { 0x11, 0x04 }, - /* bc9 */ { 0x11, 0x04 }, - /* bca */ { 0x11, 0x04 }, - /* bcb */ { 0x11, 0x04 }, - /* bcc */ { 0x11, 0x04 }, - /* bcd */ { 0x11, 0x04 }, - /* bce */ { 0x11, 0x04 }, - /* bcf */ { 0x11, 0x04 }, - /* bd0 */ { 0x11, 0x04 }, - /* bd1 */ { 0x11, 0x04 }, - /* bd2 */ { 0x11, 0x04 }, - /* bd3 */ { 0x11, 0x04 }, - /* bd4 */ { 0x11, 0x04 }, - /* bd5 */ { 0x11, 0x04 }, - /* bd6 */ { 0x11, 0x04 }, - /* bd7 */ { 0x11, 0x04 }, - /* bd8 */ { 0x11, 0x04 }, - /* bd9 */ { 0x11, 0x04 }, - /* bda */ { 0x11, 0x04 }, - /* bdb */ { 0x11, 0x04 }, - /* bdc */ { 0x11, 0x04 }, - /* bdd */ { 0x11, 0x04 }, - /* bde */ { 0x11, 0x04 }, - /* bdf */ { 0x11, 0x04 }, - /* be0 */ { 0x11, 0x04 }, - /* be1 */ { 0x11, 0x04 }, - /* be2 */ { 0x11, 0x04 }, - /* be3 */ { 0x11, 0x04 }, - /* be4 */ { 0x11, 0x04 }, - /* be5 */ { 0x11, 0x04 }, - /* be6 */ { 0x11, 0x04 }, - /* be7 */ { 0x11, 0x04 }, - /* be8 */ { 0x11, 0x04 }, - /* be9 */ { 0x11, 0x04 }, - /* bea */ { 0x11, 0x04 }, - /* beb */ { 0x11, 0x04 }, - /* bec */ { 0x11, 0x04 }, - /* bed */ { 0x11, 0x04 }, - /* bee */ { 0x11, 0x04 }, - /* bef */ { 0x11, 0x04 }, - /* bf0 */ { 0x11, 0x04 }, - /* bf1 */ { 0x11, 0x04 }, - /* bf2 */ { 0x11, 0x04 }, - /* bf3 */ { 0x11, 0x04 }, - /* bf4 */ { 0x11, 0x04 }, - /* bf5 */ { 0x11, 0x04 }, - /* bf6 */ { 0x11, 0x04 }, - /* bf7 */ { 0x11, 0x04 }, - /* bf8 */ { 0x11, 0x04 }, - /* bf9 */ { 0x11, 0x04 }, - /* bfa */ { 0x11, 0x04 }, - /* bfb */ { 0x11, 0x04 }, - /* bfc */ { 0x11, 0x04 }, - /* bfd */ { 0x11, 0x04 }, - /* bfe */ { 0x11, 0x04 }, - /* bff */ { 0x11, 0x04 }, - /* c00 */ { 0x05, 0x05 }, - /* c01 */ { 0x05, 0x05 }, - /* c02 */ { 0x05, 0x05 }, - /* c03 */ { 0x05, 0x05 }, - /* c04 */ { 0x05, 0x05 }, - /* c05 */ { 0x05, 0x05 }, - /* c06 */ { 0x05, 0x05 }, - /* c07 */ { 0x05, 0x05 }, - /* c08 */ { 0x05, 0x05 }, - /* c09 */ { 0x05, 0x05 }, - /* c0a */ { 0x05, 0x05 }, - /* c0b */ { 0x05, 0x05 }, - /* c0c */ { 0x05, 0x05 }, - /* c0d */ { 0x05, 0x05 }, - /* c0e */ { 0x05, 0x05 }, - /* c0f */ { 0x05, 0x05 }, - /* c10 */ { 0x05, 0x05 }, - /* c11 */ { 0x05, 0x05 }, - /* c12 */ { 0x05, 0x05 }, - /* c13 */ { 0x05, 0x05 }, - /* c14 */ { 0x05, 0x05 }, - /* c15 */ { 0x05, 0x05 }, - /* c16 */ { 0x05, 0x05 }, - /* c17 */ { 0x05, 0x05 }, - /* c18 */ { 0x05, 0x05 }, - /* c19 */ { 0x05, 0x05 }, - /* c1a */ { 0x05, 0x05 }, - /* c1b */ { 0x05, 0x05 }, - /* c1c */ { 0x05, 0x05 }, - /* c1d */ { 0x05, 0x05 }, - /* c1e */ { 0x05, 0x05 }, - /* c1f */ { 0x05, 0x05 }, - /* c20 */ { 0x05, 0x05 }, - /* c21 */ { 0x05, 0x05 }, - /* c22 */ { 0x05, 0x05 }, - /* c23 */ { 0x05, 0x05 }, - /* c24 */ { 0x05, 0x05 }, - /* c25 */ { 0x05, 0x05 }, - /* c26 */ { 0x05, 0x05 }, - /* c27 */ { 0x05, 0x05 }, - /* c28 */ { 0x05, 0x05 }, - /* c29 */ { 0x05, 0x05 }, - /* c2a */ { 0x05, 0x05 }, - /* c2b */ { 0x05, 0x05 }, - /* c2c */ { 0x05, 0x05 }, - /* c2d */ { 0x05, 0x05 }, - /* c2e */ { 0x05, 0x05 }, - /* c2f */ { 0x05, 0x05 }, - /* c30 */ { 0x05, 0x05 }, - /* c31 */ { 0x05, 0x05 }, - /* c32 */ { 0x05, 0x05 }, - /* c33 */ { 0x05, 0x05 }, - /* c34 */ { 0x05, 0x05 }, - /* c35 */ { 0x05, 0x05 }, - /* c36 */ { 0x05, 0x05 }, - /* c37 */ { 0x05, 0x05 }, - /* c38 */ { 0x05, 0x05 }, - /* c39 */ { 0x05, 0x05 }, - /* c3a */ { 0x05, 0x05 }, - /* c3b */ { 0x05, 0x05 }, - /* c3c */ { 0x05, 0x05 }, - /* c3d */ { 0x05, 0x05 }, - /* c3e */ { 0x05, 0x05 }, - /* c3f */ { 0x05, 0x05 }, - /* c40 */ { 0x05, 0x05 }, - /* c41 */ { 0x05, 0x05 }, - /* c42 */ { 0x05, 0x05 }, - /* c43 */ { 0x05, 0x05 }, - /* c44 */ { 0x05, 0x05 }, - /* c45 */ { 0x05, 0x05 }, - /* c46 */ { 0x05, 0x05 }, - /* c47 */ { 0x05, 0x05 }, - /* c48 */ { 0x05, 0x05 }, - /* c49 */ { 0x05, 0x05 }, - /* c4a */ { 0x05, 0x05 }, - /* c4b */ { 0x05, 0x05 }, - /* c4c */ { 0x05, 0x05 }, - /* c4d */ { 0x05, 0x05 }, - /* c4e */ { 0x05, 0x05 }, - /* c4f */ { 0x05, 0x05 }, - /* c50 */ { 0x05, 0x05 }, - /* c51 */ { 0x05, 0x05 }, - /* c52 */ { 0x05, 0x05 }, - /* c53 */ { 0x05, 0x05 }, - /* c54 */ { 0x05, 0x05 }, - /* c55 */ { 0x05, 0x05 }, - /* c56 */ { 0x05, 0x05 }, - /* c57 */ { 0x05, 0x05 }, - /* c58 */ { 0x05, 0x05 }, - /* c59 */ { 0x05, 0x05 }, - /* c5a */ { 0x05, 0x05 }, - /* c5b */ { 0x05, 0x05 }, - /* c5c */ { 0x05, 0x05 }, - /* c5d */ { 0x05, 0x05 }, - /* c5e */ { 0x05, 0x05 }, - /* c5f */ { 0x05, 0x05 }, - /* c60 */ { 0x05, 0x05 }, - /* c61 */ { 0x05, 0x05 }, - /* c62 */ { 0x05, 0x05 }, - /* c63 */ { 0x05, 0x05 }, - /* c64 */ { 0x05, 0x05 }, - /* c65 */ { 0x05, 0x05 }, - /* c66 */ { 0x05, 0x05 }, - /* c67 */ { 0x05, 0x05 }, - /* c68 */ { 0x05, 0x05 }, - /* c69 */ { 0x05, 0x05 }, - /* c6a */ { 0x05, 0x05 }, - /* c6b */ { 0x05, 0x05 }, - /* c6c */ { 0x05, 0x05 }, - /* c6d */ { 0x05, 0x05 }, - /* c6e */ { 0x05, 0x05 }, - /* c6f */ { 0x05, 0x05 }, - /* c70 */ { 0x05, 0x05 }, - /* c71 */ { 0x05, 0x05 }, - /* c72 */ { 0x05, 0x05 }, - /* c73 */ { 0x05, 0x05 }, - /* c74 */ { 0x05, 0x05 }, - /* c75 */ { 0x05, 0x05 }, - /* c76 */ { 0x05, 0x05 }, - /* c77 */ { 0x05, 0x05 }, - /* c78 */ { 0x05, 0x05 }, - /* c79 */ { 0x05, 0x05 }, - /* c7a */ { 0x05, 0x05 }, - /* c7b */ { 0x05, 0x05 }, - /* c7c */ { 0x05, 0x05 }, - /* c7d */ { 0x05, 0x05 }, - /* c7e */ { 0x05, 0x05 }, - /* c7f */ { 0x05, 0x05 }, - /* c80 */ { 0x12, 0x05 }, - /* c81 */ { 0x12, 0x05 }, - /* c82 */ { 0x12, 0x05 }, - /* c83 */ { 0x12, 0x05 }, - /* c84 */ { 0x12, 0x05 }, - /* c85 */ { 0x12, 0x05 }, - /* c86 */ { 0x12, 0x05 }, - /* c87 */ { 0x12, 0x05 }, - /* c88 */ { 0x12, 0x05 }, - /* c89 */ { 0x12, 0x05 }, - /* c8a */ { 0x12, 0x05 }, - /* c8b */ { 0x12, 0x05 }, - /* c8c */ { 0x12, 0x05 }, - /* c8d */ { 0x12, 0x05 }, - /* c8e */ { 0x12, 0x05 }, - /* c8f */ { 0x12, 0x05 }, - /* c90 */ { 0x12, 0x05 }, - /* c91 */ { 0x12, 0x05 }, - /* c92 */ { 0x12, 0x05 }, - /* c93 */ { 0x12, 0x05 }, - /* c94 */ { 0x12, 0x05 }, - /* c95 */ { 0x12, 0x05 }, - /* c96 */ { 0x12, 0x05 }, - /* c97 */ { 0x12, 0x05 }, - /* c98 */ { 0x12, 0x05 }, - /* c99 */ { 0x12, 0x05 }, - /* c9a */ { 0x12, 0x05 }, - /* c9b */ { 0x12, 0x05 }, - /* c9c */ { 0x12, 0x05 }, - /* c9d */ { 0x12, 0x05 }, - /* c9e */ { 0x12, 0x05 }, - /* c9f */ { 0x12, 0x05 }, - /* ca0 */ { 0x12, 0x05 }, - /* ca1 */ { 0x12, 0x05 }, - /* ca2 */ { 0x12, 0x05 }, - /* ca3 */ { 0x12, 0x05 }, - /* ca4 */ { 0x12, 0x05 }, - /* ca5 */ { 0x12, 0x05 }, - /* ca6 */ { 0x12, 0x05 }, - /* ca7 */ { 0x12, 0x05 }, - /* ca8 */ { 0x12, 0x05 }, - /* ca9 */ { 0x12, 0x05 }, - /* caa */ { 0x12, 0x05 }, - /* cab */ { 0x12, 0x05 }, - /* cac */ { 0x12, 0x05 }, - /* cad */ { 0x12, 0x05 }, - /* cae */ { 0x12, 0x05 }, - /* caf */ { 0x12, 0x05 }, - /* cb0 */ { 0x12, 0x05 }, - /* cb1 */ { 0x12, 0x05 }, - /* cb2 */ { 0x12, 0x05 }, - /* cb3 */ { 0x12, 0x05 }, - /* cb4 */ { 0x12, 0x05 }, - /* cb5 */ { 0x12, 0x05 }, - /* cb6 */ { 0x12, 0x05 }, - /* cb7 */ { 0x12, 0x05 }, - /* cb8 */ { 0x12, 0x05 }, - /* cb9 */ { 0x12, 0x05 }, - /* cba */ { 0x12, 0x05 }, - /* cbb */ { 0x12, 0x05 }, - /* cbc */ { 0x12, 0x05 }, - /* cbd */ { 0x12, 0x05 }, - /* cbe */ { 0x12, 0x05 }, - /* cbf */ { 0x12, 0x05 }, - /* cc0 */ { 0x12, 0x05 }, - /* cc1 */ { 0x12, 0x05 }, - /* cc2 */ { 0x12, 0x05 }, - /* cc3 */ { 0x12, 0x05 }, - /* cc4 */ { 0x12, 0x05 }, - /* cc5 */ { 0x12, 0x05 }, - /* cc6 */ { 0x12, 0x05 }, - /* cc7 */ { 0x12, 0x05 }, - /* cc8 */ { 0x12, 0x05 }, - /* cc9 */ { 0x12, 0x05 }, - /* cca */ { 0x12, 0x05 }, - /* ccb */ { 0x12, 0x05 }, - /* ccc */ { 0x12, 0x05 }, - /* ccd */ { 0x12, 0x05 }, - /* cce */ { 0x12, 0x05 }, - /* ccf */ { 0x12, 0x05 }, - /* cd0 */ { 0x12, 0x05 }, - /* cd1 */ { 0x12, 0x05 }, - /* cd2 */ { 0x12, 0x05 }, - /* cd3 */ { 0x12, 0x05 }, - /* cd4 */ { 0x12, 0x05 }, - /* cd5 */ { 0x12, 0x05 }, - /* cd6 */ { 0x12, 0x05 }, - /* cd7 */ { 0x12, 0x05 }, - /* cd8 */ { 0x12, 0x05 }, - /* cd9 */ { 0x12, 0x05 }, - /* cda */ { 0x12, 0x05 }, - /* cdb */ { 0x12, 0x05 }, - /* cdc */ { 0x12, 0x05 }, - /* cdd */ { 0x12, 0x05 }, - /* cde */ { 0x12, 0x05 }, - /* cdf */ { 0x12, 0x05 }, - /* ce0 */ { 0x12, 0x05 }, - /* ce1 */ { 0x12, 0x05 }, - /* ce2 */ { 0x12, 0x05 }, - /* ce3 */ { 0x12, 0x05 }, - /* ce4 */ { 0x12, 0x05 }, - /* ce5 */ { 0x12, 0x05 }, - /* ce6 */ { 0x12, 0x05 }, - /* ce7 */ { 0x12, 0x05 }, - /* ce8 */ { 0x12, 0x05 }, - /* ce9 */ { 0x12, 0x05 }, - /* cea */ { 0x12, 0x05 }, - /* ceb */ { 0x12, 0x05 }, - /* cec */ { 0x12, 0x05 }, - /* ced */ { 0x12, 0x05 }, - /* cee */ { 0x12, 0x05 }, - /* cef */ { 0x12, 0x05 }, - /* cf0 */ { 0x12, 0x05 }, - /* cf1 */ { 0x12, 0x05 }, - /* cf2 */ { 0x12, 0x05 }, - /* cf3 */ { 0x12, 0x05 }, - /* cf4 */ { 0x12, 0x05 }, - /* cf5 */ { 0x12, 0x05 }, - /* cf6 */ { 0x12, 0x05 }, - /* cf7 */ { 0x12, 0x05 }, - /* cf8 */ { 0x12, 0x05 }, - /* cf9 */ { 0x12, 0x05 }, - /* cfa */ { 0x12, 0x05 }, - /* cfb */ { 0x12, 0x05 }, - /* cfc */ { 0x12, 0x05 }, - /* cfd */ { 0x12, 0x05 }, - /* cfe */ { 0x12, 0x05 }, - /* cff */ { 0x12, 0x05 }, - /* d00 */ { 0x21, 0x05 }, - /* d01 */ { 0x21, 0x05 }, - /* d02 */ { 0x21, 0x05 }, - /* d03 */ { 0x21, 0x05 }, - /* d04 */ { 0x21, 0x05 }, - /* d05 */ { 0x21, 0x05 }, - /* d06 */ { 0x21, 0x05 }, - /* d07 */ { 0x21, 0x05 }, - /* d08 */ { 0x21, 0x05 }, - /* d09 */ { 0x21, 0x05 }, - /* d0a */ { 0x21, 0x05 }, - /* d0b */ { 0x21, 0x05 }, - /* d0c */ { 0x21, 0x05 }, - /* d0d */ { 0x21, 0x05 }, - /* d0e */ { 0x21, 0x05 }, - /* d0f */ { 0x21, 0x05 }, - /* d10 */ { 0x21, 0x05 }, - /* d11 */ { 0x21, 0x05 }, - /* d12 */ { 0x21, 0x05 }, - /* d13 */ { 0x21, 0x05 }, - /* d14 */ { 0x21, 0x05 }, - /* d15 */ { 0x21, 0x05 }, - /* d16 */ { 0x21, 0x05 }, - /* d17 */ { 0x21, 0x05 }, - /* d18 */ { 0x21, 0x05 }, - /* d19 */ { 0x21, 0x05 }, - /* d1a */ { 0x21, 0x05 }, - /* d1b */ { 0x21, 0x05 }, - /* d1c */ { 0x21, 0x05 }, - /* d1d */ { 0x21, 0x05 }, - /* d1e */ { 0x21, 0x05 }, - /* d1f */ { 0x21, 0x05 }, - /* d20 */ { 0x21, 0x05 }, - /* d21 */ { 0x21, 0x05 }, - /* d22 */ { 0x21, 0x05 }, - /* d23 */ { 0x21, 0x05 }, - /* d24 */ { 0x21, 0x05 }, - /* d25 */ { 0x21, 0x05 }, - /* d26 */ { 0x21, 0x05 }, - /* d27 */ { 0x21, 0x05 }, - /* d28 */ { 0x21, 0x05 }, - /* d29 */ { 0x21, 0x05 }, - /* d2a */ { 0x21, 0x05 }, - /* d2b */ { 0x21, 0x05 }, - /* d2c */ { 0x21, 0x05 }, - /* d2d */ { 0x21, 0x05 }, - /* d2e */ { 0x21, 0x05 }, - /* d2f */ { 0x21, 0x05 }, - /* d30 */ { 0x21, 0x05 }, - /* d31 */ { 0x21, 0x05 }, - /* d32 */ { 0x21, 0x05 }, - /* d33 */ { 0x21, 0x05 }, - /* d34 */ { 0x21, 0x05 }, - /* d35 */ { 0x21, 0x05 }, - /* d36 */ { 0x21, 0x05 }, - /* d37 */ { 0x21, 0x05 }, - /* d38 */ { 0x21, 0x05 }, - /* d39 */ { 0x21, 0x05 }, - /* d3a */ { 0x21, 0x05 }, - /* d3b */ { 0x21, 0x05 }, - /* d3c */ { 0x21, 0x05 }, - /* d3d */ { 0x21, 0x05 }, - /* d3e */ { 0x21, 0x05 }, - /* d3f */ { 0x21, 0x05 }, - /* d40 */ { 0x21, 0x05 }, - /* d41 */ { 0x21, 0x05 }, - /* d42 */ { 0x21, 0x05 }, - /* d43 */ { 0x21, 0x05 }, - /* d44 */ { 0x21, 0x05 }, - /* d45 */ { 0x21, 0x05 }, - /* d46 */ { 0x21, 0x05 }, - /* d47 */ { 0x21, 0x05 }, - /* d48 */ { 0x21, 0x05 }, - /* d49 */ { 0x21, 0x05 }, - /* d4a */ { 0x21, 0x05 }, - /* d4b */ { 0x21, 0x05 }, - /* d4c */ { 0x21, 0x05 }, - /* d4d */ { 0x21, 0x05 }, - /* d4e */ { 0x21, 0x05 }, - /* d4f */ { 0x21, 0x05 }, - /* d50 */ { 0x21, 0x05 }, - /* d51 */ { 0x21, 0x05 }, - /* d52 */ { 0x21, 0x05 }, - /* d53 */ { 0x21, 0x05 }, - /* d54 */ { 0x21, 0x05 }, - /* d55 */ { 0x21, 0x05 }, - /* d56 */ { 0x21, 0x05 }, - /* d57 */ { 0x21, 0x05 }, - /* d58 */ { 0x21, 0x05 }, - /* d59 */ { 0x21, 0x05 }, - /* d5a */ { 0x21, 0x05 }, - /* d5b */ { 0x21, 0x05 }, - /* d5c */ { 0x21, 0x05 }, - /* d5d */ { 0x21, 0x05 }, - /* d5e */ { 0x21, 0x05 }, - /* d5f */ { 0x21, 0x05 }, - /* d60 */ { 0x21, 0x05 }, - /* d61 */ { 0x21, 0x05 }, - /* d62 */ { 0x21, 0x05 }, - /* d63 */ { 0x21, 0x05 }, - /* d64 */ { 0x21, 0x05 }, - /* d65 */ { 0x21, 0x05 }, - /* d66 */ { 0x21, 0x05 }, - /* d67 */ { 0x21, 0x05 }, - /* d68 */ { 0x21, 0x05 }, - /* d69 */ { 0x21, 0x05 }, - /* d6a */ { 0x21, 0x05 }, - /* d6b */ { 0x21, 0x05 }, - /* d6c */ { 0x21, 0x05 }, - /* d6d */ { 0x21, 0x05 }, - /* d6e */ { 0x21, 0x05 }, - /* d6f */ { 0x21, 0x05 }, - /* d70 */ { 0x21, 0x05 }, - /* d71 */ { 0x21, 0x05 }, - /* d72 */ { 0x21, 0x05 }, - /* d73 */ { 0x21, 0x05 }, - /* d74 */ { 0x21, 0x05 }, - /* d75 */ { 0x21, 0x05 }, - /* d76 */ { 0x21, 0x05 }, - /* d77 */ { 0x21, 0x05 }, - /* d78 */ { 0x21, 0x05 }, - /* d79 */ { 0x21, 0x05 }, - /* d7a */ { 0x21, 0x05 }, - /* d7b */ { 0x21, 0x05 }, - /* d7c */ { 0x21, 0x05 }, - /* d7d */ { 0x21, 0x05 }, - /* d7e */ { 0x21, 0x05 }, - /* d7f */ { 0x21, 0x05 }, - /* d80 */ { 0x06, 0x06 }, - /* d81 */ { 0x06, 0x06 }, - /* d82 */ { 0x06, 0x06 }, - /* d83 */ { 0x06, 0x06 }, - /* d84 */ { 0x06, 0x06 }, - /* d85 */ { 0x06, 0x06 }, - /* d86 */ { 0x06, 0x06 }, - /* d87 */ { 0x06, 0x06 }, - /* d88 */ { 0x06, 0x06 }, - /* d89 */ { 0x06, 0x06 }, - /* d8a */ { 0x06, 0x06 }, - /* d8b */ { 0x06, 0x06 }, - /* d8c */ { 0x06, 0x06 }, - /* d8d */ { 0x06, 0x06 }, - /* d8e */ { 0x06, 0x06 }, - /* d8f */ { 0x06, 0x06 }, - /* d90 */ { 0x06, 0x06 }, - /* d91 */ { 0x06, 0x06 }, - /* d92 */ { 0x06, 0x06 }, - /* d93 */ { 0x06, 0x06 }, - /* d94 */ { 0x06, 0x06 }, - /* d95 */ { 0x06, 0x06 }, - /* d96 */ { 0x06, 0x06 }, - /* d97 */ { 0x06, 0x06 }, - /* d98 */ { 0x06, 0x06 }, - /* d99 */ { 0x06, 0x06 }, - /* d9a */ { 0x06, 0x06 }, - /* d9b */ { 0x06, 0x06 }, - /* d9c */ { 0x06, 0x06 }, - /* d9d */ { 0x06, 0x06 }, - /* d9e */ { 0x06, 0x06 }, - /* d9f */ { 0x06, 0x06 }, - /* da0 */ { 0x06, 0x06 }, - /* da1 */ { 0x06, 0x06 }, - /* da2 */ { 0x06, 0x06 }, - /* da3 */ { 0x06, 0x06 }, - /* da4 */ { 0x06, 0x06 }, - /* da5 */ { 0x06, 0x06 }, - /* da6 */ { 0x06, 0x06 }, - /* da7 */ { 0x06, 0x06 }, - /* da8 */ { 0x06, 0x06 }, - /* da9 */ { 0x06, 0x06 }, - /* daa */ { 0x06, 0x06 }, - /* dab */ { 0x06, 0x06 }, - /* dac */ { 0x06, 0x06 }, - /* dad */ { 0x06, 0x06 }, - /* dae */ { 0x06, 0x06 }, - /* daf */ { 0x06, 0x06 }, - /* db0 */ { 0x06, 0x06 }, - /* db1 */ { 0x06, 0x06 }, - /* db2 */ { 0x06, 0x06 }, - /* db3 */ { 0x06, 0x06 }, - /* db4 */ { 0x06, 0x06 }, - /* db5 */ { 0x06, 0x06 }, - /* db6 */ { 0x06, 0x06 }, - /* db7 */ { 0x06, 0x06 }, - /* db8 */ { 0x06, 0x06 }, - /* db9 */ { 0x06, 0x06 }, - /* dba */ { 0x06, 0x06 }, - /* dbb */ { 0x06, 0x06 }, - /* dbc */ { 0x06, 0x06 }, - /* dbd */ { 0x06, 0x06 }, - /* dbe */ { 0x06, 0x06 }, - /* dbf */ { 0x06, 0x06 }, - /* dc0 */ { 0x31, 0x06 }, - /* dc1 */ { 0x31, 0x06 }, - /* dc2 */ { 0x31, 0x06 }, - /* dc3 */ { 0x31, 0x06 }, - /* dc4 */ { 0x31, 0x06 }, - /* dc5 */ { 0x31, 0x06 }, - /* dc6 */ { 0x31, 0x06 }, - /* dc7 */ { 0x31, 0x06 }, - /* dc8 */ { 0x31, 0x06 }, - /* dc9 */ { 0x31, 0x06 }, - /* dca */ { 0x31, 0x06 }, - /* dcb */ { 0x31, 0x06 }, - /* dcc */ { 0x31, 0x06 }, - /* dcd */ { 0x31, 0x06 }, - /* dce */ { 0x31, 0x06 }, - /* dcf */ { 0x31, 0x06 }, - /* dd0 */ { 0x31, 0x06 }, - /* dd1 */ { 0x31, 0x06 }, - /* dd2 */ { 0x31, 0x06 }, - /* dd3 */ { 0x31, 0x06 }, - /* dd4 */ { 0x31, 0x06 }, - /* dd5 */ { 0x31, 0x06 }, - /* dd6 */ { 0x31, 0x06 }, - /* dd7 */ { 0x31, 0x06 }, - /* dd8 */ { 0x31, 0x06 }, - /* dd9 */ { 0x31, 0x06 }, - /* dda */ { 0x31, 0x06 }, - /* ddb */ { 0x31, 0x06 }, - /* ddc */ { 0x31, 0x06 }, - /* ddd */ { 0x31, 0x06 }, - /* dde */ { 0x31, 0x06 }, - /* ddf */ { 0x31, 0x06 }, - /* de0 */ { 0x31, 0x06 }, - /* de1 */ { 0x31, 0x06 }, - /* de2 */ { 0x31, 0x06 }, - /* de3 */ { 0x31, 0x06 }, - /* de4 */ { 0x31, 0x06 }, - /* de5 */ { 0x31, 0x06 }, - /* de6 */ { 0x31, 0x06 }, - /* de7 */ { 0x31, 0x06 }, - /* de8 */ { 0x31, 0x06 }, - /* de9 */ { 0x31, 0x06 }, - /* dea */ { 0x31, 0x06 }, - /* deb */ { 0x31, 0x06 }, - /* dec */ { 0x31, 0x06 }, - /* ded */ { 0x31, 0x06 }, - /* dee */ { 0x31, 0x06 }, - /* def */ { 0x31, 0x06 }, - /* df0 */ { 0x31, 0x06 }, - /* df1 */ { 0x31, 0x06 }, - /* df2 */ { 0x31, 0x06 }, - /* df3 */ { 0x31, 0x06 }, - /* df4 */ { 0x31, 0x06 }, - /* df5 */ { 0x31, 0x06 }, - /* df6 */ { 0x31, 0x06 }, - /* df7 */ { 0x31, 0x06 }, - /* df8 */ { 0x31, 0x06 }, - /* df9 */ { 0x31, 0x06 }, - /* dfa */ { 0x31, 0x06 }, - /* dfb */ { 0x31, 0x06 }, - /* dfc */ { 0x31, 0x06 }, - /* dfd */ { 0x31, 0x06 }, - /* dfe */ { 0x31, 0x06 }, - /* dff */ { 0x31, 0x06 }, - /* e00 */ { 0x41, 0x06 }, - /* e01 */ { 0x41, 0x06 }, - /* e02 */ { 0x41, 0x06 }, - /* e03 */ { 0x41, 0x06 }, - /* e04 */ { 0x41, 0x06 }, - /* e05 */ { 0x41, 0x06 }, - /* e06 */ { 0x41, 0x06 }, - /* e07 */ { 0x41, 0x06 }, - /* e08 */ { 0x41, 0x06 }, - /* e09 */ { 0x41, 0x06 }, - /* e0a */ { 0x41, 0x06 }, - /* e0b */ { 0x41, 0x06 }, - /* e0c */ { 0x41, 0x06 }, - /* e0d */ { 0x41, 0x06 }, - /* e0e */ { 0x41, 0x06 }, - /* e0f */ { 0x41, 0x06 }, - /* e10 */ { 0x41, 0x06 }, - /* e11 */ { 0x41, 0x06 }, - /* e12 */ { 0x41, 0x06 }, - /* e13 */ { 0x41, 0x06 }, - /* e14 */ { 0x41, 0x06 }, - /* e15 */ { 0x41, 0x06 }, - /* e16 */ { 0x41, 0x06 }, - /* e17 */ { 0x41, 0x06 }, - /* e18 */ { 0x41, 0x06 }, - /* e19 */ { 0x41, 0x06 }, - /* e1a */ { 0x41, 0x06 }, - /* e1b */ { 0x41, 0x06 }, - /* e1c */ { 0x41, 0x06 }, - /* e1d */ { 0x41, 0x06 }, - /* e1e */ { 0x41, 0x06 }, - /* e1f */ { 0x41, 0x06 }, - /* e20 */ { 0x41, 0x06 }, - /* e21 */ { 0x41, 0x06 }, - /* e22 */ { 0x41, 0x06 }, - /* e23 */ { 0x41, 0x06 }, - /* e24 */ { 0x41, 0x06 }, - /* e25 */ { 0x41, 0x06 }, - /* e26 */ { 0x41, 0x06 }, - /* e27 */ { 0x41, 0x06 }, - /* e28 */ { 0x41, 0x06 }, - /* e29 */ { 0x41, 0x06 }, - /* e2a */ { 0x41, 0x06 }, - /* e2b */ { 0x41, 0x06 }, - /* e2c */ { 0x41, 0x06 }, - /* e2d */ { 0x41, 0x06 }, - /* e2e */ { 0x41, 0x06 }, - /* e2f */ { 0x41, 0x06 }, - /* e30 */ { 0x41, 0x06 }, - /* e31 */ { 0x41, 0x06 }, - /* e32 */ { 0x41, 0x06 }, - /* e33 */ { 0x41, 0x06 }, - /* e34 */ { 0x41, 0x06 }, - /* e35 */ { 0x41, 0x06 }, - /* e36 */ { 0x41, 0x06 }, - /* e37 */ { 0x41, 0x06 }, - /* e38 */ { 0x41, 0x06 }, - /* e39 */ { 0x41, 0x06 }, - /* e3a */ { 0x41, 0x06 }, - /* e3b */ { 0x41, 0x06 }, - /* e3c */ { 0x41, 0x06 }, - /* e3d */ { 0x41, 0x06 }, - /* e3e */ { 0x41, 0x06 }, - /* e3f */ { 0x41, 0x06 }, - /* e40 */ { 0x51, 0x06 }, - /* e41 */ { 0x51, 0x06 }, - /* e42 */ { 0x51, 0x06 }, - /* e43 */ { 0x51, 0x06 }, - /* e44 */ { 0x51, 0x06 }, - /* e45 */ { 0x51, 0x06 }, - /* e46 */ { 0x51, 0x06 }, - /* e47 */ { 0x51, 0x06 }, - /* e48 */ { 0x51, 0x06 }, - /* e49 */ { 0x51, 0x06 }, - /* e4a */ { 0x51, 0x06 }, - /* e4b */ { 0x51, 0x06 }, - /* e4c */ { 0x51, 0x06 }, - /* e4d */ { 0x51, 0x06 }, - /* e4e */ { 0x51, 0x06 }, - /* e4f */ { 0x51, 0x06 }, - /* e50 */ { 0x51, 0x06 }, - /* e51 */ { 0x51, 0x06 }, - /* e52 */ { 0x51, 0x06 }, - /* e53 */ { 0x51, 0x06 }, - /* e54 */ { 0x51, 0x06 }, - /* e55 */ { 0x51, 0x06 }, - /* e56 */ { 0x51, 0x06 }, - /* e57 */ { 0x51, 0x06 }, - /* e58 */ { 0x51, 0x06 }, - /* e59 */ { 0x51, 0x06 }, - /* e5a */ { 0x51, 0x06 }, - /* e5b */ { 0x51, 0x06 }, - /* e5c */ { 0x51, 0x06 }, - /* e5d */ { 0x51, 0x06 }, - /* e5e */ { 0x51, 0x06 }, - /* e5f */ { 0x51, 0x06 }, - /* e60 */ { 0x51, 0x06 }, - /* e61 */ { 0x51, 0x06 }, - /* e62 */ { 0x51, 0x06 }, - /* e63 */ { 0x51, 0x06 }, - /* e64 */ { 0x51, 0x06 }, - /* e65 */ { 0x51, 0x06 }, - /* e66 */ { 0x51, 0x06 }, - /* e67 */ { 0x51, 0x06 }, - /* e68 */ { 0x51, 0x06 }, - /* e69 */ { 0x51, 0x06 }, - /* e6a */ { 0x51, 0x06 }, - /* e6b */ { 0x51, 0x06 }, - /* e6c */ { 0x51, 0x06 }, - /* e6d */ { 0x51, 0x06 }, - /* e6e */ { 0x51, 0x06 }, - /* e6f */ { 0x51, 0x06 }, - /* e70 */ { 0x51, 0x06 }, - /* e71 */ { 0x51, 0x06 }, - /* e72 */ { 0x51, 0x06 }, - /* e73 */ { 0x51, 0x06 }, - /* e74 */ { 0x51, 0x06 }, - /* e75 */ { 0x51, 0x06 }, - /* e76 */ { 0x51, 0x06 }, - /* e77 */ { 0x51, 0x06 }, - /* e78 */ { 0x51, 0x06 }, - /* e79 */ { 0x51, 0x06 }, - /* e7a */ { 0x51, 0x06 }, - /* e7b */ { 0x51, 0x06 }, - /* e7c */ { 0x51, 0x06 }, - /* e7d */ { 0x51, 0x06 }, - /* e7e */ { 0x51, 0x06 }, - /* e7f */ { 0x51, 0x06 }, - /* e80 */ { 0x13, 0x07 }, - /* e81 */ { 0x13, 0x07 }, - /* e82 */ { 0x13, 0x07 }, - /* e83 */ { 0x13, 0x07 }, - /* e84 */ { 0x13, 0x07 }, - /* e85 */ { 0x13, 0x07 }, - /* e86 */ { 0x13, 0x07 }, - /* e87 */ { 0x13, 0x07 }, - /* e88 */ { 0x13, 0x07 }, - /* e89 */ { 0x13, 0x07 }, - /* e8a */ { 0x13, 0x07 }, - /* e8b */ { 0x13, 0x07 }, - /* e8c */ { 0x13, 0x07 }, - /* e8d */ { 0x13, 0x07 }, - /* e8e */ { 0x13, 0x07 }, - /* e8f */ { 0x13, 0x07 }, - /* e90 */ { 0x13, 0x07 }, - /* e91 */ { 0x13, 0x07 }, - /* e92 */ { 0x13, 0x07 }, - /* e93 */ { 0x13, 0x07 }, - /* e94 */ { 0x13, 0x07 }, - /* e95 */ { 0x13, 0x07 }, - /* e96 */ { 0x13, 0x07 }, - /* e97 */ { 0x13, 0x07 }, - /* e98 */ { 0x13, 0x07 }, - /* e99 */ { 0x13, 0x07 }, - /* e9a */ { 0x13, 0x07 }, - /* e9b */ { 0x13, 0x07 }, - /* e9c */ { 0x13, 0x07 }, - /* e9d */ { 0x13, 0x07 }, - /* e9e */ { 0x13, 0x07 }, - /* e9f */ { 0x13, 0x07 }, - /* ea0 */ { 0x22, 0x07 }, - /* ea1 */ { 0x22, 0x07 }, - /* ea2 */ { 0x22, 0x07 }, - /* ea3 */ { 0x22, 0x07 }, - /* ea4 */ { 0x22, 0x07 }, - /* ea5 */ { 0x22, 0x07 }, - /* ea6 */ { 0x22, 0x07 }, - /* ea7 */ { 0x22, 0x07 }, - /* ea8 */ { 0x22, 0x07 }, - /* ea9 */ { 0x22, 0x07 }, - /* eaa */ { 0x22, 0x07 }, - /* eab */ { 0x22, 0x07 }, - /* eac */ { 0x22, 0x07 }, - /* ead */ { 0x22, 0x07 }, - /* eae */ { 0x22, 0x07 }, - /* eaf */ { 0x22, 0x07 }, - /* eb0 */ { 0x22, 0x07 }, - /* eb1 */ { 0x22, 0x07 }, - /* eb2 */ { 0x22, 0x07 }, - /* eb3 */ { 0x22, 0x07 }, - /* eb4 */ { 0x22, 0x07 }, - /* eb5 */ { 0x22, 0x07 }, - /* eb6 */ { 0x22, 0x07 }, - /* eb7 */ { 0x22, 0x07 }, - /* eb8 */ { 0x22, 0x07 }, - /* eb9 */ { 0x22, 0x07 }, - /* eba */ { 0x22, 0x07 }, - /* ebb */ { 0x22, 0x07 }, - /* ebc */ { 0x22, 0x07 }, - /* ebd */ { 0x22, 0x07 }, - /* ebe */ { 0x22, 0x07 }, - /* ebf */ { 0x22, 0x07 }, - /* ec0 */ { 0x61, 0x07 }, - /* ec1 */ { 0x61, 0x07 }, - /* ec2 */ { 0x61, 0x07 }, - /* ec3 */ { 0x61, 0x07 }, - /* ec4 */ { 0x61, 0x07 }, - /* ec5 */ { 0x61, 0x07 }, - /* ec6 */ { 0x61, 0x07 }, - /* ec7 */ { 0x61, 0x07 }, - /* ec8 */ { 0x61, 0x07 }, - /* ec9 */ { 0x61, 0x07 }, - /* eca */ { 0x61, 0x07 }, - /* ecb */ { 0x61, 0x07 }, - /* ecc */ { 0x61, 0x07 }, - /* ecd */ { 0x61, 0x07 }, - /* ece */ { 0x61, 0x07 }, - /* ecf */ { 0x61, 0x07 }, - /* ed0 */ { 0x61, 0x07 }, - /* ed1 */ { 0x61, 0x07 }, - /* ed2 */ { 0x61, 0x07 }, - /* ed3 */ { 0x61, 0x07 }, - /* ed4 */ { 0x61, 0x07 }, - /* ed5 */ { 0x61, 0x07 }, - /* ed6 */ { 0x61, 0x07 }, - /* ed7 */ { 0x61, 0x07 }, - /* ed8 */ { 0x61, 0x07 }, - /* ed9 */ { 0x61, 0x07 }, - /* eda */ { 0x61, 0x07 }, - /* edb */ { 0x61, 0x07 }, - /* edc */ { 0x61, 0x07 }, - /* edd */ { 0x61, 0x07 }, - /* ede */ { 0x61, 0x07 }, - /* edf */ { 0x61, 0x07 }, - /* ee0 */ { 0x07, 0x09 }, - /* ee1 */ { 0x07, 0x09 }, - /* ee2 */ { 0x07, 0x09 }, - /* ee3 */ { 0x07, 0x09 }, - /* ee4 */ { 0x07, 0x09 }, - /* ee5 */ { 0x07, 0x09 }, - /* ee6 */ { 0x07, 0x09 }, - /* ee7 */ { 0x07, 0x09 }, - /* ee8 */ { 0x71, 0x09 }, - /* ee9 */ { 0x71, 0x09 }, - /* eea */ { 0x71, 0x09 }, - /* eeb */ { 0x71, 0x09 }, - /* eec */ { 0x71, 0x09 }, - /* eed */ { 0x71, 0x09 }, - /* eee */ { 0x71, 0x09 }, - /* eef */ { 0x71, 0x09 }, - /* ef0 */ { 0x09, 0x0b }, - /* ef1 */ { 0x09, 0x0b }, - /* ef2 */ { 0x19, 0x0b }, - /* ef3 */ { 0x19, 0x0b }, - /* ef4 */ { 0x29, 0x0b }, - /* ef5 */ { 0x29, 0x0b }, - /* ef6 */ { 0x39, 0x0b }, - /* ef7 */ { 0x39, 0x0b }, - /* ef8 */ { 0x49, 0x0b }, - /* ef9 */ { 0x49, 0x0b }, - /* efa */ { 0x59, 0x0b }, - /* efb */ { 0x59, 0x0b }, - /* efc */ { 0x69, 0x0b }, - /* efd */ { 0x69, 0x0b }, - /* efe */ { 0x79, 0x0b }, - /* eff */ { 0x79, 0x0b }, - /* f00 */ { 0x89, 0x0b }, - /* f01 */ { 0x89, 0x0b }, - /* f02 */ { 0x99, 0x0b }, - /* f03 */ { 0x99, 0x0b }, - /* f04 */ { 0xa9, 0x0b }, - /* f05 */ { 0xa9, 0x0b }, - /* f06 */ { 0xb9, 0x0b }, - /* f07 */ { 0xb9, 0x0b }, - /* f08 */ { 0xc9, 0x0b }, - /* f09 */ { 0xc9, 0x0b }, - /* f0a */ { 0xd9, 0x0b }, - /* f0b */ { 0xd9, 0x0b }, - /* f0c */ { 0xe9, 0x0b }, - /* f0d */ { 0xe9, 0x0b }, - /* f0e */ { 0xf9, 0x0b }, - /* f0f */ { 0xf9, 0x0b }, - /* f10 */ { 0x08, 0x0c }, - /* f11 */ { 0x14, 0x0c }, - /* f12 */ { 0x15, 0x0c }, - /* f13 */ { 0x16, 0x0c }, - /* f14 */ { 0x17, 0x0c }, - /* f15 */ { 0x18, 0x0c }, - /* f16 */ { 0x23, 0x0c }, - /* f17 */ { 0x24, 0x0c }, - /* f18 */ { 0x25, 0x0c }, - /* f19 */ { 0x26, 0x0c }, - /* f1a */ { 0x27, 0x0c }, - /* f1b */ { 0x28, 0x0c }, - /* f1c */ { 0x32, 0x0c }, - /* f1d */ { 0x33, 0x0c }, - /* f1e */ { 0x34, 0x0c }, - /* f1f */ { 0x35, 0x0c }, - /* f20 */ { 0x36, 0x0c }, - /* f21 */ { 0x37, 0x0c }, - /* f22 */ { 0x38, 0x0c }, - /* f23 */ { 0x42, 0x0c }, - /* f24 */ { 0x43, 0x0c }, - /* f25 */ { 0x44, 0x0c }, - /* f26 */ { 0x45, 0x0c }, - /* f27 */ { 0x46, 0x0c }, - /* f28 */ { 0x47, 0x0c }, - /* f29 */ { 0x48, 0x0c }, - /* f2a */ { 0x52, 0x0c }, - /* f2b */ { 0x53, 0x0c }, - /* f2c */ { 0x54, 0x0c }, - /* f2d */ { 0x55, 0x0c }, - /* f2e */ { 0x56, 0x0c }, - /* f2f */ { 0x57, 0x0c }, - /* f30 */ { 0x58, 0x0c }, - /* f31 */ { 0x62, 0x0c }, - /* f32 */ { 0x63, 0x0c }, - /* f33 */ { 0x64, 0x0c }, - /* f34 */ { 0x65, 0x0c }, - /* f35 */ { 0x66, 0x0c }, - /* f36 */ { 0x67, 0x0c }, - /* f37 */ { 0x68, 0x0c }, - /* f38 */ { 0x72, 0x0c }, - /* f39 */ { 0x73, 0x0c }, - /* f3a */ { 0x74, 0x0c }, - /* f3b */ { 0x75, 0x0c }, - /* f3c */ { 0x76, 0x0c }, - /* f3d */ { 0x77, 0x0c }, - /* f3e */ { 0x78, 0x0c }, - /* f3f */ { 0x81, 0x0c }, - /* f40 */ { 0x82, 0x0c }, - /* f41 */ { 0x83, 0x0c }, - /* f42 */ { 0x84, 0x0c }, - /* f43 */ { 0x85, 0x0c }, - /* f44 */ { 0x86, 0x0c }, - /* f45 */ { 0x87, 0x0c }, - /* f46 */ { 0x88, 0x0c }, - /* f47 */ { 0x91, 0x0c }, - /* f48 */ { 0x92, 0x0c }, - /* f49 */ { 0x93, 0x0c }, - /* f4a */ { 0x94, 0x0c }, - /* f4b */ { 0x95, 0x0c }, - /* f4c */ { 0x96, 0x0c }, - /* f4d */ { 0x97, 0x0c }, - /* f4e */ { 0x98, 0x0c }, - /* f4f */ { 0xa1, 0x0c }, - /* f50 */ { 0xa2, 0x0c }, - /* f51 */ { 0xa3, 0x0c }, - /* f52 */ { 0xa4, 0x0c }, - /* f53 */ { 0xa5, 0x0c }, - /* f54 */ { 0xa6, 0x0c }, - /* f55 */ { 0xa7, 0x0c }, - /* f56 */ { 0xa8, 0x0c }, - /* f57 */ { 0xb1, 0x0c }, - /* f58 */ { 0xb2, 0x0c }, - /* f59 */ { 0xb3, 0x0c }, - /* f5a */ { 0xb4, 0x0c }, - /* f5b */ { 0xb5, 0x0c }, - /* f5c */ { 0xb6, 0x0c }, - /* f5d */ { 0xb7, 0x0c }, - /* f5e */ { 0xb8, 0x0c }, - /* f5f */ { 0xc1, 0x0c }, - /* f60 */ { 0xc2, 0x0c }, - /* f61 */ { 0xc3, 0x0c }, - /* f62 */ { 0xc4, 0x0c }, - /* f63 */ { 0xc5, 0x0c }, - /* f64 */ { 0xc6, 0x0c }, - /* f65 */ { 0xc7, 0x0c }, - /* f66 */ { 0xc8, 0x0c }, - /* f67 */ { 0xd1, 0x0c }, - /* f68 */ { 0xd2, 0x0c }, - /* f69 */ { 0xd3, 0x0c }, - /* f6a */ { 0xd4, 0x0c }, - /* f6b */ { 0xd5, 0x0c }, - /* f6c */ { 0xd6, 0x0c }, - /* f6d */ { 0xd7, 0x0c }, - /* f6e */ { 0xd8, 0x0c }, - /* f6f */ { 0xe1, 0x0c }, - /* f70 */ { 0xe2, 0x0c }, - /* f71 */ { 0xe3, 0x0c }, - /* f72 */ { 0xe4, 0x0c }, - /* f73 */ { 0xe5, 0x0c }, - /* f74 */ { 0xe6, 0x0c }, - /* f75 */ { 0xe7, 0x0c }, - /* f76 */ { 0xe8, 0x0c }, - /* f77 */ { 0xf1, 0x0c }, - /* f78 */ { 0xf2, 0x0c }, - /* f79 */ { 0xf3, 0x0c }, - /* f7a */ { 0xf4, 0x0c }, - /* f7b */ { 0xf5, 0x0c }, - /* f7c */ { 0xf6, 0x0c }, - /* f7d */ { 0xf7, 0x0c }, - /* f7e */ { 0xf8, 0x0c }, - /* f7f */ { 0x10, 0x0c }, - /* f80 */ { 0x00, 0x05 }, - /* f81 */ { 0x00, 0x05 }, - /* f82 */ { 0x00, 0x05 }, - /* f83 */ { 0x00, 0x05 }, - /* f84 */ { 0x00, 0x05 }, - /* f85 */ { 0x00, 0x05 }, - /* f86 */ { 0x00, 0x05 }, - /* f87 */ { 0x00, 0x05 }, - /* f88 */ { 0x00, 0x05 }, - /* f89 */ { 0x00, 0x05 }, - /* f8a */ { 0x00, 0x05 }, - /* f8b */ { 0x00, 0x05 }, - /* f8c */ { 0x00, 0x05 }, - /* f8d */ { 0x00, 0x05 }, - /* f8e */ { 0x00, 0x05 }, - /* f8f */ { 0x00, 0x05 }, - /* f90 */ { 0x00, 0x05 }, - /* f91 */ { 0x00, 0x05 }, - /* f92 */ { 0x00, 0x05 }, - /* f93 */ { 0x00, 0x05 }, - /* f94 */ { 0x00, 0x05 }, - /* f95 */ { 0x00, 0x05 }, - /* f96 */ { 0x00, 0x05 }, - /* f97 */ { 0x00, 0x05 }, - /* f98 */ { 0x00, 0x05 }, - /* f99 */ { 0x00, 0x05 }, - /* f9a */ { 0x00, 0x05 }, - /* f9b */ { 0x00, 0x05 }, - /* f9c */ { 0x00, 0x05 }, - /* f9d */ { 0x00, 0x05 }, - /* f9e */ { 0x00, 0x05 }, - /* f9f */ { 0x00, 0x05 }, - /* fa0 */ { 0x00, 0x05 }, - /* fa1 */ { 0x00, 0x05 }, - /* fa2 */ { 0x00, 0x05 }, - /* fa3 */ { 0x00, 0x05 }, - /* fa4 */ { 0x00, 0x05 }, - /* fa5 */ { 0x00, 0x05 }, - /* fa6 */ { 0x00, 0x05 }, - /* fa7 */ { 0x00, 0x05 }, - /* fa8 */ { 0x00, 0x05 }, - /* fa9 */ { 0x00, 0x05 }, - /* faa */ { 0x00, 0x05 }, - /* fab */ { 0x00, 0x05 }, - /* fac */ { 0x00, 0x05 }, - /* fad */ { 0x00, 0x05 }, - /* fae */ { 0x00, 0x05 }, - /* faf */ { 0x00, 0x05 }, - /* fb0 */ { 0x00, 0x05 }, - /* fb1 */ { 0x00, 0x05 }, - /* fb2 */ { 0x00, 0x05 }, - /* fb3 */ { 0x00, 0x05 }, - /* fb4 */ { 0x00, 0x05 }, - /* fb5 */ { 0x00, 0x05 }, - /* fb6 */ { 0x00, 0x05 }, - /* fb7 */ { 0x00, 0x05 }, - /* fb8 */ { 0x00, 0x05 }, - /* fb9 */ { 0x00, 0x05 }, - /* fba */ { 0x00, 0x05 }, - /* fbb */ { 0x00, 0x05 }, - /* fbc */ { 0x00, 0x05 }, - /* fbd */ { 0x00, 0x05 }, - /* fbe */ { 0x00, 0x05 }, - /* fbf */ { 0x00, 0x05 }, - /* fc0 */ { 0x00, 0x05 }, - /* fc1 */ { 0x00, 0x05 }, - /* fc2 */ { 0x00, 0x05 }, - /* fc3 */ { 0x00, 0x05 }, - /* fc4 */ { 0x00, 0x05 }, - /* fc5 */ { 0x00, 0x05 }, - /* fc6 */ { 0x00, 0x05 }, - /* fc7 */ { 0x00, 0x05 }, - /* fc8 */ { 0x00, 0x05 }, - /* fc9 */ { 0x00, 0x05 }, - /* fca */ { 0x00, 0x05 }, - /* fcb */ { 0x00, 0x05 }, - /* fcc */ { 0x00, 0x05 }, - /* fcd */ { 0x00, 0x05 }, - /* fce */ { 0x00, 0x05 }, - /* fcf */ { 0x00, 0x05 }, - /* fd0 */ { 0x00, 0x05 }, - /* fd1 */ { 0x00, 0x05 }, - /* fd2 */ { 0x00, 0x05 }, - /* fd3 */ { 0x00, 0x05 }, - /* fd4 */ { 0x00, 0x05 }, - /* fd5 */ { 0x00, 0x05 }, - /* fd6 */ { 0x00, 0x05 }, - /* fd7 */ { 0x00, 0x05 }, - /* fd8 */ { 0x00, 0x05 }, - /* fd9 */ { 0x00, 0x05 }, - /* fda */ { 0x00, 0x05 }, - /* fdb */ { 0x00, 0x05 }, - /* fdc */ { 0x00, 0x05 }, - /* fdd */ { 0x00, 0x05 }, - /* fde */ { 0x00, 0x05 }, - /* fdf */ { 0x00, 0x05 }, - /* fe0 */ { 0x00, 0x05 }, - /* fe1 */ { 0x00, 0x05 }, - /* fe2 */ { 0x00, 0x05 }, - /* fe3 */ { 0x00, 0x05 }, - /* fe4 */ { 0x00, 0x05 }, - /* fe5 */ { 0x00, 0x05 }, - /* fe6 */ { 0x00, 0x05 }, - /* fe7 */ { 0x00, 0x05 }, - /* fe8 */ { 0x00, 0x05 }, - /* fe9 */ { 0x00, 0x05 }, - /* fea */ { 0x00, 0x05 }, - /* feb */ { 0x00, 0x05 }, - /* fec */ { 0x00, 0x05 }, - /* fed */ { 0x00, 0x05 }, - /* fee */ { 0x00, 0x05 }, - /* fef */ { 0x00, 0x05 }, - /* ff0 */ { 0x00, 0x05 }, - /* ff1 */ { 0x00, 0x05 }, - /* ff2 */ { 0x00, 0x05 }, - /* ff3 */ { 0x00, 0x05 }, - /* ff4 */ { 0x00, 0x05 }, - /* ff5 */ { 0x00, 0x05 }, - /* ff6 */ { 0x00, 0x05 }, - /* ff7 */ { 0x00, 0x05 }, - /* ff8 */ { 0x00, 0x05 }, - /* ff9 */ { 0x00, 0x05 }, - /* ffa */ { 0x00, 0x05 }, - /* ffb */ { 0x00, 0x05 }, - /* ffc */ { 0x00, 0x05 }, - /* ffd */ { 0x00, 0x05 }, - /* ffe */ { 0x00, 0x05 }, - /* fff */ { 0x00, 0x05 }, diff --git a/waterbox/pcfx/rainbow_dcuv.inc b/waterbox/pcfx/rainbow_dcuv.inc deleted file mode 100644 index dc9a92477e..0000000000 --- a/waterbox/pcfx/rainbow_dcuv.inc +++ /dev/null @@ -1,256 +0,0 @@ - /* 00 */ { 0x00, 0x02 }, - /* 01 */ { 0x00, 0x02 }, - /* 02 */ { 0x00, 0x02 }, - /* 03 */ { 0x00, 0x02 }, - /* 04 */ { 0x00, 0x02 }, - /* 05 */ { 0x00, 0x02 }, - /* 06 */ { 0x00, 0x02 }, - /* 07 */ { 0x00, 0x02 }, - /* 08 */ { 0x00, 0x02 }, - /* 09 */ { 0x00, 0x02 }, - /* 0a */ { 0x00, 0x02 }, - /* 0b */ { 0x00, 0x02 }, - /* 0c */ { 0x00, 0x02 }, - /* 0d */ { 0x00, 0x02 }, - /* 0e */ { 0x00, 0x02 }, - /* 0f */ { 0x00, 0x02 }, - /* 10 */ { 0x00, 0x02 }, - /* 11 */ { 0x00, 0x02 }, - /* 12 */ { 0x00, 0x02 }, - /* 13 */ { 0x00, 0x02 }, - /* 14 */ { 0x00, 0x02 }, - /* 15 */ { 0x00, 0x02 }, - /* 16 */ { 0x00, 0x02 }, - /* 17 */ { 0x00, 0x02 }, - /* 18 */ { 0x00, 0x02 }, - /* 19 */ { 0x00, 0x02 }, - /* 1a */ { 0x00, 0x02 }, - /* 1b */ { 0x00, 0x02 }, - /* 1c */ { 0x00, 0x02 }, - /* 1d */ { 0x00, 0x02 }, - /* 1e */ { 0x00, 0x02 }, - /* 1f */ { 0x00, 0x02 }, - /* 20 */ { 0x00, 0x02 }, - /* 21 */ { 0x00, 0x02 }, - /* 22 */ { 0x00, 0x02 }, - /* 23 */ { 0x00, 0x02 }, - /* 24 */ { 0x00, 0x02 }, - /* 25 */ { 0x00, 0x02 }, - /* 26 */ { 0x00, 0x02 }, - /* 27 */ { 0x00, 0x02 }, - /* 28 */ { 0x00, 0x02 }, - /* 29 */ { 0x00, 0x02 }, - /* 2a */ { 0x00, 0x02 }, - /* 2b */ { 0x00, 0x02 }, - /* 2c */ { 0x00, 0x02 }, - /* 2d */ { 0x00, 0x02 }, - /* 2e */ { 0x00, 0x02 }, - /* 2f */ { 0x00, 0x02 }, - /* 30 */ { 0x00, 0x02 }, - /* 31 */ { 0x00, 0x02 }, - /* 32 */ { 0x00, 0x02 }, - /* 33 */ { 0x00, 0x02 }, - /* 34 */ { 0x00, 0x02 }, - /* 35 */ { 0x00, 0x02 }, - /* 36 */ { 0x00, 0x02 }, - /* 37 */ { 0x00, 0x02 }, - /* 38 */ { 0x00, 0x02 }, - /* 39 */ { 0x00, 0x02 }, - /* 3a */ { 0x00, 0x02 }, - /* 3b */ { 0x00, 0x02 }, - /* 3c */ { 0x00, 0x02 }, - /* 3d */ { 0x00, 0x02 }, - /* 3e */ { 0x00, 0x02 }, - /* 3f */ { 0x00, 0x02 }, - /* 40 */ { 0x01, 0x02 }, - /* 41 */ { 0x01, 0x02 }, - /* 42 */ { 0x01, 0x02 }, - /* 43 */ { 0x01, 0x02 }, - /* 44 */ { 0x01, 0x02 }, - /* 45 */ { 0x01, 0x02 }, - /* 46 */ { 0x01, 0x02 }, - /* 47 */ { 0x01, 0x02 }, - /* 48 */ { 0x01, 0x02 }, - /* 49 */ { 0x01, 0x02 }, - /* 4a */ { 0x01, 0x02 }, - /* 4b */ { 0x01, 0x02 }, - /* 4c */ { 0x01, 0x02 }, - /* 4d */ { 0x01, 0x02 }, - /* 4e */ { 0x01, 0x02 }, - /* 4f */ { 0x01, 0x02 }, - /* 50 */ { 0x01, 0x02 }, - /* 51 */ { 0x01, 0x02 }, - /* 52 */ { 0x01, 0x02 }, - /* 53 */ { 0x01, 0x02 }, - /* 54 */ { 0x01, 0x02 }, - /* 55 */ { 0x01, 0x02 }, - /* 56 */ { 0x01, 0x02 }, - /* 57 */ { 0x01, 0x02 }, - /* 58 */ { 0x01, 0x02 }, - /* 59 */ { 0x01, 0x02 }, - /* 5a */ { 0x01, 0x02 }, - /* 5b */ { 0x01, 0x02 }, - /* 5c */ { 0x01, 0x02 }, - /* 5d */ { 0x01, 0x02 }, - /* 5e */ { 0x01, 0x02 }, - /* 5f */ { 0x01, 0x02 }, - /* 60 */ { 0x01, 0x02 }, - /* 61 */ { 0x01, 0x02 }, - /* 62 */ { 0x01, 0x02 }, - /* 63 */ { 0x01, 0x02 }, - /* 64 */ { 0x01, 0x02 }, - /* 65 */ { 0x01, 0x02 }, - /* 66 */ { 0x01, 0x02 }, - /* 67 */ { 0x01, 0x02 }, - /* 68 */ { 0x01, 0x02 }, - /* 69 */ { 0x01, 0x02 }, - /* 6a */ { 0x01, 0x02 }, - /* 6b */ { 0x01, 0x02 }, - /* 6c */ { 0x01, 0x02 }, - /* 6d */ { 0x01, 0x02 }, - /* 6e */ { 0x01, 0x02 }, - /* 6f */ { 0x01, 0x02 }, - /* 70 */ { 0x01, 0x02 }, - /* 71 */ { 0x01, 0x02 }, - /* 72 */ { 0x01, 0x02 }, - /* 73 */ { 0x01, 0x02 }, - /* 74 */ { 0x01, 0x02 }, - /* 75 */ { 0x01, 0x02 }, - /* 76 */ { 0x01, 0x02 }, - /* 77 */ { 0x01, 0x02 }, - /* 78 */ { 0x01, 0x02 }, - /* 79 */ { 0x01, 0x02 }, - /* 7a */ { 0x01, 0x02 }, - /* 7b */ { 0x01, 0x02 }, - /* 7c */ { 0x01, 0x02 }, - /* 7d */ { 0x01, 0x02 }, - /* 7e */ { 0x01, 0x02 }, - /* 7f */ { 0x01, 0x02 }, - /* 80 */ { 0x02, 0x02 }, - /* 81 */ { 0x02, 0x02 }, - /* 82 */ { 0x02, 0x02 }, - /* 83 */ { 0x02, 0x02 }, - /* 84 */ { 0x02, 0x02 }, - /* 85 */ { 0x02, 0x02 }, - /* 86 */ { 0x02, 0x02 }, - /* 87 */ { 0x02, 0x02 }, - /* 88 */ { 0x02, 0x02 }, - /* 89 */ { 0x02, 0x02 }, - /* 8a */ { 0x02, 0x02 }, - /* 8b */ { 0x02, 0x02 }, - /* 8c */ { 0x02, 0x02 }, - /* 8d */ { 0x02, 0x02 }, - /* 8e */ { 0x02, 0x02 }, - /* 8f */ { 0x02, 0x02 }, - /* 90 */ { 0x02, 0x02 }, - /* 91 */ { 0x02, 0x02 }, - /* 92 */ { 0x02, 0x02 }, - /* 93 */ { 0x02, 0x02 }, - /* 94 */ { 0x02, 0x02 }, - /* 95 */ { 0x02, 0x02 }, - /* 96 */ { 0x02, 0x02 }, - /* 97 */ { 0x02, 0x02 }, - /* 98 */ { 0x02, 0x02 }, - /* 99 */ { 0x02, 0x02 }, - /* 9a */ { 0x02, 0x02 }, - /* 9b */ { 0x02, 0x02 }, - /* 9c */ { 0x02, 0x02 }, - /* 9d */ { 0x02, 0x02 }, - /* 9e */ { 0x02, 0x02 }, - /* 9f */ { 0x02, 0x02 }, - /* a0 */ { 0x02, 0x02 }, - /* a1 */ { 0x02, 0x02 }, - /* a2 */ { 0x02, 0x02 }, - /* a3 */ { 0x02, 0x02 }, - /* a4 */ { 0x02, 0x02 }, - /* a5 */ { 0x02, 0x02 }, - /* a6 */ { 0x02, 0x02 }, - /* a7 */ { 0x02, 0x02 }, - /* a8 */ { 0x02, 0x02 }, - /* a9 */ { 0x02, 0x02 }, - /* aa */ { 0x02, 0x02 }, - /* ab */ { 0x02, 0x02 }, - /* ac */ { 0x02, 0x02 }, - /* ad */ { 0x02, 0x02 }, - /* ae */ { 0x02, 0x02 }, - /* af */ { 0x02, 0x02 }, - /* b0 */ { 0x02, 0x02 }, - /* b1 */ { 0x02, 0x02 }, - /* b2 */ { 0x02, 0x02 }, - /* b3 */ { 0x02, 0x02 }, - /* b4 */ { 0x02, 0x02 }, - /* b5 */ { 0x02, 0x02 }, - /* b6 */ { 0x02, 0x02 }, - /* b7 */ { 0x02, 0x02 }, - /* b8 */ { 0x02, 0x02 }, - /* b9 */ { 0x02, 0x02 }, - /* ba */ { 0x02, 0x02 }, - /* bb */ { 0x02, 0x02 }, - /* bc */ { 0x02, 0x02 }, - /* bd */ { 0x02, 0x02 }, - /* be */ { 0x02, 0x02 }, - /* bf */ { 0x02, 0x02 }, - /* c0 */ { 0x03, 0x03 }, - /* c1 */ { 0x03, 0x03 }, - /* c2 */ { 0x03, 0x03 }, - /* c3 */ { 0x03, 0x03 }, - /* c4 */ { 0x03, 0x03 }, - /* c5 */ { 0x03, 0x03 }, - /* c6 */ { 0x03, 0x03 }, - /* c7 */ { 0x03, 0x03 }, - /* c8 */ { 0x03, 0x03 }, - /* c9 */ { 0x03, 0x03 }, - /* ca */ { 0x03, 0x03 }, - /* cb */ { 0x03, 0x03 }, - /* cc */ { 0x03, 0x03 }, - /* cd */ { 0x03, 0x03 }, - /* ce */ { 0x03, 0x03 }, - /* cf */ { 0x03, 0x03 }, - /* d0 */ { 0x03, 0x03 }, - /* d1 */ { 0x03, 0x03 }, - /* d2 */ { 0x03, 0x03 }, - /* d3 */ { 0x03, 0x03 }, - /* d4 */ { 0x03, 0x03 }, - /* d5 */ { 0x03, 0x03 }, - /* d6 */ { 0x03, 0x03 }, - /* d7 */ { 0x03, 0x03 }, - /* d8 */ { 0x03, 0x03 }, - /* d9 */ { 0x03, 0x03 }, - /* da */ { 0x03, 0x03 }, - /* db */ { 0x03, 0x03 }, - /* dc */ { 0x03, 0x03 }, - /* dd */ { 0x03, 0x03 }, - /* de */ { 0x03, 0x03 }, - /* df */ { 0x03, 0x03 }, - /* e0 */ { 0x04, 0x04 }, - /* e1 */ { 0x04, 0x04 }, - /* e2 */ { 0x04, 0x04 }, - /* e3 */ { 0x04, 0x04 }, - /* e4 */ { 0x04, 0x04 }, - /* e5 */ { 0x04, 0x04 }, - /* e6 */ { 0x04, 0x04 }, - /* e7 */ { 0x04, 0x04 }, - /* e8 */ { 0x04, 0x04 }, - /* e9 */ { 0x04, 0x04 }, - /* ea */ { 0x04, 0x04 }, - /* eb */ { 0x04, 0x04 }, - /* ec */ { 0x04, 0x04 }, - /* ed */ { 0x04, 0x04 }, - /* ee */ { 0x04, 0x04 }, - /* ef */ { 0x04, 0x04 }, - /* f0 */ { 0x05, 0x05 }, - /* f1 */ { 0x05, 0x05 }, - /* f2 */ { 0x05, 0x05 }, - /* f3 */ { 0x05, 0x05 }, - /* f4 */ { 0x05, 0x05 }, - /* f5 */ { 0x05, 0x05 }, - /* f6 */ { 0x05, 0x05 }, - /* f7 */ { 0x05, 0x05 }, - /* f8 */ { 0x06, 0x06 }, - /* f9 */ { 0x06, 0x06 }, - /* fa */ { 0x06, 0x06 }, - /* fb */ { 0x06, 0x06 }, - /* fc */ { 0x07, 0x07 }, - /* fd */ { 0x07, 0x07 }, - /* fe */ { 0x08, 0x08 }, - /* ff */ { 0x09, 0x08 }, diff --git a/waterbox/pcfx/rainbow_dcy.inc b/waterbox/pcfx/rainbow_dcy.inc deleted file mode 100644 index 8f4c9fc244..0000000000 --- a/waterbox/pcfx/rainbow_dcy.inc +++ /dev/null @@ -1,512 +0,0 @@ - /* 000 */ { 0x00, 0x03 }, - /* 001 */ { 0x00, 0x03 }, - /* 002 */ { 0x00, 0x03 }, - /* 003 */ { 0x00, 0x03 }, - /* 004 */ { 0x00, 0x03 }, - /* 005 */ { 0x00, 0x03 }, - /* 006 */ { 0x00, 0x03 }, - /* 007 */ { 0x00, 0x03 }, - /* 008 */ { 0x00, 0x03 }, - /* 009 */ { 0x00, 0x03 }, - /* 00a */ { 0x00, 0x03 }, - /* 00b */ { 0x00, 0x03 }, - /* 00c */ { 0x00, 0x03 }, - /* 00d */ { 0x00, 0x03 }, - /* 00e */ { 0x00, 0x03 }, - /* 00f */ { 0x00, 0x03 }, - /* 010 */ { 0x00, 0x03 }, - /* 011 */ { 0x00, 0x03 }, - /* 012 */ { 0x00, 0x03 }, - /* 013 */ { 0x00, 0x03 }, - /* 014 */ { 0x00, 0x03 }, - /* 015 */ { 0x00, 0x03 }, - /* 016 */ { 0x00, 0x03 }, - /* 017 */ { 0x00, 0x03 }, - /* 018 */ { 0x00, 0x03 }, - /* 019 */ { 0x00, 0x03 }, - /* 01a */ { 0x00, 0x03 }, - /* 01b */ { 0x00, 0x03 }, - /* 01c */ { 0x00, 0x03 }, - /* 01d */ { 0x00, 0x03 }, - /* 01e */ { 0x00, 0x03 }, - /* 01f */ { 0x00, 0x03 }, - /* 020 */ { 0x00, 0x03 }, - /* 021 */ { 0x00, 0x03 }, - /* 022 */ { 0x00, 0x03 }, - /* 023 */ { 0x00, 0x03 }, - /* 024 */ { 0x00, 0x03 }, - /* 025 */ { 0x00, 0x03 }, - /* 026 */ { 0x00, 0x03 }, - /* 027 */ { 0x00, 0x03 }, - /* 028 */ { 0x00, 0x03 }, - /* 029 */ { 0x00, 0x03 }, - /* 02a */ { 0x00, 0x03 }, - /* 02b */ { 0x00, 0x03 }, - /* 02c */ { 0x00, 0x03 }, - /* 02d */ { 0x00, 0x03 }, - /* 02e */ { 0x00, 0x03 }, - /* 02f */ { 0x00, 0x03 }, - /* 030 */ { 0x00, 0x03 }, - /* 031 */ { 0x00, 0x03 }, - /* 032 */ { 0x00, 0x03 }, - /* 033 */ { 0x00, 0x03 }, - /* 034 */ { 0x00, 0x03 }, - /* 035 */ { 0x00, 0x03 }, - /* 036 */ { 0x00, 0x03 }, - /* 037 */ { 0x00, 0x03 }, - /* 038 */ { 0x00, 0x03 }, - /* 039 */ { 0x00, 0x03 }, - /* 03a */ { 0x00, 0x03 }, - /* 03b */ { 0x00, 0x03 }, - /* 03c */ { 0x00, 0x03 }, - /* 03d */ { 0x00, 0x03 }, - /* 03e */ { 0x00, 0x03 }, - /* 03f */ { 0x00, 0x03 }, - /* 040 */ { 0x02, 0x03 }, - /* 041 */ { 0x02, 0x03 }, - /* 042 */ { 0x02, 0x03 }, - /* 043 */ { 0x02, 0x03 }, - /* 044 */ { 0x02, 0x03 }, - /* 045 */ { 0x02, 0x03 }, - /* 046 */ { 0x02, 0x03 }, - /* 047 */ { 0x02, 0x03 }, - /* 048 */ { 0x02, 0x03 }, - /* 049 */ { 0x02, 0x03 }, - /* 04a */ { 0x02, 0x03 }, - /* 04b */ { 0x02, 0x03 }, - /* 04c */ { 0x02, 0x03 }, - /* 04d */ { 0x02, 0x03 }, - /* 04e */ { 0x02, 0x03 }, - /* 04f */ { 0x02, 0x03 }, - /* 050 */ { 0x02, 0x03 }, - /* 051 */ { 0x02, 0x03 }, - /* 052 */ { 0x02, 0x03 }, - /* 053 */ { 0x02, 0x03 }, - /* 054 */ { 0x02, 0x03 }, - /* 055 */ { 0x02, 0x03 }, - /* 056 */ { 0x02, 0x03 }, - /* 057 */ { 0x02, 0x03 }, - /* 058 */ { 0x02, 0x03 }, - /* 059 */ { 0x02, 0x03 }, - /* 05a */ { 0x02, 0x03 }, - /* 05b */ { 0x02, 0x03 }, - /* 05c */ { 0x02, 0x03 }, - /* 05d */ { 0x02, 0x03 }, - /* 05e */ { 0x02, 0x03 }, - /* 05f */ { 0x02, 0x03 }, - /* 060 */ { 0x02, 0x03 }, - /* 061 */ { 0x02, 0x03 }, - /* 062 */ { 0x02, 0x03 }, - /* 063 */ { 0x02, 0x03 }, - /* 064 */ { 0x02, 0x03 }, - /* 065 */ { 0x02, 0x03 }, - /* 066 */ { 0x02, 0x03 }, - /* 067 */ { 0x02, 0x03 }, - /* 068 */ { 0x02, 0x03 }, - /* 069 */ { 0x02, 0x03 }, - /* 06a */ { 0x02, 0x03 }, - /* 06b */ { 0x02, 0x03 }, - /* 06c */ { 0x02, 0x03 }, - /* 06d */ { 0x02, 0x03 }, - /* 06e */ { 0x02, 0x03 }, - /* 06f */ { 0x02, 0x03 }, - /* 070 */ { 0x02, 0x03 }, - /* 071 */ { 0x02, 0x03 }, - /* 072 */ { 0x02, 0x03 }, - /* 073 */ { 0x02, 0x03 }, - /* 074 */ { 0x02, 0x03 }, - /* 075 */ { 0x02, 0x03 }, - /* 076 */ { 0x02, 0x03 }, - /* 077 */ { 0x02, 0x03 }, - /* 078 */ { 0x02, 0x03 }, - /* 079 */ { 0x02, 0x03 }, - /* 07a */ { 0x02, 0x03 }, - /* 07b */ { 0x02, 0x03 }, - /* 07c */ { 0x02, 0x03 }, - /* 07d */ { 0x02, 0x03 }, - /* 07e */ { 0x02, 0x03 }, - /* 07f */ { 0x02, 0x03 }, - /* 080 */ { 0x03, 0x03 }, - /* 081 */ { 0x03, 0x03 }, - /* 082 */ { 0x03, 0x03 }, - /* 083 */ { 0x03, 0x03 }, - /* 084 */ { 0x03, 0x03 }, - /* 085 */ { 0x03, 0x03 }, - /* 086 */ { 0x03, 0x03 }, - /* 087 */ { 0x03, 0x03 }, - /* 088 */ { 0x03, 0x03 }, - /* 089 */ { 0x03, 0x03 }, - /* 08a */ { 0x03, 0x03 }, - /* 08b */ { 0x03, 0x03 }, - /* 08c */ { 0x03, 0x03 }, - /* 08d */ { 0x03, 0x03 }, - /* 08e */ { 0x03, 0x03 }, - /* 08f */ { 0x03, 0x03 }, - /* 090 */ { 0x03, 0x03 }, - /* 091 */ { 0x03, 0x03 }, - /* 092 */ { 0x03, 0x03 }, - /* 093 */ { 0x03, 0x03 }, - /* 094 */ { 0x03, 0x03 }, - /* 095 */ { 0x03, 0x03 }, - /* 096 */ { 0x03, 0x03 }, - /* 097 */ { 0x03, 0x03 }, - /* 098 */ { 0x03, 0x03 }, - /* 099 */ { 0x03, 0x03 }, - /* 09a */ { 0x03, 0x03 }, - /* 09b */ { 0x03, 0x03 }, - /* 09c */ { 0x03, 0x03 }, - /* 09d */ { 0x03, 0x03 }, - /* 09e */ { 0x03, 0x03 }, - /* 09f */ { 0x03, 0x03 }, - /* 0a0 */ { 0x03, 0x03 }, - /* 0a1 */ { 0x03, 0x03 }, - /* 0a2 */ { 0x03, 0x03 }, - /* 0a3 */ { 0x03, 0x03 }, - /* 0a4 */ { 0x03, 0x03 }, - /* 0a5 */ { 0x03, 0x03 }, - /* 0a6 */ { 0x03, 0x03 }, - /* 0a7 */ { 0x03, 0x03 }, - /* 0a8 */ { 0x03, 0x03 }, - /* 0a9 */ { 0x03, 0x03 }, - /* 0aa */ { 0x03, 0x03 }, - /* 0ab */ { 0x03, 0x03 }, - /* 0ac */ { 0x03, 0x03 }, - /* 0ad */ { 0x03, 0x03 }, - /* 0ae */ { 0x03, 0x03 }, - /* 0af */ { 0x03, 0x03 }, - /* 0b0 */ { 0x03, 0x03 }, - /* 0b1 */ { 0x03, 0x03 }, - /* 0b2 */ { 0x03, 0x03 }, - /* 0b3 */ { 0x03, 0x03 }, - /* 0b4 */ { 0x03, 0x03 }, - /* 0b5 */ { 0x03, 0x03 }, - /* 0b6 */ { 0x03, 0x03 }, - /* 0b7 */ { 0x03, 0x03 }, - /* 0b8 */ { 0x03, 0x03 }, - /* 0b9 */ { 0x03, 0x03 }, - /* 0ba */ { 0x03, 0x03 }, - /* 0bb */ { 0x03, 0x03 }, - /* 0bc */ { 0x03, 0x03 }, - /* 0bd */ { 0x03, 0x03 }, - /* 0be */ { 0x03, 0x03 }, - /* 0bf */ { 0x03, 0x03 }, - /* 0c0 */ { 0x04, 0x03 }, - /* 0c1 */ { 0x04, 0x03 }, - /* 0c2 */ { 0x04, 0x03 }, - /* 0c3 */ { 0x04, 0x03 }, - /* 0c4 */ { 0x04, 0x03 }, - /* 0c5 */ { 0x04, 0x03 }, - /* 0c6 */ { 0x04, 0x03 }, - /* 0c7 */ { 0x04, 0x03 }, - /* 0c8 */ { 0x04, 0x03 }, - /* 0c9 */ { 0x04, 0x03 }, - /* 0ca */ { 0x04, 0x03 }, - /* 0cb */ { 0x04, 0x03 }, - /* 0cc */ { 0x04, 0x03 }, - /* 0cd */ { 0x04, 0x03 }, - /* 0ce */ { 0x04, 0x03 }, - /* 0cf */ { 0x04, 0x03 }, - /* 0d0 */ { 0x04, 0x03 }, - /* 0d1 */ { 0x04, 0x03 }, - /* 0d2 */ { 0x04, 0x03 }, - /* 0d3 */ { 0x04, 0x03 }, - /* 0d4 */ { 0x04, 0x03 }, - /* 0d5 */ { 0x04, 0x03 }, - /* 0d6 */ { 0x04, 0x03 }, - /* 0d7 */ { 0x04, 0x03 }, - /* 0d8 */ { 0x04, 0x03 }, - /* 0d9 */ { 0x04, 0x03 }, - /* 0da */ { 0x04, 0x03 }, - /* 0db */ { 0x04, 0x03 }, - /* 0dc */ { 0x04, 0x03 }, - /* 0dd */ { 0x04, 0x03 }, - /* 0de */ { 0x04, 0x03 }, - /* 0df */ { 0x04, 0x03 }, - /* 0e0 */ { 0x04, 0x03 }, - /* 0e1 */ { 0x04, 0x03 }, - /* 0e2 */ { 0x04, 0x03 }, - /* 0e3 */ { 0x04, 0x03 }, - /* 0e4 */ { 0x04, 0x03 }, - /* 0e5 */ { 0x04, 0x03 }, - /* 0e6 */ { 0x04, 0x03 }, - /* 0e7 */ { 0x04, 0x03 }, - /* 0e8 */ { 0x04, 0x03 }, - /* 0e9 */ { 0x04, 0x03 }, - /* 0ea */ { 0x04, 0x03 }, - /* 0eb */ { 0x04, 0x03 }, - /* 0ec */ { 0x04, 0x03 }, - /* 0ed */ { 0x04, 0x03 }, - /* 0ee */ { 0x04, 0x03 }, - /* 0ef */ { 0x04, 0x03 }, - /* 0f0 */ { 0x04, 0x03 }, - /* 0f1 */ { 0x04, 0x03 }, - /* 0f2 */ { 0x04, 0x03 }, - /* 0f3 */ { 0x04, 0x03 }, - /* 0f4 */ { 0x04, 0x03 }, - /* 0f5 */ { 0x04, 0x03 }, - /* 0f6 */ { 0x04, 0x03 }, - /* 0f7 */ { 0x04, 0x03 }, - /* 0f8 */ { 0x04, 0x03 }, - /* 0f9 */ { 0x04, 0x03 }, - /* 0fa */ { 0x04, 0x03 }, - /* 0fb */ { 0x04, 0x03 }, - /* 0fc */ { 0x04, 0x03 }, - /* 0fd */ { 0x04, 0x03 }, - /* 0fe */ { 0x04, 0x03 }, - /* 0ff */ { 0x04, 0x03 }, - /* 100 */ { 0x05, 0x03 }, - /* 101 */ { 0x05, 0x03 }, - /* 102 */ { 0x05, 0x03 }, - /* 103 */ { 0x05, 0x03 }, - /* 104 */ { 0x05, 0x03 }, - /* 105 */ { 0x05, 0x03 }, - /* 106 */ { 0x05, 0x03 }, - /* 107 */ { 0x05, 0x03 }, - /* 108 */ { 0x05, 0x03 }, - /* 109 */ { 0x05, 0x03 }, - /* 10a */ { 0x05, 0x03 }, - /* 10b */ { 0x05, 0x03 }, - /* 10c */ { 0x05, 0x03 }, - /* 10d */ { 0x05, 0x03 }, - /* 10e */ { 0x05, 0x03 }, - /* 10f */ { 0x05, 0x03 }, - /* 110 */ { 0x05, 0x03 }, - /* 111 */ { 0x05, 0x03 }, - /* 112 */ { 0x05, 0x03 }, - /* 113 */ { 0x05, 0x03 }, - /* 114 */ { 0x05, 0x03 }, - /* 115 */ { 0x05, 0x03 }, - /* 116 */ { 0x05, 0x03 }, - /* 117 */ { 0x05, 0x03 }, - /* 118 */ { 0x05, 0x03 }, - /* 119 */ { 0x05, 0x03 }, - /* 11a */ { 0x05, 0x03 }, - /* 11b */ { 0x05, 0x03 }, - /* 11c */ { 0x05, 0x03 }, - /* 11d */ { 0x05, 0x03 }, - /* 11e */ { 0x05, 0x03 }, - /* 11f */ { 0x05, 0x03 }, - /* 120 */ { 0x05, 0x03 }, - /* 121 */ { 0x05, 0x03 }, - /* 122 */ { 0x05, 0x03 }, - /* 123 */ { 0x05, 0x03 }, - /* 124 */ { 0x05, 0x03 }, - /* 125 */ { 0x05, 0x03 }, - /* 126 */ { 0x05, 0x03 }, - /* 127 */ { 0x05, 0x03 }, - /* 128 */ { 0x05, 0x03 }, - /* 129 */ { 0x05, 0x03 }, - /* 12a */ { 0x05, 0x03 }, - /* 12b */ { 0x05, 0x03 }, - /* 12c */ { 0x05, 0x03 }, - /* 12d */ { 0x05, 0x03 }, - /* 12e */ { 0x05, 0x03 }, - /* 12f */ { 0x05, 0x03 }, - /* 130 */ { 0x05, 0x03 }, - /* 131 */ { 0x05, 0x03 }, - /* 132 */ { 0x05, 0x03 }, - /* 133 */ { 0x05, 0x03 }, - /* 134 */ { 0x05, 0x03 }, - /* 135 */ { 0x05, 0x03 }, - /* 136 */ { 0x05, 0x03 }, - /* 137 */ { 0x05, 0x03 }, - /* 138 */ { 0x05, 0x03 }, - /* 139 */ { 0x05, 0x03 }, - /* 13a */ { 0x05, 0x03 }, - /* 13b */ { 0x05, 0x03 }, - /* 13c */ { 0x05, 0x03 }, - /* 13d */ { 0x05, 0x03 }, - /* 13e */ { 0x05, 0x03 }, - /* 13f */ { 0x05, 0x03 }, - /* 140 */ { 0x06, 0x03 }, - /* 141 */ { 0x06, 0x03 }, - /* 142 */ { 0x06, 0x03 }, - /* 143 */ { 0x06, 0x03 }, - /* 144 */ { 0x06, 0x03 }, - /* 145 */ { 0x06, 0x03 }, - /* 146 */ { 0x06, 0x03 }, - /* 147 */ { 0x06, 0x03 }, - /* 148 */ { 0x06, 0x03 }, - /* 149 */ { 0x06, 0x03 }, - /* 14a */ { 0x06, 0x03 }, - /* 14b */ { 0x06, 0x03 }, - /* 14c */ { 0x06, 0x03 }, - /* 14d */ { 0x06, 0x03 }, - /* 14e */ { 0x06, 0x03 }, - /* 14f */ { 0x06, 0x03 }, - /* 150 */ { 0x06, 0x03 }, - /* 151 */ { 0x06, 0x03 }, - /* 152 */ { 0x06, 0x03 }, - /* 153 */ { 0x06, 0x03 }, - /* 154 */ { 0x06, 0x03 }, - /* 155 */ { 0x06, 0x03 }, - /* 156 */ { 0x06, 0x03 }, - /* 157 */ { 0x06, 0x03 }, - /* 158 */ { 0x06, 0x03 }, - /* 159 */ { 0x06, 0x03 }, - /* 15a */ { 0x06, 0x03 }, - /* 15b */ { 0x06, 0x03 }, - /* 15c */ { 0x06, 0x03 }, - /* 15d */ { 0x06, 0x03 }, - /* 15e */ { 0x06, 0x03 }, - /* 15f */ { 0x06, 0x03 }, - /* 160 */ { 0x06, 0x03 }, - /* 161 */ { 0x06, 0x03 }, - /* 162 */ { 0x06, 0x03 }, - /* 163 */ { 0x06, 0x03 }, - /* 164 */ { 0x06, 0x03 }, - /* 165 */ { 0x06, 0x03 }, - /* 166 */ { 0x06, 0x03 }, - /* 167 */ { 0x06, 0x03 }, - /* 168 */ { 0x06, 0x03 }, - /* 169 */ { 0x06, 0x03 }, - /* 16a */ { 0x06, 0x03 }, - /* 16b */ { 0x06, 0x03 }, - /* 16c */ { 0x06, 0x03 }, - /* 16d */ { 0x06, 0x03 }, - /* 16e */ { 0x06, 0x03 }, - /* 16f */ { 0x06, 0x03 }, - /* 170 */ { 0x06, 0x03 }, - /* 171 */ { 0x06, 0x03 }, - /* 172 */ { 0x06, 0x03 }, - /* 173 */ { 0x06, 0x03 }, - /* 174 */ { 0x06, 0x03 }, - /* 175 */ { 0x06, 0x03 }, - /* 176 */ { 0x06, 0x03 }, - /* 177 */ { 0x06, 0x03 }, - /* 178 */ { 0x06, 0x03 }, - /* 179 */ { 0x06, 0x03 }, - /* 17a */ { 0x06, 0x03 }, - /* 17b */ { 0x06, 0x03 }, - /* 17c */ { 0x06, 0x03 }, - /* 17d */ { 0x06, 0x03 }, - /* 17e */ { 0x06, 0x03 }, - /* 17f */ { 0x06, 0x03 }, - /* 180 */ { 0x07, 0x03 }, - /* 181 */ { 0x07, 0x03 }, - /* 182 */ { 0x07, 0x03 }, - /* 183 */ { 0x07, 0x03 }, - /* 184 */ { 0x07, 0x03 }, - /* 185 */ { 0x07, 0x03 }, - /* 186 */ { 0x07, 0x03 }, - /* 187 */ { 0x07, 0x03 }, - /* 188 */ { 0x07, 0x03 }, - /* 189 */ { 0x07, 0x03 }, - /* 18a */ { 0x07, 0x03 }, - /* 18b */ { 0x07, 0x03 }, - /* 18c */ { 0x07, 0x03 }, - /* 18d */ { 0x07, 0x03 }, - /* 18e */ { 0x07, 0x03 }, - /* 18f */ { 0x07, 0x03 }, - /* 190 */ { 0x07, 0x03 }, - /* 191 */ { 0x07, 0x03 }, - /* 192 */ { 0x07, 0x03 }, - /* 193 */ { 0x07, 0x03 }, - /* 194 */ { 0x07, 0x03 }, - /* 195 */ { 0x07, 0x03 }, - /* 196 */ { 0x07, 0x03 }, - /* 197 */ { 0x07, 0x03 }, - /* 198 */ { 0x07, 0x03 }, - /* 199 */ { 0x07, 0x03 }, - /* 19a */ { 0x07, 0x03 }, - /* 19b */ { 0x07, 0x03 }, - /* 19c */ { 0x07, 0x03 }, - /* 19d */ { 0x07, 0x03 }, - /* 19e */ { 0x07, 0x03 }, - /* 19f */ { 0x07, 0x03 }, - /* 1a0 */ { 0x07, 0x03 }, - /* 1a1 */ { 0x07, 0x03 }, - /* 1a2 */ { 0x07, 0x03 }, - /* 1a3 */ { 0x07, 0x03 }, - /* 1a4 */ { 0x07, 0x03 }, - /* 1a5 */ { 0x07, 0x03 }, - /* 1a6 */ { 0x07, 0x03 }, - /* 1a7 */ { 0x07, 0x03 }, - /* 1a8 */ { 0x07, 0x03 }, - /* 1a9 */ { 0x07, 0x03 }, - /* 1aa */ { 0x07, 0x03 }, - /* 1ab */ { 0x07, 0x03 }, - /* 1ac */ { 0x07, 0x03 }, - /* 1ad */ { 0x07, 0x03 }, - /* 1ae */ { 0x07, 0x03 }, - /* 1af */ { 0x07, 0x03 }, - /* 1b0 */ { 0x07, 0x03 }, - /* 1b1 */ { 0x07, 0x03 }, - /* 1b2 */ { 0x07, 0x03 }, - /* 1b3 */ { 0x07, 0x03 }, - /* 1b4 */ { 0x07, 0x03 }, - /* 1b5 */ { 0x07, 0x03 }, - /* 1b6 */ { 0x07, 0x03 }, - /* 1b7 */ { 0x07, 0x03 }, - /* 1b8 */ { 0x07, 0x03 }, - /* 1b9 */ { 0x07, 0x03 }, - /* 1ba */ { 0x07, 0x03 }, - /* 1bb */ { 0x07, 0x03 }, - /* 1bc */ { 0x07, 0x03 }, - /* 1bd */ { 0x07, 0x03 }, - /* 1be */ { 0x07, 0x03 }, - /* 1bf */ { 0x07, 0x03 }, - /* 1c0 */ { 0x01, 0x04 }, - /* 1c1 */ { 0x01, 0x04 }, - /* 1c2 */ { 0x01, 0x04 }, - /* 1c3 */ { 0x01, 0x04 }, - /* 1c4 */ { 0x01, 0x04 }, - /* 1c5 */ { 0x01, 0x04 }, - /* 1c6 */ { 0x01, 0x04 }, - /* 1c7 */ { 0x01, 0x04 }, - /* 1c8 */ { 0x01, 0x04 }, - /* 1c9 */ { 0x01, 0x04 }, - /* 1ca */ { 0x01, 0x04 }, - /* 1cb */ { 0x01, 0x04 }, - /* 1cc */ { 0x01, 0x04 }, - /* 1cd */ { 0x01, 0x04 }, - /* 1ce */ { 0x01, 0x04 }, - /* 1cf */ { 0x01, 0x04 }, - /* 1d0 */ { 0x01, 0x04 }, - /* 1d1 */ { 0x01, 0x04 }, - /* 1d2 */ { 0x01, 0x04 }, - /* 1d3 */ { 0x01, 0x04 }, - /* 1d4 */ { 0x01, 0x04 }, - /* 1d5 */ { 0x01, 0x04 }, - /* 1d6 */ { 0x01, 0x04 }, - /* 1d7 */ { 0x01, 0x04 }, - /* 1d8 */ { 0x01, 0x04 }, - /* 1d9 */ { 0x01, 0x04 }, - /* 1da */ { 0x01, 0x04 }, - /* 1db */ { 0x01, 0x04 }, - /* 1dc */ { 0x01, 0x04 }, - /* 1dd */ { 0x01, 0x04 }, - /* 1de */ { 0x01, 0x04 }, - /* 1df */ { 0x01, 0x04 }, - /* 1e0 */ { 0x08, 0x06 }, - /* 1e1 */ { 0x08, 0x06 }, - /* 1e2 */ { 0x08, 0x06 }, - /* 1e3 */ { 0x08, 0x06 }, - /* 1e4 */ { 0x08, 0x06 }, - /* 1e5 */ { 0x08, 0x06 }, - /* 1e6 */ { 0x08, 0x06 }, - /* 1e7 */ { 0x08, 0x06 }, - /* 1e8 */ { 0x09, 0x07 }, - /* 1e9 */ { 0x09, 0x07 }, - /* 1ea */ { 0x09, 0x07 }, - /* 1eb */ { 0x09, 0x07 }, - /* 1ec */ { 0x0f, 0x07 }, - /* 1ed */ { 0x0f, 0x07 }, - /* 1ee */ { 0x0f, 0x07 }, - /* 1ef */ { 0x0f, 0x07 }, - /* 1f0 */ { 0x10, 0x09 }, - /* 1f1 */ { 0x11, 0x09 }, - /* 1f2 */ { 0x12, 0x09 }, - /* 1f3 */ { 0x13, 0x09 }, - /* 1f4 */ { 0x14, 0x09 }, - /* 1f5 */ { 0x15, 0x09 }, - /* 1f6 */ { 0x16, 0x09 }, - /* 1f7 */ { 0x17, 0x09 }, - /* 1f8 */ { 0x18, 0x09 }, - /* 1f9 */ { 0x19, 0x09 }, - /* 1fa */ { 0x1a, 0x09 }, - /* 1fb */ { 0x1b, 0x09 }, - /* 1fc */ { 0x1c, 0x09 }, - /* 1fd */ { 0x1d, 0x09 }, - /* 1fe */ { 0x1e, 0x09 }, - /* 1ff */ { 0x1f, 0x09 }, diff --git a/waterbox/pcfx/sound/Blip_Buffer.cpp b/waterbox/pcfx/sound/Blip_Buffer.cpp deleted file mode 100644 index f04a1fc599..0000000000 --- a/waterbox/pcfx/sound/Blip_Buffer.cpp +++ /dev/null @@ -1,457 +0,0 @@ -// Blip_Buffer 0.4.1. http://www.slack.net/~ant/ - -#include "Blip_Buffer.h" - -#include -#include -#include -#include -#include -#include - -/* Copyright (C) 2003-2006 Shay Green. This module is free software; you -can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -module is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#ifdef BLARGG_ENABLE_OPTIMIZER - #include BLARGG_ENABLE_OPTIMIZER -#endif - -int const silent_buf_size = 1; // size used for Silent_Blip_Buffer - -Blip_Buffer::Blip_Buffer() -{ - factor_ = (blip_u64)ULLONG_MAX; - offset_ = 0; - buffer_ = 0; - buffer_size_ = 0; - sample_rate_ = 0; - reader_accum_ = 0; - bass_shift_ = 0; - clock_rate_ = 0; - bass_freq_ = 16; - length_ = 0; - - // assumptions code makes about implementation-defined features - #ifndef NDEBUG - // right shift of negative value preserves sign - buf_t_ i = -0x7FFFFFFE; - assert( (i >> 1) == -0x3FFFFFFF ); - - // casting to short truncates to 16 bits and sign-extends - i = 0x18000; - assert( (short) i == -0x8000 ); - #endif -} - -Blip_Buffer::~Blip_Buffer() -{ - if ( buffer_size_ != silent_buf_size ) - free( buffer_ ); -} - -Silent_Blip_Buffer::Silent_Blip_Buffer() -{ - factor_ = 0; - buffer_ = buf; - buffer_size_ = silent_buf_size; - memset( buf, 0, sizeof buf ); // in case machine takes exception for signed overflow -} - -void Blip_Buffer::clear( int entire_buffer ) -{ - offset_ = 0; - reader_accum_ = 0; - modified_ = 0; - if ( buffer_ ) - { - long count = (entire_buffer ? buffer_size_ : samples_avail()); - memset( buffer_, 0, (count + blip_buffer_extra_) * sizeof (buf_t_) ); - } -} - -Blip_Buffer::blargg_err_t Blip_Buffer::set_sample_rate( long new_rate, int msec ) -{ - if ( buffer_size_ == silent_buf_size ) - { - assert( 0 ); - return "Internal (tried to resize Silent_Blip_Buffer)"; - } - - // start with maximum length that resampled time can represent - blip_s64 new_size = (ULLONG_MAX >> BLIP_BUFFER_ACCURACY) - blip_buffer_extra_ - 64; - - // simple safety check, since code elsewhere may not be safe for sizes approaching (2 ^ 31). - if(new_size > ((1LL << 30) - 1)) - new_size = (1LL << 30) - 1; - - if ( msec != blip_max_length ) - { - blip_s64 s = ((blip_s64)new_rate * (msec + 1) + 999) / 1000; - if ( s < new_size ) - new_size = s; - else - assert( 0 ); // fails if requested buffer length exceeds limit - } - - if ( buffer_size_ != new_size ) - { - void* p = realloc( buffer_, (new_size + blip_buffer_extra_) * sizeof *buffer_ ); - if ( !p ) - return "Out of memory"; - - //if(new_size > buffer_size_) - // memset(buffer_ + buffer_size_, 0, (new_size + blip_buffer_extra_) * sizeof *buffer_ - - buffer_ = (buf_t_*) p; - } - - buffer_size_ = new_size; - assert( buffer_size_ != silent_buf_size ); - - // update things based on the sample rate - sample_rate_ = new_rate; - length_ = new_size * 1000 / new_rate - 1; - if ( msec ) - assert( length_ == msec ); // ensure length is same as that passed in - if ( clock_rate_ ) - clock_rate( clock_rate_ ); - bass_freq( bass_freq_ ); - - clear(); - - return 0; // success -} - -blip_resampled_time_t Blip_Buffer::clock_rate_factor( long rate ) const -{ - double ratio = (double) sample_rate_ / rate; - blip_s64 factor = (blip_s64) floor( ratio * (1LL << BLIP_BUFFER_ACCURACY) + 0.5 ); - assert( factor > 0 || !sample_rate_ ); // fails if clock/output ratio is too large - return (blip_resampled_time_t) factor; -} - -void Blip_Buffer::bass_freq( int freq ) -{ - bass_freq_ = freq; - int shift = 31; - if ( freq > 0 ) - { - shift = 13; - long f = (freq << 16) / sample_rate_; - while ( (f >>= 1) && --shift ) { } - } - bass_shift_ = shift; - //printf("%d\n", bass_shift_); -} - -void Blip_Buffer::end_frame( blip_time_t t ) -{ - offset_ += t * factor_; - assert( samples_avail() <= (long) buffer_size_ ); // time outside buffer length -} - -void Blip_Buffer::remove_silence( long count ) -{ - assert( count <= samples_avail() ); // tried to remove more samples than available - offset_ -= (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY; -} - -long Blip_Buffer::count_samples( blip_time_t t ) const -{ - unsigned long last_sample = resampled_time( t ) >> BLIP_BUFFER_ACCURACY; - unsigned long first_sample = offset_ >> BLIP_BUFFER_ACCURACY; - return (long) (last_sample - first_sample); -} - -blip_time_t Blip_Buffer::count_clocks( long count ) const -{ - if ( !factor_ ) - { - assert( 0 ); // sample rate and clock rates must be set first - return 0; - } - - if ( count > buffer_size_ ) - count = buffer_size_; - blip_resampled_time_t time = (blip_resampled_time_t) count << BLIP_BUFFER_ACCURACY; - return (blip_time_t) ((time - offset_ + factor_ - 1) / factor_); -} - -void Blip_Buffer::remove_samples( long count ) -{ - if ( count ) - { - remove_silence( count ); - - // copy remaining samples to beginning and clear old samples - long remain = samples_avail() + blip_buffer_extra_; - memmove( buffer_, buffer_ + count, remain * sizeof *buffer_ ); - memset( buffer_ + remain, 0, count * sizeof *buffer_ ); - } -} - -// Blip_Synth_ - -Blip_Synth_Fast_::Blip_Synth_Fast_() -{ - buf = 0; - last_amp = 0; - delta_factor = 0; -} - -void Blip_Synth_Fast_::volume_unit( double new_unit ) -{ - delta_factor = int (new_unit * (1L << blip_sample_bits) + 0.5); -} - -#if !BLIP_BUFFER_FAST - -Blip_Synth_::Blip_Synth_( short* p, int w ) : - impulses( p ), - width( w ) -{ - volume_unit_ = 0.0; - kernel_unit = 0; - buf = 0; - last_amp = 0; - delta_factor = 0; -} - -#undef PI -#define PI 3.1415926535897932384626433832795029 - -static void gen_sinc( float* out, int count, double oversample, double treble, double cutoff ) -{ - if ( cutoff >= 0.999 ) - cutoff = 0.999; - - if ( treble < -300.0 ) - treble = -300.0; - if ( treble > 5.0 ) - treble = 5.0; - - double const maxh = 4096.0; - double const rolloff = pow( 10.0, 1.0 / (maxh * 20.0) * treble / (1.0 - cutoff) ); - double const pow_a_n = pow( rolloff, maxh - maxh * cutoff ); - double const to_angle = PI / 2 / maxh / oversample; - for ( int i = 0; i < count; i++ ) - { - double angle = ((i - count) * 2 + 1) * to_angle; - double c = rolloff * cos( (maxh - 1.0) * angle ) - cos( maxh * angle ); - double cos_nc_angle = cos( maxh * cutoff * angle ); - double cos_nc1_angle = cos( (maxh * cutoff - 1.0) * angle ); - double cos_angle = cos( angle ); - - c = c * pow_a_n - rolloff * cos_nc1_angle + cos_nc_angle; - double d = 1.0 + rolloff * (rolloff - cos_angle - cos_angle); - double b = 2.0 - cos_angle - cos_angle; - double a = 1.0 - cos_angle - cos_nc_angle + cos_nc1_angle; - - out [i] = (float) ((a * d + c * b) / (b * d)); // a / b + c / d - } -} - -void blip_eq_t::generate( float* out, int count ) const -{ - // lower cutoff freq for narrow kernels with their wider transition band - // (8 points->1.49, 16 points->1.15) - double oversample = blip_res * 2.25 / count + 0.85; - double half_rate = sample_rate * 0.5; - if ( cutoff_freq ) - oversample = half_rate / cutoff_freq; - double cutoff = rolloff_freq * oversample / half_rate; - - gen_sinc( out, count, blip_res * oversample, treble, cutoff ); - - // apply (half of) hamming window - double to_fraction = PI / (count - 1); - for ( int i = count; i--; ) - out [i] *= 0.54f - 0.46f * (float) cos( i * to_fraction ); -} - -void Blip_Synth_::adjust_impulse() -{ - // sum pairs for each phase and add error correction to end of first half - int const size = impulses_size(); - for ( int p = blip_res; p-- >= blip_res / 2; ) - { - int p2 = blip_res - 2 - p; - long error = kernel_unit; - for ( int i = 1; i < size; i += blip_res ) - { - error -= impulses [i + p ]; - error -= impulses [i + p2]; - } - if ( p == p2 ) - error /= 2; // phase = 0.5 impulse uses same half for both sides - impulses [size - blip_res + p] += (short) error; - //printf( "error: %ld\n", error ); - } - - //for ( int i = blip_res; i--; printf( "\n" ) ) - // for ( int j = 0; j < width / 2; j++ ) - // printf( "%5ld,", impulses [j * blip_res + i + 1] ); -} - -void Blip_Synth_::treble_eq( blip_eq_t const& eq ) -{ - float fimpulse [blip_res / 2 * (blip_widest_impulse_ - 1) + blip_res * 2]; - - int const half_size = blip_res / 2 * (width - 1); - eq.generate( &fimpulse [blip_res], half_size ); - - int i; - - // need mirror slightly past center for calculation - for ( i = blip_res; i--; ) - fimpulse [blip_res + half_size + i] = fimpulse [blip_res + half_size - 1 - i]; - - // starts at 0 - for ( i = 0; i < blip_res; i++ ) - fimpulse [i] = 0.0f; - - // find rescale factor - double total = 0.0; - for ( i = 0; i < half_size; i++ ) - total += fimpulse [blip_res + i]; - - //double const base_unit = 44800.0 - 128 * 18; // allows treble up to +0 dB - //double const base_unit = 37888.0; // allows treble to +5 dB - double const base_unit = 32768.0; // necessary for blip_unscaled to work - double rescale = base_unit / 2 / total; - kernel_unit = (long) base_unit; - - // integrate, first difference, rescale, convert to int - double sum = 0.0; - double next = 0.0; - int const impulses_size_local = this->impulses_size(); - for ( i = 0; i < impulses_size_local; i++ ) - { - impulses [i] = (short) floor( (next - sum) * rescale + 0.5 ); - sum += fimpulse [i]; - next += fimpulse [i + blip_res]; - } - adjust_impulse(); - - // volume might require rescaling - double vol = volume_unit_; - if ( vol ) - { - volume_unit_ = 0.0; - volume_unit( vol ); - } -} - -void Blip_Synth_::volume_unit( double new_unit ) -{ - if ( new_unit != volume_unit_ ) - { - // use default eq if it hasn't been set yet - if ( !kernel_unit ) - treble_eq( -8.0 ); - - volume_unit_ = new_unit; - double factor = new_unit * (1L << blip_sample_bits) / kernel_unit; - - if ( factor > 0.0 ) - { - int shift = 0; - - // if unit is really small, might need to attenuate kernel - while ( factor < 2.0 ) - { - shift++; - factor *= 2.0; - } - - if ( shift ) - { - kernel_unit >>= shift; - assert( kernel_unit > 0 ); // fails if volume unit is too low - - // keep values positive to avoid round-towards-zero of sign-preserving - // right shift for negative values - long offset = 0x8000 + (1 << (shift - 1)); - long offset2 = 0x8000 >> shift; - for ( int i = impulses_size(); i--; ) - impulses [i] = (short) (((impulses [i] + offset) >> shift) - offset2); - adjust_impulse(); - } - } - delta_factor = (int) floor( factor + 0.5 ); - //printf( "delta_factor: %d, kernel_unit: %d\n", delta_factor, kernel_unit ); - } -} -#endif - -long Blip_Buffer::read_samples( blip_sample_t* BLIP_RESTRICT out, long max_samples, int stereo ) -{ - long count = samples_avail(); - if ( count > max_samples ) - count = max_samples; - - if ( count ) - { - int const bass = BLIP_READER_BASS( *this ); - BLIP_READER_BEGIN( reader, *this ); - - if ( !stereo ) - { - for ( blip_long n = count; n; --n ) - { - blip_long s = BLIP_READER_READ( reader ); - if ( (blip_sample_t) s != s ) - s = 0x7FFF - (s >> 24); - *out++ = (blip_sample_t) s; - BLIP_READER_NEXT( reader, bass ); - } - } - else - { - for ( blip_long n = count; n; --n ) - { - blip_long s = BLIP_READER_READ( reader ); - if ( (blip_sample_t) s != s ) - s = 0x7FFF - (s >> 24); - *out = (blip_sample_t) s; - out += 2; - BLIP_READER_NEXT( reader, bass ); - } - } - BLIP_READER_END( reader, *this ); - - remove_samples( count ); - } - return count; -} - -void Blip_Buffer::mix_samples( blip_sample_t const* in, long count ) -{ - if ( buffer_size_ == silent_buf_size ) - { - assert( 0 ); - return; - } - - buf_t_* out = buffer_ + (offset_ >> BLIP_BUFFER_ACCURACY) + blip_widest_impulse_ / 2; - - int const sample_shift = blip_sample_bits - 16; - int prev = 0; - while ( count-- ) - { - blip_long s = (blip_long) *in++ << sample_shift; - *out += s - prev; - prev = s; - ++out; - } - *out -= prev; -} - diff --git a/waterbox/pcfx/sound/Blip_Buffer.h b/waterbox/pcfx/sound/Blip_Buffer.h deleted file mode 100644 index a8e90ee053..0000000000 --- a/waterbox/pcfx/sound/Blip_Buffer.h +++ /dev/null @@ -1,498 +0,0 @@ -// Band-limited sound synthesis buffer -// Various changes and hacks for use in Mednafen. - -#ifdef __GNUC__ - #define blip_inline inline __attribute__((always_inline)) -#else - #define blip_inline inline -#endif - -#include -#include - -// Blip_Buffer 0.4.1 -#ifndef BLIP_BUFFER_H -#define BLIP_BUFFER_H - -// Internal -typedef int32_t blip_long; -typedef uint32_t blip_ulong; -typedef int64_t blip_s64; -typedef uint64_t blip_u64; - -// Time unit at source clock rate -typedef blip_long blip_time_t; - -// Output samples are 16-bit signed, with a range of -32768 to 32767 -typedef short blip_sample_t; -enum { blip_sample_max = 32767 }; - -class Blip_Buffer { -public: - typedef const char* blargg_err_t; - - // Set output sample rate and buffer length in milliseconds (1/1000 sec, defaults - // to 1/4 second), then clear buffer. Returns NULL on success, otherwise if there - // isn't enough memory, returns error without affecting current buffer setup. - blargg_err_t set_sample_rate( long samples_per_sec, int msec_length = 1000 / 4 ); - - // Set number of source time units per second - void clock_rate( long ); - - // End current time frame of specified duration and make its samples available - // (along with any still-unread samples) for reading with read_samples(). Begins - // a new time frame at the end of the current frame. - void end_frame( blip_time_t time ); - - // Read at most 'max_samples' out of buffer into 'dest', removing them from from - // the buffer. Returns number of samples actually read and removed. If stereo is - // true, increments 'dest' one extra time after writing each sample, to allow - // easy interleving of two channels into a stereo output buffer. - long read_samples( blip_sample_t* dest, long max_samples, int stereo = 0 ); - -// Additional optional features - - // Current output sample rate - long sample_rate() const; - - // Length of buffer, in milliseconds - int length() const; - - // Number of source time units per second - long clock_rate() const; - - // Set frequency high-pass filter frequency, where higher values reduce bass more - void bass_freq( int frequency ); - - // Number of samples delay from synthesis to samples read out - int output_latency() const; - - // Remove all available samples and clear buffer to silence. If 'entire_buffer' is - // false, just clears out any samples waiting rather than the entire buffer. - void clear( int entire_buffer = 1 ); - - // Number of samples available for reading with read_samples() - long samples_avail() const; - - // Remove 'count' samples from those waiting to be read - void remove_samples( long count ); - -// Experimental features - - // Count number of clocks needed until 'count' samples will be available. - // If buffer can't even hold 'count' samples, returns number of clocks until - // buffer becomes full. - blip_time_t count_clocks( long count ) const; - - // Number of raw samples that can be mixed within frame of specified duration. - long count_samples( blip_time_t duration ) const; - - // Mix 'count' samples from 'buf' into buffer. - void mix_samples( blip_sample_t const* buf, long count ); - - // not documented yet - void set_modified() { modified_ = 1; } - int clear_modified() { int b = modified_; modified_ = 0; return b; } - typedef blip_u64 blip_resampled_time_t; - void remove_silence( long count ); - blip_resampled_time_t resampled_duration( int t ) const { return t * factor_; } - blip_resampled_time_t resampled_time( blip_time_t t ) const { return t * factor_ + offset_; } - blip_resampled_time_t clock_rate_factor( long clock_rate ) const; -public: - Blip_Buffer(); - ~Blip_Buffer(); - - // Deprecated - typedef blip_resampled_time_t resampled_time_t; - blargg_err_t sample_rate( long r ) { return set_sample_rate( r ); } - blargg_err_t sample_rate( long r, int msec ) { return set_sample_rate( r, msec ); } -private: - // noncopyable - Blip_Buffer( const Blip_Buffer& ); - Blip_Buffer& operator = ( const Blip_Buffer& ); -public: - typedef blip_time_t buf_t_; - blip_u64 factor_; - blip_resampled_time_t offset_; - buf_t_* buffer_; - blip_long buffer_size_; - blip_long reader_accum_; - int bass_shift_; -private: - long sample_rate_; - long clock_rate_; - int bass_freq_; - int length_; - int modified_; - friend class Blip_Reader; -}; - -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#define BLIP_BUFFER_ACCURACY 32 -#define BLIP_PHASE_BITS 8 - -// Number of bits in resample ratio fraction. Higher values give a more accurate ratio -// but reduce maximum buffer size. -//#ifndef BLIP_BUFFER_ACCURACY -// #define BLIP_BUFFER_ACCURACY 16 -//#endif - -// Number bits in phase offset. Fewer than 6 bits (64 phase offsets) results in -// noticeable broadband noise when synthesizing high frequency square waves. -// Affects size of Blip_Synth objects since they store the waveform directly. -//#ifndef BLIP_PHASE_BITS -// #if BLIP_BUFFER_FAST -// #define BLIP_PHASE_BITS 8 -// #else -// #define BLIP_PHASE_BITS 6 -// #endif -//#endif - - // Internal - typedef blip_u64 blip_resampled_time_t; - int const blip_widest_impulse_ = 16; - int const blip_buffer_extra_ = blip_widest_impulse_ + 2; - int const blip_res = 1 << BLIP_PHASE_BITS; - class blip_eq_t; - - class Blip_Synth_Fast_ { - public: - Blip_Buffer* buf; - int last_amp; - int delta_factor; - - void volume_unit( double ); - Blip_Synth_Fast_(); - void treble_eq( blip_eq_t const& ) { } - }; - - class Blip_Synth_ { - public: - Blip_Buffer* buf; - int last_amp; - int delta_factor; - - void volume_unit( double ); - Blip_Synth_( short* impulses, int width ); - void treble_eq( blip_eq_t const& ); - private: - double volume_unit_; - short* const impulses; - int const width; - blip_long kernel_unit; - int impulses_size() const { return blip_res / 2 * width + 1; } - void adjust_impulse(); - }; - -// Quality level. Start with blip_good_quality. -const int blip_med_quality = 8; -const int blip_good_quality = 12; -const int blip_high_quality = 16; - -// Range specifies the greatest expected change in amplitude. Calculate it -// by finding the difference between the maximum and minimum expected -// amplitudes (max - min). -template -class Blip_Synth { -public: - // Set overall volume of waveform - void volume( double v ) { impl.volume_unit( v * (1.0 / (range < 0 ? -range : range)) ); } - - // Configure low-pass filter (see blip_buffer.txt) - void treble_eq( blip_eq_t const& eq ) { impl.treble_eq( eq ); } - - // Get/set Blip_Buffer used for output - Blip_Buffer* output() const { return impl.buf; } - void output( Blip_Buffer* b ) { impl.buf = b; impl.last_amp = 0; } - - // Update amplitude of waveform at given time. Using this requires a separate - // Blip_Synth for each waveform. - void update( blip_time_t time, int amplitude ); - -// Low-level interface - - // Add an amplitude transition of specified delta, optionally into specified buffer - // rather than the one set with output(). Delta can be positive or negative. - // The actual change in amplitude is delta * (volume / range) - void offset( blip_time_t, int delta, Blip_Buffer* ) const; - void offset( blip_time_t t, int delta ) const { offset( t, delta, impl.buf ); } - - // Works directly in terms of fractional output samples. Contact author for more info. - void offset_resampled( blip_resampled_time_t, int delta, Blip_Buffer* ) const; - - // Same as offset(), except code is inlined for higher performance - void offset_inline( blip_time_t t, int delta, Blip_Buffer* buf ) const { - offset_resampled( t * buf->factor_ + buf->offset_, delta, buf ); - } - void offset_inline( blip_time_t t, int delta ) const { - offset_resampled( t * impl.buf->factor_ + impl.buf->offset_, delta, impl.buf ); - } - -private: -#if BLIP_BUFFER_FAST - Blip_Synth_Fast_ impl; -#else - Blip_Synth_ impl; - typedef short imp_t; - imp_t impulses [blip_res * (quality / 2) + 1]; -public: - Blip_Synth() : impl( impulses, quality ) { } -#endif -}; - -// Low-pass equalization parameters -class blip_eq_t { -public: - // Logarithmic rolloff to treble dB at half sampling rate. Negative values reduce - // treble, small positive values (0 to 5.0) increase treble. - blip_eq_t( double treble_db = 0 ); - - // See blip_buffer.txt - blip_eq_t( double treble, long rolloff_freq, long sample_rate, long cutoff_freq = 0 ); - -private: - double treble; - long rolloff_freq; - long sample_rate; - long cutoff_freq; - void generate( float* out, int count ) const; - friend class Blip_Synth_; -}; - -int const blip_sample_bits = 30; - -// Dummy Blip_Buffer to direct sound output to, for easy muting without -// having to stop sound code. -class Silent_Blip_Buffer : public Blip_Buffer { - buf_t_ buf [blip_buffer_extra_ + 1]; -public: - // The following cannot be used (an assertion will fail if attempted): - blargg_err_t set_sample_rate( long samples_per_sec, int msec_length ); - blip_time_t count_clocks( long count ) const; - void mix_samples( blip_sample_t const* buf, long count ); - - Silent_Blip_Buffer(); -}; - - #if defined (__GNUC__) || _MSC_VER >= 1100 - #define BLIP_RESTRICT __restrict - #else - #define BLIP_RESTRICT - #endif - -// Optimized reading from Blip_Buffer, for use in custom sample output - -// Begin reading from buffer. Name should be unique to the current block. -#define BLIP_READER_BEGIN( name, blip_buffer ) \ - const Blip_Buffer::buf_t_* BLIP_RESTRICT name##_reader_buf = (blip_buffer).buffer_;\ - blip_long name##_reader_accum = (blip_buffer).reader_accum_ - -// Get value to pass to BLIP_READER_NEXT() -#define BLIP_READER_BASS( blip_buffer ) ((blip_buffer).bass_shift_) - -// Constant value to use instead of BLIP_READER_BASS(), for slightly more optimal -// code at the cost of having no bass control -int const blip_reader_default_bass = 9; - -// Current sample -#define BLIP_READER_READ( name ) (name##_reader_accum >> (blip_sample_bits - 16)) - -// Current raw sample in full internal resolution -#define BLIP_READER_READ_RAW( name ) (name##_reader_accum) - -// Advance to next sample -#define BLIP_READER_NEXT( name, bass ) \ - (void) (name##_reader_accum += *name##_reader_buf++ - (name##_reader_accum >> (bass))) - -// End reading samples from buffer. The number of samples read must now be removed -// using Blip_Buffer::remove_samples(). -#define BLIP_READER_END( name, blip_buffer ) \ - (void) ((blip_buffer).reader_accum_ = name##_reader_accum) - - -// Compatibility with older version -const long blip_unscaled = 65535; -const int blip_low_quality = blip_med_quality; -const int blip_best_quality = blip_high_quality; - -// Deprecated; use BLIP_READER macros as follows: -// Blip_Reader r; r.begin( buf ); -> BLIP_READER_BEGIN( r, buf ); -// int bass = r.begin( buf ) -> BLIP_READER_BEGIN( r, buf ); int bass = BLIP_READER_BASS( buf ); -// r.read() -> BLIP_READER_READ( r ) -// r.read_raw() -> BLIP_READER_READ_RAW( r ) -// r.next( bass ) -> BLIP_READER_NEXT( r, bass ) -// r.next() -> BLIP_READER_NEXT( r, blip_reader_default_bass ) -// r.end( buf ) -> BLIP_READER_END( r, buf ) -class Blip_Reader { -public: - int begin( Blip_Buffer& ); - blip_long read() const { return accum >> (blip_sample_bits - 16); } - blip_long read_raw() const { return accum; } - void next( int bass_shift = 9 ) { accum += *buf++ - (accum >> bass_shift); } - void end( Blip_Buffer& b ) { b.reader_accum_ = accum; } - -private: - const Blip_Buffer::buf_t_* buf; - blip_long accum; -}; - -// End of public interface - -#include - -template -blip_inline void Blip_Synth::offset_resampled( blip_resampled_time_t time, - int delta, Blip_Buffer* blip_buf ) const -{ - // Fails if time is beyond end of Blip_Buffer, due to a bug in caller code or the - // need for a longer buffer as set by set_sample_rate(). - assert( (blip_long) (time >> BLIP_BUFFER_ACCURACY) < blip_buf->buffer_size_ ); - delta *= impl.delta_factor; - blip_long* BLIP_RESTRICT buf = blip_buf->buffer_ + (time >> BLIP_BUFFER_ACCURACY); - int phase = (int) (time >> (BLIP_BUFFER_ACCURACY - BLIP_PHASE_BITS) & (blip_res - 1)); - -#if BLIP_BUFFER_FAST - blip_long left = buf [0] + delta; - - // Kind of crappy, but doing shift after multiply results in overflow. - // Alternate way of delaying multiply by delta_factor results in worse - // sub-sample resolution. - blip_long right = (delta >> BLIP_PHASE_BITS) * phase; - left -= right; - right += buf [1]; - - buf [0] = left; - buf [1] = right; -#else - - int const fwd = (blip_widest_impulse_ - quality) / 2; - int const rev = fwd + quality - 2; - int const mid = quality / 2 - 1; - - imp_t const* BLIP_RESTRICT imp = impulses + blip_res - phase; - - #if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \ - defined (__x86_64__) || defined (__ia64__) || defined (__i386__) - - // straight forward implementation resulted in better code on GCC for x86 - - #define ADD_IMP( out, in ) \ - buf [out] += (blip_long) imp [blip_res * (in)] * delta - - #define BLIP_FWD( i ) {\ - ADD_IMP( fwd + i, i );\ - ADD_IMP( fwd + 1 + i, i + 1 );\ - } - #define BLIP_REV( r ) {\ - ADD_IMP( rev - r, r + 1 );\ - ADD_IMP( rev + 1 - r, r );\ - } - - BLIP_FWD( 0 ) - if ( quality > 8 ) BLIP_FWD( 2 ) - if ( quality > 12 ) BLIP_FWD( 4 ) - { - ADD_IMP( fwd + mid - 1, mid - 1 ); - ADD_IMP( fwd + mid , mid ); - imp = impulses + phase; - } - if ( quality > 12 ) BLIP_REV( 6 ) - if ( quality > 8 ) BLIP_REV( 4 ) - BLIP_REV( 2 ) - - ADD_IMP( rev , 1 ); - ADD_IMP( rev + 1, 0 ); - - #else - - // for RISC processors, help compiler by reading ahead of writes - - #define BLIP_FWD( i ) {\ - blip_long t0 = i0 * delta + buf [fwd + i];\ - blip_long t1 = imp [blip_res * (i + 1)] * delta + buf [fwd + 1 + i];\ - i0 = imp [blip_res * (i + 2)];\ - buf [fwd + i] = t0;\ - buf [fwd + 1 + i] = t1;\ - } - #define BLIP_REV( r ) {\ - blip_long t0 = i0 * delta + buf [rev - r];\ - blip_long t1 = imp [blip_res * r] * delta + buf [rev + 1 - r];\ - i0 = imp [blip_res * (r - 1)];\ - buf [rev - r] = t0;\ - buf [rev + 1 - r] = t1;\ - } - - blip_long i0 = *imp; - BLIP_FWD( 0 ) - if ( quality > 8 ) BLIP_FWD( 2 ) - if ( quality > 12 ) BLIP_FWD( 4 ) - { - blip_long t0 = i0 * delta + buf [fwd + mid - 1]; - blip_long t1 = imp [blip_res * mid] * delta + buf [fwd + mid ]; - imp = impulses + phase; - i0 = imp [blip_res * mid]; - buf [fwd + mid - 1] = t0; - buf [fwd + mid ] = t1; - } - if ( quality > 12 ) BLIP_REV( 6 ) - if ( quality > 8 ) BLIP_REV( 4 ) - BLIP_REV( 2 ) - - blip_long t0 = i0 * delta + buf [rev ]; - blip_long t1 = *imp * delta + buf [rev + 1]; - buf [rev ] = t0; - buf [rev + 1] = t1; - #endif - -#endif -} - -#undef BLIP_FWD -#undef BLIP_REV - -template -#if BLIP_BUFFER_FAST - blip_inline -#endif -void Blip_Synth::offset( blip_time_t t, int delta, Blip_Buffer* buf ) const -{ - offset_resampled( t * buf->factor_ + buf->offset_, delta, buf ); -} - -template -#if BLIP_BUFFER_FAST - blip_inline -#endif -void Blip_Synth::update( blip_time_t t, int amp ) -{ - int delta = amp - impl.last_amp; - impl.last_amp = amp; - offset_resampled( t * impl.buf->factor_ + impl.buf->offset_, delta, impl.buf ); -} - -blip_inline blip_eq_t::blip_eq_t( double t ) : - treble( t ), rolloff_freq( 0 ), sample_rate( 44100 ), cutoff_freq( 0 ) { } -blip_inline blip_eq_t::blip_eq_t( double t, long rf, long sr, long cf ) : - treble( t ), rolloff_freq( rf ), sample_rate( sr ), cutoff_freq( cf ) { } - -blip_inline int Blip_Buffer::length() const { return length_; } -blip_inline long Blip_Buffer::samples_avail() const { return (long) (offset_ >> BLIP_BUFFER_ACCURACY); } -blip_inline long Blip_Buffer::sample_rate() const { return sample_rate_; } -blip_inline int Blip_Buffer::output_latency() const { return blip_widest_impulse_ / 2; } -blip_inline long Blip_Buffer::clock_rate() const { return clock_rate_; } -blip_inline void Blip_Buffer::clock_rate( long cps ) { factor_ = clock_rate_factor( clock_rate_ = cps ); } - -blip_inline int Blip_Reader::begin( Blip_Buffer& blip_buf ) -{ - buf = blip_buf.buffer_; - accum = blip_buf.reader_accum_; - return blip_buf.bass_shift_; -} - -int const blip_max_length = 0; -int const blip_default_length = 250; - -#endif diff --git a/waterbox/pcfx/sound/OwlResampler.cpp b/waterbox/pcfx/sound/OwlResampler.cpp deleted file mode 100644 index ea559b7176..0000000000 --- a/waterbox/pcfx/sound/OwlResampler.cpp +++ /dev/null @@ -1,803 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -// Don't pass more than about 40ms worth of audio data to Resample() -// at a time. - -#define _GNU_SOURCE -#include "../defs.h" -#include -#include -#include -#include "OwlResampler.h" -//#include "../cputest/cputest.h" - -#if defined(ARCH_POWERPC_ALTIVEC) && defined(HAVE_ALTIVEC_H) - #include -#endif - -#ifdef __ARM_NEON__ - #include -#endif - -#ifdef __FAST_MATH__ - #error "OwlResampler.cpp not compatible with unsafe math optimizations!" -#endif - -OwlBuffer::OwlBuffer() -{ - assert(sizeof(I32_F_Pudding) == 4); - assert(sizeof(float) == 4); - - memset(HRBuf, 0, sizeof(HRBuf)); - - accum = 0; - filter_state[0] = 0; - filter_state[1] = 0; - - leftover = 0; - - InputIndex = 0; - InputPhase = 0; - - debias = 0; -} - -OwlBuffer::~OwlBuffer() -{ -} - -template -static int32 ProcessLoop(unsigned count, int32 a, int32* b, int32* exmix0 = NULL, int32* exmix1 = NULL, unsigned lp_shift = 0, unsigned hp_shift = 0, int64* f_in = NULL) -{ - int64 lp_f; - int64 hp_f; - - if(Lowpass) - { - lp_f = f_in[0]; - } - - if(Highpass) - { - hp_f = f_in[1]; - } - - while(count--) - { - int32 tmp; - - if(Integrate) - { - a += *b; - tmp = a >> IntegrateShift; - } - else - tmp = *b; - - if(Lowpass) - { - lp_f += ((int64)((uint64)(int64)tmp << 16) - lp_f) >> lp_shift; - tmp = lp_f >> 16; - } - - if(Highpass) - { - hp_f += ((int64)((uint64)(int64)tmp << 16) - hp_f) >> hp_shift; - tmp = tmp - (hp_f >> 16); - } - - if(DoExMix >= 1) - { - tmp += *exmix0; - exmix0++; - } - - if(DoExMix >= 2) - { - tmp += *exmix1; - exmix1++; - } - - if(FloatOutput) - *(float*)b = tmp; - else - *b = tmp; - - b++; - } - - if(Lowpass) - f_in[0] = lp_f; - - if(Highpass) - f_in[1] = hp_f; - - return(a); -} - -void OwlBuffer::ResampleSkipped(unsigned count) -{ - memmove(HRBuf, &HRBuf[count], HRBUF_OVERFLOW_PADDING * sizeof(HRBuf[0])); - memset(&HRBuf[HRBUF_OVERFLOW_PADDING], 0, count * sizeof(HRBuf[0])); -} - -void OwlBuffer::Integrate(unsigned count, unsigned lp_shift, unsigned hp_shift, RavenBuffer* mixin0, RavenBuffer* mixin1) -{ - //lp_shift = hp_shift = 0; - if(lp_shift != 0 || hp_shift != 0) - { - if(mixin0 && mixin1) - accum = ProcessLoop<2, true, 3, true, true, true>(count, accum, Buf(), mixin0->Buf(), mixin1->Buf(), lp_shift, hp_shift, filter_state); - else if(mixin0) - accum = ProcessLoop<1, true, 3, true, true, true>(count, accum, Buf(), mixin0->Buf(), NULL, lp_shift, hp_shift, filter_state); - else - accum = ProcessLoop<0, true, 3, true, true, true>(count, accum, Buf(), NULL, NULL, lp_shift, hp_shift, filter_state); - } - else - { - if(mixin0 && mixin1) - accum = ProcessLoop<2, true, 3, false, false, true>(count, accum, Buf(), mixin0->Buf(), mixin1->Buf()); - else if(mixin0) - accum = ProcessLoop<1, true, 3, false, false, true>(count, accum, Buf(), mixin0->Buf()); - else - accum = ProcessLoop<0, true, 3, false, false, true>(count, accum, Buf()); - } - - if(accum >= 32767 * 256 * 8 || accum <= -32767 * 256 * 8) - { - //printf("Possible delta sample loss; accum=%d\n", accum); - } -} - -// -// -// - -RavenBuffer::RavenBuffer() -{ - memset(BB, 0, sizeof(BB)); - - accum = 0; - - filter_state[0] = 0; - filter_state[1] = 0; -} - - -RavenBuffer::~RavenBuffer() -{ - - - -} - - - -void RavenBuffer::Process(unsigned count, bool integrate, unsigned lp_shift) -{ - if(integrate) - { - if(lp_shift != 0) - accum = ProcessLoop<0, true, 3, true, false, false>(count, accum, Buf(), NULL, NULL, lp_shift, 0, filter_state); - else - accum = ProcessLoop<0, true, 3, false, false, false>(count, accum, Buf(), NULL, NULL, lp_shift, 0); - } - else - { - if(lp_shift != 0) - accum = ProcessLoop<0, false, 0, true, false, false>(count, accum, Buf(), NULL, NULL, lp_shift, 0, filter_state); - else - accum = ProcessLoop<0, false, 0, false, false, false>(count, accum, Buf(), NULL, NULL, lp_shift, 0); - } -} - -void RavenBuffer::Finish(unsigned count) -{ - memmove(BB, &BB[count], OwlBuffer::HRBUF_OVERFLOW_PADDING * sizeof(BB[0])); - memset(&BB[OwlBuffer::HRBUF_OVERFLOW_PADDING], 0, count * sizeof(BB[0])); -} - - - -static void kaiser_window( double* io, int count, double beta ) -{ - int const accuracy = 16; //12; - - double* end = io + count; - - double beta2 = beta * beta * (double) -0.25; - double to_fract = beta2 / ((double) count * count); - double i = 0; - double rescale = 0; // Doesn't need an initializer, to shut up gcc - - for ( ; io < end; ++io, i += 1 ) - { - double x = i * i * to_fract - beta2; - double u = x; - double k = x + 1; - - double n = 2; - do - { - u *= x / (n * n); - n += 1; - k += u; - } - while ( k <= u * (1 << accuracy) ); - - if ( !i ) - rescale = 1 / k; // otherwise values get large - - *io *= k * rescale; - } -} - -static void gen_sinc( double* out, int size, double cutoff, double kaiser ) -{ - assert( size % 2 == 0 ); // size must be enev - - int const half_size = size / 2; - double* const mid = &out [half_size]; - - // Generate right half of sinc - for ( int i = 0; i < half_size; i++ ) - { - double angle = (i * 2 + 1) * (M_PI / 2); - mid [i] = sin( angle * cutoff ) / angle; - } - - kaiser_window( mid, half_size, kaiser ); - - // Mirror for left half - for ( int i = 0; i < half_size; i++ ) - out [i] = mid [half_size - 1 - i]; -} - -static void normalize( double* io, int size, double gain = 1.0 ) -{ - double sum = 0; - for ( int i = 0; i < size; i++ ) - sum += io [i]; - - double scale = gain / sum; - for ( int i = 0; i < size; i++ ) - io [i] *= scale; -} - - -static INLINE void DoMAC(float *wave, float *coeffs, int32 count, int32 *accum_output) -{ - float acc[4] = { 0, 0, 0, 0 }; - - for(int c = 0; MDFN_LIKELY(c < count); c += 4) - { - acc[0] += wave[c + 0] * coeffs[c + 0]; - acc[1] += wave[c + 1] * coeffs[c + 1]; - acc[2] += wave[c + 2] * coeffs[c + 2]; - acc[3] += wave[c + 3] * coeffs[c + 3]; - } - - *accum_output = (acc[0] + acc[2]) + (acc[1] + acc[3]); -} - - - -#ifdef ARCH_X86 - #include "OwlResampler_x86.inc" -#endif - -#ifdef ARCH_POWERPC_ALTIVEC - #include "OwlResampler_altivec.inc" -#endif - -#ifdef __ARM_NEON__ - #include "OwlResampler_neon.inc" -#endif - - -template -static T SDP2(T v) -{ - T tmp; - - tmp = (v >> ((sizeof(T) * 8) - 1)) & (((T)1 << sa) - 1); - - return ((v + tmp) >> sa); -} - -enum -{ - SIMD_NONE = 0, - -#ifdef ARCH_X86 - SIMD_SSE_16X, - -#ifdef HAVE_INLINEASM_AVX - SIMD_AVX_32X, - SIMD_AVX_32X_P16, -#else - #warning "Compiling without AVX inline assembly." -#endif -#elif defined(ARCH_POWERPC_ALTIVEC) - SIMD_ALTIVEC, -#elif defined __ARM_NEON__ - SIMD_NEON -#endif -}; - -template -NO_INLINE int32 OwlResampler::T_Resample(OwlBuffer* in, const uint32 in_count, int16* out, const uint32 max_out_count, const bool reverse) -{ - if(reverse) - { - int32* a = in->Buf(); - int32* b = in->Buf() + in_count - 1; - - while(MDFN_LIKELY(a < b)) - { - std::swap(*a, *b); - a++; - b--; - } - } - - // - // - // - uint32 count = 0; - int32* I32Out = &IntermediateBuffer[0]; - const uint32 in_count_WLO = in->leftover + in_count; - const uint32 max = std::max(0, (int64)in_count_WLO - NumCoeffs); - uint32 InputPhase = in->InputPhase; - uint32 InputIndex = in->InputIndex; - OwlBuffer::I32_F_Pudding* InSamps = in->BufPudding() - in->leftover; - int32 leftover; - - if(MDFN_UNLIKELY(InputPhase >= NumPhases)) - { - fprintf(stderr, "[BUG] InputPhase >= NumPhases\n"); // Save states can also trigger this. - InputPhase = 0; - } - - while(InputIndex < max) - { - float* wave = &InSamps[InputIndex].f; - float* coeffs = &PInfos[InputPhase].Coeffs[0]; - int32 coeff_count = NumCoeffs; - - switch(TA_SIMD_Type) - { - default: - case SIMD_NONE: - DoMAC(wave, coeffs, coeff_count, I32Out); - break; - -#ifdef ARCH_X86 - case SIMD_SSE_16X: - DoMAC_SSE_16X(wave, coeffs, coeff_count, I32Out); - break; -#ifdef HAVE_INLINEASM_AVX - case SIMD_AVX_32X: - DoMAC_AVX_32X(wave, coeffs, coeff_count, I32Out); - break; - - case SIMD_AVX_32X_P16: - DoMAC_AVX_32X_P16(wave, coeffs, coeff_count, I32Out); - break; -#endif - -#elif defined(ARCH_POWERPC_ALTIVEC) - case SIMD_ALTIVEC: - DoMAC_AltiVec(wave, coeffs, coeff_count, I32Out); - break; -#elif defined __ARM_NEON__ - case SIMD_NEON: - DoMAC_NEON(wave, coeffs, coeff_count, I32Out); - break; -#endif - } - - I32Out++; - count++; - - InputPhase = PInfos[InputPhase].Next; - InputIndex += PInfos[InputPhase].Step; - } - -#if defined(ARCH_X86) && defined(HAVE_INLINEASM_AVX) - if(TA_SIMD_Type == SIMD_AVX_32X || TA_SIMD_Type == SIMD_AVX_32X_P16) - { - asm volatile("vzeroupper\n\t" : : : - #if defined(__AVX__) - "ymm0", "ymm1", "ymm2", "ymm3", "ymm4", "ymm5", "ymm6", "ymm7" - #if defined(__x86_64__) - , "ymm8", "ymm9", "ymm10", "ymm11", "ymm12", "ymm13", "ymm14", "ymm15" - #endif - #endif - ); - } -#endif - - if(InputIndex > in_count_WLO) - { - leftover = 0; - InputIndex -= in_count_WLO; - } - else - { - leftover = (int32)in_count_WLO - (int32)InputIndex; - InputIndex = 0; - } - -#if 0 - for(uint32 x = 0; x < count; x++) - { - int s = IntermediateBuffer[x] >> 8; - - if(s < -32768 || s > 32767) - { - //printf("Flow: %6d\n", s); - if(s < -32768) - s = -32768; - else if(s > 32767) - s = 32767; - } - out[x * 2] = s; - } -#else - { - int64 debias = in->debias; - - for(uint32 x = 0; x < count; x++) - { - int32 sample = IntermediateBuffer[x]; - int32 s; - - debias += (((int64)((uint64)(int64)sample << 16) - debias) * debias_multiplier) >> 16; - s = SDP2(sample - (debias >> 16)); - if(s < -32768 || s > 32767) - { - //printf("Flow: %6d\n", s); - if(s < -32768) - s = -32768; - else if(s > 32767) - s = 32767; - } - out[x * 2] = s; - } - - in->debias = debias; - } -#endif - memmove(in->Buf() - leftover, - in->Buf() + in_count - leftover, - sizeof(int32) * (leftover + OwlBuffer::HRBUF_OVERFLOW_PADDING)); - - memset(in->Buf() + OwlBuffer::HRBUF_OVERFLOW_PADDING, 0, sizeof(int32) * in_count); - - in->leftover = leftover; - in->InputPhase = InputPhase; - in->InputIndex = InputIndex; - - return count; -} - -void OwlResampler::ResetBufResampState(OwlBuffer* buf) -{ - memset(buf->HRBuf, 0, sizeof(buf->HRBuf[0]) * OwlBuffer::HRBUF_LEFTOVER_PADDING); - buf->InputPhase = 0; -} - - -OwlResampler::~OwlResampler() -{ - -} - -// -// Flush denormals, and coefficients that could lead to denormals, to zero. -// -static float FilterDenormal(float v) -{ - union - { - float f; - uint32 i; - } cat_pun; - - cat_pun.f = v; - - if(((cat_pun.i >> 23) & 0xFF) <= 24) // Maybe < 24 is more correct? - { - MDFN_printf("Small FP coefficient detected: 0x%08x --- raw_sign=%d, raw_exp=0x%02x, raw_mantissa=0x%06x\n", cat_pun.i, cat_pun.i >> 31, (cat_pun.i >> 23) & 0xFF, cat_pun.i & ((1U << 23) - 1)); - return(0); - } - - return(v); -} - -OwlResampler::OwlResampler(double input_rate, double output_rate, double rate_error, double debias_corner, int quality, double nyq_fudge) -{ - std::unique_ptr FilterBuf; - double ratio = (double)output_rate / input_rate; - double cutoff; - double required_bandwidth; - double k_beta; - double k_d; - - for(int i = 0; i < 256; i++) - { - int a = SDP2(i); - int b = SDP2(-i); - int c = i / (1 << 3); - - assert(a == -b && a == c); - } - - assert(sizeof(OwlBuffer::I32_F_Pudding) == 4); - - InputRate = input_rate; - OutputRate = output_rate; - RateError = rate_error; - DebiasCorner = debias_corner; - Quality = quality; - - IntermediateBuffer.resize(OutputRate * 4 / 50); // *4 for safety padding, / min(50,60), an approximate calculation - - const uint32 cpuext = 0; //cputest_get_flags(); - - MDFN_printf("OwlResampler.cpp debug info:\n"); - //MDFN_indent(1); - - // Get the number of phases required, and adjust ratio. - { - double s_ratio = (double)input_rate / output_rate; - double findo = 0; - uint32 count = 0; - uint32 findo_i; - - do - { - count++; - findo += s_ratio; - } while( fabs(1.0 - ((floor(0.5 + findo) / count) / s_ratio)) > rate_error); - - s_ratio = floor(0.5 + findo) / count; - findo_i = (uint32) floor(0.5 + findo); - ratio = 1 / s_ratio; - NumPhases = count; - - PInfos.resize(NumPhases); - - uint32 last_indoo = 0; - for(unsigned int i = 0; i < NumPhases; i++) - { - uint32 index_pos = i * findo_i / NumPhases; - - PInfos[i].Next = (i + 1) % (NumPhases); - PInfos[i].Step = index_pos - last_indoo; - last_indoo = index_pos; - } - PInfos[0].Step = findo_i - last_indoo; - - Ratio_Dividend = findo_i; - Ratio_Divisor = NumPhases; - - MDFN_printf("Phases: %d, Output rate: %f, %d %d\n", NumPhases, input_rate * ratio, Ratio_Dividend, Ratio_Divisor); - - MDFN_printf("Desired maximum rate error: %.10f, Actual rate error: %.10f\n", rate_error, fabs((double)input_rate / output_rate * ratio - 1)); - } - - static const struct - { - double beta; - double d; - double obw; - } QualityTable[7] = - { - { 5.658, 3.62, 0.65 }, - { 6.764, 4.32, 0.70 }, - { 7.865, 5.00, 0.75 }, - { 8.960, 5.70, 0.80 }, - { 10.056, 6.40, 0.85 }, - { 10.056, 6.40, 0.90 }, - - { 10.056, 6.40, 0.9333 }, // 1.0 - (6.40 / 96) - }; - - assert(quality >= 0 && quality <= 6); - - k_beta = QualityTable[quality].beta; - k_d = QualityTable[quality].d; - - - // - // As far as filter frequency response design goes, we clamp the output rate parameter - // to keep PCE CD and PC-FX CD-DA sample amplitudes from going wild since we're not resampling CD-DA totally properly. - // -#define OWLRESAMP_FCALC_RATE_CLAMP 128000.0 //192000.0 //96000.0 //48000.0 - - // A little SOMETHING to widen the transition band a bit to reduce computational complexity with higher output rates. - const double something = std::min(OWLRESAMP_FCALC_RATE_CLAMP, (48000.0 + std::min(OWLRESAMP_FCALC_RATE_CLAMP, output_rate)) / 2 / QualityTable[quality].obw); - - // - // Note: Cutoff calculation is performed again(though slightly differently) down below after the SIMD check. - // - cutoff = QualityTable[quality].obw * (std::min(something, std::min(input_rate, output_rate)) / input_rate); - - required_bandwidth = (std::min(OWLRESAMP_FCALC_RATE_CLAMP, std::min(input_rate, output_rate)) / input_rate) - cutoff; - - NumCoeffs = ceil(k_d / required_bandwidth); - - MDFN_printf("Initial number of coefficients per phase: %u\n", NumCoeffs); - MDFN_printf("Initial nominal cutoff frequency: %f\n", InputRate * cutoff / 2); - - // - // Put this lower limit BEFORE the SIMD stuff, otherwise the NumCoeffs calculation will be off. - // - if(NumCoeffs < 16) - NumCoeffs = 16; - - if(0) - { - abort(); // The sky is falling AAAAAAAAAAAAA - } - #ifdef ARCH_X86 - #ifdef HAVE_INLINEASM_AVX - else if((cpuext & CPUTEST_FLAG_AVX) && (NumCoeffs + 0xF) >= 32) - { - MDFN_printf("SIMD: AVX\n"); - - // AVX loop can't handle less than 32 MACs properly. - NumCoeffs = std::max(32, NumCoeffs); - - // Past 32 MACs, AVX loop granularity is 16 MACs(with some ugly maaaagic~) - NumCoeffs = (NumCoeffs + 0xF) &~ 0xF; - - if(NumCoeffs & 0x10) - Resample_ = &OwlResampler::T_Resample; - else - Resample_ = &OwlResampler::T_Resample; - } - #endif - else if(cpuext & CPUTEST_FLAG_SSE) - { - MDFN_printf("SIMD: SSE\n"); - - // SSE loop does 16 MACs per iteration. - NumCoeffs = (NumCoeffs + 0xF) &~ 0xF; - Resample_ = &OwlResampler::T_Resample; - } - #endif - #ifdef ARCH_POWERPC_ALTIVEC - else if(1) - { - MDFN_printf("SIMD: AltiVec\n"); - - // AltiVec loop does 16 MACs per iteration. - NumCoeffs = (NumCoeffs + 0xF) &~ 0xF; - Resample_ = &OwlResampler::T_Resample; - } - #endif - #ifdef __ARM_NEON__ - else if(1) - { - MDFN_printf("SIMD: NEON\n"); - - // NEON loop does 16 MACs per iteration. - NumCoeffs = (NumCoeffs + 0xF) &~ 0xF; - Resample_ = &OwlResampler::T_Resample; - } - #endif - else - { - // Default loop does 4 MACs per iteration. - NumCoeffs = (NumCoeffs + 3) &~ 3; - Resample_ = &OwlResampler::T_Resample; - } - // - // Don't alter NumCoeffs anymore from here on. - // - - #if !defined(ARCH_X86) && !defined(ARCH_POWERPC_ALTIVEC) && !defined(__ARM_NEON__) - #warning "OwlResampler is being compiled without SIMD support." - #endif - - // - // Adjust cutoff now that NumCoeffs may have been increased. - // - cutoff = std::min(QualityTable[quality].obw * something / input_rate, (std::min(input_rate, output_rate) / input_rate - ((double)k_d / NumCoeffs))); - - cutoff *= nyq_fudge; - if(ceil(cutoff) > 1.0) - cutoff = 1.0; - - - MDFN_printf("Adjusted number of coefficients per phase: %u\n", NumCoeffs); - MDFN_printf("Adjusted nominal cutoff frequency: %f\n", InputRate * cutoff / 2); - - assert(NumCoeffs <= OwlBuffer::HRBUF_LEFTOVER_PADDING); - - CoeffsBuffer.resize((256 / sizeof(float)) + NumCoeffs * NumPhases); - - for(unsigned int i = 0; i < NumPhases; i++) - PInfos[i].Coeffs = (float *)(((uintptr_t)&CoeffsBuffer[0] + 0xFF) &~ 0xFF) + (i * NumCoeffs); - - MDFN_printf("Impulse response table memory usage: %zu bytes\n", CoeffsBuffer.size() * sizeof(float)); - - FilterBuf.reset(new double[NumCoeffs * NumPhases]); - gen_sinc(&FilterBuf[0], NumCoeffs * NumPhases, cutoff / NumPhases, k_beta); - normalize(&FilterBuf[0], NumCoeffs * NumPhases); - - #if 0 - for(int i = 0; i < NumCoeffs * NumPhases; i++) - fprintf(stderr, "%.20f\n", FilterBuf[i]); - #endif - - for(unsigned int phase = 0; phase < NumPhases; phase++) - { - //double sum_d = 0; - //float sum_f4[4] = { 0, 0, 0, 0 }; - - const unsigned sp = (NumPhases - 1 - (((uint64)phase * Ratio_Dividend) % NumPhases)); - const unsigned tp = phase; - - for(unsigned int i = 0; i < NumCoeffs; i++) - { - double tmpcod = FilterBuf[i * NumPhases + sp] * NumPhases; // Tasty cod. - - PInfos[tp].Coeffs[i] = FilterDenormal(tmpcod); - //sum_d += PInfos[tp].Coeffs[i]; - //sum_f4[i % 4] += PInfos[tp].Coeffs[i]; - } - -#if 0 - { - double sf4t = (sum_f4[0] + sum_f4[2]) + (sum_f4[1] + sum_f4[3]); - double sd_div_sf4t = sum_d / sf4t; - - MDFN_printf("Phase %4u: sum_d=%.10f, sum_f4t=%.10f, sum_d div sum_f4t=%.10f(*65536=%f, dB=%.8f)\n", sp, sum_d, (double)sf4t, sd_div_sf4t, 65536.0 * sd_div_sf4t, fabs(20 * log10(sum_d / sf4t))); - } -#endif - } - - assert(debias_corner < (output_rate / 16)); - debias_multiplier = (uint32)(((uint64)1 << 16) * debias_corner / output_rate); - - //MDFN_indent(-1); - - //abort(); - - #if 0 - { - static float dummy_wave[1024]; - static float dummy_coeffs[1024]; - int32 dummy_out; - uint32 begin_time = MDFND_GetTime(); - - for(int i = 0; i < 1024 * 1024; i++) - { - DoMAC_AVX_32X(dummy_wave, dummy_coeffs, 1024, &dummy_out); - //DoMAC_SSE_16X(dummy_wave, dummy_coeffs, 1024, &dummy_out); - } - - printf("%u\n", MDFND_GetTime() - begin_time); - abort(); - } - #endif -} diff --git a/waterbox/pcfx/sound/OwlResampler.h b/waterbox/pcfx/sound/OwlResampler.h deleted file mode 100644 index 607c7c690b..0000000000 --- a/waterbox/pcfx/sound/OwlResampler.h +++ /dev/null @@ -1,159 +0,0 @@ -#ifndef __NES_FILTER_H -#define __NES_FILTER_H - -#include - -class OwlResampler; -class RavenBuffer; - -struct StateMem; - -class OwlBuffer -{ - public: - - enum { HRBUF_LEFTOVER_PADDING = 8192 }; - enum { HRBUF_OVERFLOW_PADDING = 32 }; // For deltas and impulse responses and whatnot that are dangling off the end(>= final timestamp) sorta. - - union I32_F_Pudding - { - int32 i32; - float f; - }; - - OwlBuffer(); - ~OwlBuffer(); - - INLINE int32* Buf(void) - { - return &HRBuf[HRBUF_LEFTOVER_PADDING].i32; - } - - INLINE I32_F_Pudding* BufPudding(void) - { - return &HRBuf[HRBUF_LEFTOVER_PADDING]; - } - - void Integrate(unsigned count, unsigned lp_shift = 0, unsigned hp_shift = 0, RavenBuffer* mixin0 = NULL, RavenBuffer* mixin1 = NULL); // Convenience function. - void ResampleSkipped(unsigned count); - - void ZeroLeftover(void); - - private: - - I32_F_Pudding HRBuf[HRBUF_LEFTOVER_PADDING + 65536 + HRBUF_OVERFLOW_PADDING]; - int32 accum; - int64 filter_state[2]; - - // - // Resampler state: - // - int32 leftover; - - // Index into the input buffer - uint32 InputIndex; - - // Current input phase - uint32 InputPhase; - - // DC bias removal filter thingy - int64 debias; - - friend class OwlResampler; -}; - -class RavenBuffer -{ - public: - - RavenBuffer(); - ~RavenBuffer(); - - INLINE int32* Buf(void) - { - return &BB[0]; - } - - void Process(unsigned count, bool integrate = true, uint32 lp_shift = 0); - void Finish(unsigned count); - - friend class OwlBuffer; - - private: - int32 BB[65536 + OwlBuffer::HRBUF_OVERFLOW_PADDING]; - int32 accum; - int64 filter_state[2]; -}; - -class OwlResampler -{ - public: - - // Resamples from input_rate to output_rate, allowing for rate_error(output_rate +/- output_rate*rate_error) - // error in the resample ratio. - // - // debias_corner is the cheap high-pass DC bias removal filter coefficient. Higher values will result in more bias removal(and - // case a high-pass filter effect), while lower values will lower this effect. It should be <= output_rate / 64, to be on the safe side(prevent - // multiplication overflow). A value of 0 will disable its effect. - // - // quality is an arbitrary control of quality(0 for lowest quality, 5 for highest quality) - // - // nyq_fudge may be a tasty sleep drug. - // - OwlResampler(double input_rate, double output_rate, double rate_error, double debias_corner, int quality, double nyq_fudge = 1.0) MDFN_COLD; - OwlResampler(const OwlResampler &resamp) MDFN_COLD; - ~OwlResampler() MDFN_COLD; - - INLINE int32 Resample(OwlBuffer* in, const uint32 in_count, int16* out, const uint32 max_out_count, const bool reverse = false) - { - return (this->*OwlResampler::Resample_)(in, in_count, out, max_out_count, reverse); - } - void ResetBufResampState(OwlBuffer* buf); - - // Get the InputRate / OutputRate ratio, expressed as a / b - void GetRatio(int32 *a, int32 *b) - { - *a = Ratio_Dividend; - *b = Ratio_Divisor; - } - - private: - - // Copy of the parameters passed to the constructor - double InputRate, OutputRate, RateError, DebiasCorner; - int Quality; - - // Number of phases. - uint32 NumPhases; - uint32 NumPhases_Padded; - - // Coefficients(in each phase, not total) - uint32 NumCoeffs; - - struct PhaseInfo - { - // One pointer for each phase - float* Coeffs; - - // In the FIR loop: InputPhase = PInfos[InputPhase].Next - uint32 Next; - - // Incrementor for InputIndex. In the FIR loop, after updating InputPhase: InputIndex += PInfos[InputPhase].Step - uint32 Step; - }; - - std::vector PInfos; - std::vector CoeffsBuffer; - std::vector IntermediateBuffer; //int32 boobuf[8192]; - - template - int32 T_Resample(OwlBuffer* in, const uint32 in_count, int16* out, const uint32 max_out_count, const bool reverse); - int32 (OwlResampler::*Resample_)(OwlBuffer* in, const uint32 in_count, int16* out, const uint32 max_out_count, const bool reverse); - - uint16 debias_multiplier; - - // for GetRatio() - int32 Ratio_Dividend; - int32 Ratio_Divisor; -}; -#endif diff --git a/waterbox/pcfx/sound/Stereo_Buffer.cpp b/waterbox/pcfx/sound/Stereo_Buffer.cpp deleted file mode 100644 index 6e65464685..0000000000 --- a/waterbox/pcfx/sound/Stereo_Buffer.cpp +++ /dev/null @@ -1,146 +0,0 @@ - -// Blip_Buffer 0.3.0. http://www.slack.net/~ant/nes-emu/ - -#include "Stereo_Buffer.h" - -/* Library Copyright (C) 2004 Shay Green. Blip_Buffer is free software; -you can redistribute it and/or modify it under the terms of the GNU -General Public License as published by the Free Software Foundation; -either version 2 of the License, or (at your option) any later version. -Stereo_Buffer is distributed in the hope that it will be useful, but -WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY -or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -for more details. You should have received a copy of the GNU General -Public License along with Stereo_Buffer; if not, write to the Free Software -Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ - -Stereo_Buffer::Stereo_Buffer() { - stereo_added = false; - was_stereo = false; -} - -Stereo_Buffer::~Stereo_Buffer() { -} - -bool Stereo_Buffer::set_sample_rate( long rate, int msec ) -{ - for ( int i = 0; i < buf_count; i++ ) { - if ( bufs [i].set_sample_rate( rate, msec ) ) - { - return false; - } - } - - return true; -} - -void Stereo_Buffer::clock_rate( long rate ) -{ - for ( int i = 0; i < buf_count; i++ ) - bufs [i].clock_rate( rate ); -} - -void Stereo_Buffer::bass_freq( int bass ) -{ - for ( unsigned i = 0; i < buf_count; i++ ) - bufs [i].bass_freq( bass ); -} - -void Stereo_Buffer::clear() -{ - stereo_added = false; - was_stereo = false; - for ( int i = 0; i < buf_count; i++ ) - bufs [i].clear(); -} - -void Stereo_Buffer::end_frame( blip_time_t clock_count, bool stereo ) -{ - for ( unsigned i = 0; i < buf_count; i++ ) - { - bufs [i].end_frame( clock_count ); - } - stereo_added |= stereo; -} - - - -long Stereo_Buffer::read_samples( blip_sample_t* out, long max_samples ) -{ - long count = bufs [0].samples_avail(); - if ( count > max_samples / 2 ) - count = max_samples / 2; - if ( count ) - { - if ( stereo_added || was_stereo ) - { - mix_stereo( out, count ); - - bufs [0].remove_samples( count ); - bufs [1].remove_samples( count ); - bufs [2].remove_samples( count ); - } - else - { - mix_mono( out, count ); - - bufs [0].remove_samples( count ); - - bufs [1].remove_silence( count ); - bufs [2].remove_silence( count ); - } - - // to do: this might miss opportunities for optimization - if ( !bufs [0].samples_avail() ) { - was_stereo = stereo_added; - stereo_added = false; - } - } - - return count * 2; -} - -void Stereo_Buffer::mix_stereo( blip_sample_t* out, long count ) -{ - Blip_Reader l_left; - Blip_Reader l_right; - Blip_Reader l_center; - - l_left.begin( bufs [1] ); - l_right.begin( bufs [2] ); - int bass = l_center.begin( bufs [0] ); - - while ( count-- ) - { - int c = l_center.read(); - out [0] = c + l_left.read(); - out [1] = c + l_right.read(); - out += 2; - - l_center.next( bass ); - l_left.next( bass ); - l_right.next( bass ); - } - - l_center.end( bufs [0] ); - l_right.end( bufs [2] ); - l_left.end( bufs [1] ); -} - -void Stereo_Buffer::mix_mono( blip_sample_t* out, long count ) -{ - Blip_Reader in; - int bass = in.begin( bufs [0] ); - - while ( count-- ) - { - int sample = in.read(); - out [0] = sample; - out [1] = sample; - out += 2; - in.next( bass ); - } - - in.end( bufs [0] ); -} - diff --git a/waterbox/pcfx/sound/Stereo_Buffer.h b/waterbox/pcfx/sound/Stereo_Buffer.h deleted file mode 100644 index 3d907fac54..0000000000 --- a/waterbox/pcfx/sound/Stereo_Buffer.h +++ /dev/null @@ -1,69 +0,0 @@ - -// Simple stereo Blip_Buffer for sound emulators whose oscillators output -// either on the left only, center, or right only. - -// Blip_Buffer 0.3.0. Copyright (C) 2003-2004 Shay Green. GNU GPL license. - -#ifndef STEREO_BUFFER_H -#define STEREO_BUFFER_H - -#include "Blip_Buffer.h" - -class Stereo_Buffer { -public: - Stereo_Buffer(); - ~Stereo_Buffer(); - - // Same as in Blip_Buffer (see Blip_Buffer.h) - bool set_sample_rate( long, int msec = 0 ); - void clock_rate( long ); - void bass_freq( int ); - void clear(); - - // Buffers to output synthesis to - Blip_Buffer* left(); - Blip_Buffer* center(); - Blip_Buffer* right(); - - // Same as in Blip_Buffer. For more efficient operation, pass false - // for was_stereo if the left and right buffers had nothing added - // to them for this frame. - void end_frame( blip_time_t, bool was_stereo = true ); - - // Output is stereo with channels interleved, left before right. Counts - // are in samples, *not* pairs. - long samples_avail() const; - long read_samples( blip_sample_t*, long ); - -private: - // noncopyable - Stereo_Buffer( const Stereo_Buffer& ); - Stereo_Buffer& operator = ( const Stereo_Buffer& ); - - enum { buf_count = 3 }; - Blip_Buffer bufs [buf_count]; - bool stereo_added; - bool was_stereo; - - void mix_stereo( blip_sample_t*, long ); - void mix_mono( blip_sample_t*, long ); -}; - - inline Blip_Buffer* Stereo_Buffer::left() { - return &bufs [1]; - } - - inline Blip_Buffer* Stereo_Buffer::center() { - return &bufs [0]; - } - - inline Blip_Buffer* Stereo_Buffer::right() { - return &bufs [2]; - } - - inline long Stereo_Buffer::samples_avail() const { - return bufs [0].samples_avail(); - } - -#endif - diff --git a/waterbox/pcfx/soundbox.cpp b/waterbox/pcfx/soundbox.cpp deleted file mode 100644 index 6a56b0a5ef..0000000000 --- a/waterbox/pcfx/soundbox.cpp +++ /dev/null @@ -1,677 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* soundbox.cpp: -** Copyright (C) 2006-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "pcfx.h" -#include "soundbox.h" -#include "king.h" -#include "cdrom/cdromif.h" -#include "cdrom/scsicd.h" -#include "pce_psg/pce_psg.h" -#include "sound/OwlResampler.h" - -#include -#include - -namespace MDFN_IEN_PCFX -{ - -static const int StepSizes[49] = - { - 16, 17, 19, 21, 23, 25, 28, 31, 34, 37, 41, 45, 50, - 55, 60, 66, 73, 80, 88, 97, 107, 118, 130, 143, 157, - 173, 190, 209, 230, 253, 279, 307, 337, 371, 408, 449, - 494, 544, 598, 658, 724, 796, 876, 963, 1060, 1166, 1282, 1411, 1552}; - -static const int StepIndexDeltas[16] = - { - -1, -1, -1, -1, 2, 4, 6, 8, - -1, -1, -1, -1, 2, 4, 6, 8}; - -static OwlResampler *FXres = NULL; -static OwlBuffer *FXsbuf[2] = {NULL, NULL}; -RavenBuffer *FXCDDABufs[2] = {NULL, NULL}; // Used in the CDROM code - -static PCE_PSG *pce_psg = NULL; - -static bool SoundEnabled; -static uint32 adpcm_lastts; - -struct SoundBox -{ - uint16 ADPCMControl; - uint8 ADPCMVolume[2][2]; // ADPCMVolume[channel(0 or 1)][left(0) or right(1)] - uint8 CDDAVolume[2]; - int32 bigdiv; - int32 smalldiv; - - int64 ResetAntiClick[2]; - double VolumeFiltered[2][2]; - double vf_xv[2][2][1 + 1], vf_yv[2][2][1 + 1]; - - int32 ADPCMDelta[2]; - int32 ADPCMHaveDelta[2]; - - int32 ADPCMPredictor[2]; - int32 StepSizeIndex[2]; - - uint32 ADPCMWhichNibble[2]; - uint16 ADPCMHalfWord[2]; - bool ADPCMHaveHalfWord[2]; - - int32 ADPCM_last[2][2]; -}; - -static SoundBox sbox; -static double ADPCMVolTable[0x40]; - -static bool EmulateBuggyCodec; // If true, emulate the buggy codec/algorithm used by an official PC-FX ADPCM encoder, rather than how the - // hardware actually works. -static bool ResetAntiClickEnabled; // = true; - -#ifdef WANT_DEBUGGER - -enum -{ - GSREG_ADPCM_CTRL = _PSG_GSREG_COUNT, - GSREG_ADPCM0_LVOL, - GSREG_ADPCM0_RVOL, - - GSREG_ADPCM1_LVOL, - GSREG_ADPCM1_RVOL, - - GSREG_ADPCM0_CUR, - GSREG_ADPCM1_CUR, - - GSREG_CDDA_LVOL, - GSREG_CDDA_RVOL -}; - -#define CHPDMOO(n) \ - {0, "--CH" #n "--:", "", 0xFFFF}, \ - {PSG_GSREG_CH0_FREQ | (n << 8), "Freq", "PSG Ch" #n " Frequency(Period)", 2}, \ - {PSG_GSREG_CH0_CTRL | (n << 8), "Ctrl", "PSG Ch" #n " Control", 1}, \ - {PSG_GSREG_CH0_BALANCE | (n << 8), "Balance", "PSG Ch" #n " Balance", 1}, \ - {PSG_GSREG_CH0_WINDEX | (n << 8), "WIndex", "PSG Ch" #n " Waveform Index", 1}, \ - { \ - PSG_GSREG_CH0_SCACHE | (n << 8), "SCache", "PSG Ch" #n " Sample Cache", 1 \ - } - -static const RegType SBoxRegs[] = - { - {PSG_GSREG_SELECT, "Select", "PSG Channel Select", 1}, - {PSG_GSREG_GBALANCE, "GBal", "PSG Global Balance", 1}, - {PSG_GSREG_LFOFREQ, "LFOFreq", "PSG LFO Freq", 1}, - {PSG_GSREG_LFOCTRL, "LFOCtrl", "PSG LFO Control", 1}, - - CHPDMOO(0), - CHPDMOO(1), - CHPDMOO(2), - CHPDMOO(3), - CHPDMOO(4), - {PSG_GSREG_CH4_NCTRL, "NCtrl", "PSG Ch4 Noise Control", 1}, - {PSG_GSREG_CH4_LFSR, "LFSR", "PSG Ch4 Noise LFSR", 0x100 | 18}, - CHPDMOO(5), - {PSG_GSREG_CH5_NCTRL, "NCtrl", "PSG Ch5 Noise Control", 1}, - {PSG_GSREG_CH5_LFSR, "LFSR", "PSG Ch5 Noise LFSR", 0x100 | 18}, - - {0, "--ADPCM:--", "", 0xFFFF}, - - {GSREG_ADPCM_CTRL, "Ctrl", "ADPCM Control", 2}, - {GSREG_ADPCM0_LVOL, "CH0LVol", "ADPCM Ch0 Left Volume", 1}, - {GSREG_ADPCM0_RVOL, "CH0RVol", "ADPCM Ch0 Right Volume", 1}, - {GSREG_ADPCM1_LVOL, "CH1LVol", "ADPCM Ch1 Left Volume", 1}, - {GSREG_ADPCM1_RVOL, "CH1RVol", "ADPCM Ch1 Right Volume", 1}, - - {GSREG_ADPCM0_CUR, "CH0Prc", "ADPCM Ch0 Predictor Value", 2}, - {GSREG_ADPCM1_CUR, "CH1Prc", "ADPCM Ch1 Predictor Value", 2}, - - {0, "--CD-DA:--", "", 0xFFFF}, - {GSREG_CDDA_LVOL, "CDLVol", "CD-DA Left Volume", 1}, - {GSREG_CDDA_RVOL, "CDRVol", "CD-DA Right Volume", 1}, - {0, "", "", 0}, -}; - -static uint32 SBoxDBG_GetRegister(const unsigned int id, char *special, const uint32 special_len) -{ - uint32 value = 0xDEADBEEF; - - switch (id) - { - case GSREG_ADPCM_CTRL: - value = sbox.ADPCMControl; - if (special) - { - int tmp_freq = 32 / (1 << (value & 0x3)); - trio_snprintf(special, special_len, "Frequency: ~%dKHz, Ch0 Interpolation: %s, Ch1 Interpolation: %s, Ch0 Reset: %d, Ch1 Reset: %d", tmp_freq, (value & 0x4) ? "On" : "Off", (value & 0x8) ? "On" : "Off", - (int)(bool)(value & 0x10), (int)(bool)(value & 0x20)); - } - break; - - case GSREG_ADPCM0_LVOL: - value = sbox.ADPCMVolume[0][0]; - break; - - case GSREG_ADPCM0_RVOL: - value = sbox.ADPCMVolume[0][1]; - break; - - case GSREG_ADPCM1_LVOL: - value = sbox.ADPCMVolume[1][0]; - break; - - case GSREG_ADPCM1_RVOL: - value = sbox.ADPCMVolume[1][1]; - break; - - case GSREG_CDDA_LVOL: - value = sbox.CDDAVolume[0]; - break; - - case GSREG_CDDA_RVOL: - value = sbox.CDDAVolume[1]; - break; - - case GSREG_ADPCM0_CUR: - value = sbox.ADPCMPredictor[0] + 0x4000; - break; - - case GSREG_ADPCM1_CUR: - value = sbox.ADPCMPredictor[1] + 0x4000; - break; - - default: - value = pce_psg->GetRegister(id, special, special_len); - break; - } - return (value); -} - -static void SBoxDBG_SetRegister(const unsigned int id, uint32 value) -{ - if (id < _PSG_GSREG_COUNT) - pce_psg->SetRegister(id, value); - else - switch (id) - { - case GSREG_ADPCM_CTRL: - sbox.ADPCMControl = value & 0xFFFF; - break; - - case GSREG_ADPCM0_LVOL: - sbox.ADPCMVolume[0][0] = value & 0x3F; - break; - - case GSREG_ADPCM0_RVOL: - sbox.ADPCMVolume[0][1] = value & 0x3F; - break; - - case GSREG_ADPCM1_LVOL: - sbox.ADPCMVolume[1][0] = value & 0x3F; - break; - - case GSREG_ADPCM1_RVOL: - sbox.ADPCMVolume[1][1] = value & 0x3F; - break; - - case GSREG_CDDA_LVOL: - sbox.CDDAVolume[0] = value & 0x3F; - SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); - break; - - case GSREG_CDDA_RVOL: - sbox.CDDAVolume[1] = value & 0x3F; - SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); - break; - - case GSREG_ADPCM0_CUR: - sbox.ADPCMPredictor[0] = ((int32)value & 0x7FFF) - 0x4000; - break; - - case GSREG_ADPCM1_CUR: - sbox.ADPCMPredictor[1] = ((int32)value & 0x7FFF) - 0x4000; - break; - } -} - -static const RegGroupType SBoxRegsGroup = - { - "SndBox", - SBoxRegs, - SBoxDBG_GetRegister, - SBoxDBG_SetRegister}; - -#endif - -static void RedoVolume(void) -{ - pce_psg->SetVolume(0.681); //0.227 * 0.50); - //ADPCMSynth.volume(0.50); -} - -bool SoundBox_SetSoundRate(uint32 rate) -{ - SoundEnabled = (bool)rate; - - if (FXres) - { - delete FXres; - FXres = NULL; - } - - if (rate > 0) - { - FXres = new OwlResampler(PCFX_MASTER_CLOCK / 12, rate, Setting_ResampRateError, 20, Setting_ResampQuality); - - for (unsigned i = 0; i < 2; i++) - FXres->ResetBufResampState(FXsbuf[i]); - } - - RedoVolume(); - - return (TRUE); -} - -void SoundBox_Init(bool arg_EmulateBuggyCodec, bool arg_ResetAntiClickEnabled) -{ - adpcm_lastts = 0; - SoundEnabled = false; - - EmulateBuggyCodec = arg_EmulateBuggyCodec; - ResetAntiClickEnabled = arg_ResetAntiClickEnabled; - - for (unsigned i = 0; i < 2; i++) - { - FXsbuf[i] = new OwlBuffer(); - FXCDDABufs[i] = new RavenBuffer(); - } - - pce_psg = new PCE_PSG(FXsbuf[0]->Buf(), FXsbuf[1]->Buf(), PCE_PSG::REVISION_HUC6280A); - -#ifdef WANT_DEBUGGER - MDFNDBG_AddRegGroup(&SBoxRegsGroup); -#endif - - memset(&sbox, 0, sizeof(sbox)); - - // Build ADPCM volume table, 1.5dB per step, ADPCM volume settings of 0x0 through 0x1B result in silence. - for (int x = 0; x < 0x40; x++) - { - double flub = 1; - int vti = 0x3F - x; - - if (x) - flub /= pow(2, (double)1 / 4 * x); - - if (vti <= 0x1B) - ADPCMVolTable[vti] = 0; - else - ADPCMVolTable[vti] = flub; - } -} - -/* Macro to access currently selected PSG channel */ -void SoundBox_Write(uint32 A, uint16 V, const v810_timestamp_t timestamp) -{ - A &= 0x3F; - - if (A < 0x20) - { - pce_psg->Write(timestamp / 3, A >> 1, V); - } - else - { - //printf("%04x %04x %d\n", A, V, timestamp); - switch (A & 0x3F) - { - //default: printf("HARUM: %04x %04x\n", A, V); break; - case 0x20: - SoundBox_ADPCMUpdate(timestamp); - for (int ch = 0; ch < 2; ch++) - { - if (!(sbox.ADPCMControl & (0x10 << ch)) && (V & (0x10 << ch))) - { - //printf("Reset: %d\n", ch); - - if (ResetAntiClickEnabled) - { - sbox.ResetAntiClick[ch] += (int64)((uint64)sbox.ADPCMPredictor[ch] << 32); - if (sbox.ResetAntiClick[ch] > ((int64)0x3FFF << 32)) - sbox.ResetAntiClick[ch] = (int64)0x3FFF << 32; - if (sbox.ResetAntiClick[ch] < -((int64)0x4000 << 32)) - sbox.ResetAntiClick[ch] = -((int64)0x4000 << 32); - } - - sbox.ADPCMPredictor[ch] = 0; - sbox.StepSizeIndex[ch] = 0; - } - } - sbox.ADPCMControl = V; - break; - - case 0x22: - SoundBox_ADPCMUpdate(timestamp); - sbox.ADPCMVolume[0][0] = V & 0x3F; - break; - - case 0x24: - SoundBox_ADPCMUpdate(timestamp); - sbox.ADPCMVolume[0][1] = V & 0x3F; - break; - - case 0x26: - SoundBox_ADPCMUpdate(timestamp); - sbox.ADPCMVolume[1][0] = V & 0x3F; - break; - - case 0x28: - SoundBox_ADPCMUpdate(timestamp); - sbox.ADPCMVolume[1][1] = V & 0x3F; - break; - - case 0x2A: - sbox.CDDAVolume[0] = V & 0x3F; - SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); - break; - - case 0x2C: - sbox.CDDAVolume[1] = V & 0x3F; - SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); - break; - } - } -} - -static uint32 KINGADPCMControl; - -void SoundBox_SetKINGADPCMControl(uint32 value) -{ - KINGADPCMControl = value; -} - -/* Digital filter designed by mkfilter/mkshape/gencode A.J. Fisher - Command line: /www/usr/fisher/helpers/mkfilter -Bu -Lp -o 1 -a 1.5888889125e-04 0.0000000000e+00 -l */ -static void DoVolumeFilter(int ch, int lr) -{ - sbox.vf_xv[ch][lr][0] = sbox.vf_xv[ch][lr][1]; - sbox.vf_xv[ch][lr][1] = (double)ADPCMVolTable[sbox.ADPCMVolume[ch][lr]] / 2.004348738e+03; - - sbox.vf_yv[ch][lr][0] = sbox.vf_yv[ch][lr][1]; - sbox.vf_yv[ch][lr][1] = (sbox.vf_xv[ch][lr][0] + sbox.vf_xv[ch][lr][1]) + (0.9990021696 * sbox.vf_yv[ch][lr][0]); - sbox.VolumeFiltered[ch][lr] = sbox.vf_yv[ch][lr][1]; -} - -static const int16 ADPCM_PhaseFilter[8][7] = - { - /* 0 */ {40, 283, 654, 683, 331, 56, 1}, // 2048 - /* 1 */ {28, 238, 618, 706, 381, 75, 2}, // 2048 - /* 2 */ {19, 197, 577, 720, 432, 99, 4}, // 2048 - /* 3 */ {12, 160, 532, 726, 483, 128, 7}, // 2048 - /* 4 */ {7, 128, 483, 726, 532, 160, 12}, // 2048 - /* 5 */ {4, 99, 432, 720, 577, 197, 19}, // 2048 - /* 6 */ {2, 75, 381, 706, 618, 238, 28}, // 2048 - /* 7 */ {1, 56, 331, 683, 654, 283, 40}, // 2048 -}; - -v810_timestamp_t SoundBox_ADPCMUpdate(const v810_timestamp_t timestamp) -{ - int32 run_time = timestamp - adpcm_lastts; - - adpcm_lastts = timestamp; - - sbox.bigdiv -= run_time * 2; - - while (sbox.bigdiv <= 0) - { - sbox.smalldiv--; - while (sbox.smalldiv <= 0) - { - sbox.smalldiv += 1 << ((KINGADPCMControl >> 2) & 0x3); - for (int ch = 0; ch < 2; ch++) - { - // Keep playing our last halfword fetched even if KING ADPCM is disabled - if (sbox.ADPCMHaveHalfWord[ch] || KINGADPCMControl & (1 << ch)) - { - if (!sbox.ADPCMWhichNibble[ch]) - { - sbox.ADPCMHalfWord[ch] = KING_GetADPCMHalfWord(ch); - sbox.ADPCMHaveHalfWord[ch] = TRUE; - } - - // If the channel's reset bit is set, don't update its ADPCM state. - if (sbox.ADPCMControl & (0x10 << ch)) - { - sbox.ADPCMDelta[ch] = 0; - } - else - { - uint8 nibble = (sbox.ADPCMHalfWord[ch] >> (sbox.ADPCMWhichNibble[ch])) & 0xF; - int32 BaseStepSize = StepSizes[sbox.StepSizeIndex[ch]]; - - //if(!ch) - //printf("Nibble: %02x\n", nibble); - - if (EmulateBuggyCodec) - { - if (BaseStepSize == 1552) - BaseStepSize = 1522; - - sbox.ADPCMDelta[ch] = BaseStepSize * ((nibble & 0x7) + 1) * 2; - } - else - sbox.ADPCMDelta[ch] = BaseStepSize * ((nibble & 0x7) + 1); - - // Linear interpolation turned on? - if (sbox.ADPCMControl & (0x4 << ch)) - sbox.ADPCMDelta[ch] >>= (KINGADPCMControl >> 2) & 0x3; - - if (nibble & 0x8) - sbox.ADPCMDelta[ch] = -sbox.ADPCMDelta[ch]; - - sbox.StepSizeIndex[ch] += StepIndexDeltas[nibble]; - - if (sbox.StepSizeIndex[ch] < 0) - sbox.StepSizeIndex[ch] = 0; - - if (sbox.StepSizeIndex[ch] > 48) - sbox.StepSizeIndex[ch] = 48; - } - sbox.ADPCMHaveDelta[ch] = 1; - - // Linear interpolation turned on? - if (sbox.ADPCMControl & (0x4 << ch)) - sbox.ADPCMHaveDelta[ch] = 1 << ((KINGADPCMControl >> 2) & 0x3); - - sbox.ADPCMWhichNibble[ch] = (sbox.ADPCMWhichNibble[ch] + 4) & 0xF; - - if (!sbox.ADPCMWhichNibble[ch]) - sbox.ADPCMHaveHalfWord[ch] = FALSE; - } - } // for(int ch...) - } // while(sbox.smalldiv <= 0) - - const uint32 synthtime42 = (timestamp << 1) + sbox.bigdiv; - const uint32 synthtime14 = synthtime42 / 3; - const uint32 synthtime = synthtime14 >> 3; - const unsigned synthtime_phase = synthtime14 & 7; - - //printf("Phase: %d, %d\n", synthtime42 % 24, (synthtime42 / 3) & 7); - - for (int ch = 0; ch < 2; ch++) - { - //if(!ch) - //{ - // printf("%d\n", synthtime - last_synthtime); - // last_synthtime = synthtime; - //} - - if (sbox.ADPCMHaveDelta[ch]) - { - sbox.ADPCMPredictor[ch] += sbox.ADPCMDelta[ch]; - - sbox.ADPCMHaveDelta[ch]--; - - if (sbox.ADPCMPredictor[ch] > 0x3FFF) - { - sbox.ADPCMPredictor[ch] = 0x3FFF; /*printf("Overflow: %d\n", ch);*/ - } - if (sbox.ADPCMPredictor[ch] < -0x4000) - { - sbox.ADPCMPredictor[ch] = -0x4000; /*printf("Underflow: %d\n", ch);*/ - } - } - else - { - } - - if (SoundEnabled) - { - int32 samp[2]; - - if (EmulateBuggyCodec) - { - samp[0] = (int32)(((sbox.ADPCMPredictor[ch] >> 1) + (sbox.ResetAntiClick[ch] >> 33)) * sbox.VolumeFiltered[ch][0]); - samp[1] = (int32)(((sbox.ADPCMPredictor[ch] >> 1) + (sbox.ResetAntiClick[ch] >> 33)) * sbox.VolumeFiltered[ch][1]); - } - else - { - samp[0] = (int32)((sbox.ADPCMPredictor[ch] + (sbox.ResetAntiClick[ch] >> 32)) * sbox.VolumeFiltered[ch][0]); - samp[1] = (int32)((sbox.ADPCMPredictor[ch] + (sbox.ResetAntiClick[ch] >> 32)) * sbox.VolumeFiltered[ch][1]); - } -#if 0 - printf("%d, %f %f\n", ch, sbox.VolumeFiltered[ch][0], sbox.VolumeFiltered[ch][1]); - - { - static int inv = 0x1FFF; - - samp[0] = samp[1] = inv; - - if(ch == 1) - inv = -inv; - } -#endif - for (unsigned y = 0; y < 2; y++) - { - const int32 delta = samp[y] - sbox.ADPCM_last[ch][y]; - int32 *tb = FXsbuf[y]->Buf() + (synthtime & 0xFFFF); - const int16 *coeffs = ADPCM_PhaseFilter[synthtime_phase]; - - for (unsigned c = 0; c < 7; c++) - { - int32 tmp = delta * coeffs[c]; - - tb[c] += tmp; - } - } - - sbox.ADPCM_last[ch][0] = samp[0]; - sbox.ADPCM_last[ch][1] = samp[1]; - } - } - - for (int ch = 0; ch < 2; ch++) - { - sbox.ResetAntiClick[ch] -= sbox.ResetAntiClick[ch] >> 8; - //if(ch) - // MDFN_DispMessage("%d", (int)(sbox.ResetAntiClick[ch] >> 32)); - } - - for (int ch = 0; ch < 2; ch++) - for (int lr = 0; lr < 2; lr++) - { - DoVolumeFilter(ch, lr); - } - sbox.bigdiv += 1365 * 2 / 2; - } - - return (timestamp + (sbox.bigdiv + 1) / 2); -} - -int32 SoundBox_Flush(const v810_timestamp_t end_timestamp, v810_timestamp_t *new_base_timestamp, int16 *SoundBuf, const int32 MaxSoundFrames, const bool reverse) -{ - const uint32 end_timestamp_div3 = end_timestamp / 3; - const uint32 end_timestamp_div12 = end_timestamp / 12; - const uint32 end_timestamp_mod12 = end_timestamp % 12; - const unsigned rsc = std::min(65536, end_timestamp_div12); - int32 FrameCount = 0; - - *new_base_timestamp = end_timestamp_mod12; - - pce_psg->Update(end_timestamp_div3); - - for (unsigned y = 0; y < 2; y++) - { - if (SoundEnabled && FXres) - { - FXsbuf[y]->Integrate(rsc, 0, 0, FXCDDABufs[y]); - FrameCount = FXres->Resample(FXsbuf[y], rsc, SoundBuf + y, MaxSoundFrames, reverse); - } - else - FXsbuf[y]->ResampleSkipped(rsc); - - FXCDDABufs[y]->Finish(rsc); - } - - return (FrameCount); -} - -void SoundBox_ResetTS(const v810_timestamp_t ts_base) -{ - pce_psg->ResetTS(ts_base / 3); - adpcm_lastts = ts_base; -} - -void SoundBox_Reset(const v810_timestamp_t timestamp) -{ - SoundBox_ADPCMUpdate(timestamp); - pce_psg->Power(timestamp / 3); - - sbox.ADPCMControl = 0; - - memset(&sbox.vf_xv, 0, sizeof(sbox.vf_xv)); - memset(&sbox.vf_yv, 0, sizeof(sbox.vf_yv)); - - for (int lr = 0; lr < 2; lr++) - { - for (int ch = 0; ch < 2; ch++) - { - sbox.ADPCMVolume[ch][lr] = 0; - sbox.VolumeFiltered[ch][lr] = 0; - } - - sbox.CDDAVolume[lr] = 0; - } - - for (int ch = 0; ch < 2; ch++) - { - sbox.ADPCMPredictor[ch] = 0; - sbox.StepSizeIndex[ch] = 0; - } - - memset(sbox.ADPCMWhichNibble, 0, sizeof(sbox.ADPCMWhichNibble)); - memset(sbox.ADPCMHalfWord, 0, sizeof(sbox.ADPCMHalfWord)); - memset(sbox.ADPCMHaveHalfWord, 0, sizeof(sbox.ADPCMHaveHalfWord)); - - SCSICD_SetCDDAVolume(0.50f * sbox.CDDAVolume[0] / 63, 0.50f * sbox.CDDAVolume[1] / 63); - - sbox.bigdiv = 2; // TODO: KING->SBOX ADPCM Synch //(1365 - 85 * 4) * 2; //1365 * 2 / 2; - sbox.smalldiv = 0; -} -} diff --git a/waterbox/pcfx/soundbox.h b/waterbox/pcfx/soundbox.h deleted file mode 100644 index bd5e4564d0..0000000000 --- a/waterbox/pcfx/soundbox.h +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* soundbox.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef _PCFX_SOUNDBOX_H -#define _PCFX_SOUNDBOX_H - -namespace MDFN_IEN_PCFX -{ - -bool SoundBox_SetSoundRate(uint32 rate); -int32 SoundBox_Flush(const v810_timestamp_t timestamp, v810_timestamp_t* new_base_timestamp, int16 *SoundBuf, const int32 MaxSoundFrames, const bool reverse); -void SoundBox_Write(uint32 A, uint16 V, const v810_timestamp_t timestamp); -void SoundBox_Init(bool arg_EmulateBuggyCodec, bool arg_ResetAntiClickEnabled) MDFN_COLD; - -void SoundBox_Reset(const v810_timestamp_t timestamp) MDFN_COLD; - -void SoundBox_SetKINGADPCMControl(uint32); - -v810_timestamp_t SoundBox_ADPCMUpdate(const v810_timestamp_t timestamp); - -void SoundBox_ResetTS(const v810_timestamp_t ts_base); - -} - -#include "sound/Blip_Buffer.h" -#include "sound/Stereo_Buffer.h" -#endif diff --git a/waterbox/pcfx/timer.cpp b/waterbox/pcfx/timer.cpp deleted file mode 100644 index 1308d05d8a..0000000000 --- a/waterbox/pcfx/timer.cpp +++ /dev/null @@ -1,175 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* timer.cpp: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* - TODO: Determine if the interrupt request bit can be manually set even if timer enable and/or timer int enable bits are 0. -*/ - - -#include "pcfx.h" -#include "interrupt.h" -#include "timer.h" - -namespace MDFN_IEN_PCFX -{ - -static uint16 control; -static uint16 period; -static int32 counter; - -static int32 lastts; - -static INLINE v810_timestamp_t CalcNextEventTS(const v810_timestamp_t timestamp) -{ - return((control & 0x2) ? (timestamp + counter) : PCFX_EVENT_NONONO); -} - -#define EFF_PERIOD ((period ? period : 0x10000) * 15) - -v810_timestamp_t FXTIMER_Update(const v810_timestamp_t timestamp) -{ - if(control & 0x2) - { - int32 cycles = timestamp - lastts; - counter -= cycles; - while(counter <= 0) - { - counter += EFF_PERIOD; - if(control & 0x1) - { - control |= 0x4; - PCFXIRQ_Assert(PCFXIRQ_SOURCE_TIMER, TRUE); - } - } - } - - lastts = timestamp; - - return(CalcNextEventTS(timestamp)); -} - -void FXTIMER_ResetTS(int32 ts_base) -{ - lastts = ts_base; -} - -uint16 FXTIMER_Read16(uint32 A, const v810_timestamp_t timestamp) -{ - FXTIMER_Update(timestamp); - switch(A & 0xFC0) - { - default: return(0); - - case 0xF00: return(control); - - case 0xF80: return(period); - - case 0xFC0: return((counter + 14) / 15); - } - return(0); -} - -uint8 FXTIMER_Read8(uint32 A, const v810_timestamp_t timestamp) -{ - FXTIMER_Update(timestamp); - return(FXTIMER_Read16(A&~1, timestamp) >> ((A & 1) * 8)); -} - -void FXTIMER_Write16(uint32 A, uint16 V, const v810_timestamp_t timestamp) -{ - FXTIMER_Update(timestamp); - - switch(A & 0xFC0) - { - default: break; - - case 0xF00: if(!(control & 0x2) && (V & 0x2)) - counter = EFF_PERIOD; - control = V & 0x7; - - if(V & 0x4) - FXDBG("Timer control write with D2 set?"); - - PCFXIRQ_Assert(PCFXIRQ_SOURCE_TIMER, (bool)(control & 0x4)); - PCFX_SetEvent(PCFX_EVENT_TIMER, CalcNextEventTS(timestamp)); - break; - - case 0xF80: period = V; - PCFX_SetEvent(PCFX_EVENT_TIMER, CalcNextEventTS(timestamp)); - break; - } -} - -uint32 FXTIMER_GetRegister(const unsigned int id, char *special, const uint32 special_len) -{ - uint32 value = 0xDEADBEEF; - - switch(id) - { - case FXTIMER_GSREG_TCTRL: - value = control; - if(special) - { - trio_snprintf(special, special_len, "Counting Enabled: %d, IRQ Enabled: %d, IRQ Asserted: %d", (int)(bool)(control & 2), (int)(bool)(control & 1), (int)(bool)(control & 4)); - } - break; - - case FXTIMER_GSREG_TPRD: - value = period; - if(special) - { - trio_snprintf(special, special_len, "Effective Period: %d; 21477272 / %d = %fHz", EFF_PERIOD, EFF_PERIOD, (double)21477272 / (EFF_PERIOD)); - } - break; - - case FXTIMER_GSREG_TCNTR: - value = counter; - if(special) - { - //trio_snprintf(buf, 256, "Pad: %d, ??: %d, Timer: %d, Reset: %d", - //*special = std::string(buf); - } - break; - } - - return value; -} - -void FXTIMER_SetRegister(const unsigned int id, uint32 value) -{ - - -} - -void FXTIMER_Reset(void) -{ - control = 0; - period = 0; - counter = 0; -} - -void FXTIMER_Init(void) -{ - lastts = 0; - FXTIMER_Reset(); -} - -} diff --git a/waterbox/pcfx/timer.h b/waterbox/pcfx/timer.h deleted file mode 100644 index 253e6c5a29..0000000000 --- a/waterbox/pcfx/timer.h +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************/ -/* Mednafen NEC PC-FX Emulation Module */ -/******************************************************************************/ -/* timer.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __PCFX_TIMER_H -#define __PCFX_TIMER_H - -namespace MDFN_IEN_PCFX -{ - -void FXTIMER_Write16(uint32 A, uint16 V, const v810_timestamp_t timestamp); -uint16 FXTIMER_Read16(uint32 A, const v810_timestamp_t timestamp); -uint8 FXTIMER_Read8(uint32 A, const v810_timestamp_t timestamp); -v810_timestamp_t FXTIMER_Update(const v810_timestamp_t timestamp); -void FXTIMER_ResetTS(int32 ts_base); -void FXTIMER_Reset(void) MDFN_COLD; - -void FXTIMER_Init(void) MDFN_COLD; - -enum -{ - FXTIMER_GSREG_TCTRL = 0, - FXTIMER_GSREG_TPRD, - FXTIMER_GSREG_TCNTR -}; - -uint32 FXTIMER_GetRegister(const unsigned int id, char *special, const uint32 special_len); -void FXTIMER_SetRegister(const unsigned int id, uint32 value); - -} - -#endif diff --git a/waterbox/pcfx/v810/v810_cpu.cpp b/waterbox/pcfx/v810/v810_cpu.cpp deleted file mode 100644 index 0fd018cfc8..0000000000 --- a/waterbox/pcfx/v810/v810_cpu.cpp +++ /dev/null @@ -1,1534 +0,0 @@ -/* V810 Emulator - * - * Copyright (C) 2006 David Tucker - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -/* Alternatively, the V810 emulator code(and all V810 emulation header files) can be used/distributed under the following license(you can adopt either - license exclusively for your changes by removing one of these license headers, but it's STRONGLY preferable - to keep your changes dual-licensed as well): - -This Reality Boy emulator is copyright (C) David Tucker 1997-2008, all rights -reserved. You may use this code as long as you make no money from the use of -this code and you acknowledge the original author (Me). I reserve the right to -dictate who can use this code and how (Just so you don't do something stupid -with it). - Most Importantly, this code is swap ware. If you use It send along your new -program (with code) or some other interesting tidbits you wrote, that I might be -interested in. - This code is in beta, there are bugs! I am not responsible for any damage -done to your computer, reputation, ego, dog, or family life due to the use of -this code. All source is provided as is, I make no guaranties, and am not -responsible for anything you do with the code (legal or otherwise). - Virtual Boy is a trademark of Nintendo, and V810 is a trademark of NEC. I am -in no way affiliated with either party and all information contained hear was -found freely through public domain sources. -*/ - -////////////////////////////////////////////////////////// -// CPU routines - -#include "../defs.h" -#include "../emulibc/emulibc.h" - -//#include "pcfx.h" -//#include "debug.h" - -#include -#include - -#include "v810_opt.h" -#include "v810_cpu.h" -#include "v810_cpuD.h" - -V810::V810() -{ -#ifdef WANT_DEBUGGER - CPUHook = NULL; - ADDBT = NULL; -#endif - - MemRead8 = NULL; - MemRead16 = NULL; - MemRead32 = NULL; - - IORead8 = NULL; - IORead16 = NULL; - IORead32 = NULL; - - MemWrite8 = NULL; - MemWrite16 = NULL; - MemWrite32 = NULL; - - IOWrite8 = NULL; - IOWrite16 = NULL; - IOWrite32 = NULL; - - memset(FastMap, 0, sizeof(FastMap)); - - memset(MemReadBus32, 0, sizeof(MemReadBus32)); - memset(MemWriteBus32, 0, sizeof(MemWriteBus32)); - - v810_timestamp = 0; - next_event_ts = 0x7FFFFFFF; -} - -V810::~V810() -{ -} - -INLINE void V810::RecalcIPendingCache(void) -{ - IPendingCache = 0; - - // Of course don't generate an interrupt if there's not one pending! - if (ilevel < 0) - return; - - // If CPU is halted because of a fatal exception, don't let an interrupt - // take us out of this halted status. - if (Halted == HALT_FATAL_EXCEPTION) - return; - - // If the NMI pending, exception pending, and/or interrupt disabled bit - // is set, don't accept any interrupts. - if (S_REG[PSW] & (PSW_NP | PSW_EP | PSW_ID)) - return; - - // If the interrupt level is lower than the interrupt enable level, don't - // accept it. - if (ilevel < (int)((S_REG[PSW] & PSW_IA) >> 16)) - return; - - IPendingCache = 0xFF; -} - -// TODO: "An interrupt that occurs during restore/dump/clear operation is internally held and is accepted after the -// operation in progress is finished. The maskable interrupt is held internally only when the EP, NP, and ID flags -// of PSW are all 0." -// -// This behavior probably doesn't have any relevance on the PC-FX, unless we're sadistic -// and try to restore cache from an interrupt acknowledge register or dump it to a register -// controlling interrupt masks... I wanna be sadistic~ - -void V810::CacheClear(v810_timestamp_t ×tamp, uint32 start, uint32 count) -{ - //printf("Cache clear: %08x %08x\n", start, count); - for (uint32 i = 0; i < count && (i + start) < 128; i++) - memset(&Cache[i + start], 0, sizeof(V810_CacheEntry_t)); -} - -INLINE void V810::CacheOpMemStore(v810_timestamp_t ×tamp, uint32 A, uint32 V) -{ - if (MemWriteBus32[A >> 24]) - { - timestamp += 2; - MemWrite32(timestamp, A, V); - } - else - { - timestamp += 2; - MemWrite16(timestamp, A, V & 0xFFFF); - - timestamp += 2; - MemWrite16(timestamp, A | 2, V >> 16); - } -} - -INLINE uint32 V810::CacheOpMemLoad(v810_timestamp_t ×tamp, uint32 A) -{ - if (MemReadBus32[A >> 24]) - { - timestamp += 2; - return (MemRead32(timestamp, A)); - } - else - { - uint32 ret; - - timestamp += 2; - ret = MemRead16(timestamp, A); - - timestamp += 2; - ret |= MemRead16(timestamp, A | 2) << 16; - return (ret); - } -} - -void V810::CacheDump(v810_timestamp_t ×tamp, const uint32 SA) -{ - printf("Cache dump: %08x\n", SA); - - for (int i = 0; i < 128; i++) - { - CacheOpMemStore(timestamp, SA + i * 8 + 0, Cache[i].data[0]); - CacheOpMemStore(timestamp, SA + i * 8 + 4, Cache[i].data[1]); - } - - for (int i = 0; i < 128; i++) - { - uint32 icht = Cache[i].tag | ((int)Cache[i].data_valid[0] << 22) | ((int)Cache[i].data_valid[1] << 23); - - CacheOpMemStore(timestamp, SA + 1024 + i * 4, icht); - } -} - -void V810::CacheRestore(v810_timestamp_t ×tamp, const uint32 SA) -{ - printf("Cache restore: %08x\n", SA); - - for (int i = 0; i < 128; i++) - { - Cache[i].data[0] = CacheOpMemLoad(timestamp, SA + i * 8 + 0); - Cache[i].data[1] = CacheOpMemLoad(timestamp, SA + i * 8 + 4); - } - - for (int i = 0; i < 128; i++) - { - uint32 icht; - - icht = CacheOpMemLoad(timestamp, SA + 1024 + i * 4); - - Cache[i].tag = icht & ((1 << 22) - 1); - Cache[i].data_valid[0] = (icht >> 22) & 1; - Cache[i].data_valid[1] = (icht >> 23) & 1; - } -} - -INLINE uint32 V810::RDCACHE(v810_timestamp_t ×tamp, uint32 addr) -{ - const int CI = (addr >> 3) & 0x7F; - const int SBI = (addr & 4) >> 2; - - if (Cache[CI].tag == (addr >> 10)) - { - if (!Cache[CI].data_valid[SBI]) - { - timestamp += 2; // or higher? Penalty for cache miss seems to be higher than having cache disabled. - if (MemReadBus32[addr >> 24]) - Cache[CI].data[SBI] = MemRead32(timestamp, addr & ~0x3); - else - { - timestamp++; - - uint32 tmp; - - tmp = MemRead16(timestamp, addr & ~0x3); - tmp |= MemRead16(timestamp, (addr & ~0x3) | 0x2) << 16; - - Cache[CI].data[SBI] = tmp; - } - Cache[CI].data_valid[SBI] = TRUE; - } - } - else - { - Cache[CI].tag = addr >> 10; - - timestamp += 2; // or higher? Penalty for cache miss seems to be higher than having cache disabled. - if (MemReadBus32[addr >> 24]) - Cache[CI].data[SBI] = MemRead32(timestamp, addr & ~0x3); - else - { - timestamp++; - - uint32 tmp; - - tmp = MemRead16(timestamp, addr & ~0x3); - tmp |= MemRead16(timestamp, (addr & ~0x3) | 0x2) << 16; - - Cache[CI].data[SBI] = tmp; - } - //Cache[CI].data[SBI] = MemRead32(timestamp, addr & ~0x3); - Cache[CI].data_valid[SBI] = TRUE; - Cache[CI].data_valid[SBI ^ 1] = FALSE; - } - - //{ - // // Caution: This can mess up DRAM page change penalty timings - // uint32 dummy_timestamp = 0; - // if(Cache[CI].data[SBI] != mem_rword(addr & ~0x3, dummy_timestamp)) - // { - // printf("Cache/Real Memory Mismatch: %08x %08x/%08x\n", addr & ~0x3, Cache[CI].data[SBI], mem_rword(addr & ~0x3, dummy_timestamp)); - // } - //} - - return (Cache[CI].data[SBI]); -} - -INLINE uint16 V810::RDOP(v810_timestamp_t ×tamp, uint32 addr, uint32 meow) -{ - uint16 ret; - - if (S_REG[CHCW] & 0x2) - { - uint32 d32 = RDCACHE(timestamp, addr); - ret = d32 >> ((addr & 2) * 8); - } - else - { - timestamp += meow; //++; - ret = MemRead16(timestamp, addr); - } - return (ret); -} - -#define BRANCH_ALIGN_CHECK(x) \ - { \ - if ((S_REG[CHCW] & 0x2) && (x & 0x2)) \ - { \ - ADDCLOCK(1); \ - } \ - } - -// Reinitialize the defaults in the CPU -void V810::Reset() -{ -#ifdef WANT_DEBUGGER - if (ADDBT) - ADDBT(GetPC(), 0xFFFFFFF0, 0xFFF0); -#endif - memset(&Cache, 0, sizeof(Cache)); - - memset(P_REG, 0, sizeof(P_REG)); - memset(S_REG, 0, sizeof(S_REG)); - memset(Cache, 0, sizeof(Cache)); - - P_REG[0] = 0x00000000; - SetPC(0xFFFFFFF0); - - S_REG[ECR] = 0x0000FFF0; - S_REG[PSW] = 0x00008000; - - if (VBMode) - S_REG[PIR] = 0x00005346; - else - S_REG[PIR] = 0x00008100; - - S_REG[TKCW] = 0x000000E0; - Halted = HALT_NONE; - ilevel = -1; - - lastop = 0; - - in_bstr = FALSE; - - RecalcIPendingCache(); -} - -bool V810::Init(V810_Emu_Mode mode, bool vb_mode) -{ - EmuMode = mode; - VBMode = vb_mode; - - in_bstr = FALSE; - in_bstr_to = 0; - - if (mode == V810_EMU_MODE_FAST) - { - memset(DummyRegion, 0, V810_FAST_MAP_PSIZE); - - for (unsigned int i = V810_FAST_MAP_PSIZE; i < V810_FAST_MAP_PSIZE + V810_FAST_MAP_TRAMPOLINE_SIZE; i += 2) - { - DummyRegion[i + 0] = 0; - DummyRegion[i + 1] = 0x36 << 2; - } - - for (uint64 A = 0; A < (1ULL << 32); A += V810_FAST_MAP_PSIZE) - FastMap[A / V810_FAST_MAP_PSIZE] = DummyRegion - A; - } - - return (TRUE); -} - -void V810::SetInt(int level) -{ - assert(level >= -1 && level <= 15); - - ilevel = level; - RecalcIPendingCache(); -} - -uint8 *V810::SetFastMap(uint32 addresses[], uint32 length, unsigned int num_addresses, const char *name, bool writable) -{ - for (unsigned int i = 0; i < num_addresses; i++) - { - assert((addresses[i] & (V810_FAST_MAP_PSIZE - 1)) == 0); - } - assert((length & (V810_FAST_MAP_PSIZE - 1)) == 0); - - uint8 *ret = (uint8 *)(writable ? alloc_plain(length + V810_FAST_MAP_TRAMPOLINE_SIZE) : alloc_sealed(length + V810_FAST_MAP_TRAMPOLINE_SIZE)); - - for (unsigned int i = length; i < length + V810_FAST_MAP_TRAMPOLINE_SIZE; i += 2) - { - ret[i + 0] = 0; - ret[i + 1] = 0x36 << 2; - } - - for (unsigned int i = 0; i < num_addresses; i++) - { - for (uint64 addr = addresses[i]; addr != (uint64)addresses[i] + length; addr += V810_FAST_MAP_PSIZE) - { - //printf("%08x, %d, %s\n", addr, length, name); - - FastMap[addr / V810_FAST_MAP_PSIZE] = ret - addresses[i]; - } - } - - return ret; -} - -void V810::SetMemReadBus32(uint8 A, bool value) -{ - MemReadBus32[A] = value; -} - -void V810::SetMemWriteBus32(uint8 A, bool value) -{ - MemWriteBus32[A] = value; -} - -void V810::SetMemReadHandlers(uint8 MDFN_FASTCALL (*read8)(v810_timestamp_t &, uint32), uint16 MDFN_FASTCALL (*read16)(v810_timestamp_t &, uint32), uint32 MDFN_FASTCALL (*read32)(v810_timestamp_t &, uint32)) -{ - MemRead8 = read8; - MemRead16 = read16; - MemRead32 = read32; -} - -void V810::SetMemWriteHandlers(void MDFN_FASTCALL (*write8)(v810_timestamp_t &, uint32, uint8), void MDFN_FASTCALL (*write16)(v810_timestamp_t &, uint32, uint16), void MDFN_FASTCALL (*write32)(v810_timestamp_t &, uint32, uint32)) -{ - MemWrite8 = write8; - MemWrite16 = write16; - MemWrite32 = write32; -} - -void V810::SetIOReadHandlers(uint8 MDFN_FASTCALL (*read8)(v810_timestamp_t &, uint32), uint16 MDFN_FASTCALL (*read16)(v810_timestamp_t &, uint32), uint32 MDFN_FASTCALL (*read32)(v810_timestamp_t &, uint32)) -{ - IORead8 = read8; - IORead16 = read16; - IORead32 = read32; -} - -void V810::SetIOWriteHandlers(void MDFN_FASTCALL (*write8)(v810_timestamp_t &, uint32, uint8), void MDFN_FASTCALL (*write16)(v810_timestamp_t &, uint32, uint16), void MDFN_FASTCALL (*write32)(v810_timestamp_t &, uint32, uint32)) -{ - IOWrite8 = write8; - IOWrite16 = write16; - IOWrite32 = write32; -} - -INLINE void V810::SetFlag(uint32 n, bool condition) -{ - S_REG[PSW] &= ~n; - - if (condition) - S_REG[PSW] |= n; -} - -INLINE void V810::SetSZ(uint32 value) -{ - SetFlag(PSW_Z, !value); - SetFlag(PSW_S, value & 0x80000000); -} - -#ifdef WANT_DEBUGGER -void V810::CheckBreakpoints(void (*callback)(int type, uint32 address, uint32 value, unsigned int len), uint16 MDFN_FASTCALL (*peek16)(const v810_timestamp_t, uint32), uint32 MDFN_FASTCALL (*peek32)(const v810_timestamp_t, uint32)) -{ - unsigned int opcode; - uint16 tmpop; - uint16 tmpop_high; - int32 ws_dummy = v810_timestamp; - uint32 tmp_PC = GetPC(); - - tmpop = peek16(ws_dummy, tmp_PC); - tmpop_high = peek16(ws_dummy, tmp_PC + 2); - - opcode = tmpop >> 10; - - // Uncomment this out later if necessary. - //if((tmpop & 0xE000) == 0x8000) // Special opcode format for - // opcode = (tmpop >> 9) & 0x7F; // type III instructions. - - switch (opcode) - { - case CAXI: - break; - - default: - break; - - case LD_B: - callback(BPOINT_READ, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFF, 0, 1); - break; - case LD_H: - callback(BPOINT_READ, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFE, 0, 2); - break; - case LD_W: - callback(BPOINT_READ, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFC, 0, 4); - break; - - case ST_B: - callback(BPOINT_WRITE, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFF, P_REG[(tmpop >> 5) & 0x1F] & 0x00FF, 1); - break; - case ST_H: - callback(BPOINT_WRITE, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFE, P_REG[(tmpop >> 5) & 0x1F] & 0xFFFF, 2); - break; - case ST_W: - callback(BPOINT_WRITE, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFC, P_REG[(tmpop >> 5) & 0x1F], 4); - break; - - case IN_B: - callback(BPOINT_IO_READ, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFF, 0, 1); - break; - case IN_H: - callback(BPOINT_IO_READ, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFE, 0, 2); - break; - case IN_W: - callback(BPOINT_IO_READ, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFC, 0, 4); - break; - - case OUT_B: - callback(BPOINT_IO_WRITE, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFF, P_REG[(tmpop >> 5) & 0x1F] & 0xFF, 1); - break; - case OUT_H: - callback(BPOINT_IO_WRITE, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFE, P_REG[(tmpop >> 5) & 0x1F] & 0xFFFF, 2); - break; - case OUT_W: - callback(BPOINT_IO_WRITE, (sign_16(tmpop_high) + P_REG[tmpop & 0x1F]) & 0xFFFFFFFC, P_REG[(tmpop >> 5) & 0x1F], 4); - break; - } -} -#endif - -#define SetPREG(n, val) \ - { \ - P_REG[n] = val; \ - } - -INLINE void V810::SetSREG(v810_timestamp_t ×tamp, unsigned int which, uint32 value) -{ - switch (which) - { - default: // Reserved - printf("LDSR to reserved system register: 0x%02x : 0x%08x\n", which, value); - break; - - case ECR: // Read-only - break; - - case PIR: // Read-only (obviously) - break; - - case TKCW: // Read-only - break; - - case EIPSW: - case FEPSW: - S_REG[which] = value & 0xFF3FF; - break; - - case PSW: - S_REG[which] = value & 0xFF3FF; - RecalcIPendingCache(); - break; - - case EIPC: - case FEPC: - S_REG[which] = value & 0xFFFFFFFE; - break; - - case ADDTRE: - S_REG[ADDTRE] = value & 0xFFFFFFFE; - printf("Address trap(unemulated): %08x\n", value); - break; - - case CHCW: - S_REG[CHCW] = value & 0x2; - - switch (value & 0x31) - { - default: - printf("Undefined cache control bit combination: %08x\n", value); - break; - - case 0x00: - break; - - case 0x01: - CacheClear(timestamp, (value >> 20) & 0xFFF, (value >> 8) & 0xFFF); - break; - - case 0x10: - CacheDump(timestamp, value & ~0xFF); - break; - - case 0x20: - CacheRestore(timestamp, value & ~0xFF); - break; - } - break; - } -} - -INLINE uint32 V810::GetSREG(unsigned int which) -{ - uint32 ret; - - if (which != 24 && which != 25 && which >= 8) - { - printf("STSR from reserved system register: 0x%02x", which); - } - - ret = S_REG[which]; - - return (ret); -} - -#define RB_SETPC(new_pc_raw) \ - { \ - const uint32 new_pc = new_pc_raw; /* So RB_SETPC(RB_GETPC()) won't mess up */ \ - if (RB_AccurateMode) \ - PC = new_pc; \ - else \ - { \ - PC_ptr = &FastMap[(new_pc) >> V810_FAST_MAP_SHIFT][(new_pc)]; \ - PC_base = PC_ptr - (new_pc); \ - } \ - } - -#define RB_PCRELCHANGE(delta) \ - { \ - if (RB_AccurateMode) \ - PC += (delta); \ - else \ - { \ - uint32 PC_tmp = RB_GETPC(); \ - PC_tmp += (delta); \ - RB_SETPC(PC_tmp); \ - } \ - } - -#define RB_INCPCBY2() \ - { \ - if (RB_AccurateMode) \ - PC += 2; \ - else \ - PC_ptr += 2; \ - } -#define RB_INCPCBY4() \ - { \ - if (RB_AccurateMode) \ - PC += 4; \ - else \ - PC_ptr += 4; \ - } - -#define RB_DECPCBY2() \ - { \ - if (RB_AccurateMode) \ - PC -= 2; \ - else \ - PC_ptr -= 2; \ - } -#define RB_DECPCBY4() \ - { \ - if (RB_AccurateMode) \ - PC -= 4; \ - else \ - PC_ptr -= 4; \ - } - -// Define accurate mode defines -#define RB_GETPC() PC -#define RB_RDOP(PC_offset, ...) RDOP(timestamp, PC + PC_offset, ##__VA_ARGS__) - -void V810::Run_Accurate(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) -{ - const bool RB_AccurateMode = true; - -#define RB_ADDBT(n, o, p) -#define RB_CPUHOOK(n) - -#include "v810_oploop.inc" - -#undef RB_CPUHOOK -#undef RB_ADDBT -} - -#ifdef WANT_DEBUGGER - -/* Make sure class member variable v810_timestamp is synchronized to our local copy, since we'll read it externally if a system - reset/power occurs when in step mode or similar. -*/ -#define RB_CPUHOOK_DBG(n) \ - { \ - if (CPUHook) \ - { \ - v810_timestamp = timestamp_rl; \ - CPUHook(timestamp_rl, n); \ - } \ - } - -void V810::Run_Accurate_Debug(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) -{ - const bool RB_AccurateMode = true; - -#define RB_ADDBT(n, o, p) \ - { \ - if (ADDBT) \ - ADDBT(n, o, p); \ - } -/* Make sure class member variable v810_timestamp is synchronized to our local copy, since we'll read it externally if a system - reset/power occurs when in step mode or similar. - */ -#define RB_CPUHOOK(n) RB_CPUHOOK_DBG(n) -#define RB_DEBUGMODE - -#include "v810_oploop.inc" - -#undef RB_DEBUGMODE -#undef RB_CPUHOOK -#undef RB_ADDBT -} -#endif - -// -// Undefine accurate mode defines -// -#undef RB_GETPC -#undef RB_RDOP - -// -// Define fast mode defines -// -#define RB_GETPC() ((uint32)(PC_ptr - PC_base)) - -#define RB_RDOP(PC_offset, ...) MDFN_de16lsb(&PC_ptr[PC_offset]) - -void V810::Run_Fast(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) -{ - const bool RB_AccurateMode = false; - -#define RB_ADDBT(n, o, p) -#define RB_CPUHOOK(n) - -#include "v810_oploop.inc" - -#undef RB_CPUHOOK -#undef RB_ADDBT -} - -#ifdef WANT_DEBUGGER -void V810::Run_Fast_Debug(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) -{ - const bool RB_AccurateMode = false; - -#define RB_ADDBT(n, o, p) \ - { \ - if (ADDBT) \ - ADDBT(n, o, p); \ - } -#define RB_CPUHOOK(n) RB_CPUHOOK_DBG(n) -#define RB_DEBUGMODE - -#include "v810_oploop.inc" - -#undef RB_DEBUGMODE -#undef RB_CPUHOOK -#undef RB_ADDBT -} -#endif - -// -// Undefine fast mode defines -// -#undef RB_GETPC -#undef RB_RDOP - -v810_timestamp_t V810::Run(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) -{ - Running = true; - -#ifdef WANT_DEBUGGER - if (CPUHook || ADDBT) - { - if (EmuMode == V810_EMU_MODE_FAST) - Run_Fast_Debug(event_handler); - else - Run_Accurate_Debug(event_handler); - } - else -#endif - { - if (EmuMode == V810_EMU_MODE_FAST) - Run_Fast(event_handler); - else - Run_Accurate(event_handler); - } - return (v810_timestamp); -} - -void V810::Exit(void) -{ - Running = false; -} - -#ifdef WANT_DEBUGGER -void V810::SetCPUHook(void (*newhook)(const v810_timestamp_t timestamp, uint32 PC), void (*new_ADDBT)(uint32 old_PC, uint32 new_PC, uint32)) -{ - CPUHook = newhook; - ADDBT = new_ADDBT; -} -#endif - -uint32 V810::GetRegister(unsigned int which, char *special, const uint32 special_len) -{ - if (which >= GSREG_PR && which <= GSREG_PR + 31) - { - return GetPR(which - GSREG_PR); - } - else if (which >= GSREG_SR && which <= GSREG_SR + 31) - { - uint32 val = GetSREG(which - GSREG_SR); - - if (special && which == GSREG_SR + PSW) - { - trio_snprintf(special, special_len, "Z: %d, S: %d, OV: %d, CY: %d, ID: %d, AE: %d, EP: %d, NP: %d, IA: %2d", - (int)(bool)(val & PSW_Z), (int)(bool)(val & PSW_S), (int)(bool)(val & PSW_OV), (int)(bool)(val & PSW_CY), - (int)(bool)(val & PSW_ID), (int)(bool)(val & PSW_AE), (int)(bool)(val & PSW_EP), (int)(bool)(val & PSW_NP), - (val & PSW_IA) >> 16); - } - - return val; - } - else if (which == GSREG_PC) - { - return GetPC(); - } - else if (which == GSREG_TIMESTAMP) - { - return v810_timestamp; - } - - return 0xDEADBEEF; -} - -void V810::SetRegister(unsigned int which, uint32 value) -{ - if (which >= GSREG_PR && which <= GSREG_PR + 31) - { - if (which) - P_REG[which - GSREG_PR] = value; - } - else if (which >= GSREG_SR && which <= GSREG_SR + 31) - { - // SetSREG(timestamp, which - GSREG_SR, value); - } - else if (which == GSREG_PC) - { - SetPC(value & ~1); - } - else if (which == GSREG_TIMESTAMP) - { - //v810_timestamp = value; - } -} - -uint32 V810::GetPC(void) -{ - if (EmuMode == V810_EMU_MODE_ACCURATE) - return (PC); - else - { - return (PC_ptr - PC_base); - } -} - -void V810::SetPC(uint32 new_pc) -{ - if (EmuMode == V810_EMU_MODE_ACCURATE) - PC = new_pc; - else - { - PC_ptr = &FastMap[new_pc >> V810_FAST_MAP_SHIFT][new_pc]; - PC_base = PC_ptr - new_pc; - } -} - -#define BSTR_OP_MOV \ - dst_cache &= ~(1 << dstoff); \ - dst_cache |= ((src_cache >> srcoff) & 1) << dstoff; -#define BSTR_OP_NOT \ - dst_cache &= ~(1 << dstoff); \ - dst_cache |= (((src_cache >> srcoff) & 1) ^ 1) << dstoff; - -#define BSTR_OP_XOR dst_cache ^= ((src_cache >> srcoff) & 1) << dstoff; -#define BSTR_OP_OR dst_cache |= ((src_cache >> srcoff) & 1) << dstoff; -#define BSTR_OP_AND dst_cache &= ~((((src_cache >> srcoff) & 1) ^ 1) << dstoff); - -#define BSTR_OP_XORN dst_cache ^= (((src_cache >> srcoff) & 1) ^ 1) << dstoff; -#define BSTR_OP_ORN dst_cache |= (((src_cache >> srcoff) & 1) ^ 1) << dstoff; -#define BSTR_OP_ANDN dst_cache &= ~(((src_cache >> srcoff) & 1) << dstoff); - -INLINE uint32 V810::BSTR_RWORD(v810_timestamp_t ×tamp, uint32 A) -{ - if (MemReadBus32[A >> 24]) - { - timestamp += 2; - return (MemRead32(timestamp, A)); - } - else - { - uint32 ret; - - timestamp += 2; - ret = MemRead16(timestamp, A); - - timestamp += 2; - ret |= MemRead16(timestamp, A | 2) << 16; - return (ret); - } -} - -INLINE void V810::BSTR_WWORD(v810_timestamp_t ×tamp, uint32 A, uint32 V) -{ - if (MemWriteBus32[A >> 24]) - { - timestamp += 2; - MemWrite32(timestamp, A, V); - } - else - { - timestamp += 2; - MemWrite16(timestamp, A, V & 0xFFFF); - - timestamp += 2; - MemWrite16(timestamp, A | 2, V >> 16); - } -} - -#define DO_BSTR(op) \ - { \ - while (len) \ - { \ - if (!have_src_cache) \ - { \ - have_src_cache = TRUE; \ - src_cache = BSTR_RWORD(timestamp, src); \ - } \ - \ - if (!have_dst_cache) \ - { \ - have_dst_cache = TRUE; \ - dst_cache = BSTR_RWORD(timestamp, dst); \ - } \ - \ - op; \ - srcoff = (srcoff + 1) & 0x1F; \ - dstoff = (dstoff + 1) & 0x1F; \ - len--; \ - \ - if (!srcoff) \ - { \ - src += 4; \ - have_src_cache = FALSE; \ - } \ - \ - if (!dstoff) \ - { \ - BSTR_WWORD(timestamp, dst, dst_cache); \ - dst += 4; \ - have_dst_cache = FALSE; \ - if (timestamp >= next_event_ts) \ - break; \ - } \ - } \ - if (have_dst_cache) \ - BSTR_WWORD(timestamp, dst, dst_cache); \ - } - -INLINE bool V810::Do_BSTR_Search(v810_timestamp_t ×tamp, const int inc_mul, unsigned int bit_test) -{ - uint32 srcoff = (P_REG[27] & 0x1F); - uint32 len = P_REG[28]; - uint32 bits_skipped = P_REG[29]; - uint32 src = (P_REG[30] & 0xFFFFFFFC); - bool found = false; - -#if 0 - // TODO: Better timing. - if(!in_bstr) // If we're just starting the execution of this instruction(kind of spaghetti-code), so FIXME if we change - // bstr handling in v810_oploop.inc - { - timestamp += 13 - 1; - } -#endif - - while (len) - { - if (!have_src_cache) - { - have_src_cache = TRUE; - timestamp++; - src_cache = BSTR_RWORD(timestamp, src); - } - - if (((src_cache >> srcoff) & 1) == bit_test) - { - found = true; - - /* Fix the bit offset and word address to "1 bit before" it was found */ - srcoff -= inc_mul * 1; - if (srcoff & 0x20) /* Handles 0x1F->0x20(0x00) and 0x00->0xFFFF... */ - { - src -= inc_mul * 4; - srcoff &= 0x1F; - } - break; - } - srcoff = (srcoff + inc_mul * 1) & 0x1F; - bits_skipped++; - len--; - - if (!srcoff) - { - have_src_cache = FALSE; - src += inc_mul * 4; - if (timestamp >= next_event_ts) - break; - } - } - - P_REG[27] = srcoff; - P_REG[28] = len; - P_REG[29] = bits_skipped; - P_REG[30] = src; - - if (found) // Set Z flag to 0 if the bit was found - SetFlag(PSW_Z, 0); - else if (!len) // ...and if the search is over, and the bit was not found, set it to 1 - SetFlag(PSW_Z, 1); - - if (found) // Bit found, so don't continue the search. - return (false); - - return ((bool)len); // Continue the search if any bits are left to search. -} - -bool V810::bstr_subop(v810_timestamp_t ×tamp, int sub_op, int arg1) -{ - if ((sub_op >= 0x10) || (!(sub_op & 0x8) && sub_op >= 0x4)) - { - printf("%08x\tBSR Error: %04x\n", PC, sub_op); - - SetPC(GetPC() - 2); - Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); - - return (false); - } - - // printf("BSTR: %02x, %02x %02x; src: %08x, dst: %08x, len: %08x\n", sub_op, P_REG[27], P_REG[26], P_REG[30], P_REG[29], P_REG[28]); - - if (sub_op & 0x08) - { - uint32 dstoff = (P_REG[26] & 0x1F); - uint32 srcoff = (P_REG[27] & 0x1F); - uint32 len = P_REG[28]; - uint32 dst = (P_REG[29] & 0xFFFFFFFC); - uint32 src = (P_REG[30] & 0xFFFFFFFC); - -#if 0 - // Be careful not to cause 32-bit integer overflow, and careful about not shifting by 32. - // TODO: - - // Read src[0], src[4] into shifter. - // Read dest[0]. - DO_BSTR_PROLOGUE(); // if(len) { blah blah blah masking blah } - src_cache = BSTR_RWORD(timestamp, src); - - if((uint64)(srcoff + len) > 0x20) - src_cache |= (uint64)BSTR_RWORD(timestamp, src + 4) << 32; - - dst_cache = BSTR_RWORD(timestamp, dst); - - if(len) - { - uint32 dst_preserve_mask; - uint32 dst_change_mask; - - dst_preserve_mask = (1U << dstoff) - 1; - - if((uint64)(dstoff + len) < 0x20) - dst_preserve_mask |= ((1U << ((0x20 - (dstoff + len)) & 0x1F)) - 1) << (dstoff + len); - - dst_change_mask = ~dst_preserve_mask; - - src_cache = BSTR_RWORD(timestamp, src); - src_cache |= (uint64)BSTR_RWORD(timestamp, src + 4) << 32; - dst_cache = BSTR_RWORD(timestamp, dst); - - dst_cache = (dst_cache & dst_preserve_mask) | ((dst_cache OP_THINGY_HERE (src_cache >> srcoff)) & dst_change_mask); - BSTR_WWORD(timestamp, dst, dst_cache); - - if((uint64)(dstoff + len) < 0x20) - { - srcoff += len; - dstoff += len; - len = 0; - } - else - { - srcoff += (0x20 - dstoff); - dstoff = 0; - len -= (0x20 - dstoff); - dst += 4; - } - - if(srcoff >= 0x20) - { - srcoff &= 0x1F; - src += 4; - - if(len) - { - src_cache >>= 32; - src_cache |= (uint64)BSTR_RWORD(timestamp, src + 4) << 32; - } - } - } - - DO_BSTR_PRIMARY(); // while(len >= 32) (do allow interruption; interrupt and emulator-return - - // they must be handled differently!) - while(len >= 32) - { - dst_cache = BSTR_RWORD(timestamp, dst); - dst_cache = OP_THINGY_HERE(dst_cache, src_cache >> srcoff); - BSTR_WWORD(timestamp, dst, dst_cache); - len -= 32; - dst += 4; - src += 4; - src_cache >>= 32; - src_cache |= (uint64)BSTR_RWORD(timestamp, src + 4) << 32; - } - - DO_BSTR_EPILOGUE(); // if(len) { blah blah blah masking blah } - if(len) - { - uint32 dst_preserve_mask; - uint32 dst_change_mask; - - dst_preserve_mask = (1U << ((0x20 - len) & 0x1F) << len; - dst_change_mask = ~dst_preserve_mask; - - dst_cache = BSTR_RWORD(timestamp, dst); - dst_cache = OP_THINGY_HERE(dst_cache, src_cache >> srcoff); - BSTR_WWORD(timestamp, dst, dst_cache); - dstoff += len; - srcoff += len; - - if(srcoff >= 0x20) - { - srcoff &= 0x1F; - src += 4; - } - len = 0; - } -#endif - - switch (sub_op) - { - case ORBSU: - DO_BSTR(BSTR_OP_OR); - break; - - case ANDBSU: - DO_BSTR(BSTR_OP_AND); - break; - - case XORBSU: - DO_BSTR(BSTR_OP_XOR); - break; - - case MOVBSU: - DO_BSTR(BSTR_OP_MOV); - break; - - case ORNBSU: - DO_BSTR(BSTR_OP_ORN); - break; - - case ANDNBSU: - DO_BSTR(BSTR_OP_ANDN); - break; - - case XORNBSU: - DO_BSTR(BSTR_OP_XORN); - break; - - case NOTBSU: - DO_BSTR(BSTR_OP_NOT); - break; - } - - P_REG[26] = dstoff; - P_REG[27] = srcoff; - P_REG[28] = len; - P_REG[29] = dst; - P_REG[30] = src; - - return ((bool)P_REG[28]); - } - else - { - printf("BSTR Search: %02x\n", sub_op); - return (Do_BSTR_Search(timestamp, ((sub_op & 1) ? -1 : 1), (sub_op & 0x2) >> 1)); - } - assert(0); - return (false); -} - -INLINE void V810::SetFPUOPNonFPUFlags(uint32 result) -{ - // Now, handle flag setting - SetFlag(PSW_OV, 0); - - if (!(result & 0x7FFFFFFF)) // Check to see if exponent and mantissa are 0 - { - // If Z flag is set, S and CY should be clear, even if it's negative 0(confirmed on real thing with subf.s, at least). - SetFlag(PSW_Z, 1); - SetFlag(PSW_S, 0); - SetFlag(PSW_CY, 0); - } - else - { - SetFlag(PSW_Z, 0); - SetFlag(PSW_S, result & 0x80000000); - SetFlag(PSW_CY, result & 0x80000000); - } - //printf("MEOW: %08x\n", S_REG[PSW] & (PSW_S | PSW_CY)); -} - -bool V810::FPU_DoesExceptionKillResult(void) -{ - const uint32 float_exception_flags = fpo.get_flags(); - - if (float_exception_flags & V810_FP_Ops::flag_reserved) - return (true); - - if (float_exception_flags & V810_FP_Ops::flag_invalid) - return (true); - - if (float_exception_flags & V810_FP_Ops::flag_divbyzero) - return (true); - - // Return false here, so that the result of this calculation IS put in the output register. - // Wrap the exponent on overflow, rather than generating an infinity. The wrapping behavior is specified in IEE 754 AFAIK, - // and is useful in cases where you divide a huge number - // by another huge number, and fix the result afterwards based on the number of overflows that occurred. Probably requires some custom assembly code, - // though. And it's the kind of thing you'd see in an engineering or physics program, not in a perverted video game :b). - if (float_exception_flags & V810_FP_Ops::flag_overflow) - return (false); - - return (false); -} - -void V810::FPU_DoException(void) -{ - const uint32 float_exception_flags = fpo.get_flags(); - - if (float_exception_flags & V810_FP_Ops::flag_reserved) - { - S_REG[PSW] |= PSW_FRO; - - SetPC(GetPC() - 4); - Exception(FPU_HANDLER_ADDR, ECODE_FRO); - - return; - } - - if (float_exception_flags & V810_FP_Ops::flag_invalid) - { - S_REG[PSW] |= PSW_FIV; - - SetPC(GetPC() - 4); - Exception(FPU_HANDLER_ADDR, ECODE_FIV); - - return; - } - - if (float_exception_flags & V810_FP_Ops::flag_divbyzero) - { - S_REG[PSW] |= PSW_FZD; - - SetPC(GetPC() - 4); - Exception(FPU_HANDLER_ADDR, ECODE_FZD); - - return; - } - - if (float_exception_flags & V810_FP_Ops::flag_underflow) - { - S_REG[PSW] |= PSW_FUD; - } - - if (float_exception_flags & V810_FP_Ops::flag_inexact) - { - S_REG[PSW] |= PSW_FPR; - } - - // - // FPR can be set along with overflow, so put the overflow exception handling at the end here(for Exception() messes with PSW). - // - if (float_exception_flags & V810_FP_Ops::flag_overflow) - { - S_REG[PSW] |= PSW_FOV; - - SetPC(GetPC() - 4); - Exception(FPU_HANDLER_ADDR, ECODE_FOV); - } -} - -bool V810::IsSubnormal(uint32 fpval) -{ - if (((fpval >> 23) & 0xFF) == 0 && (fpval & ((1 << 23) - 1))) - return (true); - - return (false); -} - -INLINE void V810::FPU_Math_Template(uint32 (V810_FP_Ops::*func)(uint32, uint32), uint32 arg1, uint32 arg2) -{ - uint32 result; - - fpo.clear_flags(); - result = (fpo.*func)(P_REG[arg1], P_REG[arg2]); - - if (!FPU_DoesExceptionKillResult()) - { - SetFPUOPNonFPUFlags(result); - SetPREG(arg1, result); - } - FPU_DoException(); -} - -void V810::fpu_subop(v810_timestamp_t ×tamp, int sub_op, int arg1, int arg2) -{ - //printf("FPU: %02x\n", sub_op); - if (VBMode) - { - switch (sub_op) - { - case XB: - timestamp++; // Unknown - P_REG[arg1] = (P_REG[arg1] & 0xFFFF0000) | ((P_REG[arg1] & 0xFF) << 8) | ((P_REG[arg1] & 0xFF00) >> 8); - return; - - case XH: - timestamp++; // Unknown - P_REG[arg1] = (P_REG[arg1] << 16) | (P_REG[arg1] >> 16); - return; - - // Does REV use arg1 or arg2 for the source register? - case REV: - timestamp++; // Unknown - printf("Revvie bits\n"); - { - // Public-domain code snippet from: http://graphics.stanford.edu/~seander/bithacks.html#ReverseParallel - uint32 v = P_REG[arg2]; // 32-bit word to reverse bit order - - // swap odd and even bits - v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1); - // swap consecutive pairs - v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2); - // swap nibbles ... - v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4); - // swap bytes - v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8); - // swap 2-byte long pairs - v = (v >> 16) | (v << 16); - - P_REG[arg1] = v; - } - return; - - case MPYHW: - timestamp += 9 - 1; // Unknown? - P_REG[arg1] = (int32)(int16)(P_REG[arg1] & 0xFFFF) * (int32)(int16)(P_REG[arg2] & 0xFFFF); - return; - } - } - - switch (sub_op) - { - // Virtual-Boy specific(probably!) - default: - { - SetPC(GetPC() - 4); - Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); - } - break; - - case CVT_WS: - timestamp += 5; - { - uint32 result; - - fpo.clear_flags(); - result = fpo.itof(P_REG[arg2]); - - if (!FPU_DoesExceptionKillResult()) - { - SetPREG(arg1, result); - SetFPUOPNonFPUFlags(result); - } - FPU_DoException(); - } - break; // End CVT.WS - - case CVT_SW: - timestamp += 8; - { - int32 result; - - fpo.clear_flags(); - result = fpo.ftoi(P_REG[arg2], false); - - if (!FPU_DoesExceptionKillResult()) - { - SetPREG(arg1, result); - SetFlag(PSW_OV, 0); - SetSZ(result); - } - FPU_DoException(); - } - break; // End CVT.SW - - case ADDF_S: - timestamp += 8; - FPU_Math_Template(&V810_FP_Ops::add, arg1, arg2); - break; - - case SUBF_S: - timestamp += 11; - FPU_Math_Template(&V810_FP_Ops::sub, arg1, arg2); - break; - - case CMPF_S: - timestamp += 6; - // Don't handle this like subf.s because the flags - // have slightly different semantics(mostly regarding underflow/subnormal results) (confirmed on real V810). - fpo.clear_flags(); - { - int32 result; - - result = fpo.cmp(P_REG[arg1], P_REG[arg2]); - - if (!FPU_DoesExceptionKillResult()) - { - SetFPUOPNonFPUFlags(result); - } - FPU_DoException(); - } - break; - - case MULF_S: - timestamp += 7; - FPU_Math_Template(&V810_FP_Ops::mul, arg1, arg2); - break; - - case DIVF_S: - timestamp += 43; - FPU_Math_Template(&V810_FP_Ops::div, arg1, arg2); - break; - - case TRNC_SW: - timestamp += 7; - { - int32 result; - - fpo.clear_flags(); - result = fpo.ftoi(P_REG[arg2], true); - - if (!FPU_DoesExceptionKillResult()) - { - SetPREG(arg1, result); - SetFlag(PSW_OV, 0); - SetSZ(result); - } - FPU_DoException(); - } - break; // end TRNC.SW - } -} - -// Generate exception -void V810::Exception(uint32 handler, uint16 eCode) -{ -// Exception overhead is unknown. - -#ifdef WANT_DEBUGGER - if (ADDBT) - { - uint32 old_PC = GetPC(); - - if ((eCode & 0xFFE0) == 0xFFA0) // Trap instruction(PC is pointing to next instruction at this point) - old_PC -= 2; - - ADDBT(old_PC, handler, eCode); - } -#endif - - printf("Exception: %08x %04x\n", handler, eCode); - - // Invalidate our bitstring state(forces the instruction to be re-read, and the r/w buffers reloaded). - in_bstr = FALSE; - have_src_cache = FALSE; - have_dst_cache = FALSE; - - if (S_REG[PSW] & PSW_NP) // Fatal exception - { - printf("Fatal exception; Code: %08x, ECR: %08x, PSW: %08x, PC: %08x\n", eCode, S_REG[ECR], S_REG[PSW], PC); - Halted = HALT_FATAL_EXCEPTION; - IPendingCache = 0; - return; - } - else if (S_REG[PSW] & PSW_EP) //Double Exception - { - S_REG[FEPC] = GetPC(); - S_REG[FEPSW] = S_REG[PSW]; - - S_REG[ECR] = (S_REG[ECR] & 0xFFFF) | (eCode << 16); - S_REG[PSW] |= PSW_NP; - S_REG[PSW] |= PSW_ID; - S_REG[PSW] &= ~PSW_AE; - - SetPC(0xFFFFFFD0); - IPendingCache = 0; - return; - } - else // Regular exception - { - S_REG[EIPC] = GetPC(); - S_REG[EIPSW] = S_REG[PSW]; - S_REG[ECR] = (S_REG[ECR] & 0xFFFF0000) | eCode; - S_REG[PSW] |= PSW_EP; - S_REG[PSW] |= PSW_ID; - S_REG[PSW] &= ~PSW_AE; - - SetPC(handler); - IPendingCache = 0; - return; - } -} diff --git a/waterbox/pcfx/v810/v810_cpu.h b/waterbox/pcfx/v810/v810_cpu.h deleted file mode 100644 index 1e3166a64e..0000000000 --- a/waterbox/pcfx/v810/v810_cpu.h +++ /dev/null @@ -1,360 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Defines for the V810 CPU - -#ifndef V810_CPU_H_ -#define V810_CPU_H_ - -#include - -#include "v810_fp_ops.h" - -typedef int32 v810_timestamp_t; - -#define V810_FAST_MAP_SHIFT 16 -#define V810_FAST_MAP_PSIZE (1 << V810_FAST_MAP_SHIFT) -#define V810_FAST_MAP_TRAMPOLINE_SIZE 1024 - -// Exception codes -enum -{ - ECODE_TRAP_BASE = 0xFFA0, - ECODE_INVALID_OP = 0xFF90, - ECODE_ZERO_DIV = 0xFF80, // Integer divide by 0 - ECODE_FIV = 0xFF70, // Floating point invalid operation - ECODE_FZD = 0xFF68, // Floating point zero division - ECODE_FOV = 0xFF64, // Floating point overflow -//#define ECODE_FUD 0xFF62 // Floating point underflow(unused on V810) -//#define ECODE_FPR 0xFF61 // Floating point precision degradation(unused on V810) - ECODE_FRO = 0xFF60 // Floating point reserved operand -}; - -enum -{ - INVALID_OP_HANDLER_ADDR = 0xFFFFFF90, // Invalid opcode/instruction code! - ZERO_DIV_HANDLER_ADDR = 0xFFFFFF80, // Integer divide by 0 exception - FPU_HANDLER_ADDR = 0xFFFFFF60, // FPU exception - TRAP_HANDLER_BASE = 0xFFFFFFA0 // TRAP instruction -}; - -//System Register Defines (these are the only valid system registers!) -#define EIPC 0 //Exeption/Interupt PC -#define EIPSW 1 //Exeption/Interupt PSW - -#define FEPC 2 //Fatal Error PC -#define FEPSW 3 //Fatal Error PSW - -#define ECR 4 //Exception Cause Register -#define PSW 5 //Program Status Word -#define PIR 6 //Processor ID Register -#define TKCW 7 //Task Controll Word -#define CHCW 24 //Cashe Controll Word -#define ADDTRE 25 //ADDTRE - -//PSW Specifics -#define PSW_IA 0xF0000 // All Interupt bits... -#define PSW_I3 0x80000 -#define PSW_I2 0x40000 -#define PSW_I1 0x20000 -#define PSW_I0 0x10000 - -#define PSW_NP 0x08000 -#define PSW_EP 0x04000 - -#define PSW_AE 0x02000 - -#define PSW_ID 0x01000 - -#define PSW_FRO 0x00200 // Floating point reserved operand(set on denormal, NaN, or indefinite) -#define PSW_FIV 0x00100 // Floating point invalid operation(set when trying to convert a number too large to an (un)signed integer) - -#define PSW_FZD 0x00080 // Floating point divide by zero -#define PSW_FOV 0x00040 // Floating point overflow -#define PSW_FUD 0x00020 // Floating point underflow -#define PSW_FPR 0x00010 // Floating point precision degradation - -#define PSW_CY 0x00008 -#define PSW_OV 0x00004 -#define PSW_S 0x00002 -#define PSW_Z 0x00001 - -//condition codes -#define COND_V 0 -#define COND_C 1 -#define COND_Z 2 -#define COND_NH 3 -#define COND_S 4 -#define COND_T 5 -#define COND_LT 6 -#define COND_LE 7 -#define COND_NV 8 -#define COND_NC 9 -#define COND_NZ 10 -#define COND_H 11 -#define COND_NS 12 -#define COND_F 13 -#define COND_GE 14 -#define COND_GT 15 - -#define TESTCOND_V (S_REG[PSW]&PSW_OV) - -#define TESTCOND_L (S_REG[PSW]&PSW_CY) -#define TESTCOND_C TESTCOND_L - -#define TESTCOND_E (S_REG[PSW]&PSW_Z) -#define TESTCOND_Z TESTCOND_E - -#define TESTCOND_NH ( (S_REG[PSW]&PSW_Z) || (S_REG[PSW]&PSW_CY) ) -#define TESTCOND_N (S_REG[PSW]&PSW_S) -#define TESTCOND_S TESTCOND_N - -#define TESTCOND_LT ( (!!(S_REG[PSW]&PSW_S)) ^ (!!(S_REG[PSW]&PSW_OV)) ) -#define TESTCOND_LE ( ((!!(S_REG[PSW]&PSW_S)) ^ (!!(S_REG[PSW]&PSW_OV))) || (S_REG[PSW]&PSW_Z) ) -#define TESTCOND_NV (!(S_REG[PSW]&PSW_OV)) - -#define TESTCOND_NL (!(S_REG[PSW]&PSW_CY)) -#define TESTCOND_NC TESTCOND_NL - -#define TESTCOND_NE (!(S_REG[PSW]&PSW_Z)) -#define TESTCOND_NZ TESTCOND_NE - -#define TESTCOND_H ( !((S_REG[PSW]&PSW_Z) || (S_REG[PSW]&PSW_CY)) ) -#define TESTCOND_P (!(S_REG[PSW] & PSW_S)) -#define TESTCOND_NS TESTCOND_P - -#define TESTCOND_GE (!((!!(S_REG[PSW]&PSW_S))^(!!(S_REG[PSW]&PSW_OV)))) -#define TESTCOND_GT (! (((!!(S_REG[PSW]&PSW_S))^(!!(S_REG[PSW]&PSW_OV))) || (S_REG[PSW]&PSW_Z)) ) - -// Tag layout -// Bit 0-21: TAG31-TAG10 -// Bit 22-23: Validity bits(one for each 4-byte subblock) -// Bit 24-27: NECRV("Reserved") -// Bit 28-31: 0 - -typedef enum -{ - V810_EMU_MODE_FAST = 0, - V810_EMU_MODE_ACCURATE = 1, - _V810_EMU_MODE_COUNT -} V810_Emu_Mode; - -class V810 -{ - public: - - V810() MDFN_COLD; - ~V810() MDFN_COLD; - - // Pass TRUE for vb_mode if we're emulating a VB-specific enhanced V810 CPU core - bool Init(V810_Emu_Mode mode, bool vb_mode) MDFN_COLD; - void Kill(void) MDFN_COLD; - - void SetInt(int level); - - void SetMemWriteBus32(uint8 A, bool value) MDFN_COLD; - void SetMemReadBus32(uint8 A, bool value) MDFN_COLD; - - void SetMemReadHandlers(uint8 MDFN_FASTCALL (*read8)(v810_timestamp_t &, uint32), uint16 MDFN_FASTCALL (*read16)(v810_timestamp_t &, uint32), uint32 MDFN_FASTCALL (*read32)(v810_timestamp_t &, uint32)) MDFN_COLD; - void SetMemWriteHandlers(void MDFN_FASTCALL (*write8)(v810_timestamp_t &, uint32, uint8), void MDFN_FASTCALL (*write16)(v810_timestamp_t &, uint32, uint16), void MDFN_FASTCALL (*write32)(v810_timestamp_t &, uint32, uint32)) MDFN_COLD; - - void SetIOReadHandlers(uint8 MDFN_FASTCALL (*read8)(v810_timestamp_t &, uint32), uint16 MDFN_FASTCALL (*read16)(v810_timestamp_t &, uint32), uint32 MDFN_FASTCALL (*read32)(v810_timestamp_t &, uint32)) MDFN_COLD; - void SetIOWriteHandlers(void MDFN_FASTCALL (*write8)(v810_timestamp_t &, uint32, uint8), void MDFN_FASTCALL (*write16)(v810_timestamp_t &, uint32, uint16), void MDFN_FASTCALL (*write32)(v810_timestamp_t &, uint32, uint32)) MDFN_COLD; - - // Length specifies the number of bytes to map in, at each location specified by addresses[] (for mirroring) - uint8 *SetFastMap(uint32 addresses[], uint32 length, unsigned int num_addresses, const char *name, bool writable) MDFN_COLD; - - INLINE void ResetTS(v810_timestamp_t new_base_timestamp) - { - assert(next_event_ts > v810_timestamp); - - next_event_ts -= (v810_timestamp - new_base_timestamp); - v810_timestamp = new_base_timestamp; - } - - INLINE void SetEventNT(const v810_timestamp_t timestamp) - { - next_event_ts = timestamp; - } - - INLINE v810_timestamp_t GetEventNT(void) - { - return(next_event_ts); - } - - v810_timestamp_t Run(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)); - void Exit(void); - - void Reset(void) MDFN_COLD; - - #ifdef WANT_DEBUGGER - void CheckBreakpoints(void (*callback)(int type, uint32 address, uint32 value, unsigned int len), uint16 MDFN_FASTCALL (*peek16)(const v810_timestamp_t, uint32), uint32 MDFN_FASTCALL (*peek32)(const v810_timestamp_t, uint32)); - void SetCPUHook(void (*newhook)(const v810_timestamp_t timestamp, uint32 PC), void (*new_ADDBT)(uint32, uint32, uint32)); - #endif - - enum - { - GSREG_PR = 0, - GSREG_SR = 32, - GSREG_PC = 64, - GSREG_TIMESTAMP - }; - - uint32 GetRegister(unsigned int which, char *special, const uint32 special_len); - void SetRegister(unsigned int which, uint32 value); - - uint32 GetPC(void); - void SetPC(uint32); - - INLINE uint32 GetPR(unsigned int which) - { - return which ? P_REG[which] : 0; - } - - private: - - // Make sure P_REG[] is the first variable/array in this class, so non-zerfo offset encoding(at assembly level) isn't necessary to access it. - uint32 P_REG[32]; // Program registers pr0-pr31 - uint32 S_REG[32]; // System registers sr0-sr31 - uint32 PC; - uint8 *PC_ptr; - uint8 *PC_base; - - uint32 IPendingCache; - void RecalcIPendingCache(void); - - public: - v810_timestamp_t v810_timestamp; // Will never be less than 0. - - private: - v810_timestamp_t next_event_ts; - - enum - { - LASTOP_NORMAL = 0, - LASTOP_LOAD = 1, - LASTOP_STORE = 2, - LASTOP_IN = 3, - LASTOP_OUT = 4, - LASTOP_HEAVY_MATH = 5 - }; - - V810_Emu_Mode EmuMode; - bool VBMode; - - void Run_Fast(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) NO_INLINE; - void Run_Accurate(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) NO_INLINE; - - #ifdef WANT_DEBUGGER - void Run_Fast_Debug(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) NO_INLINE; - void Run_Accurate_Debug(int32 MDFN_FASTCALL (*event_handler)(const v810_timestamp_t timestamp)) NO_INLINE; - #endif - - uint8 MDFN_FASTCALL (*MemRead8)(v810_timestamp_t ×tamp, uint32 A); - uint16 MDFN_FASTCALL (*MemRead16)(v810_timestamp_t ×tamp, uint32 A); - uint32 MDFN_FASTCALL (*MemRead32)(v810_timestamp_t ×tamp, uint32 A); - - void MDFN_FASTCALL (*MemWrite8)(v810_timestamp_t ×tamp, uint32 A, uint8 V); - void MDFN_FASTCALL (*MemWrite16)(v810_timestamp_t ×tamp, uint32 A, uint16 V); - void MDFN_FASTCALL (*MemWrite32)(v810_timestamp_t ×tamp, uint32 A, uint32 V); - - uint8 MDFN_FASTCALL (*IORead8)(v810_timestamp_t ×tamp, uint32 A); - uint16 MDFN_FASTCALL (*IORead16)(v810_timestamp_t ×tamp, uint32 A); - uint32 MDFN_FASTCALL (*IORead32)(v810_timestamp_t ×tamp, uint32 A); - - void MDFN_FASTCALL (*IOWrite8)(v810_timestamp_t ×tamp, uint32 A, uint8 V); - void MDFN_FASTCALL (*IOWrite16)(v810_timestamp_t ×tamp, uint32 A, uint16 V); - void MDFN_FASTCALL (*IOWrite32)(v810_timestamp_t ×tamp, uint32 A, uint32 V); - - bool MemReadBus32[256]; // Corresponding to the upper 8 bits of the memory address map. - bool MemWriteBus32[256]; - - int32 lastop; // Set to -1 on FP/MUL/DIV, 0x100 on LD, 0x200 on ST, 0x400 on in, 0x800 on out, and the actual opcode * 2(or >= 0) on everything else. - - #define LASTOP_LD 0x100 - #define LASTOP_ST 0x200 - #define LASTOP_IN 0x400 - #define LASTOP_OUT 0x800 - - enum - { - HALT_NONE = 0, - HALT_HALT = 1, - HALT_FATAL_EXCEPTION = 2 - }; - - uint8 Halted; - - bool Running; - - int ilevel; - - bool in_bstr; - uint16 in_bstr_to; - - bool bstr_subop(v810_timestamp_t ×tamp, int sub_op, int arg1); - void fpu_subop(v810_timestamp_t ×tamp, int sub_op, int arg1, int arg2); - - void Exception(uint32 handler, uint16 eCode); - - // Caching-related: - typedef struct - { - uint32 tag; - uint32 data[2]; - bool data_valid[2]; - } V810_CacheEntry_t; - - V810_CacheEntry_t Cache[128]; - - // Bitstring variables. - uint32 src_cache; - uint32 dst_cache; - bool have_src_cache, have_dst_cache; - - uint8 *FastMap[(1ULL << 32) / V810_FAST_MAP_PSIZE]; - - #ifdef WANT_DEBUGGER - void (*CPUHook)(const v810_timestamp_t timestamp, uint32 PC); - void (*ADDBT)(uint32 old_PC, uint32 new_PC, uint32); - #endif - - - // For CacheDump and CacheRestore - void CacheOpMemStore(v810_timestamp_t ×tamp, uint32 A, uint32 V); - uint32 CacheOpMemLoad(v810_timestamp_t ×tamp, uint32 A); - - void CacheClear(v810_timestamp_t ×tamp, uint32 start, uint32 count); - void CacheDump(v810_timestamp_t ×tamp, const uint32 SA); - void CacheRestore(v810_timestamp_t ×tamp, const uint32 SA); - - uint32 RDCACHE(v810_timestamp_t ×tamp, uint32 addr); - // - // End caching related - // - - uint16 RDOP(v810_timestamp_t ×tamp, uint32 addr, uint32 meow = 2); - void SetFlag(uint32 n, bool condition); - void SetSZ(uint32 value); - - void SetSREG(v810_timestamp_t ×tamp, unsigned int which, uint32 value); - uint32 GetSREG(unsigned int which); - - - bool IsSubnormal(uint32 fpval); - void FPU_Math_Template(uint32 (V810_FP_Ops::*func)(uint32, uint32), uint32 arg1, uint32 arg2); - void FPU_DoException(void); - bool CheckFPInputException(uint32 fpval); - bool FPU_DoesExceptionKillResult(void); - void SetFPUOPNonFPUFlags(uint32 result); - - - uint32 BSTR_RWORD(v810_timestamp_t ×tamp, uint32 A); - void BSTR_WWORD(v810_timestamp_t ×tamp, uint32 A, uint32 V); - bool Do_BSTR_Search(v810_timestamp_t ×tamp, const int inc_mul, unsigned int bit_test); - - V810_FP_Ops fpo; - - uint8 DummyRegion[V810_FAST_MAP_PSIZE + V810_FAST_MAP_TRAMPOLINE_SIZE]; -}; - -#endif - diff --git a/waterbox/pcfx/v810/v810_cpuD.cpp b/waterbox/pcfx/v810/v810_cpuD.cpp deleted file mode 100644 index 6d204659b9..0000000000 --- a/waterbox/pcfx/v810/v810_cpuD.cpp +++ /dev/null @@ -1,385 +0,0 @@ -/* V810 Emulator - * - * Copyright (C) 2006 David Tucker - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -////////////////////////////////////////////////////////// -// CPU Debug routines - -//what do we realy need? -//#include -//#include -//#include -//#include - -#include "../defs.h" -#include "v810_opt.h" -#include "v810_cpu.h" -#include "v810_cpuD.h" - - -//////////////////////////////////////////////////////////// -// Defines - -//Structure to store an element in our linked list -// used to dynamicaly dissasemble a rom -typedef struct dasms { - int offset; - uint32 PC; - uint32 jump; - struct dasms * nextElement; -} dasmS; - -typedef struct { - int addr_mode; // Addressing mode - const char * opname; // Opcode name (string) -} operation; - -static const operation optable[80] = { - { AM_I, "mov " }, // 0x00 - { AM_I, "add " }, // 0x01 - { AM_I, "sub " }, // 0x02 - { AM_I, "cmp " }, // 0x03 - { AM_I, "shl " }, // 0x04 - { AM_I, "shr " }, // 0x05 - { AM_I, "jmp " }, // 0x06 - { AM_I, "sar " }, // 0x07 - { AM_I, "mul " }, // 0x08 - { AM_I, "div " }, // 0x09 - { AM_I, "mulu " }, // 0x0A - { AM_I, "divu " }, // 0x0B - { AM_I, "or " }, // 0x0C - { AM_I, "and " }, // 0x0D - { AM_I, "xor " }, // 0x0E - { AM_I, "not " }, // 0x0F - - { AM_II, "mov " }, // 0x10 // Imediate - { AM_II, "add " }, // 0x11 - { AM_II, "setf " }, // 0x12 - { AM_II, "cmp " }, // 0x13 - { AM_II, "shl " }, // 0x14 - { AM_II, "shr " }, // 0x15 - {0x8000|AM_IX,"ei " }, // 0x16 // EI(VB only) - { AM_II, "sar " }, // 0x17 - { AM_II, "trap " }, // 0x18 - - { AM_IX, "reti " }, // 0x19 //BRKRETI - { AM_IX, "halt " }, // 0x1A //STBY - - {AM_UDEF, "??? " }, // 0x1B // Unknown - { AM_II, "ldsr " }, // 0x1C - { AM_II, "stsr " }, // 0x1D - {0x8000|AM_IX,"di " }, // 0x1E // DI(VB only) - {AM_BSTR, "BSTR " }, // 0x1F // Special Bit String Instructions - - {AM_UDEF, "??? " }, // 0x20 // Unknown // This is a fudg on our part - {AM_UDEF, "??? " }, // 0x21 // Unknown // We have 6 and 7 bit instructions - {AM_UDEF, "??? " }, // 0x22 // Unknown // this is filld in by the Conditional Branch Instructions - {AM_UDEF, "??? " }, // 0x23 // Unknown - {AM_UDEF, "??? " }, // 0x24 // Unknown - {AM_UDEF, "??? " }, // 0x25 // Unknown - {AM_UDEF, "??? " }, // 0x26 // Unknown - {AM_UDEF, "??? " }, // 0x27 // Unknown - - { AM_V, "movea" }, // 0x28 - { AM_V, "addi " }, // 0x29 - { AM_IV, "jr " }, // 0x2A - { AM_IV, "jal " }, // 0x2B - { AM_V, "ori " }, // 0x2C - { AM_V, "andi " }, // 0x2D - { AM_V, "xori " }, // 0x2E - { AM_V, "movhi" }, // 0x2F - - { AM_VIa, "ld.b " }, // 0x30 - { AM_VIa, "ld.h " }, // 0x31 - {AM_UDEF, "??? " }, // 0x32 // Unknown - { AM_VIa, "ld.w " }, // 0x33 - { AM_VIb, "st.b " }, // 0x34 - { AM_VIb, "st.h " }, // 0x35 - {AM_UDEF, "??? " }, // 0x36 // Unknown - { AM_VIb, "st.w " }, // 0x37 - { AM_VIa, "in.b " }, // 0x38 - { AM_VIa, "in.h " }, // 0x39 - { AM_VIa, "caxi " }, // 0x3A - { AM_VIa, "in.w " }, // 0x3B - { AM_VIb, "out.b" }, // 0x3C - { AM_VIb, "out.h" }, // 0x3D - { AM_FPP, "FPP " }, // 0x3E //Floating Point Instruction, Special Case - { AM_VIb, "out.w" }, // 0x3F - - { AM_III, "bv " }, // 0x40 - { AM_III, "bl " }, // 0x41 //BC 0x41 - { AM_III, "be " }, // 0x42 //BZ 0x42 - { AM_III, "bnh " }, // 0x43 - { AM_III, "bn " }, // 0x44 - { AM_III, "br " }, // 0x45 - { AM_III, "blt " }, // 0x46 - { AM_III, "ble " }, // 0x47 - { AM_III, "bnv " }, // 0x48 - { AM_III, "bnl " }, // 0x49 //BNC 0x49 - { AM_III, "bne " }, // 0x4A //BNZ 0x4A - { AM_III, "bh " }, // 0x4B - { AM_III, "bp " }, // 0x4C - { AM_III, "nop " }, // 0x4D - { AM_III, "bge " }, // 0x4E - { AM_III, "bgt " } // 0x4F -}; -// All instructions greater than 0x50 are undefined (this should not be posible of cource) - - -//Structure for holding the SubOpcodes, Same as above, without the InsType. -typedef struct { - const char * opname; // Opcode name (string) -} suboperation; - - -// Bit String Subopcodes -static const suboperation bssuboptable[16] = { - { "SCH0BSU" }, // 0x00 - { "SCH0BSD" }, // 0x01 - { "SCH1BSU" }, // 0x02 - { "SCH1BSD" }, // 0x03 - { "BError4" }, // 0x04 // Unknown - { "BError5" }, // 0x05 // Unknown - { "BError6" }, // 0x06 // Unknown - { "BError7" }, // 0x07 // Unknown - { "ORBSU " }, // 0x08 - { "ANDBSU " }, // 0x09 - { "XORBSU " }, // 0x0A - { "MOVBSU " }, // 0x0B - { "ORNBSU " }, // 0x0C - { "ANDNBSU" }, // 0x0D - { "XORNBSU" }, // 0x0E - { "NOTBSU " } // 0x0F -}; - -// Floating Point Subopcodes -static const suboperation fpsuboptable[16] = { - { "cmpf.s " }, // 0x00 - { "FError1" }, // 0x01 // Unknown - { "cvt.ws " }, // 0x02 - { "cvt.sw " }, // 0x03 - { "addf.s " }, // 0x04 - { "subf.s " }, // 0x05 - { "mulf.s " }, // 0x06 - { "divf.s " }, // 0x07 - - { "FError8" }, // 0x08 // Invalid - { "FError9" }, // 0x09 // Invalid - { "FErrorA" }, // 0x0A // Invalid - { "FErrorB" }, // 0x0B // Invalid - { "FErrorC" }, // 0x0C // Invalid - { "FErrorD" }, // 0x0D // Invalid - { "FErrorE" }, // 0x0E // Invalid - { "FErrorF" } // 0x0F // Invalid -}; - -static const suboperation fpsuboptable_vb[16] = { - { "cmpf.s " }, // 0x00 - { "FError1" }, // 0x01 // Unknown - { "cvt.ws " }, // 0x02 - { "cvt.sw " }, // 0x03 - { "addf.s " }, // 0x04 - { "subf.s " }, // 0x05 - { "mulf.s " }, // 0x06 - { "divf.s " }, // 0x07 - { "XB" }, // 0x08 // undocumented - { "XH" }, // 0x09 // undocumented //VFishing??? - { "REV" }, // 0x0A // undocumented - { "trnc.sw" }, // 0x0B - { "MPYHW" }, // 0x0C // undocumented - { "FErrorD" }, // 0x0D // Unknown - { "FErrorE" }, // 0x0E // Unknown - { "FErrorF" } // 0x0F // Unknown -}; - -static const char *pretty_preg_names[32] = -{ - "r0", "r1", "hsp", "sp", "gp", "tp", "r6", "r7", - "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", - "r16", "r17", "r18", "r19", "r20", "r21", "r22", "r23", - "r24", "r25", "r26", "r27", "r28", "r29", "r30", "lp", -}; - -static const char *pretty_sreg_names[32] = -{ - "sr0(eipc)", "sr1(eipsw)", "sr2(fepc)", "sr3(fepsw)", "sr4(ecr)", "sr5(psw)", "sr6(pir)", "sr7(tkcw)", - "sr8(invalid)", "sr9(invalid)", "sr10(invalid)", "sr11(invalid)", "sr12(invalid)", "sr13(invalid)", - "sr14(invalid)", "sr15(invalid)", "sr16(invalid)", "sr17(invalid)", "sr18(invalid)", "sr19(invalid)", - "sr20(invalid)", "sr21(invalid)", "sr22(invalid)", "sr23(invalid)", - "sr24(chcw)", "sr25(adtre)", "sr26(invalid)", "sr27(invalid)", "sr28(invalid)", "sr29(invalid)", "sr30(invalid)", - "sr31(invalid)" -}; - -void v810_dis(uint32 &tPC, int num, char *buf, uint16 (*rhword)(uint32), bool vbmode) -{ - int lowB, highB, lowB2, highB2; // up to 4 bytes for instruction (either 16 or 32 bits) - int opcode, arg1, arg2, arg3; - int i = 0; - - buf[0] = 0; - - for(i = 0; i< num; i++) - { - const uint16 hw0 = rhword(tPC); - const uint16 hw1 = rhword(tPC + 2); - - lowB = hw0 & 0xFF; - highB = hw0 >> 8; - - lowB2 = hw1 & 0xFF; - highB2 = hw1 >> 8; - - opcode = highB >> 2; - if((highB & 0xE0) == 0x80) // Special opcode format for - opcode = (highB >> 1); // type III instructions. - - if((opcode > 0x4F) | (opcode < 0)) { - //Error Invalid opcode! - sprintf(&buf[strlen(buf)], "0x%04x", hw0); - tPC += 2; - } - - int am = optable[opcode].addr_mode; - - if((am & 0x8000) && !vbmode) - am = AM_UDEF; - - am &= ~0x8000; - - switch(am) { - case AM_I: // Do the same Ither way =) - arg1 = (lowB >> 5) + ((highB & 0x3) << 3); - arg2 = (lowB & 0x1F); - if (opcode == JMP) { - sprintf(&buf[strlen(buf)],"%s [%s]", optable[opcode].opname, pretty_preg_names[arg2]); - } else { - sprintf(&buf[strlen(buf)],"%s %s, %s", optable[opcode].opname, pretty_preg_names[arg2], pretty_preg_names[arg1]); - } - tPC += 2; // 16 bit instruction - break; - case AM_II: - arg1 = (lowB >> 5) + ((highB & 0x3) << 3); - arg2 = (lowB & 0x1F); - if(opcode == LDSR) { - sprintf(&buf[strlen(buf)],"%s %s, %s", optable[opcode].opname, pretty_preg_names[arg1], pretty_sreg_names[arg2]); - } else if(opcode == STSR) { - sprintf(&buf[strlen(buf)],"%s %s, %s", optable[opcode].opname, pretty_sreg_names[arg2], pretty_preg_names[arg1]); - } else if(opcode == ADD_I || opcode == CMP_I || opcode == MOV_I) { - sprintf(&buf[strlen(buf)],"%s %d, %s", optable[opcode].opname, sign_5(arg2), pretty_preg_names[arg1]); - } else { - sprintf(&buf[strlen(buf)],"%s %d, %s", optable[opcode].opname, arg2, pretty_preg_names[arg1]); - } - tPC += 2; // 16 bit instruction - break; - case AM_III: - arg1 = ((highB & 0x1) << 8) + (lowB & 0xFE); - if(opcode == NOP) - sprintf(&buf[strlen(buf)],"%s", optable[opcode].opname); - else - sprintf(&buf[strlen(buf)],"%s %08x", optable[opcode].opname, tPC + sign_9(arg1)); - tPC += 2; // 16 bit instruction - break; - case AM_IV: - arg1 = ((highB & 0x3) << 24) + (lowB << 16) + (highB2 << 8) + lowB2; - - sprintf(&buf[strlen(buf)],"%s %08x", optable[opcode].opname, tPC + sign_26(arg1)); - - tPC += 4; // 32 bit instruction - break; - case AM_V: - arg1 = (lowB >> 5) + ((highB & 0x3) << 3); - arg2 = (lowB & 0x1F); - arg3 = (highB2 << 8) + lowB2; - - // TODO: What would be the best way to disassemble the MOVEA instruction? - //if(opcode == MOVEA) - // sprintf(&buf[strlen(buf)],"%s 0x%X, %s, %s", optable[opcode].opname, (uint32)(int32)(int16)(uint16)arg3, pretty_preg_names[arg2], pretty_preg_names[arg1] ); - //else - sprintf(&buf[strlen(buf)],"%s 0x%X, %s, %s", optable[opcode].opname, arg3, pretty_preg_names[arg2], pretty_preg_names[arg1] ); - tPC += 4; // 32 bit instruction - break; - case AM_VIa: // Mode6 form1 - arg1 = (lowB >> 5) + ((highB & 0x3) << 3); - arg2 = (lowB & 0x1F); - arg3 = (highB2 << 8) + lowB2; - - if(!arg3) // Don't bother printing offset if it's 0 - sprintf(&buf[strlen(buf)],"%s [%s], %s", optable[opcode].opname, pretty_preg_names[arg2], pretty_preg_names[arg1]); - else if(sign_16(arg3) >= 0) // Make disassembly prettier if it's a positive offset - sprintf(&buf[strlen(buf)],"%s 0x%04x[%s], %s", optable[opcode].opname, sign_16(arg3), pretty_preg_names[arg2], pretty_preg_names[arg1]); - else - sprintf(&buf[strlen(buf)],"%s %d[%s], %s", optable[opcode].opname, sign_16(arg3), pretty_preg_names[arg2], pretty_preg_names[arg1]); - - tPC += 4; // 32 bit instruction - break; - case AM_VIb: // Mode6 form2 - arg1 = (lowB >> 5) + ((highB & 0x3) << 3); - arg2 = (lowB & 0x1F); - arg3 = (highB2 << 8) + lowB2; // whats the order??? 2,3,1 or 1,3,2 - - if(!arg3) // Don't bother printing offset if it's 0 - sprintf(&buf[strlen(buf)],"%s %s, [%s]", optable[opcode].opname, pretty_preg_names[arg1], pretty_preg_names[arg2]); - else if(sign_16(arg3) >= 0) // Make disassembly prettier if it's a positive offset - sprintf(&buf[strlen(buf)],"%s %s, 0x%04x[%s]", optable[opcode].opname, pretty_preg_names[arg1], sign_16(arg3), pretty_preg_names[arg2]); - else - sprintf(&buf[strlen(buf)],"%s %s, %d[%s]", optable[opcode].opname, pretty_preg_names[arg1], sign_16(arg3), pretty_preg_names[arg2]); - tPC += 4; // 32 bit instruction - break; - case AM_VII: // Unhandled - sprintf(&buf[strlen(buf)],"0x%2x 0x%2x 0x%2x 0x%2x", lowB, highB, lowB2, highB2); - tPC +=4; // 32 bit instruction - break; - case AM_VIII: // Unhandled - sprintf(&buf[strlen(buf)],"0x%2x 0x%2x 0x%2x 0x%2x", lowB, highB, lowB2, highB2); - tPC += 4; // 32 bit instruction - break; - case AM_IX: - arg1 = (lowB & 0x1); // Mode ID, Ignore for now - sprintf(&buf[strlen(buf)],"%s", optable[opcode].opname); - tPC += 2; // 16 bit instruction - break; - case AM_BSTR: // Bit String Subopcodes - arg1 = (lowB >> 5) + ((highB & 0x3) << 3); - arg2 = (lowB & 0x1F); - if(arg2 > 15) { - sprintf(&buf[strlen(buf)],"BError"); - } else { - //sprintf(&buf[strlen(buf)],"%s, $%d", bssuboptable[arg2].opname,arg1); - sprintf(&buf[strlen(buf)], "%s", bssuboptable[arg2].opname); - } - tPC += 2; // 16 bit instruction - break; - case AM_FPP: // Floating Point Subcode - arg1 = (lowB >> 5) + ((highB & 0x3) << 3); - arg2 = (lowB & 0x1F); - arg3 = (highB2 >> 2); - - if(arg3 > 15) { - sprintf(&buf[strlen(buf)],"(Invalid FPU: 0x%02x)", arg3); - } else { - sprintf(&buf[strlen(buf)],"%s %s, %s", (vbmode ? fpsuboptable_vb[arg3].opname : fpsuboptable[arg3].opname), pretty_preg_names[arg2], pretty_preg_names[arg1]); - } - tPC += 4; // 32 bit instruction - break; - case AM_UDEF: // Invalid opcode. - default: // Invalid opcode. - sprintf(&buf[strlen(buf)],"0x%04x", hw0); - tPC += 2; - } - } -} diff --git a/waterbox/pcfx/v810/v810_cpuD.h b/waterbox/pcfx/v810/v810_cpuD.h deleted file mode 100644 index 6169f418b8..0000000000 --- a/waterbox/pcfx/v810/v810_cpuD.h +++ /dev/null @@ -1,15 +0,0 @@ -//////////////////////////////////////////////////////////////// -// Defines for the V810 CPU debug - -#ifndef V810_CPU_D_H_ -#define V810_CPU_D_H_ - -#include -#include -#include "v810_opt.h" - -// Dissasemble num lines of code starting at tPC (If tPC == -1 start at PC) -void v810_dis(uint32 &PC, int num, char *, uint16 (*rhword)(uint32), bool vbmode = false); - -#endif - diff --git a/waterbox/pcfx/v810/v810_do_am.h b/waterbox/pcfx/v810/v810_do_am.h deleted file mode 100644 index 9cc01568d3..0000000000 --- a/waterbox/pcfx/v810/v810_do_am.h +++ /dev/null @@ -1,72 +0,0 @@ -#define DO_MOV_AM(); DO_AM_I(); -#define DO_ADD_AM(); DO_AM_I(); -#define DO_SUB_AM(); DO_AM_I(); -#define DO_CMP_AM(); DO_AM_I(); -#define DO_SHL_AM(); DO_AM_I(); -#define DO_SHR_AM(); DO_AM_I(); -#define DO_JMP_AM(); DO_AM_I(); -#define DO_SAR_AM(); DO_AM_I(); -#define DO_MUL_AM(); DO_AM_I(); -#define DO_DIV_AM(); DO_AM_I(); -#define DO_MULU_AM(); DO_AM_I(); -#define DO_DIVU_AM(); DO_AM_I(); -#define DO_OR_AM(); DO_AM_I(); -#define DO_AND_AM(); DO_AM_I(); -#define DO_XOR_AM(); DO_AM_I(); -#define DO_NOT_AM(); DO_AM_I(); -#define DO_MOV_I_AM(); DO_AM_II(); -#define DO_ADD_I_AM(); DO_AM_II(); -#define DO_SETF_AM(); DO_AM_II(); -#define DO_CMP_I_AM(); DO_AM_II(); -#define DO_SHL_I_AM(); DO_AM_II(); -#define DO_SHR_I_AM(); DO_AM_II(); -#define DO_EI_AM(); DO_AM_II(); -#define DO_SAR_I_AM(); DO_AM_II(); -#define DO_TRAP_AM(); DO_AM_II(); -#define DO_RETI_AM(); DO_AM_IX(); -#define DO_HALT_AM(); DO_AM_IX(); -#define DO_LDSR_AM(); DO_AM_II(); -#define DO_STSR_AM(); DO_AM_II(); -#define DO_DI_AM(); DO_AM_II(); -#define DO_BSTR_AM(); DO_AM_BSTR(); -#define DO_MOVEA_AM(); DO_AM_V(); -#define DO_ADDI_AM(); DO_AM_V(); -#define DO_JR_AM(); DO_AM_IV(); -#define DO_JAL_AM(); DO_AM_IV(); -#define DO_ORI_AM(); DO_AM_V(); -#define DO_ANDI_AM(); DO_AM_V(); -#define DO_XORI_AM(); DO_AM_V(); -#define DO_MOVHI_AM(); DO_AM_V(); -#define DO_LD_B_AM(); DO_AM_VIa(); -#define DO_LD_H_AM(); DO_AM_VIa(); -#define DO_LD_W_AM(); DO_AM_VIa(); -#define DO_ST_B_AM(); DO_AM_VIb(); -#define DO_ST_H_AM(); DO_AM_VIb(); -#define DO_ST_W_AM(); DO_AM_VIb(); -#define DO_IN_B_AM(); DO_AM_VIa(); -#define DO_IN_H_AM(); DO_AM_VIa(); -#define DO_CAXI_AM(); DO_AM_VIa(); -#define DO_IN_W_AM(); DO_AM_VIa(); -#define DO_OUT_B_AM(); DO_AM_VIb(); -#define DO_OUT_H_AM(); DO_AM_VIb(); -#define DO_FPP_AM(); DO_AM_FPP(); -#define DO_OUT_W_AM(); DO_AM_VIb(); -#define DO_BV_AM(); DO_AM_III(); -#define DO_BL_AM(); DO_AM_III(); -#define DO_BE_AM(); DO_AM_III(); -#define DO_BNH_AM(); DO_AM_III(); -#define DO_BN_AM(); DO_AM_III(); -#define DO_BR_AM(); DO_AM_III(); -#define DO_BLT_AM(); DO_AM_III(); -#define DO_BLE_AM(); DO_AM_III(); -#define DO_BNV_AM(); DO_AM_III(); -#define DO_BNL_AM(); DO_AM_III(); -#define DO_BNE_AM(); DO_AM_III(); -#define DO_BH_AM(); DO_AM_III(); -#define DO_BP_AM(); DO_AM_III(); -#define DO_NOP_AM(); DO_AM_III(); -#define DO_BGE_AM(); DO_AM_III(); -#define DO_BGT_AM(); DO_AM_III(); - - -#define DO_INVALID_AM(); DO_AM_UDEF(); diff --git a/waterbox/pcfx/v810/v810_fp_ops.cpp b/waterbox/pcfx/v810/v810_fp_ops.cpp deleted file mode 100644 index 2817c004dd..0000000000 --- a/waterbox/pcfx/v810/v810_fp_ops.cpp +++ /dev/null @@ -1,408 +0,0 @@ -/******************************************************************************/ -/* Mednafen - Multi-system Emulator */ -/******************************************************************************/ -/* v810_fp_ops.cpp: -** Copyright (C) 2014-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "v810_fp_ops.h" - -bool V810_FP_Ops::fp_is_zero(uint32 v) -{ - return((v & 0x7FFFFFFF) == 0); -} - -#if 0 -bool V810_FP_Ops::fp_is_nan(uint32 v) -{ - return((v & 0x7FFFFFFF) > (255 << 23)); -} - -bool V810_FP_Ops::fp_is_inf(uint32 v) -{ - return((v & 0x7FFFFFFF) == (255 << 23)); -} -#endif - -bool V810_FP_Ops::fp_is_inf_nan_sub(uint32 v) -{ - if((v & 0x7FFFFFFF) == 0) - return(false); - - switch((v >> 23) & 0xFF) - { - case 0x00: - case 0xff: - return(true); - } - return(false); -} - -void V810_FP_Ops::fpim_decode(fpim* df, uint32 v) -{ - df->exp = ((v >> 23) & 0xFF) - 127; - df->f = (v & 0x7FFFFF) | ((v & 0x7FFFFFFF) ? 0x800000 : 0); - df->sign = v >> 31; -} - -void V810_FP_Ops::fpim_round(fpim* df) -{ - int vbc = 64 - MDFN_lzcount64(df->f); - - if(vbc > 24) - { - const unsigned sa = vbc - 24; - - if(1) // round to nearest - { - uint64 old_f = df->f; - - df->f = (df->f + ((df->f >> sa) & 1) + ((1ULL << (sa - 1)) - 1)) & ~((1ULL << sa) - 1); - - if(df->f != old_f) - { - //printf("Inexact mr\n"); - exception_flags |= flag_inexact; - } - } - else - abort(); - } -} - -void V810_FP_Ops::fpim_round_int(fpim* df, bool truncate) -{ - if(df->exp < 23) - { - const unsigned sa = 23 - df->exp; - uint64 old_f = df->f; - - //if(sa >= 2) - // printf("RI: %lld, %d\n", df->f, sa); - - // round to nearest - if(sa > 24) - df->f = 0; - else - { - if(truncate) - df->f = df->f & ~((1ULL << sa) - 1); - else - df->f = (df->f + ((df->f >> sa) & 1) + ((1ULL << (sa - 1)) - 1)) & ~((1ULL << sa) - 1); - } - - if(df->f != old_f) - { - //printf("Inexact\n"); - exception_flags |= flag_inexact; - } - } -} - -uint32 V810_FP_Ops::fpim_encode(fpim* df) -{ - const int lzc = MDFN_lzcount64(df->f); - int tmp_exp = df->exp - lzc; - uint64 tmp_walrus = df->f << (lzc & 0x3F); - int tmp_sign = df->sign; - - tmp_exp += 40; - tmp_walrus >>= 40; - - if(tmp_walrus == 0) - tmp_exp = -127; - else if(tmp_exp <= -127) - { - exception_flags |= flag_underflow | flag_inexact; - //printf("Subnormal: %lld. %d\n", tmp_walrus, tmp_exp); - if(1) - { - tmp_exp = -127; - tmp_walrus = 0; - } - else - { - tmp_walrus >>= -(tmp_exp + 126); - tmp_exp = -127; - } - } - else if(tmp_exp >= 128) - { - exception_flags |= flag_overflow; - //printf("Overflow!\n"); - - if(1) - tmp_exp -= 192; - else - { - tmp_exp = 128; - tmp_walrus = 0; - } - - } - return (tmp_sign << 31) | ((tmp_exp + 127) << 23) | (tmp_walrus & 0x7FFFFF); -} - -uint32 V810_FP_Ops::mul(uint32 a, uint32 b) -{ - fpim ins[2]; - fpim res; - - if(fp_is_inf_nan_sub(a) || fp_is_inf_nan_sub(b)) - { - exception_flags |= flag_reserved; - return(~0U); - } - - fpim_decode(&ins[0], a); - fpim_decode(&ins[1], b); - - //printf("%08x %08x - %d %d %d - %d %d %d\n", a, b, a_exp, a_walrus, a_sign, b_exp, b_walrus, b_sign); - - res.exp = ins[0].exp + ins[1].exp - 23; - res.f = ins[0].f * ins[1].f; - res.sign = ins[0].sign ^ ins[1].sign; - - fpim_round(&res); - - return fpim_encode(&res); -} - -uint32 V810_FP_Ops::add(uint32 a, uint32 b) -{ - fpim ins[2]; - fpim res; - int64 ft[2]; - int64 tr; - int max_exp; - - if(fp_is_inf_nan_sub(a) || fp_is_inf_nan_sub(b)) - { - exception_flags |= flag_reserved; - return(~0U); - } - - if(a == b && !(a & 0x7FFFFFFF)) - { - return(a & 0x80000000); - } - - fpim_decode(&ins[0], a); - fpim_decode(&ins[1], b); - - max_exp = std::max(ins[0].exp, ins[1].exp); - - //printf("%d:%08llx %d:%08llx\n", ins[0].exp, ins[0].f, ins[1].exp, ins[1].f); - - for(unsigned i = 0; i < 2; i++) - { - unsigned sd = (max_exp - ins[i].exp); - - ft[i] = ins[i].f << 24; - - if(sd >= 48) - { - if(ft[i] != 0) - ft[i] = 1; - } - else - { - int64 nft = ft[i] >> sd; - - if(ft[i] != (nft << sd)) - { - nft |= 1; - } - //{ - // puts("FPR"); - // } - - ft[i] = nft; - } - - if(ins[i].sign) - ft[i] = -ft[i]; - } - - //printf("SOON: %08llx %08llx\n", ft[0], ft[1]); - - tr = ft[0] + ft[1]; - if(tr < 0) - { - tr = -tr; - res.sign = true; - } - else - res.sign = false; - - res.f = tr; - res.exp = max_exp - 24; - - fpim_round(&res); - - return fpim_encode(&res); -} - -uint32 V810_FP_Ops::sub(uint32 a, uint32 b) -{ - return add(a, b ^ 0x80000000); -} - -uint32 V810_FP_Ops::div(uint32 a, uint32 b) -{ - fpim ins[2]; - fpim res; - uint64 mtmp; - - if(fp_is_inf_nan_sub(a) || fp_is_inf_nan_sub(b)) - { - exception_flags |= flag_reserved; - return(~0U); - } - - if(fp_is_zero(a) && fp_is_zero(b)) - { - exception_flags |= flag_invalid; - return(~0U); - } - - fpim_decode(&ins[0], a); - fpim_decode(&ins[1], b); - - res.sign = ins[0].sign ^ ins[1].sign; - - if(ins[1].f == 0) - { - //puts("Divide by zero!"); - exception_flags |= flag_divbyzero; - return((res.sign << 31) | (255 << 23)); - } - else - { - res.exp = ins[0].exp - ins[1].exp - 2 - 1; // + 23 - 2; - res.f = ((ins[0].f << 24) / ins[1].f) << 2; - mtmp = ((ins[0].f << 24) % ins[1].f) << 1; - - //printf("%lld %lld\n", (ins[0].f << 23) % ins[1].f, ins[1].f); - - if(mtmp > ins[1].f) - res.f |= 3; - else if(mtmp == ins[1].f) - res.f |= 2; - else if(mtmp > 0) - res.f |= 1; - } - - fpim_round(&res); - - return fpim_encode(&res); -} - -int V810_FP_Ops::cmp(uint32 a, uint32 b) -{ - fpim ins[2]; - - if(fp_is_inf_nan_sub(a) || fp_is_inf_nan_sub(b)) - { - exception_flags |= flag_reserved; - return(~0U); - } - - fpim_decode(&ins[0], a); - fpim_decode(&ins[1], b); - - if(ins[0].exp > ins[1].exp) - return(ins[0].sign ? -1 : 1); - - if(ins[0].exp < ins[1].exp) - return(ins[1].sign ? 1 : -1); - - if(ins[0].f > ins[1].f) - return(ins[0].sign ? -1 : 1); - - if(ins[0].f < ins[1].f) - return(ins[1].sign ? 1 : -1); - - if((ins[0].sign ^ ins[1].sign) && ins[0].f != 0) - return(ins[0].sign ? -1 : 1); - - return(0); -} - -uint32 V810_FP_Ops::itof(uint32 v) -{ - fpim res; - - res.sign = (bool)(v & 0x80000000); - res.exp = 23; - res.f = res.sign ? (0x80000000 - (v & 0x7FFFFFFF)) : (v & 0x7FFFFFFF); - - fpim_round(&res); - - return fpim_encode(&res); -} - - -uint32 V810_FP_Ops::ftoi(uint32 v, bool truncate) -{ - fpim ins; - int sa; - int ret; - - if(fp_is_inf_nan_sub(v)) - { - exception_flags |= flag_reserved; - return(~0U); - } - - fpim_decode(&ins, v); - fpim_round_int(&ins, truncate); - - sa = ins.exp - 23; - - if(sa < 0) - { - if(sa <= -32) - ret = 0; - else - ret = ins.f >> -sa; - } - else - { - if(sa >= 8) - { - if(sa == 8 && ins.f == 0x800000 && ins.sign) - return(0x80000000); - else - { - ret = ~0U; - exception_flags |= flag_invalid; - } - } - else - { - ret = ins.f << sa; - } - } - //printf("%d\n", sa); - - if(ins.sign) - ret = -ret; - - return(ret); -} - diff --git a/waterbox/pcfx/v810/v810_fp_ops.h b/waterbox/pcfx/v810/v810_fp_ops.h deleted file mode 100644 index 9c2c026587..0000000000 --- a/waterbox/pcfx/v810/v810_fp_ops.h +++ /dev/null @@ -1,77 +0,0 @@ -/******************************************************************************/ -/* Mednafen - Multi-system Emulator */ -/******************************************************************************/ -/* v810_fp_ops.h: -** Copyright (C) 2014-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "../defs.h" - -class V810_FP_Ops -{ - public: - - uint32 mul(uint32 a, uint32 b); - uint32 div(uint32 a, uint32 b); - uint32 add(uint32 a, uint32 b); - uint32 sub(uint32 a, uint32 b); - int cmp(uint32 a, uint32 b); - - uint32 itof(uint32 v); - uint32 ftoi(uint32 v, bool truncate); - - enum - { - flag_invalid = 0x0001, - flag_divbyzero = 0x0002, - flag_overflow = 0x0004, - flag_underflow = 0x0008, - flag_inexact = 0x0010, - flag_reserved = 0x0020 - }; - - inline uint32 get_flags(void) - { - return exception_flags; - } - - inline void clear_flags(void) - { - exception_flags = 0; - } - - private: - - unsigned exception_flags; - - struct fpim - { - uint64 f; - int exp; - bool sign; - }; - - bool fp_is_zero(uint32 v); - bool fp_is_inf_nan_sub(uint32 v); - - unsigned clz64(uint64 v); - void fpim_decode(fpim* df, uint32 v); - void fpim_round(fpim* df); - void fpim_round_int(fpim* df, bool truncate = false); - uint32 fpim_encode(fpim* df); -}; - diff --git a/waterbox/pcfx/v810/v810_oploop.inc b/waterbox/pcfx/v810/v810_oploop.inc deleted file mode 100644 index 6b5015c744..0000000000 --- a/waterbox/pcfx/v810/v810_oploop.inc +++ /dev/null @@ -1,1130 +0,0 @@ -/* V810 Emulator - * - * Copyright (C) 2006 David Tucker - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - - - // Macro test taken from http://gcc.gnu.org/viewcvs/trunk/gcc/testsuite/gcc.dg/20020919-1.c?view=markup&pathrev=142696 - //#if defined (__powerpc__) || defined (__PPC__) || defined (__ppc__) || defined (__POWERPC__) || defined (PPC) || defined (_IBMR2) - // register v810_timestamp_t timestamp_rl asm("15") = v810_timestamp; - //#elif defined(__x86_64__) - // register v810_timestamp_t timestamp_rl asm("r11") = v810_timestamp; - //#else - register v810_timestamp_t timestamp_rl = v810_timestamp; - //#endif - - uint32 opcode; - uint32 tmp2; - int val = 0; - - - #define ADDCLOCK(__n) { timestamp += __n; } - - #define CHECK_HALTED(); { if(Halted && timestamp < next_event_ts) { timestamp = next_event_ts; } } - - while(Running) - { - #ifdef RB_DEBUGMODE - uint32 old_PC = RB_GETPC(); - #endif - uint32 tmpop; - - assert(timestamp_rl <= next_event_ts); - - if(!IPendingCache) - { - if(Halted) - { - timestamp_rl = next_event_ts; - } - else if(in_bstr) - { - tmpop = in_bstr_to; - opcode = tmpop >> 9; - goto op_BSTR; - } - } - - while(timestamp_rl < next_event_ts) - { - #ifdef RB_DEBUGMODE - old_PC = RB_GETPC(); - #endif - - P_REG[0] = 0; //Zero the Zero Reg!!! - - RB_CPUHOOK(RB_GETPC()); - - { - //printf("%08x\n", RB_GETPC()); - { - v810_timestamp_t timestamp = timestamp_rl; - - tmpop = RB_RDOP(0, 0); - - timestamp_rl = timestamp; - } - - opcode = (tmpop >> 9) | IPendingCache; - - //printf("%02x\n", opcode >> 1); -#if HAVE_COMPUTED_GOTO - #define CGBEGIN static const void *const op_goto_table[256] = { - #define CGE(l) &&l, - #define CGEND }; goto *op_goto_table[opcode]; -#else - /* (uint8) cast for cheaper alternative to generated branch+compare bounds check instructions, but still more - expensive than computed goto which needs no masking nor bounds checking. - */ - #define CGBEGIN { enum { CGESB = 1 + __COUNTER__ }; switch((uint8)opcode) { - #define CGE(l) case __COUNTER__ - CGESB: goto l; - #define CGEND } } -#endif - - CGBEGIN - CGE(op_MOV) CGE(op_MOV) CGE(op_ADD) CGE(op_ADD) CGE(op_SUB) CGE(op_SUB) CGE(op_CMP) CGE(op_CMP) - CGE(op_SHL) CGE(op_SHL) CGE(op_SHR) CGE(op_SHR) CGE(op_JMP) CGE(op_JMP) CGE(op_SAR) CGE(op_SAR) - CGE(op_MUL) CGE(op_MUL) CGE(op_DIV) CGE(op_DIV) CGE(op_MULU) CGE(op_MULU) CGE(op_DIVU) CGE(op_DIVU) - CGE(op_OR) CGE(op_OR) CGE(op_AND) CGE(op_AND) CGE(op_XOR) CGE(op_XOR) CGE(op_NOT) CGE(op_NOT) - CGE(op_MOV_I) CGE(op_MOV_I) CGE(op_ADD_I) CGE(op_ADD_I) CGE(op_SETF) CGE(op_SETF) CGE(op_CMP_I) CGE(op_CMP_I) - CGE(op_SHL_I) CGE(op_SHL_I) CGE(op_SHR_I) CGE(op_SHR_I) CGE(op_EI) CGE(op_EI) CGE(op_SAR_I) CGE(op_SAR_I) - CGE(op_TRAP) CGE(op_TRAP) CGE(op_RETI) CGE(op_RETI) CGE(op_HALT) CGE(op_HALT) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_LDSR) CGE(op_LDSR) CGE(op_STSR) CGE(op_STSR) CGE(op_DI) CGE(op_DI) CGE(op_BSTR) CGE(op_BSTR) - CGE(op_BV) CGE(op_BL) CGE(op_BE) CGE(op_BNH) CGE(op_BN) CGE(op_BR) CGE(op_BLT) CGE(op_BLE) - CGE(op_BNV) CGE(op_BNL) CGE(op_BNE) CGE(op_BH) CGE(op_BP) CGE(op_NOP) CGE(op_BGE) CGE(op_BGT) - CGE(op_MOVEA) CGE(op_MOVEA) CGE(op_ADDI) CGE(op_ADDI) CGE(op_JR) CGE(op_JR) CGE(op_JAL) CGE(op_JAL) - CGE(op_ORI) CGE(op_ORI) CGE(op_ANDI) CGE(op_ANDI) CGE(op_XORI) CGE(op_XORI) CGE(op_MOVHI) CGE(op_MOVHI) - CGE(op_LD_B) CGE(op_LD_B) CGE(op_LD_H) CGE(op_LD_H) CGE(op_INVALID) CGE(op_INVALID) CGE(op_LD_W) CGE(op_LD_W) - CGE(op_ST_B) CGE(op_ST_B) CGE(op_ST_H) CGE(op_ST_H) CGE(op_INVALID) CGE(op_INVALID) CGE(op_ST_W) CGE(op_ST_W) - CGE(op_IN_B) CGE(op_IN_B) CGE(op_IN_H) CGE(op_IN_H) CGE(op_CAXI) CGE(op_CAXI) CGE(op_IN_W) CGE(op_IN_W) - CGE(op_OUT_B) CGE(op_OUT_B) CGE(op_OUT_H) CGE(op_OUT_H) CGE(op_FPP) CGE(op_FPP) CGE(op_OUT_W) CGE(op_OUT_W) - - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) - CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INVALID) CGE(op_INT_HANDLER) - CGEND - - // Bit string subopcodes - #define DO_AM_BSTR() \ - const uint32 arg1 = (tmpop >> 5) & 0x1F; \ - const uint32 arg2 = (tmpop & 0x1F); \ - RB_INCPCBY2(); - - - #define DO_AM_FPP() \ - const uint32 arg1 = (tmpop >> 5) & 0x1F; \ - const uint32 arg2 = (tmpop & 0x1F); \ - const uint32 arg3 = ((RB_RDOP(2) >> 10)&0x3F); \ - RB_INCPCBY4(); - - - #define DO_AM_UDEF() \ - RB_INCPCBY2(); - - #define DO_AM_I() \ - const uint32 arg1 = tmpop & 0x1F; \ - const uint32 arg2 = (tmpop >> 5) & 0x1F; \ - RB_INCPCBY2(); - - #define DO_AM_II() DO_AM_I(); - - - #define DO_AM_IV() \ - const uint32 arg1 = ((tmpop & 0x000003FF) << 16) | RB_RDOP(2); \ - - - #define DO_AM_V() \ - const uint32 arg3 = (tmpop >> 5) & 0x1F; \ - const uint32 arg2 = tmpop & 0x1F; \ - const uint32 arg1 = RB_RDOP(2); \ - RB_INCPCBY4(); - - - #define DO_AM_VIa() \ - const uint32 arg1 = RB_RDOP(2); \ - const uint32 arg2 = tmpop & 0x1F; \ - const uint32 arg3 = (tmpop >> 5) & 0x1F; \ - RB_INCPCBY4(); \ - - - #define DO_AM_VIb() \ - const uint32 arg1 = (tmpop >> 5) & 0x1F; \ - const uint32 arg2 = RB_RDOP(2); \ - const uint32 arg3 = (tmpop & 0x1F); \ - RB_INCPCBY4(); \ - - #define DO_AM_IX() \ - const uint32 arg1 = (tmpop & 0x1); \ - RB_INCPCBY2(); \ - - #define DO_AM_III() \ - const uint32 arg1 = tmpop & 0x1FE; - - #include "v810_do_am.h" - - #define BEGIN_OP(meowtmpop) { op_##meowtmpop: v810_timestamp_t timestamp = timestamp_rl; DO_##meowtmpop ##_AM(); - #define END_OP() timestamp_rl = timestamp; goto OpFinished; } - #define END_OP_SKIPLO() timestamp_rl = timestamp; goto OpFinishedSkipLO; } - - BEGIN_OP(MOV); - ADDCLOCK(1); - SetPREG(arg2, P_REG[arg1]); - END_OP(); - - - BEGIN_OP(ADD); - ADDCLOCK(1); - uint32 temp = P_REG[arg2] + P_REG[arg1]; - - SetFlag(PSW_OV, ((P_REG[arg2]^(~P_REG[arg1]))&(P_REG[arg2]^temp))&0x80000000); - SetFlag(PSW_CY, temp < P_REG[arg2]); - - SetPREG(arg2, temp); - SetSZ(P_REG[arg2]); - END_OP(); - - - BEGIN_OP(SUB); - ADDCLOCK(1); - uint32 temp = P_REG[arg2] - P_REG[arg1]; - - SetFlag(PSW_OV, ((P_REG[arg2]^P_REG[arg1])&(P_REG[arg2]^temp))&0x80000000); - SetFlag(PSW_CY, temp > P_REG[arg2]); - - SetPREG(arg2, temp); - SetSZ(P_REG[arg2]); - END_OP(); - - - BEGIN_OP(CMP); - ADDCLOCK(1); - uint32 temp = P_REG[arg2] - P_REG[arg1]; - - SetSZ(temp); - SetFlag(PSW_OV, ((P_REG[arg2]^P_REG[arg1])&(P_REG[arg2]^temp))&0x80000000); - SetFlag(PSW_CY, temp > P_REG[arg2]); - END_OP(); - - - BEGIN_OP(SHL); - ADDCLOCK(1); - val = P_REG[arg1] & 0x1F; - - // set CY before we destroy the regisrer info.... - SetFlag(PSW_CY, (val != 0) && ((P_REG[arg2] >> (32 - val))&0x01) ); - SetFlag(PSW_OV, FALSE); - SetPREG(arg2, P_REG[arg2] << val); - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(SHR); - ADDCLOCK(1); - val = P_REG[arg1] & 0x1F; - // set CY before we destroy the regisrer info.... - SetFlag(PSW_CY, (val) && ((P_REG[arg2] >> (val-1))&0x01)); - SetFlag(PSW_OV, FALSE); - SetPREG(arg2, P_REG[arg2] >> val); - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(JMP); - - (void)arg2; // arg2 is unused. - - ADDCLOCK(3); - RB_SETPC((P_REG[arg1] & 0xFFFFFFFE)); - if(RB_AccurateMode) - { - BRANCH_ALIGN_CHECK(PC); - } - RB_ADDBT(old_PC, RB_GETPC(), 0); - END_OP(); - - BEGIN_OP(SAR); - ADDCLOCK(1); - val = P_REG[arg1] & 0x1F; - - SetFlag(PSW_CY, (val) && ((P_REG[arg2]>>(val-1))&0x01) ); - SetFlag(PSW_OV, FALSE); - - SetPREG(arg2, (uint32) ((int32)P_REG[arg2] >> val)); - - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(OR); - ADDCLOCK(1); - SetPREG(arg2, P_REG[arg1] | P_REG[arg2]); - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(AND); - ADDCLOCK(1); - SetPREG(arg2, P_REG[arg1] & P_REG[arg2]); - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(XOR); - ADDCLOCK(1); - SetPREG(arg2, P_REG[arg1] ^ P_REG[arg2]); - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(NOT); - ADDCLOCK(1); - SetPREG(arg2, ~P_REG[arg1]); - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(MOV_I); - ADDCLOCK(1); - SetPREG(arg2,sign_5(arg1)); - END_OP(); - - BEGIN_OP(ADD_I); - ADDCLOCK(1); - uint32 temp = P_REG[arg2] + sign_5(arg1); - - SetFlag(PSW_OV, ((P_REG[arg2]^(~sign_5(arg1)))&(P_REG[arg2]^temp))&0x80000000); - SetFlag(PSW_CY, (uint32)temp < P_REG[arg2]); - - SetPREG(arg2, (uint32)temp); - SetSZ(P_REG[arg2]); - END_OP(); - - - BEGIN_OP(SETF); - ADDCLOCK(1); - - P_REG[arg2] = 0; - - switch (arg1 & 0x0F) - { - case COND_V: - if (TESTCOND_V) P_REG[arg2] = 1; - break; - case COND_C: - if (TESTCOND_C) P_REG[arg2] = 1; - break; - case COND_Z: - if (TESTCOND_Z) P_REG[arg2] = 1; - break; - case COND_NH: - if (TESTCOND_NH) P_REG[arg2] = 1; - break; - case COND_S: - if (TESTCOND_S) P_REG[arg2] = 1; - break; - case COND_T: - P_REG[arg2] = 1; - break; - case COND_LT: - if (TESTCOND_LT) P_REG[arg2] = 1; - break; - case COND_LE: - if (TESTCOND_LE) P_REG[arg2] = 1; - break; - case COND_NV: - if (TESTCOND_NV) P_REG[arg2] = 1; - break; - case COND_NC: - if (TESTCOND_NC) P_REG[arg2] = 1; - break; - case COND_NZ: - if (TESTCOND_NZ) P_REG[arg2] = 1; - break; - case COND_H: - if (TESTCOND_H) P_REG[arg2] = 1; - break; - case COND_NS: - if (TESTCOND_NS) P_REG[arg2] = 1; - break; - case COND_F: - //always false! do nothing more - break; - case COND_GE: - if (TESTCOND_GE) P_REG[arg2] = 1; - break; - case COND_GT: - if (TESTCOND_GT) P_REG[arg2] = 1; - break; - } - END_OP(); - - BEGIN_OP(CMP_I); - ADDCLOCK(1); - uint32 temp = P_REG[arg2] - sign_5(arg1); - - SetSZ(temp); - SetFlag(PSW_OV, ((P_REG[arg2]^(sign_5(arg1)))&(P_REG[arg2]^temp))&0x80000000); - SetFlag(PSW_CY, temp > P_REG[arg2]); - END_OP(); - - BEGIN_OP(SHR_I); - ADDCLOCK(1); - SetFlag(PSW_CY, arg1 && ((P_REG[arg2] >> (arg1-1))&0x01) ); - // set CY before we destroy the regisrer info.... - SetPREG(arg2, P_REG[arg2] >> arg1); - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(SHL_I); - ADDCLOCK(1); - SetFlag(PSW_CY, arg1 && ((P_REG[arg2] >> (32 - arg1))&0x01) ); - // set CY before we destroy the regisrer info.... - - SetPREG(arg2, P_REG[arg2] << arg1); - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(SAR_I); - ADDCLOCK(1); - SetFlag(PSW_CY, arg1 && ((P_REG[arg2]>>(arg1-1))&0x01) ); - - SetPREG(arg2, (uint32) ((int32)P_REG[arg2] >> arg1)); - - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg2]); - END_OP(); - - BEGIN_OP(LDSR); // Loads a Sys Reg with the value in specified PR - ADDCLOCK(1); // ? - - SetSREG(timestamp, arg1 & 0x1F, P_REG[arg2 & 0x1F]); - END_OP(); - - BEGIN_OP(STSR); // Loads a PR with the value in specified Sys Reg - ADDCLOCK(1); // ? - P_REG[arg2 & 0x1F] = GetSREG(arg1 & 0x1F); - END_OP(); - - BEGIN_OP(EI); - (void)arg1; // arg1 is unused. - (void)arg2; // arg2 is unused. - - if(VBMode) - { - ADDCLOCK(1); - S_REG[PSW] = S_REG[PSW] &~ PSW_ID; - RecalcIPendingCache(); - } - else - { - ADDCLOCK(1); - RB_DECPCBY2(); - Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); - CHECK_HALTED(); - } - END_OP(); - - BEGIN_OP(DI); - (void)arg1; // arg1 is unused. - (void)arg2; // arg2 is unused. - - if(VBMode) - { - ADDCLOCK(1); - S_REG[PSW] |= PSW_ID; - IPendingCache = 0; - } - else - { - ADDCLOCK(1); - RB_DECPCBY2(); - Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); - CHECK_HALTED(); - } - END_OP(); - - - #define COND_BRANCH(cond) \ - if(cond) \ - { \ - ADDCLOCK(3); \ - RB_PCRELCHANGE(sign_9(arg1) & 0xFFFFFFFE); \ - if(RB_AccurateMode) \ - { \ - BRANCH_ALIGN_CHECK(PC); \ - } \ - RB_ADDBT(old_PC, RB_GETPC(), 0); \ - } \ - else \ - { \ - ADDCLOCK(1); \ - RB_INCPCBY2(); \ - } - - BEGIN_OP(BV); - COND_BRANCH(TESTCOND_V); - END_OP(); - - - BEGIN_OP(BL); - COND_BRANCH(TESTCOND_L); - END_OP(); - - BEGIN_OP(BE); - COND_BRANCH(TESTCOND_E); - END_OP(); - - BEGIN_OP(BNH); - COND_BRANCH(TESTCOND_NH); - END_OP(); - - BEGIN_OP(BN); - COND_BRANCH(TESTCOND_N); - END_OP(); - - BEGIN_OP(BR); - COND_BRANCH(TRUE); - END_OP(); - - BEGIN_OP(BLT); - COND_BRANCH(TESTCOND_LT); - END_OP(); - - BEGIN_OP(BLE); - COND_BRANCH(TESTCOND_LE); - END_OP(); - - BEGIN_OP(BNV); - COND_BRANCH(TESTCOND_NV); - END_OP(); - - BEGIN_OP(BNL); - COND_BRANCH(TESTCOND_NL); - END_OP(); - - BEGIN_OP(BNE); - COND_BRANCH(TESTCOND_NE); - END_OP(); - - BEGIN_OP(BH); - COND_BRANCH(TESTCOND_H); - END_OP(); - - BEGIN_OP(BP); - COND_BRANCH(TESTCOND_P); - END_OP(); - - BEGIN_OP(BGE); - COND_BRANCH(TESTCOND_GE); - END_OP(); - - BEGIN_OP(BGT); - COND_BRANCH(TESTCOND_GT); - END_OP(); - - BEGIN_OP(JR); - ADDCLOCK(3); - RB_PCRELCHANGE(sign_26(arg1) & 0xFFFFFFFE); - if(RB_AccurateMode) - { - BRANCH_ALIGN_CHECK(PC); - } - RB_ADDBT(old_PC, RB_GETPC(), 0); - END_OP(); - - BEGIN_OP(JAL); - ADDCLOCK(3); - P_REG[31] = RB_GETPC() + 4; - RB_PCRELCHANGE(sign_26(arg1) & 0xFFFFFFFE); - if(RB_AccurateMode) - { - BRANCH_ALIGN_CHECK(PC); - } - RB_ADDBT(old_PC, RB_GETPC(), 0); - END_OP(); - - BEGIN_OP(MOVEA); - ADDCLOCK(1); - SetPREG(arg3, P_REG[arg2] + sign_16(arg1)); - END_OP(); - - BEGIN_OP(ADDI); - ADDCLOCK(1); - uint32 temp = P_REG[arg2] + sign_16(arg1); - - SetFlag(PSW_OV, ((P_REG[arg2]^(~sign_16(arg1)))&(P_REG[arg2]^temp))&0x80000000); - SetFlag(PSW_CY, (uint32)temp < P_REG[arg2]); - - SetPREG(arg3, (uint32)temp); - SetSZ(P_REG[arg3]); - END_OP(); - - BEGIN_OP(ORI); - ADDCLOCK(1); - SetPREG(arg3, arg1 | P_REG[arg2]); - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg3]); - END_OP(); - - BEGIN_OP(ANDI); - ADDCLOCK(1); - SetPREG(arg3, (arg1 & P_REG[arg2])); - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg3]); - END_OP(); - - BEGIN_OP(XORI); - ADDCLOCK(1); - SetPREG(arg3, arg1 ^ P_REG[arg2]); - SetFlag(PSW_OV, FALSE); - SetSZ(P_REG[arg3]); - END_OP(); - - BEGIN_OP(MOVHI); - ADDCLOCK(1); - SetPREG(arg3, (arg1 << 16) + P_REG[arg2]); - END_OP(); - - // LD.B - BEGIN_OP(LD_B); - ADDCLOCK(1); - tmp2 = (sign_16(arg1)+P_REG[arg2])&0xFFFFFFFF; - - SetPREG(arg3, sign_8(MemRead8(timestamp, tmp2))); - - //should be 3 clocks when executed alone, 2 when precedes another LD, or 1 - //when precedes an instruction with many clocks (I'm guessing FP, MUL, DIV, etc) - if(lastop >= 0) - { - if(lastop == LASTOP_LD) - { - ADDCLOCK(1); - } - else - { - ADDCLOCK(2); - } - } - lastop = LASTOP_LD; - END_OP_SKIPLO(); - - // LD.H - BEGIN_OP(LD_H); - ADDCLOCK(1); - tmp2 = (sign_16(arg1)+P_REG[arg2]) & 0xFFFFFFFE; - SetPREG(arg3, sign_16(MemRead16(timestamp, tmp2))); - - if(lastop >= 0) - { - if(lastop == LASTOP_LD) - { - ADDCLOCK(1); - } - else - { - ADDCLOCK(2); - } - } - lastop = LASTOP_LD; - END_OP_SKIPLO(); - - - // LD.W - BEGIN_OP(LD_W); - ADDCLOCK(1); - - tmp2 = (sign_16(arg1)+P_REG[arg2]) & 0xFFFFFFFC; - - if(MemReadBus32[tmp2 >> 24]) - { - SetPREG(arg3, MemRead32(timestamp, tmp2)); - - if(lastop >= 0) - { - if(lastop == LASTOP_LD) - { - ADDCLOCK(1); - } - else - { - ADDCLOCK(2); - } - } - } - else - { - uint32 rv; - - rv = MemRead16(timestamp, tmp2); - rv |= MemRead16(timestamp, tmp2 | 2) << 16; - - SetPREG(arg3, rv); - - if(lastop >= 0) - { - if(lastop == LASTOP_LD) - { - ADDCLOCK(3); - } - else - { - ADDCLOCK(4); - } - } - } - lastop = LASTOP_LD; - END_OP_SKIPLO(); - - // ST.B - BEGIN_OP(ST_B); - ADDCLOCK(1); - MemWrite8(timestamp, sign_16(arg2)+P_REG[arg3], P_REG[arg1] & 0xFF); - - if(lastop == LASTOP_ST) - { - ADDCLOCK(1); - } - lastop = LASTOP_ST; - END_OP_SKIPLO(); - - // ST.H - BEGIN_OP(ST_H); - ADDCLOCK(1); - - MemWrite16(timestamp, (sign_16(arg2)+P_REG[arg3])&0xFFFFFFFE, P_REG[arg1] & 0xFFFF); - - if(lastop == LASTOP_ST) - { - ADDCLOCK(1); - } - lastop = LASTOP_ST; - END_OP_SKIPLO(); - - // ST.W - BEGIN_OP(ST_W); - ADDCLOCK(1); - tmp2 = (sign_16(arg2)+P_REG[arg3]) & 0xFFFFFFFC; - - if(MemWriteBus32[tmp2 >> 24]) - { - MemWrite32(timestamp, tmp2, P_REG[arg1]); - - if(lastop == LASTOP_ST) - { - ADDCLOCK(1); - } - } - else - { - MemWrite16(timestamp, tmp2, P_REG[arg1] & 0xFFFF); - MemWrite16(timestamp, tmp2 | 2, P_REG[arg1] >> 16); - - if(lastop == LASTOP_ST) - { - ADDCLOCK(3); - } - } - lastop = LASTOP_ST; - END_OP_SKIPLO(); - - // IN.B - BEGIN_OP(IN_B); - { - ADDCLOCK(3); - SetPREG(arg3, IORead8(timestamp, sign_16(arg1)+P_REG[arg2])); - } - lastop = LASTOP_IN; - END_OP_SKIPLO(); - - - // IN.H - BEGIN_OP(IN_H); - { - ADDCLOCK(3); - SetPREG(arg3, IORead16(timestamp, (sign_16(arg1)+P_REG[arg2]) & 0xFFFFFFFE)); - } - lastop = LASTOP_IN; - END_OP_SKIPLO(); - - - // IN.W - BEGIN_OP(IN_W); - if(IORead32) - { - ADDCLOCK(3); - SetPREG(arg3, IORead32(timestamp, (sign_16(arg1)+P_REG[arg2]) & 0xFFFFFFFC)); - } - else - { - uint32 eff_addr = (sign_16(arg1) + P_REG[arg2]) & 0xFFFFFFFC; - uint32 rv; - - ADDCLOCK(5); - - rv = IORead16(timestamp, eff_addr); - rv |= IORead16(timestamp, eff_addr | 2) << 16; - - SetPREG(arg3, rv); - } - lastop = LASTOP_IN; - END_OP_SKIPLO(); - - - // OUT.B - BEGIN_OP(OUT_B); - ADDCLOCK(1); - IOWrite8(timestamp, sign_16(arg2)+P_REG[arg3],P_REG[arg1]&0xFF); - - if(lastop == LASTOP_OUT) - { - ADDCLOCK(1); - } - lastop = LASTOP_OUT; - END_OP_SKIPLO(); - - - // OUT.H - BEGIN_OP(OUT_H); - ADDCLOCK(1); - IOWrite16(timestamp, (sign_16(arg2)+P_REG[arg3])&0xFFFFFFFE,P_REG[arg1]&0xFFFF); - - if(lastop == LASTOP_OUT) - { - ADDCLOCK(1); - } - lastop = LASTOP_OUT; - END_OP_SKIPLO(); - - - // OUT.W - BEGIN_OP(OUT_W); - ADDCLOCK(1); - - if(IOWrite32) - IOWrite32(timestamp, (sign_16(arg2)+P_REG[arg3])&0xFFFFFFFC,P_REG[arg1]); - else - { - uint32 eff_addr = (sign_16(arg2)+P_REG[arg3])&0xFFFFFFFC; - IOWrite16(timestamp, eff_addr, P_REG[arg1] & 0xFFFF); - IOWrite16(timestamp, eff_addr | 2, P_REG[arg1] >> 16); - } - - if(lastop == LASTOP_OUT) - { - if(IOWrite32) - { - ADDCLOCK(1); - } - else - { - ADDCLOCK(3); - } - } - lastop = LASTOP_OUT; - END_OP_SKIPLO(); - - BEGIN_OP(NOP); - (void)arg1; // arg1 is unused. - - ADDCLOCK(1); - RB_INCPCBY2(); - END_OP(); - - BEGIN_OP(RETI); - (void)arg1; // arg1 is unused. - - ADDCLOCK(10); - - //Return from Trap/Interupt - if(S_REG[PSW] & PSW_NP) { // Read the FE Reg - RB_SETPC(S_REG[FEPC] & 0xFFFFFFFE); - S_REG[PSW] = S_REG[FEPSW]; - } else { //Read the EI Reg Interupt - RB_SETPC(S_REG[EIPC] & 0xFFFFFFFE); - S_REG[PSW] = S_REG[EIPSW]; - } - RecalcIPendingCache(); - - RB_ADDBT(old_PC, RB_GETPC(), 0); - END_OP(); - - BEGIN_OP(MUL); - ADDCLOCK(13); - - uint64 temp = (int64)(int32)P_REG[arg1] * (int32)P_REG[arg2]; - - SetPREG(30, (uint32)(temp >> 32)); - SetPREG(arg2, temp); - SetSZ(P_REG[arg2]); - SetFlag(PSW_OV, temp != (uint64)(int64)(int32)(uint32)temp); - lastop = -1; - END_OP_SKIPLO(); - - BEGIN_OP(MULU); - ADDCLOCK(13); - uint64 temp = (uint64)P_REG[arg1] * (uint64)P_REG[arg2]; - - SetPREG(30, (uint32)(temp >> 32)); - SetPREG(arg2, (uint32)temp); - - SetSZ(P_REG[arg2]); - SetFlag(PSW_OV, temp != (uint32)temp); - lastop = -1; - END_OP_SKIPLO(); - - BEGIN_OP(DIVU); - ADDCLOCK(36); - if(P_REG[arg1] == 0) // Divide by zero! - { - RB_DECPCBY2(); - Exception(ZERO_DIV_HANDLER_ADDR, ECODE_ZERO_DIV); - CHECK_HALTED(); - } - else - { - // Careful here, since arg2 can be == 30 - uint32 quotient = (uint32)P_REG[arg2] / (uint32)P_REG[arg1]; - uint32 remainder = (uint32)P_REG[arg2] % (uint32)P_REG[arg1]; - - SetPREG(30, remainder); - SetPREG(arg2, quotient); - - SetFlag(PSW_OV, FALSE); - SetSZ(quotient); - } - lastop = -1; - END_OP_SKIPLO(); - - BEGIN_OP(DIV); - //if(P_REG[arg1] & P_REG[arg2] & 0x80000000) - //{ - // printf("Div: %08x %08x\n", P_REG[arg1], P_REG[arg2]); - //} - - ADDCLOCK(38); - if((uint32)P_REG[arg1] == 0) // Divide by zero! - { - RB_DECPCBY2(); - Exception(ZERO_DIV_HANDLER_ADDR, ECODE_ZERO_DIV); - CHECK_HALTED(); - } - else - { - if((P_REG[arg2]==0x80000000)&&(P_REG[arg1]==0xFFFFFFFF)) - { - SetFlag(PSW_OV, TRUE); - P_REG[30]=0; - SetPREG(arg2, 0x80000000); - SetSZ(P_REG[arg2]); - } - else - { - // Careful here, since arg2 can be == 30 - uint32 quotient = (int32)P_REG[arg2] / (int32)P_REG[arg1]; - uint32 remainder = (int32)P_REG[arg2] % (int32)P_REG[arg1]; - - SetPREG(30, remainder); - SetPREG(arg2, quotient); - - SetFlag(PSW_OV, FALSE); - SetSZ(quotient); - } - } - lastop = -1; - END_OP_SKIPLO(); - - BEGIN_OP(FPP); - ADDCLOCK(1); - fpu_subop(timestamp, arg3, arg1, arg2); - lastop = -1; - CHECK_HALTED(); - END_OP_SKIPLO(); - - BEGIN_OP(BSTR); - if(!in_bstr) - { - ADDCLOCK(1); - } - - if(bstr_subop(timestamp, arg2, arg1)) - { - RB_DECPCBY2(); - in_bstr = TRUE; - in_bstr_to = tmpop; - } - else - { - in_bstr = FALSE; - have_src_cache = have_dst_cache = FALSE; - } - END_OP(); - - BEGIN_OP(HALT); - (void)arg1; // arg1 is unused. - - ADDCLOCK(1); - Halted = HALT_HALT; - //printf("Untested opcode: HALT\n"); - END_OP(); - - BEGIN_OP(TRAP); - (void)arg2; // arg2 is unused. - - ADDCLOCK(15); - - Exception(TRAP_HANDLER_BASE + (arg1 & 0x10), ECODE_TRAP_BASE + (arg1 & 0x1F)); - CHECK_HALTED(); - END_OP(); - - BEGIN_OP(CAXI); - //printf("Untested opcode: caxi\n"); - - // Lock bus(N/A) - - ADDCLOCK(26); - - { - uint32 addr, tmp, compare_temp; - uint32 to_write; - - addr = sign_16(arg1) + P_REG[arg2]; - addr &= ~3; - - if(MemReadBus32[addr >> 24]) - tmp = MemRead32(timestamp, addr); - else - { - tmp = MemRead16(timestamp, addr); - tmp |= MemRead16(timestamp, addr | 2) << 16; - } - - compare_temp = P_REG[arg3] - tmp; - - SetSZ(compare_temp); - SetFlag(PSW_OV, ((P_REG[arg3]^tmp)&(P_REG[arg3]^compare_temp))&0x80000000); - SetFlag(PSW_CY, compare_temp > P_REG[arg3]); - - if(!compare_temp) // If they're equal... - to_write = P_REG[30]; - else - to_write = tmp; - - if(MemWriteBus32[addr >> 24]) - MemWrite32(timestamp, addr, to_write); - else - { - MemWrite16(timestamp, addr, to_write & 0xFFFF); - MemWrite16(timestamp, addr | 2, to_write >> 16); - } - P_REG[arg3] = tmp; - } - - // Unlock bus(N/A) - - END_OP(); - - - - op_INT_HANDLER: - { - int iNum = ilevel; - - S_REG[EIPC] = GetPC(); - S_REG[EIPSW] = S_REG[PSW]; - - SetPC(0xFFFFFE00 | (iNum << 4)); - - RB_ADDBT(old_PC, RB_GETPC(), 0xFE00 | (iNum << 4)); - - S_REG[ECR] = 0xFE00 | (iNum << 4); - - S_REG[PSW] |= PSW_EP; - S_REG[PSW] |= PSW_ID; - S_REG[PSW] &= ~PSW_AE; - - // Now, set need to set the interrupt enable level to he level that is being processed + 1, - // saturating at 15. - iNum++; - - if(iNum > 0x0F) - iNum = 0x0F; - - S_REG[PSW] &= ~PSW_IA; - S_REG[PSW] |= iNum << 16; - - // Accepting an interrupt takes us out of normal HALT status, of course! - Halted = HALT_NONE; - - // Invalidate our bitstring state(forces the instruction to be re-read, and the r/w buffers reloaded). - in_bstr = FALSE; - have_src_cache = FALSE; - have_dst_cache = FALSE; - - IPendingCache = 0; - - goto OpFinished; - } - - - BEGIN_OP(INVALID); - RB_DECPCBY2(); - if(!RB_AccurateMode) - { - RB_SETPC(RB_GETPC()); - if((uint32)(RB_RDOP(0, 0) >> 9) != opcode) - { - //printf("Trampoline: %08x %02x\n", RB_GETPC(), opcode >> 1); - } - else - { - ADDCLOCK(1); - Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); - CHECK_HALTED(); - } - } - else - { - ADDCLOCK(1); - Exception(INVALID_OP_HANDLER_ADDR, ECODE_INVALID_OP); - CHECK_HALTED(); - } - END_OP(); - - } - - OpFinished: ; - lastop = opcode; - OpFinishedSkipLO: ; - } // end while(timestamp_rl < next_event_ts) - next_event_ts = event_handler(timestamp_rl); - //printf("Next: %d, Cur: %d\n", next_event_ts, timestamp); - } - -v810_timestamp = timestamp_rl; diff --git a/waterbox/pcfx/v810/v810_opt.h b/waterbox/pcfx/v810/v810_opt.h deleted file mode 100644 index 585c50b269..0000000000 --- a/waterbox/pcfx/v810/v810_opt.h +++ /dev/null @@ -1,170 +0,0 @@ -/////////////////////////////////////////////////////////////// -// File: v810_opt.h -// -// Description: Defines used in v810_dis.cpp -// - -#ifndef V810_OPT_H_ -#define V810_OPT_H_ - -#define sign_26(num) ((uint32)sign_x_to_s32(26, num)) -#define sign_16(num) ((uint32)(int16)(num)) -#define sign_14(num) ((uint32)sign_x_to_s32(14, num)) -#define sign_12(num) ((uint32)sign_x_to_s32(12, num)) -#define sign_9(num) ((uint32)sign_x_to_s32(9, num)) -#define sign_8(_value) ((uint32)(int8)(_value)) -#define sign_5(num) ((uint32)sign_x_to_s32(5, num)) - -/////////////////////////////////////////////////////////////////// -// Define Modes -#define AM_I 0x01 -#define AM_II 0x02 -#define AM_III 0x03 -#define AM_IV 0x04 -#define AM_V 0x05 -#define AM_VIa 0x06 // Mode6 form1 -#define AM_VIb 0x0A // Mode6 form2 -#define AM_VII 0x07 -#define AM_VIII 0x08 -#define AM_IX 0x09 -#define AM_BSTR 0x0B // Bit String Instructions -#define AM_FPP 0x0C // Floating Point Instructions -#define AM_UDEF 0x0D // Unknown/Undefined Instructions - -/////////////////////////////////////////////////////////////////// -// Table of Instructions Address Modes - -static const int addr_mode[80] = { - AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, - AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, AM_I, - AM_II, AM_II, AM_II, AM_II, AM_II, AM_II, AM_II, AM_II, - AM_II, AM_IX, AM_IX, AM_UDEF, AM_II, AM_II, AM_II, AM_BSTR, - AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, AM_UDEF, - AM_V, AM_V, AM_IV, AM_IV, AM_V, AM_V, AM_V, AM_V, - AM_VIa, AM_VIa, AM_UDEF, AM_VIa, AM_VIb, AM_VIb, AM_UDEF, AM_VIb, - AM_VIa, AM_VIa, AM_VIa, AM_VIa, AM_VIb, AM_VIb, AM_FPP, AM_VIb, - AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, - AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, AM_III, AM_III -}; -// All instructions greater than 0x50 are undefined (this should not be posible of cource) - - -/////////////////////////////////////////////////////////////////// -// Opcodes for V810 Instruction set -#define MOV 0x00 -#define ADD 0x01 -#define SUB 0x02 -#define CMP 0x03 -#define SHL 0x04 -#define SHR 0x05 -#define JMP 0x06 -#define SAR 0x07 -#define MUL 0x08 -#define DIV 0x09 -#define MULU 0x0A -#define DIVU 0x0B -#define OR 0x0C -#define AND 0x0D -#define XOR 0x0E -#define NOT 0x0F -#define MOV_I 0x10 -#define ADD_I 0x11 -#define SETF 0x12 -#define CMP_I 0x13 -#define SHL_I 0x14 -#define SHR_I 0x15 -#define EI 0x16 -#define SAR_I 0x17 -#define TRAP 0x18 -#define RETI 0x19 -#define HALT 0x1A - //0x1B -#define LDSR 0x1C -#define STSR 0x1D -#define DI 0x1E -#define BSTR 0x1F //Special Bit String Inst - //0x20 - 0x27 // Lost to Branch Instructions -#define MOVEA 0x28 -#define ADDI 0x29 -#define JR 0x2A -#define JAL 0x2B -#define ORI 0x2C -#define ANDI 0x2D -#define XORI 0x2E -#define MOVHI 0x2F -#define LD_B 0x30 -#define LD_H 0x31 - //0x32 -#define LD_W 0x33 -#define ST_B 0x34 -#define ST_H 0x35 - //0x36 -#define ST_W 0x37 -#define IN_B 0x38 -#define IN_H 0x39 -#define CAXI 0x3A -#define IN_W 0x3B -#define OUT_B 0x3C -#define OUT_H 0x3D -#define FPP 0x3E //Special Float Inst -#define OUT_W 0x3F - - -// Branch Instructions ( Extended opcode only for Branch command) -// Common instrcutions commented out - -#define BV 0x40 -#define BL 0x41 -#define BE 0x42 -#define BNH 0x43 -#define BN 0x44 -#define BR 0x45 -#define BLT 0x46 -#define BLE 0x47 -#define BNV 0x48 -#define BNL 0x49 -#define BNE 0x4A -#define BH 0x4B -#define BP 0x4C -#define NOP 0x4D -#define BGE 0x4E -#define BGT 0x4F - -//#define BC 0x41 -//#define BZ 0x42 -//#define BNC 0x49 -//#define BNZ 0x4A - -// Bit String Subopcodes -#define SCH0BSU 0x00 -#define SCH0BSD 0x01 -#define SCH1BSU 0x02 -#define SCH1BSD 0x03 - -#define ORBSU 0x08 -#define ANDBSU 0x09 -#define XORBSU 0x0A -#define MOVBSU 0x0B -#define ORNBSU 0x0C -#define ANDNBSU 0x0D -#define XORNBSU 0x0E -#define NOTBSU 0x0F - - -// Floating Point Subopcodes -#define CMPF_S 0x00 - -#define CVT_WS 0x02 -#define CVT_SW 0x03 -#define ADDF_S 0x04 -#define SUBF_S 0x05 -#define MULF_S 0x06 -#define DIVF_S 0x07 -#define XB 0x08 -#define XH 0x09 -#define REV 0x0A -#define TRNC_SW 0x0B -#define MPYHW 0x0C - -#endif //DEFINE_H - diff --git a/waterbox/ss/.vscode/settings.json b/waterbox/ss/.vscode/settings.json deleted file mode 100644 index 218a94a620..0000000000 --- a/waterbox/ss/.vscode/settings.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "files.associations": { - "iosfwd": "cpp", - "xstring": "cpp", - "xutility": "cpp", - "system_error": "cpp", - "xlocale": "cpp", - "*.inc": "cpp", - "algorithm": "cpp", - "array": "cpp", - "atomic": "cpp", - "bitset": "cpp", - "cmath": "cpp", - "cstddef": "cpp", - "cstdint": "cpp", - "cstdio": "cpp", - "cstdlib": "cpp", - "cstring": "cpp", - "cwchar": "cpp", - "deque": "cpp", - "exception": "cpp", - "initializer_list": "cpp", - "ios": "cpp", - "istream": "cpp", - "iterator": "cpp", - "limits": "cpp", - "memory": "cpp", - "new": "cpp", - "ostream": "cpp", - "queue": "cpp", - "stdexcept": "cpp", - "streambuf": "cpp", - "string": "cpp", - "tuple": "cpp", - "type_traits": "cpp", - "typeinfo": "cpp", - "utility": "cpp", - "vector": "cpp", - "xfacet": "cpp", - "xiosbase": "cpp", - "xlocinfo": "cpp", - "xlocnum": "cpp", - "xmemory": "cpp", - "xmemory0": "cpp", - "xstddef": "cpp", - "xtr1common": "cpp" - }, - "editor.insertSpaces": false, - "editor.tabSize": 4, - "editor.detectIndentation": false -} \ No newline at end of file diff --git a/waterbox/ss/Makefile b/waterbox/ss/Makefile deleted file mode 100644 index 47a8d0d8ba..0000000000 --- a/waterbox/ss/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -CXXFLAGS := \ - -Wall -Werror=int-to-pointer-cast \ - -std=c++0x -fomit-frame-pointer -fno-exceptions -fno-rtti \ - -DLSB_FIRST - -TARGET = ss.wbx - -SRCS = $(shell find $(ROOT_DIR) -type f -name '*.cpp') - -include ../common.mak diff --git a/waterbox/ss/bizhawk.cpp b/waterbox/ss/bizhawk.cpp deleted file mode 100644 index a58898c1f9..0000000000 --- a/waterbox/ss/bizhawk.cpp +++ /dev/null @@ -1,328 +0,0 @@ -#include "ss.h" -#include -#include "cdrom/cdromif.h" -#include "cdb.h" -#include "smpc.h" -#include "cart.h" -#include - -#define EXPORT extern "C" ECL_EXPORT -using namespace MDFN_IEN_SS; - -int32 (*FirmwareSizeCallback)(const char *filename); -void (*FirmwareDataCallback)(const char *filename, uint8 *dest); - -EXPORT void SetFirmwareCallbacks(int32 (*sizecallback)(const char *filename), void (*datacallback)(const char *filename, uint8 *dest)) -{ - FirmwareSizeCallback = sizecallback; - FirmwareDataCallback = datacallback; -} - -struct FrontendTOC -{ - int32 FirstTrack; - int32 LastTrack; - int32 DiskType; - struct - { - int32 Adr; - int32 Control; - int32 Lba; - int32 Valid; - } Tracks[101]; -}; - -static void (*ReadTOCCallback)(int disk, FrontendTOC *dest); -static void (*ReadSector2448Callback)(int disk, int lba, uint8 *dest); - -EXPORT void SetCDCallbacks(void (*toccallback)(int disk, FrontendTOC *dest), void (*sectorcallback)(int disk, int lba, uint8 *dest)) -{ - ReadTOCCallback = toccallback; - ReadSector2448Callback = sectorcallback; -} - -class MyCDIF : public CDIF -{ - private: - int disk; - - public: - MyCDIF(int disk) : disk(disk) - { - FrontendTOC t; - ReadTOCCallback(disk, &t); - disc_toc.first_track = t.FirstTrack; - disc_toc.last_track = t.LastTrack; - disc_toc.disc_type = t.DiskType; - for (int i = 0; i < 101; i++) - { - disc_toc.tracks[i].adr = t.Tracks[i].Adr; - disc_toc.tracks[i].control = t.Tracks[i].Control; - disc_toc.tracks[i].lba = t.Tracks[i].Lba; - disc_toc.tracks[i].valid = t.Tracks[i].Valid; - } - } - - virtual void HintReadSector(int32 lba) {} - virtual bool ReadRawSector(uint8 *buf, int32 lba) - { - ReadSector2448Callback(disk, lba, buf); - return true; - } - virtual bool ReadRawSectorPWOnly(uint8 *pwbuf, int32 lba, bool hint_fullread) - { - uint8 buff[2448]; - ReadSector2448Callback(disk, lba, buff); - memcpy(pwbuf, buff + 2352, 96); - return true; - } -}; - -static std::vector CDInterfaces; -static uint32 *FrameBuffer; -static uint8 IsResetPushed; // 1 or 0 - -namespace MDFN_IEN_SS -{ -extern bool LoadCD(std::vector *CDInterfaces); -} -EXPORT bool Init(int numDisks, int cartType, int regionDefault, int regionAutodetect) -{ - setting_ss_cart = cartType; - setting_ss_region_autodetect = regionAutodetect; - setting_ss_region_default = regionDefault; - - FrameBuffer = (uint32 *)alloc_invisible(1024 * 1024 * sizeof(*FrameBuffer)); - for (int i = 0; i < numDisks; i++) - CDInterfaces.push_back(new MyCDIF(i)); - auto ret = LoadCD(&CDInterfaces); - if (ret) - SMPC_SetInput(12, nullptr, &IsResetPushed); - return ret; -} - -EXPORT void HardReset() -{ - // soft reset is handled as a normal button - SS_Reset(true); -} - -EXPORT void SetDisk(int disk, bool open) -{ - CDB_SetDisc(open, disk < 0 ? nullptr : CDInterfaces[disk]); -} - -int setting_ss_slstartp = 0; -int setting_ss_slendp = 255; -int setting_ss_slstart = 0; -int setting_ss_slend = 239; -int setting_ss_region_default = SMPC_AREA_JP; -int setting_ss_cart = CART_NONE; -bool setting_ss_correct_aspect = true; -bool setting_ss_h_blend = false; -bool setting_ss_h_overscan = true; -bool setting_ss_region_autodetect = true; -bool setting_ss_input_sport1_multitap = false; -bool setting_ss_input_sport0_multitap = false; - -namespace MDFN_IEN_SS -{ -extern void Emulate(EmulateSpecStruct *espec_arg); -} - -static uint8 ControllerInput[12 * 32]; -bool InputLagged; - -EXPORT void SetControllerData(const uint8_t* controllerData) -{ - memcpy(ControllerInput, controllerData, sizeof(ControllerInput)); -} - -struct MyFrameInfo: public FrameInfo -{ - int32_t ResetPushed; -}; - -EXPORT void FrameAdvance(MyFrameInfo& f) -{ - EmulateSpecStruct e; - int32 LineWidths[1024]; - memset(LineWidths, 0, sizeof(LineWidths)); - e.pixels = FrameBuffer; - e.pitch32 = 1024; - e.LineWidths = LineWidths; - e.SoundBuf = f.SoundBuffer; - e.SoundBufMaxSize = 8192; - IsResetPushed = f.ResetPushed; - InputLagged = true; - Emulate(&e); - f.Samples = e.SoundBufSize; - f.Cycles = e.MasterCycles; - f.Lagged = InputLagged; - - int w = 256; - for (int i = 0; i < e.h; i++) - w = std::max(w, LineWidths[i]); - - const uint32 *src = FrameBuffer; - uint32 *dst = f.VideoBuffer; - const int srcp = 1024; - const int dstp = w; - src += e.y * srcp + e.x; - - for (int j = 0; j < e.h; j++, src += srcp, dst += dstp) - { - memcpy(dst, src, LineWidths[j + e.y] * sizeof(*dst)); - } - f.Width = w; - f.Height = e.h; -} - -static const char *DeviceNames[] = - { - "none", - "gamepad", - "3dpad", - "mouse", - "wheel", - "mission", - "dmission", - "keyboard"}; - -EXPORT void SetupInput(const int *portdevices, const int *multitaps) -{ - for (int i = 0; i < 2; i++) - SMPC_SetMultitap(i, multitaps[i]); - for (int i = 0; i < 12; i++) - SMPC_SetInput(i, DeviceNames[portdevices[i]], ControllerInput + i * 32); -} - -void (*InputCallback)(); -EXPORT void SetInputCallback(void (*callback)()) -{ - InputCallback = callback; -} - -static std::vector MemoryAreas; - -void AddMemoryDomain(const char *name, const void *ptr, int size, int flags) -{ - MemoryArea m; - m.Data = (void*)ptr; - m.Name = name; - m.Size = size; - m.Flags = flags; - MemoryAreas.push_back(m); -} - -EXPORT void GetMemoryAreas(MemoryArea* m) -{ - memcpy(m, MemoryAreas.data(), MemoryAreas.size() * sizeof(MemoryArea)); -} - -EXPORT void SetRtc(int64 ticks, int language) -{ - time_t time = ticks; - const struct tm *tm = gmtime(&time); - SMPC_SetRTC(tm, language); -} - -namespace MDFN_IEN_SS -{ -extern bool CorrectAspect; -extern bool ShowHOverscan; -extern bool DoHBlend; -extern int LineVisFirst; -extern int LineVisLast; -} -EXPORT void SetVideoParameters(bool correctAspect, bool hBlend, bool hOverscan, int sls, int sle) -{ - CorrectAspect = correctAspect; - ShowHOverscan = hOverscan; - DoHBlend = hBlend; - LineVisFirst = sls; - LineVisLast = sle; -} - -// if (BackupRAM_Dirty)SaveBackupRAM(); -// if (CART_GetClearNVDirty())SaveCartNV(); - -/*static MDFN_COLD void CloseGame(void) -{ - try { SaveBackupRAM(); } catch(std::exception& e) { MDFN_PrintError("%s", e.what()); } - try { SaveCartNV(); } catch(std::exception& e) { MDFN_PrintError("%s", e.what()); } - try { SaveRTC(); } catch(std::exception& e) { MDFN_PrintError("%s", e.what()); } - - Cleanup(); -}*/ - -/* - -static MDFN_COLD void BackupCartNV(void) -{ - const char* ext = nullptr; - void* nv_ptr = nullptr; - uint64 nv_size = 0; - - CART_GetNVInfo(&ext, &nv_ptr, &nv_size); - - if(ext) - MDFN_BackupSavFile(10, ext); -}*/ - -/*static MDFN_COLD void LoadCartNV(void) -{ - const char* ext = nullptr; - void* nv_ptr = nullptr; - uint64 nv_size = 0; - - CART_GetNVInfo(&ext, &nv_ptr, &nv_size); - - if(ext) - { - //FileStream nvs(MDFN_MakeFName(MDFNMKF_SAV, 0, ext), FileStream::MODE_READ); - GZFileStream nvs(MDFN_MakeFName(MDFNMKF_SAV, 0, ext), GZFileStream::MODE::READ); - - nvs.read(nv_ptr, nv_size); - } -} - -static MDFN_COLD void SaveCartNV(void) -{ - const char* ext = nullptr; - void* nv_ptr = nullptr; - uint64 nv_size = 0; - - CART_GetNVInfo(&ext, &nv_ptr, &nv_size); - - if(ext) - { - //FileStream nvs(MDFN_MakeFName(MDFNMKF_SAV, 0, ext), FileStream::MODE_WRITE_INPLACE); - GZFileStream nvs(MDFN_MakeFName(MDFNMKF_SAV, 0, ext), GZFileStream::MODE::WRITE); - - nvs.write(nv_ptr, nv_size); - - nvs.close(); - } -}*/ - -/*static MDFN_COLD void SaveRTC(void) -{ - FileStream sds(MDFN_MakeFName(MDFNMKF_SAV, 0, "smpc"), FileStream::MODE_WRITE_INPLACE); - - SMPC_SaveNV(&sds); - - sds.close(); -} - -static MDFN_COLD void LoadRTC(void) -{ - FileStream sds(MDFN_MakeFName(MDFNMKF_SAV, 0, "smpc"), FileStream::MODE_READ); - - SMPC_LoadNV(&sds); -}*/ - -int main() -{ - return 0; -} diff --git a/waterbox/ss/cart.cpp b/waterbox/ss/cart.cpp deleted file mode 100644 index f2ee5519b9..0000000000 --- a/waterbox/ss/cart.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* cart.cpp - Expansion cart emulation -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "ss.h" - -#include "cart.h" -#include "cart/backup.h" -#include "cart/cs1ram.h" -#include "cart/debug.h" -#include "cart/extram.h" -//#include "cart/nlmodem.h" -#include "cart/rom.h" - -namespace MDFN_IEN_SS -{ - -CartInfo Cart; - -template -static MDFN_HOT void DummyRead(uint32 A, uint16* DB) -{ - // Don't set *DB here. - SS_DBG(SS_DBG_WARNING, "[CART] Unknown %zu-byte read from 0x%08x\n", sizeof(T), A); -} - -template -static MDFN_HOT void DummyWrite(uint32 A, uint16* DB) -{ - SS_DBG(SS_DBG_WARNING, "[CART] Unknown %zu-byte write to 0x%08x(DB=0x%04x)\n", sizeof(T), A, *DB); -} - -static sscpu_timestamp_t DummyUpdate(sscpu_timestamp_t timestamp) -{ - return SS_EVENT_DISABLED_TS; -} - -static void DummyAdjustTS(const int32 delta) -{ - -} - -static void DummySetCPUClock(const int32 master_clock, const int32 divider) -{ - -} - -static MDFN_COLD void DummyReset(bool powering_up) -{ - -} - -static MDFN_COLD bool DummyGetClearNVDirty(void) -{ - return false; -} - -static MDFN_COLD void DummyGetNVInfo(const char** ext, void** nv_ptr, uint64* nv_size) -{ - *ext = nullptr; - *nv_ptr = nullptr; - *nv_size = 0; -} - -void CartInfo::CS01_SetRW8W16(uint32 Astart, uint32 Aend, void (*r16)(uint32 A, uint16* DB), void (*w8)(uint32 A, uint16* DB), void (*w16)(uint32 A, uint16* DB)) -{ - assert(Astart >= 0x02000000 && Aend <= 0x04FFFFFF); - - assert(!(Astart & ((1U << 20) - 1))); - assert(!((Aend + 1) & ((1U << 20) - 1))); - - for(unsigned i = (Astart - 0x02000000) >> 20; i <= (Aend - 0x02000000) >> 20; i++) - { - auto& rw = Cart.CS01_RW[i]; - - if(r16) rw.Read16 = r16; - if(w8) rw.Write8 = w8; - if(w16) rw.Write16 = w16; - } -} - -void CartInfo::CS2M_SetRW8W16(uint8 Ostart, uint8 Oend, void (*r16)(uint32 A, uint16* DB), void (*w8)(uint32 A, uint16* DB), void (*w16)(uint32 A, uint16* DB)) -{ - assert(!(Ostart & 0x1)); - assert(Oend & 0x1); - assert(Ostart < 0x40); - assert(Oend < 0x40); - - for(int i = Ostart >> 1; i <= Oend >> 1; i++) - { - auto& rw = Cart.CS2M_RW[i]; - - if(r16) rw.Read16 = r16; - if(w8) rw.Write8 = w8; - if(w16) rw.Write16 = w16; - } -} - - -void CART_Init(const int cart_type) -{ - Cart.CS01_SetRW8W16(0x02000000, 0x04FFFFFF, DummyRead, DummyWrite, DummyWrite); - Cart.CS2M_SetRW8W16(0x00, 0x3F, DummyRead, DummyWrite, DummyWrite); - - Cart.Reset = DummyReset; - Cart.GetNVInfo = DummyGetNVInfo; - Cart.GetClearNVDirty = DummyGetClearNVDirty; - Cart.EventHandler = DummyUpdate; - Cart.AdjustTS = DummyAdjustTS; - Cart.SetCPUClock = DummySetCPUClock; - - switch(cart_type) - { - default: - case CART_NONE: - break; - - case CART_BACKUP_MEM: - CART_Backup_Init(&Cart); - break; - - case CART_EXTRAM_1M: - case CART_EXTRAM_4M: - CART_ExtRAM_Init(&Cart, cart_type == CART_EXTRAM_4M); - break; - - case CART_KOF95: - case CART_ULTRAMAN: - { - CART_ROM_Init(&Cart, cart_type == CART_KOF95 ? "ss.cart.kof95_path" : "ss.cart.ultraman_path"); - } - break; - - case CART_CS1RAM_16M: - CART_CS1RAM_Init(&Cart); - break; - - case CART_MDFN_DEBUG: - CART_Debug_Init(&Cart); - break; - -// case CART_NLMODEM: -// CART_NLModem_Init(&Cart); -// break; - } - - for(auto& m : Cart.CS01_RW) - assert(m.Read16 != nullptr && m.Write8 != nullptr && m.Write16 != nullptr); - - for(auto& m : Cart.CS2M_RW) - assert(m.Read16 != nullptr && m.Write8 != nullptr && m.Write16 != nullptr); -} - -} diff --git a/waterbox/ss/cart.h b/waterbox/ss/cart.h deleted file mode 100644 index 985e467499..0000000000 --- a/waterbox/ss/cart.h +++ /dev/null @@ -1,95 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* cart.h - Expansion cart emulation -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_CART_H -#define __MDFN_SS_CART_H - -namespace MDFN_IEN_SS -{ - -struct CartInfo -{ - void (*Reset)(bool powering_up); - - void (*GetNVInfo)(const char** ext, void** nv_ptr, uint64* nv_size); - bool (*GetClearNVDirty)(void); - - void (*AdjustTS)(const int32 delta); - - // For calculating clock ratios. - void (*SetCPUClock)(const int32 master_clock, const int32 cpu_divider); - - ss_event_handler EventHandler; - - // A >> 20 - struct - { - void (*Read16)(uint32 A, uint16* DB); - void (*Write8)(uint32 A, uint16* DB); - void (*Write16)(uint32 A, uint16* DB); - } CS01_RW[0x30]; - - struct - { - void (*Read16)(uint32 A, uint16* DB); - void (*Write8)(uint32 A, uint16* DB); - void (*Write16)(uint32 A, uint16* DB); - } CS2M_RW[0x20]; - - void CS01_SetRW8W16(uint32 Astart, uint32 Aend, void (*r16)(uint32 A, uint16* DB), void (*w8)(uint32 A, uint16* DB) = nullptr, void (*w16)(uint32 A, uint16* DB) = nullptr); - void CS2M_SetRW8W16(uint8 Ostart, uint8 Oend, void (*r16)(uint32 A, uint16* DB), void (*w8)(uint32 A, uint16* DB) = nullptr, void (*w16)(uint32 A, uint16* DB) = nullptr); -}; - -static INLINE void CART_CS01_Read16_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS01_RW[(size_t)(A >> 20) - (0x02000000 >> 20)].Read16 (A, DB); } -static INLINE void CART_CS01_Write8_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS01_RW[(size_t)(A >> 20) - (0x02000000 >> 20)].Write8 (A, DB); } -static INLINE void CART_CS01_Write16_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS01_RW[(size_t)(A >> 20) - (0x02000000 >> 20)].Write16(A, DB); } - -static INLINE void CART_CS2_Read16_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS2M_RW[(A >> 1) & 0x1F].Read16 (A, DB); } -static INLINE void CART_CS2_Write8_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS2M_RW[(A >> 1) & 0x1F].Write8 (A, DB); } -static INLINE void CART_CS2_Write16_DB(uint32 A, uint16* DB) { extern CartInfo Cart; Cart.CS2M_RW[(A >> 1) & 0x1F].Write16(A, DB); } - -enum -{ - CART__RESERVED = -1, - CART_NONE = 0, - CART_BACKUP_MEM, - CART_EXTRAM_1M, - CART_EXTRAM_4M, - - CART_KOF95, - CART_ULTRAMAN, - - CART_CS1RAM_16M, - - CART_NLMODEM, - - CART_MDFN_DEBUG -}; - -void CART_Init(const int cart_type) MDFN_COLD; -static INLINE ss_event_handler CART_GetEventHandler(void) { extern CartInfo Cart; return Cart.EventHandler; } -static INLINE void CART_AdjustTS(const int32 delta) { extern CartInfo Cart; Cart.AdjustTS(delta); } -static INLINE void CART_SetCPUClock(const int32 master_clock, const int32 cpu_divider) { extern CartInfo Cart; Cart.SetCPUClock(master_clock, cpu_divider); } -static INLINE void CART_GetNVInfo(const char** ext, void** nv_ptr, uint64* nv_size) { extern CartInfo Cart; Cart.GetNVInfo(ext, nv_ptr, nv_size); } -static INLINE bool CART_GetClearNVDirty(void) { extern CartInfo Cart; return Cart.GetClearNVDirty(); } -static INLINE void CART_Reset(bool powering_up) { extern CartInfo Cart; Cart.Reset(powering_up); } -} -#endif diff --git a/waterbox/ss/cart/backup.cpp b/waterbox/ss/cart/backup.cpp deleted file mode 100644 index bab8a23c64..0000000000 --- a/waterbox/ss/cart/backup.cpp +++ /dev/null @@ -1,91 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* backup.cpp - Backup memory(512KiB) cart emulation -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "backup.h" - -namespace MDFN_IEN_SS -{ - -static uint8 *ExtBackupRAM; -static bool ExtBackupRAM_Dirty; - -// TODO: Check mirroring. -template -static MDFN_HOT void ExtBackupRAM_RW_DB(uint32 A, uint16 *DB) -{ - uint8 *const ptr = ExtBackupRAM + ((A >> 1) & 0x7FFFF); - - if (IsWrite) - { - if (A & 1) - { - ExtBackupRAM_Dirty = true; - *ptr = *DB; - } - } - else - { - *DB = (*ptr << 0) | 0xFF00; - - if ((A & ~1) == 0x04FFFFFE) - *DB = 0x21; - } -} - -static MDFN_COLD bool GetClearNVDirty(void) -{ - bool ret = ExtBackupRAM_Dirty; - - ExtBackupRAM_Dirty = false; - - return ret; -} - -static MDFN_COLD void GetNVInfo(const char **ext, void **nv_ptr, uint64 *nv_size) -{ - *ext = "bcr"; - *nv_ptr = ExtBackupRAM; - *nv_size = 524288; -} - -void CART_Backup_Init(CartInfo *c) -{ - static const uint8 init[0x10] = {0x42, 0x61, 0x63, 0x6B, 0x55, 0x70, 0x52, 0x61, 0x6D, 0x20, 0x46, 0x6F, 0x72, 0x6D, 0x61, 0x74}; - - ExtBackupRAM = (uint8 *)alloc_plain(524288); - memset(ExtBackupRAM, 0x00, 524288); - for (unsigned i = 0; i < 0x200; i += 0x10) - memcpy(ExtBackupRAM + i, init, 0x10); - - ExtBackupRAM_Dirty = false; - - c->CS01_SetRW8W16(0x04000000, 0x04FFFFFF, - ExtBackupRAM_RW_DB, - ExtBackupRAM_RW_DB, - ExtBackupRAM_RW_DB); - - c->GetClearNVDirty = GetClearNVDirty; - c->GetNVInfo = GetNVInfo; - - AddMemoryDomain("Backup Cart", ExtBackupRAM, 524288, MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_SAVERAMMABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); -} -} diff --git a/waterbox/ss/cart/backup.h b/waterbox/ss/cart/backup.h deleted file mode 100644 index 7d7946f871..0000000000 --- a/waterbox/ss/cart/backup.h +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* backup.h - Backup memory(512KiB) cart emulation -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_CART_BACKUP_H -#define __MDFN_SS_CART_BACKUP_H - -namespace MDFN_IEN_SS -{ -void CART_Backup_Init(CartInfo* c) MDFN_COLD; -} - -#endif diff --git a/waterbox/ss/cart/common.h b/waterbox/ss/cart/common.h deleted file mode 100644 index 5b2961eb74..0000000000 --- a/waterbox/ss/cart/common.h +++ /dev/null @@ -1,3 +0,0 @@ -#include "../ss.h" -#include "../cart.h" - diff --git a/waterbox/ss/cart/cs1ram.cpp b/waterbox/ss/cart/cs1ram.cpp deleted file mode 100644 index 75ea7a4b29..0000000000 --- a/waterbox/ss/cart/cs1ram.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* cs1ram.cpp - CS1 RAM(16MiB) cart emulation -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "cs1ram.h" - -namespace MDFN_IEN_SS -{ -static uint16 *CS1RAM = nullptr; - -template -static MDFN_HOT void CS1RAM_RW_DB(uint32 A, uint16 *DB) -{ - const uint32 mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF << (((A & 1) ^ 1) << 3)); - uint16 *const ptr = (uint16 *)((uint8 *)CS1RAM + (A & 0x00FFFFFE)); - - if (IsWrite) - *ptr = (*ptr & ~mask) | (*DB & mask); - else - *DB = *ptr; -} - -static MDFN_COLD void Reset(bool powering_up) -{ - if (powering_up) - memset(CS1RAM, 0, 0x1000000); -} - -void CART_CS1RAM_Init(CartInfo *c) -{ - CS1RAM = (uint16 *)alloc_plain(0x1000000); - - SS_SetPhysMemMap(0x04000000, 0x04FFFFFF, CS1RAM, 0x1000000, true); - c->CS01_SetRW8W16(0x04000000, 0x04FFFFFF, - CS1RAM_RW_DB, - CS1RAM_RW_DB, - CS1RAM_RW_DB); - - c->Reset = Reset; - AddMemoryDomain("CS1 Cart", CS1RAM, 0x1000000, MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); -} -} diff --git a/waterbox/ss/cart/cs1ram.h b/waterbox/ss/cart/cs1ram.h deleted file mode 100644 index 56f06cab25..0000000000 --- a/waterbox/ss/cart/cs1ram.h +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* cs1ram.h - CS1 RAM(16MiB) cart emulation -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_CART_CS1RAM_H -#define __MDFN_SS_CART_CS1RAM_H - -namespace MDFN_IEN_SS -{ -void CART_CS1RAM_Init(CartInfo* c) MDFN_COLD; -} - -#endif diff --git a/waterbox/ss/cart/debug.cpp b/waterbox/ss/cart/debug.cpp deleted file mode 100644 index 37b169e4e0..0000000000 --- a/waterbox/ss/cart/debug.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* debug.cpp - Mednafen debug cart emulation -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "debug.h" - -namespace MDFN_IEN_SS -{ - -template -static void Debug_RW_DB(uint32 A, uint16* DB) -{ - // - // printf-related debugging - // - if((A &~ 0x3) == 0x02100000) - { - if(IsWrite) - { - if(A == 0x02100001) - { - fputc(*DB, stderr); - fflush(stderr); - } - } - else - *DB = 0; - - return; - } -} - - -void CART_Debug_Init(CartInfo* c) -{ - c->CS01_SetRW8W16(0x02100000, /*0x02100001*/ 0x021FFFFF, - Debug_RW_DB, - Debug_RW_DB, - Debug_RW_DB); -} - -} diff --git a/waterbox/ss/cart/debug.h b/waterbox/ss/cart/debug.h deleted file mode 100644 index 0413b85a60..0000000000 --- a/waterbox/ss/cart/debug.h +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* debug.h - Mednafen debug cart emulation -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_CART_DEBUG_H -#define __MDFN_SS_CART_DEBUG_H - -namespace MDFN_IEN_SS -{ -void CART_Debug_Init(CartInfo* c) MDFN_COLD; -} - -#endif diff --git a/waterbox/ss/cart/extram.cpp b/waterbox/ss/cart/extram.cpp deleted file mode 100644 index 5761ad15e4..0000000000 --- a/waterbox/ss/cart/extram.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* extram.cpp - Extended RAM(1MiB and 4MiB) cart emulation -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "extram.h" - -namespace MDFN_IEN_SS -{ -static uint16 *ExtRAM; //[0x200000]; -static size_t ExtRAM_Mask; -static uint8 Cart_ID; - -template -static MDFN_HOT void ExtRAM_RW_DB(uint32 A, uint16 *DB) -{ - const uint32 mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF << (((A & 1) ^ 1) << 3)); - uint16 *const ptr = (uint16 *)((uint8 *)ExtRAM + (A & ExtRAM_Mask)); - - //printf("Barf %zu %d: %08x\n", sizeof(T), IsWrite, A); - - if (IsWrite) - *ptr = (*ptr & ~mask) | (*DB & mask); - else - *DB = *ptr; -} - -static MDFN_HOT void CartID_Read_DB(uint32 A, uint16 *DB) -{ - if ((A & ~1) == 0x04FFFFFE) - *DB = Cart_ID; -} - -static MDFN_COLD void Reset(bool powering_up) -{ - if (powering_up) - memset(ExtRAM, 0, 0x400000); // TODO: Test. -} - -void CART_ExtRAM_Init(CartInfo *c, bool R4MiB) -{ - ExtRAM = (uint16 *)alloc_plain(0x400000); - if (R4MiB) - { - Cart_ID = 0x5C; - ExtRAM_Mask = 0x3FFFFE; - } - else - { - Cart_ID = 0x5A; - ExtRAM_Mask = 0x27FFFE; - } - - SS_SetPhysMemMap(0x02400000, 0x025FFFFF, ExtRAM + (0x000000 / sizeof(uint16)), (R4MiB ? 0x200000 : 0x080000), true); - SS_SetPhysMemMap(0x02600000, 0x027FFFFF, ExtRAM + (0x200000 / sizeof(uint16)), (R4MiB ? 0x200000 : 0x080000), true); - - c->CS01_SetRW8W16(0x02400000, 0x027FFFFF, - ExtRAM_RW_DB, - ExtRAM_RW_DB, - ExtRAM_RW_DB); - - c->CS01_SetRW8W16(/*0x04FFFFFE*/ 0x04F00000, 0x04FFFFFF, CartID_Read_DB); - - c->Reset = Reset; - AddMemoryDomain("Ram Cart", ExtRAM, 0x400000, MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); -} -} diff --git a/waterbox/ss/cart/extram.h b/waterbox/ss/cart/extram.h deleted file mode 100644 index c63287b0ae..0000000000 --- a/waterbox/ss/cart/extram.h +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* extram.h - Extended RAM(1MiB and 4MiB) cart emulation -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_CART_EXTRAM_H -#define __MDFN_SS_CART_EXTRAM_H - -namespace MDFN_IEN_SS -{ -void CART_ExtRAM_Init(CartInfo* c, bool R4MiB) MDFN_COLD; -} - -#endif diff --git a/waterbox/ss/cart/rom.cpp b/waterbox/ss/cart/rom.cpp deleted file mode 100644 index f4d07817e3..0000000000 --- a/waterbox/ss/cart/rom.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* rom.cpp - ROM cart emulation -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "rom.h" - -namespace MDFN_IEN_SS -{ - -static uint16 *ROM; //[0x100000]; - -static MDFN_HOT void ROM_Read(uint32 A, uint16 *DB) -{ - // TODO: Check mirroring. - //printf("ROM: %08x\n", A); - *DB = *(uint16 *)((uint8 *)ROM + (A & 0x1FFFFE)); -} - -void CART_ROM_Init(CartInfo *c, const char *filename) -{ - if (FirmwareSizeCallback(filename) != 0x200000) - abort(); - ROM = (uint16 *)alloc_sealed(0x200000); - FirmwareDataCallback(filename, (uint8 *)ROM); - - for (unsigned i = 0; i < 0x100000; i++) - { - ROM[i] = MDFN_de16msb(&ROM[i]); - } - - SS_SetPhysMemMap(0x02000000, 0x03FFFFFF, ROM, 0x200000, false); - c->CS01_SetRW8W16(0x02000000, 0x03FFFFFF, ROM_Read); - AddMemoryDomain("Rom Cart", ROM, 0x200000, MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); -} -} diff --git a/waterbox/ss/cart/rom.h b/waterbox/ss/cart/rom.h deleted file mode 100644 index 3d4a393658..0000000000 --- a/waterbox/ss/cart/rom.h +++ /dev/null @@ -1,30 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* rom.h - ROM cart emulation -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_CART_ROM_H -#define __MDFN_SS_CART_ROM_H - -namespace MDFN_IEN_SS -{ -void CART_ROM_Init(CartInfo* c, const char* filename) MDFN_COLD; -} - -#endif diff --git a/waterbox/ss/cdb.cpp b/waterbox/ss/cdb.cpp deleted file mode 100644 index ee3ab3496a..0000000000 --- a/waterbox/ss/cdb.cpp +++ /dev/null @@ -1,3630 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* cdb.cpp - CD Block Emulation -** Copyright (C) 2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// TODO: Respect auth type with COMMAND_AUTH_DEVICE. - -// TODO: Test INIT 0x00 side effects(and see if it affects CD device connection) - -// TODO: edc_lec_check_and_correct - -// TODO: Proper seek delays(for "Gungriffon" FMV) - -// TODO: Some filesys commands(at least change dir, read file) seem to reset the saved command start and end positions(accessed via 0xFFFFFF to PLAY command) to something -// akin to 0. - -// TODO: SMPC CD off/on - -// TODO: Consider serializing HIRQ_PEND and HIRQ_SCDQ with command execution. - -// TODO: Look into weird issue where WAIT status for Change Dir might be set to 1 slightly after CMOK IRQ is triggered... - -// TODO: Test state reset on Init with SW reset. - -// TODO: Scan command. - -// TODO: assert()s - -// TODO: Reject all commands during disc startup? - -// TODO: for(unsigned i = 0; i < 5; i++) DT_ReadIntoFIFO(); - -// TODO: Auth and auth type. - -// TODO: Test play command while filesys op is in progress. - -#include "ss.h" -#include "scu.h" -#include "sound.h" - -#include "cdrom/CDUtility.h" -#include "cdrom/cdromif.h" -using namespace CDUtility; - -namespace MDFN_IEN_SS -{ - -enum -{ - SECLEN__FIRST = 0, - - SECLEN_2048 = 0, - SECLEN_2336 = 1, - SECLEN_2340 = 2, - SECLEN_2352 = 3, - - SECLEN__LAST = 3, -}; - -static uint8 GetSecLen, PutSecLen; - -static uint8 AuthDiscType; -enum -{ - COMMAND_GET_CDSTATUS = 0x00, - COMMAND_GET_HWINFO = 0x01, - COMMAND_GET_TOC = 0x02, - COMMAND_GET_SESSINFO = 0x03, - COMMAND_INIT = 0x04, - COMMAND_OPEN = 0x05, - COMMAND_END_DATAXFER = 0x06, - - COMMAND_PLAY = 0x10, - COMMAND_SEEK = 0x11, - COMMAND_SCAN = 0x12, - - COMMAND_GET_SUBCODE = 0x20, - - COMMAND_SET_CDDEVCONN = 0x30, - COMMAND_GET_CDDEVCONN = 0x31, - COMMAND_GET_LASTBUFDST = 0x32, - - COMMAND_SET_FILTRANGE = 0x40, - COMMAND_GET_FILTRANGE = 0x41, - COMMAND_SET_FILTSUBHC = 0x42, - COMMAND_GET_FILTSUBHC = 0x43, - COMMAND_SET_FILTMODE = 0x44, - COMMAND_GET_FILTMODE = 0x45, - COMMAND_SET_FILTCONN = 0x46, - COMMAND_GET_FILTCONN = 0x47, - COMMAND_RESET_SEL = 0x48, - - COMMAND_GET_BUFSIZE = 0x50, - COMMAND_GET_SECNUM = 0x51, - COMMAND_CALC_ACTSIZE = 0x52, - COMMAND_GET_ACTSIZE = 0x53, - COMMAND_GET_SECINFO = 0x54, - COMMAND_EXEC_FADSRCH = 0x55, - COMMAND_GET_FADSRCH = 0x56, - - COMMAND_SET_SECLEN = 0x60, - COMMAND_GET_SECDATA = 0x61, - COMMAND_DEL_SECDATA = 0x62, - COMMAND_GETDEL_SECDATA = 0x63, - COMMAND_PUT_SECDATA = 0x64, - COMMAND_COPY_SECDATA = 0x65, - COMMAND_MOVE_SECDATA = 0x66, - COMMAND_GET_COPYERR = 0x67, - - COMMAND_CHANGE_DIR = 0x70, - COMMAND_READ_DIR = 0x71, - COMMAND_GET_FSSCOPE = 0x72, - COMMAND_GET_FINFO = 0x73, - COMMAND_READ_FILE = 0x74, - COMMAND_ABORT_FILE = 0x75, - - COMMAND_AUTH_DEVICE = 0xE0, - COMMAND_GET_AUTH = 0xE1 -}; - -static MDFN_COLD void GetCommandDetails(const uint16* CD, char* s, size_t sl) -{ - switch(CD[0] >> 8) - { - default: - trio_snprintf(s, sl, "UNKNOWN: 0x%04x, 0x%04x, 0x%04x, 0x%04x", CD[0], CD[1], CD[2], CD[3]); - break; - - case COMMAND_GET_CDSTATUS: - trio_snprintf(s, sl, "Get CD Status"); - break; - - case COMMAND_GET_HWINFO: - trio_snprintf(s, sl, "Get Hardware Info"); - break; - - case COMMAND_GET_TOC: - trio_snprintf(s, sl, "Get TOC"); - break; - - case COMMAND_GET_SESSINFO: - trio_snprintf(s, sl, "Get Session Info; Type=0x%02x", CD[0] & 0xFF); - break; - - case COMMAND_INIT: - trio_snprintf(s, sl, "Initialize; Flags=0x%02x", CD[0] & 0xFF); - break; - - case COMMAND_OPEN: - trio_snprintf(s, sl, "Open Tray"); - break; - - case COMMAND_END_DATAXFER: - trio_snprintf(s, sl, "End Data Transfer"); - break; - - case COMMAND_PLAY: - trio_snprintf(s, sl, "Play; Start=0x%06x, End=0x%06x, Mode=0x%02x", ((CD[0] & 0xFF) << 16) | CD[1], ((CD[2] & 0xFF) << 16) | CD[3], CD[2] >> 8); - break; - - case COMMAND_SEEK: - // 0xFFFFFF=pause, 0=stop - trio_snprintf(s, sl, "Seek; Target=0x%06x", ((CD[0] & 0xFF) << 16) | CD[1]); - break; - - case COMMAND_SCAN: - trio_snprintf(s, sl, "Scan; Direction=0x%02x", CD[0] & 0xFF); - break; - - case COMMAND_GET_SUBCODE: - trio_snprintf(s, sl, "Get Subcode; Type=0x%02x", CD[0] & 0xFF); - break; - - case COMMAND_SET_CDDEVCONN: - trio_snprintf(s, sl, "Set CD Device Connection; Filter=0x%02x", CD[2] >> 8); - break; - - case COMMAND_GET_CDDEVCONN: - trio_snprintf(s, sl, "Get CD Device Connection"); - break; - - case COMMAND_GET_LASTBUFDST: - trio_snprintf(s, sl, "Get Last Buffer Destination"); - break; - - case COMMAND_SET_FILTRANGE: - trio_snprintf(s, sl, "Set Filter Range; Filter=0x%02x, FAD=0x%06x, Count=0x%06x", CD[2] >> 8, ((CD[0] & 0xFF) << 16) | CD[1], ((CD[2] & 0xFF) << 16) | CD[3]); - break; - - case COMMAND_GET_FILTRANGE: - trio_snprintf(s, sl, "Get Filter Range; Filter=0x%02x", CD[2] >> 8); - break; - - case COMMAND_SET_FILTSUBHC: - trio_snprintf(s, sl, "Set Filter Subheader Conditions; Filter=0x%02x, Channel=0x%02x, Sub Mode: 0x%02x(Mask=0x%02x), Coding Info: 0x%02x(Mask=0x%02x), File: 0x%02x", (CD[2] >> 8), CD[0] & 0xFF, CD[3] >> 8, CD[1] >> 8, CD[3] & 0xFF, CD[1] & 0xFF, CD[2] & 0xFF); - break; - - case COMMAND_GET_FILTSUBHC: - trio_snprintf(s, sl, "Get Filter Subheader Conditions; Filter=0x%02x", CD[2] >> 8); - break; - - case COMMAND_SET_FILTMODE: - trio_snprintf(s, sl, "Set Filter Mode; Filter=0x%02x, Mode=0x%02x", (CD[2] >> 8), CD[0] & 0xFF); - break; - - case COMMAND_GET_FILTMODE: - trio_snprintf(s, sl, "Get Filter Mode; Filter=0x%02x", CD[2] >> 8); - break; - - case COMMAND_SET_FILTCONN: - trio_snprintf(s, sl, "Set Filter Connection; Filter=0x%02x, Flags=0x%02x, True=0x%02x, False=0x%02x", (CD[2] >> 8), (CD[0] & 0xFF), (CD[1] >> 8), (CD[1] & 0xFF)); - break; - - case COMMAND_GET_FILTCONN: - trio_snprintf(s, sl, "Get Filter Connection; Filter=0x%02x", CD[2] >> 8); - break; - - case COMMAND_RESET_SEL: - trio_snprintf(s, sl, "Reset Selector; Flags=0x%02x, pn=0x%04x", CD[0] & 0xFF, CD[2] >> 8); - break; - - case COMMAND_GET_BUFSIZE: - trio_snprintf(s, sl, "Get Buffer Size"); - break; - - case COMMAND_GET_SECNUM: - trio_snprintf(s, sl, "Get Sector Number; Source=0x%02x", CD[2] >> 8); - break; - - case COMMAND_CALC_ACTSIZE: - trio_snprintf(s, sl, "Calculate Actual Size; Source=0x%02x[0x%04x], Count=0x%02x", CD[2] >> 8, CD[1], CD[3]); - break; - - case COMMAND_GET_ACTSIZE: - trio_snprintf(s, sl, "Get Actual Size"); - break; - - case COMMAND_GET_SECINFO: - trio_snprintf(s, sl, "Get Sector Info; Source=0x%02x[0x%04x]", CD[2] >> 8, CD[1]); - break; - - case COMMAND_EXEC_FADSRCH: - trio_snprintf(s, sl, "Execute FAD Search; Source=0x%02x[0x%04x], FAD=0x%06x", CD[2] >> 8, CD[1], ((CD[2] & 0xFF) << 16) | CD[3]); - break; - - case COMMAND_GET_FADSRCH: - trio_snprintf(s, sl, "Get FAD Search Results"); - break; - - case COMMAND_SET_SECLEN: - trio_snprintf(s, sl, "Set Sector Length; Get: 0x%02x, Put: 0x%02x", (CD[0] & 0xFF), (CD[1] >> 8)); - break; - - case COMMAND_GET_SECDATA: - trio_snprintf(s, sl, "Get Sector Data; Source=0x%02x[0x%04x], Count=0x%04x", CD[2] >> 8, CD[1], CD[3]); - break; - - case COMMAND_DEL_SECDATA: - trio_snprintf(s, sl, "Delete Sector Data; Source=0x%02x[0x%04x], Count=0x%04x", CD[2] >> 8, CD[1], CD[3]); - break; - - case COMMAND_GETDEL_SECDATA: - trio_snprintf(s, sl, "Get and Delete Sector Data; Source=0x%02x[0x%04x], Count=0x%04x", CD[2] >> 8, CD[1], CD[3]); - break; - - case COMMAND_PUT_SECDATA: - trio_snprintf(s, sl, "Put Sector Data; Filter=0x%02x, Count=0x%04x", CD[2] >> 8, CD[3]); - break; - - case COMMAND_COPY_SECDATA: - trio_snprintf(s, sl, "Copy Sector Data; Source=0x%02x[0x%04x], Dest=0x%02x, Count=0x%04x", CD[2] >> 8, CD[1], CD[0] & 0xFF, CD[3]); - break; - - case COMMAND_MOVE_SECDATA: - trio_snprintf(s, sl, "Move Sector Data; Source=0x%02x[0x%04x], Dest=0x%02x, Count=0x%04x", CD[2] >> 8, CD[1], CD[0] & 0xFF, CD[3]); - break; - - case COMMAND_GET_COPYERR: - trio_snprintf(s, sl, "Get Copy Error"); - break; - - case COMMAND_CHANGE_DIR: - trio_snprintf(s, sl, "Change Directory; ID=0x%06x, Filter: 0x%02x", ((CD[2] & 0xFF) << 16) | CD[3], (CD[2] >> 8)); - break; - - case COMMAND_READ_DIR: - trio_snprintf(s, sl, "Read Directory; ID=0x%06x, Filter=0x%02x", ((CD[2] & 0xFF) << 16) | CD[3], (CD[2] >> 8)); - break; - - case COMMAND_GET_FSSCOPE: - trio_snprintf(s, sl, "Get Filesystem Scope"); - break; - - case COMMAND_GET_FINFO: - trio_snprintf(s, sl, "Get File Info; ID=0x%06x", ((CD[2] & 0xFF) << 16) | CD[3]); - break; - - case COMMAND_READ_FILE: - trio_snprintf(s, sl, "Read File; Offset=0x%06x, ID=0x%06x, Filter=0x%02x\n", ((CD[0] & 0xFF) << 16) | CD[1], ((CD[2] & 0xFF) << 16) | CD[3], CD[2] >> 8); - break; - - case COMMAND_ABORT_FILE: - trio_snprintf(s, sl, "Abort File"); - break; - - case COMMAND_AUTH_DEVICE: - trio_snprintf(s, sl, "Authenticate Device; Type=0x%04x, Filter=0x%02x", CD[1], CD[2] >> 8); - break; - - case COMMAND_GET_AUTH: - trio_snprintf(s, sl, "Get Device Authentication Status"); - break; - } -} - - -enum -{ - STATUS_BUSY = 0x00, - STATUS_PAUSE = 0x01, - STATUS_STANDBY = 0x02, - STATUS_PLAY = 0x03, - STATUS_SEEK = 0x04, - STATUS_SCAN = 0x05, - STATUS_OPEN = 0x06, - STATUS_NODISC = 0x07, - STATUS_RETRY = 0x08, - STATUS_ERROR = 0x09, - STATUS_FATAL = 0x0A, - - // - STATUS_PERIODIC = 0x20, - STATUS_DTREQ = 0x40, - STATUS_WAIT = 0x80, - - // - STATUS_REJECTED = 0xFF -}; - -enum -{ - HIRQ_CMOK = 0x0001, // command ok? - HIRQ_DRDY = 0x0002, // data transfer ready - HIRQ_CSCT = 0x0004, // 1 sector read complete? - HIRQ_BFUL = 0x0008, // buffer full - HIRQ_PEND = 0x0010, // play end (FIXME: Status must indicate a "Pause" state at the time this is triggered) - HIRQ_DCHG = 0x0020, // disc change - HIRQ_ESEL = 0x0040, // end of selector something? - HIRQ_EHST = 0x0080, // end of host I/O? - HIRQ_ECPY = 0x0100, // end of copy/move - HIRQ_EFLS = 0x0200, // end of filesystem something? - HIRQ_SCDQ = 0x0400, // Sub-channel Q update complete? - - HIRQ_MPED = 0x0800, - HIRQ_MPCM = 0x1000, - HIRQ_MPST = 0x2000 -}; -static uint16 HIRQ, HIRQ_Mask; -static uint16 CData[4]; -static uint16 Results[4]; -static bool CommandPending; - -static uint8 CDDevConn; -static uint8 LastBufDest; - -enum { NumBuffers = 0xC8 }; -static struct BufferT -{ - uint8 Data[2352]; - uint8 Prev; - uint8 Next; -} Buffers[NumBuffers]; - -static struct FilterS -{ - enum - { - MODE_SEL_FILE = 0x01, - MODE_SEL_CHANNEL = 0x02, - MODE_SEL_SUBMODE = 0x04, - MODE_SEL_CINFO = 0x08, - MODE_SEL_SHREV = 0x10, // Reverse sub-header conditions - MODE_SEL_FADR = 0x40, - MODE_INIT = 0x80 - }; - - uint8 Mode; - uint8 TrueConn; - uint8 FalseConn; - // - uint32 FAD; - uint32 Range; - - uint8 Channel; - uint8 File; - - uint8 SubMode; - uint8 SubModeMask; - - uint8 CInfo; - uint8 CInfoMask; -} Filters[0x18]; - -static struct -{ - uint8 FirstBuf; - uint8 LastBuf; - uint8 Count; -} Partitions[0x18]; - -static uint8 FirstFreeBuf; -static uint8 FreeBufferCount; - -static struct -{ - uint32 fad; - uint16 spos; - uint8 pnum; -} FADSearch; - -static uint32 CalcedActualSize; -// -// -// -// -// -static bool TrayOpen; -static CDIF* Cur_CDIF; -static CDUtility::TOC toc; -static sscpu_timestamp_t lastts; -static int32 CommandPhase; -//static bool CommandYield; -static int64 CommandClockCounter; -static uint32 CDB_ClockRatio; - -static struct -{ - uint8 Command; - uint16 CD[4]; -} CTR; - -static struct -{ - bool Active; - bool Writing; - bool NeedBufFree; - - unsigned CurBufIndex; - unsigned BufCount; - - unsigned InBufOffs; - unsigned InBufCounter; - - unsigned TotalCounter; - - uint8 FNum; - - uint16 FIFO[6]; - uint8 FIFO_RP; - uint8 FIFO_WP; - uint8 FIFO_In; - - uint8 BufList[NumBuffers]; -} DT; - -static uint16 StandbyTime; -static uint8 ECCEnable; -static uint8 RetryCount; - -static bool ResultsRead; - -static int32 SeekIndexPhase; -static uint32 CurSector; -static int32 DrivePhase; - -enum -{ - DRIVEPHASE_STOPPED = 0, - DRIVEPHASE_PLAY, - - DRIVEPHASE_SEEK_START, - DRIVEPHASE_SEEK, - DRIVEPHASE_SCAN, - - DRIVEPHASE_EJECTED0, - DRIVEPHASE_EJECTED1, - DRIVEPHASE_EJECTED_WAITING, - DRIVEPHASE_STARTUP, - - DRIVEPHASE_RESETTING -}; -static int64 DriveCounter; -static int64 PeriodicIdleCounter; -enum { PeriodicIdleCounter_Reload = (int64)187065 << 32 }; - -static uint8 PlayRepeatCounter; -static uint8 CurPlayRepeat; - -static uint32 CurPlayStart; -static uint32 CurPlayEnd; -static uint32 PlayEndIRQType; -//static uint32 PlayEndIRQPending; - -static uint32 PlayCmdStartPos, PlayCmdEndPos; -static uint8 PlayCmdRepCnt; - -enum { CDDABuf_PrefillCount = 4 }; -enum { CDDABuf_MaxCount = 4 + 588 + 4 }; -static uint16 CDDABuf[CDDABuf_MaxCount][2]; -static uint32 CDDABuf_RP, CDDABuf_WP; -static uint32 CDDABuf_Count; - -static uint8 SecPreBuf[2352 + 96]; -static int SecPreBuf_In; - -static uint8 TOC_Buffer[(99 + 3) * 4]; - -static struct -{ - uint8 status; - uint32 fad; - uint32 rel_fad; - uint8 ctrl_adr; - uint8 idx; - uint8 tno; - - bool is_cdrom; -} CurPosInfo; - -// Higher-level: -static uint8 SubCodeQBuf[10]; -static uint8 SubCodeRWBuf[24]; - -// SubQBuf for ADR=1 only for now. -static uint8 SubQBuf[0xC]; -static uint8 SubQBuf_Safe[0xC]; -static bool SubQBuf_Safe_Valid; - -static bool DecodeSubQ(uint8 *subpw) -{ - uint8 tmp_q[0xC]; - - memset(tmp_q, 0, 0xC); - - for(int i = 0; i < 96; i++) - tmp_q[i >> 3] |= ((subpw[i] & 0x40) >> 6) << (7 - (i & 7)); - - if((tmp_q[0] & 0xF) == 1) - { - memcpy(SubQBuf, tmp_q, 0xC); - - if(subq_check_checksum(tmp_q)) - { - memcpy(SubQBuf_Safe, tmp_q, 0xC); - SubQBuf_Safe_Valid = true; - return(true); - } - } - - return(false); -} - -static void ResetBuffers(void) -{ - Buffers[0].Prev = 0xFF; - Buffers[0].Next = 1; - for(unsigned i = 1; i < (NumBuffers - 1); i++) - { - Buffers[i].Prev = i - 1; - Buffers[i].Next = i + 1; - } - Buffers[NumBuffers - 1].Prev = NumBuffers - 1 - 1; - Buffers[NumBuffers - 1].Next = 0xFF; - - FirstFreeBuf = 0; - FreeBufferCount = NumBuffers; - - for(unsigned i = 0; i < 0x18; i++) - { - Partitions[i].FirstBuf = 0xFF; - Partitions[i].LastBuf = 0xFF; - Partitions[i].Count = 0; - } -} - -static void Filter_ResetCond(const unsigned fnum) -{ - auto& f = Filters[fnum]; - - f.Mode = 0; - - f.FAD = 0; - f.Range = 0; - - f.Channel = 0; - f.File = 0; - - f.SubMode = 0; - f.SubModeMask = 0; - - f.CInfo = 0; - f.CInfoMask = 0; -} - -static uint8 Buffer_Allocate(const bool zero_clear) -{ - const unsigned bfsidx = FirstFreeBuf; - assert(bfsidx != 0xFF && FreeBufferCount > 0); - - if(zero_clear) - memset(Buffers[bfsidx].Data, 0x00, sizeof(Buffers[bfsidx].Data)); - - if(Buffers[bfsidx].Prev == 0xFF) - FirstFreeBuf = Buffers[bfsidx].Next; - else - Buffers[Buffers[bfsidx].Prev].Next = Buffers[bfsidx].Next; - - if(Buffers[bfsidx].Next == 0xFF) - { - - } - else - Buffers[Buffers[bfsidx].Next].Prev = Buffers[bfsidx].Prev; - - FreeBufferCount--; - - // - Buffers[bfsidx].Prev = 0xFF; - Buffers[bfsidx].Next = 0xFF; - // - - return bfsidx; -} - -// Must not alter "Data" member, as it may be used while "free"'d. -static void Buffer_Free(const uint8 bfsidx) -{ - assert((FirstFreeBuf == 0xFF && FreeBufferCount == 0) || (FirstFreeBuf != 0xFF && FreeBufferCount > 0)); - assert(Buffers[bfsidx].Next == 0xFF && Buffers[bfsidx].Prev == 0xFF); - - Buffers[bfsidx].Prev = 0xFF; - Buffers[bfsidx].Next = FirstFreeBuf; - - if(FirstFreeBuf != 0xFF) - { - assert(Buffers[FirstFreeBuf].Prev == 0xFF); - Buffers[FirstFreeBuf].Prev = bfsidx; - } - - FreeBufferCount++; - FirstFreeBuf = bfsidx; -} - -static void Partition_LinkBuffer(const unsigned pnum, const unsigned bfsidx) -{ - assert(Buffers[bfsidx].Next == 0xFF && Buffers[bfsidx].Prev == 0xFF); - - Buffers[bfsidx].Next = 0xFF; - - if(Partitions[pnum].FirstBuf == 0xFF) - { - assert(Partitions[pnum].LastBuf == 0xFF); - Partitions[pnum].FirstBuf = bfsidx; - Partitions[pnum].LastBuf = bfsidx; - Buffers[bfsidx].Prev = 0xFF; - } - else - { - assert(Partitions[pnum].LastBuf != 0xFF); - Buffers[Partitions[pnum].LastBuf].Next = bfsidx; - Buffers[bfsidx].Prev = Partitions[pnum].LastBuf; - } - - Partitions[pnum].LastBuf = bfsidx; - Partitions[pnum].Count++; -} - -static int Partition_GetBuffer(unsigned pnum, unsigned rbi) -{ - for(unsigned ii = Partitions[pnum].FirstBuf; ii != 0xFF; ii = Buffers[ii].Next) - { - if(!rbi) - return ii; - - rbi--; - } - - return -1; -} - -// Must not alter "Data" member, as it may be used while unlinked. -static void Partition_UnlinkBuffer(unsigned pnum, unsigned bfsidx) -{ - assert(Partitions[pnum].Count > 0); - - Partitions[pnum].Count--; - - if(Buffers[bfsidx].Prev == 0xFF) - { - assert(Partitions[pnum].FirstBuf == bfsidx); - Partitions[pnum].FirstBuf = Buffers[bfsidx].Next; - } - else - { - assert(Partitions[pnum].FirstBuf != bfsidx); - Buffers[Buffers[bfsidx].Prev].Next = Buffers[bfsidx].Next; - } - - if(Buffers[bfsidx].Next == 0xFF) - { - assert(Partitions[pnum].LastBuf == bfsidx); - Partitions[pnum].LastBuf = Buffers[bfsidx].Prev; - } - else - { - assert(Partitions[pnum].LastBuf != bfsidx); - Buffers[Buffers[bfsidx].Next].Prev = Buffers[bfsidx].Prev; - } - - // - Buffers[bfsidx].Prev = 0xFF; - Buffers[bfsidx].Next = 0xFF; -} - -static void SetCDDeviceConn(const uint8 fnum) -{ - for(unsigned fs = 0; fs < 0x18; fs++) - if(Filters[fs].FalseConn == fnum) - Filters[fs].FalseConn = 0xFF; - - CDDevConn = fnum; -} - -static void Filter_SetRange(const uint8 fnum, const uint32 fad, const uint32 range) -{ - Filters[fnum].FAD = fad; - Filters[fnum].Range = range; -} - -static void Filter_SetTrueConn(const uint8 fnum, const uint8 tconn) -{ - Filters[fnum].TrueConn = tconn; -} - -static void Filter_SetFalseConn(const uint8 fnum, const uint8 fconn) -{ - if(CDDevConn == fconn) - CDDevConn = 0xFF; - - for(unsigned fs = 0; fs < 0x18; fs++) - if(Filters[fs].FalseConn == fconn) - Filters[fs].FalseConn = 0xFF; - - Filters[fnum].FalseConn = fconn; -} - -static void Partition_Clear(const unsigned pnum) -{ - while(Partitions[pnum].Count > 0) - { - const unsigned bfi = Partitions[pnum].FirstBuf; - - Partition_UnlinkBuffer(pnum, bfi); - Buffer_Free(bfi); - } -} - -// -// -// -// -// -static struct FileInfoS -{ - uint8 fad_be[4]; - uint8 size_be[4]; - - INLINE uint32 fad(void) const { return MDFN_de32msb(fad_be); } - INLINE uint32 size(void) const { return MDFN_de32msb(size_be); } - - uint8 unit_size; - uint8 gap_size; - uint8 fnum; - uint8 attr; -} __attribute__((__packed__)) FileInfo[256]; -static bool FileInfoValid; - -enum -{ - FATTR_DIR = 0x02, - FATTR_XA_M2F1 = 0x08, - FATTR_XA_M2F2 = 0x10, - FATTR_XA_ILEAVE = 0x20, - FATTR_XA_CDDA = 0x40, - FATTR_XA_DIR = 0x80 -}; - - -static FileInfoS RootDirInfo; -static bool RootDirInfoValid; - -static struct -{ - bool Active; - bool DoAuth; - bool Abort; - uint8 pnum; - - uint32 CurDirFAD; - - uint8 FileInfoValidCount; // 0 ... 254 - uint32 FileInfoOffs; // 2 ... whatever - uint32 FileInfoOnDiscCount; // 0 ... infinities - - uint32 Phase; - - uint8 pbuf[2048]; - uint32 pbuf_offs; - uint32 pbuf_read_i; - - uint32 total_counter; - uint32 total_max; - - uint8 record[256]; - uint32 record_counter; - - uint32 finfo_read_start_offs; - uint32 finfo_offs; -} FLS; - - -enum { FLSPhaseBias = __COUNTER__ + 1 }; - -#define FLS_PROLOGUE switch(FLS.Phase + FLSPhaseBias) { for(;;) { default: case __COUNTER__: ; -#define FLS_EPILOGUE } } FLSGetOut:; - -#define FLS_YIELD { \ - FLS.Phase = __COUNTER__ - FLSPhaseBias + 1; \ - goto FLSGetOut; \ - case __COUNTER__:; \ - } - -#define FLS_WAIT_UNTIL_COND(n) { \ - case __COUNTER__: \ - if(!(n)) \ - { \ - FLS.Phase = __COUNTER__ - FLSPhaseBias - 1; \ - goto FLSGetOut; \ - } \ - } - -#define FLS_WAIT_GRAB_BUF \ - FLS_WAIT_UNTIL_COND(Partitions[FLS.pnum].Count > 0); \ - { \ - const unsigned bfi = Partitions[FLS.pnum].FirstBuf; \ - const uint8* const dptr = Buffers[bfi].Data; \ - Partition_UnlinkBuffer(FLS.pnum, bfi); \ - memcpy(FLS.pbuf, &dptr[(dptr[15] == 0x2) ? 24 : 16], 2048); \ - Buffer_Free(bfi); \ - } - -#define FLS_READ(buffer, count) \ - for(FLS.pbuf_read_i = 0; FLS.pbuf_read_i < (count); FLS.pbuf_read_i++) \ - { \ - if(FLS.pbuf_offs == 0) \ - { \ - FLS_WAIT_GRAB_BUF; \ - } \ - if((buffer) != NULL) \ - (buffer)[FLS.pbuf_read_i] = FLS.pbuf[FLS.pbuf_offs]; \ - FLS.pbuf_offs = (FLS.pbuf_offs + 1) % 2048; \ - FLS.total_counter++; \ - } - -static void ReadRecord(FileInfoS* fi, const uint8* rr) -{ - const uint8 rec_len = rr[0]; - const uint8 fi_len = rr[32]; - - MDFN_en32msb(fi->fad_be, 150 + MDFN_de32msb(&rr[6])); - MDFN_en32msb(fi->size_be, MDFN_de32msb(&rr[14])); - - fi->attr = rr[25] & 0x2; - fi->unit_size = rr[26]; - fi->gap_size = rr[27]; - fi->fnum = 0; - - int su_offs = 33 + (fi_len | 1); - int su_len = (rec_len - su_offs); - - //printf("%d %d %d %d\n", rec_len, fi_len, su_offs, su_len); - - if(su_len >= 14 && (su_offs + su_len) <= 256) - { - if(rr[su_offs + 6] == 'X' && rr[su_offs + 7] == 'A') - { - fi->attr |= rr[su_offs + 4] & 0xF8; - fi->fnum = rr[su_offs + 8]; - } - } - - //printf("Meow: fad=%08x size=%08x attr=%02x us=%02x gs=%02x fnum=%02x %s\n", fi->fad(), fi->size(), fi->attr, fi->unit_size, fi->gap_size, fi->fnum, &FLS.record[33]); -} - -static void ClearPendingSec(void); - -static bool FLS_Run(void) -{ - bool ret = false; - //printf("%d, %d\n", Partitions[FLS.pnum].Count, FreeBufferCount); - - if(FLS.Abort) - { - if(FLS.Active) - { - SS_DBG(SS_DBG_CDB, "[CDB] FLS Abort: %d %d\n", FLS.Active, FLS.DoAuth); - } - - goto Abort; - } - - // - FLS_PROLOGUE; - // - if(FLS.Active) - { - if(FLS.DoAuth) - { - RootDirInfoValid = false; - AuthDiscType = 0x04; // FIXME: //0x02; - - for(;;) - { - static const char stdid[5] = { 'C', 'D', '0', '0', '1' }; - FLS_WAIT_GRAB_BUF; - - if(memcmp(FLS.pbuf + 1, stdid, 5) || FLS.pbuf[0] == 0xFF) - break; - else if(FLS.pbuf[0] == 0x01) // PVD - { - //printf("MEOW MEOW:"); - //for(unsigned i = 0; i < 64; i++) - // printf("%02x ", FLS.pbuf[156 + i]); - //printf("\n"); - - ReadRecord(&RootDirInfo, &FLS.pbuf[156]); - RootDirInfoValid = true; - break; - } - } - SetCDDeviceConn(0xFF); - } - else - { - FileInfoValid = false; - // - // - FLS.total_counter = 0; - FLS.pbuf_offs = 0; - FLS.FileInfoValidCount = 0; - FLS.record_counter = 0; - FLS.finfo_offs = 0; - - //printf("Start\n"); - while(FLS.total_counter < FLS.total_max) - { - memset(FLS.record, 0, sizeof(FLS.record)); - - FLS_READ(&FLS.record[0], 1); - if(!FLS.record[0]) - continue; - FLS_READ(&FLS.record[1], FLS.record[0] - 1); - - if(FLS.finfo_offs < 256) - { - if(FLS.record_counter < 2 || FLS.record_counter >= FLS.FileInfoOffs) - { - ReadRecord(&FileInfo[FLS.finfo_offs], FLS.record); - - FLS.finfo_offs++; - - if(FLS.record_counter >= 2) - FLS.FileInfoValidCount++; - } - FLS.record_counter++; - } - } - - FLS.FileInfoOnDiscCount = FLS.record_counter; - // - // - FileInfoValid = true; - } - - Partition_Clear(FLS.pnum); // Place before Abort:; - // - // - // - Abort:; - FLS.Active = false; - FLS.DoAuth = false; - FLS.Abort = false; - // - // Pause - // - PlayEndIRQType = 0; - CurPlayStart = 0x800000; - CurPlayEnd = 0x800000; - CurPlayRepeat = 0; - // - // - // - - ret = true; - } - FLS_YIELD; - // - FLS_EPILOGUE; - - return ret; -} - -// -// Sector size can change in the middle of the transfer, and takes effect around sector buffer boundaries -// -static void DT_SetIBOffsCount(const uint8* sd) -{ - if(DT.Writing) - { - static const unsigned DTW_OffsTab[4] = { 12, 8, 6, 0 }; - static const unsigned DTW_CountTab[4] = { 1024, 1168, 1170, 1176 }; - - DT.InBufOffs = DTW_OffsTab[PutSecLen]; - DT.InBufCounter = DTW_CountTab[PutSecLen]; - } - else switch(GetSecLen) - { - case SECLEN_2048: - if(sd[12 + 3] == 0x1) // Mode 1 - { - DT.InBufOffs = 8; - DT.InBufCounter = 1024; - } - else // Mode 2 - { - if(sd[16 + 2] & 0x20) // Form 2 - { - DT.InBufOffs = 12; - DT.InBufCounter = 1162; - } - else // Form 1 - { - DT.InBufOffs = 12; - DT.InBufCounter = 1024; - } - } - break; - - case SECLEN_2336: - DT.InBufOffs = 8; - DT.InBufCounter = 1168; - break; - - case SECLEN_2340: - DT.InBufOffs = 6; - DT.InBufCounter = 1170; - break; - - case SECLEN_2352: - DT.InBufOffs = 0; - DT.InBufCounter = 1176; - break; - } - - if(!DT.Writing) - { - const uint32 fad = AMSF_to_ABA(BCD_to_U8(sd[12 + 0]), BCD_to_U8(sd[12 + 1]), BCD_to_U8(sd[12 + 2])); - SS_DBG(SS_DBG_CDB, "[CDB] DT FAD: %08x --- %d %d\n", fad, DT.InBufOffs, DT.InBufCounter); - } -} - -static void DT_ReadIntoFIFO(void) -{ - uint16 tmp; - - if(MDFN_UNLIKELY(DT.BufList[DT.CurBufIndex] >= 0xF0)) - { - const uint8 t = DT.BufList[DT.CurBufIndex]; - - if(t == 0xFF) - tmp = MDFN_de16msb(&TOC_Buffer[DT.InBufOffs << 1]); - else if(t == 0xFE) - tmp = MDFN_de16msb(&SubCodeQBuf[DT.InBufOffs << 1]); - else if(t == 0xFD) - tmp = MDFN_de16msb(&SubCodeRWBuf[DT.InBufOffs << 1]); - else - tmp = MDFN_de16msb((uint8*)FileInfo + (DT.InBufOffs << 1)); - } - else - tmp = MDFN_de16msb(&Buffers[DT.BufList[DT.CurBufIndex]].Data[DT.InBufOffs << 1]); - - //printf("%02x %02x\n", DT.BufList[DT.CurBufIndex], DT.CurBufIndex); - DT.FIFO[DT.FIFO_WP] = tmp; - DT.FIFO_WP = (DT.FIFO_WP + 1) % (sizeof(DT.FIFO) / sizeof(DT.FIFO[0])); - DT.FIFO_In++; - DT.InBufOffs++; - DT.InBufCounter--; - DT.TotalCounter++; - - if(!DT.InBufCounter) - { - DT.CurBufIndex++; - if(DT.CurBufIndex < DT.BufCount) - { - DT_SetIBOffsCount(Buffers[DT.BufList[DT.CurBufIndex]].Data); - } - } -} - - - -// Ratio between SH-2 clock and sound subsystem 68K clock (sound clock / 2) -// (needs to match the algorithm precision in sound.cpp, for proper CD-DA stream synch without having to get into more complicated designs) -void CDB_SetClockRatio(uint32 ratio) -{ - CDB_ClockRatio = ratio; -} - -static void SWReset(void) -{ - GetSecLen = SECLEN_2048; - PutSecLen = SECLEN_2048; - - CDDevConn = 0xFF; - - LastBufDest = 0xFF; - - memset(&DT, 0, sizeof(DT)); - DT.Active = false; - - for(unsigned i = 0; i < 0x18; i++) - { - auto& f = Filters[i]; - - f.TrueConn = i; - f.FalseConn = 0xFF; - - Filter_ResetCond(i); - } - - ResetBuffers(); - - FADSearch.fad = 0; - FADSearch.spos = 0; - FADSearch.pnum = 0; - - CalcedActualSize = 0; - - PlayEndIRQType = 0; - CurPlayEnd = 0x800000; - CurPlayRepeat = 0; - ClearPendingSec(); - // - // - // - memset(&FLS, 0, sizeof(FLS)); - FileInfoValid = false; - FLS.Phase = 0; -} - -void CDB_ResetCD(void) // TODO -{ - PeriodicIdleCounter = 0x7FFFFFFFFFFFFFFFLL; - DrivePhase = DRIVEPHASE_RESETTING; - DriveCounter = 0x7FFFFFFFFFFFFFFFLL; - - Results[0] = 0; - Results[1] = 0; - Results[2] = 0; - Results[3] = 0; - ResultsRead = true; - - CommandPhase = -1; - CommandClockCounter = 0; - // TODO: Set next event, timestamp + 1. -} - -void CDB_SetCDActive(bool active) // TODO -{ - -} - - - -void CDB_Init(void) -{ - lastts = 0; - Cur_CDIF = NULL; - TrayOpen = false; -} - -void CDB_SetDisc(bool tray_open, CDIF *cdif) -{ - TrayOpen = tray_open; - Cur_CDIF = tray_open ? NULL : cdif; - - if(!Cur_CDIF) - { - if(DrivePhase != DRIVEPHASE_RESETTING) - { - AuthDiscType = 0x00; - DrivePhase = DRIVEPHASE_EJECTED0; - DriveCounter = (int64)1000 << 32; - } - } -} - -static INLINE void RecalcIRQOut(void) -{ - SCU_SetInt(16, (bool)(HIRQ & HIRQ_Mask)); -} - -void CDB_Reset(bool powering_up) -{ - HIRQ = 0; - HIRQ_Mask = 0; - RecalcIRQOut(); - - CDB_ResetCD(); -} - -static INLINE void TriggerIRQ(unsigned bs) -{ - HIRQ |= bs; - - RecalcIRQOut(); -} - -enum { CommandPhaseBias = __COUNTER__ + 1 }; - -#define CMD_YIELD { \ - CommandPhase = __COUNTER__ - CommandPhaseBias + 1; \ - CommandClockCounter = -(500LL << 32); \ - /*CommandYield = true;*/ \ - goto CommandGetOut; \ - case __COUNTER__: \ - /*CommandYield = false;*/ \ - CommandClockCounter = 0; \ - } - -#define CMD_EAT_CLOCKS(n) { \ - CommandClockCounter -= (int64)(n) << 32; \ - { \ - case __COUNTER__: \ - if(CommandClockCounter < 0) \ - { \ - CommandPhase = __COUNTER__ - CommandPhaseBias - 1; \ - goto CommandGetOut; \ - } \ - /*printf("%f\n", (double)ClockCounter / (1LL << 32));*/ \ - } \ - } - - -// Drive commands: Init, Open, Play, Seek, Scan -// return busy status -// Commands that change drive status: -// Init, Open, Play, Seek, Scan -// - -static uint8 MakeBaseStatus(const bool rejected = false, const uint8 hb = 0) -{ - if(rejected) - return STATUS_REJECTED; - - uint8 ret = 0; - - if(TrayOpen) - ret = STATUS_OPEN; - else if(!Cur_CDIF) - ret = STATUS_NODISC; - else - ret = CurPosInfo.status; - - return ret | hb; -} - -static bool TestFilterCond(const unsigned fnum, const uint8* data) -{ - auto& f = Filters[fnum]; - - if(f.Mode & FilterS::MODE_SEL_FADR) - { - const uint32 fad = AMSF_to_ABA(BCD_to_U8(data[12 + 0]), BCD_to_U8(data[12 + 1]), BCD_to_U8(data[12 + 2])); - - if(fad < f.FAD || fad >= (f.FAD + f.Range)) - return false; - } - - uint8 file, channel, submode, cinfo; - - if(data[15] == 0x2) - { - file = data[16]; - channel = data[17]; - submode = data[18]; - cinfo = data[19]; - } - else - file = channel = submode = cinfo = 0x00; - - const bool shinv = (bool)(f.Mode & FilterS::MODE_SEL_SHREV) && (bool)(f.Mode & 0x0F); - - if(f.Mode & FilterS::MODE_SEL_FILE) - { - if((bool)(file != f.File)) - return shinv; - } - - if(f.Mode & FilterS::MODE_SEL_CHANNEL) - { - if((bool)(channel != f.Channel)) - return shinv; - } - - if(f.Mode & FilterS::MODE_SEL_SUBMODE) - { - if((bool)((submode & f.SubModeMask) != f.SubMode)) - return shinv; - } - - if(f.Mode & FilterS::MODE_SEL_CINFO) - { - if((bool)((cinfo & f.CInfoMask) != f.CInfo)) - return shinv; - } - - return !shinv; -} - -static uint8 FilterBuf(const unsigned fnum, const unsigned bfsidx) -{ - assert(bfsidx != 0xFF); - - unsigned cur = fnum; - unsigned max_iter = 0x18; - //uint32 done = 0; - - SS_DBG(SS_DBG_CDB, "[CDB] DT FilterBuf: fad=0x%08x -- %02x %02x --- %02x %02x\n", AMSF_to_ABA(BCD_to_U8(Buffers[bfsidx].Data[12 + 0]), BCD_to_U8(Buffers[bfsidx].Data[12 + 1]), BCD_to_U8(Buffers[bfsidx].Data[12 + 2])), fnum, bfsidx, Filters[fnum].TrueConn, Filters[fnum].FalseConn); - - while(cur != 0xFF && max_iter--) - { - if(TestFilterCond(cur, Buffers[bfsidx].Data)) - { - if(Filters[cur].TrueConn != 0xFF) - { - Partition_LinkBuffer(Filters[cur].TrueConn, bfsidx); - return cur; - } - cur = 0xFF; - } - else - cur = Filters[cur].FalseConn; - } - - // Discarded. Poor buffer. - Buffer_Free(bfsidx); - - return 0xFF; -} - -static void TranslateTOC(void) -{ - uint8* td = TOC_Buffer; - - for(unsigned i = 1; i < 100; i++) - { - const auto& t = toc.tracks[i]; - - if(t.valid) - { - const uint32 fad = t.lba + 150; - - td[0] = (t.control << 4) | t.adr; - td[1] = fad >> 16; - td[2] = fad >> 8; - td[3] = fad >> 0; - } - else - td[0] = td[1] = td[2] = td[3] = 0xFF; - - td += 4; - } - - // TODO: Better raw TOC support in core code. - - // POINT=A0 - { - const auto& t = toc.tracks[toc.first_track]; - - td[0] = (t.control << 4) | t.adr; - td[1] = toc.first_track; - td[2] = toc.disc_type; - td[3] = 0; - - td += 4; - } - - // POINT=A1 - { - const auto& t = toc.tracks[toc.last_track]; - - td[0] = (t.control << 4) | t.adr; - td[1] = toc.last_track; - td[2] = 0; - td[3] = 0; - - td += 4; - } - - // Lead-out - { - const auto& t = toc.tracks[100]; - const uint32 fad = t.lba + 150; - - td[0] = (t.control << 4) | t.adr; - td[1] = fad >> 16; - td[2] = fad >> 8; - td[3] = fad >> 0; - td += 4; - } - - assert((td - TOC_Buffer) == sizeof(TOC_Buffer)); - assert(sizeof(TOC_Buffer) == 0xCC * 2); -} - -// -// -// -// -// -// -static void MakeReport(const bool rejected = false, const uint8 hb = 0, const bool nobs = false) -{ - Results[0] = ((nobs ? 0x00 : MakeBaseStatus(rejected, hb)) << 8) | (CurPosInfo.is_cdrom << 7) | PlayRepeatCounter; - - Results[1] = (CurPosInfo.ctrl_adr << 8) | CurPosInfo.tno; - Results[2] = (CurPosInfo.idx << 8) | (CurPosInfo.fad >> 16); - Results[3] = CurPosInfo.fad; -} - -static void CDStatusResults(const bool rejected = false, const uint8 hb = 0, const bool nobs = false) -{ - MakeReport(rejected, hb, nobs); - - SS_DBG(SS_DBG_CDB, "[CDB] Results: %04x %04x %04x %04x\n", Results[0], Results[1], Results[2], Results[3]); - ResultsRead = false; - CommandPending = false; - TriggerIRQ(HIRQ_CMOK); -} - -static void BasicResults(uint32 res0, uint32 res1, uint32 res2, uint32 res3) -{ - Results[0] = res0; - Results[1] = res1; - Results[2] = res2; - Results[3] = res3; - ResultsRead = false; - - SS_DBG(SS_DBG_CDB, "[CDB] Results: %04x %04x %04x %04x\n", Results[0], Results[1], Results[2], Results[3]); - - CommandPending = false; - TriggerIRQ(HIRQ_CMOK); -} - -static void StartSeek(const uint32 cmd_target, const bool no_pickup_change = false) -{ - if(!Cur_CDIF) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_CDB, "[CDB] [BUG] StartSeek() called when no disc present or tray open.\n"); - return; - } - - CurPlayStart = cmd_target; - - if(no_pickup_change) - { - if(DrivePhase == DRIVEPHASE_PLAY) - { - // Maybe stop scanning? or before the if(no_pickup_change)... - return; - } - } - else if(cmd_target & 0x800000) - { - int32 fad_target = cmd_target & 0x7FFFFF; - int32 tt = 1; - - if(fad_target < 150) - fad_target = 150; - else if(fad_target >= (150 + (int32)toc.tracks[100].lba)) - fad_target = 150 + toc.tracks[100].lba; - - for(int32 track = 1; track <= 100; track++) - { - if(!toc.tracks[track].valid) - continue; - - if(fad_target < (150 + (int32)toc.tracks[track].lba)) - break; - - tt = track; - } - - CurPosInfo.tno = (tt == 100) ? 0xAA : tt; - CurPosInfo.idx = 1; - CurPosInfo.fad = fad_target; - CurPosInfo.rel_fad = fad_target - (150 + toc.tracks[tt].lba); - CurPosInfo.ctrl_adr = (toc.tracks[tt].control << 4) | (toc.tracks[tt].adr << 0); - } - else - { - int32 track_target = (cmd_target >> 8) & 0xFF; - int32 index_target = cmd_target & 0xFF; - - if(track_target > toc.last_track) - track_target = toc.last_track; - else if(track_target < toc.first_track) - track_target = toc.first_track; - - if(index_target < 1) - index_target = 1; - else if(index_target > 99) - index_target = 99; - - CurPosInfo.tno = track_target; - CurPosInfo.idx = index_target; - CurPosInfo.fad = 150 + toc.tracks[track_target].lba; - CurPosInfo.rel_fad = 0; - CurPosInfo.ctrl_adr = (toc.tracks[track_target].control << 4) | (toc.tracks[track_target].adr << 0); - } - // - CurPosInfo.status = STATUS_BUSY; - CurPosInfo.is_cdrom = false; - DrivePhase = DRIVEPHASE_SEEK_START; - - Cur_CDIF->HintReadSector(CurPosInfo.fad); - -// PlayEndIRQPending = false; - PeriodicIdleCounter = PeriodicIdleCounter_Reload; - DriveCounter = (int64)256000 << 32; //(int64)((44100 * 256) / 150) << 32; - SeekIndexPhase = 0; -} - -static void Drive_Run(int64 clocks) -{ - DriveCounter -= clocks; - PeriodicIdleCounter -= clocks; - while(DriveCounter <= 0) - { - switch(DrivePhase) - { - case DRIVEPHASE_EJECTED0: - memset(TOC_Buffer, 0xFF, sizeof(TOC_Buffer)); // TODO: confirm 0xFF(or 0x00?) - - // TODO: Check DrivePhase and these vars in command processing. - AuthDiscType = 0x00; - FileInfoValid = false; - RootDirInfoValid = false; - - CurPosInfo.status = STATUS_OPEN; - CurPosInfo.is_cdrom = false; - CurPosInfo.fad = 0xFFFFFF; - CurPosInfo.rel_fad = 0xFFFFFF; - CurPosInfo.ctrl_adr = 0xFF; - CurPosInfo.idx = 0xFF; - CurPosInfo.tno = 0xFF; - TriggerIRQ(HIRQ_DCHG); - - DrivePhase = DRIVEPHASE_EJECTED1; - DriveCounter = (int64)4000 << 32; - break; - - case DRIVEPHASE_EJECTED1: - TriggerIRQ(HIRQ_EFLS); - DrivePhase = DRIVEPHASE_EJECTED_WAITING; - DriveCounter = (int64)1 << 32; - break; - - case DRIVEPHASE_EJECTED_WAITING: - if(Cur_CDIF) - { - CurPosInfo.status = STATUS_BUSY; - DrivePhase = DRIVEPHASE_STARTUP; - DriveCounter = (int64)(1 * 44100 * 256) << 32; - } - else - DriveCounter = (int64)1000 << 32; - - break; - - case DRIVEPHASE_STARTUP: - Cur_CDIF->ReadTOC(&toc); - TranslateTOC(); - // - // - // - ClearPendingSec(); - StartSeek(0x800096); - - PlayEndIRQType = 0; - CurPlayEnd = 0x800000; - CurPlayRepeat = 0; - break; - - case DRIVEPHASE_STOPPED: - CurPosInfo.status = STATUS_STANDBY; - DriveCounter += (int64)2000 << 32; - break; - -/* - DoSeek -*/ - case DRIVEPHASE_SEEK_START: - { - int32 seek_base_time = 2 * (44100 * 256) / 150; - int32 fad_delta; - - fad_delta = CurPosInfo.fad - CurSector; - - //if(abs(fad_delta) >= 4000) // FIXME ! ! !something) - //{ - // seek_base_time += abs(fad_delta) somethingelse; // FIXME ! ! ! - //} - seek_base_time += abs(fad_delta) * (44100 * 256) / 300000 / 2; // FIXME ! ! ! - - CurPosInfo.status = STATUS_SEEK; - DrivePhase = DRIVEPHASE_SEEK; - DriveCounter += (int64)seek_base_time << 32; - CurSector = CurPosInfo.fad; - SubQBuf_Safe_Valid = false; - } - break; - - - case DRIVEPHASE_SEEK: - // - // Extremely crude approximation. - // - { - static uint8 pwbuf[96]; - const bool old_safe_valid = SubQBuf_Safe_Valid; - - Cur_CDIF->ReadRawSectorPWOnly(pwbuf, CurSector - 150, false); - DecodeSubQ(pwbuf); - - if(!SubQBuf_Safe_Valid) - { - CurSector++; - DriveCounter += (int64)((44100 * 256) / 150) << 32; - } - else - { - bool index_ok = true; - - if(!old_safe_valid) - CurSector = CurPosInfo.fad; - - if(!(CurPlayStart & 0x800000)) - { - const unsigned start_track = std::min(toc.last_track, std::max(toc.first_track, (CurPlayStart >> 8) & 0xFF)); - const unsigned start_index = std::min(99, std::max(1, CurPlayStart & 0xFF)); - const unsigned sq_idx = BCD_to_U8(SubQBuf_Safe[0x2]); - const unsigned sq_tno = (SubQBuf_Safe[0x1] >= 0xA0) ? SubQBuf_Safe[0x1] : BCD_to_U8(SubQBuf_Safe[0x1]); - - if(sq_idx < start_index && sq_tno <= start_track) - { - if(SeekIndexPhase == 2) - { - index_ok = false; - CurSector += 4; - DriveCounter += (int64)((44100 * 256) / 150) << 32; - } - else - { - index_ok = false; - CurSector += 128; - DriveCounter += (int64)((44100 * 256) / 150) << 32; - SeekIndexPhase = 1; - } - } - else - { - if(SeekIndexPhase == 1) - { - index_ok = false; - CurSector -= 124; - DriveCounter += (int64)((44100 * 256) / 150) << 32; - SeekIndexPhase = 2; - } - } - } - - if(index_ok) - { - DrivePhase = DRIVEPHASE_PLAY; - DriveCounter += (int64)((44100 * 256) / ((SubQBuf_Safe[0] & 0x40) ? 150 : 75)) << 32; - } - //else - // printf("%d\n", CurSector); - } - } - break; - - case DRIVEPHASE_PLAY: - if(SecPreBuf_In > 0) - { - if(SubQBuf_Safe[0] & 0x40) - { - CurPosInfo.is_cdrom = true; - - //assert(edc_check(SecPreBuf, false)); - - if(FreeBufferCount > 0) - { - const uint8 bfi = Buffer_Allocate(false); - - memcpy(Buffers[bfi].Data, SecPreBuf, 2352); - - SecPreBuf_In = false; - LastBufDest = FilterBuf(CDDevConn, bfi); - TriggerIRQ(HIRQ_CSCT); - if(FreeBufferCount == 0) - TriggerIRQ(HIRQ_BFUL); - } - } - else - { - CurPosInfo.is_cdrom = false; - if(!CDDABuf_Count) - { - for(int i = 0; i < CDDABuf_PrefillCount; i++) - { - CDDABuf[CDDABuf_WP][0] = 0; - CDDABuf[CDDABuf_WP][1] = 0; - CDDABuf_WP = (CDDABuf_WP + 1) % CDDABuf_MaxCount; - CDDABuf_Count++; - } - } - - for(int i = 0; i < 588 && CDDABuf_Count < CDDABuf_MaxCount; i++) - { - CDDABuf[CDDABuf_WP][0] = MDFN_de16lsb(&SecPreBuf[i * 4 + 0]); - CDDABuf[CDDABuf_WP][1] = MDFN_de16lsb(&SecPreBuf[i * 4 + 2]); - CDDABuf_WP = (CDDABuf_WP + 1) % CDDABuf_MaxCount; - CDDABuf_Count++; - } - - SecPreBuf_In = false; - } - - if(!SecPreBuf_In) - { - CurPosInfo.status = STATUS_PLAY; - } - } // end if(SecPreBuf_In > 0) - - PeriodicIdleCounter = 17712LL << 32; - if(DrivePhase == DRIVEPHASE_PLAY) - { - if(SecPreBuf_In) - { - // TODO: More accurate: - CurPosInfo.status = STATUS_PAUSE; - - if(SecPreBuf_In > 0) - SS_DBG(SS_DBG_CDB, "[CDB] SB Overflow\n"); - } - else - { - Cur_CDIF->ReadRawSector(SecPreBuf, CurSector - 150); - SecPreBuf_In = true; - - // TODO:(maybe pointless...) - //if(SubQBuf_Safe[0] & 0x40) - // CurPosInfo.fad = SECTOR HEADER - //else - // CurPosInfo.fad = SUBQ STUFF - CurPosInfo.fad = CurSector; - if(DecodeSubQ(SecPreBuf + 2352)) - { - CurPosInfo.rel_fad = (BCD_to_U8(SubQBuf[0x3]) * 60 + BCD_to_U8(SubQBuf[0x4])) * 75 + BCD_to_U8(SubQBuf[0x5]); - CurPosInfo.tno = (SubQBuf[0x1] >= 0xA0) ? SubQBuf[0x1] : BCD_to_U8(SubQBuf[0x1]); - CurPosInfo.idx = BCD_to_U8(SubQBuf[0x2]); - } - CurSector++; - } - } - - DriveCounter += (int64)((44100 * 256) / ((SubQBuf_Safe[0] & 0x40) ? 150 : 75)) << 32; - break; - } - } - - if(PeriodicIdleCounter <= 0) - { - PeriodicIdleCounter = PeriodicIdleCounter_Reload; - - // - // - // - if(SecPreBuf_In && DrivePhase == DRIVEPHASE_PLAY) - { - bool end_met = (CurPosInfo.tno == 0xAA); - - if(CurPlayEnd != 0) - { - if(CurPlayEnd & 0x800000) - end_met |= (CurPosInfo.fad >= (CurPlayEnd & 0x7FFFFF)); - else - { - const unsigned end_track = std::min(toc.last_track, std::max(toc.first_track, (CurPlayEnd >> 8) & 0xFF)); - const unsigned end_index = std::min(99, std::max(1, CurPlayEnd & 0xFF)); - - end_met |= (CurPosInfo.tno > end_track) || (CurPosInfo.tno == end_track && CurPosInfo.idx > end_index); - } - } - - // - // Steam Heart's, it's always Steam Heart's... - // - if(CurPlayStart & 0x800000) - { - end_met |= (CurPosInfo.fad < (CurPlayStart & 0x7FFFFF)); - } - else - { - const unsigned start_track = std::min(toc.last_track, std::max(toc.first_track, (CurPlayStart >> 8) & 0xFF)); - const unsigned start_index = std::min(99, std::max(1, CurPlayStart & 0xFF)); - - end_met |= (CurPosInfo.tno < start_track); //|| (CurPosInfo.tno == start_track && CurPosInfo.idx < start_index); - } - - if(end_met) - { - SecPreBuf_In = false; - if(PlayRepeatCounter >= CurPlayRepeat) - { - CurSector = CurPosInfo.fad; - - if(PlayEndIRQType) - { - CurPosInfo.status = STATUS_BUSY; - - PlayEndIRQType += 1 << 30; - - if((PlayEndIRQType >> 30) >= 3) - { - TriggerIRQ(PlayEndIRQType & 0xFFFF); // May not be right for EFLS with Read File, maybe EFLS is only triggered after the buffer is written? - PlayEndIRQType = 0; - } - } - - if(!PlayEndIRQType) - CurPosInfo.status = STATUS_PAUSE; - } - else - { - StartSeek(PlayCmdStartPos); - - if(PlayRepeatCounter < 0xE) - PlayRepeatCounter++; - } - } - } - // - // - // - PeriodicIdleCounter = PeriodicIdleCounter_Reload; - - if(ResultsRead) - MakeReport(false, STATUS_PERIODIC); - - // FIXME: Other ADR types, and correct handling when in STANDBY/STOPPED state? - SubCodeQBuf[0] = CurPosInfo.ctrl_adr; - SubCodeQBuf[1] = CurPosInfo.tno; - SubCodeQBuf[2] = CurPosInfo.idx; - SubCodeQBuf[3] = CurPosInfo.rel_fad >> 16; - SubCodeQBuf[4] = CurPosInfo.rel_fad >> 8; - SubCodeQBuf[5] = CurPosInfo.rel_fad >> 0; - SubCodeQBuf[6] = 0; // ? OxFF in some cases... - SubCodeQBuf[7] = CurPosInfo.fad >> 16; - SubCodeQBuf[8] = CurPosInfo.fad >> 8; - SubCodeQBuf[9] = CurPosInfo.fad >> 0; - - TriggerIRQ(HIRQ_SCDQ); - } -} - -void CDB_GetCDDA(uint16* outbuf) -{ - outbuf[0] = outbuf[1] = 0; - - if(CDDABuf_Count) - { - outbuf[0] = CDDABuf[CDDABuf_RP][0]; - outbuf[1] = CDDABuf[CDDABuf_RP][1]; - - CDDABuf_RP = (CDDABuf_RP + 1) % CDDABuf_MaxCount; - CDDABuf_Count--; - } - - //static int32 counter = 0; - //outbuf[0] = (counter & 0xFF) << 6; - //outbuf[1] = (counter & 0xFF) << 6; - //counter++; -} - -static void ClearPendingSec(void) -{ - //PlayEndIRQPending = 0; - PlayEndIRQType = 0; - - SecPreBuf_In = false; - - CDDABuf_WP = CDDABuf_RP = 0; - CDDABuf_Count = 0; -} - -sscpu_timestamp_t CDB_Update(sscpu_timestamp_t timestamp) -{ - if(MDFN_UNLIKELY(timestamp < lastts)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_CDB, "[CDB] [BUG] timestamp(%d) < lastts(%d)\n", timestamp, lastts); - } - else - { - int64 clocks = (int64)(timestamp - lastts) * CDB_ClockRatio; - lastts = timestamp; - - Drive_Run(clocks); - - // - // - // - CommandClockCounter += clocks; - switch(CommandPhase + CommandPhaseBias) - { - for(;;) - { - default: - case __COUNTER__: - - while(!CommandPending) - { - if(FLS_Run()) - { - CMD_EAT_CLOCKS(60); - TriggerIRQ(HIRQ_EFLS); - CMD_EAT_CLOCKS(60); - } - else - { - CMD_YIELD; - } - } - - for(unsigned i = 0; i < 4; i++) - CTR.CD[i] = CData[i]; - - CTR.Command = CTR.CD[0] >> 8; - if(MDFN_UNLIKELY(ss_dbg_mask & SS_DBG_CDB)) - { - char cdet[128]; - GetCommandDetails(CTR.CD, cdet, sizeof(cdet)); - SS_DBG(SS_DBG_CDB, "[CDB] Command: %s --- HIRQ=0x%04x, HIRQ_Mask=0x%04x\n", cdet, HIRQ, HIRQ_Mask); - } - // - // - CMD_EAT_CLOCKS(84); - - // - // - // - if(CTR.Command == COMMAND_GET_CDSTATUS) // = 0x00, - { - CDStatusResults(); - } - // - // - // - else if(CTR.Command == COMMAND_GET_HWINFO) // = 0x01, - { - BasicResults(MakeBaseStatus() << 8, - 0x0002, - 0x0000, - 0x0600); // TODO: Before INIT: 0xFF00; - } - // - // - // - else if(CTR.Command == COMMAND_GET_TOC) // = 0x02, - { - if(DrivePhase == DRIVEPHASE_STARTUP || DT.Active) - CDStatusResults(false, STATUS_WAIT); - else - { - BasicResults(MakeBaseStatus(false, STATUS_DTREQ) << 8, 0xCC, 0, 0); - - // - // - DT.CurBufIndex = 0; - DT.BufCount = 1; - - DT.InBufOffs = 0; - DT.InBufCounter = 0xCC; - - DT.TotalCounter = 0; - - DT.FIFO_RP = 0; - DT.FIFO_WP = 0; - DT.FIFO_In = 0; - - DT.BufList[0] = 0xFF; - - DT.Writing = false; - DT.NeedBufFree = false; - DT.Active = true; - // - // - // - CMD_EAT_CLOCKS(128); - TriggerIRQ(HIRQ_DRDY); - } - } - // - // - // - else if(CTR.Command == COMMAND_GET_SESSINFO) // = 0x03, - { - if(DrivePhase == DRIVEPHASE_STARTUP) - CDStatusResults(false, STATUS_WAIT); - else - { - const unsigned sess = CTR.CD[0] & 0xFF; - uint32 fad; - uint8 rsw; - - if(!sess) - { - fad = 150 + toc.tracks[100].lba; - rsw = 0x01; // Session count; - } - else if(sess <= 0x01) - { - fad = 0; - rsw = sess; - } - else - { - fad = 0xFFFFFF; - rsw = 0xFF; - } - - BasicResults(MakeBaseStatus() << 8, 0, (rsw << 8) | (fad >> 16), fad); - } - } - // - // - // - else if(CTR.Command == COMMAND_INIT) // = 0x04, - { - CDStatusResults(false, 0x00, true); - - // - if(CTR.CD[0] & 0x01) // Software reset of CD block - { - SWReset(); - - CMD_EAT_CLOCKS(8192); - TriggerIRQ(HIRQ_MPED | HIRQ_EFLS | HIRQ_ECPY | HIRQ_EHST | HIRQ_ESEL | HIRQ_CMOK); - } - - // TODO TODO TODO - // & 0x02; // Decode subcode RW - // & 0x04; // Ignore mode2 subheader? - // & 0x08; // Retry form2 read - // & 0x30; // CD read speed(unused?) - // & 0x80; // No change? - } -/* - // - // - // - else if(CTR.Command == COMMAND_OPEN) // = 0x05, - { - } -*/ - // - // - // - else if(CTR.Command == COMMAND_END_DATAXFER) // = 0x06, - { - if(DT.Active) - { - DT.Active = false; - - BasicResults((MakeBaseStatus() << 8) | (DT.TotalCounter >> 16), DT.TotalCounter, 0, 0); - - if(DT.InBufCounter > 0 || DT.FIFO_In > 0) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_CDB, "[CDB] Data transfer ended prematurely at %u bytes left!\n", (DT.InBufCounter + DT.FIFO_In) * 2); - } - - if(DT.Writing) - { - if(CDDevConn == DT.FNum) - CDDevConn = 0xFF; - - for(unsigned i = 0; i < DT.BufCount; i++) - { - FilterBuf(DT.FNum, DT.BufList[i]); - } - - CMD_EAT_CLOCKS(270); - if(FreeBufferCount == 0) - TriggerIRQ(HIRQ_BFUL); - TriggerIRQ(HIRQ_EHST); - } - else - { - if(DT.NeedBufFree) - { - for(unsigned i = 0; i < DT.BufCount; i++) - { - Buffer_Free(DT.BufList[i]); - } - } - - if(DT.BufList[0] != 0xFE && DT.BufList[0] != 0xFD) // FIXME: Cleanup(use enums for special buffer ids) - Also check for TOC and FINFO - { - CMD_EAT_CLOCKS(130); - TriggerIRQ(HIRQ_EHST); - } - } - } - else - BasicResults((MakeBaseStatus() << 8) | 0xFF, 0xFFFF, 0, 0); - } - // - // - // - else if(CTR.Command == COMMAND_PLAY) // = 0x10, - { - uint32 cmd_psp = ((CTR.CD[0] & 0xFF) << 16) | CTR.CD[1]; - uint32 cmd_pep = ((CTR.CD[2] & 0xFF) << 16) | CTR.CD[3]; - uint8 pm = CTR.CD[2] >> 8; - - if(cmd_psp == 0xFFFFFF) - cmd_psp = PlayCmdStartPos; - - if(cmd_pep == 0xFFFFFF) - cmd_pep = PlayCmdEndPos; - else if((cmd_psp & 0x800000) && (cmd_pep & 0x800000)) - cmd_pep = 0x800000 | ((cmd_psp + cmd_pep) & 0x7FFFFF); - - if(((cmd_psp ^ cmd_pep) & 0x800000) && cmd_pep != 0) - CDStatusResults(true); - else - { - PlayCmdStartPos = cmd_psp; - PlayCmdEndPos = cmd_pep; - // - - CurPosInfo.status = STATUS_BUSY; // Happens even if (PlayMode & 0x80)... - CDStatusResults(); - // - // - if(!(pm & 0x80)) - ClearPendingSec(); - - StartSeek(PlayCmdStartPos, (bool)(pm & 0x80)); - - PlayEndIRQType = HIRQ_PEND; - CurPlayEnd = PlayCmdEndPos; - - if(!(pm & 0x70)) - PlayCmdRepCnt = pm & 0x0F; - - PlayRepeatCounter = 0; - CurPlayRepeat = PlayCmdRepCnt; - } - } - // - // - // - else if(CTR.Command == COMMAND_SEEK) // = 0x11, - { - CurPosInfo.status = STATUS_BUSY; - CDStatusResults(); - // - // - const uint32 cmd_sp = ((CTR.CD[0] & 0xFF) << 16) | CTR.CD[1]; - - if(!cmd_sp) // Stop - { - ClearPendingSec(); - CurPosInfo.is_cdrom = false; // FIXME? Correct? - CurPosInfo.status = STATUS_BUSY; - CurPosInfo.fad = 0xFFFFFF; - CurPosInfo.rel_fad = 0xFFFFFF; - CurPosInfo.ctrl_adr = 0xFF; - CurPosInfo.idx = 0xFF; - CurPosInfo.tno = 0xFF; - - DrivePhase = DRIVEPHASE_STOPPED; - DriveCounter = (int64)380000 << 32; - } - else if(cmd_sp == 0xFFFFFF) // Pause - { - if(DrivePhase == DRIVEPHASE_STOPPED) // TODO: Test - { - ClearPendingSec(); - StartSeek(0x800096); - } - - SecPreBuf_In = -abs(SecPreBuf_In); - PlayEndIRQType = 0; - CurPlayEnd = 0x800000; - CurPlayRepeat = 0; - } - else - { - ClearPendingSec(); - CurPlayEnd = 0x800000; - CurPlayRepeat = 0; - StartSeek(cmd_sp); - } - } -/* - // - // - // - else if(CTR.Command == COMMAND_SCAN) // = 0x12, - { - //CurPosInfo.is_cdrom = false; - Forward scan data track(on Saturn CD): - 4-5 sequential position updates, then jumps like: - 17f-> 1e1 (62) - 96d-> 9d0 (63) - fd8->103b (63) - 202c->2093 (67) - 2fa1->300a (69) - 3fdf->404a (6b) - 4fa3->5011 (6e) - 5fad->601c (6f) - 6f96->7007 (71) - 7fcd->8040 (73) - 8fd7->904e (77) - 9faf->a028 (79) - afcd->b047 (7a) - - 97.79888435299837 + 0.0005527097174003169x - } -*/ - // - // - // - else if(CTR.Command == COMMAND_GET_SUBCODE) // = 0x20, - { - if(DT.Active) - CDStatusResults(false, STATUS_WAIT); - else - { - uint8 type; - - type = CTR.CD[0] & 0xFF; - - if(type >= 0x02) - CDStatusResults(true); - else - { - if(type == 0) // Q (TODO: ADR other than 0x1) - { - BasicResults(MakeBaseStatus(false, STATUS_DTREQ) << 8, 0x05, 0, 0); - DT.BufList[0] = 0xFE; - DT.InBufCounter = 0x05; - } - else // R-W (TODO) - { - BasicResults(MakeBaseStatus(false, STATUS_DTREQ) << 8, 0x0C, 0, 0); - - for(unsigned i = 0; i < 24; i++) - SubCodeRWBuf[i] = 0xFF; - - DT.BufList[0] = 0xFD; - DT.InBufCounter = 0x0C; - } - - DT.CurBufIndex = 0; - DT.BufCount = 1; - - DT.InBufOffs = 0; - - DT.TotalCounter = 0; - DT.FIFO_RP = 0; - DT.FIFO_WP = 0; - DT.FIFO_In = 0; - - DT.Writing = false; - DT.NeedBufFree = false; - DT.Active = true; - // - // - // - CMD_EAT_CLOCKS(128); - TriggerIRQ(HIRQ_DRDY); - } - } - } - // - // - // - else if(CTR.Command == COMMAND_AUTH_DEVICE) - { - uint8 fnum; - - fnum = (CTR.CD[2] >> 8); - - if(fnum >= 0x18) - CDStatusResults(true); - else if(FLS.Active) - CDStatusResults(false, STATUS_WAIT); - else - { - CDStatusResults(); - // - // - // - bool is_audio_cd; - uint32 data_track_fad; - - is_audio_cd = true; - - // TODO: Check DrivePhase == DRIVEPHASE_STARTUP - for(int32 track = toc.first_track; track <= toc.last_track; track++) - { - if(toc.tracks[track].control & SUBQ_CTRLF_DATA) - { - data_track_fad = 150 + toc.tracks[track].lba; - is_audio_cd = false; - break; - } - } - - if(is_audio_cd) - { - AuthDiscType = 0x01; //0x04; - CMD_EAT_CLOCKS(200); - TriggerIRQ(HIRQ_EFLS); - } - else - { - SetCDDeviceConn(fnum); - Filter_SetTrueConn(fnum, fnum); - Filter_SetFalseConn(fnum, 0xFF); - Filter_SetRange(fnum, 0, 0); - Filters[fnum].Mode = 0; - - FLS.pnum = fnum; - FLS.DoAuth = true; - FLS.Active = true; - - ClearPendingSec(); - StartSeek(0x800000 | (data_track_fad + 16)); - - CurPlayEnd = 0; - CurPlayRepeat = 0; - PlayRepeatCounter = 0; - } - } - } - // - // - // - else if(CTR.Command == COMMAND_GET_AUTH) - { - if(FLS.Active && FLS.DoAuth) - CDStatusResults(true); - else - BasicResults(MakeBaseStatus() << 8, AuthDiscType, 0, 0); - } - // - // - // - else if(CTR.Command == COMMAND_SET_CDDEVCONN) // = 0x30, - { - #define fnum (CTR.CD[2] >> 8) - - if(fnum >= 0x18 && fnum != 0xFF) - CDStatusResults(true); - else - { - SetCDDeviceConn(fnum); - - CDStatusResults(); - - CMD_EAT_CLOCKS(96); - TriggerIRQ(HIRQ_ESEL); - } - #undef fnum - } - // - // - // - else if(CTR.Command == COMMAND_GET_CDDEVCONN) // = 0x31, - { - BasicResults((MakeBaseStatus() << 8), 0, CDDevConn << 8, 0); - } - // - // - // - else if(CTR.Command == COMMAND_GET_LASTBUFDST) // = 0x32, - { - BasicResults(MakeBaseStatus() << 8, 0, LastBufDest << 8, 0); - } - // - // - // - else if(CTR.Command == COMMAND_SET_FILTRANGE) // = 0x40, - { - #define fnum (CTR.CD[2] >> 8) - - if(fnum >= 0x18) - CDStatusResults(true); - else - { - { - const uint32 fad = ((CTR.CD[0] & 0xFF) << 16) | CTR.CD[1]; - const uint32 range = ((CTR.CD[2] & 0xFF) << 16) | CTR.CD[3]; - - Filter_SetRange(fnum, fad, range); - - CDStatusResults(); - } - CMD_EAT_CLOCKS(96); - TriggerIRQ(HIRQ_ESEL); - } - #undef fnum - } - // - // - // - else if(CTR.Command == COMMAND_GET_FILTRANGE) // = 0x41, - { - const unsigned fnum = CTR.CD[2] >> 8; - - if(fnum >= 0x18) - CDStatusResults(true); - else - { - const uint32 fad = Filters[fnum].FAD; - const uint32 range = Filters[fnum].Range; - - BasicResults((MakeBaseStatus() << 8) | (fad >> 16), - fad, - (fnum << 8) | (range >> 16), - range); - } - } - // - // - // - else if(CTR.Command == COMMAND_SET_FILTSUBHC) // = 0x42, - { - #define fnum (CTR.CD[2] >> 8) - - if(fnum >= 0x18) - CDStatusResults(true); - else - { - Filters[fnum].Channel = CTR.CD[0] & 0xFF; - Filters[fnum].SubModeMask = CTR.CD[1] >> 8; - Filters[fnum].CInfoMask = CTR.CD[1] & 0xFF; - Filters[fnum].File = CTR.CD[2] & 0xFF; - Filters[fnum].SubMode = CTR.CD[3] >> 8; - Filters[fnum].CInfo = CTR.CD[3] & 0xFF; - - CDStatusResults(); - - CMD_EAT_CLOCKS(96); - TriggerIRQ(HIRQ_ESEL); - } - #undef fnum - } - // - // - // - else if(CTR.Command == COMMAND_GET_FILTSUBHC) // = 0x43, - { - const unsigned fnum = CTR.CD[2] >> 8; - - if(fnum >= 0x18) - CDStatusResults(true); - else - { - const auto& f = Filters[fnum]; - - BasicResults((MakeBaseStatus() << 8) | f.Channel, - (f.SubModeMask << 8) | f.CInfoMask, - (fnum << 8) | f.File, - (f.SubMode << 8) | f.CInfo); - } - } - // - // - // - else if(CTR.Command == COMMAND_SET_FILTMODE) // = 0x44, - { - #define fnum (CTR.CD[2] >> 8) - - if(fnum >= 0x18) - CDStatusResults(true); - else - { - Filters[fnum].Mode = CTR.CD[0] & 0xFF; - - if(CTR.CD[0] & 0x80) - Filter_ResetCond(fnum); - - CDStatusResults(); - - CMD_EAT_CLOCKS(96); - TriggerIRQ(HIRQ_ESEL); - } - #undef fnum - } - // - // - // - else if(CTR.Command == COMMAND_GET_FILTMODE) // = 0x45, - { - const unsigned fnum = CTR.CD[2] >> 8; - - if(fnum >= 0x18) - CDStatusResults(true); - else - BasicResults((MakeBaseStatus() << 8) | Filters[fnum].Mode, - 0, - fnum << 8, - 0); - } - // - // - // - else if(CTR.Command == COMMAND_SET_FILTCONN) // = 0x46, - { - #define fnum (CTR.CD[2] >> 8) - #define fcflags (CTR.CD[0] & 0xFF) - #define tconn (CTR.CD[1] >> 8) - #define fconn (CTR.CD[1] & 0xFF) - - if(fnum >= 0x18 || ((fcflags & 0x1) && (tconn >= 0x18) && tconn != 0xFF) || ((fcflags & 0x2) && (fconn >= 0x18) && fconn != 0xFF)) - CDStatusResults(true); - else - { - if(fcflags & 0x1) - Filter_SetTrueConn(fnum, tconn); - - if(fcflags & 0x2) - Filter_SetFalseConn(fnum, fconn); - - CDStatusResults(); - - CMD_EAT_CLOCKS(96); - TriggerIRQ(HIRQ_ESEL); - } - #undef fconn - #undef tconn - #undef fcflags - #undef fnum - } - // - // - // - else if(CTR.Command == COMMAND_GET_FILTCONN) // = 0x47, - { - const unsigned fnum = CTR.CD[2] >> 8; - - if(fnum >= 0x18) - CDStatusResults(true); - else - { - const auto& f = Filters[fnum]; - - BasicResults((MakeBaseStatus() << 8), - (f.TrueConn << 8) | f.FalseConn, - fnum << 8, - 0); - } - } - // - // - // - else if(CTR.Command == COMMAND_RESET_SEL) // = 0x48, - { - unsigned rflags; - - rflags = CTR.CD[0] & 0xFF; - - if(!rflags) - { - unsigned pnum; - - pnum = CTR.CD[2] >> 8; - - if(pnum >= 0x18) - CDStatusResults(true); - else - { - Partition_Clear(pnum); - - CDStatusResults(); - // - // - // - CMD_EAT_CLOCKS(150); - TriggerIRQ(HIRQ_ESEL); - } - } - else - { - for(unsigned pnum = 0; pnum < 0x18; pnum++) - { - if(rflags & 0x04) // Initialize all partition data - { - Partition_Clear(pnum); - } - - if(rflags & 0x08) // Initialize all partition output connectors? ? ? - { - - } - - if(rflags & 0x10) // Initialize all filter conditions - { - Filter_ResetCond(pnum); - } - - if(rflags & 0x20) // Initialize all filter input connectors? ? ? - { - if(pnum == CDDevConn) - CDDevConn = 0xFF; - - if(Filters[pnum].FalseConn < 0x18) - Filters[pnum].FalseConn = 0xFF; - } - - if(rflags & 0x40) // Initialize all true output connectors - { - Filters[pnum].TrueConn = pnum; - } - - if(rflags & 0x80) // Initialize all false output connectors - { - Filters[pnum].FalseConn = 0xFF; - } - } - CDStatusResults(); - // - // - // - // TODO: Accurate timing(while not blocking other command execution and sector reading). - CMD_EAT_CLOCKS(300); - TriggerIRQ(HIRQ_ESEL); - } - } - // - // - // - else if(CTR.Command == COMMAND_GET_BUFSIZE) // = 0x50, - { - BasicResults(MakeBaseStatus() << 8, - FreeBufferCount, - 0x18 << 8, - NumBuffers); - } - // - // - // - else if(CTR.Command == COMMAND_GET_SECNUM) // = 0x51, - { - const unsigned pnum = CTR.CD[2] >> 8; - - if(pnum >= 0x18) - { - CDStatusResults(true); - } - else - { - BasicResults(MakeBaseStatus() << 8, - 0, - 0, - Partitions[pnum].Count); - } - } - // - // - // - else if(CTR.Command == COMMAND_CALC_ACTSIZE) // = 0x52, - { - unsigned pnum; - int offs, numsec; - - offs = CTR.CD[1]; - pnum = CTR.CD[2] >> 8; - numsec = CTR.CD[3]; - - if(pnum >= 0x18) - CDStatusResults(true); - else - { - offs = CTR.CD[1]; - numsec = CTR.CD[3]; - - if(offs == 0xFFFF) - offs = Partitions[pnum].Count - 1; - - if(numsec == 0xFFFF) - numsec = Partitions[pnum].Count - offs; - - if((DT.Active && DT.Writing) || numsec <= 0 || offs < 0 || (offs + numsec) > (int)Partitions[pnum].Count) - CDStatusResults(false, STATUS_WAIT); - else - { - CDStatusResults(); - - // - { - uint32 tmp_accum = 0; - for(int i = 0, bfi = Partition_GetBuffer(pnum, offs); i < numsec; i++, bfi = Buffers[bfi].Next) - { - const uint8* const sd = Buffers[bfi].Data; - - switch(GetSecLen) - { - default: - case SECLEN_2048: - if((sd[12 + 3] == 0x2) && (sd[16 + 2] & 0x20)) // Mode 2 Form 2 - tmp_accum += 1162; - else // M2F1 and Mode 1(weird tested inconsistency with Get Sector Data command, not that it probably matters) - tmp_accum += 1024; - break; - - case SECLEN_2336: tmp_accum += 1168; break; - case SECLEN_2340: tmp_accum += 1170; break; - case SECLEN_2352: tmp_accum += 1176; break; - } - } - CalcedActualSize = tmp_accum; - } - // - CMD_EAT_CLOCKS(240); // TODO: proper timing(can be surprisingly large for higher numsec) - TriggerIRQ(HIRQ_ESEL); - } - } - } - // - // - // - else if(CTR.Command == COMMAND_GET_ACTSIZE) // = 0x53, - { - BasicResults((MakeBaseStatus() << 8) | (CalcedActualSize >> 16), CalcedActualSize, 0, 0); - } - // - // - // - else if(CTR.Command == COMMAND_GET_SECINFO) // = 0x54, - { - unsigned offs; - unsigned pnum; - - offs = CTR.CD[1]; - pnum = CTR.CD[2] >> 8; - - if(pnum >= 0x18 || (offs != 0xFFFF && offs >= Partitions[pnum].Count) || Partitions[pnum].Count == 0) - CDStatusResults(true); - else - { - const int bfi = ((offs == 0xFFFF) ? Partitions[pnum].LastBuf : Partition_GetBuffer(pnum, offs)); - const uint8* sd = Buffers[bfi].Data; - uint32 fad; - uint8 file = 0, chan = 0, submode = 0, cinfo = 0; - - fad = AMSF_to_ABA(BCD_to_U8(sd[12 + 0]), BCD_to_U8(sd[12 + 1]), BCD_to_U8(sd[12 + 2])); - if(sd[12 + 3] == 0x2) - { - file = sd[16]; - chan = sd[17]; - submode = sd[18]; - cinfo = sd[19]; - } - - BasicResults((MakeBaseStatus() << 8) | (fad >> 16), - fad, - (file << 8) | chan, - (submode << 8) | cinfo); - } - } - // - // - // - else if(CTR.Command == COMMAND_EXEC_FADSRCH) // = 0x55, - { - unsigned offs; - unsigned pnum; - uint32 sfad; - - offs = CTR.CD[1]; - pnum = CTR.CD[2] >> 8; - sfad = ((CTR.CD[2] & 0xFF) << 16) | CTR.CD[3]; - - if(pnum >= 0x18 || (offs != 0xFFFF && offs >= Partitions[pnum].Count) || Partitions[pnum].Count == 0) - CDStatusResults(true); - else - { - int counter; - int effoffs, bfi; - bool match_made; - - FADSearch.spos = 0xFFFF; - FADSearch.pnum = pnum; - FADSearch.fad = 0; - - counter = 0; - effoffs = (offs == 0xFFFF) ? (Partitions[pnum].Count - 1) : offs; - bfi = Partitions[pnum].FirstBuf; - match_made = false; - - do - { - if(counter >= effoffs) - { - const uint8* sd = Buffers[bfi].Data; - const uint32 fad = AMSF_to_ABA(BCD_to_U8(sd[12 + 0]), BCD_to_U8(sd[12 + 1]), BCD_to_U8(sd[12 + 2])); - - if(fad <= sfad && fad >= (FADSearch.fad + match_made)) - { - FADSearch.spos = counter; - FADSearch.fad = fad; - match_made = true; - } - } - bfi = Buffers[bfi].Next; - counter++; - } while(bfi != 0xFF); - - CDStatusResults(); - // - // - // - CMD_EAT_CLOCKS(300); - TriggerIRQ(HIRQ_ESEL); - } - } - // - // - // - else if(CTR.Command == COMMAND_GET_FADSRCH) // = 0x56, - { - BasicResults(MakeBaseStatus() << 8, FADSearch.spos, (FADSearch.pnum << 8) | (FADSearch.fad >> 16), FADSearch.fad); - } - // - // - // - else if(CTR.Command == COMMAND_SET_SECLEN) // = 0x60, - { - const unsigned NewGetSecLen = (CTR.CD[0] & 0xFF); - const unsigned NewPutSecLen = (CTR.CD[1] >> 8); - const bool NewGetSecLenBad = NewGetSecLen != 0xFF && (NewGetSecLen < SECLEN__FIRST || NewGetSecLen > SECLEN__LAST); - const bool NewPutSecLenBad = NewPutSecLen != 0xFF && (NewPutSecLen < SECLEN__FIRST || NewPutSecLen > SECLEN__LAST); - - if(NewGetSecLenBad || NewPutSecLenBad) - { - CDStatusResults(true); - } - else - { - if(NewGetSecLen != 0xFF) - GetSecLen = NewGetSecLen; - - if(NewPutSecLen != 0xFF) - PutSecLen = NewPutSecLen; - - CDStatusResults(); - TriggerIRQ(HIRQ_ESEL); - } - } - // - // - // - else if(CTR.Command == COMMAND_GET_SECDATA || CTR.Command == COMMAND_DEL_SECDATA || CTR.Command == COMMAND_GETDEL_SECDATA) // = 0x61, 0x62, 0x63 - { - unsigned pnum; - int offs, numsec; - - pnum = CTR.CD[2] >> 8; - if(pnum >= 0x18) - CDStatusResults(true); - else - { - offs = CTR.CD[1]; - numsec = CTR.CD[3]; - - if(offs == 0xFFFF) - offs = Partitions[pnum].Count - 1; - - if(numsec == 0xFFFF) - numsec = Partitions[pnum].Count - offs; - - if((DT.Active && CTR.Command != COMMAND_DEL_SECDATA) || numsec <= 0 || offs < 0 || (offs + numsec) > (int)Partitions[pnum].Count) - CDStatusResults(false, STATUS_WAIT); - else - { - int sbfi; - - sbfi = Partition_GetBuffer(pnum, offs); - - if(CTR.Command != COMMAND_DEL_SECDATA) - { - for(int i = 0, bfi = sbfi; i < numsec; i++) - { - const int next_bfi = Buffers[bfi].Next; - DT.BufList[i] = bfi; - if(CTR.Command == COMMAND_GETDEL_SECDATA) - Partition_UnlinkBuffer(pnum, bfi); - bfi = next_bfi; - } - - CDStatusResults(false, STATUS_DTREQ); - - DT.Writing = false; - DT.NeedBufFree = (CTR.Command == COMMAND_GETDEL_SECDATA); - DT.CurBufIndex = 0; - DT.BufCount = numsec; - - DT_SetIBOffsCount(Buffers[DT.BufList[0]].Data); - - DT.TotalCounter = 0; - - DT.FIFO_RP = 0; - DT.FIFO_WP = 0; - DT.FIFO_In = 0; - - for(unsigned i = 0; i < 5; i++) - DT_ReadIntoFIFO(); - - DT.Active = true; - } - else - CDStatusResults(); - - // - // - // - if(CTR.Command == COMMAND_DEL_SECDATA) - { - for(int i = 0, bfi = sbfi; i < numsec; i++) - { - const int next_bfi = Buffers[bfi].Next; - Partition_UnlinkBuffer(pnum, bfi); - Buffer_Free(bfi); - bfi = next_bfi; - } - - CMD_EAT_CLOCKS(485); - TriggerIRQ(HIRQ_EHST); - } - else - { - CMD_EAT_CLOCKS(460); - TriggerIRQ(HIRQ_DRDY); - } - } - } - } - // - // - // - else if(CTR.Command == COMMAND_PUT_SECDATA) // = 0x64, - { - unsigned fnum, numsec; - - fnum = CTR.CD[2] >> 8; - numsec = CTR.CD[3]; - - if(fnum >= 0x18) - { - CDStatusResults(true); - } - else if(numsec == 0 || numsec > FreeBufferCount || DT.Active) - { - CDStatusResults(false, STATUS_WAIT); - } - else - { - if(CDDevConn == fnum) - CDDevConn = 0xFF; - - CDStatusResults(false, STATUS_DTREQ); - - DT.Writing = true; - DT.NeedBufFree = false; - DT.FNum = fnum; - DT.CurBufIndex = 0; - for(unsigned i = 0; i < numsec; i++) - { - DT.BufList[i] = Buffer_Allocate(true); - } - - DT.BufCount = numsec; - - DT_SetIBOffsCount(NULL); - - DT.TotalCounter = 0; - - DT.FIFO_RP = 0; - DT.FIFO_WP = 0; - DT.FIFO_In = 0; - DT.Active = true; - // - // - // - CMD_EAT_CLOCKS(300); - TriggerIRQ(HIRQ_DRDY); - } - } - // - // - // - else if(CTR.Command == COMMAND_COPY_SECDATA || CTR.Command == COMMAND_MOVE_SECDATA) // = 0x65, =0x66 - { - unsigned dst_fnum, src_pnum; - - dst_fnum = CTR.CD[0] & 0xFF; - src_pnum = CTR.CD[2] >> 8; - - if(src_pnum >= 0x18 || dst_fnum >= 0x18) - CDStatusResults(true); - else - { - int src_offs, numsec; - - src_offs = CTR.CD[1]; - numsec = CTR.CD[3]; - - if(src_offs == 0xFFFF) - src_offs = Partitions[src_pnum].Count - 1; - - if(numsec == 0xFFFF) - numsec = Partitions[src_pnum].Count - src_offs; - - if(DT.Active || numsec <= 0 || (numsec > (int)FreeBufferCount && CTR.Command != COMMAND_MOVE_SECDATA) || src_offs < 0 || (src_offs + numsec) > (int)Partitions[src_pnum].Count) - CDStatusResults(false, STATUS_WAIT); - else - { - if(CDDevConn == dst_fnum) - CDDevConn = 0xFF; - - for(int i = 0, bfi = Partition_GetBuffer(src_pnum, src_offs); i < numsec; i++) - { - const uint8* bufdata = Buffers[bfi].Data; - const int next_bfi = Buffers[bfi].Next; - - if(CTR.Command == COMMAND_MOVE_SECDATA) - { - Partition_UnlinkBuffer(src_pnum, bfi); - FilterBuf(dst_fnum, bfi); - } - else - { - int abfi = Buffer_Allocate(false); - - memcpy(Buffers[abfi].Data, bufdata, sizeof(Buffers[abfi].Data)); - - FilterBuf(dst_fnum, abfi); - } - - bfi = next_bfi; - } - CDStatusResults(); - // - // - // TODO: Accurate timing(while not blocking other command execution and sector reading). Note that "move sector data" is much faster than "copy sector data". - CMD_EAT_CLOCKS(300); - if(FreeBufferCount == 0) - TriggerIRQ(HIRQ_BFUL); - TriggerIRQ(HIRQ_ECPY); - } - } - } - // - // - // - else if(CTR.Command == COMMAND_GET_COPYERR) // = 0x67, - { - // TODO: Implement if we ever implement proper asynch copy/moving - BasicResults((MakeBaseStatus() << 8) | 0x00, 0, 0, 0); - } - // - // - // - else if(CTR.Command == COMMAND_CHANGE_DIR) // = 0x70, - { - bool reject; - uint8 fnum; - uint32 fileid; - uint32 fiaoffs; - - fnum = (CTR.CD[2] >> 8); - fileid = ((CTR.CD[2] & 0xFF) << 16) | CTR.CD[3]; - fiaoffs = (fileid < 2) ? fileid : (2 + fileid - FLS.FileInfoOffs); - - reject = false; - - if(fnum >= 0x18) - reject = true; - - if(fileid == 0xFFFFFF) - { - if(!RootDirInfoValid) - reject = true; - } - else - { - if(!FileInfoValid) - reject = true; - else if(fileid >= 2 && (fileid < FLS.FileInfoOffs || fileid >= (FLS.FileInfoOffs + FLS.FileInfoValidCount))) - reject = true; - else if(!(FileInfo[fiaoffs].attr & 0x2)) // FIXME: test XA directory flag too? - reject = true; - } - - if(FLS.Active) - CDStatusResults(false, STATUS_WAIT); - else if(reject) - CDStatusResults(true); - else if(fileid == 0) // NOP, kind of apparently(test after READ_DIR with a largeish file start id)... - { - CDStatusResults(); - CMD_EAT_CLOCKS(400); - TriggerIRQ(HIRQ_EFLS); - } - else - { - CDStatusResults(); - // - // Check (attr & 2) first? and & 0x80 for XA? - // - const FileInfoS* fi; - - if(fileid == 0xFFFFFF) - fi = &RootDirInfo; - else - fi = &FileInfo[fiaoffs]; - - Partition_Clear(fnum); - - SetCDDeviceConn(fnum); - Filter_SetTrueConn(fnum, fnum); - Filter_SetFalseConn(fnum, 0xFF); - Filter_SetRange(fnum, fi->fad(), (fi->size() + 2047) >> 11); // TODO: maybe remove + 2047, actual Saturn drive seems buggy... - Filters[fnum].Mode = FilterS::MODE_SEL_FADR; - Filters[fnum].File = fi->fnum; - - Filters[fnum].Channel = 0; - Filters[fnum].SubMode = 0; - Filters[fnum].SubModeMask = 0; - Filters[fnum].CInfo = 0; - Filters[fnum].CInfoMask = 0; - - FLS.pnum = fnum; - FLS.total_max = fi->size(); - FLS.FileInfoOffs = 2; - FLS.DoAuth = false; - FLS.Active = true; - - ClearPendingSec(); - StartSeek(0x800000 | fi->fad()); - - CurPlayEnd = 0; - CurPlayRepeat = 0; - PlayRepeatCounter = 0; - } - } - // - // - // - else if(CTR.Command == COMMAND_READ_DIR) // = 0x71, - { - uint8 fnum; - uint32 start_fileid; - - fnum = (CTR.CD[2] >> 8); - start_fileid = ((CTR.CD[2] & 0xFF) << 16) | CTR.CD[3]; - - if(FLS.Active) - CDStatusResults(false, STATUS_WAIT); - else if(fnum >= 0x18 || !FileInfoValid) - CDStatusResults(true); - else - { - CDStatusResults(); - // - // Check (attr & 2) first? and & 0x80 for XA? - // - const FileInfoS* fi = &FileInfo[0]; - - if(start_fileid < FLS.FileInfoOffs || start_fileid >= (FLS.FileInfoOffs + FLS.FileInfoValidCount)) - start_fileid = 2; - - SetCDDeviceConn(fnum); - Filter_SetTrueConn(fnum, fnum); - Filter_SetFalseConn(fnum, 0xFF); - Filter_SetRange(fnum, fi->fad(), (fi->size() + 2047) >> 11); - Filters[fnum].Mode = FilterS::MODE_SEL_FADR; - - FLS.pnum = fnum; - FLS.total_max = fi->size(); - FLS.FileInfoOffs = start_fileid; - FLS.DoAuth = false; - FLS.Active = true; - - ClearPendingSec(); - StartSeek(0x800000 | fi->fad()); - - CurPlayEnd = 0; - CurPlayRepeat = 0; - PlayRepeatCounter = 0; - } - } - // - // - // - else if(CTR.Command == COMMAND_GET_FSSCOPE) // = 0x72, - { - if(FLS.Active) // Maybe add a specific check for directory reading? (Will have to if we chain READ_FILE into FLS.Active someday for whatever reason) - CDStatusResults(false, STATUS_WAIT); - else if(!FileInfoValid) - CDStatusResults(true); - else - { - // FIXME: Not sure about the [0].fad == [1].fad root dir thing... Might instead be 0x01 to note that the number of files in the directory - // can be held without using Read Directory? - BasicResults((MakeBaseStatus() << 8), - FLS.FileInfoValidCount, - ((FileInfo[0].fad() == FileInfo[1].fad()) << 8) | (FLS.FileInfoOffs >> 16), - FLS.FileInfoOffs); - } - } - // - // - // - else if(CTR.Command == COMMAND_GET_FINFO) // = 0x73, - { - if(FLS.Active || DT.Active) - CDStatusResults(false, STATUS_WAIT); - else if(!FileInfoValid) - CDStatusResults(true); - else - { - uint32 fileid; - - fileid = ((CTR.CD[2] & 0xFF) << 16) | CTR.CD[3]; - - if(fileid != 0xFFFFFF && (fileid >= 2 && (fileid < FLS.FileInfoOffs || fileid >= (FLS.FileInfoOffs + FLS.FileInfoValidCount)))) - CDStatusResults(true); - else - { - { - const uint32 fiaoffs = (fileid < 2) ? fileid : (2 + fileid - FLS.FileInfoOffs); - - DT.CurBufIndex = 0; - DT.BufCount = 1; - - if(fileid == 0xFFFFFF) - { - DT.InBufOffs = 6 * 2; - DT.InBufCounter = 6 * FLS.FileInfoValidCount; - } - else - { - DT.InBufOffs = 6 * fiaoffs; - DT.InBufCounter = 6; - } - - DT.TotalCounter = 0; - - DT.FIFO_RP = 0; - DT.FIFO_WP = 0; - DT.FIFO_In = 0; - - DT.BufList[0] = 0xF0; - - DT.Writing = false; - DT.NeedBufFree = false; - DT.Active = true; - - BasicResults(MakeBaseStatus(false, STATUS_DTREQ) << 8, DT.InBufCounter, 0, 0); - } - // - // - // - CMD_EAT_CLOCKS(128); - TriggerIRQ(HIRQ_DRDY); - } - } - } - // - // - // - else if(CTR.Command == COMMAND_READ_FILE) // = 0x74, - { - uint32 offset; - uint32 fileid; - uint8 fnum; - - offset = ((CTR.CD[0] & 0xFF) << 16) | CTR.CD[1]; - fileid = ((CTR.CD[2] & 0xFF) << 16) | CTR.CD[3]; - fnum = CTR.CD[2] >> 8; - - if(FLS.Active) - CDStatusResults(false, STATUS_WAIT); - else if(fnum >= 0x18 || !FileInfoValid || (fileid >= 2 && (fileid < FLS.FileInfoOffs || fileid >= (FLS.FileInfoOffs + FLS.FileInfoValidCount)))) - CDStatusResults(true); - else - { - CDStatusResults(); - - Partition_Clear(fnum); - - //printf("DT Meow READ: 0x%08x 0x%08x --- offs=0x%08x\n", FileInfo[fileid].fad(), FileInfo[fileid].size(), offset); - const uint32 fiaoffs = (fileid < 2) ? fileid : (2 + fileid - FLS.FileInfoOffs); - uint32 start_fad = (FileInfo[fiaoffs].fad() + offset) & 0xFFFFFF; - uint32 sec_count = ((FileInfo[fiaoffs].size() + 2047) >> 11) - offset; // FIXME: Check offset versus ifile size. - - ClearPendingSec(); - StartSeek(start_fad | 0x800000); - - PlayEndIRQType = HIRQ_EFLS; - CurPlayEnd = 0x800000 | ((start_fad + sec_count) & 0x7FFFFF); - CurPlayRepeat = 0; - PlayRepeatCounter = 0; - - SetCDDeviceConn(fnum); - Filter_SetTrueConn(fnum, fnum); - Filter_SetFalseConn(fnum, 0xFF); - Filter_SetRange(fnum, start_fad, sec_count); // Not sure if correct for XA interleaved files... - - Filters[fnum].Mode = FilterS::MODE_SEL_FADR | FilterS::MODE_SEL_FILE; - Filters[fnum].File = FileInfo[fiaoffs].fnum; - - Filters[fnum].Channel = 0; - Filters[fnum].SubMode = 0; - Filters[fnum].SubModeMask = 0; - Filters[fnum].CInfo = 0; - Filters[fnum].CInfoMask = 0; - } - } - // - // - // - else if(CTR.Command == COMMAND_ABORT_FILE) // = 0x75, - { - // TODO: Does tray opening during a file operation trigger HIRQ_EFLS? - CDStatusResults(); - - FLS.Abort = true; - } - else - { - SS_DBG(SS_DBG_WARNING | SS_DBG_CDB, "[CDB] Unknown Command: 0x%04x 0x%04x 0x%04x 0x%04x --- HIRQ=0x%04x, HIRQ_Mask=0x%04x\n", CTR.CD[0], CTR.CD[1], CTR.CD[2], CTR.CD[3], HIRQ, HIRQ_Mask); - - ResultsRead = false; - CommandPending = false; - } - continue; - // - // - // - case -1 + CommandPhaseBias: - - CMD_EAT_CLOCKS(4880000); - - StandbyTime = 0; - ECCEnable = 0xFF; - RetryCount = 1; - CommandPending = false; - ResultsRead = true; - - memset(&DT, 0, sizeof(DT)); - - PlayCmdStartPos = 0; // TODO: Test for correct value. - PlayCmdEndPos = 0; // TODO: Test for correct value. - PlayCmdRepCnt = 0; // TODO: ... - - CurPlayRepeat = 0; // TODO: . . . - PlayRepeatCounter = 0; - - DriveCounter = (int64)1000 << 32; - DrivePhase = DRIVEPHASE_EJECTED_WAITING; - - memset(TOC_Buffer, 0xFF, sizeof(TOC_Buffer)); // TODO: confirm 0xFF(or 0x00?) - - AuthDiscType = 0x00; - FileInfoValid = false; - RootDirInfoValid = false; - PeriodicIdleCounter = PeriodicIdleCounter_Reload; - - CurPosInfo.status = STATUS_OPEN; - CurPosInfo.is_cdrom = false; - CurPosInfo.fad = 0xFFFFFF; - CurPosInfo.rel_fad = 0xFFFFFF; - CurPosInfo.ctrl_adr = 0xFF; - CurPosInfo.idx = 0xFF; - CurPosInfo.tno = 0xFF; - - CDDABuf_WP = 0; - CDDABuf_RP = 0; - CDDABuf_Count = 0; - - // - // - RootDirInfoValid = false; - // - // - SWReset(); - - CurPosInfo.status = STATUS_BUSY; // FIXME(so it's set long enough from POV of program) - CurPosInfo.is_cdrom = false; - CurSector = 0; - - Results[0] = 0x0043; - Results[1] = 0x4442; - Results[2] = 0x4c4f; - Results[3] = 0x434b; - ResultsRead = false; - TriggerIRQ(HIRQ_CMOK | HIRQ_DCHG | HIRQ_ESEL | HIRQ_EHST | HIRQ_MPED | HIRQ_ECPY | HIRQ_EFLS); - continue; - } - } - CommandGetOut:; - // - // - // - - //RunFLS(clocks); - } - - - assert(DriveCounter > 0); - - { - int64 net = -CommandClockCounter; - - if(DriveCounter < net) - net = DriveCounter; - - if(PeriodicIdleCounter < net) - net = PeriodicIdleCounter; - - return timestamp + (net + CDB_ClockRatio - 1) / CDB_ClockRatio; - } -} - -void CDB_ResetTS(void) -{ - lastts = 0; -} - - -uint16 CDB_Read(uint32 offset) -{ - uint16 ret = 0; //0xFFFF; - -#if 1 - if(offset >= 0x6 && offset <= 0x9 && CommandPending) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_CDB, "[CDB] Read from register 0x%01x while busy processing command!\n", offset); - } -#endif - - switch(offset) - { - case 0x0: - if(DT.Active && !DT.Writing) - { - if(DT.InBufCounter > 0) - DT_ReadIntoFIFO(); - - if(MDFN_UNLIKELY(!DT.FIFO_In)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_CDB, "[CDB] DT FIFO underflow.\n"); - } - - ret = DT.FIFO[DT.FIFO_RP]; - DT.FIFO_RP = (DT.FIFO_RP + 1) % (sizeof(DT.FIFO) / sizeof(DT.FIFO[0])); - DT.FIFO_In -= (bool)DT.FIFO_In; - } - break; - - case 0x2: // HIRQ - ret = HIRQ; - break; - - case 0x3: // HIRQ mask - ret = HIRQ_Mask; - break; - - case 0x6: ret = Results[0]; /*if(!ResultsRead) printf(" [CDB] Result0 Read: 0x%04x\n", ret);*/ break; - case 0x7: ret = Results[1]; /*if(!ResultsRead) printf(" [CDB] Result1 Read: 0x%04x\n", ret);*/ break; - case 0x8: ret = Results[2]; /*if(!ResultsRead) printf(" [CDB] Result2 Read: 0x%04x\n", ret);*/ break; - case 0x9: ret = Results[3]; /*if(!ResultsRead) printf(" [CDB] Result3 Read: 0x%04x\n", ret);*/ ResultsRead = true; break; - } - - //if(offset == 0) - // fprintf(stderr, "Read: %02x %04x\n", offset, ret); - - return ret; -} - -void CDB_Write_DBM(uint32 offset, uint16 DB, uint16 mask) -{ - sscpu_timestamp_t nt = CDB_Update(SH7095_mem_timestamp); - - //SS_DBG(SS_DBG_WARNING | SS_DBG_CDB, "[CDB] Write %02x %04x %04x\n", offset, DB, mask); - -#if 1 - if(offset >= 0x6 && offset <= 0x9 && CommandPending) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_CDB, "[CDB] Write to register 0x%01x(DB=0x%04x, mask=0x%04x) while busy processing command!\n", offset, DB, mask); - } -#endif - - switch(offset) - { - case 0x0: - if(DT.Active && DT.Writing) - { - if(DT.InBufCounter > 0) - { - DT.FIFO[DT.FIFO_WP] = (DT.FIFO[DT.FIFO_WP] &~ mask) | (DB & mask); - DT.FIFO_WP = (DT.FIFO_WP + 1) % (sizeof(DT.FIFO) / sizeof(DT.FIFO[0])); - DT.FIFO_In++; - - MDFN_en16msb(&Buffers[DT.BufList[DT.CurBufIndex]].Data[DT.InBufOffs << 1], DT.FIFO[DT.FIFO_RP]); - DT.InBufOffs++; - DT.FIFO_RP = (DT.FIFO_RP + 1) % (sizeof(DT.FIFO) / sizeof(DT.FIFO[0])); - DT.FIFO_In--; - - DT.InBufCounter--; - DT.TotalCounter++; - - if(!DT.InBufCounter) - { - DT.CurBufIndex++; - if(DT.CurBufIndex < DT.BufCount) - { - DT_SetIBOffsCount(NULL); - } - } - } - } - break; - - case 0x2: - HIRQ = HIRQ & (DB | ~mask); - RecalcIRQOut(); - break; - - case 0x3: - HIRQ_Mask = (HIRQ_Mask &~ mask) | (DB & mask); - RecalcIRQOut(); - break; - - case 0x6: - CData[0] = (CData[0] &~ mask) | (DB & mask); - break; - - case 0x7: - CData[1] = (CData[1] &~ mask) | (DB & mask); - break; - - case 0x8: - CData[2] = (CData[2] &~ mask) | (DB & mask); - break; - - case 0x9: - CData[3] = (CData[3] &~ mask) | (DB & mask); - if(mask == 0xFFFF) - { - CommandPending = true; - nt = SH7095_mem_timestamp + 1; - } - break; - } - - SS_SetEventNT(&events[SS_EVENT_CDB], nt); -} - - - - -} diff --git a/waterbox/ss/cdb.h b/waterbox/ss/cdb.h deleted file mode 100644 index beb643c3e8..0000000000 --- a/waterbox/ss/cdb.h +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* cdb.h: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_CDB_H -#define __MDFN_SS_CDB_H - -class CDIF; - -namespace MDFN_IEN_SS -{ - -void CDB_Init(void) MDFN_COLD; - -void CDB_SetDisc(bool tray_open, CDIF *cdif) MDFN_COLD; - -void CDB_Write_DBM(uint32 offset, uint16 DB, uint16 mask) MDFN_HOT; -uint16 CDB_Read(uint32 offset) MDFN_HOT; - -void CDB_Reset(bool powering_up) MDFN_COLD; - -sscpu_timestamp_t CDB_Update(sscpu_timestamp_t timestamp); -void CDB_ResetTS(void); - -void CDB_GetCDDA(uint16* outbuf); // writes to outbuf[0] and outbuf[1] - - -void CDB_SetClockRatio(uint32 ratio); -void CDB_ResetCD(void); -void CDB_SetCDActive(bool active); - -} - -#endif diff --git a/waterbox/ss/cdrom/CDUtility.cpp b/waterbox/ss/cdrom/CDUtility.cpp deleted file mode 100644 index 67698749cc..0000000000 --- a/waterbox/ss/cdrom/CDUtility.cpp +++ /dev/null @@ -1,430 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * Subchannel Q CRC Code: Copyright (C) 1998 Andreas Mueller - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "../defs.h" -#include "CDUtility.h" -#include "dvdisaster.h" -#include "lec.h" - -#include - -namespace CDUtility -{ - -// lookup table for crc calculation -static uint16 subq_crctab[256] = -{ - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, 0x8108, - 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, 0x1231, 0x0210, - 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, 0x9339, 0x8318, 0xB37B, - 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, 0x2462, 0x3443, 0x0420, 0x1401, - 0x64E6, 0x74C7, 0x44A4, 0x5485, 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, - 0xF5CF, 0xC5AC, 0xD58D, 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, - 0x5695, 0x46B4, 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, - 0xC7BC, 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, - 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, 0x5AF5, - 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, 0xDBFD, 0xCBDC, - 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, - 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, - 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, - 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, - 0x9F59, 0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, - 0xE16F, 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, - 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, 0x02B1, - 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, 0xB5EA, 0xA5CB, - 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0, - 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, - 0xE75F, 0xF77E, 0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, - 0x7676, 0x4615, 0x5634, 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, - 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, - 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, - 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, - 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, - 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, - 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, 0x6E17, 0x7E36, 0x4E55, 0x5E74, - 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 -}; - - -static uint8 scramble_table[2352 - 12]; - -static bool CDUtility_Inited = false; - -static void InitScrambleTable(void) -{ - unsigned cv = 1; - - for(unsigned i = 12; i < 2352; i++) - { - unsigned char z = 0; - - for(int b = 0; b < 8; b++) - { - z |= (cv & 1) << b; - - int feedback = ((cv >> 1) & 1) ^ (cv & 1); - cv = (cv >> 1) | (feedback << 14); - } - - scramble_table[i - 12] = z; - } - - //for(int i = 0; i < 2352 - 12; i++) - // printf("0x%02x, ", scramble_table[i]); -} - -void CDUtility_Init(void) -{ - if(!CDUtility_Inited) - { - //Init_LEC_Correct(); - - InitScrambleTable(); - - CDUtility_Inited = true; - } -} - -void encode_mode0_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode0_sector(aba, sector_data); -} - -void encode_mode1_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode1_sector(aba, sector_data); -} - -void encode_mode2_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode2_sector(aba, sector_data); -} - -void encode_mode2_form1_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode2_form1_sector(aba, sector_data); -} - -void encode_mode2_form2_sector(uint32 aba, uint8 *sector_data) -{ - CDUtility_Init(); - - lec_encode_mode2_form2_sector(aba, sector_data); -} - -bool edc_check(const uint8 *sector_data, bool xa) -{ - CDUtility_Init(); - - return(CheckEDC(sector_data, xa)); -} - -bool edc_lec_check_and_correct(uint8 *sector_data, bool xa) -{ - CDUtility_Init(); - - return(ValidateRawSector(sector_data, xa)); -} - - -bool subq_check_checksum(const uint8 *SubQBuf) -{ - uint16 crc = 0; - uint16 stored_crc = 0; - - stored_crc = SubQBuf[0xA] << 8; - stored_crc |= SubQBuf[0xB]; - - for(int i = 0; i < 0xA; i++) - crc = subq_crctab[(crc >> 8) ^ SubQBuf[i]] ^ (crc << 8); - - crc = ~crc; - - return(crc == stored_crc); -} - -void subq_generate_checksum(uint8 *buf) -{ - uint16 crc = 0; - - for(int i = 0; i < 0xA; i++) - crc = subq_crctab[(crc >> 8) ^ buf[i]] ^ (crc << 8); - - // Checksum - buf[0xa] = ~(crc >> 8); - buf[0xb] = ~(crc); -} - -void subq_deinterleave(const uint8 *SubPWBuf, uint8 *qbuf) -{ - memset(qbuf, 0, 0xC); - - for(int i = 0; i < 96; i++) - { - qbuf[i >> 3] |= ((SubPWBuf[i] >> 6) & 0x1) << (7 - (i & 0x7)); - } -} - - -// Deinterleaves 96 bytes of subchannel P-W data from 96 bytes of interleaved subchannel PW data. -void subpw_deinterleave(const uint8 *in_buf, uint8 *out_buf) -{ - assert(in_buf != out_buf); - - memset(out_buf, 0, 96); - - for(unsigned ch = 0; ch < 8; ch++) - { - for(unsigned i = 0; i < 96; i++) - { - out_buf[(ch * 12) + (i >> 3)] |= ((in_buf[i] >> (7 - ch)) & 0x1) << (7 - (i & 0x7)); - } - } - -} - -// Interleaves 96 bytes of subchannel P-W data from 96 bytes of uninterleaved subchannel PW data. -void subpw_interleave(const uint8 *in_buf, uint8 *out_buf) -{ - assert(in_buf != out_buf); - - for(unsigned d = 0; d < 12; d++) - { - for(unsigned bitpoodle = 0; bitpoodle < 8; bitpoodle++) - { - uint8 rawb = 0; - - for(unsigned ch = 0; ch < 8; ch++) - { - rawb |= ((in_buf[ch * 12 + d] >> (7 - bitpoodle)) & 1) << (7 - ch); - } - out_buf[(d << 3) + bitpoodle] = rawb; - } - } -} - -// NOTES ON LEADOUT AREA SYNTHESIS -// -// I'm not trusting that the "control" field for the TOC leadout entry will always be set properly, so | the control fields for the last track entry -// and the leadout entry together before extracting the D2 bit. Audio track->data leadout is fairly benign though maybe noisy(especially if we ever implement -// data scrambling properly), but data track->audio leadout could break things in an insidious manner for the more accurate drive emulation code). -// -void subpw_synth_leadout_lba(const TOC& toc, const int32 lba, uint8* SubPWBuf) -{ - uint8 buf[0xC]; - uint32 lba_relative; - uint32 ma, sa, fa; - uint32 m, s, f; - - lba_relative = lba - toc.tracks[100].lba; - - f = (lba_relative % 75); - s = ((lba_relative / 75) % 60); - m = (lba_relative / 75 / 60); - - fa = (lba + 150) % 75; - sa = ((lba + 150) / 75) % 60; - ma = ((lba + 150) / 75 / 60); - - uint8 adr = 0x1; // Q channel data encodes position - uint8 control = toc.tracks[100].control; - - if(toc.tracks[toc.last_track].valid) - control |= toc.tracks[toc.last_track].control & 0x4; - else if(toc.disc_type == DISC_TYPE_CD_I) - control |= 0x4; - - memset(buf, 0, 0xC); - buf[0] = (adr << 0) | (control << 4); - buf[1] = 0xAA; - buf[2] = 0x01; - - // Track relative MSF address - buf[3] = U8_to_BCD(m); - buf[4] = U8_to_BCD(s); - buf[5] = U8_to_BCD(f); - - buf[6] = 0; // Zerroooo - - // Absolute MSF address - buf[7] = U8_to_BCD(ma); - buf[8] = U8_to_BCD(sa); - buf[9] = U8_to_BCD(fa); - - subq_generate_checksum(buf); - - for(int i = 0; i < 96; i++) - SubPWBuf[i] = (((buf[i >> 3] >> (7 - (i & 0x7))) & 1) ? 0x40 : 0x00) | 0x80; -} - -void synth_leadout_sector_lba(uint8 mode, const TOC& toc, const int32 lba, uint8* out_buf) -{ - memset(out_buf, 0, 2352 + 96); - subpw_synth_leadout_lba(toc, lba, out_buf + 2352); - - if(out_buf[2352 + 1] & 0x40) - { - if(mode == 0xFF) - { - if(toc.disc_type == DISC_TYPE_CD_XA || toc.disc_type == DISC_TYPE_CD_I) - mode = 0x02; - else - mode = 0x01; - } - - switch(mode) - { - default: - encode_mode0_sector(LBA_to_ABA(lba), out_buf); - break; - - case 0x01: - encode_mode1_sector(LBA_to_ABA(lba), out_buf); - break; - - case 0x02: - out_buf[12 + 6] = 0x20; - out_buf[12 + 10] = 0x20; - encode_mode2_form2_sector(LBA_to_ABA(lba), out_buf); - break; - } - } -} - -// ISO/IEC 10149:1995 (E): 20.2 -// -void subpw_synth_udapp_lba(const TOC& toc, const int32 lba, const int32 lba_subq_relative_offs, uint8* SubPWBuf) -{ - uint8 buf[0xC]; - uint32 lba_relative; - uint32 ma, sa, fa; - uint32 m, s, f; - - if(lba < -150 || lba >= 0) - printf("[BUG] subpw_synth_udapp_lba() lba out of range --- %d\n", lba); - - { - int32 lba_tmp = lba + lba_subq_relative_offs; - - if(lba_tmp < 0) - lba_relative = 0 - 1 - lba_tmp; - else - lba_relative = lba_tmp - 0; - } - - f = (lba_relative % 75); - s = ((lba_relative / 75) % 60); - m = (lba_relative / 75 / 60); - - fa = (lba + 150) % 75; - sa = ((lba + 150) / 75) % 60; - ma = ((lba + 150) / 75 / 60); - - uint8 adr = 0x1; // Q channel data encodes position - uint8 control; - - if(toc.disc_type == DISC_TYPE_CD_I && toc.first_track > 1) - control = 0x4; - else if(toc.tracks[toc.first_track].valid) - control = toc.tracks[toc.first_track].control; - else - control = 0x0; - - memset(buf, 0, 0xC); - buf[0] = (adr << 0) | (control << 4); - buf[1] = U8_to_BCD(toc.first_track); - buf[2] = U8_to_BCD(0x00); - - // Track relative MSF address - buf[3] = U8_to_BCD(m); - buf[4] = U8_to_BCD(s); - buf[5] = U8_to_BCD(f); - - buf[6] = 0; // Zerroooo - - // Absolute MSF address - buf[7] = U8_to_BCD(ma); - buf[8] = U8_to_BCD(sa); - buf[9] = U8_to_BCD(fa); - - subq_generate_checksum(buf); - - for(int i = 0; i < 96; i++) - SubPWBuf[i] = (((buf[i >> 3] >> (7 - (i & 0x7))) & 1) ? 0x40 : 0x00) | 0x80; -} - -void synth_udapp_sector_lba(uint8 mode, const TOC& toc, const int32 lba, int32 lba_subq_relative_offs, uint8* out_buf) -{ - memset(out_buf, 0, 2352 + 96); - subpw_synth_udapp_lba(toc, lba, lba_subq_relative_offs, out_buf + 2352); - - if(out_buf[2352 + 1] & 0x40) - { - if(mode == 0xFF) - { - if(toc.disc_type == DISC_TYPE_CD_XA || toc.disc_type == DISC_TYPE_CD_I) - mode = 0x02; - else - mode = 0x01; - } - - switch(mode) - { - default: - encode_mode0_sector(LBA_to_ABA(lba), out_buf); - break; - - case 0x01: - encode_mode1_sector(LBA_to_ABA(lba), out_buf); - break; - - case 0x02: - out_buf[12 + 6] = 0x20; - out_buf[12 + 10] = 0x20; - encode_mode2_form2_sector(LBA_to_ABA(lba), out_buf); - break; - } - } -} - -#if 0 -bool subq_extrapolate(const uint8 *subq_input, int32 position_delta, uint8 *subq_output) -{ - assert(subq_check_checksum(subq_input)); - - - subq_generate_checksum(subq_output); -} -#endif - -void scrambleize_data_sector(uint8 *sector_data) -{ - for(unsigned i = 12; i < 2352; i++) - sector_data[i] ^= scramble_table[i - 12]; -} - -} diff --git a/waterbox/ss/cdrom/CDUtility.h b/waterbox/ss/cdrom/CDUtility.h deleted file mode 100644 index 6539dc622d..0000000000 --- a/waterbox/ss/cdrom/CDUtility.h +++ /dev/null @@ -1,237 +0,0 @@ -#ifndef __MDFN_CDROM_CDUTILITY_H -#define __MDFN_CDROM_CDUTILITY_H - -namespace CDUtility -{ - // Call once at app startup before creating any threads that could potentially cause re-entrancy to these functions. - // It will also be called automatically if needed for the first time a function in this namespace that requires - // the initialization function to be called is called, for potential - // usage in constructors of statically-declared objects. - void CDUtility_Init(void) MDFN_COLD; - - // Quick definitions here: - // - // ABA - Absolute block address, synonymous to absolute MSF - // aba = (m_a * 60 * 75) + (s_a * 75) + f_a - // - // LBA - Logical block address(related: data CDs are required to have a pregap of 2 seconds, IE 150 frames/sectors) - // lba = aba - 150 - - - enum - { - ADR_NOQINFO = 0x00, - ADR_CURPOS = 0x01, - ADR_MCN = 0x02, - ADR_ISRC = 0x03 - }; - - - struct TOC_Track - { - uint8 adr; - uint8 control; - uint32 lba; - bool valid; // valid/present; oh CD-i... - }; - - // SubQ control field flags. - enum - { - SUBQ_CTRLF_PRE = 0x01, // With 50/15us pre-emphasis. - SUBQ_CTRLF_DCP = 0x02, // Digital copy permitted. - SUBQ_CTRLF_DATA = 0x04, // Data track. - SUBQ_CTRLF_4CH = 0x08, // 4-channel CD-DA. - }; - - enum - { - DISC_TYPE_CDDA_OR_M1 = 0x00, - DISC_TYPE_CD_I = 0x10, - DISC_TYPE_CD_XA = 0x20 - }; - - struct TOC - { - INLINE TOC() - { - Clear(); - } - - INLINE void Clear(void) - { - first_track = last_track = 0; - disc_type = 0; - - memset(tracks, 0, sizeof(tracks)); // FIXME if we change TOC_Track to non-POD type. - } - - INLINE int FindTrackByLBA(uint32 LBA) const - { - int32 lvt = 0; - - for(int32 track = 1; track <= 100; track++) - { - if(!tracks[track].valid) - continue; - - if(LBA < tracks[track].lba) - break; - - lvt = track; - } - - return(lvt); - } - - uint8 first_track; - uint8 last_track; - uint8 disc_type; - TOC_Track tracks[100 + 1]; // [0] is unused, [100] is for the leadout track. - }; - - // - // Address conversion functions. - // - static INLINE uint32 AMSF_to_ABA(int32 m_a, int32 s_a, int32 f_a) - { - return(f_a + 75 * s_a + 75 * 60 * m_a); - } - - static INLINE void ABA_to_AMSF(uint32 aba, uint8 *m_a, uint8 *s_a, uint8 *f_a) - { - *m_a = aba / 75 / 60; - *s_a = (aba - *m_a * 75 * 60) / 75; - *f_a = aba - (*m_a * 75 * 60) - (*s_a * 75); - } - - static INLINE int32 ABA_to_LBA(uint32 aba) - { - return(aba - 150); - } - - static INLINE uint32 LBA_to_ABA(int32 lba) - { - return(lba + 150); - } - - static INLINE int32 AMSF_to_LBA(uint8 m_a, uint8 s_a, uint8 f_a) - { - return(ABA_to_LBA(AMSF_to_ABA(m_a, s_a, f_a))); - } - - static INLINE void LBA_to_AMSF(int32 lba, uint8 *m_a, uint8 *s_a, uint8 *f_a) - { - ABA_to_AMSF(LBA_to_ABA(lba), m_a, s_a, f_a); - } - - // - // BCD conversion functions - // - static INLINE bool BCD_is_valid(uint8 bcd_number) - { - if((bcd_number & 0xF0) >= 0xA0) - return(false); - - if((bcd_number & 0x0F) >= 0x0A) - return(false); - - return(true); - } - - static INLINE uint8 BCD_to_U8(uint8 bcd_number) - { - return( ((bcd_number >> 4) * 10) + (bcd_number & 0x0F) ); - } - - static INLINE uint8 U8_to_BCD(uint8 num) - { - return( ((num / 10) << 4) + (num % 10) ); - } - - // should always perform the conversion, even if the bcd number is invalid. - static INLINE bool BCD_to_U8_check(uint8 bcd_number, uint8 *out_number) - { - *out_number = BCD_to_U8(bcd_number); - - if(!BCD_is_valid(bcd_number)) - return(false); - - return(true); - } - - // - // Sector data encoding functions(to full 2352 bytes raw sector). - // - // sector_data must be able to contain at least 2352 bytes. - void encode_mode0_sector(uint32 aba, uint8 *sector_data); - void encode_mode1_sector(uint32 aba, uint8 *sector_data); // 2048 bytes of user data at offset 16 - void encode_mode2_sector(uint32 aba, uint8 *sector_data); // 2336 bytes of user data at offset 16 - void encode_mode2_form1_sector(uint32 aba, uint8 *sector_data); // 2048+8 bytes of user data at offset 16 - void encode_mode2_form2_sector(uint32 aba, uint8 *sector_data); // 2324+8 bytes of user data at offset 16 - - - // User data area pre-pause(MSF 00:00:00 through 00:01:74), lba -150 through -1 - // out_buf must be able to contain 2352+96 bytes. - // "mode" is not used if the area is to be encoded as audio. - // pass 0xFF for "mode" for "don't know", and to make guess based on the TOC. - void synth_udapp_sector_lba(uint8 mode, const TOC& toc, const int32 lba, int32 lba_subq_relative_offs, uint8* out_buf); - void subpw_synth_udapp_lba(const TOC& toc, const int32 lba, const int32 lba_subq_relative_offs, uint8* SubPWBuf); - - // out_buf must be able to contain 2352+96 bytes. - // "mode" is not used if the area is to be encoded as audio. - // pass 0xFF for "mode" for "don't know", and to make guess based on the TOC. - void synth_leadout_sector_lba(uint8 mode, const TOC& toc, const int32 lba, uint8* out_buf); - void subpw_synth_leadout_lba(const TOC& toc, const int32 lba, uint8* SubPWBuf); - - - // - // User data error detection and correction - // - - // Check EDC of a mode 1 or mode 2 form 1 sector. - // Returns "true" if checksum is ok(matches). - // Returns "false" if checksum mismatch. - // sector_data should contain 2352 bytes of raw sector data. - bool edc_check(const uint8 *sector_data, bool xa); - - // Check EDC and L-EC data of a mode 1 or mode 2 form 1 sector, and correct bit errors if any exist. - // Returns "true" if errors weren't detected, or they were corrected succesfully. - // Returns "false" if errors couldn't be corrected. - // sector_data should contain 2352 bytes of raw sector data. - // - // Note: mode 2 form 1 L-EC data can't correct errors in the 4-byte sector header(address + mode), - // but the error(s) will still be detected by EDC. - bool edc_lec_check_and_correct(uint8 *sector_data, bool xa); - - // - // Subchannel(Q in particular) functions - // - - // Returns false on checksum mismatch, true on match. - bool subq_check_checksum(const uint8 *subq_buf); - - // Calculates the checksum of Q subchannel data(not including the checksum bytes of course ;)) from subq_buf, and stores it into the appropriate position - // in subq_buf. - void subq_generate_checksum(uint8 *subq_buf); - - // Deinterleaves 12 bytes of subchannel Q data from 96 bytes of interleaved subchannel PW data. - void subq_deinterleave(const uint8 *subpw_buf, uint8 *subq_buf); - - // Deinterleaves 96 bytes of subchannel P-W data from 96 bytes of interleaved subchannel PW data. - void subpw_deinterleave(const uint8 *in_buf, uint8 *out_buf); - - // Interleaves 96 bytes of subchannel P-W data from 96 bytes of uninterleaved subchannel PW data. - void subpw_interleave(const uint8 *in_buf, uint8 *out_buf); - - // Extrapolates Q subchannel current position data from subq_input, with frame/sector delta position_delta, and writes to subq_output. - // Only valid for ADR_CURPOS. - // subq_input must pass subq_check_checksum(). - // TODO - //void subq_extrapolate(const uint8 *subq_input, int32 position_delta, uint8 *subq_output); - - // (De)Scrambles data sector. - void scrambleize_data_sector(uint8 *sector_data); -} - -#endif diff --git a/waterbox/ss/cdrom/cdromif.cpp b/waterbox/ss/cdrom/cdromif.cpp deleted file mode 100644 index f93ed6fd55..0000000000 --- a/waterbox/ss/cdrom/cdromif.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "../ss.h" -#include -#include -#include "cdromif.h" -//#include "CDAccess.h" -//#include "../general.h" - -#include - -using namespace CDUtility; - -enum -{ - // Status/Error messages - CDIF_MSG_DONE = 0, // Read -> emu. args: No args. - CDIF_MSG_INFO, // Read -> emu. args: str_message - CDIF_MSG_FATAL_ERROR, // Read -> emu. args: *TODO ARGS* - - // - // Command messages. - // - CDIF_MSG_DIEDIEDIE, // Emu -> read - - CDIF_MSG_READ_SECTOR, /* Emu -> read - args[0] = lba - */ -}; - - -typedef struct -{ - bool valid; - bool error; - int32 lba; - uint8 data[2352 + 96]; -} CDIF_Sector_Buffer; - - -CDIF::CDIF() : UnrecoverableError(false) -{ - -} - -CDIF::~CDIF() -{ - -} - -bool CDIF::ValidateRawSector(uint8 *buf) -{ - int mode = buf[12 + 3]; - - if(mode != 0x1 && mode != 0x2) - return(false); - - if(!edc_lec_check_and_correct(buf, mode == 2)) - return(false); - - return(true); -} - -int CDIF::ReadSector(uint8* buf, int32 lba, uint32 sector_count, bool suppress_uncorrectable_message) -{ - int ret = 0; - - if(UnrecoverableError) - return(false); - - while(sector_count--) - { - uint8 tmpbuf[2352 + 96]; - - if(!ReadRawSector(tmpbuf, lba)) - { - puts("CDIF Raw Read error"); - return(FALSE); - } - - if(!ValidateRawSector(tmpbuf)) - { - /*if(!suppress_uncorrectable_message) - { - MDFN_DispMessage(_("Uncorrectable data at sector %d"), lba); - MDFN_PrintError(_("Uncorrectable data at sector %d"), lba); - }*/ - - return(false); - } - - const int mode = tmpbuf[12 + 3]; - - if(!ret) - ret = mode; - - if(mode == 1) - { - memcpy(buf, &tmpbuf[12 + 4], 2048); - } - else if(mode == 2) - { - memcpy(buf, &tmpbuf[12 + 4 + 8], 2048); - } - else - { - printf("CDIF_ReadSector() invalid sector type at LBA=%u\n", (unsigned int)lba); - return(false); - } - - buf += 2048; - lba++; - } - - return(ret); -} diff --git a/waterbox/ss/cdrom/cdromif.h b/waterbox/ss/cdrom/cdromif.h deleted file mode 100644 index 51125e8409..0000000000 --- a/waterbox/ss/cdrom/cdromif.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Mednafen - Multi-system Emulator - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef __MDFN_CDROM_CDROMIF_H -#define __MDFN_CDROM_CDROMIF_H - -#include "CDUtility.h" - -#include - -typedef CDUtility::TOC CD_TOC; - -class CDIF -{ - public: - - CDIF(); - virtual ~CDIF(); - - static const int32 LBA_Read_Minimum = -150; - static const int32 LBA_Read_Maximum = 449849; // 100 * 75 * 60 - 150 - 1 - - inline void ReadTOC(CDUtility::TOC *read_target) - { - *read_target = disc_toc; - } - - virtual void HintReadSector(int32 lba) = 0; - virtual bool ReadRawSector(uint8 *buf, int32 lba) = 0; // Reads 2352+96 bytes of data into buf. - virtual bool ReadRawSectorPWOnly(uint8* pwbuf, int32 lba, bool hint_fullread) = 0; // Reads 96 bytes(of raw subchannel PW data) into pwbuf. - - // Call for mode 1 or mode 2 form 1 only. - bool ValidateRawSector(uint8 *buf); - - // Utility/Wrapped functions - // Reads mode 1 and mode2 form 1 sectors(2048 bytes per sector returned) - // Will return the type(1, 2) of the first sector read to the buffer supplied, 0 on error - int ReadSector(uint8* buf, int32 lba, uint32 sector_count, bool suppress_uncorrectable_message = false); - - protected: - bool UnrecoverableError; - CDUtility::TOC disc_toc; -}; - -#endif diff --git a/waterbox/ss/cdrom/crc32.cpp b/waterbox/ss/cdrom/crc32.cpp deleted file mode 100644 index 2aa4ee14a3..0000000000 --- a/waterbox/ss/cdrom/crc32.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * CRC32 code based upon public domain code by Ross Williams (see notes below) - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#include "dvdisaster.h" - -/*** - *** EDC checksum used in CDROM sectors - ***/ - -/*****************************************************************/ -/* */ -/* CRC LOOKUP TABLE */ -/* ================ */ -/* The following CRC lookup table was generated automagically */ -/* by the Rocksoft^tm Model CRC Algorithm Table Generation */ -/* Program V1.0 using the following model parameters: */ -/* */ -/* Width : 4 bytes. */ -/* Poly : 0x8001801BL */ -/* Reverse : TRUE. */ -/* */ -/* For more information on the Rocksoft^tm Model CRC Algorithm, */ -/* see the document titled "A Painless Guide to CRC Error */ -/* Detection Algorithms" by Ross Williams */ -/* (ross@guest.adelaide.edu.au.). This document is likely to be */ -/* in the FTP archive "ftp.adelaide.edu.au/pub/rocksoft". */ -/* */ -/*****************************************************************/ - -static const unsigned long edctable[256] = -{ - 0x00000000L, 0x90910101L, 0x91210201L, 0x01B00300L, - 0x92410401L, 0x02D00500L, 0x03600600L, 0x93F10701L, - 0x94810801L, 0x04100900L, 0x05A00A00L, 0x95310B01L, - 0x06C00C00L, 0x96510D01L, 0x97E10E01L, 0x07700F00L, - 0x99011001L, 0x09901100L, 0x08201200L, 0x98B11301L, - 0x0B401400L, 0x9BD11501L, 0x9A611601L, 0x0AF01700L, - 0x0D801800L, 0x9D111901L, 0x9CA11A01L, 0x0C301B00L, - 0x9FC11C01L, 0x0F501D00L, 0x0EE01E00L, 0x9E711F01L, - 0x82012001L, 0x12902100L, 0x13202200L, 0x83B12301L, - 0x10402400L, 0x80D12501L, 0x81612601L, 0x11F02700L, - 0x16802800L, 0x86112901L, 0x87A12A01L, 0x17302B00L, - 0x84C12C01L, 0x14502D00L, 0x15E02E00L, 0x85712F01L, - 0x1B003000L, 0x8B913101L, 0x8A213201L, 0x1AB03300L, - 0x89413401L, 0x19D03500L, 0x18603600L, 0x88F13701L, - 0x8F813801L, 0x1F103900L, 0x1EA03A00L, 0x8E313B01L, - 0x1DC03C00L, 0x8D513D01L, 0x8CE13E01L, 0x1C703F00L, - 0xB4014001L, 0x24904100L, 0x25204200L, 0xB5B14301L, - 0x26404400L, 0xB6D14501L, 0xB7614601L, 0x27F04700L, - 0x20804800L, 0xB0114901L, 0xB1A14A01L, 0x21304B00L, - 0xB2C14C01L, 0x22504D00L, 0x23E04E00L, 0xB3714F01L, - 0x2D005000L, 0xBD915101L, 0xBC215201L, 0x2CB05300L, - 0xBF415401L, 0x2FD05500L, 0x2E605600L, 0xBEF15701L, - 0xB9815801L, 0x29105900L, 0x28A05A00L, 0xB8315B01L, - 0x2BC05C00L, 0xBB515D01L, 0xBAE15E01L, 0x2A705F00L, - 0x36006000L, 0xA6916101L, 0xA7216201L, 0x37B06300L, - 0xA4416401L, 0x34D06500L, 0x35606600L, 0xA5F16701L, - 0xA2816801L, 0x32106900L, 0x33A06A00L, 0xA3316B01L, - 0x30C06C00L, 0xA0516D01L, 0xA1E16E01L, 0x31706F00L, - 0xAF017001L, 0x3F907100L, 0x3E207200L, 0xAEB17301L, - 0x3D407400L, 0xADD17501L, 0xAC617601L, 0x3CF07700L, - 0x3B807800L, 0xAB117901L, 0xAAA17A01L, 0x3A307B00L, - 0xA9C17C01L, 0x39507D00L, 0x38E07E00L, 0xA8717F01L, - 0xD8018001L, 0x48908100L, 0x49208200L, 0xD9B18301L, - 0x4A408400L, 0xDAD18501L, 0xDB618601L, 0x4BF08700L, - 0x4C808800L, 0xDC118901L, 0xDDA18A01L, 0x4D308B00L, - 0xDEC18C01L, 0x4E508D00L, 0x4FE08E00L, 0xDF718F01L, - 0x41009000L, 0xD1919101L, 0xD0219201L, 0x40B09300L, - 0xD3419401L, 0x43D09500L, 0x42609600L, 0xD2F19701L, - 0xD5819801L, 0x45109900L, 0x44A09A00L, 0xD4319B01L, - 0x47C09C00L, 0xD7519D01L, 0xD6E19E01L, 0x46709F00L, - 0x5A00A000L, 0xCA91A101L, 0xCB21A201L, 0x5BB0A300L, - 0xC841A401L, 0x58D0A500L, 0x5960A600L, 0xC9F1A701L, - 0xCE81A801L, 0x5E10A900L, 0x5FA0AA00L, 0xCF31AB01L, - 0x5CC0AC00L, 0xCC51AD01L, 0xCDE1AE01L, 0x5D70AF00L, - 0xC301B001L, 0x5390B100L, 0x5220B200L, 0xC2B1B301L, - 0x5140B400L, 0xC1D1B501L, 0xC061B601L, 0x50F0B700L, - 0x5780B800L, 0xC711B901L, 0xC6A1BA01L, 0x5630BB00L, - 0xC5C1BC01L, 0x5550BD00L, 0x54E0BE00L, 0xC471BF01L, - 0x6C00C000L, 0xFC91C101L, 0xFD21C201L, 0x6DB0C300L, - 0xFE41C401L, 0x6ED0C500L, 0x6F60C600L, 0xFFF1C701L, - 0xF881C801L, 0x6810C900L, 0x69A0CA00L, 0xF931CB01L, - 0x6AC0CC00L, 0xFA51CD01L, 0xFBE1CE01L, 0x6B70CF00L, - 0xF501D001L, 0x6590D100L, 0x6420D200L, 0xF4B1D301L, - 0x6740D400L, 0xF7D1D501L, 0xF661D601L, 0x66F0D700L, - 0x6180D800L, 0xF111D901L, 0xF0A1DA01L, 0x6030DB00L, - 0xF3C1DC01L, 0x6350DD00L, 0x62E0DE00L, 0xF271DF01L, - 0xEE01E001L, 0x7E90E100L, 0x7F20E200L, 0xEFB1E301L, - 0x7C40E400L, 0xECD1E501L, 0xED61E601L, 0x7DF0E700L, - 0x7A80E800L, 0xEA11E901L, 0xEBA1EA01L, 0x7B30EB00L, - 0xE8C1EC01L, 0x7850ED00L, 0x79E0EE00L, 0xE971EF01L, - 0x7700F000L, 0xE791F101L, 0xE621F201L, 0x76B0F300L, - 0xE541F401L, 0x75D0F500L, 0x7460F600L, 0xE4F1F701L, - 0xE381F801L, 0x7310F900L, 0x72A0FA00L, 0xE231FB01L, - 0x71C0FC00L, 0xE151FD01L, 0xE0E1FE01L, 0x7070FF00L -}; - -/* - * CDROM EDC calculation - */ - -uint32 EDCCrc32(const unsigned char *data, int len) -{ - uint32 crc = 0; - - while(len--) - crc = edctable[(crc ^ *data++) & 0xFF] ^ (crc >> 8); - - return crc; -} diff --git a/waterbox/ss/cdrom/dvdisaster.h b/waterbox/ss/cdrom/dvdisaster.h deleted file mode 100644 index e721327c64..0000000000 --- a/waterbox/ss/cdrom/dvdisaster.h +++ /dev/null @@ -1,171 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#ifndef DVDISASTER_H -#define DVDISASTER_H - -/* "Dare to be gorgeous and unique. - * But don't ever be cryptic or otherwise unfathomable. - * Make it unforgettably great." - * - * From "A Final Note on Style", - * Amiga Intuition Reference Manual, 1986, p. 231 - */ - -/*** - *** I'm too lazy to mess with #include dependencies. - *** Everything #includeable is rolled up herein... - */ - -#include "../ss.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/*** - *** dvdisaster.c - ***/ - -void PrepareDeadSector(void); - -void CreateEcc(void); -void FixEcc(void); -void Verify(void); - -uint32 EDCCrc32(const unsigned char*, int); - -/*** - *** galois.c - *** - * This is currently the hardcoded GF(2**8). - * int32 gives abundant space for the GF. - * Squeezing it down to uint8 won't probably gain much, - * so we implement this defensively here. - * - * Note that some performance critical stuff needs to - * be #included from galois-inlines.h - */ - -/* Galois field parameters for 8bit symbol Reed-Solomon code */ - -#define GF_SYMBOLSIZE 8 -#define GF_FIELDSIZE (1<= GF_FIELDMAX) - { - x -= GF_FIELDMAX; - x = (x >> GF_SYMBOLSIZE) + (x & GF_FIELDMAX); - } - - return x; -} diff --git a/waterbox/ss/cdrom/galois.cpp b/waterbox/ss/cdrom/galois.cpp deleted file mode 100644 index 2792cfc341..0000000000 --- a/waterbox/ss/cdrom/galois.cpp +++ /dev/null @@ -1,156 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * The Reed-Solomon error correction draws a lot of inspiration - and even code - - * from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#include "dvdisaster.h" - -#include "galois-inlines.h" - -/*** - *** Galois field arithmetic. - *** - * Calculations are done over the extension field GF(2**n). - * Be careful not to overgeneralize these arithmetics; - * they only work for the case of GF(p**n) with p being prime. - */ - -/* Initialize the Galois field tables */ - - -GaloisTables* CreateGaloisTables(int32 gf_generator) -{ - GaloisTables *gt = (GaloisTables *)calloc(1, sizeof(GaloisTables)); - int32 b,log; - - /* Allocate the tables. - The encoder uses a special version of alpha_to which has the mod_fieldmax() - folded into the table. */ - - gt->gfGenerator = gf_generator; - - gt->indexOf = (int32 *)calloc(GF_FIELDSIZE, sizeof(int32)); - gt->alphaTo = (int32 *)calloc(GF_FIELDSIZE, sizeof(int32)); - gt->encAlphaTo = (int32 *)calloc(2*GF_FIELDSIZE, sizeof(int32)); - - /* create the log/ilog values */ - - for(b=1, log=0; logindexOf[b] = log; - gt->alphaTo[log] = b; - b = b << 1; - if(b & GF_FIELDSIZE) - b = b ^ gf_generator; - } - - if(b!=1) - { - printf("Failed to create the Galois field log tables!\n"); - exit(1); - } - - /* we're even closed using infinity (makes things easier) */ - - gt->indexOf[0] = GF_ALPHA0; /* log(0) = inf */ - gt->alphaTo[GF_ALPHA0] = 0; /* and the other way around */ - - for(b=0; b<2*GF_FIELDSIZE; b++) - gt->encAlphaTo[b] = gt->alphaTo[mod_fieldmax(b)]; - - return gt; -} - -void FreeGaloisTables(GaloisTables *gt) -{ - if(gt->indexOf) free(gt->indexOf); - if(gt->alphaTo) free(gt->alphaTo); - if(gt->encAlphaTo) free(gt->encAlphaTo); - - free(gt); -} - -/*** - *** Create the the Reed-Solomon generator polynomial - *** and some auxiliary data structures. - */ - -ReedSolomonTables *CreateReedSolomonTables(GaloisTables *gt, - int32 first_consecutive_root, - int32 prim_elem, - int nroots_in) -{ ReedSolomonTables *rt = (ReedSolomonTables *)calloc(1, sizeof(ReedSolomonTables)); - int32 i,j,root; - - rt->gfTables = gt; - rt->fcr = first_consecutive_root; - rt->primElem = prim_elem; - rt->nroots = nroots_in; - rt->ndata = GF_FIELDMAX - rt->nroots; - - rt->gpoly = (int32 *)calloc((rt->nroots+1), sizeof(int32)); - - /* Create the RS code generator polynomial */ - - rt->gpoly[0] = 1; - - for(i=0, root=first_consecutive_root*prim_elem; inroots; i++, root+=prim_elem) - { rt->gpoly[i+1] = 1; - - /* Multiply gpoly by alpha**(root+x) */ - - for(j=i; j>0; j--) - { - if(rt->gpoly[j] != 0) - rt->gpoly[j] = rt->gpoly[j-1] ^ gt->alphaTo[mod_fieldmax(gt->indexOf[rt->gpoly[j]] + root)]; - else - rt->gpoly[j] = rt->gpoly[j-1]; - } - - rt->gpoly[0] = gt->alphaTo[mod_fieldmax(gt->indexOf[rt->gpoly[0]] + root)]; - } - - /* Store the polynomials index for faster encoding */ - - for(i=0; i<=rt->nroots; i++) - rt->gpoly[i] = gt->indexOf[rt->gpoly[i]]; - -#if 0 - /* for the precalculated unrolled loops only */ - - for(i=gt->nroots-1; i>0; i--) - PrintCLI( - " par_idx[((++spk)&%d)] ^= enc_alpha_to[feedback + %3d];\n", - nroots-1,gt->gpoly[i]); - - PrintCLI(" par_idx[sp] = enc_alpha_to[feedback + %3d];\n", - gt->gpoly[0]); -#endif - - return rt; -} - -void FreeReedSolomonTables(ReedSolomonTables *rt) -{ - if(rt->gpoly) free(rt->gpoly); - - free(rt); -} diff --git a/waterbox/ss/cdrom/l-ec.cpp b/waterbox/ss/cdrom/l-ec.cpp deleted file mode 100644 index 5c035ce4ab..0000000000 --- a/waterbox/ss/cdrom/l-ec.cpp +++ /dev/null @@ -1,478 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * The Reed-Solomon error correction draws a lot of inspiration - and even code - - * from Phil Karn's excellent Reed-Solomon library: http://www.ka9q.net/code/fec/ - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#include "dvdisaster.h" - -#include "galois-inlines.h" - -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -/*** - *** Mapping between cd frame and parity vectors - ***/ - -/* - * Mapping of frame bytes to P/Q Vectors - */ - -int PToByteIndex(int p, int i) -{ return 12 + p + i*86; -} - -void ByteIndexToP(int b, int *p, int *i) -{ *p = (b-12)%86; - *i = (b-12)/86; -} - -int QToByteIndex(int q, int i) -{ int offset = 12 + (q & 1); - - if(i == 43) return 2248+q; - if(i == 44) return 2300+q; - - q&=~1; - return offset + (q*43 + i*88) % 2236; -} - -void ByteIndexToQ(int b, int *q, int *i) -{ int x,y,offset; - - if(b >= 2300) - { *i = 44; - *q = (b-2300); - return; - } - - if(b >= 2248) - { *i = 43; - *q = (b-2248); - return; - } - - offset = b&1; - b = (b-12)/2; - x = b/43; - y = (b-(x*43))%26; - *i = b-(x*43); - *q = 2*((x+26-y)%26)+offset; -} - -/* - * There are 86 vectors of P-parity, yielding a RS(26,24) code. - */ - -void GetPVector(unsigned char *frame, unsigned char *data, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - data[i] = frame[w_idx]; -} - -void SetPVector(unsigned char *frame, unsigned char *data, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - frame[w_idx] = data[i]; -} - -void FillPVector(unsigned char *frame, unsigned char data, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - frame[w_idx] = data; -} - -void OrPVector(unsigned char *frame, unsigned char value, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - frame[w_idx] |= value; -} - -void AndPVector(unsigned char *frame, unsigned char value, int n) -{ int i; - int w_idx = n+12; - - for(i=0; i<26; i++, w_idx+=86) - frame[w_idx] &= value; -} - -/* - * There are 52 vectors of Q-parity, yielding a RS(45,43) code. - */ - -void GetQVector(unsigned char *frame, unsigned char *data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - data[i] = frame[(w_idx % 2236) + offset]; - - data[43] = frame[2248 + n]; - data[44] = frame[2300 + n]; -} - -void SetQVector(unsigned char *frame, unsigned char *data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - frame[(w_idx % 2236) + offset] = data[i]; - - frame[2248 + n] = data[43]; - frame[2300 + n] = data[44]; -} - -void FillQVector(unsigned char *frame, unsigned char data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - frame[(w_idx % 2236) + offset] = data; - - frame[2248 + n] = data; - frame[2300 + n] = data; -} - -void OrQVector(unsigned char *frame, unsigned char data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - frame[(w_idx % 2236) + offset] |= data; - - frame[2248 + n] |= data; - frame[2300 + n] |= data; -} - -void AndQVector(unsigned char *frame, unsigned char data, int n) -{ int offset = 12 + (n & 1); - int w_idx = (n&~1) * 43; - int i; - - for(i=0; i<43; i++, w_idx+=88) - frame[(w_idx % 2236) + offset] &= data; - - frame[2248 + n] &= data; - frame[2300 + n] &= data; -} - -/*** - *** C2 error counting - ***/ - -int CountC2Errors(unsigned char *frame) -{ int i,count = 0; - frame += 2352; - - for(i=0; i<294; i++, frame++) - { if(*frame & 0x01) count++; - if(*frame & 0x02) count++; - if(*frame & 0x04) count++; - if(*frame & 0x08) count++; - if(*frame & 0x10) count++; - if(*frame & 0x20) count++; - if(*frame & 0x40) count++; - if(*frame & 0x80) count++; - } - - return count; -} - -/*** - *** L-EC error correction for CD raw data sectors - ***/ - -/* - * These could be used from ReedSolomonTables, - * but hardcoding them is faster. - */ - -#define NROOTS 2 -#define LEC_FIRST_ROOT 0 //GF_ALPHA0 -#define LEC_PRIM_ELEM 1 -#define LEC_PRIMTH_ROOT 1 - -/* - * Calculate the error syndrome - */ - -int DecodePQ(ReedSolomonTables *rt, unsigned char *data, int padding, - int *erasure_list, int erasure_count) -{ GaloisTables *gt = rt->gfTables; - int syndrome[NROOTS]; - int lambda[NROOTS+1]; - int omega[NROOTS+1]; - int b[NROOTS+1]; - int reg[NROOTS+1]; - int root[NROOTS]; - int loc[NROOTS]; - int syn_error; - int deg_lambda,lambda_roots; - int deg_omega; - int shortened_size = GF_FIELDMAX - padding; - int corrected = 0; - int i,j,k; - int r,el; - - /*** Form the syndromes: Evaluate data(x) at roots of g(x) */ - - for(i=0; ialphaTo[mod_fieldmax(gt->indexOf[syndrome[i]] - + (LEC_FIRST_ROOT+i)*LEC_PRIM_ELEM)]; - - /*** Convert syndrome to index form, check for nonzero condition. */ - - syn_error = 0; - for(i=0; iindexOf[syndrome[i]]; - } - - /*** If the syndrome is zero, everything is fine. */ - - if(!syn_error) - return 0; - - /*** Initialize lambda to be the erasure locator polynomial */ - - lambda[0] = 1; - lambda[1] = lambda[2] = 0; - - erasure_list[0] += padding; - erasure_list[1] += padding; - - if(erasure_count > 2) /* sanity check */ - erasure_count = 0; - - if(erasure_count > 0) - { lambda[1] = gt->alphaTo[mod_fieldmax(LEC_PRIM_ELEM*(GF_FIELDMAX-1-erasure_list[0]))]; - - for(i=1; i0; j--) - { int tmp = gt->indexOf[lambda[j-1]]; - - if(tmp != GF_ALPHA0) - lambda[j] ^= gt->alphaTo[mod_fieldmax(u + tmp)]; - } - } - } - - for(i=0; iindexOf[lambda[i]]; - - /*** Berlekamp-Massey algorithm to determine error+erasure locator polynomial */ - - r = erasure_count; /* r is the step number */ - el = erasure_count; - - /* Compute discrepancy at the r-th step in poly-form */ - - while(++r <= NROOTS) - { int discr_r = 0; - - for(i=0; ialphaTo[mod_fieldmax(gt->indexOf[lambda[i]] + syndrome[r-i-1])]; - - discr_r = gt->indexOf[discr_r]; - - if(discr_r == GF_ALPHA0) - { /* B(x) = x*B(x) */ - memmove(b+1, b, NROOTS*sizeof(b[0])); - b[0] = GF_ALPHA0; - } - else - { int t[NROOTS+1]; - - /* T(x) = lambda(x) - discr_r*x*b(x) */ - t[0] = lambda[0]; - for(i=0; ialphaTo[mod_fieldmax(discr_r + b[i])]; - else t[i+1] = lambda[i+1]; - } - - if(2*el <= r+erasure_count-1) - { el = r + erasure_count - el; - - /* B(x) <-- inv(discr_r) * lambda(x) */ - for(i=0; i<=NROOTS; i++) - b[i] = (lambda[i] == 0) ? GF_ALPHA0 - : mod_fieldmax(gt->indexOf[lambda[i]] - discr_r + GF_FIELDMAX); - } - else - { /* 2 lines below: B(x) <-- x*B(x) */ - memmove(b+1, b, NROOTS*sizeof(b[0])); - b[0] = GF_ALPHA0; - } - - memcpy(lambda, t, (NROOTS+1)*sizeof(t[0])); - } - } - - /*** Convert lambda to index form and compute deg(lambda(x)) */ - - deg_lambda = 0; - for(i=0; iindexOf[lambda[i]]; - if(lambda[i] != GF_ALPHA0) - deg_lambda = i; - } - - /*** Find roots of the error+erasure locator polynomial by Chien search */ - - memcpy(reg+1, lambda+1, NROOTS*sizeof(reg[0])); - lambda_roots = 0; /* Number of roots of lambda(x) */ - - for(i=1, k=LEC_PRIMTH_ROOT-1; i<=GF_FIELDMAX; i++, k=mod_fieldmax(k+LEC_PRIMTH_ROOT)) - { int q=1; /* lambda[0] is always 0 */ - - for(j=deg_lambda; j>0; j--) - { if(reg[j] != GF_ALPHA0) - { reg[j] = mod_fieldmax(reg[j] + j); - q ^= gt->alphaTo[reg[j]]; - } - } - - if(q != 0) continue; /* Not a root */ - - /* store root in index-form and the error location number */ - - root[lambda_roots] = i; - loc[lambda_roots] = k; - - /* If we've already found max possible roots, abort the search to save time */ - - if(++lambda_roots == deg_lambda) break; - } - - /* deg(lambda) unequal to number of roots => uncorrectable error detected - This is not reliable for very small numbers of roots, e.g. nroots = 2 */ - - if(deg_lambda != lambda_roots) - { return -1; - } - - /* Compute err+eras evaluator poly omega(x) = syn(x)*lambda(x) - (modulo x**nroots). in index form. Also find deg(omega). */ - - deg_omega = deg_lambda-1; - - for(i=0; i<=deg_omega; i++) - { int tmp = 0; - - for(j=i; j>=0; j--) - { if((syndrome[i - j] != GF_ALPHA0) && (lambda[j] != GF_ALPHA0)) - tmp ^= gt->alphaTo[mod_fieldmax(syndrome[i - j] + lambda[j])]; - } - - omega[i] = gt->indexOf[tmp]; - } - - /* Compute error values in poly-form. - num1 = omega(inv(X(l))), - num2 = inv(X(l))**(FIRST_ROOT-1) and - den = lambda_pr(inv(X(l))) all in poly-form. */ - - for(j=lambda_roots-1; j>=0; j--) - { int num1 = 0; - int num2; - int den; - int location = loc[j]; - - for(i=deg_omega; i>=0; i--) - { if(omega[i] != GF_ALPHA0) - num1 ^= gt->alphaTo[mod_fieldmax(omega[i] + i * root[j])]; - } - - num2 = gt->alphaTo[mod_fieldmax(root[j] * (LEC_FIRST_ROOT - 1) + GF_FIELDMAX)]; - den = 0; - - /* lambda[i+1] for i even is the formal derivative lambda_pr of lambda[i] */ - - for(i=MIN(deg_lambda, NROOTS-1) & ~1; i>=0; i-=2) - { if(lambda[i+1] != GF_ALPHA0) - den ^= gt->alphaTo[mod_fieldmax(lambda[i+1] + i * root[j])]; - } - - /* Apply error to data */ - - if(num1 != 0 && location >= padding) - { - corrected++; - data[location-padding] ^= gt->alphaTo[mod_fieldmax(gt->indexOf[num1] + gt->indexOf[num2] - + GF_FIELDMAX - gt->indexOf[den])]; - - /* If no erasures were given, at most one error was corrected. - Return its position in erasure_list[0]. */ - - if(!erasure_count) - erasure_list[0] = location-padding; - } -#if 1 - else return -3; -#endif - } - - /*** Form the syndromes: Evaluate data(x) at roots of g(x) */ - - for(i=0; ialphaTo[mod_fieldmax(gt->indexOf[syndrome[i]] - + (LEC_FIRST_ROOT+i)*LEC_PRIM_ELEM)]; - } - - /*** Convert syndrome to index form, check for nonzero condition. */ -#if 1 - for(i=0; i - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -#include "lec.h" - -#define GF8_PRIM_POLY 0x11d /* x^8 + x^4 + x^3 + x^2 + 1 */ - -#define EDC_POLY 0x8001801b /* (x^16 + x^15 + x^2 + 1) (x^16 + x^2 + x + 1) */ - -#define LEC_HEADER_OFFSET 12 -#define LEC_DATA_OFFSET 16 -#define LEC_MODE1_DATA_LEN 2048 -#define LEC_MODE1_EDC_OFFSET 2064 -#define LEC_MODE1_INTERMEDIATE_OFFSET 2068 -#define LEC_MODE1_P_PARITY_OFFSET 2076 -#define LEC_MODE1_Q_PARITY_OFFSET 2248 -#define LEC_MODE2_FORM1_DATA_LEN (2048+8) -#define LEC_MODE2_FORM1_EDC_OFFSET 2072 -#define LEC_MODE2_FORM2_DATA_LEN (2324+8) -#define LEC_MODE2_FORM2_EDC_OFFSET 2348 - - -typedef u_int8_t gf8_t; - -static u_int8_t GF8_LOG[256]; -static gf8_t GF8_ILOG[256]; - -static const class Gf8_Q_Coeffs_Results_01 { -private: - u_int16_t table[43][256]; -public: - Gf8_Q_Coeffs_Results_01(); - ~Gf8_Q_Coeffs_Results_01() {} - const u_int16_t *operator[] (int i) const { return &table[i][0]; } - operator const u_int16_t *() const { return &table[0][0]; } -} CF8_Q_COEFFS_RESULTS_01; - -static const class CrcTable { -private: - u_int32_t table[256]; -public: - CrcTable(); - ~CrcTable() {} - u_int32_t operator[](int i) const { return table[i]; } - operator const u_int32_t *() const { return table; } -} CRCTABLE; - -static const class ScrambleTable { -private: - u_int8_t table[2340]; -public: - ScrambleTable(); - ~ScrambleTable() {} - u_int8_t operator[](int i) const { return table[i]; } - operator const u_int8_t *() const { return table; } -} SCRAMBLE_TABLE; - -/* Creates the logarithm and inverse logarithm table that is required - * for performing multiplication in the GF(8) domain. - */ -static void gf8_create_log_tables() -{ - u_int8_t log; - u_int16_t b; - - for (b = 0; b <= 255; b++) { - GF8_LOG[b] = 0; - GF8_ILOG[b] = 0; - } - - b = 1; - - for (log = 0; log < 255; log++) { - GF8_LOG[(u_int8_t)b] = log; - GF8_ILOG[log] = (u_int8_t)b; - - b <<= 1; - - if ((b & 0x100) != 0) - b ^= GF8_PRIM_POLY; - } -} - -/* Addition in the GF(8) domain: just the XOR of the values. - */ -#define gf8_add(a, b) (a) ^ (b) - - -/* Multiplication in the GF(8) domain: add the logarithms (modulo 255) - * and return the inverse logarithm. Not used! - */ -#if 0 -static gf8_t gf8_mult(gf8_t a, gf8_t b) -{ - int16_t sum; - - if (a == 0 || b == 0) - return 0; - - sum = GF8_LOG[a] + GF8_LOG[b]; - - if (sum >= 255) - sum -= 255; - - return GF8_ILOG[sum]; -} -#endif - -/* Division in the GF(8) domain: Like multiplication but logarithms a - * subtracted. - */ -static gf8_t gf8_div(gf8_t a, gf8_t b) -{ - int16_t sum; - - assert(b != 0); - - if (a == 0) - return 0; - - sum = GF8_LOG[a] - GF8_LOG[b]; - - if (sum < 0) - sum += 255; - - return GF8_ILOG[sum]; -} - -Gf8_Q_Coeffs_Results_01::Gf8_Q_Coeffs_Results_01() -{ - int i, j; - u_int16_t c; - gf8_t GF8_COEFFS_HELP[2][45]; - u_int8_t GF8_Q_COEFFS[2][45]; - - - gf8_create_log_tables(); - - /* build matrix H: - * 1 1 ... 1 1 - * a^44 a^43 ... a^1 a^0 - * - * - */ - - for (j = 0; j < 45; j++) { - GF8_COEFFS_HELP[0][j] = 1; /* e0 */ - GF8_COEFFS_HELP[1][j] = GF8_ILOG[44-j]; /* e1 */ - } - - - /* resolve equation system for parity byte 0 and 1 */ - - /* e1' = e1 + e0 */ - for (j = 0; j < 45; j++) { - GF8_Q_COEFFS[1][j] = gf8_add(GF8_COEFFS_HELP[1][j], - GF8_COEFFS_HELP[0][j]); - } - - /* e1'' = e1' / (a^1 + 1) */ - for (j = 0; j < 45; j++) { - GF8_Q_COEFFS[1][j] = gf8_div(GF8_Q_COEFFS[1][j], GF8_Q_COEFFS[1][43]); - } - - /* e0' = e0 + e1 / a^1 */ - for (j = 0; j < 45; j++) { - GF8_Q_COEFFS[0][j] = gf8_add(GF8_COEFFS_HELP[0][j], - gf8_div(GF8_COEFFS_HELP[1][j], - GF8_ILOG[1])); - } - - /* e0'' = e0' / (1 + 1 / a^1) */ - for (j = 0; j < 45; j++) { - GF8_Q_COEFFS[0][j] = gf8_div(GF8_Q_COEFFS[0][j], GF8_Q_COEFFS[0][44]); - } - - /* - * Compute the products of 0..255 with all of the Q coefficients in - * advance. When building the scalar product between the data vectors - * and the P/Q vectors the individual products can be looked up in - * this table - * - * The P parity coefficients are just a subset of the Q coefficients so - * that we do not need to create a separate table for them. - */ - - for (j = 0; j < 43; j++) { - - table[j][0] = 0; - - for (i = 1; i < 256; i++) { - c = GF8_LOG[i] + GF8_LOG[GF8_Q_COEFFS[0][j]]; - if (c >= 255) c -= 255; - table[j][i] = GF8_ILOG[c]; - - c = GF8_LOG[i] + GF8_LOG[GF8_Q_COEFFS[1][j]]; - if (c >= 255) c -= 255; - table[j][i] |= GF8_ILOG[c]<<8; - } - } -} - -/* Reverses the bits in 'd'. 'bits' defines the bit width of 'd'. - */ -static u_int32_t mirror_bits(u_int32_t d, int bits) -{ - int i; - u_int32_t r = 0; - - for (i = 0; i < bits; i++) { - r <<= 1; - - if ((d & 0x1) != 0) - r |= 0x1; - - d >>= 1; - } - - return r; -} - -/* Build the CRC lookup table for EDC_POLY poly. The CRC is 32 bit wide - * and reversed (i.e. the bit stream is divided by the EDC_POLY with the - * LSB first order). - */ -CrcTable::CrcTable () -{ - u_int32_t i, j; - u_int32_t r; - - for (i = 0; i < 256; i++) { - r = mirror_bits(i, 8); - - r <<= 24; - - for (j = 0; j < 8; j++) { - if ((r & 0x80000000) != 0) { - r <<= 1; - r ^= EDC_POLY; - } - else { - r <<= 1; - } - } - - r = mirror_bits(r, 32); - - table[i] = r; - } -} - -/* Calculates the CRC of given data with given lengths based on the - * table lookup algorithm. - */ -static u_int32_t calc_edc(u_int8_t *data, int len) -{ - u_int32_t crc = 0; - - while (len--) { - crc = CRCTABLE[(int)(crc ^ *data++) & 0xff] ^ (crc >> 8); - } - - return crc; -} - -/* Build the scramble table as defined in the yellow book. The bytes - 12 to 2351 of a sector will be XORed with the data of this table. - */ -ScrambleTable::ScrambleTable() -{ - u_int16_t i, j; - u_int16_t reg = 1; - u_int8_t d; - - for (i = 0; i < 2340; i++) { - d = 0; - - for (j = 0; j < 8; j++) { - d >>= 1; - - if ((reg & 0x1) != 0) - d |= 0x80; - - if ((reg & 0x1) != ((reg >> 1) & 0x1)) { - reg >>= 1; - reg |= 0x4000; /* 15-bit register */ - } - else { - reg >>= 1; - } - } - - table[i] = d; - } -} - -/* Calc EDC for a MODE 1 sector - */ -static void calc_mode1_edc(u_int8_t *sector) -{ - u_int32_t crc = calc_edc(sector, LEC_MODE1_DATA_LEN + 16); - - sector[LEC_MODE1_EDC_OFFSET] = crc & 0xffL; - sector[LEC_MODE1_EDC_OFFSET + 1] = (crc >> 8) & 0xffL; - sector[LEC_MODE1_EDC_OFFSET + 2] = (crc >> 16) & 0xffL; - sector[LEC_MODE1_EDC_OFFSET + 3] = (crc >> 24) & 0xffL; -} - -/* Calc EDC for a XA form 1 sector - */ -static void calc_mode2_form1_edc(u_int8_t *sector) -{ - u_int32_t crc = calc_edc(sector + LEC_DATA_OFFSET, - LEC_MODE2_FORM1_DATA_LEN); - - sector[LEC_MODE2_FORM1_EDC_OFFSET] = crc & 0xffL; - sector[LEC_MODE2_FORM1_EDC_OFFSET + 1] = (crc >> 8) & 0xffL; - sector[LEC_MODE2_FORM1_EDC_OFFSET + 2] = (crc >> 16) & 0xffL; - sector[LEC_MODE2_FORM1_EDC_OFFSET + 3] = (crc >> 24) & 0xffL; -} - -/* Calc EDC for a XA form 2 sector - */ -static void calc_mode2_form2_edc(u_int8_t *sector) -{ - u_int32_t crc = calc_edc(sector + LEC_DATA_OFFSET, - LEC_MODE2_FORM2_DATA_LEN); - - sector[LEC_MODE2_FORM2_EDC_OFFSET] = crc & 0xffL; - sector[LEC_MODE2_FORM2_EDC_OFFSET + 1] = (crc >> 8) & 0xffL; - sector[LEC_MODE2_FORM2_EDC_OFFSET + 2] = (crc >> 16) & 0xffL; - sector[LEC_MODE2_FORM2_EDC_OFFSET + 3] = (crc >> 24) & 0xffL; -} - -/* Writes the sync pattern to the given sector. - */ -static void set_sync_pattern(u_int8_t *sector) -{ - sector[0] = 0; - - sector[1] = sector[2] = sector[3] = sector[4] = sector[5] = - sector[6] = sector[7] = sector[8] = sector[9] = sector[10] = 0xff; - - sector[11] = 0; -} - - -static u_int8_t bin2bcd(u_int8_t b) -{ - return (((b/10) << 4) & 0xf0) | ((b%10) & 0x0f); -} - -/* Builds the sector header. - */ -static void set_sector_header(u_int8_t mode, u_int32_t adr, u_int8_t *sector) -{ - sector[LEC_HEADER_OFFSET] = bin2bcd(adr / (60*75)); - sector[LEC_HEADER_OFFSET + 1] = bin2bcd((adr / 75) % 60); - sector[LEC_HEADER_OFFSET + 2] = bin2bcd(adr % 75); - sector[LEC_HEADER_OFFSET + 3] = mode; -} - -/* Calculate the P parities for the sector. - * The 43 P vectors of length 24 are combined with the GF8_P_COEFFS. - */ -static void calc_P_parity(u_int8_t *sector) -{ - int i, j; - u_int16_t p01_msb, p01_lsb; - u_int8_t *p_lsb_start; - u_int8_t *p_lsb; - u_int8_t *p0, *p1; - u_int8_t d0,d1; - - p_lsb_start = sector + LEC_HEADER_OFFSET; - - p1 = sector + LEC_MODE1_P_PARITY_OFFSET; - p0 = sector + LEC_MODE1_P_PARITY_OFFSET + 2 * 43; - - for (i = 0; i <= 42; i++) { - p_lsb = p_lsb_start; - - p01_lsb = p01_msb = 0; - - for (j = 19; j <= 42; j++) { - d0 = *p_lsb; - d1 = *(p_lsb+1); - - p01_lsb ^= CF8_Q_COEFFS_RESULTS_01[j][d0]; - p01_msb ^= CF8_Q_COEFFS_RESULTS_01[j][d1]; - - p_lsb += 2 * 43; - } - - *p0 = p01_lsb; - *(p0 + 1) = p01_msb; - - *p1 = p01_lsb>>8; - *(p1 + 1) = p01_msb>>8; - - p0 += 2; - p1 += 2; - - p_lsb_start += 2; - } -} - -/* Calculate the Q parities for the sector. - * The 26 Q vectors of length 43 are combined with the GF8_Q_COEFFS. - */ -static void calc_Q_parity(u_int8_t *sector) -{ - int i, j; - u_int16_t q01_lsb, q01_msb; - u_int8_t *q_lsb_start; - u_int8_t *q_lsb; - u_int8_t *q0, *q1, *q_start; - u_int8_t d0,d1; - - q_lsb_start = sector + LEC_HEADER_OFFSET; - - q_start = sector + LEC_MODE1_Q_PARITY_OFFSET; - q1 = sector + LEC_MODE1_Q_PARITY_OFFSET; - q0 = sector + LEC_MODE1_Q_PARITY_OFFSET + 2 * 26; - - for (i = 0; i <= 25; i++) { - q_lsb = q_lsb_start; - - q01_lsb = q01_msb = 0; - - for (j = 0; j <= 42; j++) { - d0 = *q_lsb; - d1 = *(q_lsb+1); - - q01_lsb ^= CF8_Q_COEFFS_RESULTS_01[j][d0]; - q01_msb ^= CF8_Q_COEFFS_RESULTS_01[j][d1]; - - q_lsb += 2 * 44; - - if (q_lsb >= q_start) { - q_lsb -= 2 * 1118; - } - } - - *q0 = q01_lsb; - *(q0 + 1) = q01_msb; - - *q1 = q01_lsb>>8; - *(q1 + 1) = q01_msb>>8; - - q0 += 2; - q1 += 2; - - q_lsb_start += 2 * 43; - } -} - -/* Encodes a MODE 0 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide - */ -void lec_encode_mode0_sector(u_int32_t adr, u_int8_t *sector) -{ - u_int16_t i; - - set_sync_pattern(sector); - set_sector_header(0, adr, sector); - - sector += 16; - - for (i = 0; i < 2336; i++) - *sector++ = 0; -} - -/* Encodes a MODE 1 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2048 bytes user data at - * offset 16 - */ -void lec_encode_mode1_sector(u_int32_t adr, u_int8_t *sector) -{ - set_sync_pattern(sector); - set_sector_header(1, adr, sector); - - calc_mode1_edc(sector); - - /* clear the intermediate field */ - sector[LEC_MODE1_INTERMEDIATE_OFFSET] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 1] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 2] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 3] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 4] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 5] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 6] = - sector[LEC_MODE1_INTERMEDIATE_OFFSET + 7] = 0; - - calc_P_parity(sector); - calc_Q_parity(sector); -} - -/* Encodes a MODE 2 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2336 bytes user data at - * offset 16 - */ -void lec_encode_mode2_sector(u_int32_t adr, u_int8_t *sector) -{ - set_sync_pattern(sector); - set_sector_header(2, adr, sector); -} - -/* Encodes a XA form 1 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2048+8 bytes user data at - * offset 16 - */ -void lec_encode_mode2_form1_sector(u_int32_t adr, u_int8_t *sector) -{ - set_sync_pattern(sector); - - calc_mode2_form1_edc(sector); - - /* P/Q partiy must not contain the sector header so clear it */ - sector[LEC_HEADER_OFFSET] = - sector[LEC_HEADER_OFFSET + 1] = - sector[LEC_HEADER_OFFSET + 2] = - sector[LEC_HEADER_OFFSET + 3] = 0; - - calc_P_parity(sector); - calc_Q_parity(sector); - - /* finally add the sector header */ - set_sector_header(2, adr, sector); -} - -/* Encodes a XA form 2 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2324+8 bytes user data at - * offset 16 - */ -void lec_encode_mode2_form2_sector(u_int32_t adr, u_int8_t *sector) -{ - set_sync_pattern(sector); - - calc_mode2_form2_edc(sector); - - set_sector_header(2, adr, sector); -} - -/* Scrambles and byte swaps an encoded sector. - * 'sector' must be 2352 byte wide. - */ -void lec_scramble(u_int8_t *sector) -{ - u_int16_t i; - const u_int8_t *stable = SCRAMBLE_TABLE; - u_int8_t *p = sector; - u_int8_t tmp; - - - for (i = 0; i < 6; i++) { - /* just swap bytes of sector sync */ - tmp = *p; - *p = *(p + 1); - p++; - *p++ = tmp; - } - for (;i < (2352 / 2); i++) { - /* scramble and swap bytes */ - tmp = *p ^ *stable++; - *p = *(p + 1) ^ *stable++; - p++; - *p++ = tmp; - } -} - -#if 0 -#include -#include -#include -#include - -int main(int argc, char **argv) -{ - char *infile; - char *outfile; - int fd_in, fd_out; - u_int8_t buffer1[2352]; - u_int8_t buffer2[2352]; - u_int32_t lba; - int i; - -#if 0 - for (i = 0; i < 2048; i++) - buffer1[i + 16] = 234; - - lba = 150; - - for (i = 0; i < 100000; i++) { - lec_encode_mode1_sector(lba, buffer1); - lec_scramble(buffer2); - lba++; - } - -#else - - if (argc != 3) - return 1; - - infile = argv[1]; - outfile = argv[2]; - - - if ((fd_in = open(infile, O_RDONLY)) < 0) { - perror("Cannot open input file"); - return 1; - } - - if ((fd_out = open(outfile, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) { - perror("Cannot open output file"); - return 1; - } - - lba = 150; - - do { - if (read(fd_in, buffer1, 2352) != 2352) - break; - - switch (*(buffer1 + 12 + 3)) { - case 1: - memcpy(buffer2 + 16, buffer1 + 16, 2048); - - lec_encode_mode1_sector(lba, buffer2); - break; - - case 2: - if ((*(buffer1 + 12 + 4 + 2) & 0x20) != 0) { - /* form 2 sector */ - memcpy(buffer2 + 16, buffer1 + 16, 2324 + 8); - lec_encode_mode2_form2_sector(lba, buffer2); - } - else { - /* form 1 sector */ - memcpy(buffer2 + 16, buffer1 + 16, 2048 + 8); - lec_encode_mode2_form1_sector(lba, buffer2); - } - break; - } - - if (memcmp(buffer1, buffer2, 2352) != 0) { - printf("Verify error at lba %ld\n", lba); - } - - lec_scramble(buffer2); - write(fd_out, buffer2, 2352); - - lba++; - } while (1); - - close(fd_in); - close(fd_out); - -#endif - - return 0; -} -#endif diff --git a/waterbox/ss/cdrom/lec.h b/waterbox/ss/cdrom/lec.h deleted file mode 100644 index c5e874c3f3..0000000000 --- a/waterbox/ss/cdrom/lec.h +++ /dev/null @@ -1,77 +0,0 @@ -/* cdrdao - write audio CD-Rs in disc-at-once mode - * - * Copyright (C) 1998-2002 Andreas Mueller - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef __LEC_H__ -#define __LEC_H__ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include - -typedef uint32_t u_int32_t; -typedef uint16_t u_int16_t; -typedef uint8_t u_int8_t; - -#ifndef TRUE -#define TRUE 1 -#endif - -/* Encodes a MODE 0 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide - */ -void lec_encode_mode0_sector(u_int32_t adr, u_int8_t *sector); - -/* Encodes a MODE 1 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2048 bytes user data at - * offset 16 - */ -void lec_encode_mode1_sector(u_int32_t adr, u_int8_t *sector); - -/* Encodes a MODE 2 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2336 bytes user data at - * offset 16 - */ -void lec_encode_mode2_sector(u_int32_t adr, u_int8_t *sector); - -/* Encodes a XA form 1 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2048+8 bytes user data at - * offset 16 - */ -void lec_encode_mode2_form1_sector(u_int32_t adr, u_int8_t *sector); - -/* Encodes a XA form 2 sector. - * 'adr' is the current physical sector address - * 'sector' must be 2352 byte wide containing 2324+8 bytes user data at - * offset 16 - */ -void lec_encode_mode2_form2_sector(u_int32_t adr, u_int8_t *sector); - -/* Scrambles and byte swaps an encoded sector. - * 'sector' must be 2352 byte wide. - */ -void lec_scramble(u_int8_t *sector); - -#endif diff --git a/waterbox/ss/cdrom/recover-raw.cpp b/waterbox/ss/cdrom/recover-raw.cpp deleted file mode 100644 index 689f1f3c8f..0000000000 --- a/waterbox/ss/cdrom/recover-raw.cpp +++ /dev/null @@ -1,210 +0,0 @@ -/* dvdisaster: Additional error correction for optical media. - * Copyright (C) 2004-2007 Carsten Gnoerlich. - * Project home page: http://www.dvdisaster.com - * Email: carsten@dvdisaster.com -or- cgnoerlich@fsfe.org - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA, - * or direct your browser at http://www.gnu.org. - */ - -#include "dvdisaster.h" - -static GaloisTables *gt = NULL; /* for L-EC Reed-Solomon */ -static ReedSolomonTables *rt = NULL; - -bool Init_LEC_Correct(void) -{ - gt = CreateGaloisTables(0x11d); - rt = CreateReedSolomonTables(gt, 0, 1, 10); - - return(1); -} - - - -/*** - *** CD level CRC calculation - ***/ - -/* - * Test raw sector against its 32bit CRC. - * Returns TRUE if frame is good. - */ - -int CheckEDC(const unsigned char *cd_frame, bool xa_mode) -{ - unsigned int expected_crc, real_crc; - unsigned int crc_base = xa_mode ? 2072 : 2064; - - expected_crc = cd_frame[crc_base + 0] << 0; - expected_crc |= cd_frame[crc_base + 1] << 8; - expected_crc |= cd_frame[crc_base + 2] << 16; - expected_crc |= cd_frame[crc_base + 3] << 24; - - if(xa_mode) - real_crc = EDCCrc32(cd_frame+16, 2056); - else - real_crc = EDCCrc32(cd_frame, 2064); - - if(expected_crc == real_crc) - return(1); - else - { - //printf("Bad EDC CRC: Calculated: %08x, Recorded: %08x\n", real_crc, expected_crc); - return(0); - } -} - -/*** - *** A very simple L-EC error correction. - *** - * Perform just one pass over the Q and P vectors to see if everything - * is okay respectively correct minor errors. This is pretty much the - * same stuff the drive is supposed to do in the final L-EC stage. - */ - -static int simple_lec(unsigned char *frame) -{ - unsigned char byte_state[2352]; - unsigned char p_vector[P_VECTOR_SIZE]; - unsigned char q_vector[Q_VECTOR_SIZE]; - unsigned char p_state[P_VECTOR_SIZE]; - int erasures[Q_VECTOR_SIZE], erasure_count; - int ignore[2]; - int p_failures, q_failures; - int p_corrected, q_corrected; - int p,q; - - /* Setup */ - - memset(byte_state, 0, 2352); - - p_failures = q_failures = 0; - p_corrected = q_corrected = 0; - - /* Perform Q-Parity error correction */ - - for(q=0; q 2) - { GetPVector(byte_state, p_state, p); - erasure_count = 0; - - for(i=0; i 0 && erasure_count <= 2) - { GetPVector(frame, p_vector, p); - err = DecodePQ(rt, p_vector, P_PADDING, erasures, erasure_count); - } - } - - /* See what we've got */ - - if(err < 0) /* Uncorrectable. */ - { p_failures++; - } - else /* Correctable. */ - { if(err == 1 || err == 2) /* Store back corrected vector */ - { SetPVector(frame, p_vector, p); - p_corrected++; - } - } - } - - /* Sum up */ - - if(q_failures || p_failures || q_corrected || p_corrected) - { - return 1; - } - - return 0; -} - -/*** - *** Validate CD raw sector - ***/ - -int ValidateRawSector(unsigned char *frame, bool xaMode) -{ - int lec_did_sth = FALSE; - - /* Do simple L-EC. - It seems that drives stop their internal L-EC as soon as the - EDC is okay, so we may see uncorrected errors in the parity bytes. - Since we are also interested in the user data only and doing the - L-EC is expensive, we skip our L-EC as well when the EDC is fine. */ - - if(!CheckEDC(frame, xaMode)) - { - unsigned char header[4]; - - if(xaMode) - { - memcpy(header, frame + 12, 4); - memset(frame + 12, 0, 4); - } - - lec_did_sth = simple_lec(frame); - - if(xaMode) - memcpy(frame + 12, header, 4); - } - - /* Test internal sector checksum again */ - if(!CheckEDC(frame, xaMode)) - { - /* EDC failure in RAW sector */ - return FALSE; - } - - return TRUE; -} - diff --git a/waterbox/ss/db.cpp b/waterbox/ss/db.cpp deleted file mode 100644 index d89487d715..0000000000 --- a/waterbox/ss/db.cpp +++ /dev/null @@ -1,161 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* db.cpp: -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "ss.h" -#include "smpc.h" -#include "cart.h" -#include "db.h" - -namespace MDFN_IEN_SS -{ - -bool DB_LookupRegionDB(const uint8* fd_id, unsigned* const region) -{ - static const struct - { - uint8 id[16]; - unsigned area; - } regiondb[] = - { - { { 0x10, 0x8f, 0xe1, 0xaf, 0x55, 0x5a, 0x95, 0x42, 0x04, 0x85, 0x7e, 0x98, 0x8c, 0x53, 0x6a, 0x31, }, SMPC_AREA_EU_PAL }, // Preview Sega Saturn Vol. 1 (Europe) - { { 0xed, 0x4c, 0x0b, 0x87, 0x35, 0x37, 0x86, 0x76, 0xa0, 0xf6, 0x32, 0xc6, 0xa4, 0xc3, 0x99, 0x88, }, SMPC_AREA_EU_PAL }, // Primal Rage (Europe) (En,Fr,De,Es,It,Pt) - { { 0x15, 0xfc, 0x3a, 0x82, 0x16, 0xa9, 0x85, 0xa5, 0xa8, 0xad, 0x30, 0xaf, 0x9a, 0xff, 0x03, 0xa9, }, SMPC_AREA_JP }, // Race Drivin' (Japan) (2M) - { { 0xe1, 0xdd, 0xfd, 0xa1, 0x8b, 0x47, 0x02, 0x21, 0x36, 0x1e, 0x5a, 0xae, 0x20, 0xc0, 0x59, 0x9f, }, SMPC_AREA_CSA_NTSC }, // Riven - A Sequencia de Myst (Brazil) (Disc 1) - { { 0xbf, 0x5f, 0xf8, 0x5f, 0xf2, 0x0c, 0x35, 0xf6, 0xc9, 0x8d, 0x03, 0xbc, 0x34, 0xd9, 0xda, 0x7f, }, SMPC_AREA_CSA_NTSC }, // Riven - A Sequencia de Myst (Brazil) (Disc 2) - { { 0x98, 0xb6, 0x6e, 0x09, 0xe6, 0xdc, 0x30, 0xe6, 0x55, 0xdb, 0x85, 0x01, 0x33, 0x0c, 0x0b, 0x9c, }, SMPC_AREA_CSA_NTSC }, // Riven - A Sequencia de Myst (Brazil) (Disc 3) - { { 0xa2, 0x34, 0xb0, 0xb9, 0xaa, 0x47, 0x74, 0x1f, 0xd4, 0x1e, 0x35, 0xda, 0x3d, 0xe7, 0x4d, 0xe3, }, SMPC_AREA_CSA_NTSC }, // Riven - A Sequencia de Myst (Brazil) (Disc 4) - { { 0xf7, 0xe9, 0x23, 0x0a, 0x9e, 0x92, 0xf1, 0x93, 0x16, 0x43, 0xf8, 0x6c, 0xe8, 0x21, 0x50, 0x66, }, SMPC_AREA_JP }, // Sega International Victory Goal (Japan) (5M) - { { 0x64, 0x75, 0x25, 0x0c, 0xa1, 0x9b, 0x6c, 0x5e, 0x4e, 0xa0, 0x6d, 0x69, 0xd9, 0x0f, 0x32, 0xca, }, SMPC_AREA_EU_PAL }, // Virtua Racing (Europe) - { { 0x0d, 0xe3, 0xfa, 0xfb, 0x2b, 0xb9, 0x6d, 0x79, 0xe0, 0x3a, 0xb7, 0x6d, 0xcc, 0xbf, 0xb0, 0x2c, }, SMPC_AREA_JP }, // Virtua Racing (Japan) - { { 0x6b, 0x29, 0x33, 0xfc, 0xdd, 0xad, 0x8e, 0x0d, 0x95, 0x81, 0xa6, 0xee, 0xfd, 0x90, 0x4b, 0x43, }, SMPC_AREA_EU_PAL }, // Winter Heat (Europe) (Demo) - { { 0x73, 0x91, 0x4b, 0xe1, 0xad, 0x4d, 0xaf, 0x69, 0xc3, 0xeb, 0xb8, 0x43, 0xee, 0x3e, 0xb5, 0x09, }, SMPC_AREA_EU_PAL }, // WWF WrestleMania - The Arcade Game (Europe) (Demo) - }; - - for(auto& re : regiondb) - { - if(!memcmp(re.id, fd_id, 16)) - { - *region = re.area; - return true; - } - } - - return false; -} - -bool DB_LookupCartDB(const char* sgid, const uint8* fd_id, int* const cart_type) -{ -// printf(" { \"%s\", CART_EXTRAM_1M },\n", sgid); -// printf(" { \"%s\", CART_EXTRAM_4M },\n", sgid); -// printf(" { \"%s\", CART_NONE },\n", sgid); - - static const struct - { - const char* sgid; - int cart_type; - uint8 fd_id[16]; - } cartdb[] = - { -#if 0 - { "T-19708G", CART_NONE }, // Pia Carrot e Youkoso - { "T-32901G", CART_NONE }, // Silhouette Mirage - { "MK-81086", CART_NONE }, // Tomb Raider (Europe) - { "T-7910H", CART_NONE }, // Tomb Raider (USA) - { "T-6010G", CART_NONE }, // Tomb Raiders -#endif - // - // - // - // NetLink Modem TODO: - { "MK-81218", CART_NONE }, // Daytona USA CCE Net Link Edition - { "MK-81071", CART_NONE }, // Duke Nukem 3D - { "T-319-01H", CART_NONE }, // PlanetWeb Browser (multiple versions) - { "MK-81070", CART_NONE }, // Saturn Bomberman - { "MK-81215", CART_NONE }, // Sega Rally Championship Plus NetLink Edition - { "MK-81072", CART_NONE }, // Virtual On NetLink Edition - // - // - // Japanese modem TODO: - { "GS-7106", CART_NONE }, // Dennou Senki Virtual On (SegaNet) - { "GS-7105", CART_NONE }, // Habitat II - { "GS-7101", CART_NONE }, // Pad Nifty - { "GS-7113", CART_NONE }, // Puzzle Bobble 3 (SegaNet) - { "T-14305G", CART_NONE }, // Saturn Bomberman (SegaNet) - { "T-31301G", CART_NONE }, // SegaSaturn Internet Vol. 1 - // - // - // - { "MK-81088", CART_KOF95 }, // The King of Fighters '95 (Europe) - { "T-3101G", CART_KOF95 }, // The King of Fighters '95 - { "T-13308G", CART_ULTRAMAN },// Ultraman: Hikari no Kyojin Densetsu - // - // - // - { "T-1521G", CART_EXTRAM_1M }, // Astra Superstars - { "T-9904G", CART_EXTRAM_1M }, // Cotton 2 - { "T-1217G", CART_EXTRAM_1M }, // Cyberbots - { "GS-9107", CART_EXTRAM_1M }, // Fighter's History Dynamite - { "T-20109G", CART_EXTRAM_1M }, // Friends - { "T-14411G", CART_EXTRAM_1M }, // Groove on Fight - { "T-7032H-50", CART_EXTRAM_1M }, // Marvel Super Heroes (Europe) - { "T-1215G", CART_EXTRAM_1M }, // Marvel Super Heroes (Japan) - { "T-3111G", CART_EXTRAM_1M }, // Metal Slug - { "T-22205G", CART_EXTRAM_1M }, // Noel 3 - { "T-22206G", CART_EXTRAM_1M }, // Noel 3 (TODO: Test) - { "T-20114G", CART_EXTRAM_1M }, // Pia Carrot e Youkoso!! 2 (TODO: Test) - { "T-20121M", CART_EXTRAM_1M }, // Pia Carrot e Youkoso!! 2 (TODO: Test) - { "T-3105G", CART_EXTRAM_1M }, // Real Bout Garou Densetsu - { "T-3119G", CART_EXTRAM_1M }, // Real Bout Garou Densetsu Special - { "T-3116G", CART_EXTRAM_1M }, // Samurai Spirits - Amakusa Kourin - { "T-3104G", CART_EXTRAM_1M }, // Samurai Spirits - Zankurou Musouken - { "T-16509G", CART_EXTRAM_1M }, // Super Real Mahjong P7 (TODO: Test) - { "T-16510G", CART_EXTRAM_1M }, // Super Real Mahjong P7 (TODO: Test) - { "T-3108G", CART_EXTRAM_1M }, // The King of Fighters '96 - { "T-3121G", CART_EXTRAM_1M }, // The King of Fighters '97 - { "T-1515G", CART_EXTRAM_1M }, // Waku Waku 7 - // - // - // - { "T-1245G", CART_EXTRAM_4M }, // D&D Collection - { "T-1248G", CART_EXTRAM_4M }, // Final Fight Revenge - { "T-1238G", CART_EXTRAM_4M }, // Marvel Super Heroes vs. Street Fighter - { "T-1230G", CART_EXTRAM_4M }, // Pocket Fighter - { "T-1246G", CART_EXTRAM_4M }, // Street Fighter Zero 3 - { "T-1229G", CART_EXTRAM_4M }, // Vampire Savior - { "T-1226G", CART_EXTRAM_4M }, // X-Men vs. Street Fighter - // - // - // - { nullptr, CART_CS1RAM_16M, { 0x4a, 0xf9, 0xff, 0x30, 0xea, 0x54, 0xfe, 0x3a, 0x79, 0xa7, 0x68, 0x69, 0xae, 0xde, 0x55, 0xbb } }, // Heart of Darkness (Prototype) - }; - - for(auto& ca : cartdb) - { - if((ca.sgid && !strcmp(ca.sgid, sgid)) || (!ca.sgid && !memcmp(ca.fd_id, fd_id, 16))) - { - *cart_type = ca.cart_type; - return true; - } - } - return false; -} - -} diff --git a/waterbox/ss/db.h b/waterbox/ss/db.h deleted file mode 100644 index 2e9723c4ab..0000000000 --- a/waterbox/ss/db.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef __MDFN_SS_DB_H -#define __MDFN_SS_DB_H - -namespace MDFN_IEN_SS -{ - -bool DB_LookupRegionDB(const uint8* fd_id, unsigned* const region); -bool DB_LookupCartDB(const char* sgid, const uint8* fd_id, int* const cart_type); - - -} - - -#endif - diff --git a/waterbox/ss/debug.inc b/waterbox/ss/debug.inc deleted file mode 100644 index 3fd8f3e133..0000000000 --- a/waterbox/ss/debug.inc +++ /dev/null @@ -1,820 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* debug.inc: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifdef WANT_DEBUGGER -static struct DBGS -{ - enum { NUMBT = 24 }; - - struct - { - uint32 from; - uint32 to; - uint32 branch_count; - int exception; // -1 on no exception. - unsigned vecnum; - bool valid; - } BTEntries[2][NUMBT]; - - bool BTEnabled; - unsigned BTIndex[2]; - - struct SS_BPOINT - { - uint32 A[2]; - }; - - std::vector BreakPointsRead, BreakPointsWrite, BreakPointsPC; - - void (*CPUHook)(uint32, bool); - bool CPUHookContinuous; - - bool FoundBPoint; - - uint32 CurPC[2]; - - unsigned ActiveCPU; -} DBG; - -static void DBG_Break(void) -{ - DBG.FoundBPoint = true; -} - -static void DBG_CheckReadBP(unsigned len, uint32 addr) -{ - for(auto const& bp : DBG.BreakPointsRead) - { - for(uint32 ta = addr; ta != (addr + len); ta++) // TODO: Optimize - { - if(ta >= bp.A[0] && ta <= bp.A[1]) - { - DBG.FoundBPoint = true; - return; - } - } - } -} - -static void DBG_CheckWriteBP(unsigned len, uint32 addr) -{ - for(auto const& bp : DBG.BreakPointsWrite) - { - for(uint32 ta = addr; ta != (addr + len); ta++) // TODO: Optimize - { - if(ta >= bp.A[0] && ta <= bp.A[1]) - { - DBG.FoundBPoint = true; - return; - } - } - } -} - -static void GetAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint8 *Buffer) -{ - if(!strcmp(name, "physical")) - { - while(Length--) - { - //Address &= 0xFFFFFFFF; - //*Buffer = CPU->PeekMem8(Address); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "workraml")) - { - while(Length--) - { - Address &= 0xFFFFF; - *Buffer = ne16_rbo_be(WorkRAML, Address); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "workramh")) - { - while(Length--) - { - Address &= 0xFFFFF; - *Buffer = ne16_rbo_be(WorkRAMH, Address); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "scspram")) - { - while(Length--) - { - Address &= 0x7FFFF; - *Buffer = SOUND_PeekRAM(Address); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "dspprog")) - { - while(Length--) - { - Address &= 0x3FF; - *Buffer = SCU_DSP_PeekProgRAM(Address >> 2) >> (((Address & 0x3) ^ 0x3) << 3); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "vdp1vram")) - { - while(Length--) - { - Address &= 0x7FFFF; - *Buffer = VDP1::PeekVRAM(Address); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "vdp2vram")) - { - while(Length--) - { - Address &= 0x7FFFF; - *Buffer = VDP2::PeekVRAM(Address); - Address++; - Buffer++; - } - } -} - - -static void PutAddressSpaceBytes(const char *name, uint32 Address, uint32 Length, uint32 Granularity, bool hl, const uint8 *Buffer) -{ - if(!strcmp(name, "physical")) - { - while(Length--) - { - //Address &= 0xFFFFFFFF; - //CPU->PokeMem8(Address, *Buffer); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "workramh")) - { - while(Length--) - { - Address &= 0xFFFFF; - ne16_wbo_be(WorkRAMH, Address, *Buffer); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "scspram")) - { - while(Length--) - { - Address &= 0x7FFFF; - SOUND_PokeRAM(Address, *Buffer); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "vdp1vram")) - { - while(Length--) - { - Address &= 0x7FFFF; - VDP1::PokeVRAM(Address, *Buffer); - Address++; - Buffer++; - } - } - else if(!strcmp(name, "vdp2vram")) - { - while(Length--) - { - Address &= 0x7FFFF; - VDP2::PokeVRAM(Address, *Buffer); - Address++; - Buffer++; - } - } -} - - -static uint32 DBG_MemPeek(uint32 A, unsigned int bsize, bool hl, bool logical) -{ -/* - uint32 ret = 0; - - for(unsigned int i = 0; i < bsize; i++) - ret |= CPU->PeekMem8(A + i) << (i * 8); - - return(ret); -*/ - return 0xAA; -} - - -static MDFN_COLD void DBG_FlushBreakPoints(int type) -{ - if(type == BPOINT_READ) - DBG.BreakPointsRead.clear(); - else if(type == BPOINT_WRITE) - DBG.BreakPointsWrite.clear(); - else if(type == BPOINT_PC) - DBG.BreakPointsPC.clear(); -} - -static MDFN_COLD void DBG_AddBreakPoint(int type, unsigned int A1, unsigned int A2, bool logical) -{ - DBGS::SS_BPOINT tmp; - - tmp.A[0] = A1; - tmp.A[1] = A2; - - if(type == BPOINT_READ) - DBG.BreakPointsRead.push_back(tmp); - else if(type == BPOINT_WRITE) - DBG.BreakPointsWrite.push_back(tmp); - else if(type == BPOINT_PC) - DBG.BreakPointsPC.push_back(tmp); -} - -static void DBG_SetCPUCallback(void (*callb)(uint32 PC, bool bpoint), bool continuous) -{ - DBG.CPUHook = callb; - DBG.CPUHookContinuous = continuous; -} - -static void DBG_EnableBranchTrace(bool enable) -{ - if((DBG.BTEnabled ^ enable) & DBG.BTEnabled) - { - for(unsigned which = 0; which < 2; which++) - for(unsigned i = 0; i < DBGS::NUMBT; i++) - DBG.BTEntries[which][i].valid = false; - } - - DBG.BTEnabled = enable; -} - -static void DBG_AddBranchTrace(unsigned which, uint32 to, int exception, unsigned vecnum = 0) -{ - const uint32 from = DBG.CurPC[which]; - auto *prevbt = &DBG.BTEntries[which][(DBG.BTIndex[which] + DBGS::NUMBT - 1) % DBGS::NUMBT]; - - //if(BTEntries[(BTIndex - 1) & 0xF] == PC) return; - - if(prevbt->from == from && prevbt->to == to && prevbt->exception == exception && prevbt->branch_count < 0xFFFFFFFF && prevbt->valid) - prevbt->branch_count++; - else - { - auto& bte = DBG.BTEntries[which][DBG.BTIndex[which]]; - bte.from = from; - bte.to = to; - bte.exception = exception; - bte.vecnum = vecnum; - bte.branch_count = 1; - bte.valid = true; - - DBG.BTIndex[which] = (DBG.BTIndex[which] + 1) % DBGS::NUMBT; - } -} - -static std::vector DBG_GetBranchTrace(void) -{ - std::vector ret; - BranchTraceResult tmp; - - for(unsigned x = 0; x < DBGS::NUMBT; x++) - { - char estr[32]; - const auto* bt = &DBG.BTEntries[DBG.ActiveCPU][(x + DBG.BTIndex[DBG.ActiveCPU]) % DBGS::NUMBT]; - - if(!bt->valid) - continue; - - tmp.count = bt->branch_count; - trio_snprintf(tmp.from, sizeof(tmp.from), "%08x", bt->from); - trio_snprintf(tmp.to, sizeof(tmp.to), "%08x", bt->to); - - trio_snprintf(estr, sizeof(estr), "UNK"); - - switch(bt->exception) - { - case -1: - estr[0] = 0; - break; - - case SH7095::EXCEPTION_POWERON: - trio_snprintf(estr, sizeof(estr), "PRST"); - break; - - case SH7095::EXCEPTION_RESET: - trio_snprintf(estr, sizeof(estr), "MRST"); - break; - - case SH7095::EXCEPTION_ILLINSTR: - trio_snprintf(estr, sizeof(estr), "ILL"); - break; - - case SH7095::EXCEPTION_ILLSLOT: - trio_snprintf(estr, sizeof(estr), "ILLS"); - break; - - case SH7095::EXCEPTION_CPUADDR: - trio_snprintf(estr, sizeof(estr), "CPUA"); - break; - - case SH7095::EXCEPTION_DMAADDR: - trio_snprintf(estr, sizeof(estr), "DMAA"); - break; - - case SH7095::EXCEPTION_NMI: - trio_snprintf(estr, sizeof(estr), "NMI"); - break; - - case SH7095::EXCEPTION_BREAK: - trio_snprintf(estr, sizeof(estr), "BRK"); - break; - - case SH7095::EXCEPTION_TRAP: - trio_snprintf(estr, sizeof(estr), "TRAP%02X", bt->vecnum); - break; - - case SH7095::EXCEPTION_INT: - trio_snprintf(estr, sizeof(estr), "INT%02X", bt->vecnum); - break; - } - - trio_snprintf(tmp.code, sizeof(tmp.code), "%s", estr); - - ret.push_back(tmp); - } - return(ret); -} - -template -static void DBG_CPUHandler(const sscpu_timestamp_t timestamp) -{ - const uint32 PC = CPU[which].GetRegister(SH7095::GSREG_PC_ID, NULL, 0); - - if(which != DBG.ActiveCPU) - { - DBG.CurPC[which] = PC; - return; - } - -#if 0 - if(LogFunc) - { - static const uint32 addr_mask[8] = { 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x7FFFFFFF, 0x1FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF }; - uint32 tpc = PC & addr_mask[PC >> 29];; - - if(MDFN_UNLIKELY(tpc <= 0xC0)) - { - if(tpc == 0xA0 || tpc == 0xB0 || tpc == 0xC0) - { - const uint32 function = CPU->GetRegister(PS_CPU::GSREG_GPR + 9, NULL, 0); - - if(tpc != 0xB0 || function != 0x17) - { - char tmp[64]; - trio_snprintf(tmp, sizeof(tmp), "0x%02x:0x%02x", PC & 0xFF, function); - LogFunc("BIOS", tmp); - } - } - } - } -#endif - - for(auto& bp : DBG.BreakPointsPC) - { - if(PC >= bp.A[0] && PC <= bp.A[1]) - { - DBG.FoundBPoint = true; - break; - } - } - - CPU[which].CheckRWBreakpoints(DBG_CheckReadBP, DBG_CheckWriteBP); - //CPU->CheckBreakpoints(CheckCPUBPCallB, CPU->PeekMem32(PC)); - - DBG.CPUHookContinuous |= DBG.FoundBPoint; - - if(DBG.CPUHookContinuous && DBG.CPUHook) - { - ForceEventUpdates(timestamp); - DBG.CPUHook(PC, DBG.FoundBPoint); - } - - DBG.FoundBPoint = false; - // - // - // No, no, this isn't right for dual-CPUs(FIXME): - DBG.CurPC[which] = CPU[which].GetRegister(SH7095::GSREG_PC_ID, NULL, 0); -} - - -static bool DBG_NeedCPUHooks(void) -{ - return DBG.BTEnabled || DBG.CPUHook || DBG.BreakPointsPC.size() || DBG.BreakPointsRead.size() || DBG.BreakPointsWrite.size(); -} - -// TODO: Standard peek functions -static INLINE uint16 DBG_DisPeek16(uint32 A) -{ - return *(uint16*)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + A); -} - -static INLINE uint32 DBG_DisPeek32(uint32 A) -{ - uint32 ret; - - ret = *(uint16*)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + A) << 16; - A |= 2; - ret |= *(uint16*)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + A) << 0; - - return ret; -} - -static void DBG_Disassemble(uint32 &A, uint32 SpecialA, char *TextBuf) -{ - if(A & 0x1) - { - strncpy(TextBuf, "UNALIGNED", 256); - A &= ~0x1; - } - else - { - uint16 instr; - - if(A == CPU[DBG.ActiveCPU].GetRegister(SH7095::GSREG_PC_ID, NULL, 0)) - instr = CPU[DBG.ActiveCPU].GetRegister(SH7095::GSREG_PID, NULL, 0); - else if(A == CPU[DBG.ActiveCPU].GetRegister(SH7095::GSREG_PC_IF, NULL, 0)) - instr = CPU[DBG.ActiveCPU].GetRegister(SH7095::GSREG_PIF, NULL, 0); - else - instr = DBG_DisPeek16(A); - - SH7095::Disassemble(instr, A + 4, TextBuf, DBG_DisPeek16, DBG_DisPeek32); - } - - char* tlc = TextBuf; - - while((uint8)*tlc != 0) - { - *tlc = tolower(*tlc); - tlc++; - } - - A += 2; -} - -static MDFN_COLD void DBG_ToggleSyntax(void) -{ - // Right, "syntax". ;) - DBG.ActiveCPU = !DBG.ActiveCPU; -} -// -// -// - -static const RegType DBG_Regs_CPU[] = -{ - { SH7095::GSREG_PC_ID, "PC", "PC (Effective)", 4 }, - { SH7095::GSREG_RPC, "RPC", "PC (Real)", 4 }, - - { SH7095::GSREG_PID, "PID", "Pipeline ID Buffer", 4 }, - { SH7095::GSREG_PIF, "PIF", "Pipeline IF Buffer", 4 }, - - { SH7095::GSREG_EP, "EP", "Exception Pending", 4 }, - - { SH7095::GSREG_R0, "R0", "R0", 4 }, - { SH7095::GSREG_R1, "R1", "R1", 4 }, - { SH7095::GSREG_R2, "R2", "R2", 4 }, - { SH7095::GSREG_R3, "R3", "R3", 4 }, - { SH7095::GSREG_R4, "R4", "R4", 4 }, - { SH7095::GSREG_R5, "R5", "R5", 4 }, - { SH7095::GSREG_R6, "R6", "R6", 4 }, - { SH7095::GSREG_R7, "R7", "R7", 4 }, - { SH7095::GSREG_R8, "R8", "R8", 4 }, - { SH7095::GSREG_R9, "R9", "R9", 4 }, - { SH7095::GSREG_R10, "R10", "R10", 4 }, - { SH7095::GSREG_R11, "R11", "R11", 4 }, - { SH7095::GSREG_R12, "R12", "R12", 4 }, - { SH7095::GSREG_R13, "R13", "R13", 4 }, - { SH7095::GSREG_R14, "R14", "R14", 4 }, - { SH7095::GSREG_R15, "R15", "R15/Stack Pointer", 4 }, - - { 0, "------", "", 0xFFFF }, - - { SH7095::GSREG_SR, "SR", "Status Register", 4 }, - { SH7095::GSREG_GBR, "GBR", "Global Base Register", 4 }, - { SH7095::GSREG_VBR, "VBR", "Vector Base Register", 4 }, - - { 0, "------", "", 0xFFFF }, - - { SH7095::GSREG_MACH, "MACH", "Multiply-and-Accumulate High", 4 }, - { SH7095::GSREG_MACL, "MACL", "Multiply-and-Accumulate Low", 4 }, - - { 0, "------", "", 0xFFFF }, - - { SH7095::GSREG_PR, "PR", "Procedure Register", 4 }, - - { 0, "------", "", 0xFFFF }, - - { SH7095::GSREG_NMIL, "NMIL", "NMI Level(Input)", 1 }, - { SH7095::GSREG_IRL, "IRL", "Interrupt Level(Input)", 1 }, - { SH7095::GSREG_IPRA, "IPRA", "IPRA", 2 }, - { SH7095::GSREG_IPRB, "IPRB", "IPRB", 2 }, - { SH7095::GSREG_VCRWDT, "VCRWDT", "VCRWDT", 2 }, - { SH7095::GSREG_VCRA, "VCRA", "VCRA", 2 }, - { SH7095::GSREG_VCRB, "VCRB", "VCRB", 2 }, - { SH7095::GSREG_VCRC, "VCRC", "VCRC", 2 }, - { SH7095::GSREG_VCRD, "VCRD", "VCRD", 2 }, - { SH7095::GSREG_ICR, "ICR", "ICR", 2 }, - - { 0, "------", "", 0xFFFF }, - - { SH7095::GSREG_DVSR, "DVSR", "Divisor", 4 }, - { SH7095::GSREG_DVDNT, "DVDNT", "DVDNT", 4 }, - { SH7095::GSREG_DVDNTH, "DVDNTH", "DVDNTH", 4 }, - { SH7095::GSREG_DVDNTL, "DVDNTL", "DVDNTL", 4 }, - { SH7095::GSREG_DVDNTHS, "DVDNTHS", "DVDNTH Shadow", 4 }, - { SH7095::GSREG_DVDNTLS, "DVDNTLS", "DVDNTL Shadow", 4 }, - { SH7095::GSREG_VCRDIV, "VCRDIV", "VCRDIV", 2 }, - { SH7095::GSREG_DVCR, "DVCR", "DVCR", 1 }, - - { 0, "------", "", 0xFFFF }, - - { SH7095::GSREG_WTCSR, "WTCSR", "WTCSR", 1 }, - { SH7095::GSREG_WTCSRM, "WTCSRM", "WTCSRM", 1 }, - { SH7095::GSREG_WTCNT, "WTCNT", "WTCNT", 1 }, - { SH7095::GSREG_RSTCSR, "RSTCSR", "RSTCSR", 1 }, - { SH7095::GSREG_RSTCSRM, "RSTCSRM", "RSTCSRM", 1 }, - - { 0, "", "", 0 }, -}; - -static const RegType DBG_Regs_CPUE[] = -{ - { SH7095::GSREG_DMAOR, "DMAOR", "DMAOR", 1 }, - { SH7095::GSREG_DMAORM, "DMAORM", "DMAORM", 1 }, - - { 0, "--DMACH0:--", "", 0xFFFF }, - { SH7095::GSREG_DMA0_SAR, "SAR", "SAR", 4 }, - { SH7095::GSREG_DMA0_DAR, "DAR", "DAR", 4 }, - { SH7095::GSREG_DMA0_TCR, "TCR", "TCR", 4 }, - { SH7095::GSREG_DMA0_CHCR, "CHCR", "CHCR", 2 }, - { SH7095::GSREG_DMA0_CHCRM, "CHCRM", "CHCRM", 2 }, - { SH7095::GSREG_DMA0_VCR, "VCR", "VCR", 1 }, - { SH7095::GSREG_DMA0_DRCR, "DRCR", "DRCR", 1 }, - - { 0, "--DMACH1:--", "", 0xFFFF }, - { SH7095::GSREG_DMA1_SAR, "SAR", "SAR", 4 }, - { SH7095::GSREG_DMA1_DAR, "DAR", "DAR", 4 }, - { SH7095::GSREG_DMA1_TCR, "TCR", "TCR", 4 }, - { SH7095::GSREG_DMA1_CHCR, "CHCR", "CHCR", 2 }, - { SH7095::GSREG_DMA1_CHCRM, "CHCRM", "CHCRM", 2 }, - { SH7095::GSREG_DMA1_VCR, "VCR", "VCR", 1 }, - { SH7095::GSREG_DMA1_DRCR, "DRCR", "DRCR", 1 }, - - { 0, "-----------", "", 0xFFFF }, - - { SH7095::GSREG_FRC, "FRC", "FRC", 2 }, - { SH7095::GSREG_OCR0, "OCRA", "OCRA", 2 }, - { SH7095::GSREG_OCR1, "OCRB", "OCRB", 2 }, - { SH7095::GSREG_FICR, "FICR", "FICR", 2 }, - { SH7095::GSREG_TIER, "TIER", "TIER", 1 }, - { SH7095::GSREG_FTCSR, "FTCSR", "FTCSR", 1 }, - { SH7095::GSREG_FTCSRM, "FTCSRM", "FTCSRM", 1 }, - { SH7095::GSREG_TCR, "TCR", "TCR", 1 }, - { SH7095::GSREG_TOCR, "TOCR", "TOCR", 1 }, - { SH7095::GSREG_RWT, "RWT", "R/W Temp", 1 }, - - { 0, "", "", 0 }, -}; - -static uint32 DBG_GetRegister_CPU(const unsigned int id, char* special, const uint32 special_len) -{ - return CPU[DBG.ActiveCPU].GetRegister(id, special, special_len); -} - -static MDFN_COLD void DBG_SetRegister_CPU(const unsigned int id, uint32 value) -{ - CPU[DBG.ActiveCPU].SetRegister(id, value); -} - -static const RegGroupType DBG_RegGroup_CPU = -{ - NULL, - DBG_Regs_CPU, - DBG_GetRegister_CPU, - DBG_SetRegister_CPU -}; - -static const RegGroupType DBG_RegGroup_CPUE = -{ - NULL, - DBG_Regs_CPUE, - DBG_GetRegister_CPU, - DBG_SetRegister_CPU -}; - - -static const RegType DBG_Regs_SCU[] = -{ - { SCU_GSREG_ILEVEL, "ILevel", "IRL Output to SH2-M", 1 }, - { SCU_GSREG_IVEC, "IVec", "Pending IRQ Vector Number", 1 }, - - { 0, "------", "", 0xFFFF }, - - { SCU_GSREG_IASSERTED, "IAss", "Status of Input IRQ Lines", 4 }, - { SCU_GSREG_IPENDING, "IPend", "Pending IRQs", 4 }, - { SCU_GSREG_IMASK, "IMask", "IRQ Mask", 2 }, - - { 0, "------", "", 0xFFFF }, - - { SCU_GSREG_TENBL, "TENBL", "Timers Enable", 0x100 | 1 }, - - { SCU_GSREG_T0CNT, "T0CNT", "Timer0 Counter", 0x100 | 10 }, - { SCU_GSREG_T0CMP, "T0CMP", "Timer0 Compare Value", 0x100 | 10 }, - { SCU_GSREG_T0MET, "T0MET", "Timer0 Met", 0x100 | 1 }, - - { SCU_GSREG_T1RLV, "T1RLV", "Timer1 Reload Value", 0x100 | 9 }, - { SCU_GSREG_T1CNT, "T1CNT", "Timer1 Counter", 0x100 | 9 }, - { SCU_GSREG_T1MOD, "T1MOD", "Timer1 Mode", 0x100 | 1 }, - { SCU_GSREG_T1MET, "T1MET", "Timer1 Met", 0x100 | 1 }, - - { 0, "--DSP:--", "", 0xFFFF }, - - { SCU_GSREG_DSP_EXEC, "EXEC", "Executing", 0x100 | 1 }, - { SCU_GSREG_DSP_PAUSE, "PAUSE", "Paused", 0x100 | 1 }, - { SCU_GSREG_DSP_PC, "PC", "Program Counter", 1 }, - { SCU_GSREG_DSP_END, "END", "End Flag", 0x100 | 1 }, - - { 0, "", "", 0 }, -}; - -static const RegGroupType DBG_RegGroup_SCU = -{ - NULL, - DBG_Regs_SCU, - SCU_GetRegister, - SCU_SetRegister -}; - -// -// - -static const RegType DBG_Regs_VDP1_VDP2_SCSP[] = -{ - { 0, "------", "", 0xFFFF }, - - { (1 << 16) | VDP2::GSREG_LINE, "Line", "Line", 2 }, - { (1 << 16) | VDP2::GSREG_DON, "DON", "Display On", 0x100 | 1 }, - { (1 << 16) | VDP2::GSREG_BM, "BM", "Border Mode", 0x100 | 1 }, - { (1 << 16) | VDP2::GSREG_IM, "IM", "Interlace Mode", 0x100 | 2 }, - { (1 << 16) | VDP2::GSREG_VRES, "VRES", "Vertical Resolution", 0x100 | 2 }, - { (1 << 16) | VDP2::GSREG_HRES, "HRES", "Horizontal Resolution", 0x100 | 3 }, - - { 0, "------", "", 0xFFFF }, - - { (2 << 16) | SS_SCSP::GSREG_MVOL, "MVOL", "Master Volume", 0x100 | 4 }, - { (2 << 16) | SS_SCSP::GSREG_DAC18B, "DAC18B", "18-bit DAC Enable", 0x100 | 1 }, - { (2 << 16) | SS_SCSP::GSREG_MEM4MB, "Mem4Mb", "4Mb Memory Enable", 0x100 | 1 }, - { (2 << 16) | SS_SCSP::GSREG_RBP, "RBP", "DSP Ringbuffer Base Address", 0x100 | 7 }, - { (2 << 16) | SS_SCSP::GSREG_RBL, "RBL", "DSP Ringbuffer Length", 0x100 | 2 }, - { (2 << 16) | SS_SCSP::GSREG_MSLC, "MSLC", "Slot to Monitor", 0x100 | 5 }, - - { 0, "", "", 0 }, -}; - -static uint32 VDP1_VDP2_SCSP_GetRegister(const unsigned id, char* const special, const uint32 special_len) -{ - switch(id >> 16) - { - case 0: return 0; //return VDP1::GetRegister((uint16)id, special, special_len); - case 1: return VDP2::GetRegister((uint16)id, special, special_len); - case 2: return SOUND_GetSCSPRegister((uint16)id, special, special_len); - } - - return 0; -} - -static void VDP1_VDP2_SCSP_SetRegister(const unsigned id, const uint32 value) -{ - switch(id >> 16) - { - case 0: break; //return VDP1::GetRegister((uint16)id, special, special_len); - case 1: VDP2::SetRegister((uint16)id, value); break; - case 2: SOUND_SetSCSPRegister((uint16)id, value); break; - } -} - -static const RegGroupType DBG_RegGroup_VDP1_VDP2_SCSP = -{ - NULL, - DBG_Regs_VDP1_VDP2_SCSP, - VDP1_VDP2_SCSP_GetRegister, - VDP1_VDP2_SCSP_SetRegister -}; - -// -// -// -static void DBG_Init(void) MDFN_COLD; -static void DBG_Init(void) -{ - DBG.ActiveCPU = 0; - DBG.BTEnabled = false; - - for(unsigned which = 0; which < 2; which++) - { - DBG.BTIndex[which] = 0; - - for(unsigned i = 0; i < DBGS::NUMBT; i++) - DBG.BTEntries[which][i].valid = false; - } - - DBG.CPUHook = NULL; - DBG.CPUHookContinuous = false; - DBG.FoundBPoint = false; - - MDFNDBG_AddRegGroup(&DBG_RegGroup_CPU); - MDFNDBG_AddRegGroup(&DBG_RegGroup_CPUE); - MDFNDBG_AddRegGroup(&DBG_RegGroup_SCU); - MDFNDBG_AddRegGroup(&DBG_RegGroup_VDP1_VDP2_SCSP); - // - // - // - ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "physical", "SH-2 Physical (TODO)", 27); - ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "workraml", "Low Work RAM", 20); - ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "workramh", "High Work RAM", 20); - ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "scspram", "SCSP RAM", 19); - - ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "dspprog", "DSP Program RAM", 10); - - ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "vdp1vram", "VDP1 VRAM", 19); - ASpace_Add(GetAddressSpaceBytes, PutAddressSpaceBytes, "vdp2vram", "VDP2 VRAM", 19); -} - -static DebuggerInfoStruct DBGInfo -{ - "SJIS", - - 2, - 2, - - 32, - 27, - - 0x06004000, - ~0U, - - DBG_MemPeek, - - DBG_Disassemble, - DBG_ToggleSyntax, - - NULL, - NULL, - - DBG_FlushBreakPoints, - DBG_AddBreakPoint, - DBG_SetCPUCallback, - - DBG_EnableBranchTrace, - DBG_GetBranchTrace, - - NULL, - NULL, - - NULL, - NULL, -}; -#else -template -static INLINE void DBG_CPUHandler(const sscpu_timestamp_t timestamp) { } -static INLINE void DBG_AddBranchTrace(unsigned which, uint32 to, int exception, unsigned vecnum = 0) { } -static INLINE bool DBG_NeedCPUHooks(void) { return false; } -static INLINE void DBG_Init(void) { } -#endif diff --git a/waterbox/ss/defs.h b/waterbox/ss/defs.h deleted file mode 100644 index 7e57298623..0000000000 --- a/waterbox/ss/defs.h +++ /dev/null @@ -1,113 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include -#include -#include - -typedef uint8_t uint8; -typedef uint16_t uint16; -typedef uint32_t uint32; -typedef uint64_t uint64; -typedef int8_t int8; -typedef int16_t int16; -typedef int32_t int32; -typedef int64_t int64; - -#define MDFN_FASTCALL -#define INLINE inline -#define MDFN_COLD -#define MDFN_HOT -#define NO_INLINE -#define NO_CLONE -#define MDFN_UNLIKELY(p) (p) -#define MDFN_LIKELY(p) (p) -//#define MDFN_ASSUME_ALIGNED(p, align) ((decltype(p))__builtin_assume_aligned((p), (align))) -#define MDFN_ASSUME_ALIGNED(p, align) (p) -#define trio_snprintf snprintf -#define trio_vprintf vprintf -#define trio_printf printf -#define trio_sprintf sprintf -#define TRUE true -#define FALSE false -#ifndef __alignas_is_defined -#define alignas(p) -#endif -#define override // remove for gcc 4.7 -#define final -#define gettext_noop(s) (s) -#define MDFN_MASTERCLOCK_FIXED(n) ((int64)((double)(n) * (1LL << 32))) - -typedef struct -{ - // Pitch(32-bit) must be equal to width and >= the "fb_width" specified in the MDFNGI struct for the emulated system. - // Height must be >= to the "fb_height" specified in the MDFNGI struct for the emulated system. - // The framebuffer pointed to by surface->pixels is written to by the system emulation code. - uint32 *pixels; - int pitch32; - - // Pointer to an array of int32, number of elements = fb_height, set by the driver code. Individual elements written - // to by system emulation code. If the emulated system doesn't support multiple screen widths per frame, or if you handle - // such a situation by outputting at a constant width-per-frame that is the least-common-multiple of the screen widths, then - // you can ignore this. If you do wish to use this, you must set all elements every frame. - int32 *LineWidths; - - // Pointer to sound buffer, set by the driver code, that the emulation code should render sound to. - int16 *SoundBuf; - - // Number of cycles that this frame consumed, using MDFNGI::MasterClock as a time base. - // Set by emulation code. - int64 MasterCycles; - - // Maximum size of the sound buffer, in frames. Set by the driver code. - int32 SoundBufMaxSize; - - // Number of frames currently in internal sound buffer. Set by the system emulation code, to be read by the driver code. - int32 SoundBufSize; - - // Set by the system emulation code every frame, to denote the horizontal and vertical offsets of the image, and the size - // of the image. If the emulated system sets the elements of LineWidths, then the width(w) of this structure - // is ignored while drawing the image. - int32 x, y, h; - - // Set(optionally) by emulation code. If InterlaceOn is true, then assume field height is 1/2 DisplayRect.h, and - // only every other line in surface (with the start line defined by InterlacedField) has valid data - // (it's up to internal Mednafen code to deinterlace it). - bool InterlaceOn; - bool InterlaceField; -} EmulateSpecStruct; - -#define MDFN_printf(...) -#define MDFN_PrintError(...) -#define MDFN_FORMATSTR(...) -#define require assert - -#include "endian.h" - -#include "math_ops.h" - -#include "../emulibc/emulibc.h" -#include "../emulibc/waterboxcore.h" - -extern int32 (*FirmwareSizeCallback)(const char *filename); -extern void (*FirmwareDataCallback)(const char *filename, uint8 *dest); - -extern int setting_ss_slstartp; -extern int setting_ss_slendp; -extern int setting_ss_slstart; -extern int setting_ss_slend; -extern int setting_ss_region_default; -extern int setting_ss_cart; -extern bool setting_ss_correct_aspect; -extern bool setting_ss_h_overscan; -extern bool setting_ss_h_blend; -extern bool setting_ss_region_autodetect; - -extern bool InputLagged; -extern void (*InputCallback)(); - -void AddMemoryDomain(const char* name, const void* ptr, int size, int flags); diff --git a/waterbox/ss/endian.h b/waterbox/ss/endian.h deleted file mode 100644 index e78a0c577f..0000000000 --- a/waterbox/ss/endian.h +++ /dev/null @@ -1,494 +0,0 @@ -/******************************************************************************/ -/* Mednafen - Multi-system Emulator */ -/******************************************************************************/ -/* endian.h: -** Copyright (C) 2006-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_ENDIAN_H -#define __MDFN_ENDIAN_H - -void Endian_A16_Swap(void *src, uint32 nelements); -void Endian_A32_Swap(void *src, uint32 nelements); -void Endian_A64_Swap(void *src, uint32 nelements); - -void Endian_A16_NE_LE(void *src, uint32 nelements); -void Endian_A32_NE_LE(void *src, uint32 nelements); -void Endian_A64_NE_LE(void *src, uint32 nelements); - -void Endian_A16_NE_BE(void *src, uint32 nelements); -void Endian_A32_NE_BE(void *src, uint32 nelements); -void Endian_A64_NE_BE(void *src, uint32 nelements); - -void Endian_V_NE_LE(void* p, size_t len); -void Endian_V_NE_BE(void* p, size_t len); - -// -// -// - -static INLINE uint32 BitsExtract(const uint8* ptr, const size_t bit_offset, const size_t bit_count) -{ - uint32 ret = 0; - - for(size_t x = 0; x < bit_count; x++) - { - size_t co = bit_offset + x; - bool b = (ptr[co >> 3] >> (co & 7)) & 1; - - ret |= (uint64)b << x; - } - - return ret; -} - -static INLINE void BitsIntract(uint8* ptr, const size_t bit_offset, const size_t bit_count, uint32 value) -{ - for(size_t x = 0; x < bit_count; x++) - { - size_t co = bit_offset + x; - bool b = (value >> x) & 1; - uint8 tmp = ptr[co >> 3]; - - tmp &= ~(1 << (co & 7)); - tmp |= b << (co & 7); - - ptr[co >> 3] = tmp; - } -} - -/* - Regarding safety of calling MDFN_*sb on dynamically-allocated memory with new uint8[], see C++ standard 3.7.3.1(i.e. it should be - safe provided the offsets into the memory are aligned/multiples of the MDFN_*sb access type). malloc()'d and calloc()'d - memory should be safe as well. - - Statically-allocated arrays/memory should be unioned with a big POD type or C++11 "alignas"'d. (May need to audit code to ensure - this is being done). -*/ - -static INLINE uint16 MDFN_bswap16(uint16 v) -{ - return (v << 8) | (v >> 8); -} - -static INLINE uint32 MDFN_bswap32(uint32 v) -{ - return (v << 24) | ((v & 0xFF00) << 8) | ((v >> 8) & 0xFF00) | (v >> 24); -} - -static INLINE uint64 MDFN_bswap64(uint64 v) -{ - return (v << 56) | (v >> 56) | ((v & 0xFF00) << 40) | ((v >> 40) & 0xFF00) | ((uint64)MDFN_bswap32(v >> 16) << 16); -} - -#ifdef LSB_FIRST - #define MDFN_ENDIANH_IS_BIGENDIAN 0 -#else - #define MDFN_ENDIANH_IS_BIGENDIAN 1 -#endif - -// -// X endian. -// -template -static INLINE T MDFN_deXsb(const void* ptr) -{ - T tmp; - - memcpy(&tmp, MDFN_ASSUME_ALIGNED(ptr, (aligned ? sizeof(T) : 1)), sizeof(T)); - - if(isbigendian != -1 && isbigendian != MDFN_ENDIANH_IS_BIGENDIAN) - { - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Gummy penguins."); - - if(sizeof(T) == 8) - return MDFN_bswap64(tmp); - else if(sizeof(T) == 4) - return MDFN_bswap32(tmp); - else if(sizeof(T) == 2) - return MDFN_bswap16(tmp); - } - - return tmp; -} - -// -// Native endian. -// -template -static INLINE T MDFN_densb(const void* ptr) -{ - return MDFN_deXsb<-1, T, aligned>(ptr); -} - -// -// Little endian. -// -template -static INLINE T MDFN_delsb(const void* ptr) -{ - return MDFN_deXsb<0, T, aligned>(ptr); -} - -template -static INLINE uint16 MDFN_de16lsb(const void* ptr) -{ - return MDFN_delsb(ptr); -} - -static INLINE uint32 MDFN_de24lsb(const void* ptr) -{ - const uint8* ptr_u8 = (const uint8*)ptr; - - return (ptr_u8[0] << 0) | (ptr_u8[1] << 8) | (ptr_u8[2] << 16); -} - -template -static INLINE uint32 MDFN_de32lsb(const void* ptr) -{ - return MDFN_delsb(ptr); -} - -template -static INLINE uint64 MDFN_de64lsb(const void* ptr) -{ - return MDFN_delsb(ptr); -} - -// -// Big endian. -// -template -static INLINE T MDFN_demsb(const void* ptr) -{ - return MDFN_deXsb<1, T, aligned>(ptr); -} - -template -static INLINE uint16 MDFN_de16msb(const void* ptr) -{ - return MDFN_demsb(ptr); -} - -static INLINE uint32 MDFN_de24msb(const void* ptr) -{ - const uint8* ptr_u8 = (const uint8*)ptr; - - return (ptr_u8[0] << 16) | (ptr_u8[1] << 8) | (ptr_u8[2] << 0); -} - -template -static INLINE uint32 MDFN_de32msb(const void* ptr) -{ - return MDFN_demsb(ptr); -} - -template -static INLINE uint64 MDFN_de64msb(const void* ptr) -{ - return MDFN_demsb(ptr); -} - -// -// -// -// -// -// -// -// - -// -// X endian. -// -template -static INLINE void MDFN_enXsb(void* ptr, T value) -{ - T tmp = value; - - if(isbigendian != -1 && isbigendian != MDFN_ENDIANH_IS_BIGENDIAN) - { - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Gummy penguins."); - - if(sizeof(T) == 8) - tmp = MDFN_bswap64(value); - else if(sizeof(T) == 4) - tmp = MDFN_bswap32(value); - else if(sizeof(T) == 2) - tmp = MDFN_bswap16(value); - } - - memcpy(MDFN_ASSUME_ALIGNED(ptr, (aligned ? sizeof(T) : 1)), &tmp, sizeof(T)); -} - -// -// Native endian. -// -template -static INLINE void MDFN_ennsb(void* ptr, T value) -{ - MDFN_enXsb<-1, T, aligned>(ptr, value); -} - -// -// Little endian. -// -template -static INLINE void MDFN_enlsb(void* ptr, T value) -{ - MDFN_enXsb<0, T, aligned>(ptr, value); -} - -template -static INLINE void MDFN_en16lsb(void* ptr, uint16 value) -{ - MDFN_enlsb(ptr, value); -} - -static INLINE void MDFN_en24lsb(void* ptr, uint32 value) -{ - uint8* ptr_u8 = (uint8*)ptr; - - ptr_u8[0] = value >> 0; - ptr_u8[1] = value >> 8; - ptr_u8[2] = value >> 16; -} - -template -static INLINE void MDFN_en32lsb(void* ptr, uint32 value) -{ - MDFN_enlsb(ptr, value); -} - -template -static INLINE void MDFN_en64lsb(void* ptr, uint64 value) -{ - MDFN_enlsb(ptr, value); -} - - -// -// Big endian. -// -template -static INLINE void MDFN_enmsb(void* ptr, T value) -{ - MDFN_enXsb<1, T, aligned>(ptr, value); -} - -template -static INLINE void MDFN_en16msb(void* ptr, uint16 value) -{ - MDFN_enmsb(ptr, value); -} - -static INLINE void MDFN_en24msb(void* ptr, uint32 value) -{ - uint8* ptr_u8 = (uint8*)ptr; - - ptr_u8[0] = value >> 16; - ptr_u8[1] = value >> 8; - ptr_u8[2] = value >> 0; -} - -template -static INLINE void MDFN_en32msb(void* ptr, uint32 value) -{ - MDFN_enmsb(ptr, value); -} - -template -static INLINE void MDFN_en64msb(void* ptr, uint64 value) -{ - MDFN_enmsb(ptr, value); -} - - -// -// -// -// -// -// - -template -static INLINE uint8* ne16_ptr_be(BT* const base, const size_t byte_offset) -{ -#ifdef MSB_FIRST - return (uint8*)base + (byte_offset &~ (sizeof(T) - 1)); -#else - return (uint8*)base + (((byte_offset &~ (sizeof(T) - 1)) ^ (2 - std::min(2, sizeof(T))))); -#endif -} - -template -static INLINE void ne16_wbo_be(uint16* const base, const size_t byte_offset, const T value) -{ - uint8* const ptr = ne16_ptr_be(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - if(sizeof(T) == 4) - { - uint16* const ptr16 = (uint16*)ptr; - - ptr16[0] = value >> 16; - ptr16[1] = value; - } - else - *(T*)ptr = value; -} - -template -static INLINE T ne16_rbo_be(const uint16* const base, const size_t byte_offset) -{ - uint8* const ptr = ne16_ptr_be(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - if(sizeof(T) == 4) - { - uint16* const ptr16 = (uint16*)ptr; - T tmp; - - tmp = ptr16[0] << 16; - tmp |= ptr16[1]; - - return tmp; - } - else - return *(T*)ptr; -} - -template -static INLINE void ne16_rwbo_be(uint16* const base, const size_t byte_offset, T* value) -{ - if(IsWrite) - ne16_wbo_be(base, byte_offset, *value); - else - *value = ne16_rbo_be(base, byte_offset); -} - -// -// -// - -template -static INLINE uint8* ne16_ptr_le(BT* const base, const size_t byte_offset) -{ -#ifdef LSB_FIRST - return (uint8*)base + (byte_offset &~ (sizeof(T) - 1)); -#else - return (uint8*)base + (((byte_offset &~ (sizeof(T) - 1)) ^ (2 - std::min(2, sizeof(T))))); -#endif -} - -template -static INLINE void ne16_wbo_le(uint16* const base, const size_t byte_offset, const T value) -{ - uint8* const ptr = ne16_ptr_le(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - if(sizeof(T) == 4) - { - uint16* const ptr16 = (uint16*)ptr; - - ptr16[0] = value; - ptr16[1] = value >> 16; - } - else - *(T*)ptr = value; -} - -template -static INLINE T ne16_rbo_le(const uint16* const base, const size_t byte_offset) -{ - uint8* const ptr = ne16_ptr_le(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - if(sizeof(T) == 4) - { - uint16* const ptr16 = (uint16*)ptr; - T tmp; - - tmp = ptr16[0]; - tmp |= ptr16[1] << 16; - - return tmp; - } - else - return *(T*)ptr; -} - - -template -static INLINE void ne16_rwbo_le(uint16* const base, const size_t byte_offset, T* value) -{ - if(IsWrite) - ne16_wbo_le(base, byte_offset, *value); - else - *value = ne16_rbo_le(base, byte_offset); -} - -// -// -// -template -static INLINE uint8* ne64_ptr_be(uint64* const base, const size_t byte_offset) -{ -#ifdef MSB_FIRST - return (uint8*)base + (byte_offset &~ (sizeof(T) - 1)); -#else - return (uint8*)base + (((byte_offset &~ (sizeof(T) - 1)) ^ (8 - sizeof(T)))); -#endif -} - -template -static INLINE void ne64_wbo_be(uint64* const base, const size_t byte_offset, const T value) -{ - uint8* const ptr = ne64_ptr_be(base, byte_offset); - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4 || sizeof(T) == 8, "Unsupported type size"); - - memcpy(MDFN_ASSUME_ALIGNED(ptr, sizeof(T)), &value, sizeof(T)); -} - -template -static INLINE T ne64_rbo_be(uint64* const base, const size_t byte_offset) -{ - uint8* const ptr = ne64_ptr_be(base, byte_offset); - T ret; - - static_assert(sizeof(T) == 1 || sizeof(T) == 2 || sizeof(T) == 4, "Unsupported type size"); - - memcpy(&ret, MDFN_ASSUME_ALIGNED(ptr, sizeof(T)), sizeof(T)); - - return ret; -} - -template -static INLINE void ne64_rwbo_be(uint64* const base, const size_t byte_offset, T* value) -{ - if(IsWrite) - ne64_wbo_be(base, byte_offset, *value); - else - *value = ne64_rbo_be(base, byte_offset); -} - -#endif diff --git a/waterbox/ss/input/3dpad.cpp b/waterbox/ss/input/3dpad.cpp deleted file mode 100644 index 04c489ec88..0000000000 --- a/waterbox/ss/input/3dpad.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* 3dpad.cpp: -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "3dpad.h" - -namespace MDFN_IEN_SS -{ - -IODevice_3DPad::IODevice_3DPad() : dbuttons(0), mode(false) -{ - -} - -IODevice_3DPad::~IODevice_3DPad() -{ - -} - -void IODevice_3DPad::Power(void) -{ - phase = -1; - tl = true; - data_out = 0x01; -} - -void IODevice_3DPad::UpdateInput(const uint8 *data, const int32 time_elapsed) -{ - const uint16 dtmp = MDFN_de16lsb(&data[0]); - - dbuttons = (dbuttons & 0x8800) | (dtmp & 0x0FFF); - mode = (bool)(dtmp & 0x1000); - - thumb[0] = data[2]; - thumb[1] = data[3]; - shoulder[0] = data[4]; - shoulder[1] = data[5]; - - for (unsigned w = 0; w < 2; w++) - { - // May not be right for digital mode, but shouldn't matter too much: - if (shoulder[w] <= 0x55) - dbuttons &= ~(0x0800 << (w << 2)); - else if (shoulder[w] >= 0x8E) - dbuttons |= 0x0800 << (w << 2); - } -} - -uint8 IODevice_3DPad::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) -{ - uint8 tmp; - - if(smpc_out & 0x40) - { - phase = -1; - tl = true; - data_out = 0x01; - } - else - { - if((bool)(smpc_out & 0x20) != tl) - { - if(phase < 15) - { - tl = !tl; - phase++; - } - - if(!phase) - { - if(mode) - { - buffer[ 0] = 0x1; - buffer[ 1] = 0x6; - buffer[ 2] = (((dbuttons >> 0) & 0xF) ^ 0xF); - buffer[ 3] = (((dbuttons >> 4) & 0xF) ^ 0xF); - buffer[ 4] = (((dbuttons >> 8) & 0xF) ^ 0xF); - buffer[ 5] = (((dbuttons >> 12) & 0xF) ^ 0xF); - buffer[ 6] = (thumb[0] >> 4) & 0xF; - buffer[ 7] = (thumb[0] >> 0) & 0xF; - buffer[ 8] = (thumb[1] >> 4) & 0xF; - buffer[ 9] = (thumb[1] >> 0) & 0xF; - buffer[10] = (shoulder[0] >> 4) & 0xF; - buffer[11] = (shoulder[0] >> 0) & 0xF; - buffer[12] = (shoulder[1] >> 4) & 0xF; - buffer[13] = (shoulder[1] >> 0) & 0xF; - buffer[14] = 0x0; - buffer[15] = 0x1; - } - else - { - phase = 8; - buffer[ 8] = 0x0; - buffer[ 9] = 0x2; - buffer[10] = (((dbuttons >> 0) & 0xF) ^ 0xF); - buffer[11] = (((dbuttons >> 4) & 0xF) ^ 0xF); - buffer[12] = (((dbuttons >> 8) & 0xF) ^ 0xF); - buffer[13] = (((dbuttons >> 12) & 0xF) ^ 0xF); - buffer[14] = 0x0; - buffer[15] = 0x1; - } - } - - data_out = buffer[phase]; - } - } - - tmp = (tl << 4) | data_out; - - return (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted); -} - -} diff --git a/waterbox/ss/input/3dpad.h b/waterbox/ss/input/3dpad.h deleted file mode 100644 index 0eea5a60d3..0000000000 --- a/waterbox/ss/input/3dpad.h +++ /dev/null @@ -1,53 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* 3dpad.h: -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_INPUT_3DPAD_H -#define __MDFN_SS_INPUT_3DPAD_H - -namespace MDFN_IEN_SS -{ - -class IODevice_3DPad final : public IODevice -{ - public: - IODevice_3DPad() MDFN_COLD; - virtual ~IODevice_3DPad() override MDFN_COLD; - - virtual void Power(void) override MDFN_COLD; - virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override; - - virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override; - - private: - uint16 dbuttons; - uint8 thumb[2]; - uint8 shoulder[2]; - - uint8 buffer[0x10]; - uint8 data_out; - bool tl; - int8 phase; - bool mode; -}; - -} - -#endif diff --git a/waterbox/ss/input/common.h b/waterbox/ss/input/common.h deleted file mode 100644 index e868193d45..0000000000 --- a/waterbox/ss/input/common.h +++ /dev/null @@ -1,2 +0,0 @@ -#include "../ss.h" -#include "../smpc.h" diff --git a/waterbox/ss/input/gamepad.cpp b/waterbox/ss/input/gamepad.cpp deleted file mode 100644 index 80e3560242..0000000000 --- a/waterbox/ss/input/gamepad.cpp +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* gamepad.cpp - Digital Gamepad Emulation -** Copyright (C) 2015-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "gamepad.h" - -namespace MDFN_IEN_SS -{ - -IODevice_Gamepad::IODevice_Gamepad() : buttons(~3) -{ - -} - -IODevice_Gamepad::~IODevice_Gamepad() -{ - -} - -void IODevice_Gamepad::Power(void) -{ - -} - -void IODevice_Gamepad::UpdateInput(const uint8* data, const int32 time_elapsed) -{ - buttons = (~(data[0] | (data[1] << 8))) &~ 0x3000; -} - -uint8 IODevice_Gamepad::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) -{ - uint8 tmp; - - tmp = (buttons >> ((smpc_out >> 5) << 2)) & 0xF; - - return 0x10 | (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted); -} - -} diff --git a/waterbox/ss/input/gamepad.h b/waterbox/ss/input/gamepad.h deleted file mode 100644 index 99a856c487..0000000000 --- a/waterbox/ss/input/gamepad.h +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* gamepad.h: -** Copyright (C) 2015-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_INPUT_GAMEPAD_H -#define __MDFN_SS_INPUT_GAMEPAD_H - -namespace MDFN_IEN_SS -{ - -class IODevice_Gamepad final : public IODevice -{ - public: - IODevice_Gamepad() MDFN_COLD; - virtual ~IODevice_Gamepad() override MDFN_COLD; - - virtual void Power(void) override MDFN_COLD; - virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override; - - virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override; - - private: - uint16 buttons; -}; - -} - -#endif diff --git a/waterbox/ss/input/keyboard.cpp b/waterbox/ss/input/keyboard.cpp deleted file mode 100644 index a5aaf6aa3b..0000000000 --- a/waterbox/ss/input/keyboard.cpp +++ /dev/null @@ -1,231 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* keyboard.cpp: -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// TODO: Debouncing? - -// -// PS/2 keyboard adapter seems to do PS/2 processing near/at the end of a Saturn-side read sequence, which creates about 1 frame of extra latency -// in practice. We handle things a bit differently here, to avoid the latency. -// -// Also, the PS/2 adapter seems to set the typematic delay to around 250ms, but we emulate it here as 400ms, as 250ms is -// a tad bit too short. It can be changed to 250ms by adjusting a single #if statement, though. -// -// During testing, a couple of early-1990s PS/2 keyboards malfunctioned and failed to work with the PS/2 adapter. -// Not sure why, maybe a power draw issue? -// -// The keyboard emulated doesn't have special Windows-keyboard keys, as they don't appear to work correctly with the PS/2 adapter -// (scancode field is updated, but no make nor break bits are set to 1), and it's good to have some non-shared keys for input grabbing toggling purposes... -// -// - -// make and break bits should not both be set to 1 at the same time. -// pause is special -// new key press halts repeat of held key, and it doesn't restart even if new key is released. -// - -#include "common.h" -#include "keyboard.h" - -namespace MDFN_IEN_SS -{ - -IODevice_Keyboard::IODevice_Keyboard() : phys{0,0,0,0} -{ - -} - -IODevice_Keyboard::~IODevice_Keyboard() -{ - -} - -void IODevice_Keyboard::Power(void) -{ - phase = -1; - tl = true; - data_out = 0x01; - - simbutt = simbutt_pend = 0; - lock = lock_pend = 0; - - mkbrk_pend = 0; - memset(buffer, 0, sizeof(buffer)); - - //memcpy(processed, phys, sizeof(processed)); - memset(processed, 0, sizeof(processed)); - memset(fifo, 0, sizeof(fifo)); - fifo_rdp = 0; - fifo_wrp = 0; - fifo_cnt = 0; - - rep_sc = -1; - rep_dcnt = 0; -} - -void IODevice_Keyboard::UpdateInput(const uint8* data, const int32 time_elapsed) -{ - phys[0] = MDFN_de64lsb(&data[0x00]); - phys[1] = MDFN_de64lsb(&data[0x08]); - phys[2] = MDFN_de16lsb(&data[0x10]); - phys[3] = 0; - // - if(rep_dcnt > 0) - rep_dcnt -= time_elapsed; - - for(unsigned i = 0; i < 4; i++) - { - uint64 tmp = phys[i] ^ processed[i]; - unsigned bp; - - while((bp = (63 ^ MDFN_lzcount64(tmp))) < 64) - { - const uint64 mask = ((uint64)1 << bp); - const int sc = ((i << 6) + bp); - - if(fifo_cnt >= (fifo_size - (sc == 0x82))) - goto fifo_oflow_abort; - - if(phys[i] & mask) - { - rep_sc = sc; -#if 1 - rep_dcnt = 400000; -#else - rep_dcnt = 250000; -#endif - fifo[fifo_wrp] = 0x800 | sc; - fifo_wrp = (fifo_wrp + 1) % fifo_size; - fifo_cnt++; - } - - if(!(phys[i] & mask) == (sc != 0x82)) - { - if(rep_sc == sc) - rep_sc = -1; - - fifo[fifo_wrp] = 0x100 | sc; - fifo_wrp = (fifo_wrp + 1) % fifo_size; - fifo_cnt++; - } - - processed[i] = (processed[i] & ~mask) | (phys[i] & mask); - tmp &= ~mask; - } - } - - if(rep_sc >= 0) - { - while(rep_dcnt <= 0) - { - if(fifo_cnt >= fifo_size) - goto fifo_oflow_abort; - - fifo[fifo_wrp] = 0x800 | rep_sc; - fifo_wrp = (fifo_wrp + 1) % fifo_size; - fifo_cnt++; - - rep_dcnt += 33333; - } - } - - fifo_oflow_abort:; -} - -void IODevice_Keyboard::UpdateOutput(uint8* data) -{ - data[0x12] = lock; -} - -uint8 IODevice_Keyboard::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) -{ - if(smpc_out & 0x40) - { - phase = -1; - tl = true; - data_out = 0x01; - } - else - { - if((bool)(smpc_out & 0x20) != tl) - { - tl = !tl; - phase += (phase < 11); - - if(!phase) - { - if(mkbrk_pend == (uint8)mkbrk_pend && fifo_cnt) - { - mkbrk_pend = fifo[fifo_rdp]; - fifo_rdp = (fifo_rdp + 1) % fifo_size; - fifo_cnt--; - - bool p = mkbrk_pend & 0x800; - - switch(mkbrk_pend & 0xFF) - { - case 0x89: /* Up */ simbutt_pend = simbutt & ~(1 << 0); simbutt_pend &= ~(p << 1); simbutt_pend |= (p << 0); break; - case 0x8A: /*Down */ simbutt_pend = simbutt & ~(1 << 1); simbutt_pend &= ~(p << 0); simbutt_pend |= (p << 1); break; - case 0x86: /*Left */ simbutt_pend = simbutt & ~(1 << 2); simbutt_pend &= ~(p << 3); simbutt_pend |= (p << 2); break; - case 0x8D: /*Right*/ simbutt_pend = simbutt & ~(1 << 3); simbutt_pend &= ~(p << 2); simbutt_pend |= (p << 3); break; - case 0x22: /* X */ simbutt_pend = simbutt & ~(1 << 4); simbutt_pend |= (p << 4); break; - case 0x21: /* C */ simbutt_pend = simbutt & ~(1 << 5); simbutt_pend |= (p << 5); break; - case 0x1A: /* Z */ simbutt_pend = simbutt & ~(1 << 6); simbutt_pend |= (p << 6); break; - case 0x76: /* Esc */ simbutt_pend = simbutt & ~(1 << 7); simbutt_pend |= (p << 7); break; - case 0x23: /* D */ simbutt_pend = simbutt & ~(1 << 8); simbutt_pend |= (p << 8); break; - case 0x1B: /* S */ simbutt_pend = simbutt & ~(1 << 9); simbutt_pend |= (p << 9); break; - case 0x1C: /* A */ simbutt_pend = simbutt & ~(1 << 10); simbutt_pend |= (p << 10); break; - case 0x24: /* E */ simbutt_pend = simbutt & ~(1 << 11); simbutt_pend |= (p << 11); break; - case 0x15: /* Q */ simbutt_pend = simbutt & ~(1 << 15); simbutt_pend |= (p << 15); break; - - case 0x7E: /* Scrl */ lock_pend = lock ^ (p ? LOCK_SCROLL : 0); break; - case 0x77: /* Num */ lock_pend = lock ^ (p ? LOCK_NUM : 0); break; - case 0x58: /* Caps */ lock_pend = lock ^ (p ? LOCK_CAPS : 0); break; - } - } - buffer[ 0] = 0x3; - buffer[ 1] = 0x4; - buffer[ 2] = (((simbutt_pend >> 0) ^ 0xF) & 0xF); - buffer[ 3] = (((simbutt_pend >> 4) ^ 0xF) & 0xF); - buffer[ 4] = (((simbutt_pend >> 8) ^ 0xF) & 0xF); - buffer[ 5] = (((simbutt_pend >> 12) ^ 0xF) & 0x8) | 0x0; - buffer[ 6] = lock_pend; - buffer[ 7] = ((mkbrk_pend >> 8) & 0xF) | 0x6; - buffer[ 8] = (mkbrk_pend >> 4) & 0xF; - buffer[ 9] = (mkbrk_pend >> 0) & 0xF; - buffer[10] = 0x0; - buffer[11] = 0x1; - } - - if(phase == 9) - { - mkbrk_pend = (uint8)mkbrk_pend; - lock = lock_pend; - simbutt = simbutt_pend; - } - - data_out = buffer[phase]; - } - } - - return (smpc_out & (smpc_out_asserted | 0xE0)) | (((tl << 4) | data_out) &~ smpc_out_asserted); -} - -} diff --git a/waterbox/ss/input/keyboard.h b/waterbox/ss/input/keyboard.h deleted file mode 100644 index f6b756ba06..0000000000 --- a/waterbox/ss/input/keyboard.h +++ /dev/null @@ -1,72 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* keyboard.h: -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_INPUT_KEYBOARD_H -#define __MDFN_SS_INPUT_KEYBOARD_H - -namespace MDFN_IEN_SS -{ - -class IODevice_Keyboard final : public IODevice -{ - public: - IODevice_Keyboard() MDFN_COLD; - virtual ~IODevice_Keyboard() override MDFN_COLD; - - virtual void Power(void) override MDFN_COLD; - virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override; - virtual void UpdateOutput(uint8* data) override; - - virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override; - - private: - - uint64 phys[4]; - uint64 processed[4]; - uint8 lock; - uint8 lock_pend; - uint16 simbutt; - uint16 simbutt_pend; - enum { fifo_size = 16 }; - uint16 fifo[fifo_size]; - uint8 fifo_rdp; - uint8 fifo_wrp; - uint8 fifo_cnt; - enum - { - LOCK_SCROLL = 0x01, - LOCK_NUM = 0x02, - LOCK_CAPS = 0x04 - }; - - int16 rep_sc; - int32 rep_dcnt; - - int16 mkbrk_pend; - uint8 buffer[12]; - uint8 data_out; - bool tl; - int8 phase; -}; - -} - -#endif diff --git a/waterbox/ss/input/mission.cpp b/waterbox/ss/input/mission.cpp deleted file mode 100644 index 8416399a90..0000000000 --- a/waterbox/ss/input/mission.cpp +++ /dev/null @@ -1,160 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* mission.cpp: -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* - Real mission stick has bugs and quirks that aren't emulated here(like apparently latching/updating the physical input state at the end of the - read sequence instead of near the beginning like other controllers do, resulting in increased latency). -*/ - - -#include "common.h" -#include "mission.h" - -namespace MDFN_IEN_SS -{ - -IODevice_Mission::IODevice_Mission(const bool dual_) : dbuttons(0), afeswitches(0), afspeed(0), dual(dual_) -{ - -} - -IODevice_Mission::~IODevice_Mission() -{ - -} - -void IODevice_Mission::Power(void) -{ - phase = -1; - tl = true; - data_out = 0x01; - - // Power-on state not tested: - afcounter = 0; - afphase = false; -} - -void IODevice_Mission::UpdateInput(const uint8 *data, const int32 time_elapsed) -{ - const uint32 dtmp = MDFN_de32lsb(&data[0]); - - dbuttons = (dbuttons & 0xF) | ((dtmp & 0xFFF) << 4); - afeswitches = ((dtmp >> 12) & 0x8FF) << 4; - afspeed = (dtmp >> 20) & 0x7; - - int offs = 4; - for (unsigned stick = 0; stick < (dual ? 2 : 1); stick++) - { - for (unsigned axis = 0; axis < 3; axis++) - { - axes[stick][axis] = data[offs++]; - } - } - - //printf("Update: %02x %02x %02x\n", axes[0][0], axes[0][1], axes[0][2]); -} - -uint8 IODevice_Mission::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) -{ - uint8 tmp; - - if(smpc_out & 0x40) - { - phase = -1; - tl = true; - data_out = 0x01; - } - else - { - if((bool)(smpc_out & 0x20) != tl) - { - if(phase < (dual ? 21 : 13)) - { - tl = !tl; - phase++; - } - - if(!phase) - { - unsigned dbaf = dbuttons & ((afphase - 1) | ~afeswitches); - unsigned c = 0; - - // Digital Left - dbuttons |= ((axes[0][0] <= 0x56) ? 0x4 : 0); - dbuttons &= ~((axes[0][0] >= 0x6C) ? 0x4 : 0); - - // Digital Right - dbuttons |= ((axes[0][0] >= 0xAB) ? 0x8 : 0); - dbuttons &= ~((axes[0][0] <= 0x95) ? 0x8 : 0); - - // Digital Up - dbuttons |= ((axes[0][1] <= 0x54) ? 0x1 : 0); - dbuttons &= ~((axes[0][1] >= 0x6A) ? 0x1 : 0); - - // Digital Down - dbuttons |= ((axes[0][1] >= 0xA9) ? 0x2 : 0); - dbuttons &= ~((axes[0][1] <= 0x94) ? 0x2 : 0); - - if(!afcounter) - { - static const uint8 speedtab[7] = { 12, 8, 7, 5, 4, 4/* ? */, 1 }; - afphase = !afphase; - afcounter = speedtab[afspeed]; - } - afcounter--; - - buffer[c++] = 0x1; - buffer[c++] = dual ? 0x9 : 0x5; - buffer[c++] = (((dbaf >> 0) & 0xF) ^ 0xF); - buffer[c++] = (((dbaf >> 4) & 0xF) ^ 0xF); - buffer[c++] = (((dbaf >> 8) & 0xF) ^ 0xF); - buffer[c++] = (((dbaf >> 12) & 0xF) ^ 0xF); - - for(unsigned stick = 0; stick < (dual ? 2 : 1); stick++) - { - if(stick) - { - // Not sure, looks like something buggy. - buffer[c++] = 0x0; - buffer[c++] = 0x0; - } - - buffer[c++] = (axes[stick][0] >> 4) & 0xF; - buffer[c++] = (axes[stick][0] >> 0) & 0xF; - buffer[c++] = (axes[stick][1] >> 4) & 0xF; - buffer[c++] = (axes[stick][1] >> 0) & 0xF; - buffer[c++] = (axes[stick][2] >> 4) & 0xF; - buffer[c++] = (axes[stick][2] >> 0) & 0xF; - } - buffer[c++] = 0x0; - buffer[c++] = 0x1; - } - - data_out = buffer[phase]; - } - } - - tmp = (tl << 4) | data_out; - - return (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted); -} - -} diff --git a/waterbox/ss/input/mission.h b/waterbox/ss/input/mission.h deleted file mode 100644 index 0f2bf648dc..0000000000 --- a/waterbox/ss/input/mission.h +++ /dev/null @@ -1,58 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* mission.h: -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_INPUT_MISSION_H -#define __MDFN_SS_INPUT_MISSION_H - -namespace MDFN_IEN_SS -{ - -class IODevice_Mission final : public IODevice -{ - public: - IODevice_Mission(const bool dual_) MDFN_COLD; - virtual ~IODevice_Mission() override MDFN_COLD; - - virtual void Power(void) override MDFN_COLD; - virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override; - - virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override; - - private: - uint16 dbuttons; - uint16 afeswitches; - uint8 afspeed; - - uint8 axes[2][3]; - - uint8 buffer[0x20]; - uint8 data_out; - bool tl; - int8 phase; - uint8 afcounter; - bool afphase; - - const bool dual; -}; - -} - -#endif diff --git a/waterbox/ss/input/mouse.cpp b/waterbox/ss/input/mouse.cpp deleted file mode 100644 index e56e61f3a5..0000000000 --- a/waterbox/ss/input/mouse.cpp +++ /dev/null @@ -1,131 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* mouse.cpp: -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "mouse.h" - -namespace MDFN_IEN_SS -{ - -IODevice_Mouse::IODevice_Mouse() : buttons(0) -{ - -} - -IODevice_Mouse::~IODevice_Mouse() -{ - -} - -void IODevice_Mouse::Power(void) -{ - phase = -1; - tl = true; - data_out = 0x00; - accum_xdelta = 0; - accum_ydelta = 0; -} - -void IODevice_Mouse::UpdateInput(const uint8* data, const int32 time_elapsed) -{ - accum_xdelta += data[1]; - accum_ydelta -= data[2]; - buttons = data[0] & 0xF; -} - -uint8 IODevice_Mouse::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) -{ - uint8 tmp; - - if(smpc_out & 0x40) - { - if(smpc_out & 0x20) - { - if(!tl) - accum_xdelta = accum_ydelta = 0; - - phase = -1; - tl = true; - data_out = 0x00; - } - else - { - if(tl) - tl = false; - } - } - else - { - if(phase < 0) - { - uint8 flags = 0; - - if(accum_xdelta < 0) - flags |= 0x1; - - if(accum_ydelta < 0) - flags |= 0x2; - - if(accum_xdelta > 255 || accum_xdelta < -256) - { - flags |= 0x4; - accum_xdelta = (accum_xdelta < 0) ? -256 : 255; - } - - if(accum_ydelta > 255 || accum_ydelta < -256) - { - flags |= 0x8; - accum_ydelta = (accum_ydelta < 0) ? -256 : 255; - } - - buffer[0] = 0xB; - buffer[1] = 0xF; - buffer[2] = 0xF; - buffer[3] = flags; - buffer[4] = buttons; - buffer[5] = (accum_xdelta >> 4) & 0xF; - buffer[6] = (accum_xdelta >> 0) & 0xF; - buffer[7] = (accum_ydelta >> 4) & 0xF; - buffer[8] = (accum_ydelta >> 0) & 0xF; - - for(int i = 9; i < 16; i++) - buffer[i] = buffer[8]; - - phase++; - } - - if((bool)(smpc_out & 0x20) != tl) - { - phase = (phase + 1) & 0xF; - tl = !tl; - - if(phase == 8) - accum_xdelta = accum_ydelta = 0; - } - data_out = buffer[phase]; - } - - tmp = (tl << 4) | data_out; - - return (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted); -} - -} diff --git a/waterbox/ss/input/mouse.h b/waterbox/ss/input/mouse.h deleted file mode 100644 index aa434b7943..0000000000 --- a/waterbox/ss/input/mouse.h +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* mouse.h: -** Copyright (C) 2016-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_INPUT_MOUSE_H -#define __MDFN_SS_INPUT_MOUSE_H - -namespace MDFN_IEN_SS -{ - -class IODevice_Mouse final : public IODevice -{ - public: - IODevice_Mouse() MDFN_COLD; - virtual ~IODevice_Mouse() override MDFN_COLD; - - virtual void Power(void) override MDFN_COLD; - virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override; - - virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override; - - private: - int32 accum_xdelta; - int32 accum_ydelta; - - uint8 buttons; - uint8 buffer[0x10]; - uint8 data_out; - bool tl; - int8 phase; -}; - -} - -#endif diff --git a/waterbox/ss/input/multitap.cpp b/waterbox/ss/input/multitap.cpp deleted file mode 100644 index e8fb3e7fdd..0000000000 --- a/waterbox/ss/input/multitap.cpp +++ /dev/null @@ -1,209 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* multitap.cpp: -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "multitap.h" - -namespace MDFN_IEN_SS -{ - -IODevice_Multitap::IODevice_Multitap() -{ - -} - -IODevice_Multitap::~IODevice_Multitap() -{ - -} - -void IODevice_Multitap::Power(void) -{ - phase = -2; - tl = true; - data_out = 0x01; - - memset(tmp, 0x00, sizeof(tmp)); - id1 = 0; - id2 = 0; - port_counter = 0; - read_counter = 0; - - for(unsigned i = 0; i < 6; i++) - { - if(devices[i]) - { - sub_state[i] = 0x60; - devices[i]->UpdateBus(sub_state[i], 0x60); - devices[i]->Power(); - } - } -} - -void IODevice_Multitap::SetSubDevice(unsigned sub_index, IODevice* device) -{ - assert(sub_index < 6); - devices[sub_index] = device; - devices[sub_index]->UpdateBus(sub_state[sub_index], 0x60); -} - -IODevice* IODevice_Multitap::GetSubDevice(unsigned sub_index) -{ - assert(sub_index < 6); - - return devices[sub_index]; -} - -enum { PhaseBias = __COUNTER__ + 1 }; - -#define WAIT_UNTIL(cond) { \ - case __COUNTER__: \ - if(!(cond)) \ - { \ - phase = __COUNTER__ - PhaseBias - 1; \ - goto BreakOut; \ - } \ - } - -#define WR_NYB(v) { WAIT_UNTIL((bool)(smpc_out & 0x20) != tl); data_out = (v) & 0xF; tl = !tl; } - - -INLINE uint8 IODevice_Multitap::UASB(void) -{ - return devices[port_counter]->UpdateBus(sub_state[port_counter], 0x60); -} - -uint8 IODevice_Multitap::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) -{ - if(smpc_out & 0x40) - { - phase = -1; - tl = true; - data_out = 0x01; - } - else - { - switch(phase + PhaseBias) - { - for(;;) - { - default: - case __COUNTER__: - - WAIT_UNTIL(phase == -1); - - WR_NYB(0x4); - WR_NYB(0x1); - WR_NYB(0x6); - WR_NYB(0x0); - // - // - port_counter = 0; - - do - { - sub_state[port_counter] = 0x60; - UASB(); - // ... - tmp[0] = UASB(); - id1 = ((((tmp[0] >> 3) | (tmp[0] >> 2)) & 1) << 3) | ((((tmp[0] >> 1) | (tmp[0] >> 0)) & 1) << 2); - - sub_state[port_counter] = 0x20; - UASB(); - // ... - tmp[1] = UASB(); - id1 |= ((((tmp[1] >> 3) | (tmp[1] >> 2)) & 1) << 1) | ((((tmp[1] >> 1) | (tmp[1] >> 0)) & 1) << 0); - - //printf("%d, %01x\n", port_counter, id1); - - if(id1 == 0xB) // Digital pad - { - WR_NYB(0x0); - WR_NYB(0x2); - - sub_state[port_counter] = 0x40; - UASB(); - WR_NYB(tmp[1] & 0xF); - tmp[2] = UASB(); - - sub_state[port_counter] = 0x00; - UASB(); - WR_NYB(tmp[2] & 0xF); - tmp[3] = UASB(); - - WR_NYB(tmp[3] & 0xF); - WR_NYB((tmp[0] & 0xF) | 0x7); - } - else if(id1 == 0x3 || id1 == 0x5) // Analog - { - sub_state[port_counter] = 0x00; - WAIT_UNTIL(!(UASB() & 0x10)); - id2 = ((UASB() & 0xF) << 4); - - sub_state[port_counter] = 0x20; - WAIT_UNTIL(UASB() & 0x10); - id2 |= ((UASB() & 0xF) << 0); - - if(id1 == 0x3) - id2 = 0xE3; - - WR_NYB(id2 >> 4); - WR_NYB(id2 >> 0); - - read_counter = 0; - while(read_counter < (id2 & 0xF)) - { - sub_state[port_counter] = 0x00; - WAIT_UNTIL(!(UASB() & 0x10)); - WR_NYB(UASB() & 0xF); - - sub_state[port_counter] = 0x20; - WAIT_UNTIL(UASB() & 0x10); - WR_NYB(UASB() & 0xF); - - read_counter++; - } - } - else - { - WR_NYB(0xF); - WR_NYB(0xF); - } - - sub_state[port_counter] = 0x60; - UASB(); - } while(++port_counter < 6); - - // - // - WR_NYB(0x0); - WR_NYB(0x1); - } - } - } - - BreakOut:; - - return (smpc_out & (smpc_out_asserted | 0xE0)) | (((tl << 4) | data_out) &~ smpc_out_asserted); -} - - -} diff --git a/waterbox/ss/input/multitap.h b/waterbox/ss/input/multitap.h deleted file mode 100644 index b753b9f1d2..0000000000 --- a/waterbox/ss/input/multitap.h +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* multitap.h: -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_INPUT_MULTITAP_H -#define __MDFN_SS_INPUT_MULTITAP_H - -namespace MDFN_IEN_SS -{ - -class IODevice_Multitap final : public IODevice -{ - public: - IODevice_Multitap() MDFN_COLD; - virtual ~IODevice_Multitap() override MDFN_COLD; - - virtual void Power(void) override MDFN_COLD; - - virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override; - - void SetSubDevice(unsigned sub_index, IODevice* device); - IODevice* GetSubDevice(unsigned sub_index); - - private: - - uint8 UASB(void); - - IODevice* devices[6]; - uint8 sub_state[6]; - uint8 tmp[4]; - uint8 id1; - uint8 id2; - uint8 data_out; - bool tl; - int32 phase; - uint8 port_counter; - uint8 read_counter; -}; - -} - -#endif diff --git a/waterbox/ss/input/wheel.cpp b/waterbox/ss/input/wheel.cpp deleted file mode 100644 index 2060fedcd1..0000000000 --- a/waterbox/ss/input/wheel.cpp +++ /dev/null @@ -1,105 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* wheel.cpp: -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "common.h" -#include "wheel.h" - -namespace MDFN_IEN_SS -{ - -IODevice_Wheel::IODevice_Wheel() : dbuttons(0) -{ - -} - -IODevice_Wheel::~IODevice_Wheel() -{ - -} - -void IODevice_Wheel::Power(void) -{ - phase = -1; - tl = true; - data_out = 0x01; -} - -void IODevice_Wheel::UpdateInput(const uint8 *data, const int32 time_elapsed) -{ - dbuttons = (dbuttons & 0xC) | (MDFN_de16lsb(&data[0]) & 0x07F3); - wheel = data[2]; - if (wheel >= 0x6F) - dbuttons &= ~0x4; - else if (wheel <= 0x67) - dbuttons |= 0x4; - - if (wheel <= 0x8F) - dbuttons &= ~0x8; - else if (wheel >= 0x97) - dbuttons |= 0x8; -} - -uint8 IODevice_Wheel::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) -{ - uint8 tmp; - - if(smpc_out & 0x40) - { - phase = -1; - tl = true; - data_out = 0x01; - } - else - { - if((bool)(smpc_out & 0x20) != tl) - { - if(phase < 0) - { - buffer[ 0] = 0x1; - buffer[ 1] = 0x3; - buffer[ 2] = (((dbuttons >> 0) & 0xF) ^ 0xF); - buffer[ 3] = (((dbuttons >> 4) & 0xF) ^ 0xF); - buffer[ 4] = (((dbuttons >> 8) & 0xF) ^ 0xF); - buffer[ 5] = (((dbuttons >> 12) & 0xF) ^ 0xF); - buffer[ 6] = ((wheel >> 4) & 0xF); - buffer[ 7] = ((wheel >> 0) & 0xF); - buffer[ 8] = 0x0; - buffer[ 9] = 0x1; - buffer[10] = 0x1; - buffer[11] = ((wheel >> 0) & 0xF); - buffer[12] = 0x0; - buffer[13] = 0x1; - buffer[14] = 0x1; - buffer[15] = 0x1; - } - - phase = (phase + 1) & 0xF; - data_out = buffer[phase]; - tl = !tl; - } - } - - tmp = (tl << 4) | data_out; - - return (smpc_out & (smpc_out_asserted | 0xE0)) | (tmp &~ smpc_out_asserted); -} - -} diff --git a/waterbox/ss/input/wheel.h b/waterbox/ss/input/wheel.h deleted file mode 100644 index 02f54dd98d..0000000000 --- a/waterbox/ss/input/wheel.h +++ /dev/null @@ -1,51 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* wheel.h: -** Copyright (C) 2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_INPUT_WHEEL_H -#define __MDFN_SS_INPUT_WHEEL_H - -namespace MDFN_IEN_SS -{ - -class IODevice_Wheel final : public IODevice -{ - public: - IODevice_Wheel() MDFN_COLD; - virtual ~IODevice_Wheel() override MDFN_COLD; - - virtual void Power(void) override MDFN_COLD; - virtual void UpdateInput(const uint8* data, const int32 time_elapsed) override; - - virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) override; - - private: - uint16 dbuttons; - uint8 wheel; - - uint8 buffer[0x10]; - uint8 data_out; - bool tl; - int8 phase; -}; - -} - -#endif diff --git a/waterbox/ss/m68k/m68k.cpp b/waterbox/ss/m68k/m68k.cpp deleted file mode 100644 index 1720eb8699..0000000000 --- a/waterbox/ss/m68k/m68k.cpp +++ /dev/null @@ -1,2295 +0,0 @@ -/******************************************************************************/ -/* Mednafen - Multi-system Emulator */ -/******************************************************************************/ -/* m68k.cpp - Motorola 68000 CPU Emulator -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// TODO: Check CHK -// -// TODO: Address errors(or just cheap out and mask off the lower bit on 16-bit memory accesses). -// -// TODO: Predec, postinc order for same address register. -// -// TODO: Fix instruction timings(currently execute too fast). -// -// TODO: Fix multiplication and division timing, and make sure flags are ok for divide by zero. -// -// FIXME: Handle NMI differently; how to test? Maybe MOVEM to interrupt control registers... -// -// TODO: Test MOVEM -// -/* - Be sure to test the following thoroughly: - SUBA -(a0), a0 - SUBX -(a0),-(a0) - CMPM (a0)+,(a0)+ - - SUBA -(a7), a7 - SUBX -(a7),-(a7) - CMPM (a7)+,(a7)+ -*/ - -#include "../ss.h" -#include "m68k.h" - -#include - -#pragma GCC optimize ("no-crossjumping,no-gcse") - -static MDFN_FASTCALL void Dummy_BusRESET(bool state) -{ - -} - -static void DummyDBG(const char* format, ...) noexcept -{ - -} - -M68K::M68K(const bool rev_e) : Revision_E(rev_e), - BusReadInstr(nullptr), BusRead8(nullptr), BusRead16(nullptr), - BusWrite8(nullptr), BusWrite16(nullptr), - BusRMW(nullptr), - BusIntAck(nullptr), - BusRESET(Dummy_BusRESET), - DBG_Warning(DummyDBG), - DBG_Verbose(DummyDBG) -{ - timestamp = 0; - XPending = 0; - IPL = 0; - Reset(true); -} - -M68K::~M68K() -{ - -} - -INLINE void M68K::RecalcInt(void) -{ - XPending &= ~XPENDING_MASK_INT; - - if(IPL > (SRHB & 0x7)) - XPending |= XPENDING_MASK_INT; -} - -void M68K::SetIPL(uint8 ipl_new) -{ - if(IPL < 0x7 && ipl_new == 0x7) - XPending |= XPENDING_MASK_NMI; - else if(ipl_new < 0x7) - XPending &= ~XPENDING_MASK_NMI; - - IPL = ipl_new; - RecalcInt(); -} - -void M68K::SetExtHalted(bool state) -{ - XPending &= ~XPENDING_MASK_EXTHALTED; - if(state) - XPending |= XPENDING_MASK_EXTHALTED; -} - -template -INLINE T M68K::Read(uint32 addr) -{ - if(sizeof(T) == 4) - { - uint32 ret; - - ret = BusRead16(addr) << 16; - ret |= BusRead16(addr + 2); - - return ret; - } - else if(sizeof(T) == 2) - return BusRead16(addr); - else - return BusRead8(addr); -} - -INLINE uint16 M68K::ReadOp(void) -{ - uint16 ret; - - ret = BusReadInstr(PC); - PC += 2; - - return ret; -} - -template -INLINE void M68K::Write(uint32 addr, const T val) -{ - if(sizeof(T) == 4) - { - if(long_dec) - { - BusWrite16(addr + 2, val); - BusWrite16(addr, val >> 16); - } - else - { - BusWrite16(addr, val >> 16); - BusWrite16(addr + 2, val); - } - } - else if(sizeof(T) == 2) - BusWrite16(addr, val); - else - BusWrite8(addr, val); -} - -template -INLINE void M68K::Push(const T value) -{ - static_assert(sizeof(T) != 1, "Wrong type."); - A[7] -= sizeof(T); - Write(A[7], value); -} - -template -INLINE T M68K::Pull(void) -{ - static_assert(sizeof(T) != 1, "Wrong type."); - - T ret; - - ret = Read(A[7]); - - A[7] += sizeof(T); - - return ret; -} - -// -// MOVE byte and word: instructions, 2 cycle penalty for source predecrement only -// 2 cycle penalty for (d8, An, Xn) for both source and dest ams -// 2 cycle penalty for (d8, PC, Xn) for dest am -// - -// -// Careful on declaration order of HAM objects(needs to be source then dest). -// -template -struct M68K::HAM -{ - INLINE HAM(M68K* z) : zptr(z), reg(0), have_ea(false) - { - static_assert(am == PC_DISP || am == PC_INDEX || am == ABS_SHORT || am == ABS_LONG || am == IMMEDIATE, "Wrong arg count."); - - switch(am) - { - case PC_DISP: // (d16, PC) - case PC_INDEX: // PC with index - ea = zptr->PC; - ext = zptr->ReadOp(); - break; - - case ABS_SHORT: // (xxxx).W - ext = zptr->ReadOp(); - break; - - case ABS_LONG: // (xxxx).L - ext = zptr->ReadOp() << 16; - ext |= zptr->ReadOp(); - break; - - case IMMEDIATE: // Immediate - if(sizeof(T) == 4) - { - ext = zptr->ReadOp() << 16; - ext |= zptr->ReadOp(); - } - else - { - ext = zptr->ReadOp(); - } - break; - } - } - - INLINE HAM(M68K* z, uint32 arg) : zptr(z), reg(arg), have_ea(false) - { - static_assert(am != PC_DISP && am != PC_INDEX && am != ABS_SHORT && am != ABS_LONG, "Wrong arg count."); - - static_assert(am != ADDR_REG_DIR || sizeof(T) != 1, "Wrong size for address reg direct read"); - - switch(am) - { - case DATA_REG_DIR: - case ADDR_REG_DIR: - case ADDR_REG_INDIR: - case ADDR_REG_INDIR_POST: - case ADDR_REG_INDIR_PRE: - break; - - case ADDR_REG_INDIR_DISP: // (d16, An) - case ADDR_REG_INDIR_INDX: // (d8, An, Xn) - ext = zptr->ReadOp(); - break; - - case IMMEDIATE: // Immediate (quick) - ext = arg; - break; - } - } - - private: - INLINE void calcea(const int predec_penalty) - { - if(have_ea) - return; - - have_ea = true; - - switch(am) - { - default: - break; - - case ADDR_REG_INDIR: - ea = zptr->A[reg]; - break; - - case ADDR_REG_INDIR_POST: - ea = zptr->A[reg]; - zptr->A[reg] += (sizeof(T) == 1 && reg == 0x7) ? 2 : sizeof(T); - break; - - case ADDR_REG_INDIR_PRE: - zptr->timestamp += predec_penalty; - zptr->A[reg] -= (sizeof(T) == 1 && reg == 0x7) ? 2 : sizeof(T); - ea = zptr->A[reg]; - break; - - case ADDR_REG_INDIR_DISP: - ea = zptr->A[reg] + (int16)ext; - break; - - case ADDR_REG_INDIR_INDX: - zptr->timestamp += 2; - ea = zptr->A[reg] + (int8)ext + ((ext & 0x800) ? zptr->DA[ext >> 12] : (int16)zptr->DA[ext >> 12]); - break; - - case ABS_SHORT: - ea = (int16)ext; - break; - - case ABS_LONG: - ea = ext; - break; - - case PC_DISP: - ea = ea + (int16)ext; - break; - - case PC_INDEX: - zptr->timestamp += 2; - ea = ea + (int8)ext + ((ext & 0x800) ? zptr->DA[ext >> 12] : (int16)zptr->DA[ext >> 12]); - break; - } - } - public: - - // - // TODO: check pre-decrement 32-bit->2x 16-bit write order - // - - INLINE void write(const T val, const int predec_penalty = 2) - { - static_assert(am != PC_DISP && am != PC_INDEX && am != IMMEDIATE, "What"); - - static_assert(am != ADDR_REG_DIR || sizeof(T) == 4, "Wrong size for address reg direct write"); - - switch(am) - { - case ADDR_REG_DIR: - zptr->A[reg] = val; - break; - - case DATA_REG_DIR: - #ifdef MSB_FIRST - memcpy((uint8*)&zptr->D[reg] + (4 - sizeof(T)), &val, sizeof(T)); - #else - memcpy((uint8*)&zptr->D[reg] + 0, &val, sizeof(T)); - #endif - break; - - case ADDR_REG_INDIR: - case ADDR_REG_INDIR_POST: - case ADDR_REG_INDIR_PRE: - case ADDR_REG_INDIR_DISP: - case ADDR_REG_INDIR_INDX: - case ABS_SHORT: - case ABS_LONG: - calcea(predec_penalty); - zptr->Write(ea, val); - break; - } - } - - INLINE T read(void) - { - switch(am) - { - case DATA_REG_DIR: - return zptr->D[reg]; - - case ADDR_REG_DIR: - return zptr->A[reg]; - - case IMMEDIATE: - return ext; - - case ADDR_REG_INDIR: - case ADDR_REG_INDIR_POST: - case ADDR_REG_INDIR_PRE: - case ADDR_REG_INDIR_DISP: - case ADDR_REG_INDIR_INDX: - case ABS_SHORT: - case ABS_LONG: - case PC_DISP: - case PC_INDEX: - calcea(2); - return zptr->Read(ea); - } - } - - INLINE void rmw(T (MDFN_FASTCALL *cb)(M68K*, T)) - { - static_assert(am != PC_DISP && am != PC_INDEX && am != IMMEDIATE, "What"); - - switch(am) - { - case DATA_REG_DIR: - { - T tmp = cb(zptr, zptr->D[reg]); - #ifdef MSB_FIRST - memcpy((uint8*)&zptr->D[reg] + (4 - sizeof(T)), &tmp, sizeof(T)); - #else - memcpy((uint8*)&zptr->D[reg] + 0, &tmp, sizeof(T)); - #endif - } - break; - - case ADDR_REG_INDIR: - case ADDR_REG_INDIR_POST: - case ADDR_REG_INDIR_PRE: - case ADDR_REG_INDIR_DISP: - case ADDR_REG_INDIR_INDX: - case ABS_SHORT: - case ABS_LONG: - calcea(2); - - zptr->BusRMW(ea, cb); - break; - } - } - - - INLINE void jump(void) - { - calcea(0); - zptr->PC = ea; - } - - INLINE uint32 getea(void) - { - static_assert(am == ADDR_REG_INDIR || am == ADDR_REG_INDIR_DISP || am == ADDR_REG_INDIR_INDX || am == ABS_SHORT || am == ABS_LONG || am == PC_DISP || am == PC_INDEX, "Wrong addressing mode"); - calcea(0); - return ea; - } - - M68K* zptr; - - uint32 ea; - uint32 ext; - const unsigned reg; - - private: - bool have_ea; -}; - - - -INLINE void M68K::SetC(bool val) { Flag_C = val; } -INLINE void M68K::SetV(bool val) { Flag_V = val; } -INLINE void M68K::SetZ(bool val) { Flag_Z = val; } -INLINE void M68K::SetN(bool val) { Flag_N = val; } -INLINE void M68K::SetX(bool val) { Flag_X = val; } - -INLINE bool M68K::GetC(void) { return Flag_C; } -INLINE bool M68K::GetV(void) { return Flag_V; } -INLINE bool M68K::GetZ(void) { return Flag_Z; } -INLINE bool M68K::GetN(void) { return Flag_N; } -INLINE bool M68K::GetX(void) { return Flag_X; } - - -INLINE void M68K::SetCX(bool val) -{ - SetC(val); - SetX(val); -} - -// -// Z_OnlyClear should be true for ADDX, SUBX, NEGX, ABCD, SBCD, NBCD. -// -template -INLINE void M68K::CalcZN(const T val) -{ - if(Z_OnlyClear) - { - if(val != 0) - SetZ(false); - } - else - SetZ(val == 0); - - SetN(static_cast::type>(val) < 0); -} - -template -INLINE void M68K::CalcCX(const uint64& val) -{ - SetCX((val >> (sizeof(T) * 8)) & 1); -} - -INLINE uint8 M68K::GetCCR(void) -{ - return (GetC() << 0) | (GetV() << 1) | (GetZ() << 2) | (GetN() << 3) | (GetX() << 4); -} - -INLINE void M68K::SetCCR(uint8 val) -{ - SetC((val >> 0) & 1); - SetV((val >> 1) & 1); - SetZ((val >> 2) & 1); - SetN((val >> 3) & 1); - SetX((val >> 4) & 1); -} - -INLINE uint16 M68K::GetSR(void) -{ - return GetCCR() | (SRHB << 8); -} - -INLINE void M68K::SetSR(uint16 val) -{ - const uint8 new_srhb = (val >> 8) & 0xA7; - - SetCCR(val); - - if((SRHB ^ new_srhb) & 0x20) // Supervisor mode change - { - std::swap(A[7], SP_Inactive); - } - - SRHB = new_srhb; - RecalcInt(); -} - -INLINE uint8 M68K::GetIMask(void) -{ - return (GetSR() >> 8) & 0x7; -} - -INLINE void M68K::SetIMask(uint8 val) -{ - SetSR((GetSR() & ~0x0700) | ((val & 0x7) << 8)); -} - -INLINE bool M68K::GetSVisor(void) -{ - return (bool)(GetSR() & 0x2000); -} - -INLINE void M68K::SetSVisor(bool value) -{ - SetSR((GetSR() & ~0x2000) | (value << 13)); -} - -INLINE bool M68K::GetTrace(void) -{ - return (bool)(GetSR() & 0x8000); -} - -INLINE void M68K::SetTrace(bool value) -{ - SetSR((GetSR() & ~0x8000) | (value << 15)); -} - -// -// -// -enum -{ - VECNUM_RESET_SSP = 0, - VECNUM_RESET_PC = 1, - VECNUM_BUS_ERROR = 2, - VECNUM_ADDRESS_ERROR = 3, - VECNUM_ILLEGAL = 4, - VECNUM_ZERO_DIVIDE = 5, - VECNUM_CHK = 6, - VECNUM_TRAPV = 7, - VECNUM_PRIVILEGE = 8, - VECNUM_TRACE = 9, - VECNUM_LINEA = 10, - VECNUM_LINEF = 11, - - VECNUM_UNINI_INT = 15, - - VECNUM_SPURIOUS_INT = 24, - VECNUM_INT_BASE = 24, - - VECNUM_TRAP_BASE = 32 -}; - -enum -{ - EXCEPTION_RESET = 0, - EXCEPTION_BUS_ERROR, - EXCEPTION_ADDRESS_ERROR, - EXCEPTION_ILLEGAL, - EXCEPTION_ZERO_DIVIDE, - EXCEPTION_CHK, - EXCEPTION_TRAPV, - EXCEPTION_PRIVILEGE, - EXCEPTION_TRACE, - - EXCEPTION_INT, - EXCEPTION_TRAP -}; - -// -// Instruction traps(TRAP, TRAPV, CHK, DIVS, DIVU): -// Saved PC points to the instruction after the instruction that triggered the exception. -// -// Illegal instructions: -// -// -// Privilege violation: -// Saved PC points to the instruction that generated the privilege violation. -// -// Base exception timing is 34 cycles? -void NO_INLINE M68K::Exception(unsigned which, unsigned vecnum) -{ - const uint32 PC_save = PC; - const uint16 SR_save = GetSR(); - - SetSVisor(true); - SetTrace(false); - - if(which == EXCEPTION_INT) - { - unsigned evn; - - timestamp += 4; - - SetIMask(IPL); - - evn = BusIntAck(IPL); - - if(evn > 255) - vecnum = vecnum + IPL; - else - vecnum = evn; - - timestamp += 2; - } - - Push(PC_save); - Push(SR_save); - PC = Read(vecnum << 2); - - // - { - auto dbgw = DBG_Verbose; - - if(which != EXCEPTION_INT || vecnum == VECNUM_UNINI_INT || vecnum == VECNUM_SPURIOUS_INT) - dbgw = DBG_Warning; - - dbgw("[M68K] Exception %u(vec=%u) @PC=0x%08x SR=0x%04x ---> PC=0x%08x, SR=0x%04x\n", which, vecnum, PC_save, SR_save, PC, GetSR()); - } - // - - // TODO: Prefetch - ReadOp(); - ReadOp(); - PC -= 4; -} - -// -// -// - -// -// ADD -// -template -INLINE void M68K::ADD(HAM &src, HAM &dst) -{ - static_assert(DAM == ADDR_REG_DIR || std::is_same::value, "Type mismatch"); - - uint32 const src_data = (DT)static_cast::type>(src.read()); - uint32 const dst_data = dst.read(); - uint64 const result = (uint64)dst_data + src_data; - - if(DAM == ADDR_REG_DIR) - { - if(sizeof(T) != 4 || SAM == DATA_REG_DIR || SAM == ADDR_REG_DIR || SAM == IMMEDIATE) - timestamp += 4; - else - timestamp += 2; - } - else if(DAM == DATA_REG_DIR && sizeof(DT) == 4) - { - if(SAM == DATA_REG_DIR || SAM == IMMEDIATE) - timestamp += 4; - else - timestamp += 2; - } - - if(DAM != ADDR_REG_DIR) - { - CalcZN
(result); - SetCX((result >> (sizeof(DT) * 8)) & 1); - SetV((((~(dst_data ^ src_data)) & (dst_data ^ result)) >> (sizeof(DT) * 8 - 1)) & 1); - } - - dst.write(result); -} - - -// -// ADDX -// -template -INLINE void M68K::ADDX(HAM &src, HAM &dst) -{ - uint32 const src_data = src.read(); - uint32 const dst_data = dst.read(); - uint64 const result = (uint64)dst_data + src_data + GetX(); - - if(DAM != DATA_REG_DIR) - { - timestamp += 2; - } - else - { - if(sizeof(T) == 4) - timestamp += 4; - } - - CalcZN(result); - SetCX((result >> (sizeof(T) * 8)) & 1); - SetV((((~(dst_data ^ src_data)) & (dst_data ^ result)) >> (sizeof(T) * 8 - 1)) & 1); - - dst.write(result); -} - - -// -// Used to implement SUB, SUBA, SUBX, NEG, NEGX -// -template -INLINE DT M68K::Subtract(HAM &src, HAM &dst) -{ - static_assert(DAM == ADDR_REG_DIR || std::is_same::value, "Type mismatch"); - static_assert(DAM == ADDR_REG_DIR || DAM == DATA_REG_DIR || DAM == IMMEDIATE || SAM == ADDR_REG_DIR || SAM == DATA_REG_DIR || SAM == IMMEDIATE || X_form, "Wrong addressing modes."); - - uint32 const src_data = (DT)static_cast::type>(src.read()); - uint32 const dst_data = dst.read(); - const uint64 result = (uint64)dst_data - src_data - (X_form ? GetX() : 0); - - if(DAM == ADDR_REG_DIR) // SUBA, SUBQ(A) only. - { - if(sizeof(T) != 4 || SAM == DATA_REG_DIR || SAM == ADDR_REG_DIR || SAM == IMMEDIATE) - timestamp += 4; - else - timestamp += 2; - } - else if(DAM == DATA_REG_DIR) // SUB, SUBQ, SUBX only. - { - if(sizeof(DT) == 4) - { - if(SAM == DATA_REG_DIR || SAM == IMMEDIATE) - timestamp += 4; - else - timestamp += 2; - } - } - else if(DAM == IMMEDIATE) // NEG, NEGX only and always. - { - if(sizeof(T) == 4) - { - timestamp += 2; - } - } - else if(SAM != IMMEDIATE && SAM != ADDR_REG_DIR && SAM != DATA_REG_DIR) // SUBX m,m - { - timestamp += 2; - } - - - if(DAM != ADDR_REG_DIR) - { - CalcZN(result); - SetCX((result >> (sizeof(DT) * 8)) & 1); - SetV(((((dst_data ^ src_data)) & (dst_data ^ result)) >> (sizeof(DT) * 8 - 1)) & 1); - } - - return result; -} - - -// -// SUB -// -template -INLINE void M68K::SUB(HAM &src, HAM &dst) -{ - dst.write(Subtract(src, dst)); -} - - -// -// SUBX -// -template -INLINE void M68K::SUBX(HAM &src, HAM &dst) -{ - dst.write(Subtract(src, dst)); -} - - -// -// NEG -// -template -INLINE void M68K::NEG(HAM &dst) -{ - HAM dummy_zero(this, 0); - - dst.write(Subtract(dst, dummy_zero)); -} - - -// -// NEGX -// -template -INLINE void M68K::NEGX(HAM &dst) -{ - HAM dummy_zero(this, 0); - - dst.write(Subtract(dst, dummy_zero)); -} - - -// -// CMP -// -template -INLINE void M68K::CMP(HAM &src, HAM &dst) -{ - static_assert(DAM == ADDR_REG_DIR || std::is_same::value, "Type mismatch"); - - // Doesn't affect X flag - uint32 const src_data = (DT)static_cast::type>(src.read()); - uint32 const dst_data = dst.read(); - uint64 const result = (uint64)dst_data - src_data; - - CalcZN
(result); - SetC((result >> (sizeof(DT) * 8)) & 1); - SetV(((((dst_data ^ src_data)) & (dst_data ^ result)) >> (sizeof(DT) * 8 - 1)) & 1); -} - - -// -// CHK -// -// Exception on dst < 0 || dst > src -template -INLINE void M68K::CHK(HAM &src, HAM &dst) -{ - uint32 const src_data = src.read(); - uint32 const dst_data = dst.read(); - - timestamp += 6; - - CalcZN(dst_data); - if(GetN()) - { - Exception(EXCEPTION_CHK, VECNUM_CHK); - } - else - { - // 7 - 1 - uint64 const result = (uint64)dst_data - src_data; - - CalcZN(result); - SetC((result >> (sizeof(T) * 8)) & 1); - SetV(((((dst_data ^ src_data)) & (dst_data ^ result)) >> (sizeof(T) * 8 - 1)) & 1); - - if(GetN() == GetV() && !GetZ()) - { - Exception(EXCEPTION_CHK, VECNUM_CHK); - } - } -} - - -// -// OR -// -template -INLINE void M68K::OR(HAM &src, HAM &dst) -{ - T const src_data = src.read(); - T const dst_data = dst.read(); - T const result = dst_data | src_data; - - if(sizeof(T) == 4 && DAM == DATA_REG_DIR) - { - if(SAM == IMMEDIATE || SAM == DATA_REG_DIR) - timestamp += 4; - else - timestamp += 2; - } - - CalcZN(result); - SetC(false); - SetV(false); - - dst.write(result); -} - - -// -// EOR -// -template -INLINE void M68K::EOR(HAM &src, HAM &dst) -{ - T const src_data = src.read(); - T const dst_data = dst.read(); - T const result = dst_data ^ src_data; - - if(sizeof(T) == 4 && DAM == DATA_REG_DIR) - { - if(SAM == IMMEDIATE || SAM == DATA_REG_DIR) - timestamp += 4; - else - timestamp += 2; - } - - CalcZN(result); - SetC(false); - SetV(false); - - dst.write(result); -} - - -// -// AND -// -template -INLINE void M68K::AND(HAM &src, HAM &dst) -{ - T const src_data = src.read(); - T const dst_data = dst.read(); - T const result = dst_data & src_data; - - if(sizeof(T) == 4 && DAM == DATA_REG_DIR) - { - if(SAM == IMMEDIATE || SAM == DATA_REG_DIR) - timestamp += 4; - else - timestamp += 2; - } - - CalcZN(result); - SetC(false); - SetV(false); - - dst.write(result); -} - - -// -// ORI CCR -// -INLINE void M68K::ORI_CCR(void) -{ - const uint8 imm = ReadOp(); - - SetCCR(GetCCR() | imm); - - // - // - timestamp += 8; - ReadOp(); - PC -= 2; -} - - -// -// ORI SR -// -INLINE void M68K::ORI_SR(void) -{ - const uint16 imm = ReadOp(); - - SetSR(GetSR() | imm); - - // - // - timestamp += 8; - ReadOp(); - PC -= 2; -} - - -// -// ANDI CCR -// -INLINE void M68K::ANDI_CCR(void) -{ - const uint8 imm = ReadOp(); - - SetCCR(GetCCR() & imm); - - // - // - timestamp += 8; - ReadOp(); - PC -= 2; -} - - -// -// ANDI SR -// -INLINE void M68K::ANDI_SR(void) -{ - const uint16 imm = ReadOp(); - - SetSR(GetSR() & imm); - - // - // - timestamp += 8; - ReadOp(); - PC -= 2; -} - - -// -// EORI CCR -// -INLINE void M68K::EORI_CCR(void) -{ - const uint8 imm = ReadOp(); - - SetCCR(GetCCR() ^ imm); - - // - // - timestamp += 8; - ReadOp(); - PC -= 2; -} - - -// -// EORI SR -// -INLINE void M68K::EORI_SR(void) -{ - const uint16 imm = ReadOp(); - - SetSR(GetSR() ^ imm); - - // - // - timestamp += 8; - ReadOp(); - PC -= 2; -} - - -// -// MULU -// -template -INLINE void M68K::MULU(HAM &src, const unsigned dr) -{ - // Doesn't affect X flag - static_assert(sizeof(T) == 2, "Wrong type."); - - T const src_data = src.read(); - uint32 const result = (uint32)(uint16)D[dr] * (uint32)src_data; - - CalcZN(result); - SetC(false); - SetV(false); - - D[dr] = result; -} - - -// -// MULS -// -template -INLINE void M68K::MULS(HAM &src, const unsigned dr) -{ - // Doesn't affect X flag - static_assert(sizeof(T) == 2, "Wrong type."); - - T const src_data = src.read(); - uint32 const result = (int16)D[dr] * (int16)src_data; - - CalcZN(result); - SetC(false); - SetV(false); - - D[dr] = result; -} - - -template -INLINE void M68K::Divide(uint16 divisor, const unsigned dr) -{ - uint32 dividend = D[dr]; - uint32 tmp; - bool neg_quotient = false; - bool neg_remainder = false; - bool oflow = false; - - if(!divisor) - { - Exception(EXCEPTION_ZERO_DIVIDE, VECNUM_ZERO_DIVIDE); - return; - } - - if(sdiv) - { - neg_quotient = (dividend >> 31) ^ (divisor >> 15); - if(dividend & 0x80000000) - { - dividend = -dividend; - neg_remainder = true; - } - - if(divisor & 0x8000) - divisor = -divisor; - } - - tmp = dividend; - - for(int i = 0; i < 16; i++) - { - bool lb = false; - bool ob; - - if(tmp >= ((uint32)divisor << 15)) - { - tmp -= divisor << 15; - lb = true; - } - - ob = tmp >> 31; - tmp = (tmp << 1) | lb; - - if(ob) - { - oflow = true; - //puts("OVERFLOW"); - //break; - } - } - - if(sdiv) - { - if((tmp & 0xFFFF) > (uint32)(0x7FFF + neg_quotient)) - oflow = true; - } - - if((uint32)(tmp >> 16) >= divisor) - oflow = true; - - if(sdiv && !oflow) - { - if(neg_quotient) - tmp = ((-tmp) & 0xFFFF) | (tmp & 0xFFFF0000); - - if(neg_remainder) - tmp = (((-(tmp >> 16)) << 16) & 0xFFFF0000) | (tmp & 0xFFFF); - } - - // - // Doesn't affect X flag - // - CalcZN(tmp); - SetC(false); - SetV(oflow); - - if(!oflow) - D[dr] = tmp; -} - - -// -// DIVU -// -template -INLINE void M68K::DIVU(HAM &src, const unsigned dr) -{ - static_assert(sizeof(T) == 2, "Wrong type."); - - T const src_data = src.read(); - - Divide(src_data, dr); -} - - -// -// DIVS -// -template -INLINE void M68K::DIVS(HAM &src, const unsigned dr) -{ - // Doesn't affect X flag - static_assert(sizeof(T) == 2, "Wrong type."); - - T const src_data = src.read(); - - Divide(src_data, dr); -} - - -// -// ABCD -// -template -INLINE void M68K::ABCD(HAM &src, HAM &dst) // ...XYZ, now I know my ABCs~ -{ - static_assert(sizeof(T) == 1, "Wrong size."); - - bool V = false; - uint8 const src_data = src.read(); - uint8 const dst_data = dst.read(); - uint32 tmp; - - tmp = dst_data + src_data + GetX(); - - if(((dst_data ^ src_data ^ tmp) & 0x10) || (tmp & 0xF) >= 0x0A) - { - uint8 prev_tmp = tmp; - tmp += 0x06; - V |= ((~prev_tmp & 0x80) & (tmp & 0x80)); - } - - if(tmp >= 0xA0) - { - uint8 prev_tmp = tmp; - tmp += 0x60; - V |= ((~prev_tmp & 0x80) & (tmp & 0x80)); - } - - CalcZN(tmp); - SetCX((bool)(tmp >> 8)); - SetV(V); - - if(DAM == DATA_REG_DIR) - timestamp += 2; - else - timestamp += 4; - - dst.write(tmp); -} - - -INLINE uint8 M68K::DecimalSubtractX(const uint8 src_data, const uint8 dst_data) -{ - bool V = false; - uint32 tmp; - - tmp = dst_data - src_data - GetX(); - - const bool adj0 = ((dst_data ^ src_data ^ tmp) & 0x10); - const bool adj1 = (tmp & 0x100); - - if(adj0) - { - uint8 prev_tmp = tmp; - tmp -= 0x06; - V |= (prev_tmp & 0x80) & (~tmp & 0x80); - } - - if(adj1) - { - uint8 prev_tmp = tmp; - tmp -= 0x60; - V |= (prev_tmp & 0x80) & (~tmp & 0x80); - } - - SetV(V); - CalcZN(tmp); - SetCX((bool)(tmp >> 8)); - - return tmp; -} - -// -// SBCD -// -template -INLINE void M68K::SBCD(HAM &src, HAM &dst) -{ - static_assert(sizeof(T) == 1, "Wrong size."); - uint8 const src_data = src.read(); - uint8 const dst_data = dst.read(); - - if(DAM == DATA_REG_DIR) - timestamp += 2; - else - timestamp += 4; - - dst.write(DecimalSubtractX(src_data, dst_data)); -} - - -// -// NBCD -// -template -INLINE void M68K::NBCD(HAM &dst) -{ - static_assert(sizeof(T) == 1, "Wrong size."); - uint8 const dst_data = dst.read(); - - timestamp += 2; - - dst.write(DecimalSubtractX(dst_data, 0)); -} - -// -// MOVEP -// -template -INLINE void M68K::MOVEP(const unsigned ar, const unsigned dr) -{ - const int16 ext = ReadOp(); - uint32 ea = A[ar] + (int16)ext; - unsigned shift = (sizeof(T) - 1) << 3; - - for(unsigned i = 0; i < sizeof(T); i++) - { - if(reg_to_mem) - Write(ea, D[dr] >> shift); - else - { - D[dr] &= ~(0xFF << shift); - D[dr] |= Read(ea) << shift; - } - ea += 2; - shift -= 8; - } -} - - -template -INLINE void M68K::BTST(HAM &targ, unsigned wb) -{ - T const src_data = targ.read(); - wb &= (sizeof(T) << 3) - 1; - - SetZ(((src_data >> wb) & 1) == 0); -} - -template -INLINE void M68K::BCHG(HAM &targ, unsigned wb) -{ - T const src_data = targ.read(); - wb &= (sizeof(T) << 3) - 1; - - SetZ(((src_data >> wb) & 1) == 0); - - targ.write(src_data ^ (1U << wb)); -} - -template -INLINE void M68K::BCLR(HAM &targ, unsigned wb) -{ - T const src_data = targ.read(); - wb &= (sizeof(T) << 3) - 1; - - SetZ(((src_data >> wb) & 1) == 0); - - targ.write(src_data & ~(1U << wb)); -} - -template -INLINE void M68K::BSET(HAM &targ, unsigned wb) -{ - T const src_data = targ.read(); - wb &= (sizeof(T) << 3) - 1; - - SetZ(((src_data >> wb) & 1) == 0); - - targ.write(src_data | (1U << wb)); -} - - - -// -// MOVE -// -template -INLINE void M68K::MOVE(HAM &src, HAM &dst) -{ - T const tmp = src.read(); - - if(DAM != ADDR_REG_DIR) - { - CalcZN(tmp); - SetV(false); - SetC(false); - } - - dst.write(tmp); -} - -template -INLINE void M68K::MOVEA(HAM &src, const unsigned ar) -{ - uint32 const src_data = static_cast::type>(src.read()); - - A[ar] = src_data; -} - - -// -// MOVEM to memory -// -template -INLINE void M68K::MOVEM_to_MEM(const uint16 reglist, HAM &dst) -{ - static_assert(DAM != ADDR_REG_INDIR_PRE && DAM != ADDR_REG_INDIR_POST, "Wrong address mode."); - static_assert(!pseudo_predec || DAM == ADDR_REG_INDIR, "Wrong address mode."); - - uint32 ea = dst.getea(); - - for(unsigned i = 0; i < 16; i++) - { - if(reglist & (1U << i)) - { - if(pseudo_predec) - ea -= sizeof(T); - - Write(ea, DA[(pseudo_predec ? (15 - i) : i)]); - - if(!pseudo_predec) - ea += sizeof(T); - } - } - - if(pseudo_predec) - A[dst.reg] = ea; -} - - -// -// MOVEM to regs(from memory) -// -template -INLINE void M68K::MOVEM_to_REGS(HAM &src, const uint16 reglist) -{ - static_assert(SAM != ADDR_REG_INDIR_PRE && SAM != ADDR_REG_INDIR_POST, "Wrong address mode."); - static_assert(!pseudo_postinc || SAM == ADDR_REG_INDIR, "Wrong address mode."); - - uint32 ea = src.getea(); - - for(unsigned i = 0; i < 16; i++) - { - if(reglist & (1U << i)) - { - T tmp = Read(ea); - - DA[i] = static_cast::type>(tmp); - - ea += sizeof(T); - } - } - - Read(ea); // or should be ? - - if(pseudo_postinc) - A[src.reg] = ea; -} - - -template -INLINE void M68K::ShiftBase(HAM &targ, unsigned count) -{ - T vchange = 0; - T result = targ.read(); - count &= 0x3F; - - if(TAM == DATA_REG_DIR) - timestamp += (sizeof(T) == 4) ? 4 : 2; - - if(count == 0) - { - // X is unaffected with a shift count of 0! - SetC(false); - } - else - { - bool shifted_out = false; - - do - { - if(TAM == DATA_REG_DIR) - timestamp += 2; - - if(ShiftLeft) - shifted_out = (result >> (sizeof(T) * 8 - 1)) & 1; - else - shifted_out = result & 1; - - if(Arithmetic) - { - const T prev = result; - - if(ShiftLeft) - result = result << 1; - else - result = static_cast::type>(result) >> 1; - - vchange |= prev ^ result; - } - else - { - if(ShiftLeft) - result = result << 1; - else - result = result >> 1; - } - } while(--count != 0); - - SetCX(shifted_out); - } - - CalcZN(result); - - if(Arithmetic) - SetV((vchange >> (sizeof(T) * 8 - 1)) & 1); - else - SetV(false); - - targ.write(result); -} - -template -INLINE void M68K::ASL(HAM &targ, unsigned count) -{ - ShiftBase(targ, count); -} - -template -INLINE void M68K::ASR(HAM &targ, unsigned count) -{ - ShiftBase(targ, count); -} - -template -INLINE void M68K::LSL(HAM &targ, unsigned count) -{ - ShiftBase(targ, count); -} - -template -INLINE void M68K::LSR(HAM &targ, unsigned count) -{ - ShiftBase(targ, count); -} - -template -INLINE void M68K::RotateBase(HAM &targ, unsigned count) -{ - T result = targ.read(); - count &= 0x3F; - - if(TAM == DATA_REG_DIR) - timestamp += (sizeof(T) == 4) ? 4 : 2; - - if(count == 0) - { - if(X_Form) - SetC(GetX()); - else - SetC(false); - } - else - { - bool shifted_out = GetX(); - - do - { - const bool shift_in = shifted_out; - - if(TAM == DATA_REG_DIR) - timestamp += 2; - - if(ShiftLeft) - { - shifted_out = (result >> (sizeof(T) * 8 - 1)) & 1; - result <<= 1; - result |= (X_Form ? shift_in : shifted_out); - } - else - { - shifted_out = (result & 1); - result >>= 1; - result |= (T)(X_Form ? shift_in : shifted_out) << (sizeof(T) * 8 - 1); - } - } while(--count != 0); - - SetC(shifted_out); - if(X_Form) - SetX(shifted_out); - } - - CalcZN(result); - SetV(false); - - targ.write(result); -} - -template -INLINE void M68K::ROL(HAM &targ, unsigned count) -{ - RotateBase(targ, count); -} - -template -INLINE void M68K::ROR(HAM &targ, unsigned count) -{ - RotateBase(targ, count); -} - -template -INLINE void M68K::ROXL(HAM &targ, unsigned count) -{ - RotateBase(targ, count); -} - -template -INLINE void M68K::ROXR(HAM &targ, unsigned count) -{ - RotateBase(targ, count); -} - -// -// TAS -// -static MDFN_FASTCALL uint8 TAS_Callback(M68K* zptr, uint8 data) -{ - zptr->CalcZN(data); - zptr->SetC(false); - zptr->SetV(false); - - data |= 0x80; - return data; -} - -template -INLINE void M68K::TAS(HAM &dst) -{ - static_assert(std::is_same::value, "Wrong type"); - - dst.rmw(TAS_Callback); -} - -// -// TST -// -template -INLINE void M68K::TST(HAM &dst) -{ - T const dst_data = dst.read(); - - CalcZN(dst_data); - - SetC(false); - SetV(false); -} - - -// -// CLR -// -template -INLINE void M68K::CLR(HAM &dst) -{ - dst.read(); - - if(sizeof(T) == 4 && DAM == DATA_REG_DIR) - timestamp += 2; - - SetZ(true); - SetN(false); - - SetC(false); - SetV(false); - - dst.write(0); -} - -// -// NOT -// -template -INLINE void M68K::NOT(HAM &dst) -{ - T result = dst.read(); - - if(sizeof(T) == 4 && DAM == DATA_REG_DIR) - timestamp += 2; - - result = ~result; - - CalcZN(result); - SetC(false); - SetV(false); - - dst.write(result); -} - - -// -// EXT -// -template -INLINE void M68K::EXT(HAM &dst) -{ - static_assert(std::is_same::value || std::is_same::value, "Wrong type"); - T result = dst.read(); - - if(std::is_same::value) - result = (int8)result; - else - result = (int16)result; - - CalcZN(result); - SetC(false); - SetV(false); - - dst.write(result); -} - -// -// SWAP -// -INLINE void M68K::SWAP(const unsigned dr) -{ - D[dr] = (D[dr] << 16) | (D[dr] >> 16); - - CalcZN(D[dr]); - SetC(false); - SetV(false); -} - - -// -// EXG (doesn't affect flags) -// -INLINE void M68K::EXG(uint32* a, uint32* b) -{ - timestamp += 2; - - std::swap(*a, *b); -} - -// -// -// - -template -INLINE bool M68K::TestCond(void) -{ - static_assert(cc < 0x10, "Invalid CC"); - - switch(cc) - { - case 0x00: // TRUE - return true; - - case 0x01: // FALSE - return false; - - case 0x02: // HI - return !GetC() && !GetZ(); - - case 0x03: // LS - return GetC() || GetZ(); - - case 0x04: // CC/HS - return !GetC(); - - case 0x05: // CS/LO - return GetC(); - - case 0x06: // NE - return !GetZ(); - - case 0x07: // EQ - return GetZ(); - - case 0x08: // VC - return !GetV(); - - case 0x09: // VS - return GetV(); - - case 0x0A: // PL - return !GetN(); - - case 0x0B: // MI - return GetN(); - - case 0x0C: // GE - return GetN() == GetV(); - - case 0x0D: // LT - return GetN() != GetV(); - - case 0x0E: // GT - return GetN() == GetV() && !GetZ(); - - case 0x0F: // LE - return GetN() != GetV() || GetZ(); - } -} - -// -// Bcc, BRA, BSR -// -// (caller of this function should sign-extend the 8-bit displacement) -// -template -INLINE void M68K::Bxx(uint32 disp) -{ - const uint32 BPC = PC; - - if(TestCond<(cc == 0x01) ? 0x00 : cc>()) - { - const uint16 disp16 = (int16)ReadOp(); - - if(!disp) - disp = (int16)disp16; - else - PC -= 2; - - if(cc == 0x01) - Push(PC); - - timestamp += 2; - PC = BPC + disp; - } - else - { - if(!disp) - ReadOp(); - - timestamp += 4; - } -} - -template -INLINE void M68K::DBcc(const unsigned dr) -{ - const uint32 BPC = PC; - uint32 disp; - - disp = (int16)ReadOp(); - - if(!TestCond()) - { - const uint16 result = D[dr] - 1; - - timestamp += 2; - D[dr] = (D[dr] & 0xFFFF0000) | result; - - if(result != 0xFFFF) - PC = BPC + disp; - else - timestamp += 4; - } - else - timestamp += 4; -} - - -// -// Scc -// -template -INLINE void M68K::Scc(HAM &dst) -{ - static_assert(std::is_same::value, "Wrong type"); - - T const result = TestCond() ? ~(T)0 : 0; - - if(DAM == DATA_REG_DIR && result) - timestamp += 2; - - dst.write(result); -} - - -// -// JSR -// -template -INLINE void M68K::JSR(HAM &targ) -{ - Push(PC); - targ.jump(); -} - - -// -// JMP -// -template -INLINE void M68K::JMP(HAM &targ) -{ - targ.jump(); -} - - -// -// MOVE from SR -// -template -INLINE void M68K::MOVE_from_SR(HAM &dst) -{ - static_assert(std::is_same::value, "Wrong type"); - - dst.read(); - - if(DAM == DATA_REG_DIR) - timestamp += 2; - - dst.write(GetSR()); -} - - -// -// MOVE to CCR -// -template -INLINE void M68K::MOVE_to_CCR(HAM &src) -{ - static_assert(std::is_same::value, "Wrong type"); - - SetCCR(src.read()); - - timestamp += 8; -} - -// -// MOVE to SR -// -template -INLINE void M68K::MOVE_to_SR(HAM &src) -{ - static_assert(std::is_same::value, "Wrong type"); - - SetSR(src.read()); - - timestamp += 8; -} - - -// -// MOVE to/from USP -// -template -INLINE void M68K::MOVE_USP(const unsigned ar) -{ - if(!direction) - SP_Inactive = A[ar]; - else - A[ar] = SP_Inactive; -} - - -// -// LEA -// -template -INLINE void M68K::LEA(HAM &src, const unsigned ar) -{ - const uint32 ea = src.getea(); - - A[ar] = ea; -} - - -// -// PEA -// -template -INLINE void M68K::PEA(HAM &src) -{ - const uint32 ea = src.getea(); - - Push(ea); -} - -// -// UNLK -// -INLINE void M68K::UNLK(const unsigned ar) -{ - A[7] = A[ar]; - A[ar] = Pull(); -} - - -// -// LINK -// -INLINE void M68K::LINK(const unsigned ar) -{ - const uint32 disp = (int16)ReadOp(); - - Push(A[ar]); - A[ar] = A[7]; - A[7] += disp; -} - - - - - -// -// RTE -// -INLINE void M68K::RTE(void) -{ - uint16 new_SR; - - new_SR = Pull(); - PC = Pull(); - - SetSR(new_SR); -} - - -// -// RTR -// -INLINE void M68K::RTR(void) -{ - SetCCR(Pull()); - PC = Pull(); -} - - -// -// RTS -// -INLINE void M68K::RTS(void) -{ - PC = Pull(); -} - - -// -// TRAP -// -INLINE void M68K::TRAP(const unsigned vf) -{ - Exception(EXCEPTION_TRAP, VECNUM_TRAP_BASE + vf); -} - - -// -// TRAPV -// -INLINE void M68K::TRAPV(void) -{ - if(GetV()) - Exception(EXCEPTION_TRAPV, VECNUM_TRAPV); -} - - -// -// ILLEGAL -// -INLINE void M68K::ILLEGAL(const uint16 instr) -{ - //printf("ILLEGAL: %04x\n", instr); - - PC -= 2; - Exception(EXCEPTION_ILLEGAL, VECNUM_ILLEGAL); -} - - -INLINE void M68K::LINEA(void) -{ - PC -= 2; - Exception(EXCEPTION_ILLEGAL, VECNUM_LINEA); -} - -INLINE void M68K::LINEF(void) -{ - PC -= 2; - Exception(EXCEPTION_ILLEGAL, VECNUM_LINEF); -} - - -// -// NOP -// -INLINE void M68K::NOP(void) -{ - -} - - -// -// RESET -// -INLINE void M68K::RESET(void) -{ - timestamp += 2; - // - BusRESET(true); - timestamp += 124; - BusRESET(false); - // - timestamp += 2; -} - - -// -// STOP -// -INLINE void M68K::STOP(void) -{ - uint16 new_SR = ReadOp(); - - SetSR(new_SR); - XPending |= XPENDING_MASK_STOPPED; -} - - -INLINE bool M68K::CheckPrivilege(void) -{ - if(MDFN_UNLIKELY(!GetSVisor())) - { - PC -= 2; - Exception(EXCEPTION_PRIVILEGE, VECNUM_PRIVILEGE); - return false; - } - - return true; -} - -// -// -INLINE void M68K::InternalStep(void) -{ - if(MDFN_UNLIKELY(XPending)) - { - if(MDFN_LIKELY(!(XPending & XPENDING_MASK_EXTHALTED))) - { - if(MDFN_UNLIKELY(XPending & XPENDING_MASK_RESET)) - { - XPending &= ~XPENDING_MASK_RESET; - - SetSVisor(true); - SetTrace(false); - SetIMask(0x7); - - A[7] = Read(VECNUM_RESET_SSP << 2); - PC = Read(VECNUM_RESET_PC << 2); - - return; - } - else if(XPending & (XPENDING_MASK_INT | XPENDING_MASK_NMI)) - { - assert(IPL == 0x7 || IPL > ((GetSR() >> 8) & 0x7)); - XPending &= ~(XPENDING_MASK_STOPPED | XPENDING_MASK_INT | XPENDING_MASK_NMI); - - Exception(EXCEPTION_INT, VECNUM_INT_BASE); - - return; - } - } - - // STOP and ExtHalted fallthrough: - timestamp += 4; - return; - } - // - // - // - uint16 instr = ReadOp(); - const unsigned instr_b11_b9 = (instr >> 9) & 0x7; - const unsigned instr_b2_b0 = instr & 0x7; - -#if 0 - printf("PC=%08x: %04x ---", PC - 2, instr); - - for(unsigned i = 0; i < 8; i++) - printf(" A%u=0x%08x", i, A[i]); - - for(unsigned i = 0; i < 8; i++) - printf(" D%u=0x%08x", i, D[i]); - - printf("\n"); -#endif - switch(instr) - { - default: ILLEGAL(instr); break; - #include "m68k_instr.inc" - } -} - - -void NO_INLINE M68K::Run(int32 run_until_time) -{ - while(MDFN_LIKELY(timestamp < run_until_time)) - InternalStep(); -} - -void NO_INLINE M68K::Step(void) -{ - //printf("%08x\n", PC); - InternalStep(); -} - -// -// Reset() may be called from BusRESET, which is called from RESET, so ensure it continues working for that case. -// -void M68K::Reset(bool powering_up) -{ - if(powering_up) - { - for(unsigned i = 0; i < 8; i++) - D[i] = 0; - - for(unsigned i = 0; i < 8; i++) - A[i] = 0; - - SP_Inactive = 0; - - SetSR(0); - } - XPending = (XPending & ~XPENDING_MASK_STOPPED) | XPENDING_MASK_RESET; -} - - -// -// -// -uint32 M68K::GetRegister(unsigned which, char* special, const uint32 special_len) -{ - switch(which) - { - default: - return 0xDEADBEEF; - - case GSREG_D0: case GSREG_D1: case GSREG_D2: case GSREG_D3: - case GSREG_D4: case GSREG_D5: case GSREG_D6: case GSREG_D7: - return D[which - GSREG_D0]; - - case GSREG_A0: case GSREG_A1: case GSREG_A2: case GSREG_A3: - case GSREG_A4: case GSREG_A5: case GSREG_A6: case GSREG_A7: - return A[which - GSREG_A0]; - - case GSREG_PC: - return PC; - - case GSREG_SR: - return GetSR(); - - case GSREG_SSP: - if(GetSVisor()) - return A[7]; - else - return SP_Inactive; - - case GSREG_USP: - if(!GetSVisor()) - return A[7]; - else - return SP_Inactive; - } -} - -void M68K::SetRegister(unsigned which, uint32 value) -{ - switch(which) - { - case GSREG_D0: case GSREG_D1: case GSREG_D2: case GSREG_D3: - case GSREG_D4: case GSREG_D5: case GSREG_D6: case GSREG_D7: - D[which - GSREG_D0] = value; - break; - - case GSREG_A0: case GSREG_A1: case GSREG_A2: case GSREG_A3: - case GSREG_A4: case GSREG_A5: case GSREG_A6: case GSREG_A7: - A[which - GSREG_A0] = value; - break; - - case GSREG_PC: - PC = value; - break; - - case GSREG_SR: - SetSR(value); - break; - - case GSREG_SSP: - if(GetSVisor()) - A[7] = value; - else - SP_Inactive = value; - break; - - case GSREG_USP: - if(!GetSVisor()) - A[7] = value; - else - SP_Inactive = value; - break; - } -} - diff --git a/waterbox/ss/m68k/m68k.h b/waterbox/ss/m68k/m68k.h deleted file mode 100644 index 11b67cc687..0000000000 --- a/waterbox/ss/m68k/m68k.h +++ /dev/null @@ -1,492 +0,0 @@ -/******************************************************************************/ -/* Mednafen - Multi-system Emulator */ -/******************************************************************************/ -/* m68k.h - Motorola 68000 CPU Emulator -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_M68K_H -#define __MDFN_M68K_H - -#include "../ss.h" - -class M68K -{ - public: - - M68K(const bool rev_e = false) MDFN_COLD; - ~M68K() MDFN_COLD; - - void Run(int32 run_until_time); - void Step(void); - - void Reset(bool powering_up) MDFN_COLD; - - void SetIPL(uint8 ipl_new); - void SetExtHalted(bool state); - - // - // - // - // - // - // - // - // - union - { - uint32 DA[16]; - struct - { - uint32 D[8]; - uint32 A[8]; - }; - }; - int32 timestamp; - - uint32 PC; - uint8 SRHB; - uint8 IPL; - - bool Flag_Z, Flag_N; - bool Flag_X, Flag_C, Flag_V; - - uint32 SP_Inactive; - uint32 XPending; - enum - { - XPENDING_MASK_INT = 0x0001, - XPENDING_MASK_NMI = 0x0002, - XPENDING_MASK_RESET = 0x0010, - XPENDING_MASK_STOPPED = 0x0100, // via STOP instruction - XPENDING_MASK_EXTHALTED= 0x1000 - }; - - const bool Revision_E; - - //private: - void RecalcInt(void); - - template - T Read(uint32 addr); - - uint16 ReadOp(void); - - template - void Write(uint32 addr, const T val); - - template - void Push(const T value); - - template - T Pull(void); - - enum AddressMode - { - DATA_REG_DIR, - ADDR_REG_DIR, - - ADDR_REG_INDIR, - ADDR_REG_INDIR_POST, - ADDR_REG_INDIR_PRE, - - ADDR_REG_INDIR_DISP, - - ADDR_REG_INDIR_INDX, - - ABS_SHORT, - ABS_LONG, - - PC_DISP, - PC_INDEX, - - IMMEDIATE - }; - - // - // MOVE byte and word: instructions, 2 cycle penalty for source predecrement only - // 2 cycle penalty for (d8, An, Xn) for both source and dest ams - // 2 cycle penalty for (d8, PC, Xn) for dest am - // - - // - // Careful on declaration order of HAM objects(needs to be source then dest). - // - template - struct HAM; - - void SetC(bool val); - void SetV(bool val); - void SetZ(bool val); - void SetN(bool val); - void SetX(bool val); - - bool GetC(void); - bool GetV(void); - bool GetZ(void); - bool GetN(void); - bool GetX(void); - - void SetCX(bool val); - - template - void CalcZN(const T val); - - template - void CalcCX(const uint64& val); - - uint8 GetCCR(void); - void SetCCR(uint8 val); - uint16 GetSR(void); - void SetSR(uint16 val); - - uint8 GetIMask(void); - void SetIMask(uint8 val); - - bool GetSVisor(void); - void SetSVisor(bool value); - bool GetTrace(void); - void SetTrace(bool value); - - // - // - // - enum - { - VECNUM_RESET_SSP = 0, - VECNUM_RESET_PC = 1, - VECNUM_BUS_ERROR = 2, - VECNUM_ADDRESS_ERROR = 3, - VECNUM_ILLEGAL = 4, - VECNUM_ZERO_DIVIDE = 5, - VECNUM_CHK = 6, - VECNUM_TRAPV = 7, - VECNUM_PRIVILEGE = 8, - VECNUM_TRACE = 9, - VECNUM_LINEA = 10, - VECNUM_LINEF = 11, - - VECNUM_UNINI_INT = 15, - - VECNUM_SPURIOUS_INT = 24, - VECNUM_INT_BASE = 24, - - VECNUM_TRAP_BASE = 32 - }; - - enum - { - EXCEPTION_RESET = 0, - EXCEPTION_BUS_ERROR, - EXCEPTION_ADDRESS_ERROR, - EXCEPTION_ILLEGAL, - EXCEPTION_ZERO_DIVIDE, - EXCEPTION_CHK, - EXCEPTION_TRAPV, - EXCEPTION_PRIVILEGE, - EXCEPTION_TRACE, - - EXCEPTION_INT, - EXCEPTION_TRAP - }; - - void NO_INLINE Exception(unsigned which, unsigned vecnum); - - template - void ADD(HAM &src, HAM &dst); - - template - void ADDX(HAM &src, HAM &dst); - - template - DT Subtract(HAM &src, HAM &dst); - - template - void SUB(HAM &src, HAM &dst); - - template - void SUBX(HAM &src, HAM &dst); - - template - void NEG(HAM &dst); - - template - void NEGX(HAM &dst); - - template - void CMP(HAM &src, HAM &dst); - - template - void CHK(HAM &src, HAM &dst); - - template - void OR(HAM &src, HAM &dst); - - template - void EOR(HAM &src, HAM &dst); - - template - void AND(HAM &src, HAM &dst); - - void ORI_CCR(void); - void ORI_SR(void); - void ANDI_CCR(void); - void ANDI_SR(void); - void EORI_CCR(void); - void EORI_SR(void); - - template - void MULU(HAM &src, const unsigned dr); - - template - void MULS(HAM &src, const unsigned dr); - - template - void Divide(uint16 divisor, const unsigned dr); - - template - void DIVU(HAM &src, const unsigned dr); - - template - void DIVS(HAM &src, const unsigned dr); - - template - void ABCD(HAM &src, HAM &dst); - - uint8 DecimalSubtractX(const uint8 src_data, const uint8 dst_data); - - template - void SBCD(HAM &src, HAM &dst); - - template - void NBCD(HAM &dst); - - template - void MOVEP(const unsigned ar, const unsigned dr); - - template - void BTST(HAM &targ, unsigned wb); - - template - void BCHG(HAM &targ, unsigned wb); - - template - void BCLR(HAM &targ, unsigned wb); - - template - void BSET(HAM &targ, unsigned wb); - - template - void MOVE(HAM &src, HAM &dst); - - template - void MOVEA(HAM &src, const unsigned ar); - - template - void MOVEM_to_MEM(const uint16 reglist, HAM &dst); - - template - void MOVEM_to_REGS(HAM &src, const uint16 reglist); - - template - void ShiftBase(HAM &targ, unsigned count); - - template - void ASL(HAM &targ, unsigned count); - - template - void ASR(HAM &targ, unsigned count); - - template - void LSL(HAM &targ, unsigned count); - - template - void LSR(HAM &targ, unsigned count); - - template - void RotateBase(HAM &targ, unsigned count); - - template - void ROL(HAM &targ, unsigned count); - - template - void ROR(HAM &targ, unsigned count); - - template - void ROXL(HAM &targ, unsigned count); - - template - void ROXR(HAM &targ, unsigned count); - -#if 0 -static uint8 TAS_Callback(uint8 data) -{ - CalcZN(data); - SetC(false); - SetV(false); - - data |= 0x80; - return data; -} -#endif - - template - void TAS(HAM &dst); - - template - void TST(HAM &dst); - - template - void CLR(HAM &dst); - - template - void NOT(HAM &dst); - - template - void EXT(HAM &dst); - - void SWAP(const unsigned dr); - - void EXG(uint32* a, uint32* b); - - template - bool TestCond(void); - - template - void Bxx(uint32 disp); - - template - void DBcc(const unsigned dr); - - template - void Scc(HAM &dst); - - template - void JSR(HAM &targ); - - template - void JMP(HAM &targ); - - template - void MOVE_from_SR(HAM &dst); - - template - void MOVE_to_CCR(HAM &src); - - template - void MOVE_to_SR(HAM &src); - - template - void MOVE_USP(const unsigned ar); - - template - void LEA(HAM &src, const unsigned ar); - - template - void PEA(HAM &src); - void UNLK(const unsigned ar); - void LINK(const unsigned ar); - void RTE(void); - void RTR(void); - void RTS(void); - void TRAP(const unsigned vf); - void TRAPV(void); - void ILLEGAL(const uint16 instr); - void LINEA(void); - void LINEF(void); - void NOP(void); - void RESET(void); - void STOP(void); - - bool CheckPrivilege(void); - - void InternalStep(void); - - // - // - // - // - // - // These externally-provided functions should add >= 4 to M68K::timestamp per call: - enum { BUS_INT_ACK_AUTO = -1 }; - - uint16 (MDFN_FASTCALL *BusReadInstr)(uint32 A); - uint8 (MDFN_FASTCALL *BusRead8)(uint32 A); - uint16 (MDFN_FASTCALL *BusRead16)(uint32 A); - void (MDFN_FASTCALL *BusWrite8)(uint32 A, uint8 V); - void (MDFN_FASTCALL *BusWrite16)(uint32 A, uint16 V); - // - // - void (MDFN_FASTCALL *BusRMW)(uint32 A, uint8 (MDFN_FASTCALL *cb)(M68K*, uint8)); - unsigned (MDFN_FASTCALL *BusIntAck)(uint8 level); - void (MDFN_FASTCALL *BusRESET)(bool state); // Optional; Calling Reset(false) from this callback *is* permitted. - - // - // - // - void (*DBG_Warning)(const char* format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2); - void (*DBG_Verbose)(const char* format, ...) noexcept MDFN_FORMATSTR(gnu_printf, 1, 2); - // - // - // - public: - enum - { - GSREG_D0 = 0, - GSREG_D1, - GSREG_D2, - GSREG_D3, - GSREG_D4, - GSREG_D5, - GSREG_D6, - GSREG_D7, - - GSREG_A0 = 8, - GSREG_A1, - GSREG_A2, - GSREG_A3, - GSREG_A4, - GSREG_A5, - GSREG_A6, - GSREG_A7, - - GSREG_PC = 16, - GSREG_SR, - GSREG_SSP, - GSREG_USP - }; - - uint32 GetRegister(unsigned which, char* special = nullptr, const uint32 special_len = 0); - void SetRegister(unsigned which, uint32 value); - INLINE void DupeState(const M68K* const src) - { - memcpy(DA, src->DA, 16 * sizeof(uint32)); - timestamp = src->timestamp; - PC = src->PC; - SRHB = src->SRHB; - IPL = src->IPL; - Flag_Z = src->Flag_Z; - Flag_N = src->Flag_N; - Flag_X = src->Flag_X; - Flag_C = src->Flag_C; - Flag_V = src->Flag_V; - SP_Inactive = src->SP_Inactive; - XPending = src->XPending; - } -}; - -#endif diff --git a/waterbox/ss/m68k/m68k_instr.inc b/waterbox/ss/m68k/m68k_instr.inc deleted file mode 100644 index 23a1d51940..0000000000 --- a/waterbox/ss/m68k/m68k_instr.inc +++ /dev/null @@ -1,61700 +0,0 @@ -case 0x023c: - { - ANDI_CCR(); - } - break; - -case 0x6000: -case 0x6001: -case 0x6002: -case 0x6003: -case 0x6004: -case 0x6005: -case 0x6006: -case 0x6007: -case 0x6008: -case 0x6009: -case 0x600a: -case 0x600b: -case 0x600c: -case 0x600d: -case 0x600e: -case 0x600f: -case 0x6010: -case 0x6011: -case 0x6012: -case 0x6013: -case 0x6014: -case 0x6015: -case 0x6016: -case 0x6017: -case 0x6018: -case 0x6019: -case 0x601a: -case 0x601b: -case 0x601c: -case 0x601d: -case 0x601e: -case 0x601f: -case 0x6020: -case 0x6021: -case 0x6022: -case 0x6023: -case 0x6024: -case 0x6025: -case 0x6026: -case 0x6027: -case 0x6028: -case 0x6029: -case 0x602a: -case 0x602b: -case 0x602c: -case 0x602d: -case 0x602e: -case 0x602f: -case 0x6030: -case 0x6031: -case 0x6032: -case 0x6033: -case 0x6034: -case 0x6035: -case 0x6036: -case 0x6037: -case 0x6038: -case 0x6039: -case 0x603a: -case 0x603b: -case 0x603c: -case 0x603d: -case 0x603e: -case 0x603f: -case 0x6040: -case 0x6041: -case 0x6042: -case 0x6043: -case 0x6044: -case 0x6045: -case 0x6046: -case 0x6047: -case 0x6048: -case 0x6049: -case 0x604a: -case 0x604b: -case 0x604c: -case 0x604d: -case 0x604e: -case 0x604f: -case 0x6050: -case 0x6051: -case 0x6052: -case 0x6053: -case 0x6054: -case 0x6055: -case 0x6056: -case 0x6057: -case 0x6058: -case 0x6059: -case 0x605a: -case 0x605b: -case 0x605c: -case 0x605d: -case 0x605e: -case 0x605f: -case 0x6060: -case 0x6061: -case 0x6062: -case 0x6063: -case 0x6064: -case 0x6065: -case 0x6066: -case 0x6067: -case 0x6068: -case 0x6069: -case 0x606a: -case 0x606b: -case 0x606c: -case 0x606d: -case 0x606e: -case 0x606f: -case 0x6070: -case 0x6071: -case 0x6072: -case 0x6073: -case 0x6074: -case 0x6075: -case 0x6076: -case 0x6077: -case 0x6078: -case 0x6079: -case 0x607a: -case 0x607b: -case 0x607c: -case 0x607d: -case 0x607e: -case 0x607f: -case 0x6080: -case 0x6081: -case 0x6082: -case 0x6083: -case 0x6084: -case 0x6085: -case 0x6086: -case 0x6087: -case 0x6088: -case 0x6089: -case 0x608a: -case 0x608b: -case 0x608c: -case 0x608d: -case 0x608e: -case 0x608f: -case 0x6090: -case 0x6091: -case 0x6092: -case 0x6093: -case 0x6094: -case 0x6095: -case 0x6096: -case 0x6097: -case 0x6098: -case 0x6099: -case 0x609a: -case 0x609b: -case 0x609c: -case 0x609d: -case 0x609e: -case 0x609f: -case 0x60a0: -case 0x60a1: -case 0x60a2: -case 0x60a3: -case 0x60a4: -case 0x60a5: -case 0x60a6: -case 0x60a7: -case 0x60a8: -case 0x60a9: -case 0x60aa: -case 0x60ab: -case 0x60ac: -case 0x60ad: -case 0x60ae: -case 0x60af: -case 0x60b0: -case 0x60b1: -case 0x60b2: -case 0x60b3: -case 0x60b4: -case 0x60b5: -case 0x60b6: -case 0x60b7: -case 0x60b8: -case 0x60b9: -case 0x60ba: -case 0x60bb: -case 0x60bc: -case 0x60bd: -case 0x60be: -case 0x60bf: -case 0x60c0: -case 0x60c1: -case 0x60c2: -case 0x60c3: -case 0x60c4: -case 0x60c5: -case 0x60c6: -case 0x60c7: -case 0x60c8: -case 0x60c9: -case 0x60ca: -case 0x60cb: -case 0x60cc: -case 0x60cd: -case 0x60ce: -case 0x60cf: -case 0x60d0: -case 0x60d1: -case 0x60d2: -case 0x60d3: -case 0x60d4: -case 0x60d5: -case 0x60d6: -case 0x60d7: -case 0x60d8: -case 0x60d9: -case 0x60da: -case 0x60db: -case 0x60dc: -case 0x60dd: -case 0x60de: -case 0x60df: -case 0x60e0: -case 0x60e1: -case 0x60e2: -case 0x60e3: -case 0x60e4: -case 0x60e5: -case 0x60e6: -case 0x60e7: -case 0x60e8: -case 0x60e9: -case 0x60ea: -case 0x60eb: -case 0x60ec: -case 0x60ed: -case 0x60ee: -case 0x60ef: -case 0x60f0: -case 0x60f1: -case 0x60f2: -case 0x60f3: -case 0x60f4: -case 0x60f5: -case 0x60f6: -case 0x60f7: -case 0x60f8: -case 0x60f9: -case 0x60fa: -case 0x60fb: -case 0x60fc: -case 0x60fd: -case 0x60fe: -case 0x60ff: - { - Bxx<0x00>((int8)instr); - } - break; - -case 0x6100: -case 0x6101: -case 0x6102: -case 0x6103: -case 0x6104: -case 0x6105: -case 0x6106: -case 0x6107: -case 0x6108: -case 0x6109: -case 0x610a: -case 0x610b: -case 0x610c: -case 0x610d: -case 0x610e: -case 0x610f: -case 0x6110: -case 0x6111: -case 0x6112: -case 0x6113: -case 0x6114: -case 0x6115: -case 0x6116: -case 0x6117: -case 0x6118: -case 0x6119: -case 0x611a: -case 0x611b: -case 0x611c: -case 0x611d: -case 0x611e: -case 0x611f: -case 0x6120: -case 0x6121: -case 0x6122: -case 0x6123: -case 0x6124: -case 0x6125: -case 0x6126: -case 0x6127: -case 0x6128: -case 0x6129: -case 0x612a: -case 0x612b: -case 0x612c: -case 0x612d: -case 0x612e: -case 0x612f: -case 0x6130: -case 0x6131: -case 0x6132: -case 0x6133: -case 0x6134: -case 0x6135: -case 0x6136: -case 0x6137: -case 0x6138: -case 0x6139: -case 0x613a: -case 0x613b: -case 0x613c: -case 0x613d: -case 0x613e: -case 0x613f: -case 0x6140: -case 0x6141: -case 0x6142: -case 0x6143: -case 0x6144: -case 0x6145: -case 0x6146: -case 0x6147: -case 0x6148: -case 0x6149: -case 0x614a: -case 0x614b: -case 0x614c: -case 0x614d: -case 0x614e: -case 0x614f: -case 0x6150: -case 0x6151: -case 0x6152: -case 0x6153: -case 0x6154: -case 0x6155: -case 0x6156: -case 0x6157: -case 0x6158: -case 0x6159: -case 0x615a: -case 0x615b: -case 0x615c: -case 0x615d: -case 0x615e: -case 0x615f: -case 0x6160: -case 0x6161: -case 0x6162: -case 0x6163: -case 0x6164: -case 0x6165: -case 0x6166: -case 0x6167: -case 0x6168: -case 0x6169: -case 0x616a: -case 0x616b: -case 0x616c: -case 0x616d: -case 0x616e: -case 0x616f: -case 0x6170: -case 0x6171: -case 0x6172: -case 0x6173: -case 0x6174: -case 0x6175: -case 0x6176: -case 0x6177: -case 0x6178: -case 0x6179: -case 0x617a: -case 0x617b: -case 0x617c: -case 0x617d: -case 0x617e: -case 0x617f: -case 0x6180: -case 0x6181: -case 0x6182: -case 0x6183: -case 0x6184: -case 0x6185: -case 0x6186: -case 0x6187: -case 0x6188: -case 0x6189: -case 0x618a: -case 0x618b: -case 0x618c: -case 0x618d: -case 0x618e: -case 0x618f: -case 0x6190: -case 0x6191: -case 0x6192: -case 0x6193: -case 0x6194: -case 0x6195: -case 0x6196: -case 0x6197: -case 0x6198: -case 0x6199: -case 0x619a: -case 0x619b: -case 0x619c: -case 0x619d: -case 0x619e: -case 0x619f: -case 0x61a0: -case 0x61a1: -case 0x61a2: -case 0x61a3: -case 0x61a4: -case 0x61a5: -case 0x61a6: -case 0x61a7: -case 0x61a8: -case 0x61a9: -case 0x61aa: -case 0x61ab: -case 0x61ac: -case 0x61ad: -case 0x61ae: -case 0x61af: -case 0x61b0: -case 0x61b1: -case 0x61b2: -case 0x61b3: -case 0x61b4: -case 0x61b5: -case 0x61b6: -case 0x61b7: -case 0x61b8: -case 0x61b9: -case 0x61ba: -case 0x61bb: -case 0x61bc: -case 0x61bd: -case 0x61be: -case 0x61bf: -case 0x61c0: -case 0x61c1: -case 0x61c2: -case 0x61c3: -case 0x61c4: -case 0x61c5: -case 0x61c6: -case 0x61c7: -case 0x61c8: -case 0x61c9: -case 0x61ca: -case 0x61cb: -case 0x61cc: -case 0x61cd: -case 0x61ce: -case 0x61cf: -case 0x61d0: -case 0x61d1: -case 0x61d2: -case 0x61d3: -case 0x61d4: -case 0x61d5: -case 0x61d6: -case 0x61d7: -case 0x61d8: -case 0x61d9: -case 0x61da: -case 0x61db: -case 0x61dc: -case 0x61dd: -case 0x61de: -case 0x61df: -case 0x61e0: -case 0x61e1: -case 0x61e2: -case 0x61e3: -case 0x61e4: -case 0x61e5: -case 0x61e6: -case 0x61e7: -case 0x61e8: -case 0x61e9: -case 0x61ea: -case 0x61eb: -case 0x61ec: -case 0x61ed: -case 0x61ee: -case 0x61ef: -case 0x61f0: -case 0x61f1: -case 0x61f2: -case 0x61f3: -case 0x61f4: -case 0x61f5: -case 0x61f6: -case 0x61f7: -case 0x61f8: -case 0x61f9: -case 0x61fa: -case 0x61fb: -case 0x61fc: -case 0x61fd: -case 0x61fe: -case 0x61ff: - { - Bxx<0x01>((int8)instr); - } - break; - -case 0x6200: -case 0x6201: -case 0x6202: -case 0x6203: -case 0x6204: -case 0x6205: -case 0x6206: -case 0x6207: -case 0x6208: -case 0x6209: -case 0x620a: -case 0x620b: -case 0x620c: -case 0x620d: -case 0x620e: -case 0x620f: -case 0x6210: -case 0x6211: -case 0x6212: -case 0x6213: -case 0x6214: -case 0x6215: -case 0x6216: -case 0x6217: -case 0x6218: -case 0x6219: -case 0x621a: -case 0x621b: -case 0x621c: -case 0x621d: -case 0x621e: -case 0x621f: -case 0x6220: -case 0x6221: -case 0x6222: -case 0x6223: -case 0x6224: -case 0x6225: -case 0x6226: -case 0x6227: -case 0x6228: -case 0x6229: -case 0x622a: -case 0x622b: -case 0x622c: -case 0x622d: -case 0x622e: -case 0x622f: -case 0x6230: -case 0x6231: -case 0x6232: -case 0x6233: -case 0x6234: -case 0x6235: -case 0x6236: -case 0x6237: -case 0x6238: -case 0x6239: -case 0x623a: -case 0x623b: -case 0x623c: -case 0x623d: -case 0x623e: -case 0x623f: -case 0x6240: -case 0x6241: -case 0x6242: -case 0x6243: -case 0x6244: -case 0x6245: -case 0x6246: -case 0x6247: -case 0x6248: -case 0x6249: -case 0x624a: -case 0x624b: -case 0x624c: -case 0x624d: -case 0x624e: -case 0x624f: -case 0x6250: -case 0x6251: -case 0x6252: -case 0x6253: -case 0x6254: -case 0x6255: -case 0x6256: -case 0x6257: -case 0x6258: -case 0x6259: -case 0x625a: -case 0x625b: -case 0x625c: -case 0x625d: -case 0x625e: -case 0x625f: -case 0x6260: -case 0x6261: -case 0x6262: -case 0x6263: -case 0x6264: -case 0x6265: -case 0x6266: -case 0x6267: -case 0x6268: -case 0x6269: -case 0x626a: -case 0x626b: -case 0x626c: -case 0x626d: -case 0x626e: -case 0x626f: -case 0x6270: -case 0x6271: -case 0x6272: -case 0x6273: -case 0x6274: -case 0x6275: -case 0x6276: -case 0x6277: -case 0x6278: -case 0x6279: -case 0x627a: -case 0x627b: -case 0x627c: -case 0x627d: -case 0x627e: -case 0x627f: -case 0x6280: -case 0x6281: -case 0x6282: -case 0x6283: -case 0x6284: -case 0x6285: -case 0x6286: -case 0x6287: -case 0x6288: -case 0x6289: -case 0x628a: -case 0x628b: -case 0x628c: -case 0x628d: -case 0x628e: -case 0x628f: -case 0x6290: -case 0x6291: -case 0x6292: -case 0x6293: -case 0x6294: -case 0x6295: -case 0x6296: -case 0x6297: -case 0x6298: -case 0x6299: -case 0x629a: -case 0x629b: -case 0x629c: -case 0x629d: -case 0x629e: -case 0x629f: -case 0x62a0: -case 0x62a1: -case 0x62a2: -case 0x62a3: -case 0x62a4: -case 0x62a5: -case 0x62a6: -case 0x62a7: -case 0x62a8: -case 0x62a9: -case 0x62aa: -case 0x62ab: -case 0x62ac: -case 0x62ad: -case 0x62ae: -case 0x62af: -case 0x62b0: -case 0x62b1: -case 0x62b2: -case 0x62b3: -case 0x62b4: -case 0x62b5: -case 0x62b6: -case 0x62b7: -case 0x62b8: -case 0x62b9: -case 0x62ba: -case 0x62bb: -case 0x62bc: -case 0x62bd: -case 0x62be: -case 0x62bf: -case 0x62c0: -case 0x62c1: -case 0x62c2: -case 0x62c3: -case 0x62c4: -case 0x62c5: -case 0x62c6: -case 0x62c7: -case 0x62c8: -case 0x62c9: -case 0x62ca: -case 0x62cb: -case 0x62cc: -case 0x62cd: -case 0x62ce: -case 0x62cf: -case 0x62d0: -case 0x62d1: -case 0x62d2: -case 0x62d3: -case 0x62d4: -case 0x62d5: -case 0x62d6: -case 0x62d7: -case 0x62d8: -case 0x62d9: -case 0x62da: -case 0x62db: -case 0x62dc: -case 0x62dd: -case 0x62de: -case 0x62df: -case 0x62e0: -case 0x62e1: -case 0x62e2: -case 0x62e3: -case 0x62e4: -case 0x62e5: -case 0x62e6: -case 0x62e7: -case 0x62e8: -case 0x62e9: -case 0x62ea: -case 0x62eb: -case 0x62ec: -case 0x62ed: -case 0x62ee: -case 0x62ef: -case 0x62f0: -case 0x62f1: -case 0x62f2: -case 0x62f3: -case 0x62f4: -case 0x62f5: -case 0x62f6: -case 0x62f7: -case 0x62f8: -case 0x62f9: -case 0x62fa: -case 0x62fb: -case 0x62fc: -case 0x62fd: -case 0x62fe: -case 0x62ff: - { - Bxx<0x02>((int8)instr); - } - break; - -case 0x6300: -case 0x6301: -case 0x6302: -case 0x6303: -case 0x6304: -case 0x6305: -case 0x6306: -case 0x6307: -case 0x6308: -case 0x6309: -case 0x630a: -case 0x630b: -case 0x630c: -case 0x630d: -case 0x630e: -case 0x630f: -case 0x6310: -case 0x6311: -case 0x6312: -case 0x6313: -case 0x6314: -case 0x6315: -case 0x6316: -case 0x6317: -case 0x6318: -case 0x6319: -case 0x631a: -case 0x631b: -case 0x631c: -case 0x631d: -case 0x631e: -case 0x631f: -case 0x6320: -case 0x6321: -case 0x6322: -case 0x6323: -case 0x6324: -case 0x6325: -case 0x6326: -case 0x6327: -case 0x6328: -case 0x6329: -case 0x632a: -case 0x632b: -case 0x632c: -case 0x632d: -case 0x632e: -case 0x632f: -case 0x6330: -case 0x6331: -case 0x6332: -case 0x6333: -case 0x6334: -case 0x6335: -case 0x6336: -case 0x6337: -case 0x6338: -case 0x6339: -case 0x633a: -case 0x633b: -case 0x633c: -case 0x633d: -case 0x633e: -case 0x633f: -case 0x6340: -case 0x6341: -case 0x6342: -case 0x6343: -case 0x6344: -case 0x6345: -case 0x6346: -case 0x6347: -case 0x6348: -case 0x6349: -case 0x634a: -case 0x634b: -case 0x634c: -case 0x634d: -case 0x634e: -case 0x634f: -case 0x6350: -case 0x6351: -case 0x6352: -case 0x6353: -case 0x6354: -case 0x6355: -case 0x6356: -case 0x6357: -case 0x6358: -case 0x6359: -case 0x635a: -case 0x635b: -case 0x635c: -case 0x635d: -case 0x635e: -case 0x635f: -case 0x6360: -case 0x6361: -case 0x6362: -case 0x6363: -case 0x6364: -case 0x6365: -case 0x6366: -case 0x6367: -case 0x6368: -case 0x6369: -case 0x636a: -case 0x636b: -case 0x636c: -case 0x636d: -case 0x636e: -case 0x636f: -case 0x6370: -case 0x6371: -case 0x6372: -case 0x6373: -case 0x6374: -case 0x6375: -case 0x6376: -case 0x6377: -case 0x6378: -case 0x6379: -case 0x637a: -case 0x637b: -case 0x637c: -case 0x637d: -case 0x637e: -case 0x637f: -case 0x6380: -case 0x6381: -case 0x6382: -case 0x6383: -case 0x6384: -case 0x6385: -case 0x6386: -case 0x6387: -case 0x6388: -case 0x6389: -case 0x638a: -case 0x638b: -case 0x638c: -case 0x638d: -case 0x638e: -case 0x638f: -case 0x6390: -case 0x6391: -case 0x6392: -case 0x6393: -case 0x6394: -case 0x6395: -case 0x6396: -case 0x6397: -case 0x6398: -case 0x6399: -case 0x639a: -case 0x639b: -case 0x639c: -case 0x639d: -case 0x639e: -case 0x639f: -case 0x63a0: -case 0x63a1: -case 0x63a2: -case 0x63a3: -case 0x63a4: -case 0x63a5: -case 0x63a6: -case 0x63a7: -case 0x63a8: -case 0x63a9: -case 0x63aa: -case 0x63ab: -case 0x63ac: -case 0x63ad: -case 0x63ae: -case 0x63af: -case 0x63b0: -case 0x63b1: -case 0x63b2: -case 0x63b3: -case 0x63b4: -case 0x63b5: -case 0x63b6: -case 0x63b7: -case 0x63b8: -case 0x63b9: -case 0x63ba: -case 0x63bb: -case 0x63bc: -case 0x63bd: -case 0x63be: -case 0x63bf: -case 0x63c0: -case 0x63c1: -case 0x63c2: -case 0x63c3: -case 0x63c4: -case 0x63c5: -case 0x63c6: -case 0x63c7: -case 0x63c8: -case 0x63c9: -case 0x63ca: -case 0x63cb: -case 0x63cc: -case 0x63cd: -case 0x63ce: -case 0x63cf: -case 0x63d0: -case 0x63d1: -case 0x63d2: -case 0x63d3: -case 0x63d4: -case 0x63d5: -case 0x63d6: -case 0x63d7: -case 0x63d8: -case 0x63d9: -case 0x63da: -case 0x63db: -case 0x63dc: -case 0x63dd: -case 0x63de: -case 0x63df: -case 0x63e0: -case 0x63e1: -case 0x63e2: -case 0x63e3: -case 0x63e4: -case 0x63e5: -case 0x63e6: -case 0x63e7: -case 0x63e8: -case 0x63e9: -case 0x63ea: -case 0x63eb: -case 0x63ec: -case 0x63ed: -case 0x63ee: -case 0x63ef: -case 0x63f0: -case 0x63f1: -case 0x63f2: -case 0x63f3: -case 0x63f4: -case 0x63f5: -case 0x63f6: -case 0x63f7: -case 0x63f8: -case 0x63f9: -case 0x63fa: -case 0x63fb: -case 0x63fc: -case 0x63fd: -case 0x63fe: -case 0x63ff: - { - Bxx<0x03>((int8)instr); - } - break; - -case 0x6400: -case 0x6401: -case 0x6402: -case 0x6403: -case 0x6404: -case 0x6405: -case 0x6406: -case 0x6407: -case 0x6408: -case 0x6409: -case 0x640a: -case 0x640b: -case 0x640c: -case 0x640d: -case 0x640e: -case 0x640f: -case 0x6410: -case 0x6411: -case 0x6412: -case 0x6413: -case 0x6414: -case 0x6415: -case 0x6416: -case 0x6417: -case 0x6418: -case 0x6419: -case 0x641a: -case 0x641b: -case 0x641c: -case 0x641d: -case 0x641e: -case 0x641f: -case 0x6420: -case 0x6421: -case 0x6422: -case 0x6423: -case 0x6424: -case 0x6425: -case 0x6426: -case 0x6427: -case 0x6428: -case 0x6429: -case 0x642a: -case 0x642b: -case 0x642c: -case 0x642d: -case 0x642e: -case 0x642f: -case 0x6430: -case 0x6431: -case 0x6432: -case 0x6433: -case 0x6434: -case 0x6435: -case 0x6436: -case 0x6437: -case 0x6438: -case 0x6439: -case 0x643a: -case 0x643b: -case 0x643c: -case 0x643d: -case 0x643e: -case 0x643f: -case 0x6440: -case 0x6441: -case 0x6442: -case 0x6443: -case 0x6444: -case 0x6445: -case 0x6446: -case 0x6447: -case 0x6448: -case 0x6449: -case 0x644a: -case 0x644b: -case 0x644c: -case 0x644d: -case 0x644e: -case 0x644f: -case 0x6450: -case 0x6451: -case 0x6452: -case 0x6453: -case 0x6454: -case 0x6455: -case 0x6456: -case 0x6457: -case 0x6458: -case 0x6459: -case 0x645a: -case 0x645b: -case 0x645c: -case 0x645d: -case 0x645e: -case 0x645f: -case 0x6460: -case 0x6461: -case 0x6462: -case 0x6463: -case 0x6464: -case 0x6465: -case 0x6466: -case 0x6467: -case 0x6468: -case 0x6469: -case 0x646a: -case 0x646b: -case 0x646c: -case 0x646d: -case 0x646e: -case 0x646f: -case 0x6470: -case 0x6471: -case 0x6472: -case 0x6473: -case 0x6474: -case 0x6475: -case 0x6476: -case 0x6477: -case 0x6478: -case 0x6479: -case 0x647a: -case 0x647b: -case 0x647c: -case 0x647d: -case 0x647e: -case 0x647f: -case 0x6480: -case 0x6481: -case 0x6482: -case 0x6483: -case 0x6484: -case 0x6485: -case 0x6486: -case 0x6487: -case 0x6488: -case 0x6489: -case 0x648a: -case 0x648b: -case 0x648c: -case 0x648d: -case 0x648e: -case 0x648f: -case 0x6490: -case 0x6491: -case 0x6492: -case 0x6493: -case 0x6494: -case 0x6495: -case 0x6496: -case 0x6497: -case 0x6498: -case 0x6499: -case 0x649a: -case 0x649b: -case 0x649c: -case 0x649d: -case 0x649e: -case 0x649f: -case 0x64a0: -case 0x64a1: -case 0x64a2: -case 0x64a3: -case 0x64a4: -case 0x64a5: -case 0x64a6: -case 0x64a7: -case 0x64a8: -case 0x64a9: -case 0x64aa: -case 0x64ab: -case 0x64ac: -case 0x64ad: -case 0x64ae: -case 0x64af: -case 0x64b0: -case 0x64b1: -case 0x64b2: -case 0x64b3: -case 0x64b4: -case 0x64b5: -case 0x64b6: -case 0x64b7: -case 0x64b8: -case 0x64b9: -case 0x64ba: -case 0x64bb: -case 0x64bc: -case 0x64bd: -case 0x64be: -case 0x64bf: -case 0x64c0: -case 0x64c1: -case 0x64c2: -case 0x64c3: -case 0x64c4: -case 0x64c5: -case 0x64c6: -case 0x64c7: -case 0x64c8: -case 0x64c9: -case 0x64ca: -case 0x64cb: -case 0x64cc: -case 0x64cd: -case 0x64ce: -case 0x64cf: -case 0x64d0: -case 0x64d1: -case 0x64d2: -case 0x64d3: -case 0x64d4: -case 0x64d5: -case 0x64d6: -case 0x64d7: -case 0x64d8: -case 0x64d9: -case 0x64da: -case 0x64db: -case 0x64dc: -case 0x64dd: -case 0x64de: -case 0x64df: -case 0x64e0: -case 0x64e1: -case 0x64e2: -case 0x64e3: -case 0x64e4: -case 0x64e5: -case 0x64e6: -case 0x64e7: -case 0x64e8: -case 0x64e9: -case 0x64ea: -case 0x64eb: -case 0x64ec: -case 0x64ed: -case 0x64ee: -case 0x64ef: -case 0x64f0: -case 0x64f1: -case 0x64f2: -case 0x64f3: -case 0x64f4: -case 0x64f5: -case 0x64f6: -case 0x64f7: -case 0x64f8: -case 0x64f9: -case 0x64fa: -case 0x64fb: -case 0x64fc: -case 0x64fd: -case 0x64fe: -case 0x64ff: - { - Bxx<0x04>((int8)instr); - } - break; - -case 0x6500: -case 0x6501: -case 0x6502: -case 0x6503: -case 0x6504: -case 0x6505: -case 0x6506: -case 0x6507: -case 0x6508: -case 0x6509: -case 0x650a: -case 0x650b: -case 0x650c: -case 0x650d: -case 0x650e: -case 0x650f: -case 0x6510: -case 0x6511: -case 0x6512: -case 0x6513: -case 0x6514: -case 0x6515: -case 0x6516: -case 0x6517: -case 0x6518: -case 0x6519: -case 0x651a: -case 0x651b: -case 0x651c: -case 0x651d: -case 0x651e: -case 0x651f: -case 0x6520: -case 0x6521: -case 0x6522: -case 0x6523: -case 0x6524: -case 0x6525: -case 0x6526: -case 0x6527: -case 0x6528: -case 0x6529: -case 0x652a: -case 0x652b: -case 0x652c: -case 0x652d: -case 0x652e: -case 0x652f: -case 0x6530: -case 0x6531: -case 0x6532: -case 0x6533: -case 0x6534: -case 0x6535: -case 0x6536: -case 0x6537: -case 0x6538: -case 0x6539: -case 0x653a: -case 0x653b: -case 0x653c: -case 0x653d: -case 0x653e: -case 0x653f: -case 0x6540: -case 0x6541: -case 0x6542: -case 0x6543: -case 0x6544: -case 0x6545: -case 0x6546: -case 0x6547: -case 0x6548: -case 0x6549: -case 0x654a: -case 0x654b: -case 0x654c: -case 0x654d: -case 0x654e: -case 0x654f: -case 0x6550: -case 0x6551: -case 0x6552: -case 0x6553: -case 0x6554: -case 0x6555: -case 0x6556: -case 0x6557: -case 0x6558: -case 0x6559: -case 0x655a: -case 0x655b: -case 0x655c: -case 0x655d: -case 0x655e: -case 0x655f: -case 0x6560: -case 0x6561: -case 0x6562: -case 0x6563: -case 0x6564: -case 0x6565: -case 0x6566: -case 0x6567: -case 0x6568: -case 0x6569: -case 0x656a: -case 0x656b: -case 0x656c: -case 0x656d: -case 0x656e: -case 0x656f: -case 0x6570: -case 0x6571: -case 0x6572: -case 0x6573: -case 0x6574: -case 0x6575: -case 0x6576: -case 0x6577: -case 0x6578: -case 0x6579: -case 0x657a: -case 0x657b: -case 0x657c: -case 0x657d: -case 0x657e: -case 0x657f: -case 0x6580: -case 0x6581: -case 0x6582: -case 0x6583: -case 0x6584: -case 0x6585: -case 0x6586: -case 0x6587: -case 0x6588: -case 0x6589: -case 0x658a: -case 0x658b: -case 0x658c: -case 0x658d: -case 0x658e: -case 0x658f: -case 0x6590: -case 0x6591: -case 0x6592: -case 0x6593: -case 0x6594: -case 0x6595: -case 0x6596: -case 0x6597: -case 0x6598: -case 0x6599: -case 0x659a: -case 0x659b: -case 0x659c: -case 0x659d: -case 0x659e: -case 0x659f: -case 0x65a0: -case 0x65a1: -case 0x65a2: -case 0x65a3: -case 0x65a4: -case 0x65a5: -case 0x65a6: -case 0x65a7: -case 0x65a8: -case 0x65a9: -case 0x65aa: -case 0x65ab: -case 0x65ac: -case 0x65ad: -case 0x65ae: -case 0x65af: -case 0x65b0: -case 0x65b1: -case 0x65b2: -case 0x65b3: -case 0x65b4: -case 0x65b5: -case 0x65b6: -case 0x65b7: -case 0x65b8: -case 0x65b9: -case 0x65ba: -case 0x65bb: -case 0x65bc: -case 0x65bd: -case 0x65be: -case 0x65bf: -case 0x65c0: -case 0x65c1: -case 0x65c2: -case 0x65c3: -case 0x65c4: -case 0x65c5: -case 0x65c6: -case 0x65c7: -case 0x65c8: -case 0x65c9: -case 0x65ca: -case 0x65cb: -case 0x65cc: -case 0x65cd: -case 0x65ce: -case 0x65cf: -case 0x65d0: -case 0x65d1: -case 0x65d2: -case 0x65d3: -case 0x65d4: -case 0x65d5: -case 0x65d6: -case 0x65d7: -case 0x65d8: -case 0x65d9: -case 0x65da: -case 0x65db: -case 0x65dc: -case 0x65dd: -case 0x65de: -case 0x65df: -case 0x65e0: -case 0x65e1: -case 0x65e2: -case 0x65e3: -case 0x65e4: -case 0x65e5: -case 0x65e6: -case 0x65e7: -case 0x65e8: -case 0x65e9: -case 0x65ea: -case 0x65eb: -case 0x65ec: -case 0x65ed: -case 0x65ee: -case 0x65ef: -case 0x65f0: -case 0x65f1: -case 0x65f2: -case 0x65f3: -case 0x65f4: -case 0x65f5: -case 0x65f6: -case 0x65f7: -case 0x65f8: -case 0x65f9: -case 0x65fa: -case 0x65fb: -case 0x65fc: -case 0x65fd: -case 0x65fe: -case 0x65ff: - { - Bxx<0x05>((int8)instr); - } - break; - -case 0x6600: -case 0x6601: -case 0x6602: -case 0x6603: -case 0x6604: -case 0x6605: -case 0x6606: -case 0x6607: -case 0x6608: -case 0x6609: -case 0x660a: -case 0x660b: -case 0x660c: -case 0x660d: -case 0x660e: -case 0x660f: -case 0x6610: -case 0x6611: -case 0x6612: -case 0x6613: -case 0x6614: -case 0x6615: -case 0x6616: -case 0x6617: -case 0x6618: -case 0x6619: -case 0x661a: -case 0x661b: -case 0x661c: -case 0x661d: -case 0x661e: -case 0x661f: -case 0x6620: -case 0x6621: -case 0x6622: -case 0x6623: -case 0x6624: -case 0x6625: -case 0x6626: -case 0x6627: -case 0x6628: -case 0x6629: -case 0x662a: -case 0x662b: -case 0x662c: -case 0x662d: -case 0x662e: -case 0x662f: -case 0x6630: -case 0x6631: -case 0x6632: -case 0x6633: -case 0x6634: -case 0x6635: -case 0x6636: -case 0x6637: -case 0x6638: -case 0x6639: -case 0x663a: -case 0x663b: -case 0x663c: -case 0x663d: -case 0x663e: -case 0x663f: -case 0x6640: -case 0x6641: -case 0x6642: -case 0x6643: -case 0x6644: -case 0x6645: -case 0x6646: -case 0x6647: -case 0x6648: -case 0x6649: -case 0x664a: -case 0x664b: -case 0x664c: -case 0x664d: -case 0x664e: -case 0x664f: -case 0x6650: -case 0x6651: -case 0x6652: -case 0x6653: -case 0x6654: -case 0x6655: -case 0x6656: -case 0x6657: -case 0x6658: -case 0x6659: -case 0x665a: -case 0x665b: -case 0x665c: -case 0x665d: -case 0x665e: -case 0x665f: -case 0x6660: -case 0x6661: -case 0x6662: -case 0x6663: -case 0x6664: -case 0x6665: -case 0x6666: -case 0x6667: -case 0x6668: -case 0x6669: -case 0x666a: -case 0x666b: -case 0x666c: -case 0x666d: -case 0x666e: -case 0x666f: -case 0x6670: -case 0x6671: -case 0x6672: -case 0x6673: -case 0x6674: -case 0x6675: -case 0x6676: -case 0x6677: -case 0x6678: -case 0x6679: -case 0x667a: -case 0x667b: -case 0x667c: -case 0x667d: -case 0x667e: -case 0x667f: -case 0x6680: -case 0x6681: -case 0x6682: -case 0x6683: -case 0x6684: -case 0x6685: -case 0x6686: -case 0x6687: -case 0x6688: -case 0x6689: -case 0x668a: -case 0x668b: -case 0x668c: -case 0x668d: -case 0x668e: -case 0x668f: -case 0x6690: -case 0x6691: -case 0x6692: -case 0x6693: -case 0x6694: -case 0x6695: -case 0x6696: -case 0x6697: -case 0x6698: -case 0x6699: -case 0x669a: -case 0x669b: -case 0x669c: -case 0x669d: -case 0x669e: -case 0x669f: -case 0x66a0: -case 0x66a1: -case 0x66a2: -case 0x66a3: -case 0x66a4: -case 0x66a5: -case 0x66a6: -case 0x66a7: -case 0x66a8: -case 0x66a9: -case 0x66aa: -case 0x66ab: -case 0x66ac: -case 0x66ad: -case 0x66ae: -case 0x66af: -case 0x66b0: -case 0x66b1: -case 0x66b2: -case 0x66b3: -case 0x66b4: -case 0x66b5: -case 0x66b6: -case 0x66b7: -case 0x66b8: -case 0x66b9: -case 0x66ba: -case 0x66bb: -case 0x66bc: -case 0x66bd: -case 0x66be: -case 0x66bf: -case 0x66c0: -case 0x66c1: -case 0x66c2: -case 0x66c3: -case 0x66c4: -case 0x66c5: -case 0x66c6: -case 0x66c7: -case 0x66c8: -case 0x66c9: -case 0x66ca: -case 0x66cb: -case 0x66cc: -case 0x66cd: -case 0x66ce: -case 0x66cf: -case 0x66d0: -case 0x66d1: -case 0x66d2: -case 0x66d3: -case 0x66d4: -case 0x66d5: -case 0x66d6: -case 0x66d7: -case 0x66d8: -case 0x66d9: -case 0x66da: -case 0x66db: -case 0x66dc: -case 0x66dd: -case 0x66de: -case 0x66df: -case 0x66e0: -case 0x66e1: -case 0x66e2: -case 0x66e3: -case 0x66e4: -case 0x66e5: -case 0x66e6: -case 0x66e7: -case 0x66e8: -case 0x66e9: -case 0x66ea: -case 0x66eb: -case 0x66ec: -case 0x66ed: -case 0x66ee: -case 0x66ef: -case 0x66f0: -case 0x66f1: -case 0x66f2: -case 0x66f3: -case 0x66f4: -case 0x66f5: -case 0x66f6: -case 0x66f7: -case 0x66f8: -case 0x66f9: -case 0x66fa: -case 0x66fb: -case 0x66fc: -case 0x66fd: -case 0x66fe: -case 0x66ff: - { - Bxx<0x06>((int8)instr); - } - break; - -case 0x6700: -case 0x6701: -case 0x6702: -case 0x6703: -case 0x6704: -case 0x6705: -case 0x6706: -case 0x6707: -case 0x6708: -case 0x6709: -case 0x670a: -case 0x670b: -case 0x670c: -case 0x670d: -case 0x670e: -case 0x670f: -case 0x6710: -case 0x6711: -case 0x6712: -case 0x6713: -case 0x6714: -case 0x6715: -case 0x6716: -case 0x6717: -case 0x6718: -case 0x6719: -case 0x671a: -case 0x671b: -case 0x671c: -case 0x671d: -case 0x671e: -case 0x671f: -case 0x6720: -case 0x6721: -case 0x6722: -case 0x6723: -case 0x6724: -case 0x6725: -case 0x6726: -case 0x6727: -case 0x6728: -case 0x6729: -case 0x672a: -case 0x672b: -case 0x672c: -case 0x672d: -case 0x672e: -case 0x672f: -case 0x6730: -case 0x6731: -case 0x6732: -case 0x6733: -case 0x6734: -case 0x6735: -case 0x6736: -case 0x6737: -case 0x6738: -case 0x6739: -case 0x673a: -case 0x673b: -case 0x673c: -case 0x673d: -case 0x673e: -case 0x673f: -case 0x6740: -case 0x6741: -case 0x6742: -case 0x6743: -case 0x6744: -case 0x6745: -case 0x6746: -case 0x6747: -case 0x6748: -case 0x6749: -case 0x674a: -case 0x674b: -case 0x674c: -case 0x674d: -case 0x674e: -case 0x674f: -case 0x6750: -case 0x6751: -case 0x6752: -case 0x6753: -case 0x6754: -case 0x6755: -case 0x6756: -case 0x6757: -case 0x6758: -case 0x6759: -case 0x675a: -case 0x675b: -case 0x675c: -case 0x675d: -case 0x675e: -case 0x675f: -case 0x6760: -case 0x6761: -case 0x6762: -case 0x6763: -case 0x6764: -case 0x6765: -case 0x6766: -case 0x6767: -case 0x6768: -case 0x6769: -case 0x676a: -case 0x676b: -case 0x676c: -case 0x676d: -case 0x676e: -case 0x676f: -case 0x6770: -case 0x6771: -case 0x6772: -case 0x6773: -case 0x6774: -case 0x6775: -case 0x6776: -case 0x6777: -case 0x6778: -case 0x6779: -case 0x677a: -case 0x677b: -case 0x677c: -case 0x677d: -case 0x677e: -case 0x677f: -case 0x6780: -case 0x6781: -case 0x6782: -case 0x6783: -case 0x6784: -case 0x6785: -case 0x6786: -case 0x6787: -case 0x6788: -case 0x6789: -case 0x678a: -case 0x678b: -case 0x678c: -case 0x678d: -case 0x678e: -case 0x678f: -case 0x6790: -case 0x6791: -case 0x6792: -case 0x6793: -case 0x6794: -case 0x6795: -case 0x6796: -case 0x6797: -case 0x6798: -case 0x6799: -case 0x679a: -case 0x679b: -case 0x679c: -case 0x679d: -case 0x679e: -case 0x679f: -case 0x67a0: -case 0x67a1: -case 0x67a2: -case 0x67a3: -case 0x67a4: -case 0x67a5: -case 0x67a6: -case 0x67a7: -case 0x67a8: -case 0x67a9: -case 0x67aa: -case 0x67ab: -case 0x67ac: -case 0x67ad: -case 0x67ae: -case 0x67af: -case 0x67b0: -case 0x67b1: -case 0x67b2: -case 0x67b3: -case 0x67b4: -case 0x67b5: -case 0x67b6: -case 0x67b7: -case 0x67b8: -case 0x67b9: -case 0x67ba: -case 0x67bb: -case 0x67bc: -case 0x67bd: -case 0x67be: -case 0x67bf: -case 0x67c0: -case 0x67c1: -case 0x67c2: -case 0x67c3: -case 0x67c4: -case 0x67c5: -case 0x67c6: -case 0x67c7: -case 0x67c8: -case 0x67c9: -case 0x67ca: -case 0x67cb: -case 0x67cc: -case 0x67cd: -case 0x67ce: -case 0x67cf: -case 0x67d0: -case 0x67d1: -case 0x67d2: -case 0x67d3: -case 0x67d4: -case 0x67d5: -case 0x67d6: -case 0x67d7: -case 0x67d8: -case 0x67d9: -case 0x67da: -case 0x67db: -case 0x67dc: -case 0x67dd: -case 0x67de: -case 0x67df: -case 0x67e0: -case 0x67e1: -case 0x67e2: -case 0x67e3: -case 0x67e4: -case 0x67e5: -case 0x67e6: -case 0x67e7: -case 0x67e8: -case 0x67e9: -case 0x67ea: -case 0x67eb: -case 0x67ec: -case 0x67ed: -case 0x67ee: -case 0x67ef: -case 0x67f0: -case 0x67f1: -case 0x67f2: -case 0x67f3: -case 0x67f4: -case 0x67f5: -case 0x67f6: -case 0x67f7: -case 0x67f8: -case 0x67f9: -case 0x67fa: -case 0x67fb: -case 0x67fc: -case 0x67fd: -case 0x67fe: -case 0x67ff: - { - Bxx<0x07>((int8)instr); - } - break; - -case 0x6800: -case 0x6801: -case 0x6802: -case 0x6803: -case 0x6804: -case 0x6805: -case 0x6806: -case 0x6807: -case 0x6808: -case 0x6809: -case 0x680a: -case 0x680b: -case 0x680c: -case 0x680d: -case 0x680e: -case 0x680f: -case 0x6810: -case 0x6811: -case 0x6812: -case 0x6813: -case 0x6814: -case 0x6815: -case 0x6816: -case 0x6817: -case 0x6818: -case 0x6819: -case 0x681a: -case 0x681b: -case 0x681c: -case 0x681d: -case 0x681e: -case 0x681f: -case 0x6820: -case 0x6821: -case 0x6822: -case 0x6823: -case 0x6824: -case 0x6825: -case 0x6826: -case 0x6827: -case 0x6828: -case 0x6829: -case 0x682a: -case 0x682b: -case 0x682c: -case 0x682d: -case 0x682e: -case 0x682f: -case 0x6830: -case 0x6831: -case 0x6832: -case 0x6833: -case 0x6834: -case 0x6835: -case 0x6836: -case 0x6837: -case 0x6838: -case 0x6839: -case 0x683a: -case 0x683b: -case 0x683c: -case 0x683d: -case 0x683e: -case 0x683f: -case 0x6840: -case 0x6841: -case 0x6842: -case 0x6843: -case 0x6844: -case 0x6845: -case 0x6846: -case 0x6847: -case 0x6848: -case 0x6849: -case 0x684a: -case 0x684b: -case 0x684c: -case 0x684d: -case 0x684e: -case 0x684f: -case 0x6850: -case 0x6851: -case 0x6852: -case 0x6853: -case 0x6854: -case 0x6855: -case 0x6856: -case 0x6857: -case 0x6858: -case 0x6859: -case 0x685a: -case 0x685b: -case 0x685c: -case 0x685d: -case 0x685e: -case 0x685f: -case 0x6860: -case 0x6861: -case 0x6862: -case 0x6863: -case 0x6864: -case 0x6865: -case 0x6866: -case 0x6867: -case 0x6868: -case 0x6869: -case 0x686a: -case 0x686b: -case 0x686c: -case 0x686d: -case 0x686e: -case 0x686f: -case 0x6870: -case 0x6871: -case 0x6872: -case 0x6873: -case 0x6874: -case 0x6875: -case 0x6876: -case 0x6877: -case 0x6878: -case 0x6879: -case 0x687a: -case 0x687b: -case 0x687c: -case 0x687d: -case 0x687e: -case 0x687f: -case 0x6880: -case 0x6881: -case 0x6882: -case 0x6883: -case 0x6884: -case 0x6885: -case 0x6886: -case 0x6887: -case 0x6888: -case 0x6889: -case 0x688a: -case 0x688b: -case 0x688c: -case 0x688d: -case 0x688e: -case 0x688f: -case 0x6890: -case 0x6891: -case 0x6892: -case 0x6893: -case 0x6894: -case 0x6895: -case 0x6896: -case 0x6897: -case 0x6898: -case 0x6899: -case 0x689a: -case 0x689b: -case 0x689c: -case 0x689d: -case 0x689e: -case 0x689f: -case 0x68a0: -case 0x68a1: -case 0x68a2: -case 0x68a3: -case 0x68a4: -case 0x68a5: -case 0x68a6: -case 0x68a7: -case 0x68a8: -case 0x68a9: -case 0x68aa: -case 0x68ab: -case 0x68ac: -case 0x68ad: -case 0x68ae: -case 0x68af: -case 0x68b0: -case 0x68b1: -case 0x68b2: -case 0x68b3: -case 0x68b4: -case 0x68b5: -case 0x68b6: -case 0x68b7: -case 0x68b8: -case 0x68b9: -case 0x68ba: -case 0x68bb: -case 0x68bc: -case 0x68bd: -case 0x68be: -case 0x68bf: -case 0x68c0: -case 0x68c1: -case 0x68c2: -case 0x68c3: -case 0x68c4: -case 0x68c5: -case 0x68c6: -case 0x68c7: -case 0x68c8: -case 0x68c9: -case 0x68ca: -case 0x68cb: -case 0x68cc: -case 0x68cd: -case 0x68ce: -case 0x68cf: -case 0x68d0: -case 0x68d1: -case 0x68d2: -case 0x68d3: -case 0x68d4: -case 0x68d5: -case 0x68d6: -case 0x68d7: -case 0x68d8: -case 0x68d9: -case 0x68da: -case 0x68db: -case 0x68dc: -case 0x68dd: -case 0x68de: -case 0x68df: -case 0x68e0: -case 0x68e1: -case 0x68e2: -case 0x68e3: -case 0x68e4: -case 0x68e5: -case 0x68e6: -case 0x68e7: -case 0x68e8: -case 0x68e9: -case 0x68ea: -case 0x68eb: -case 0x68ec: -case 0x68ed: -case 0x68ee: -case 0x68ef: -case 0x68f0: -case 0x68f1: -case 0x68f2: -case 0x68f3: -case 0x68f4: -case 0x68f5: -case 0x68f6: -case 0x68f7: -case 0x68f8: -case 0x68f9: -case 0x68fa: -case 0x68fb: -case 0x68fc: -case 0x68fd: -case 0x68fe: -case 0x68ff: - { - Bxx<0x08>((int8)instr); - } - break; - -case 0x6900: -case 0x6901: -case 0x6902: -case 0x6903: -case 0x6904: -case 0x6905: -case 0x6906: -case 0x6907: -case 0x6908: -case 0x6909: -case 0x690a: -case 0x690b: -case 0x690c: -case 0x690d: -case 0x690e: -case 0x690f: -case 0x6910: -case 0x6911: -case 0x6912: -case 0x6913: -case 0x6914: -case 0x6915: -case 0x6916: -case 0x6917: -case 0x6918: -case 0x6919: -case 0x691a: -case 0x691b: -case 0x691c: -case 0x691d: -case 0x691e: -case 0x691f: -case 0x6920: -case 0x6921: -case 0x6922: -case 0x6923: -case 0x6924: -case 0x6925: -case 0x6926: -case 0x6927: -case 0x6928: -case 0x6929: -case 0x692a: -case 0x692b: -case 0x692c: -case 0x692d: -case 0x692e: -case 0x692f: -case 0x6930: -case 0x6931: -case 0x6932: -case 0x6933: -case 0x6934: -case 0x6935: -case 0x6936: -case 0x6937: -case 0x6938: -case 0x6939: -case 0x693a: -case 0x693b: -case 0x693c: -case 0x693d: -case 0x693e: -case 0x693f: -case 0x6940: -case 0x6941: -case 0x6942: -case 0x6943: -case 0x6944: -case 0x6945: -case 0x6946: -case 0x6947: -case 0x6948: -case 0x6949: -case 0x694a: -case 0x694b: -case 0x694c: -case 0x694d: -case 0x694e: -case 0x694f: -case 0x6950: -case 0x6951: -case 0x6952: -case 0x6953: -case 0x6954: -case 0x6955: -case 0x6956: -case 0x6957: -case 0x6958: -case 0x6959: -case 0x695a: -case 0x695b: -case 0x695c: -case 0x695d: -case 0x695e: -case 0x695f: -case 0x6960: -case 0x6961: -case 0x6962: -case 0x6963: -case 0x6964: -case 0x6965: -case 0x6966: -case 0x6967: -case 0x6968: -case 0x6969: -case 0x696a: -case 0x696b: -case 0x696c: -case 0x696d: -case 0x696e: -case 0x696f: -case 0x6970: -case 0x6971: -case 0x6972: -case 0x6973: -case 0x6974: -case 0x6975: -case 0x6976: -case 0x6977: -case 0x6978: -case 0x6979: -case 0x697a: -case 0x697b: -case 0x697c: -case 0x697d: -case 0x697e: -case 0x697f: -case 0x6980: -case 0x6981: -case 0x6982: -case 0x6983: -case 0x6984: -case 0x6985: -case 0x6986: -case 0x6987: -case 0x6988: -case 0x6989: -case 0x698a: -case 0x698b: -case 0x698c: -case 0x698d: -case 0x698e: -case 0x698f: -case 0x6990: -case 0x6991: -case 0x6992: -case 0x6993: -case 0x6994: -case 0x6995: -case 0x6996: -case 0x6997: -case 0x6998: -case 0x6999: -case 0x699a: -case 0x699b: -case 0x699c: -case 0x699d: -case 0x699e: -case 0x699f: -case 0x69a0: -case 0x69a1: -case 0x69a2: -case 0x69a3: -case 0x69a4: -case 0x69a5: -case 0x69a6: -case 0x69a7: -case 0x69a8: -case 0x69a9: -case 0x69aa: -case 0x69ab: -case 0x69ac: -case 0x69ad: -case 0x69ae: -case 0x69af: -case 0x69b0: -case 0x69b1: -case 0x69b2: -case 0x69b3: -case 0x69b4: -case 0x69b5: -case 0x69b6: -case 0x69b7: -case 0x69b8: -case 0x69b9: -case 0x69ba: -case 0x69bb: -case 0x69bc: -case 0x69bd: -case 0x69be: -case 0x69bf: -case 0x69c0: -case 0x69c1: -case 0x69c2: -case 0x69c3: -case 0x69c4: -case 0x69c5: -case 0x69c6: -case 0x69c7: -case 0x69c8: -case 0x69c9: -case 0x69ca: -case 0x69cb: -case 0x69cc: -case 0x69cd: -case 0x69ce: -case 0x69cf: -case 0x69d0: -case 0x69d1: -case 0x69d2: -case 0x69d3: -case 0x69d4: -case 0x69d5: -case 0x69d6: -case 0x69d7: -case 0x69d8: -case 0x69d9: -case 0x69da: -case 0x69db: -case 0x69dc: -case 0x69dd: -case 0x69de: -case 0x69df: -case 0x69e0: -case 0x69e1: -case 0x69e2: -case 0x69e3: -case 0x69e4: -case 0x69e5: -case 0x69e6: -case 0x69e7: -case 0x69e8: -case 0x69e9: -case 0x69ea: -case 0x69eb: -case 0x69ec: -case 0x69ed: -case 0x69ee: -case 0x69ef: -case 0x69f0: -case 0x69f1: -case 0x69f2: -case 0x69f3: -case 0x69f4: -case 0x69f5: -case 0x69f6: -case 0x69f7: -case 0x69f8: -case 0x69f9: -case 0x69fa: -case 0x69fb: -case 0x69fc: -case 0x69fd: -case 0x69fe: -case 0x69ff: - { - Bxx<0x09>((int8)instr); - } - break; - -case 0x6a00: -case 0x6a01: -case 0x6a02: -case 0x6a03: -case 0x6a04: -case 0x6a05: -case 0x6a06: -case 0x6a07: -case 0x6a08: -case 0x6a09: -case 0x6a0a: -case 0x6a0b: -case 0x6a0c: -case 0x6a0d: -case 0x6a0e: -case 0x6a0f: -case 0x6a10: -case 0x6a11: -case 0x6a12: -case 0x6a13: -case 0x6a14: -case 0x6a15: -case 0x6a16: -case 0x6a17: -case 0x6a18: -case 0x6a19: -case 0x6a1a: -case 0x6a1b: -case 0x6a1c: -case 0x6a1d: -case 0x6a1e: -case 0x6a1f: -case 0x6a20: -case 0x6a21: -case 0x6a22: -case 0x6a23: -case 0x6a24: -case 0x6a25: -case 0x6a26: -case 0x6a27: -case 0x6a28: -case 0x6a29: -case 0x6a2a: -case 0x6a2b: -case 0x6a2c: -case 0x6a2d: -case 0x6a2e: -case 0x6a2f: -case 0x6a30: -case 0x6a31: -case 0x6a32: -case 0x6a33: -case 0x6a34: -case 0x6a35: -case 0x6a36: -case 0x6a37: -case 0x6a38: -case 0x6a39: -case 0x6a3a: -case 0x6a3b: -case 0x6a3c: -case 0x6a3d: -case 0x6a3e: -case 0x6a3f: -case 0x6a40: -case 0x6a41: -case 0x6a42: -case 0x6a43: -case 0x6a44: -case 0x6a45: -case 0x6a46: -case 0x6a47: -case 0x6a48: -case 0x6a49: -case 0x6a4a: -case 0x6a4b: -case 0x6a4c: -case 0x6a4d: -case 0x6a4e: -case 0x6a4f: -case 0x6a50: -case 0x6a51: -case 0x6a52: -case 0x6a53: -case 0x6a54: -case 0x6a55: -case 0x6a56: -case 0x6a57: -case 0x6a58: -case 0x6a59: -case 0x6a5a: -case 0x6a5b: -case 0x6a5c: -case 0x6a5d: -case 0x6a5e: -case 0x6a5f: -case 0x6a60: -case 0x6a61: -case 0x6a62: -case 0x6a63: -case 0x6a64: -case 0x6a65: -case 0x6a66: -case 0x6a67: -case 0x6a68: -case 0x6a69: -case 0x6a6a: -case 0x6a6b: -case 0x6a6c: -case 0x6a6d: -case 0x6a6e: -case 0x6a6f: -case 0x6a70: -case 0x6a71: -case 0x6a72: -case 0x6a73: -case 0x6a74: -case 0x6a75: -case 0x6a76: -case 0x6a77: -case 0x6a78: -case 0x6a79: -case 0x6a7a: -case 0x6a7b: -case 0x6a7c: -case 0x6a7d: -case 0x6a7e: -case 0x6a7f: -case 0x6a80: -case 0x6a81: -case 0x6a82: -case 0x6a83: -case 0x6a84: -case 0x6a85: -case 0x6a86: -case 0x6a87: -case 0x6a88: -case 0x6a89: -case 0x6a8a: -case 0x6a8b: -case 0x6a8c: -case 0x6a8d: -case 0x6a8e: -case 0x6a8f: -case 0x6a90: -case 0x6a91: -case 0x6a92: -case 0x6a93: -case 0x6a94: -case 0x6a95: -case 0x6a96: -case 0x6a97: -case 0x6a98: -case 0x6a99: -case 0x6a9a: -case 0x6a9b: -case 0x6a9c: -case 0x6a9d: -case 0x6a9e: -case 0x6a9f: -case 0x6aa0: -case 0x6aa1: -case 0x6aa2: -case 0x6aa3: -case 0x6aa4: -case 0x6aa5: -case 0x6aa6: -case 0x6aa7: -case 0x6aa8: -case 0x6aa9: -case 0x6aaa: -case 0x6aab: -case 0x6aac: -case 0x6aad: -case 0x6aae: -case 0x6aaf: -case 0x6ab0: -case 0x6ab1: -case 0x6ab2: -case 0x6ab3: -case 0x6ab4: -case 0x6ab5: -case 0x6ab6: -case 0x6ab7: -case 0x6ab8: -case 0x6ab9: -case 0x6aba: -case 0x6abb: -case 0x6abc: -case 0x6abd: -case 0x6abe: -case 0x6abf: -case 0x6ac0: -case 0x6ac1: -case 0x6ac2: -case 0x6ac3: -case 0x6ac4: -case 0x6ac5: -case 0x6ac6: -case 0x6ac7: -case 0x6ac8: -case 0x6ac9: -case 0x6aca: -case 0x6acb: -case 0x6acc: -case 0x6acd: -case 0x6ace: -case 0x6acf: -case 0x6ad0: -case 0x6ad1: -case 0x6ad2: -case 0x6ad3: -case 0x6ad4: -case 0x6ad5: -case 0x6ad6: -case 0x6ad7: -case 0x6ad8: -case 0x6ad9: -case 0x6ada: -case 0x6adb: -case 0x6adc: -case 0x6add: -case 0x6ade: -case 0x6adf: -case 0x6ae0: -case 0x6ae1: -case 0x6ae2: -case 0x6ae3: -case 0x6ae4: -case 0x6ae5: -case 0x6ae6: -case 0x6ae7: -case 0x6ae8: -case 0x6ae9: -case 0x6aea: -case 0x6aeb: -case 0x6aec: -case 0x6aed: -case 0x6aee: -case 0x6aef: -case 0x6af0: -case 0x6af1: -case 0x6af2: -case 0x6af3: -case 0x6af4: -case 0x6af5: -case 0x6af6: -case 0x6af7: -case 0x6af8: -case 0x6af9: -case 0x6afa: -case 0x6afb: -case 0x6afc: -case 0x6afd: -case 0x6afe: -case 0x6aff: - { - Bxx<0x0a>((int8)instr); - } - break; - -case 0x6b00: -case 0x6b01: -case 0x6b02: -case 0x6b03: -case 0x6b04: -case 0x6b05: -case 0x6b06: -case 0x6b07: -case 0x6b08: -case 0x6b09: -case 0x6b0a: -case 0x6b0b: -case 0x6b0c: -case 0x6b0d: -case 0x6b0e: -case 0x6b0f: -case 0x6b10: -case 0x6b11: -case 0x6b12: -case 0x6b13: -case 0x6b14: -case 0x6b15: -case 0x6b16: -case 0x6b17: -case 0x6b18: -case 0x6b19: -case 0x6b1a: -case 0x6b1b: -case 0x6b1c: -case 0x6b1d: -case 0x6b1e: -case 0x6b1f: -case 0x6b20: -case 0x6b21: -case 0x6b22: -case 0x6b23: -case 0x6b24: -case 0x6b25: -case 0x6b26: -case 0x6b27: -case 0x6b28: -case 0x6b29: -case 0x6b2a: -case 0x6b2b: -case 0x6b2c: -case 0x6b2d: -case 0x6b2e: -case 0x6b2f: -case 0x6b30: -case 0x6b31: -case 0x6b32: -case 0x6b33: -case 0x6b34: -case 0x6b35: -case 0x6b36: -case 0x6b37: -case 0x6b38: -case 0x6b39: -case 0x6b3a: -case 0x6b3b: -case 0x6b3c: -case 0x6b3d: -case 0x6b3e: -case 0x6b3f: -case 0x6b40: -case 0x6b41: -case 0x6b42: -case 0x6b43: -case 0x6b44: -case 0x6b45: -case 0x6b46: -case 0x6b47: -case 0x6b48: -case 0x6b49: -case 0x6b4a: -case 0x6b4b: -case 0x6b4c: -case 0x6b4d: -case 0x6b4e: -case 0x6b4f: -case 0x6b50: -case 0x6b51: -case 0x6b52: -case 0x6b53: -case 0x6b54: -case 0x6b55: -case 0x6b56: -case 0x6b57: -case 0x6b58: -case 0x6b59: -case 0x6b5a: -case 0x6b5b: -case 0x6b5c: -case 0x6b5d: -case 0x6b5e: -case 0x6b5f: -case 0x6b60: -case 0x6b61: -case 0x6b62: -case 0x6b63: -case 0x6b64: -case 0x6b65: -case 0x6b66: -case 0x6b67: -case 0x6b68: -case 0x6b69: -case 0x6b6a: -case 0x6b6b: -case 0x6b6c: -case 0x6b6d: -case 0x6b6e: -case 0x6b6f: -case 0x6b70: -case 0x6b71: -case 0x6b72: -case 0x6b73: -case 0x6b74: -case 0x6b75: -case 0x6b76: -case 0x6b77: -case 0x6b78: -case 0x6b79: -case 0x6b7a: -case 0x6b7b: -case 0x6b7c: -case 0x6b7d: -case 0x6b7e: -case 0x6b7f: -case 0x6b80: -case 0x6b81: -case 0x6b82: -case 0x6b83: -case 0x6b84: -case 0x6b85: -case 0x6b86: -case 0x6b87: -case 0x6b88: -case 0x6b89: -case 0x6b8a: -case 0x6b8b: -case 0x6b8c: -case 0x6b8d: -case 0x6b8e: -case 0x6b8f: -case 0x6b90: -case 0x6b91: -case 0x6b92: -case 0x6b93: -case 0x6b94: -case 0x6b95: -case 0x6b96: -case 0x6b97: -case 0x6b98: -case 0x6b99: -case 0x6b9a: -case 0x6b9b: -case 0x6b9c: -case 0x6b9d: -case 0x6b9e: -case 0x6b9f: -case 0x6ba0: -case 0x6ba1: -case 0x6ba2: -case 0x6ba3: -case 0x6ba4: -case 0x6ba5: -case 0x6ba6: -case 0x6ba7: -case 0x6ba8: -case 0x6ba9: -case 0x6baa: -case 0x6bab: -case 0x6bac: -case 0x6bad: -case 0x6bae: -case 0x6baf: -case 0x6bb0: -case 0x6bb1: -case 0x6bb2: -case 0x6bb3: -case 0x6bb4: -case 0x6bb5: -case 0x6bb6: -case 0x6bb7: -case 0x6bb8: -case 0x6bb9: -case 0x6bba: -case 0x6bbb: -case 0x6bbc: -case 0x6bbd: -case 0x6bbe: -case 0x6bbf: -case 0x6bc0: -case 0x6bc1: -case 0x6bc2: -case 0x6bc3: -case 0x6bc4: -case 0x6bc5: -case 0x6bc6: -case 0x6bc7: -case 0x6bc8: -case 0x6bc9: -case 0x6bca: -case 0x6bcb: -case 0x6bcc: -case 0x6bcd: -case 0x6bce: -case 0x6bcf: -case 0x6bd0: -case 0x6bd1: -case 0x6bd2: -case 0x6bd3: -case 0x6bd4: -case 0x6bd5: -case 0x6bd6: -case 0x6bd7: -case 0x6bd8: -case 0x6bd9: -case 0x6bda: -case 0x6bdb: -case 0x6bdc: -case 0x6bdd: -case 0x6bde: -case 0x6bdf: -case 0x6be0: -case 0x6be1: -case 0x6be2: -case 0x6be3: -case 0x6be4: -case 0x6be5: -case 0x6be6: -case 0x6be7: -case 0x6be8: -case 0x6be9: -case 0x6bea: -case 0x6beb: -case 0x6bec: -case 0x6bed: -case 0x6bee: -case 0x6bef: -case 0x6bf0: -case 0x6bf1: -case 0x6bf2: -case 0x6bf3: -case 0x6bf4: -case 0x6bf5: -case 0x6bf6: -case 0x6bf7: -case 0x6bf8: -case 0x6bf9: -case 0x6bfa: -case 0x6bfb: -case 0x6bfc: -case 0x6bfd: -case 0x6bfe: -case 0x6bff: - { - Bxx<0x0b>((int8)instr); - } - break; - -case 0x6c00: -case 0x6c01: -case 0x6c02: -case 0x6c03: -case 0x6c04: -case 0x6c05: -case 0x6c06: -case 0x6c07: -case 0x6c08: -case 0x6c09: -case 0x6c0a: -case 0x6c0b: -case 0x6c0c: -case 0x6c0d: -case 0x6c0e: -case 0x6c0f: -case 0x6c10: -case 0x6c11: -case 0x6c12: -case 0x6c13: -case 0x6c14: -case 0x6c15: -case 0x6c16: -case 0x6c17: -case 0x6c18: -case 0x6c19: -case 0x6c1a: -case 0x6c1b: -case 0x6c1c: -case 0x6c1d: -case 0x6c1e: -case 0x6c1f: -case 0x6c20: -case 0x6c21: -case 0x6c22: -case 0x6c23: -case 0x6c24: -case 0x6c25: -case 0x6c26: -case 0x6c27: -case 0x6c28: -case 0x6c29: -case 0x6c2a: -case 0x6c2b: -case 0x6c2c: -case 0x6c2d: -case 0x6c2e: -case 0x6c2f: -case 0x6c30: -case 0x6c31: -case 0x6c32: -case 0x6c33: -case 0x6c34: -case 0x6c35: -case 0x6c36: -case 0x6c37: -case 0x6c38: -case 0x6c39: -case 0x6c3a: -case 0x6c3b: -case 0x6c3c: -case 0x6c3d: -case 0x6c3e: -case 0x6c3f: -case 0x6c40: -case 0x6c41: -case 0x6c42: -case 0x6c43: -case 0x6c44: -case 0x6c45: -case 0x6c46: -case 0x6c47: -case 0x6c48: -case 0x6c49: -case 0x6c4a: -case 0x6c4b: -case 0x6c4c: -case 0x6c4d: -case 0x6c4e: -case 0x6c4f: -case 0x6c50: -case 0x6c51: -case 0x6c52: -case 0x6c53: -case 0x6c54: -case 0x6c55: -case 0x6c56: -case 0x6c57: -case 0x6c58: -case 0x6c59: -case 0x6c5a: -case 0x6c5b: -case 0x6c5c: -case 0x6c5d: -case 0x6c5e: -case 0x6c5f: -case 0x6c60: -case 0x6c61: -case 0x6c62: -case 0x6c63: -case 0x6c64: -case 0x6c65: -case 0x6c66: -case 0x6c67: -case 0x6c68: -case 0x6c69: -case 0x6c6a: -case 0x6c6b: -case 0x6c6c: -case 0x6c6d: -case 0x6c6e: -case 0x6c6f: -case 0x6c70: -case 0x6c71: -case 0x6c72: -case 0x6c73: -case 0x6c74: -case 0x6c75: -case 0x6c76: -case 0x6c77: -case 0x6c78: -case 0x6c79: -case 0x6c7a: -case 0x6c7b: -case 0x6c7c: -case 0x6c7d: -case 0x6c7e: -case 0x6c7f: -case 0x6c80: -case 0x6c81: -case 0x6c82: -case 0x6c83: -case 0x6c84: -case 0x6c85: -case 0x6c86: -case 0x6c87: -case 0x6c88: -case 0x6c89: -case 0x6c8a: -case 0x6c8b: -case 0x6c8c: -case 0x6c8d: -case 0x6c8e: -case 0x6c8f: -case 0x6c90: -case 0x6c91: -case 0x6c92: -case 0x6c93: -case 0x6c94: -case 0x6c95: -case 0x6c96: -case 0x6c97: -case 0x6c98: -case 0x6c99: -case 0x6c9a: -case 0x6c9b: -case 0x6c9c: -case 0x6c9d: -case 0x6c9e: -case 0x6c9f: -case 0x6ca0: -case 0x6ca1: -case 0x6ca2: -case 0x6ca3: -case 0x6ca4: -case 0x6ca5: -case 0x6ca6: -case 0x6ca7: -case 0x6ca8: -case 0x6ca9: -case 0x6caa: -case 0x6cab: -case 0x6cac: -case 0x6cad: -case 0x6cae: -case 0x6caf: -case 0x6cb0: -case 0x6cb1: -case 0x6cb2: -case 0x6cb3: -case 0x6cb4: -case 0x6cb5: -case 0x6cb6: -case 0x6cb7: -case 0x6cb8: -case 0x6cb9: -case 0x6cba: -case 0x6cbb: -case 0x6cbc: -case 0x6cbd: -case 0x6cbe: -case 0x6cbf: -case 0x6cc0: -case 0x6cc1: -case 0x6cc2: -case 0x6cc3: -case 0x6cc4: -case 0x6cc5: -case 0x6cc6: -case 0x6cc7: -case 0x6cc8: -case 0x6cc9: -case 0x6cca: -case 0x6ccb: -case 0x6ccc: -case 0x6ccd: -case 0x6cce: -case 0x6ccf: -case 0x6cd0: -case 0x6cd1: -case 0x6cd2: -case 0x6cd3: -case 0x6cd4: -case 0x6cd5: -case 0x6cd6: -case 0x6cd7: -case 0x6cd8: -case 0x6cd9: -case 0x6cda: -case 0x6cdb: -case 0x6cdc: -case 0x6cdd: -case 0x6cde: -case 0x6cdf: -case 0x6ce0: -case 0x6ce1: -case 0x6ce2: -case 0x6ce3: -case 0x6ce4: -case 0x6ce5: -case 0x6ce6: -case 0x6ce7: -case 0x6ce8: -case 0x6ce9: -case 0x6cea: -case 0x6ceb: -case 0x6cec: -case 0x6ced: -case 0x6cee: -case 0x6cef: -case 0x6cf0: -case 0x6cf1: -case 0x6cf2: -case 0x6cf3: -case 0x6cf4: -case 0x6cf5: -case 0x6cf6: -case 0x6cf7: -case 0x6cf8: -case 0x6cf9: -case 0x6cfa: -case 0x6cfb: -case 0x6cfc: -case 0x6cfd: -case 0x6cfe: -case 0x6cff: - { - Bxx<0x0c>((int8)instr); - } - break; - -case 0x6d00: -case 0x6d01: -case 0x6d02: -case 0x6d03: -case 0x6d04: -case 0x6d05: -case 0x6d06: -case 0x6d07: -case 0x6d08: -case 0x6d09: -case 0x6d0a: -case 0x6d0b: -case 0x6d0c: -case 0x6d0d: -case 0x6d0e: -case 0x6d0f: -case 0x6d10: -case 0x6d11: -case 0x6d12: -case 0x6d13: -case 0x6d14: -case 0x6d15: -case 0x6d16: -case 0x6d17: -case 0x6d18: -case 0x6d19: -case 0x6d1a: -case 0x6d1b: -case 0x6d1c: -case 0x6d1d: -case 0x6d1e: -case 0x6d1f: -case 0x6d20: -case 0x6d21: -case 0x6d22: -case 0x6d23: -case 0x6d24: -case 0x6d25: -case 0x6d26: -case 0x6d27: -case 0x6d28: -case 0x6d29: -case 0x6d2a: -case 0x6d2b: -case 0x6d2c: -case 0x6d2d: -case 0x6d2e: -case 0x6d2f: -case 0x6d30: -case 0x6d31: -case 0x6d32: -case 0x6d33: -case 0x6d34: -case 0x6d35: -case 0x6d36: -case 0x6d37: -case 0x6d38: -case 0x6d39: -case 0x6d3a: -case 0x6d3b: -case 0x6d3c: -case 0x6d3d: -case 0x6d3e: -case 0x6d3f: -case 0x6d40: -case 0x6d41: -case 0x6d42: -case 0x6d43: -case 0x6d44: -case 0x6d45: -case 0x6d46: -case 0x6d47: -case 0x6d48: -case 0x6d49: -case 0x6d4a: -case 0x6d4b: -case 0x6d4c: -case 0x6d4d: -case 0x6d4e: -case 0x6d4f: -case 0x6d50: -case 0x6d51: -case 0x6d52: -case 0x6d53: -case 0x6d54: -case 0x6d55: -case 0x6d56: -case 0x6d57: -case 0x6d58: -case 0x6d59: -case 0x6d5a: -case 0x6d5b: -case 0x6d5c: -case 0x6d5d: -case 0x6d5e: -case 0x6d5f: -case 0x6d60: -case 0x6d61: -case 0x6d62: -case 0x6d63: -case 0x6d64: -case 0x6d65: -case 0x6d66: -case 0x6d67: -case 0x6d68: -case 0x6d69: -case 0x6d6a: -case 0x6d6b: -case 0x6d6c: -case 0x6d6d: -case 0x6d6e: -case 0x6d6f: -case 0x6d70: -case 0x6d71: -case 0x6d72: -case 0x6d73: -case 0x6d74: -case 0x6d75: -case 0x6d76: -case 0x6d77: -case 0x6d78: -case 0x6d79: -case 0x6d7a: -case 0x6d7b: -case 0x6d7c: -case 0x6d7d: -case 0x6d7e: -case 0x6d7f: -case 0x6d80: -case 0x6d81: -case 0x6d82: -case 0x6d83: -case 0x6d84: -case 0x6d85: -case 0x6d86: -case 0x6d87: -case 0x6d88: -case 0x6d89: -case 0x6d8a: -case 0x6d8b: -case 0x6d8c: -case 0x6d8d: -case 0x6d8e: -case 0x6d8f: -case 0x6d90: -case 0x6d91: -case 0x6d92: -case 0x6d93: -case 0x6d94: -case 0x6d95: -case 0x6d96: -case 0x6d97: -case 0x6d98: -case 0x6d99: -case 0x6d9a: -case 0x6d9b: -case 0x6d9c: -case 0x6d9d: -case 0x6d9e: -case 0x6d9f: -case 0x6da0: -case 0x6da1: -case 0x6da2: -case 0x6da3: -case 0x6da4: -case 0x6da5: -case 0x6da6: -case 0x6da7: -case 0x6da8: -case 0x6da9: -case 0x6daa: -case 0x6dab: -case 0x6dac: -case 0x6dad: -case 0x6dae: -case 0x6daf: -case 0x6db0: -case 0x6db1: -case 0x6db2: -case 0x6db3: -case 0x6db4: -case 0x6db5: -case 0x6db6: -case 0x6db7: -case 0x6db8: -case 0x6db9: -case 0x6dba: -case 0x6dbb: -case 0x6dbc: -case 0x6dbd: -case 0x6dbe: -case 0x6dbf: -case 0x6dc0: -case 0x6dc1: -case 0x6dc2: -case 0x6dc3: -case 0x6dc4: -case 0x6dc5: -case 0x6dc6: -case 0x6dc7: -case 0x6dc8: -case 0x6dc9: -case 0x6dca: -case 0x6dcb: -case 0x6dcc: -case 0x6dcd: -case 0x6dce: -case 0x6dcf: -case 0x6dd0: -case 0x6dd1: -case 0x6dd2: -case 0x6dd3: -case 0x6dd4: -case 0x6dd5: -case 0x6dd6: -case 0x6dd7: -case 0x6dd8: -case 0x6dd9: -case 0x6dda: -case 0x6ddb: -case 0x6ddc: -case 0x6ddd: -case 0x6dde: -case 0x6ddf: -case 0x6de0: -case 0x6de1: -case 0x6de2: -case 0x6de3: -case 0x6de4: -case 0x6de5: -case 0x6de6: -case 0x6de7: -case 0x6de8: -case 0x6de9: -case 0x6dea: -case 0x6deb: -case 0x6dec: -case 0x6ded: -case 0x6dee: -case 0x6def: -case 0x6df0: -case 0x6df1: -case 0x6df2: -case 0x6df3: -case 0x6df4: -case 0x6df5: -case 0x6df6: -case 0x6df7: -case 0x6df8: -case 0x6df9: -case 0x6dfa: -case 0x6dfb: -case 0x6dfc: -case 0x6dfd: -case 0x6dfe: -case 0x6dff: - { - Bxx<0x0d>((int8)instr); - } - break; - -case 0x6e00: -case 0x6e01: -case 0x6e02: -case 0x6e03: -case 0x6e04: -case 0x6e05: -case 0x6e06: -case 0x6e07: -case 0x6e08: -case 0x6e09: -case 0x6e0a: -case 0x6e0b: -case 0x6e0c: -case 0x6e0d: -case 0x6e0e: -case 0x6e0f: -case 0x6e10: -case 0x6e11: -case 0x6e12: -case 0x6e13: -case 0x6e14: -case 0x6e15: -case 0x6e16: -case 0x6e17: -case 0x6e18: -case 0x6e19: -case 0x6e1a: -case 0x6e1b: -case 0x6e1c: -case 0x6e1d: -case 0x6e1e: -case 0x6e1f: -case 0x6e20: -case 0x6e21: -case 0x6e22: -case 0x6e23: -case 0x6e24: -case 0x6e25: -case 0x6e26: -case 0x6e27: -case 0x6e28: -case 0x6e29: -case 0x6e2a: -case 0x6e2b: -case 0x6e2c: -case 0x6e2d: -case 0x6e2e: -case 0x6e2f: -case 0x6e30: -case 0x6e31: -case 0x6e32: -case 0x6e33: -case 0x6e34: -case 0x6e35: -case 0x6e36: -case 0x6e37: -case 0x6e38: -case 0x6e39: -case 0x6e3a: -case 0x6e3b: -case 0x6e3c: -case 0x6e3d: -case 0x6e3e: -case 0x6e3f: -case 0x6e40: -case 0x6e41: -case 0x6e42: -case 0x6e43: -case 0x6e44: -case 0x6e45: -case 0x6e46: -case 0x6e47: -case 0x6e48: -case 0x6e49: -case 0x6e4a: -case 0x6e4b: -case 0x6e4c: -case 0x6e4d: -case 0x6e4e: -case 0x6e4f: -case 0x6e50: -case 0x6e51: -case 0x6e52: -case 0x6e53: -case 0x6e54: -case 0x6e55: -case 0x6e56: -case 0x6e57: -case 0x6e58: -case 0x6e59: -case 0x6e5a: -case 0x6e5b: -case 0x6e5c: -case 0x6e5d: -case 0x6e5e: -case 0x6e5f: -case 0x6e60: -case 0x6e61: -case 0x6e62: -case 0x6e63: -case 0x6e64: -case 0x6e65: -case 0x6e66: -case 0x6e67: -case 0x6e68: -case 0x6e69: -case 0x6e6a: -case 0x6e6b: -case 0x6e6c: -case 0x6e6d: -case 0x6e6e: -case 0x6e6f: -case 0x6e70: -case 0x6e71: -case 0x6e72: -case 0x6e73: -case 0x6e74: -case 0x6e75: -case 0x6e76: -case 0x6e77: -case 0x6e78: -case 0x6e79: -case 0x6e7a: -case 0x6e7b: -case 0x6e7c: -case 0x6e7d: -case 0x6e7e: -case 0x6e7f: -case 0x6e80: -case 0x6e81: -case 0x6e82: -case 0x6e83: -case 0x6e84: -case 0x6e85: -case 0x6e86: -case 0x6e87: -case 0x6e88: -case 0x6e89: -case 0x6e8a: -case 0x6e8b: -case 0x6e8c: -case 0x6e8d: -case 0x6e8e: -case 0x6e8f: -case 0x6e90: -case 0x6e91: -case 0x6e92: -case 0x6e93: -case 0x6e94: -case 0x6e95: -case 0x6e96: -case 0x6e97: -case 0x6e98: -case 0x6e99: -case 0x6e9a: -case 0x6e9b: -case 0x6e9c: -case 0x6e9d: -case 0x6e9e: -case 0x6e9f: -case 0x6ea0: -case 0x6ea1: -case 0x6ea2: -case 0x6ea3: -case 0x6ea4: -case 0x6ea5: -case 0x6ea6: -case 0x6ea7: -case 0x6ea8: -case 0x6ea9: -case 0x6eaa: -case 0x6eab: -case 0x6eac: -case 0x6ead: -case 0x6eae: -case 0x6eaf: -case 0x6eb0: -case 0x6eb1: -case 0x6eb2: -case 0x6eb3: -case 0x6eb4: -case 0x6eb5: -case 0x6eb6: -case 0x6eb7: -case 0x6eb8: -case 0x6eb9: -case 0x6eba: -case 0x6ebb: -case 0x6ebc: -case 0x6ebd: -case 0x6ebe: -case 0x6ebf: -case 0x6ec0: -case 0x6ec1: -case 0x6ec2: -case 0x6ec3: -case 0x6ec4: -case 0x6ec5: -case 0x6ec6: -case 0x6ec7: -case 0x6ec8: -case 0x6ec9: -case 0x6eca: -case 0x6ecb: -case 0x6ecc: -case 0x6ecd: -case 0x6ece: -case 0x6ecf: -case 0x6ed0: -case 0x6ed1: -case 0x6ed2: -case 0x6ed3: -case 0x6ed4: -case 0x6ed5: -case 0x6ed6: -case 0x6ed7: -case 0x6ed8: -case 0x6ed9: -case 0x6eda: -case 0x6edb: -case 0x6edc: -case 0x6edd: -case 0x6ede: -case 0x6edf: -case 0x6ee0: -case 0x6ee1: -case 0x6ee2: -case 0x6ee3: -case 0x6ee4: -case 0x6ee5: -case 0x6ee6: -case 0x6ee7: -case 0x6ee8: -case 0x6ee9: -case 0x6eea: -case 0x6eeb: -case 0x6eec: -case 0x6eed: -case 0x6eee: -case 0x6eef: -case 0x6ef0: -case 0x6ef1: -case 0x6ef2: -case 0x6ef3: -case 0x6ef4: -case 0x6ef5: -case 0x6ef6: -case 0x6ef7: -case 0x6ef8: -case 0x6ef9: -case 0x6efa: -case 0x6efb: -case 0x6efc: -case 0x6efd: -case 0x6efe: -case 0x6eff: - { - Bxx<0x0e>((int8)instr); - } - break; - -case 0x6f00: -case 0x6f01: -case 0x6f02: -case 0x6f03: -case 0x6f04: -case 0x6f05: -case 0x6f06: -case 0x6f07: -case 0x6f08: -case 0x6f09: -case 0x6f0a: -case 0x6f0b: -case 0x6f0c: -case 0x6f0d: -case 0x6f0e: -case 0x6f0f: -case 0x6f10: -case 0x6f11: -case 0x6f12: -case 0x6f13: -case 0x6f14: -case 0x6f15: -case 0x6f16: -case 0x6f17: -case 0x6f18: -case 0x6f19: -case 0x6f1a: -case 0x6f1b: -case 0x6f1c: -case 0x6f1d: -case 0x6f1e: -case 0x6f1f: -case 0x6f20: -case 0x6f21: -case 0x6f22: -case 0x6f23: -case 0x6f24: -case 0x6f25: -case 0x6f26: -case 0x6f27: -case 0x6f28: -case 0x6f29: -case 0x6f2a: -case 0x6f2b: -case 0x6f2c: -case 0x6f2d: -case 0x6f2e: -case 0x6f2f: -case 0x6f30: -case 0x6f31: -case 0x6f32: -case 0x6f33: -case 0x6f34: -case 0x6f35: -case 0x6f36: -case 0x6f37: -case 0x6f38: -case 0x6f39: -case 0x6f3a: -case 0x6f3b: -case 0x6f3c: -case 0x6f3d: -case 0x6f3e: -case 0x6f3f: -case 0x6f40: -case 0x6f41: -case 0x6f42: -case 0x6f43: -case 0x6f44: -case 0x6f45: -case 0x6f46: -case 0x6f47: -case 0x6f48: -case 0x6f49: -case 0x6f4a: -case 0x6f4b: -case 0x6f4c: -case 0x6f4d: -case 0x6f4e: -case 0x6f4f: -case 0x6f50: -case 0x6f51: -case 0x6f52: -case 0x6f53: -case 0x6f54: -case 0x6f55: -case 0x6f56: -case 0x6f57: -case 0x6f58: -case 0x6f59: -case 0x6f5a: -case 0x6f5b: -case 0x6f5c: -case 0x6f5d: -case 0x6f5e: -case 0x6f5f: -case 0x6f60: -case 0x6f61: -case 0x6f62: -case 0x6f63: -case 0x6f64: -case 0x6f65: -case 0x6f66: -case 0x6f67: -case 0x6f68: -case 0x6f69: -case 0x6f6a: -case 0x6f6b: -case 0x6f6c: -case 0x6f6d: -case 0x6f6e: -case 0x6f6f: -case 0x6f70: -case 0x6f71: -case 0x6f72: -case 0x6f73: -case 0x6f74: -case 0x6f75: -case 0x6f76: -case 0x6f77: -case 0x6f78: -case 0x6f79: -case 0x6f7a: -case 0x6f7b: -case 0x6f7c: -case 0x6f7d: -case 0x6f7e: -case 0x6f7f: -case 0x6f80: -case 0x6f81: -case 0x6f82: -case 0x6f83: -case 0x6f84: -case 0x6f85: -case 0x6f86: -case 0x6f87: -case 0x6f88: -case 0x6f89: -case 0x6f8a: -case 0x6f8b: -case 0x6f8c: -case 0x6f8d: -case 0x6f8e: -case 0x6f8f: -case 0x6f90: -case 0x6f91: -case 0x6f92: -case 0x6f93: -case 0x6f94: -case 0x6f95: -case 0x6f96: -case 0x6f97: -case 0x6f98: -case 0x6f99: -case 0x6f9a: -case 0x6f9b: -case 0x6f9c: -case 0x6f9d: -case 0x6f9e: -case 0x6f9f: -case 0x6fa0: -case 0x6fa1: -case 0x6fa2: -case 0x6fa3: -case 0x6fa4: -case 0x6fa5: -case 0x6fa6: -case 0x6fa7: -case 0x6fa8: -case 0x6fa9: -case 0x6faa: -case 0x6fab: -case 0x6fac: -case 0x6fad: -case 0x6fae: -case 0x6faf: -case 0x6fb0: -case 0x6fb1: -case 0x6fb2: -case 0x6fb3: -case 0x6fb4: -case 0x6fb5: -case 0x6fb6: -case 0x6fb7: -case 0x6fb8: -case 0x6fb9: -case 0x6fba: -case 0x6fbb: -case 0x6fbc: -case 0x6fbd: -case 0x6fbe: -case 0x6fbf: -case 0x6fc0: -case 0x6fc1: -case 0x6fc2: -case 0x6fc3: -case 0x6fc4: -case 0x6fc5: -case 0x6fc6: -case 0x6fc7: -case 0x6fc8: -case 0x6fc9: -case 0x6fca: -case 0x6fcb: -case 0x6fcc: -case 0x6fcd: -case 0x6fce: -case 0x6fcf: -case 0x6fd0: -case 0x6fd1: -case 0x6fd2: -case 0x6fd3: -case 0x6fd4: -case 0x6fd5: -case 0x6fd6: -case 0x6fd7: -case 0x6fd8: -case 0x6fd9: -case 0x6fda: -case 0x6fdb: -case 0x6fdc: -case 0x6fdd: -case 0x6fde: -case 0x6fdf: -case 0x6fe0: -case 0x6fe1: -case 0x6fe2: -case 0x6fe3: -case 0x6fe4: -case 0x6fe5: -case 0x6fe6: -case 0x6fe7: -case 0x6fe8: -case 0x6fe9: -case 0x6fea: -case 0x6feb: -case 0x6fec: -case 0x6fed: -case 0x6fee: -case 0x6fef: -case 0x6ff0: -case 0x6ff1: -case 0x6ff2: -case 0x6ff3: -case 0x6ff4: -case 0x6ff5: -case 0x6ff6: -case 0x6ff7: -case 0x6ff8: -case 0x6ff9: -case 0x6ffa: -case 0x6ffb: -case 0x6ffc: -case 0x6ffd: -case 0x6ffe: -case 0x6fff: - { - Bxx<0x0f>((int8)instr); - } - break; - -case 0x50c8: -case 0x50c9: -case 0x50ca: -case 0x50cb: -case 0x50cc: -case 0x50cd: -case 0x50ce: -case 0x50cf: - { - DBcc<0x00>(instr_b2_b0); - } - break; - -case 0x51c8: -case 0x51c9: -case 0x51ca: -case 0x51cb: -case 0x51cc: -case 0x51cd: -case 0x51ce: -case 0x51cf: - { - DBcc<0x01>(instr_b2_b0); - } - break; - -case 0x52c8: -case 0x52c9: -case 0x52ca: -case 0x52cb: -case 0x52cc: -case 0x52cd: -case 0x52ce: -case 0x52cf: - { - DBcc<0x02>(instr_b2_b0); - } - break; - -case 0x53c8: -case 0x53c9: -case 0x53ca: -case 0x53cb: -case 0x53cc: -case 0x53cd: -case 0x53ce: -case 0x53cf: - { - DBcc<0x03>(instr_b2_b0); - } - break; - -case 0x54c8: -case 0x54c9: -case 0x54ca: -case 0x54cb: -case 0x54cc: -case 0x54cd: -case 0x54ce: -case 0x54cf: - { - DBcc<0x04>(instr_b2_b0); - } - break; - -case 0x55c8: -case 0x55c9: -case 0x55ca: -case 0x55cb: -case 0x55cc: -case 0x55cd: -case 0x55ce: -case 0x55cf: - { - DBcc<0x05>(instr_b2_b0); - } - break; - -case 0x56c8: -case 0x56c9: -case 0x56ca: -case 0x56cb: -case 0x56cc: -case 0x56cd: -case 0x56ce: -case 0x56cf: - { - DBcc<0x06>(instr_b2_b0); - } - break; - -case 0x57c8: -case 0x57c9: -case 0x57ca: -case 0x57cb: -case 0x57cc: -case 0x57cd: -case 0x57ce: -case 0x57cf: - { - DBcc<0x07>(instr_b2_b0); - } - break; - -case 0x58c8: -case 0x58c9: -case 0x58ca: -case 0x58cb: -case 0x58cc: -case 0x58cd: -case 0x58ce: -case 0x58cf: - { - DBcc<0x08>(instr_b2_b0); - } - break; - -case 0x59c8: -case 0x59c9: -case 0x59ca: -case 0x59cb: -case 0x59cc: -case 0x59cd: -case 0x59ce: -case 0x59cf: - { - DBcc<0x09>(instr_b2_b0); - } - break; - -case 0x5ac8: -case 0x5ac9: -case 0x5aca: -case 0x5acb: -case 0x5acc: -case 0x5acd: -case 0x5ace: -case 0x5acf: - { - DBcc<0x0a>(instr_b2_b0); - } - break; - -case 0x5bc8: -case 0x5bc9: -case 0x5bca: -case 0x5bcb: -case 0x5bcc: -case 0x5bcd: -case 0x5bce: -case 0x5bcf: - { - DBcc<0x0b>(instr_b2_b0); - } - break; - -case 0x5cc8: -case 0x5cc9: -case 0x5cca: -case 0x5ccb: -case 0x5ccc: -case 0x5ccd: -case 0x5cce: -case 0x5ccf: - { - DBcc<0x0c>(instr_b2_b0); - } - break; - -case 0x5dc8: -case 0x5dc9: -case 0x5dca: -case 0x5dcb: -case 0x5dcc: -case 0x5dcd: -case 0x5dce: -case 0x5dcf: - { - DBcc<0x0d>(instr_b2_b0); - } - break; - -case 0x5ec8: -case 0x5ec9: -case 0x5eca: -case 0x5ecb: -case 0x5ecc: -case 0x5ecd: -case 0x5ece: -case 0x5ecf: - { - DBcc<0x0e>(instr_b2_b0); - } - break; - -case 0x5fc8: -case 0x5fc9: -case 0x5fca: -case 0x5fcb: -case 0x5fcc: -case 0x5fcd: -case 0x5fce: -case 0x5fcf: - { - DBcc<0x0f>(instr_b2_b0); - } - break; - -case 0x0a3c: - { - EORI_CCR(); - } - break; - -case 0xc148: -case 0xc149: -case 0xc14a: -case 0xc14b: -case 0xc14c: -case 0xc14d: -case 0xc14e: -case 0xc14f: -case 0xc348: -case 0xc349: -case 0xc34a: -case 0xc34b: -case 0xc34c: -case 0xc34d: -case 0xc34e: -case 0xc34f: -case 0xc548: -case 0xc549: -case 0xc54a: -case 0xc54b: -case 0xc54c: -case 0xc54d: -case 0xc54e: -case 0xc54f: -case 0xc748: -case 0xc749: -case 0xc74a: -case 0xc74b: -case 0xc74c: -case 0xc74d: -case 0xc74e: -case 0xc74f: -case 0xc948: -case 0xc949: -case 0xc94a: -case 0xc94b: -case 0xc94c: -case 0xc94d: -case 0xc94e: -case 0xc94f: -case 0xcb48: -case 0xcb49: -case 0xcb4a: -case 0xcb4b: -case 0xcb4c: -case 0xcb4d: -case 0xcb4e: -case 0xcb4f: -case 0xcd48: -case 0xcd49: -case 0xcd4a: -case 0xcd4b: -case 0xcd4c: -case 0xcd4d: -case 0xcd4e: -case 0xcd4f: -case 0xcf48: -case 0xcf49: -case 0xcf4a: -case 0xcf4b: -case 0xcf4c: -case 0xcf4d: -case 0xcf4e: -case 0xcf4f: - { - EXG(&A[instr_b11_b9], &A[instr_b2_b0]); /* EXG Ax, Ay */ - } - break; - -case 0xc188: -case 0xc189: -case 0xc18a: -case 0xc18b: -case 0xc18c: -case 0xc18d: -case 0xc18e: -case 0xc18f: -case 0xc388: -case 0xc389: -case 0xc38a: -case 0xc38b: -case 0xc38c: -case 0xc38d: -case 0xc38e: -case 0xc38f: -case 0xc588: -case 0xc589: -case 0xc58a: -case 0xc58b: -case 0xc58c: -case 0xc58d: -case 0xc58e: -case 0xc58f: -case 0xc788: -case 0xc789: -case 0xc78a: -case 0xc78b: -case 0xc78c: -case 0xc78d: -case 0xc78e: -case 0xc78f: -case 0xc988: -case 0xc989: -case 0xc98a: -case 0xc98b: -case 0xc98c: -case 0xc98d: -case 0xc98e: -case 0xc98f: -case 0xcb88: -case 0xcb89: -case 0xcb8a: -case 0xcb8b: -case 0xcb8c: -case 0xcb8d: -case 0xcb8e: -case 0xcb8f: -case 0xcd88: -case 0xcd89: -case 0xcd8a: -case 0xcd8b: -case 0xcd8c: -case 0xcd8d: -case 0xcd8e: -case 0xcd8f: -case 0xcf88: -case 0xcf89: -case 0xcf8a: -case 0xcf8b: -case 0xcf8c: -case 0xcf8d: -case 0xcf8e: -case 0xcf8f: - { - EXG(&D[instr_b11_b9], &A[instr_b2_b0]); /* EXG Dx, Ay */ - } - break; - -case 0xc140: -case 0xc141: -case 0xc142: -case 0xc143: -case 0xc144: -case 0xc145: -case 0xc146: -case 0xc147: -case 0xc340: -case 0xc341: -case 0xc342: -case 0xc343: -case 0xc344: -case 0xc345: -case 0xc346: -case 0xc347: -case 0xc540: -case 0xc541: -case 0xc542: -case 0xc543: -case 0xc544: -case 0xc545: -case 0xc546: -case 0xc547: -case 0xc740: -case 0xc741: -case 0xc742: -case 0xc743: -case 0xc744: -case 0xc745: -case 0xc746: -case 0xc747: -case 0xc940: -case 0xc941: -case 0xc942: -case 0xc943: -case 0xc944: -case 0xc945: -case 0xc946: -case 0xc947: -case 0xcb40: -case 0xcb41: -case 0xcb42: -case 0xcb43: -case 0xcb44: -case 0xcb45: -case 0xcb46: -case 0xcb47: -case 0xcd40: -case 0xcd41: -case 0xcd42: -case 0xcd43: -case 0xcd44: -case 0xcd45: -case 0xcd46: -case 0xcd47: -case 0xcf40: -case 0xcf41: -case 0xcf42: -case 0xcf43: -case 0xcf44: -case 0xcf45: -case 0xcf46: -case 0xcf47: - { - EXG(&D[instr_b11_b9], &D[instr_b2_b0]); /* EXG Dx, Dy */ - } - break; - -case 0x41f9: -case 0x43f9: -case 0x45f9: -case 0x47f9: -case 0x49f9: -case 0x4bf9: -case 0x4df9: -case 0x4ff9: - { - HAM, ABS_LONG> src(this); LEA(src, instr_b11_b9); - } - break; - -case 0x4879: - { - HAM, ABS_LONG> src(this); PEA(src); - } - break; - -case 0x4ef9: - { - HAM, ABS_LONG> targ(this); JMP(targ); - } - break; - -case 0x4eb9: - { - HAM, ABS_LONG> targ(this); JSR(targ); - } - break; - -case 0x41f8: -case 0x43f8: -case 0x45f8: -case 0x47f8: -case 0x49f8: -case 0x4bf8: -case 0x4df8: -case 0x4ff8: - { - HAM, ABS_SHORT> src(this); LEA(src, instr_b11_b9); - } - break; - -case 0x4878: - { - HAM, ABS_SHORT> src(this); PEA(src); - } - break; - -case 0x4ef8: - { - HAM, ABS_SHORT> targ(this); JMP(targ); - } - break; - -case 0x4eb8: - { - HAM, ABS_SHORT> targ(this); JSR(targ); - } - break; - -case 0x41d0: -case 0x41d1: -case 0x41d2: -case 0x41d3: -case 0x41d4: -case 0x41d5: -case 0x41d6: -case 0x41d7: -case 0x43d0: -case 0x43d1: -case 0x43d2: -case 0x43d3: -case 0x43d4: -case 0x43d5: -case 0x43d6: -case 0x43d7: -case 0x45d0: -case 0x45d1: -case 0x45d2: -case 0x45d3: -case 0x45d4: -case 0x45d5: -case 0x45d6: -case 0x45d7: -case 0x47d0: -case 0x47d1: -case 0x47d2: -case 0x47d3: -case 0x47d4: -case 0x47d5: -case 0x47d6: -case 0x47d7: -case 0x49d0: -case 0x49d1: -case 0x49d2: -case 0x49d3: -case 0x49d4: -case 0x49d5: -case 0x49d6: -case 0x49d7: -case 0x4bd0: -case 0x4bd1: -case 0x4bd2: -case 0x4bd3: -case 0x4bd4: -case 0x4bd5: -case 0x4bd6: -case 0x4bd7: -case 0x4dd0: -case 0x4dd1: -case 0x4dd2: -case 0x4dd3: -case 0x4dd4: -case 0x4dd5: -case 0x4dd6: -case 0x4dd7: -case 0x4fd0: -case 0x4fd1: -case 0x4fd2: -case 0x4fd3: -case 0x4fd4: -case 0x4fd5: -case 0x4fd6: -case 0x4fd7: - { - HAM, ADDR_REG_INDIR> src(this, instr_b2_b0); LEA(src, instr_b11_b9); - } - break; - -case 0x4850: -case 0x4851: -case 0x4852: -case 0x4853: -case 0x4854: -case 0x4855: -case 0x4856: -case 0x4857: - { - HAM, ADDR_REG_INDIR> src(this, instr_b2_b0); PEA(src); - } - break; - -case 0x4ed0: -case 0x4ed1: -case 0x4ed2: -case 0x4ed3: -case 0x4ed4: -case 0x4ed5: -case 0x4ed6: -case 0x4ed7: - { - HAM, ADDR_REG_INDIR> targ(this, instr_b2_b0); JMP(targ); - } - break; - -case 0x4e90: -case 0x4e91: -case 0x4e92: -case 0x4e93: -case 0x4e94: -case 0x4e95: -case 0x4e96: -case 0x4e97: - { - HAM, ADDR_REG_INDIR> targ(this, instr_b2_b0); JSR(targ); - } - break; - -case 0x41e8: -case 0x41e9: -case 0x41ea: -case 0x41eb: -case 0x41ec: -case 0x41ed: -case 0x41ee: -case 0x41ef: -case 0x43e8: -case 0x43e9: -case 0x43ea: -case 0x43eb: -case 0x43ec: -case 0x43ed: -case 0x43ee: -case 0x43ef: -case 0x45e8: -case 0x45e9: -case 0x45ea: -case 0x45eb: -case 0x45ec: -case 0x45ed: -case 0x45ee: -case 0x45ef: -case 0x47e8: -case 0x47e9: -case 0x47ea: -case 0x47eb: -case 0x47ec: -case 0x47ed: -case 0x47ee: -case 0x47ef: -case 0x49e8: -case 0x49e9: -case 0x49ea: -case 0x49eb: -case 0x49ec: -case 0x49ed: -case 0x49ee: -case 0x49ef: -case 0x4be8: -case 0x4be9: -case 0x4bea: -case 0x4beb: -case 0x4bec: -case 0x4bed: -case 0x4bee: -case 0x4bef: -case 0x4de8: -case 0x4de9: -case 0x4dea: -case 0x4deb: -case 0x4dec: -case 0x4ded: -case 0x4dee: -case 0x4def: -case 0x4fe8: -case 0x4fe9: -case 0x4fea: -case 0x4feb: -case 0x4fec: -case 0x4fed: -case 0x4fee: -case 0x4fef: - { - HAM, ADDR_REG_INDIR_DISP> src(this, instr_b2_b0); LEA(src, instr_b11_b9); - } - break; - -case 0x4868: -case 0x4869: -case 0x486a: -case 0x486b: -case 0x486c: -case 0x486d: -case 0x486e: -case 0x486f: - { - HAM, ADDR_REG_INDIR_DISP> src(this, instr_b2_b0); PEA(src); - } - break; - -case 0x4ee8: -case 0x4ee9: -case 0x4eea: -case 0x4eeb: -case 0x4eec: -case 0x4eed: -case 0x4eee: -case 0x4eef: - { - HAM, ADDR_REG_INDIR_DISP> targ(this, instr_b2_b0); JMP(targ); - } - break; - -case 0x4ea8: -case 0x4ea9: -case 0x4eaa: -case 0x4eab: -case 0x4eac: -case 0x4ead: -case 0x4eae: -case 0x4eaf: - { - HAM, ADDR_REG_INDIR_DISP> targ(this, instr_b2_b0); JSR(targ); - } - break; - -case 0x41f0: -case 0x41f1: -case 0x41f2: -case 0x41f3: -case 0x41f4: -case 0x41f5: -case 0x41f6: -case 0x41f7: -case 0x43f0: -case 0x43f1: -case 0x43f2: -case 0x43f3: -case 0x43f4: -case 0x43f5: -case 0x43f6: -case 0x43f7: -case 0x45f0: -case 0x45f1: -case 0x45f2: -case 0x45f3: -case 0x45f4: -case 0x45f5: -case 0x45f6: -case 0x45f7: -case 0x47f0: -case 0x47f1: -case 0x47f2: -case 0x47f3: -case 0x47f4: -case 0x47f5: -case 0x47f6: -case 0x47f7: -case 0x49f0: -case 0x49f1: -case 0x49f2: -case 0x49f3: -case 0x49f4: -case 0x49f5: -case 0x49f6: -case 0x49f7: -case 0x4bf0: -case 0x4bf1: -case 0x4bf2: -case 0x4bf3: -case 0x4bf4: -case 0x4bf5: -case 0x4bf6: -case 0x4bf7: -case 0x4df0: -case 0x4df1: -case 0x4df2: -case 0x4df3: -case 0x4df4: -case 0x4df5: -case 0x4df6: -case 0x4df7: -case 0x4ff0: -case 0x4ff1: -case 0x4ff2: -case 0x4ff3: -case 0x4ff4: -case 0x4ff5: -case 0x4ff6: -case 0x4ff7: - { - HAM, ADDR_REG_INDIR_INDX> src(this, instr_b2_b0); LEA(src, instr_b11_b9); - } - break; - -case 0x4870: -case 0x4871: -case 0x4872: -case 0x4873: -case 0x4874: -case 0x4875: -case 0x4876: -case 0x4877: - { - HAM, ADDR_REG_INDIR_INDX> src(this, instr_b2_b0); PEA(src); - } - break; - -case 0x4ef0: -case 0x4ef1: -case 0x4ef2: -case 0x4ef3: -case 0x4ef4: -case 0x4ef5: -case 0x4ef6: -case 0x4ef7: - { - HAM, ADDR_REG_INDIR_INDX> targ(this, instr_b2_b0); JMP(targ); - } - break; - -case 0x4eb0: -case 0x4eb1: -case 0x4eb2: -case 0x4eb3: -case 0x4eb4: -case 0x4eb5: -case 0x4eb6: -case 0x4eb7: - { - HAM, ADDR_REG_INDIR_INDX> targ(this, instr_b2_b0); JSR(targ); - } - break; - -case 0x41fa: -case 0x43fa: -case 0x45fa: -case 0x47fa: -case 0x49fa: -case 0x4bfa: -case 0x4dfa: -case 0x4ffa: - { - HAM, PC_DISP> src(this); LEA(src, instr_b11_b9); - } - break; - -case 0x487a: - { - HAM, PC_DISP> src(this); PEA(src); - } - break; - -case 0x4efa: - { - HAM, PC_DISP> targ(this); JMP(targ); - } - break; - -case 0x4eba: - { - HAM, PC_DISP> targ(this); JSR(targ); - } - break; - -case 0x41fb: -case 0x43fb: -case 0x45fb: -case 0x47fb: -case 0x49fb: -case 0x4bfb: -case 0x4dfb: -case 0x4ffb: - { - HAM, PC_INDEX> src(this); LEA(src, instr_b11_b9); - } - break; - -case 0x487b: - { - HAM, PC_INDEX> src(this); PEA(src); - } - break; - -case 0x4efb: - { - HAM, PC_INDEX> targ(this); JMP(targ); - } - break; - -case 0x4ebb: - { - HAM, PC_INDEX> targ(this); JSR(targ); - } - break; - -case 0x4279: - { - HAM dst(this); CLR(dst); - } - break; - -case 0x4479: - { - HAM dst(this); NEG(dst); - } - break; - -case 0x4079: - { - HAM dst(this); NEGX(dst); - } - break; - -case 0x4679: - { - HAM dst(this); NOT(dst); - } - break; - -case 0x4a79: - { - HAM dst(this); TST(dst); - } - break; - -case 0x81f9: -case 0x83f9: -case 0x85f9: -case 0x87f9: -case 0x89f9: -case 0x8bf9: -case 0x8df9: -case 0x8ff9: - { - HAM src(this); DIVS(src, instr_b11_b9); - } - break; - -case 0x80f9: -case 0x82f9: -case 0x84f9: -case 0x86f9: -case 0x88f9: -case 0x8af9: -case 0x8cf9: -case 0x8ef9: - { - HAM src(this); DIVU(src, instr_b11_b9); - } - break; - -case 0x33f9: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31f9: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x30b9: -case 0x32b9: -case 0x34b9: -case 0x36b9: -case 0x38b9: -case 0x3ab9: -case 0x3cb9: -case 0x3eb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3179: -case 0x3379: -case 0x3579: -case 0x3779: -case 0x3979: -case 0x3b79: -case 0x3d79: -case 0x3f79: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x31b9: -case 0x33b9: -case 0x35b9: -case 0x37b9: -case 0x39b9: -case 0x3bb9: -case 0x3db9: -case 0x3fb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30f9: -case 0x32f9: -case 0x34f9: -case 0x36f9: -case 0x38f9: -case 0x3af9: -case 0x3cf9: -case 0x3ef9: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3139: -case 0x3339: -case 0x3539: -case 0x3739: -case 0x3939: -case 0x3b39: -case 0x3d39: -case 0x3f39: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd079: -case 0xd279: -case 0xd479: -case 0xd679: -case 0xd879: -case 0xda79: -case 0xdc79: -case 0xde79: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc079: -case 0xc279: -case 0xc479: -case 0xc679: -case 0xc879: -case 0xca79: -case 0xcc79: -case 0xce79: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x41b9: -case 0x43b9: -case 0x45b9: -case 0x47b9: -case 0x49b9: -case 0x4bb9: -case 0x4db9: -case 0x4fb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb079: -case 0xb279: -case 0xb479: -case 0xb679: -case 0xb879: -case 0xba79: -case 0xbc79: -case 0xbe79: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x3039: -case 0x3239: -case 0x3439: -case 0x3639: -case 0x3839: -case 0x3a39: -case 0x3c39: -case 0x3e39: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8079: -case 0x8279: -case 0x8479: -case 0x8679: -case 0x8879: -case 0x8a79: -case 0x8c79: -case 0x8e79: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9079: -case 0x9279: -case 0x9479: -case 0x9679: -case 0x9879: -case 0x9a79: -case 0x9c79: -case 0x9e79: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0f9: -case 0xd2f9: -case 0xd4f9: -case 0xd6f9: -case 0xd8f9: -case 0xdaf9: -case 0xdcf9: -case 0xdef9: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0f9: -case 0xb2f9: -case 0xb4f9: -case 0xb6f9: -case 0xb8f9: -case 0xbaf9: -case 0xbcf9: -case 0xbef9: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90f9: -case 0x92f9: -case 0x94f9: -case 0x96f9: -case 0x98f9: -case 0x9af9: -case 0x9cf9: -case 0x9ef9: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x3079: -case 0x3279: -case 0x3479: -case 0x3679: -case 0x3879: -case 0x3a79: -case 0x3c79: -case 0x3e79: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44f9: - { - HAM src(this); MOVE_to_CCR(src); - } - break; - -case 0xc1f9: -case 0xc3f9: -case 0xc5f9: -case 0xc7f9: -case 0xc9f9: -case 0xcbf9: -case 0xcdf9: -case 0xcff9: - { - HAM src(this); MULS(src, instr_b11_b9); - } - break; - -case 0xc0f9: -case 0xc2f9: -case 0xc4f9: -case 0xc6f9: -case 0xc8f9: -case 0xcaf9: -case 0xccf9: -case 0xcef9: - { - HAM src(this); MULU(src, instr_b11_b9); - } - break; - -case 0xe1f9: - { - HAM targ(this); ASL(targ, 1); - } - break; - -case 0xe0f9: - { - HAM targ(this); ASR(targ, 1); - } - break; - -case 0xe3f9: - { - HAM targ(this); LSL(targ, 1); - } - break; - -case 0xe2f9: - { - HAM targ(this); LSR(targ, 1); - } - break; - -case 0xe7f9: - { - HAM targ(this); ROL(targ, 1); - } - break; - -case 0xe6f9: - { - HAM targ(this); ROR(targ, 1); - } - break; - -case 0xe5f9: - { - HAM targ(this); ROXL(targ, 1); - } - break; - -case 0xe4f9: - { - HAM targ(this); ROXR(targ, 1); - } - break; - -case 0x4278: - { - HAM dst(this); CLR(dst); - } - break; - -case 0x4478: - { - HAM dst(this); NEG(dst); - } - break; - -case 0x4078: - { - HAM dst(this); NEGX(dst); - } - break; - -case 0x4678: - { - HAM dst(this); NOT(dst); - } - break; - -case 0x4a78: - { - HAM dst(this); TST(dst); - } - break; - -case 0x81f8: -case 0x83f8: -case 0x85f8: -case 0x87f8: -case 0x89f8: -case 0x8bf8: -case 0x8df8: -case 0x8ff8: - { - HAM src(this); DIVS(src, instr_b11_b9); - } - break; - -case 0x80f8: -case 0x82f8: -case 0x84f8: -case 0x86f8: -case 0x88f8: -case 0x8af8: -case 0x8cf8: -case 0x8ef8: - { - HAM src(this); DIVU(src, instr_b11_b9); - } - break; - -case 0x33f8: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31f8: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x30b8: -case 0x32b8: -case 0x34b8: -case 0x36b8: -case 0x38b8: -case 0x3ab8: -case 0x3cb8: -case 0x3eb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3178: -case 0x3378: -case 0x3578: -case 0x3778: -case 0x3978: -case 0x3b78: -case 0x3d78: -case 0x3f78: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x31b8: -case 0x33b8: -case 0x35b8: -case 0x37b8: -case 0x39b8: -case 0x3bb8: -case 0x3db8: -case 0x3fb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30f8: -case 0x32f8: -case 0x34f8: -case 0x36f8: -case 0x38f8: -case 0x3af8: -case 0x3cf8: -case 0x3ef8: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3138: -case 0x3338: -case 0x3538: -case 0x3738: -case 0x3938: -case 0x3b38: -case 0x3d38: -case 0x3f38: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd078: -case 0xd278: -case 0xd478: -case 0xd678: -case 0xd878: -case 0xda78: -case 0xdc78: -case 0xde78: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc078: -case 0xc278: -case 0xc478: -case 0xc678: -case 0xc878: -case 0xca78: -case 0xcc78: -case 0xce78: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x41b8: -case 0x43b8: -case 0x45b8: -case 0x47b8: -case 0x49b8: -case 0x4bb8: -case 0x4db8: -case 0x4fb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb078: -case 0xb278: -case 0xb478: -case 0xb678: -case 0xb878: -case 0xba78: -case 0xbc78: -case 0xbe78: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x3038: -case 0x3238: -case 0x3438: -case 0x3638: -case 0x3838: -case 0x3a38: -case 0x3c38: -case 0x3e38: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8078: -case 0x8278: -case 0x8478: -case 0x8678: -case 0x8878: -case 0x8a78: -case 0x8c78: -case 0x8e78: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9078: -case 0x9278: -case 0x9478: -case 0x9678: -case 0x9878: -case 0x9a78: -case 0x9c78: -case 0x9e78: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0f8: -case 0xd2f8: -case 0xd4f8: -case 0xd6f8: -case 0xd8f8: -case 0xdaf8: -case 0xdcf8: -case 0xdef8: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0f8: -case 0xb2f8: -case 0xb4f8: -case 0xb6f8: -case 0xb8f8: -case 0xbaf8: -case 0xbcf8: -case 0xbef8: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90f8: -case 0x92f8: -case 0x94f8: -case 0x96f8: -case 0x98f8: -case 0x9af8: -case 0x9cf8: -case 0x9ef8: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x3078: -case 0x3278: -case 0x3478: -case 0x3678: -case 0x3878: -case 0x3a78: -case 0x3c78: -case 0x3e78: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44f8: - { - HAM src(this); MOVE_to_CCR(src); - } - break; - -case 0xc1f8: -case 0xc3f8: -case 0xc5f8: -case 0xc7f8: -case 0xc9f8: -case 0xcbf8: -case 0xcdf8: -case 0xcff8: - { - HAM src(this); MULS(src, instr_b11_b9); - } - break; - -case 0xc0f8: -case 0xc2f8: -case 0xc4f8: -case 0xc6f8: -case 0xc8f8: -case 0xcaf8: -case 0xccf8: -case 0xcef8: - { - HAM src(this); MULU(src, instr_b11_b9); - } - break; - -case 0xe1f8: - { - HAM targ(this); ASL(targ, 1); - } - break; - -case 0xe0f8: - { - HAM targ(this); ASR(targ, 1); - } - break; - -case 0xe3f8: - { - HAM targ(this); LSL(targ, 1); - } - break; - -case 0xe2f8: - { - HAM targ(this); LSR(targ, 1); - } - break; - -case 0xe7f8: - { - HAM targ(this); ROL(targ, 1); - } - break; - -case 0xe6f8: - { - HAM targ(this); ROR(targ, 1); - } - break; - -case 0xe5f8: - { - HAM targ(this); ROXL(targ, 1); - } - break; - -case 0xe4f8: - { - HAM targ(this); ROXR(targ, 1); - } - break; - -case 0x33c8: -case 0x33c9: -case 0x33ca: -case 0x33cb: -case 0x33cc: -case 0x33cd: -case 0x33ce: -case 0x33cf: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31c8: -case 0x31c9: -case 0x31ca: -case 0x31cb: -case 0x31cc: -case 0x31cd: -case 0x31ce: -case 0x31cf: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x3088: -case 0x3089: -case 0x308a: -case 0x308b: -case 0x308c: -case 0x308d: -case 0x308e: -case 0x308f: -case 0x3288: -case 0x3289: -case 0x328a: -case 0x328b: -case 0x328c: -case 0x328d: -case 0x328e: -case 0x328f: -case 0x3488: -case 0x3489: -case 0x348a: -case 0x348b: -case 0x348c: -case 0x348d: -case 0x348e: -case 0x348f: -case 0x3688: -case 0x3689: -case 0x368a: -case 0x368b: -case 0x368c: -case 0x368d: -case 0x368e: -case 0x368f: -case 0x3888: -case 0x3889: -case 0x388a: -case 0x388b: -case 0x388c: -case 0x388d: -case 0x388e: -case 0x388f: -case 0x3a88: -case 0x3a89: -case 0x3a8a: -case 0x3a8b: -case 0x3a8c: -case 0x3a8d: -case 0x3a8e: -case 0x3a8f: -case 0x3c88: -case 0x3c89: -case 0x3c8a: -case 0x3c8b: -case 0x3c8c: -case 0x3c8d: -case 0x3c8e: -case 0x3c8f: -case 0x3e88: -case 0x3e89: -case 0x3e8a: -case 0x3e8b: -case 0x3e8c: -case 0x3e8d: -case 0x3e8e: -case 0x3e8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3148: -case 0x3149: -case 0x314a: -case 0x314b: -case 0x314c: -case 0x314d: -case 0x314e: -case 0x314f: -case 0x3348: -case 0x3349: -case 0x334a: -case 0x334b: -case 0x334c: -case 0x334d: -case 0x334e: -case 0x334f: -case 0x3548: -case 0x3549: -case 0x354a: -case 0x354b: -case 0x354c: -case 0x354d: -case 0x354e: -case 0x354f: -case 0x3748: -case 0x3749: -case 0x374a: -case 0x374b: -case 0x374c: -case 0x374d: -case 0x374e: -case 0x374f: -case 0x3948: -case 0x3949: -case 0x394a: -case 0x394b: -case 0x394c: -case 0x394d: -case 0x394e: -case 0x394f: -case 0x3b48: -case 0x3b49: -case 0x3b4a: -case 0x3b4b: -case 0x3b4c: -case 0x3b4d: -case 0x3b4e: -case 0x3b4f: -case 0x3d48: -case 0x3d49: -case 0x3d4a: -case 0x3d4b: -case 0x3d4c: -case 0x3d4d: -case 0x3d4e: -case 0x3d4f: -case 0x3f48: -case 0x3f49: -case 0x3f4a: -case 0x3f4b: -case 0x3f4c: -case 0x3f4d: -case 0x3f4e: -case 0x3f4f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3188: -case 0x3189: -case 0x318a: -case 0x318b: -case 0x318c: -case 0x318d: -case 0x318e: -case 0x318f: -case 0x3388: -case 0x3389: -case 0x338a: -case 0x338b: -case 0x338c: -case 0x338d: -case 0x338e: -case 0x338f: -case 0x3588: -case 0x3589: -case 0x358a: -case 0x358b: -case 0x358c: -case 0x358d: -case 0x358e: -case 0x358f: -case 0x3788: -case 0x3789: -case 0x378a: -case 0x378b: -case 0x378c: -case 0x378d: -case 0x378e: -case 0x378f: -case 0x3988: -case 0x3989: -case 0x398a: -case 0x398b: -case 0x398c: -case 0x398d: -case 0x398e: -case 0x398f: -case 0x3b88: -case 0x3b89: -case 0x3b8a: -case 0x3b8b: -case 0x3b8c: -case 0x3b8d: -case 0x3b8e: -case 0x3b8f: -case 0x3d88: -case 0x3d89: -case 0x3d8a: -case 0x3d8b: -case 0x3d8c: -case 0x3d8d: -case 0x3d8e: -case 0x3d8f: -case 0x3f88: -case 0x3f89: -case 0x3f8a: -case 0x3f8b: -case 0x3f8c: -case 0x3f8d: -case 0x3f8e: -case 0x3f8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30c8: -case 0x30c9: -case 0x30ca: -case 0x30cb: -case 0x30cc: -case 0x30cd: -case 0x30ce: -case 0x30cf: -case 0x32c8: -case 0x32c9: -case 0x32ca: -case 0x32cb: -case 0x32cc: -case 0x32cd: -case 0x32ce: -case 0x32cf: -case 0x34c8: -case 0x34c9: -case 0x34ca: -case 0x34cb: -case 0x34cc: -case 0x34cd: -case 0x34ce: -case 0x34cf: -case 0x36c8: -case 0x36c9: -case 0x36ca: -case 0x36cb: -case 0x36cc: -case 0x36cd: -case 0x36ce: -case 0x36cf: -case 0x38c8: -case 0x38c9: -case 0x38ca: -case 0x38cb: -case 0x38cc: -case 0x38cd: -case 0x38ce: -case 0x38cf: -case 0x3ac8: -case 0x3ac9: -case 0x3aca: -case 0x3acb: -case 0x3acc: -case 0x3acd: -case 0x3ace: -case 0x3acf: -case 0x3cc8: -case 0x3cc9: -case 0x3cca: -case 0x3ccb: -case 0x3ccc: -case 0x3ccd: -case 0x3cce: -case 0x3ccf: -case 0x3ec8: -case 0x3ec9: -case 0x3eca: -case 0x3ecb: -case 0x3ecc: -case 0x3ecd: -case 0x3ece: -case 0x3ecf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3108: -case 0x3109: -case 0x310a: -case 0x310b: -case 0x310c: -case 0x310d: -case 0x310e: -case 0x310f: -case 0x3308: -case 0x3309: -case 0x330a: -case 0x330b: -case 0x330c: -case 0x330d: -case 0x330e: -case 0x330f: -case 0x3508: -case 0x3509: -case 0x350a: -case 0x350b: -case 0x350c: -case 0x350d: -case 0x350e: -case 0x350f: -case 0x3708: -case 0x3709: -case 0x370a: -case 0x370b: -case 0x370c: -case 0x370d: -case 0x370e: -case 0x370f: -case 0x3908: -case 0x3909: -case 0x390a: -case 0x390b: -case 0x390c: -case 0x390d: -case 0x390e: -case 0x390f: -case 0x3b08: -case 0x3b09: -case 0x3b0a: -case 0x3b0b: -case 0x3b0c: -case 0x3b0d: -case 0x3b0e: -case 0x3b0f: -case 0x3d08: -case 0x3d09: -case 0x3d0a: -case 0x3d0b: -case 0x3d0c: -case 0x3d0d: -case 0x3d0e: -case 0x3d0f: -case 0x3f08: -case 0x3f09: -case 0x3f0a: -case 0x3f0b: -case 0x3f0c: -case 0x3f0d: -case 0x3f0e: -case 0x3f0f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd048: -case 0xd049: -case 0xd04a: -case 0xd04b: -case 0xd04c: -case 0xd04d: -case 0xd04e: -case 0xd04f: -case 0xd248: -case 0xd249: -case 0xd24a: -case 0xd24b: -case 0xd24c: -case 0xd24d: -case 0xd24e: -case 0xd24f: -case 0xd448: -case 0xd449: -case 0xd44a: -case 0xd44b: -case 0xd44c: -case 0xd44d: -case 0xd44e: -case 0xd44f: -case 0xd648: -case 0xd649: -case 0xd64a: -case 0xd64b: -case 0xd64c: -case 0xd64d: -case 0xd64e: -case 0xd64f: -case 0xd848: -case 0xd849: -case 0xd84a: -case 0xd84b: -case 0xd84c: -case 0xd84d: -case 0xd84e: -case 0xd84f: -case 0xda48: -case 0xda49: -case 0xda4a: -case 0xda4b: -case 0xda4c: -case 0xda4d: -case 0xda4e: -case 0xda4f: -case 0xdc48: -case 0xdc49: -case 0xdc4a: -case 0xdc4b: -case 0xdc4c: -case 0xdc4d: -case 0xdc4e: -case 0xdc4f: -case 0xde48: -case 0xde49: -case 0xde4a: -case 0xde4b: -case 0xde4c: -case 0xde4d: -case 0xde4e: -case 0xde4f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb048: -case 0xb049: -case 0xb04a: -case 0xb04b: -case 0xb04c: -case 0xb04d: -case 0xb04e: -case 0xb04f: -case 0xb248: -case 0xb249: -case 0xb24a: -case 0xb24b: -case 0xb24c: -case 0xb24d: -case 0xb24e: -case 0xb24f: -case 0xb448: -case 0xb449: -case 0xb44a: -case 0xb44b: -case 0xb44c: -case 0xb44d: -case 0xb44e: -case 0xb44f: -case 0xb648: -case 0xb649: -case 0xb64a: -case 0xb64b: -case 0xb64c: -case 0xb64d: -case 0xb64e: -case 0xb64f: -case 0xb848: -case 0xb849: -case 0xb84a: -case 0xb84b: -case 0xb84c: -case 0xb84d: -case 0xb84e: -case 0xb84f: -case 0xba48: -case 0xba49: -case 0xba4a: -case 0xba4b: -case 0xba4c: -case 0xba4d: -case 0xba4e: -case 0xba4f: -case 0xbc48: -case 0xbc49: -case 0xbc4a: -case 0xbc4b: -case 0xbc4c: -case 0xbc4d: -case 0xbc4e: -case 0xbc4f: -case 0xbe48: -case 0xbe49: -case 0xbe4a: -case 0xbe4b: -case 0xbe4c: -case 0xbe4d: -case 0xbe4e: -case 0xbe4f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x3008: -case 0x3009: -case 0x300a: -case 0x300b: -case 0x300c: -case 0x300d: -case 0x300e: -case 0x300f: -case 0x3208: -case 0x3209: -case 0x320a: -case 0x320b: -case 0x320c: -case 0x320d: -case 0x320e: -case 0x320f: -case 0x3408: -case 0x3409: -case 0x340a: -case 0x340b: -case 0x340c: -case 0x340d: -case 0x340e: -case 0x340f: -case 0x3608: -case 0x3609: -case 0x360a: -case 0x360b: -case 0x360c: -case 0x360d: -case 0x360e: -case 0x360f: -case 0x3808: -case 0x3809: -case 0x380a: -case 0x380b: -case 0x380c: -case 0x380d: -case 0x380e: -case 0x380f: -case 0x3a08: -case 0x3a09: -case 0x3a0a: -case 0x3a0b: -case 0x3a0c: -case 0x3a0d: -case 0x3a0e: -case 0x3a0f: -case 0x3c08: -case 0x3c09: -case 0x3c0a: -case 0x3c0b: -case 0x3c0c: -case 0x3c0d: -case 0x3c0e: -case 0x3c0f: -case 0x3e08: -case 0x3e09: -case 0x3e0a: -case 0x3e0b: -case 0x3e0c: -case 0x3e0d: -case 0x3e0e: -case 0x3e0f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x9048: -case 0x9049: -case 0x904a: -case 0x904b: -case 0x904c: -case 0x904d: -case 0x904e: -case 0x904f: -case 0x9248: -case 0x9249: -case 0x924a: -case 0x924b: -case 0x924c: -case 0x924d: -case 0x924e: -case 0x924f: -case 0x9448: -case 0x9449: -case 0x944a: -case 0x944b: -case 0x944c: -case 0x944d: -case 0x944e: -case 0x944f: -case 0x9648: -case 0x9649: -case 0x964a: -case 0x964b: -case 0x964c: -case 0x964d: -case 0x964e: -case 0x964f: -case 0x9848: -case 0x9849: -case 0x984a: -case 0x984b: -case 0x984c: -case 0x984d: -case 0x984e: -case 0x984f: -case 0x9a48: -case 0x9a49: -case 0x9a4a: -case 0x9a4b: -case 0x9a4c: -case 0x9a4d: -case 0x9a4e: -case 0x9a4f: -case 0x9c48: -case 0x9c49: -case 0x9c4a: -case 0x9c4b: -case 0x9c4c: -case 0x9c4d: -case 0x9c4e: -case 0x9c4f: -case 0x9e48: -case 0x9e49: -case 0x9e4a: -case 0x9e4b: -case 0x9e4c: -case 0x9e4d: -case 0x9e4e: -case 0x9e4f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0c8: -case 0xd0c9: -case 0xd0ca: -case 0xd0cb: -case 0xd0cc: -case 0xd0cd: -case 0xd0ce: -case 0xd0cf: -case 0xd2c8: -case 0xd2c9: -case 0xd2ca: -case 0xd2cb: -case 0xd2cc: -case 0xd2cd: -case 0xd2ce: -case 0xd2cf: -case 0xd4c8: -case 0xd4c9: -case 0xd4ca: -case 0xd4cb: -case 0xd4cc: -case 0xd4cd: -case 0xd4ce: -case 0xd4cf: -case 0xd6c8: -case 0xd6c9: -case 0xd6ca: -case 0xd6cb: -case 0xd6cc: -case 0xd6cd: -case 0xd6ce: -case 0xd6cf: -case 0xd8c8: -case 0xd8c9: -case 0xd8ca: -case 0xd8cb: -case 0xd8cc: -case 0xd8cd: -case 0xd8ce: -case 0xd8cf: -case 0xdac8: -case 0xdac9: -case 0xdaca: -case 0xdacb: -case 0xdacc: -case 0xdacd: -case 0xdace: -case 0xdacf: -case 0xdcc8: -case 0xdcc9: -case 0xdcca: -case 0xdccb: -case 0xdccc: -case 0xdccd: -case 0xdcce: -case 0xdccf: -case 0xdec8: -case 0xdec9: -case 0xdeca: -case 0xdecb: -case 0xdecc: -case 0xdecd: -case 0xdece: -case 0xdecf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0c8: -case 0xb0c9: -case 0xb0ca: -case 0xb0cb: -case 0xb0cc: -case 0xb0cd: -case 0xb0ce: -case 0xb0cf: -case 0xb2c8: -case 0xb2c9: -case 0xb2ca: -case 0xb2cb: -case 0xb2cc: -case 0xb2cd: -case 0xb2ce: -case 0xb2cf: -case 0xb4c8: -case 0xb4c9: -case 0xb4ca: -case 0xb4cb: -case 0xb4cc: -case 0xb4cd: -case 0xb4ce: -case 0xb4cf: -case 0xb6c8: -case 0xb6c9: -case 0xb6ca: -case 0xb6cb: -case 0xb6cc: -case 0xb6cd: -case 0xb6ce: -case 0xb6cf: -case 0xb8c8: -case 0xb8c9: -case 0xb8ca: -case 0xb8cb: -case 0xb8cc: -case 0xb8cd: -case 0xb8ce: -case 0xb8cf: -case 0xbac8: -case 0xbac9: -case 0xbaca: -case 0xbacb: -case 0xbacc: -case 0xbacd: -case 0xbace: -case 0xbacf: -case 0xbcc8: -case 0xbcc9: -case 0xbcca: -case 0xbccb: -case 0xbccc: -case 0xbccd: -case 0xbcce: -case 0xbccf: -case 0xbec8: -case 0xbec9: -case 0xbeca: -case 0xbecb: -case 0xbecc: -case 0xbecd: -case 0xbece: -case 0xbecf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90c8: -case 0x90c9: -case 0x90ca: -case 0x90cb: -case 0x90cc: -case 0x90cd: -case 0x90ce: -case 0x90cf: -case 0x92c8: -case 0x92c9: -case 0x92ca: -case 0x92cb: -case 0x92cc: -case 0x92cd: -case 0x92ce: -case 0x92cf: -case 0x94c8: -case 0x94c9: -case 0x94ca: -case 0x94cb: -case 0x94cc: -case 0x94cd: -case 0x94ce: -case 0x94cf: -case 0x96c8: -case 0x96c9: -case 0x96ca: -case 0x96cb: -case 0x96cc: -case 0x96cd: -case 0x96ce: -case 0x96cf: -case 0x98c8: -case 0x98c9: -case 0x98ca: -case 0x98cb: -case 0x98cc: -case 0x98cd: -case 0x98ce: -case 0x98cf: -case 0x9ac8: -case 0x9ac9: -case 0x9aca: -case 0x9acb: -case 0x9acc: -case 0x9acd: -case 0x9ace: -case 0x9acf: -case 0x9cc8: -case 0x9cc9: -case 0x9cca: -case 0x9ccb: -case 0x9ccc: -case 0x9ccd: -case 0x9cce: -case 0x9ccf: -case 0x9ec8: -case 0x9ec9: -case 0x9eca: -case 0x9ecb: -case 0x9ecc: -case 0x9ecd: -case 0x9ece: -case 0x9ecf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x3048: -case 0x3049: -case 0x304a: -case 0x304b: -case 0x304c: -case 0x304d: -case 0x304e: -case 0x304f: -case 0x3248: -case 0x3249: -case 0x324a: -case 0x324b: -case 0x324c: -case 0x324d: -case 0x324e: -case 0x324f: -case 0x3448: -case 0x3449: -case 0x344a: -case 0x344b: -case 0x344c: -case 0x344d: -case 0x344e: -case 0x344f: -case 0x3648: -case 0x3649: -case 0x364a: -case 0x364b: -case 0x364c: -case 0x364d: -case 0x364e: -case 0x364f: -case 0x3848: -case 0x3849: -case 0x384a: -case 0x384b: -case 0x384c: -case 0x384d: -case 0x384e: -case 0x384f: -case 0x3a48: -case 0x3a49: -case 0x3a4a: -case 0x3a4b: -case 0x3a4c: -case 0x3a4d: -case 0x3a4e: -case 0x3a4f: -case 0x3c48: -case 0x3c49: -case 0x3c4a: -case 0x3c4b: -case 0x3c4c: -case 0x3c4d: -case 0x3c4e: -case 0x3c4f: -case 0x3e48: -case 0x3e49: -case 0x3e4a: -case 0x3e4b: -case 0x3e4c: -case 0x3e4d: -case 0x3e4e: -case 0x3e4f: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x4250: -case 0x4251: -case 0x4252: -case 0x4253: -case 0x4254: -case 0x4255: -case 0x4256: -case 0x4257: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4450: -case 0x4451: -case 0x4452: -case 0x4453: -case 0x4454: -case 0x4455: -case 0x4456: -case 0x4457: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4050: -case 0x4051: -case 0x4052: -case 0x4053: -case 0x4054: -case 0x4055: -case 0x4056: -case 0x4057: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4650: -case 0x4651: -case 0x4652: -case 0x4653: -case 0x4654: -case 0x4655: -case 0x4656: -case 0x4657: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4a50: -case 0x4a51: -case 0x4a52: -case 0x4a53: -case 0x4a54: -case 0x4a55: -case 0x4a56: -case 0x4a57: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x81d0: -case 0x81d1: -case 0x81d2: -case 0x81d3: -case 0x81d4: -case 0x81d5: -case 0x81d6: -case 0x81d7: -case 0x83d0: -case 0x83d1: -case 0x83d2: -case 0x83d3: -case 0x83d4: -case 0x83d5: -case 0x83d6: -case 0x83d7: -case 0x85d0: -case 0x85d1: -case 0x85d2: -case 0x85d3: -case 0x85d4: -case 0x85d5: -case 0x85d6: -case 0x85d7: -case 0x87d0: -case 0x87d1: -case 0x87d2: -case 0x87d3: -case 0x87d4: -case 0x87d5: -case 0x87d6: -case 0x87d7: -case 0x89d0: -case 0x89d1: -case 0x89d2: -case 0x89d3: -case 0x89d4: -case 0x89d5: -case 0x89d6: -case 0x89d7: -case 0x8bd0: -case 0x8bd1: -case 0x8bd2: -case 0x8bd3: -case 0x8bd4: -case 0x8bd5: -case 0x8bd6: -case 0x8bd7: -case 0x8dd0: -case 0x8dd1: -case 0x8dd2: -case 0x8dd3: -case 0x8dd4: -case 0x8dd5: -case 0x8dd6: -case 0x8dd7: -case 0x8fd0: -case 0x8fd1: -case 0x8fd2: -case 0x8fd3: -case 0x8fd4: -case 0x8fd5: -case 0x8fd6: -case 0x8fd7: - { - HAM src(this, instr_b2_b0); DIVS(src, instr_b11_b9); - } - break; - -case 0x80d0: -case 0x80d1: -case 0x80d2: -case 0x80d3: -case 0x80d4: -case 0x80d5: -case 0x80d6: -case 0x80d7: -case 0x82d0: -case 0x82d1: -case 0x82d2: -case 0x82d3: -case 0x82d4: -case 0x82d5: -case 0x82d6: -case 0x82d7: -case 0x84d0: -case 0x84d1: -case 0x84d2: -case 0x84d3: -case 0x84d4: -case 0x84d5: -case 0x84d6: -case 0x84d7: -case 0x86d0: -case 0x86d1: -case 0x86d2: -case 0x86d3: -case 0x86d4: -case 0x86d5: -case 0x86d6: -case 0x86d7: -case 0x88d0: -case 0x88d1: -case 0x88d2: -case 0x88d3: -case 0x88d4: -case 0x88d5: -case 0x88d6: -case 0x88d7: -case 0x8ad0: -case 0x8ad1: -case 0x8ad2: -case 0x8ad3: -case 0x8ad4: -case 0x8ad5: -case 0x8ad6: -case 0x8ad7: -case 0x8cd0: -case 0x8cd1: -case 0x8cd2: -case 0x8cd3: -case 0x8cd4: -case 0x8cd5: -case 0x8cd6: -case 0x8cd7: -case 0x8ed0: -case 0x8ed1: -case 0x8ed2: -case 0x8ed3: -case 0x8ed4: -case 0x8ed5: -case 0x8ed6: -case 0x8ed7: - { - HAM src(this, instr_b2_b0); DIVU(src, instr_b11_b9); - } - break; - -case 0x33d0: -case 0x33d1: -case 0x33d2: -case 0x33d3: -case 0x33d4: -case 0x33d5: -case 0x33d6: -case 0x33d7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31d0: -case 0x31d1: -case 0x31d2: -case 0x31d3: -case 0x31d4: -case 0x31d5: -case 0x31d6: -case 0x31d7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x3090: -case 0x3091: -case 0x3092: -case 0x3093: -case 0x3094: -case 0x3095: -case 0x3096: -case 0x3097: -case 0x3290: -case 0x3291: -case 0x3292: -case 0x3293: -case 0x3294: -case 0x3295: -case 0x3296: -case 0x3297: -case 0x3490: -case 0x3491: -case 0x3492: -case 0x3493: -case 0x3494: -case 0x3495: -case 0x3496: -case 0x3497: -case 0x3690: -case 0x3691: -case 0x3692: -case 0x3693: -case 0x3694: -case 0x3695: -case 0x3696: -case 0x3697: -case 0x3890: -case 0x3891: -case 0x3892: -case 0x3893: -case 0x3894: -case 0x3895: -case 0x3896: -case 0x3897: -case 0x3a90: -case 0x3a91: -case 0x3a92: -case 0x3a93: -case 0x3a94: -case 0x3a95: -case 0x3a96: -case 0x3a97: -case 0x3c90: -case 0x3c91: -case 0x3c92: -case 0x3c93: -case 0x3c94: -case 0x3c95: -case 0x3c96: -case 0x3c97: -case 0x3e90: -case 0x3e91: -case 0x3e92: -case 0x3e93: -case 0x3e94: -case 0x3e95: -case 0x3e96: -case 0x3e97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3150: -case 0x3151: -case 0x3152: -case 0x3153: -case 0x3154: -case 0x3155: -case 0x3156: -case 0x3157: -case 0x3350: -case 0x3351: -case 0x3352: -case 0x3353: -case 0x3354: -case 0x3355: -case 0x3356: -case 0x3357: -case 0x3550: -case 0x3551: -case 0x3552: -case 0x3553: -case 0x3554: -case 0x3555: -case 0x3556: -case 0x3557: -case 0x3750: -case 0x3751: -case 0x3752: -case 0x3753: -case 0x3754: -case 0x3755: -case 0x3756: -case 0x3757: -case 0x3950: -case 0x3951: -case 0x3952: -case 0x3953: -case 0x3954: -case 0x3955: -case 0x3956: -case 0x3957: -case 0x3b50: -case 0x3b51: -case 0x3b52: -case 0x3b53: -case 0x3b54: -case 0x3b55: -case 0x3b56: -case 0x3b57: -case 0x3d50: -case 0x3d51: -case 0x3d52: -case 0x3d53: -case 0x3d54: -case 0x3d55: -case 0x3d56: -case 0x3d57: -case 0x3f50: -case 0x3f51: -case 0x3f52: -case 0x3f53: -case 0x3f54: -case 0x3f55: -case 0x3f56: -case 0x3f57: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3190: -case 0x3191: -case 0x3192: -case 0x3193: -case 0x3194: -case 0x3195: -case 0x3196: -case 0x3197: -case 0x3390: -case 0x3391: -case 0x3392: -case 0x3393: -case 0x3394: -case 0x3395: -case 0x3396: -case 0x3397: -case 0x3590: -case 0x3591: -case 0x3592: -case 0x3593: -case 0x3594: -case 0x3595: -case 0x3596: -case 0x3597: -case 0x3790: -case 0x3791: -case 0x3792: -case 0x3793: -case 0x3794: -case 0x3795: -case 0x3796: -case 0x3797: -case 0x3990: -case 0x3991: -case 0x3992: -case 0x3993: -case 0x3994: -case 0x3995: -case 0x3996: -case 0x3997: -case 0x3b90: -case 0x3b91: -case 0x3b92: -case 0x3b93: -case 0x3b94: -case 0x3b95: -case 0x3b96: -case 0x3b97: -case 0x3d90: -case 0x3d91: -case 0x3d92: -case 0x3d93: -case 0x3d94: -case 0x3d95: -case 0x3d96: -case 0x3d97: -case 0x3f90: -case 0x3f91: -case 0x3f92: -case 0x3f93: -case 0x3f94: -case 0x3f95: -case 0x3f96: -case 0x3f97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30d0: -case 0x30d1: -case 0x30d2: -case 0x30d3: -case 0x30d4: -case 0x30d5: -case 0x30d6: -case 0x30d7: -case 0x32d0: -case 0x32d1: -case 0x32d2: -case 0x32d3: -case 0x32d4: -case 0x32d5: -case 0x32d6: -case 0x32d7: -case 0x34d0: -case 0x34d1: -case 0x34d2: -case 0x34d3: -case 0x34d4: -case 0x34d5: -case 0x34d6: -case 0x34d7: -case 0x36d0: -case 0x36d1: -case 0x36d2: -case 0x36d3: -case 0x36d4: -case 0x36d5: -case 0x36d6: -case 0x36d7: -case 0x38d0: -case 0x38d1: -case 0x38d2: -case 0x38d3: -case 0x38d4: -case 0x38d5: -case 0x38d6: -case 0x38d7: -case 0x3ad0: -case 0x3ad1: -case 0x3ad2: -case 0x3ad3: -case 0x3ad4: -case 0x3ad5: -case 0x3ad6: -case 0x3ad7: -case 0x3cd0: -case 0x3cd1: -case 0x3cd2: -case 0x3cd3: -case 0x3cd4: -case 0x3cd5: -case 0x3cd6: -case 0x3cd7: -case 0x3ed0: -case 0x3ed1: -case 0x3ed2: -case 0x3ed3: -case 0x3ed4: -case 0x3ed5: -case 0x3ed6: -case 0x3ed7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3110: -case 0x3111: -case 0x3112: -case 0x3113: -case 0x3114: -case 0x3115: -case 0x3116: -case 0x3117: -case 0x3310: -case 0x3311: -case 0x3312: -case 0x3313: -case 0x3314: -case 0x3315: -case 0x3316: -case 0x3317: -case 0x3510: -case 0x3511: -case 0x3512: -case 0x3513: -case 0x3514: -case 0x3515: -case 0x3516: -case 0x3517: -case 0x3710: -case 0x3711: -case 0x3712: -case 0x3713: -case 0x3714: -case 0x3715: -case 0x3716: -case 0x3717: -case 0x3910: -case 0x3911: -case 0x3912: -case 0x3913: -case 0x3914: -case 0x3915: -case 0x3916: -case 0x3917: -case 0x3b10: -case 0x3b11: -case 0x3b12: -case 0x3b13: -case 0x3b14: -case 0x3b15: -case 0x3b16: -case 0x3b17: -case 0x3d10: -case 0x3d11: -case 0x3d12: -case 0x3d13: -case 0x3d14: -case 0x3d15: -case 0x3d16: -case 0x3d17: -case 0x3f10: -case 0x3f11: -case 0x3f12: -case 0x3f13: -case 0x3f14: -case 0x3f15: -case 0x3f16: -case 0x3f17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd050: -case 0xd051: -case 0xd052: -case 0xd053: -case 0xd054: -case 0xd055: -case 0xd056: -case 0xd057: -case 0xd250: -case 0xd251: -case 0xd252: -case 0xd253: -case 0xd254: -case 0xd255: -case 0xd256: -case 0xd257: -case 0xd450: -case 0xd451: -case 0xd452: -case 0xd453: -case 0xd454: -case 0xd455: -case 0xd456: -case 0xd457: -case 0xd650: -case 0xd651: -case 0xd652: -case 0xd653: -case 0xd654: -case 0xd655: -case 0xd656: -case 0xd657: -case 0xd850: -case 0xd851: -case 0xd852: -case 0xd853: -case 0xd854: -case 0xd855: -case 0xd856: -case 0xd857: -case 0xda50: -case 0xda51: -case 0xda52: -case 0xda53: -case 0xda54: -case 0xda55: -case 0xda56: -case 0xda57: -case 0xdc50: -case 0xdc51: -case 0xdc52: -case 0xdc53: -case 0xdc54: -case 0xdc55: -case 0xdc56: -case 0xdc57: -case 0xde50: -case 0xde51: -case 0xde52: -case 0xde53: -case 0xde54: -case 0xde55: -case 0xde56: -case 0xde57: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc050: -case 0xc051: -case 0xc052: -case 0xc053: -case 0xc054: -case 0xc055: -case 0xc056: -case 0xc057: -case 0xc250: -case 0xc251: -case 0xc252: -case 0xc253: -case 0xc254: -case 0xc255: -case 0xc256: -case 0xc257: -case 0xc450: -case 0xc451: -case 0xc452: -case 0xc453: -case 0xc454: -case 0xc455: -case 0xc456: -case 0xc457: -case 0xc650: -case 0xc651: -case 0xc652: -case 0xc653: -case 0xc654: -case 0xc655: -case 0xc656: -case 0xc657: -case 0xc850: -case 0xc851: -case 0xc852: -case 0xc853: -case 0xc854: -case 0xc855: -case 0xc856: -case 0xc857: -case 0xca50: -case 0xca51: -case 0xca52: -case 0xca53: -case 0xca54: -case 0xca55: -case 0xca56: -case 0xca57: -case 0xcc50: -case 0xcc51: -case 0xcc52: -case 0xcc53: -case 0xcc54: -case 0xcc55: -case 0xcc56: -case 0xcc57: -case 0xce50: -case 0xce51: -case 0xce52: -case 0xce53: -case 0xce54: -case 0xce55: -case 0xce56: -case 0xce57: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x4190: -case 0x4191: -case 0x4192: -case 0x4193: -case 0x4194: -case 0x4195: -case 0x4196: -case 0x4197: -case 0x4390: -case 0x4391: -case 0x4392: -case 0x4393: -case 0x4394: -case 0x4395: -case 0x4396: -case 0x4397: -case 0x4590: -case 0x4591: -case 0x4592: -case 0x4593: -case 0x4594: -case 0x4595: -case 0x4596: -case 0x4597: -case 0x4790: -case 0x4791: -case 0x4792: -case 0x4793: -case 0x4794: -case 0x4795: -case 0x4796: -case 0x4797: -case 0x4990: -case 0x4991: -case 0x4992: -case 0x4993: -case 0x4994: -case 0x4995: -case 0x4996: -case 0x4997: -case 0x4b90: -case 0x4b91: -case 0x4b92: -case 0x4b93: -case 0x4b94: -case 0x4b95: -case 0x4b96: -case 0x4b97: -case 0x4d90: -case 0x4d91: -case 0x4d92: -case 0x4d93: -case 0x4d94: -case 0x4d95: -case 0x4d96: -case 0x4d97: -case 0x4f90: -case 0x4f91: -case 0x4f92: -case 0x4f93: -case 0x4f94: -case 0x4f95: -case 0x4f96: -case 0x4f97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb050: -case 0xb051: -case 0xb052: -case 0xb053: -case 0xb054: -case 0xb055: -case 0xb056: -case 0xb057: -case 0xb250: -case 0xb251: -case 0xb252: -case 0xb253: -case 0xb254: -case 0xb255: -case 0xb256: -case 0xb257: -case 0xb450: -case 0xb451: -case 0xb452: -case 0xb453: -case 0xb454: -case 0xb455: -case 0xb456: -case 0xb457: -case 0xb650: -case 0xb651: -case 0xb652: -case 0xb653: -case 0xb654: -case 0xb655: -case 0xb656: -case 0xb657: -case 0xb850: -case 0xb851: -case 0xb852: -case 0xb853: -case 0xb854: -case 0xb855: -case 0xb856: -case 0xb857: -case 0xba50: -case 0xba51: -case 0xba52: -case 0xba53: -case 0xba54: -case 0xba55: -case 0xba56: -case 0xba57: -case 0xbc50: -case 0xbc51: -case 0xbc52: -case 0xbc53: -case 0xbc54: -case 0xbc55: -case 0xbc56: -case 0xbc57: -case 0xbe50: -case 0xbe51: -case 0xbe52: -case 0xbe53: -case 0xbe54: -case 0xbe55: -case 0xbe56: -case 0xbe57: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x3010: -case 0x3011: -case 0x3012: -case 0x3013: -case 0x3014: -case 0x3015: -case 0x3016: -case 0x3017: -case 0x3210: -case 0x3211: -case 0x3212: -case 0x3213: -case 0x3214: -case 0x3215: -case 0x3216: -case 0x3217: -case 0x3410: -case 0x3411: -case 0x3412: -case 0x3413: -case 0x3414: -case 0x3415: -case 0x3416: -case 0x3417: -case 0x3610: -case 0x3611: -case 0x3612: -case 0x3613: -case 0x3614: -case 0x3615: -case 0x3616: -case 0x3617: -case 0x3810: -case 0x3811: -case 0x3812: -case 0x3813: -case 0x3814: -case 0x3815: -case 0x3816: -case 0x3817: -case 0x3a10: -case 0x3a11: -case 0x3a12: -case 0x3a13: -case 0x3a14: -case 0x3a15: -case 0x3a16: -case 0x3a17: -case 0x3c10: -case 0x3c11: -case 0x3c12: -case 0x3c13: -case 0x3c14: -case 0x3c15: -case 0x3c16: -case 0x3c17: -case 0x3e10: -case 0x3e11: -case 0x3e12: -case 0x3e13: -case 0x3e14: -case 0x3e15: -case 0x3e16: -case 0x3e17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8050: -case 0x8051: -case 0x8052: -case 0x8053: -case 0x8054: -case 0x8055: -case 0x8056: -case 0x8057: -case 0x8250: -case 0x8251: -case 0x8252: -case 0x8253: -case 0x8254: -case 0x8255: -case 0x8256: -case 0x8257: -case 0x8450: -case 0x8451: -case 0x8452: -case 0x8453: -case 0x8454: -case 0x8455: -case 0x8456: -case 0x8457: -case 0x8650: -case 0x8651: -case 0x8652: -case 0x8653: -case 0x8654: -case 0x8655: -case 0x8656: -case 0x8657: -case 0x8850: -case 0x8851: -case 0x8852: -case 0x8853: -case 0x8854: -case 0x8855: -case 0x8856: -case 0x8857: -case 0x8a50: -case 0x8a51: -case 0x8a52: -case 0x8a53: -case 0x8a54: -case 0x8a55: -case 0x8a56: -case 0x8a57: -case 0x8c50: -case 0x8c51: -case 0x8c52: -case 0x8c53: -case 0x8c54: -case 0x8c55: -case 0x8c56: -case 0x8c57: -case 0x8e50: -case 0x8e51: -case 0x8e52: -case 0x8e53: -case 0x8e54: -case 0x8e55: -case 0x8e56: -case 0x8e57: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9050: -case 0x9051: -case 0x9052: -case 0x9053: -case 0x9054: -case 0x9055: -case 0x9056: -case 0x9057: -case 0x9250: -case 0x9251: -case 0x9252: -case 0x9253: -case 0x9254: -case 0x9255: -case 0x9256: -case 0x9257: -case 0x9450: -case 0x9451: -case 0x9452: -case 0x9453: -case 0x9454: -case 0x9455: -case 0x9456: -case 0x9457: -case 0x9650: -case 0x9651: -case 0x9652: -case 0x9653: -case 0x9654: -case 0x9655: -case 0x9656: -case 0x9657: -case 0x9850: -case 0x9851: -case 0x9852: -case 0x9853: -case 0x9854: -case 0x9855: -case 0x9856: -case 0x9857: -case 0x9a50: -case 0x9a51: -case 0x9a52: -case 0x9a53: -case 0x9a54: -case 0x9a55: -case 0x9a56: -case 0x9a57: -case 0x9c50: -case 0x9c51: -case 0x9c52: -case 0x9c53: -case 0x9c54: -case 0x9c55: -case 0x9c56: -case 0x9c57: -case 0x9e50: -case 0x9e51: -case 0x9e52: -case 0x9e53: -case 0x9e54: -case 0x9e55: -case 0x9e56: -case 0x9e57: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0d0: -case 0xd0d1: -case 0xd0d2: -case 0xd0d3: -case 0xd0d4: -case 0xd0d5: -case 0xd0d6: -case 0xd0d7: -case 0xd2d0: -case 0xd2d1: -case 0xd2d2: -case 0xd2d3: -case 0xd2d4: -case 0xd2d5: -case 0xd2d6: -case 0xd2d7: -case 0xd4d0: -case 0xd4d1: -case 0xd4d2: -case 0xd4d3: -case 0xd4d4: -case 0xd4d5: -case 0xd4d6: -case 0xd4d7: -case 0xd6d0: -case 0xd6d1: -case 0xd6d2: -case 0xd6d3: -case 0xd6d4: -case 0xd6d5: -case 0xd6d6: -case 0xd6d7: -case 0xd8d0: -case 0xd8d1: -case 0xd8d2: -case 0xd8d3: -case 0xd8d4: -case 0xd8d5: -case 0xd8d6: -case 0xd8d7: -case 0xdad0: -case 0xdad1: -case 0xdad2: -case 0xdad3: -case 0xdad4: -case 0xdad5: -case 0xdad6: -case 0xdad7: -case 0xdcd0: -case 0xdcd1: -case 0xdcd2: -case 0xdcd3: -case 0xdcd4: -case 0xdcd5: -case 0xdcd6: -case 0xdcd7: -case 0xded0: -case 0xded1: -case 0xded2: -case 0xded3: -case 0xded4: -case 0xded5: -case 0xded6: -case 0xded7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0d0: -case 0xb0d1: -case 0xb0d2: -case 0xb0d3: -case 0xb0d4: -case 0xb0d5: -case 0xb0d6: -case 0xb0d7: -case 0xb2d0: -case 0xb2d1: -case 0xb2d2: -case 0xb2d3: -case 0xb2d4: -case 0xb2d5: -case 0xb2d6: -case 0xb2d7: -case 0xb4d0: -case 0xb4d1: -case 0xb4d2: -case 0xb4d3: -case 0xb4d4: -case 0xb4d5: -case 0xb4d6: -case 0xb4d7: -case 0xb6d0: -case 0xb6d1: -case 0xb6d2: -case 0xb6d3: -case 0xb6d4: -case 0xb6d5: -case 0xb6d6: -case 0xb6d7: -case 0xb8d0: -case 0xb8d1: -case 0xb8d2: -case 0xb8d3: -case 0xb8d4: -case 0xb8d5: -case 0xb8d6: -case 0xb8d7: -case 0xbad0: -case 0xbad1: -case 0xbad2: -case 0xbad3: -case 0xbad4: -case 0xbad5: -case 0xbad6: -case 0xbad7: -case 0xbcd0: -case 0xbcd1: -case 0xbcd2: -case 0xbcd3: -case 0xbcd4: -case 0xbcd5: -case 0xbcd6: -case 0xbcd7: -case 0xbed0: -case 0xbed1: -case 0xbed2: -case 0xbed3: -case 0xbed4: -case 0xbed5: -case 0xbed6: -case 0xbed7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90d0: -case 0x90d1: -case 0x90d2: -case 0x90d3: -case 0x90d4: -case 0x90d5: -case 0x90d6: -case 0x90d7: -case 0x92d0: -case 0x92d1: -case 0x92d2: -case 0x92d3: -case 0x92d4: -case 0x92d5: -case 0x92d6: -case 0x92d7: -case 0x94d0: -case 0x94d1: -case 0x94d2: -case 0x94d3: -case 0x94d4: -case 0x94d5: -case 0x94d6: -case 0x94d7: -case 0x96d0: -case 0x96d1: -case 0x96d2: -case 0x96d3: -case 0x96d4: -case 0x96d5: -case 0x96d6: -case 0x96d7: -case 0x98d0: -case 0x98d1: -case 0x98d2: -case 0x98d3: -case 0x98d4: -case 0x98d5: -case 0x98d6: -case 0x98d7: -case 0x9ad0: -case 0x9ad1: -case 0x9ad2: -case 0x9ad3: -case 0x9ad4: -case 0x9ad5: -case 0x9ad6: -case 0x9ad7: -case 0x9cd0: -case 0x9cd1: -case 0x9cd2: -case 0x9cd3: -case 0x9cd4: -case 0x9cd5: -case 0x9cd6: -case 0x9cd7: -case 0x9ed0: -case 0x9ed1: -case 0x9ed2: -case 0x9ed3: -case 0x9ed4: -case 0x9ed5: -case 0x9ed6: -case 0x9ed7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x3050: -case 0x3051: -case 0x3052: -case 0x3053: -case 0x3054: -case 0x3055: -case 0x3056: -case 0x3057: -case 0x3250: -case 0x3251: -case 0x3252: -case 0x3253: -case 0x3254: -case 0x3255: -case 0x3256: -case 0x3257: -case 0x3450: -case 0x3451: -case 0x3452: -case 0x3453: -case 0x3454: -case 0x3455: -case 0x3456: -case 0x3457: -case 0x3650: -case 0x3651: -case 0x3652: -case 0x3653: -case 0x3654: -case 0x3655: -case 0x3656: -case 0x3657: -case 0x3850: -case 0x3851: -case 0x3852: -case 0x3853: -case 0x3854: -case 0x3855: -case 0x3856: -case 0x3857: -case 0x3a50: -case 0x3a51: -case 0x3a52: -case 0x3a53: -case 0x3a54: -case 0x3a55: -case 0x3a56: -case 0x3a57: -case 0x3c50: -case 0x3c51: -case 0x3c52: -case 0x3c53: -case 0x3c54: -case 0x3c55: -case 0x3c56: -case 0x3c57: -case 0x3e50: -case 0x3e51: -case 0x3e52: -case 0x3e53: -case 0x3e54: -case 0x3e55: -case 0x3e56: -case 0x3e57: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44d0: -case 0x44d1: -case 0x44d2: -case 0x44d3: -case 0x44d4: -case 0x44d5: -case 0x44d6: -case 0x44d7: - { - HAM src(this, instr_b2_b0); MOVE_to_CCR(src); - } - break; - -case 0xc1d0: -case 0xc1d1: -case 0xc1d2: -case 0xc1d3: -case 0xc1d4: -case 0xc1d5: -case 0xc1d6: -case 0xc1d7: -case 0xc3d0: -case 0xc3d1: -case 0xc3d2: -case 0xc3d3: -case 0xc3d4: -case 0xc3d5: -case 0xc3d6: -case 0xc3d7: -case 0xc5d0: -case 0xc5d1: -case 0xc5d2: -case 0xc5d3: -case 0xc5d4: -case 0xc5d5: -case 0xc5d6: -case 0xc5d7: -case 0xc7d0: -case 0xc7d1: -case 0xc7d2: -case 0xc7d3: -case 0xc7d4: -case 0xc7d5: -case 0xc7d6: -case 0xc7d7: -case 0xc9d0: -case 0xc9d1: -case 0xc9d2: -case 0xc9d3: -case 0xc9d4: -case 0xc9d5: -case 0xc9d6: -case 0xc9d7: -case 0xcbd0: -case 0xcbd1: -case 0xcbd2: -case 0xcbd3: -case 0xcbd4: -case 0xcbd5: -case 0xcbd6: -case 0xcbd7: -case 0xcdd0: -case 0xcdd1: -case 0xcdd2: -case 0xcdd3: -case 0xcdd4: -case 0xcdd5: -case 0xcdd6: -case 0xcdd7: -case 0xcfd0: -case 0xcfd1: -case 0xcfd2: -case 0xcfd3: -case 0xcfd4: -case 0xcfd5: -case 0xcfd6: -case 0xcfd7: - { - HAM src(this, instr_b2_b0); MULS(src, instr_b11_b9); - } - break; - -case 0xc0d0: -case 0xc0d1: -case 0xc0d2: -case 0xc0d3: -case 0xc0d4: -case 0xc0d5: -case 0xc0d6: -case 0xc0d7: -case 0xc2d0: -case 0xc2d1: -case 0xc2d2: -case 0xc2d3: -case 0xc2d4: -case 0xc2d5: -case 0xc2d6: -case 0xc2d7: -case 0xc4d0: -case 0xc4d1: -case 0xc4d2: -case 0xc4d3: -case 0xc4d4: -case 0xc4d5: -case 0xc4d6: -case 0xc4d7: -case 0xc6d0: -case 0xc6d1: -case 0xc6d2: -case 0xc6d3: -case 0xc6d4: -case 0xc6d5: -case 0xc6d6: -case 0xc6d7: -case 0xc8d0: -case 0xc8d1: -case 0xc8d2: -case 0xc8d3: -case 0xc8d4: -case 0xc8d5: -case 0xc8d6: -case 0xc8d7: -case 0xcad0: -case 0xcad1: -case 0xcad2: -case 0xcad3: -case 0xcad4: -case 0xcad5: -case 0xcad6: -case 0xcad7: -case 0xccd0: -case 0xccd1: -case 0xccd2: -case 0xccd3: -case 0xccd4: -case 0xccd5: -case 0xccd6: -case 0xccd7: -case 0xced0: -case 0xced1: -case 0xced2: -case 0xced3: -case 0xced4: -case 0xced5: -case 0xced6: -case 0xced7: - { - HAM src(this, instr_b2_b0); MULU(src, instr_b11_b9); - } - break; - -case 0xe1d0: -case 0xe1d1: -case 0xe1d2: -case 0xe1d3: -case 0xe1d4: -case 0xe1d5: -case 0xe1d6: -case 0xe1d7: - { - HAM targ(this, instr_b2_b0); ASL(targ, 1); - } - break; - -case 0xe0d0: -case 0xe0d1: -case 0xe0d2: -case 0xe0d3: -case 0xe0d4: -case 0xe0d5: -case 0xe0d6: -case 0xe0d7: - { - HAM targ(this, instr_b2_b0); ASR(targ, 1); - } - break; - -case 0xe3d0: -case 0xe3d1: -case 0xe3d2: -case 0xe3d3: -case 0xe3d4: -case 0xe3d5: -case 0xe3d6: -case 0xe3d7: - { - HAM targ(this, instr_b2_b0); LSL(targ, 1); - } - break; - -case 0xe2d0: -case 0xe2d1: -case 0xe2d2: -case 0xe2d3: -case 0xe2d4: -case 0xe2d5: -case 0xe2d6: -case 0xe2d7: - { - HAM targ(this, instr_b2_b0); LSR(targ, 1); - } - break; - -case 0xe7d0: -case 0xe7d1: -case 0xe7d2: -case 0xe7d3: -case 0xe7d4: -case 0xe7d5: -case 0xe7d6: -case 0xe7d7: - { - HAM targ(this, instr_b2_b0); ROL(targ, 1); - } - break; - -case 0xe6d0: -case 0xe6d1: -case 0xe6d2: -case 0xe6d3: -case 0xe6d4: -case 0xe6d5: -case 0xe6d6: -case 0xe6d7: - { - HAM targ(this, instr_b2_b0); ROR(targ, 1); - } - break; - -case 0xe5d0: -case 0xe5d1: -case 0xe5d2: -case 0xe5d3: -case 0xe5d4: -case 0xe5d5: -case 0xe5d6: -case 0xe5d7: - { - HAM targ(this, instr_b2_b0); ROXL(targ, 1); - } - break; - -case 0xe4d0: -case 0xe4d1: -case 0xe4d2: -case 0xe4d3: -case 0xe4d4: -case 0xe4d5: -case 0xe4d6: -case 0xe4d7: - { - HAM targ(this, instr_b2_b0); ROXR(targ, 1); - } - break; - -case 0x4268: -case 0x4269: -case 0x426a: -case 0x426b: -case 0x426c: -case 0x426d: -case 0x426e: -case 0x426f: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4468: -case 0x4469: -case 0x446a: -case 0x446b: -case 0x446c: -case 0x446d: -case 0x446e: -case 0x446f: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4068: -case 0x4069: -case 0x406a: -case 0x406b: -case 0x406c: -case 0x406d: -case 0x406e: -case 0x406f: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4668: -case 0x4669: -case 0x466a: -case 0x466b: -case 0x466c: -case 0x466d: -case 0x466e: -case 0x466f: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4a68: -case 0x4a69: -case 0x4a6a: -case 0x4a6b: -case 0x4a6c: -case 0x4a6d: -case 0x4a6e: -case 0x4a6f: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x81e8: -case 0x81e9: -case 0x81ea: -case 0x81eb: -case 0x81ec: -case 0x81ed: -case 0x81ee: -case 0x81ef: -case 0x83e8: -case 0x83e9: -case 0x83ea: -case 0x83eb: -case 0x83ec: -case 0x83ed: -case 0x83ee: -case 0x83ef: -case 0x85e8: -case 0x85e9: -case 0x85ea: -case 0x85eb: -case 0x85ec: -case 0x85ed: -case 0x85ee: -case 0x85ef: -case 0x87e8: -case 0x87e9: -case 0x87ea: -case 0x87eb: -case 0x87ec: -case 0x87ed: -case 0x87ee: -case 0x87ef: -case 0x89e8: -case 0x89e9: -case 0x89ea: -case 0x89eb: -case 0x89ec: -case 0x89ed: -case 0x89ee: -case 0x89ef: -case 0x8be8: -case 0x8be9: -case 0x8bea: -case 0x8beb: -case 0x8bec: -case 0x8bed: -case 0x8bee: -case 0x8bef: -case 0x8de8: -case 0x8de9: -case 0x8dea: -case 0x8deb: -case 0x8dec: -case 0x8ded: -case 0x8dee: -case 0x8def: -case 0x8fe8: -case 0x8fe9: -case 0x8fea: -case 0x8feb: -case 0x8fec: -case 0x8fed: -case 0x8fee: -case 0x8fef: - { - HAM src(this, instr_b2_b0); DIVS(src, instr_b11_b9); - } - break; - -case 0x80e8: -case 0x80e9: -case 0x80ea: -case 0x80eb: -case 0x80ec: -case 0x80ed: -case 0x80ee: -case 0x80ef: -case 0x82e8: -case 0x82e9: -case 0x82ea: -case 0x82eb: -case 0x82ec: -case 0x82ed: -case 0x82ee: -case 0x82ef: -case 0x84e8: -case 0x84e9: -case 0x84ea: -case 0x84eb: -case 0x84ec: -case 0x84ed: -case 0x84ee: -case 0x84ef: -case 0x86e8: -case 0x86e9: -case 0x86ea: -case 0x86eb: -case 0x86ec: -case 0x86ed: -case 0x86ee: -case 0x86ef: -case 0x88e8: -case 0x88e9: -case 0x88ea: -case 0x88eb: -case 0x88ec: -case 0x88ed: -case 0x88ee: -case 0x88ef: -case 0x8ae8: -case 0x8ae9: -case 0x8aea: -case 0x8aeb: -case 0x8aec: -case 0x8aed: -case 0x8aee: -case 0x8aef: -case 0x8ce8: -case 0x8ce9: -case 0x8cea: -case 0x8ceb: -case 0x8cec: -case 0x8ced: -case 0x8cee: -case 0x8cef: -case 0x8ee8: -case 0x8ee9: -case 0x8eea: -case 0x8eeb: -case 0x8eec: -case 0x8eed: -case 0x8eee: -case 0x8eef: - { - HAM src(this, instr_b2_b0); DIVU(src, instr_b11_b9); - } - break; - -case 0x33e8: -case 0x33e9: -case 0x33ea: -case 0x33eb: -case 0x33ec: -case 0x33ed: -case 0x33ee: -case 0x33ef: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31e8: -case 0x31e9: -case 0x31ea: -case 0x31eb: -case 0x31ec: -case 0x31ed: -case 0x31ee: -case 0x31ef: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x30a8: -case 0x30a9: -case 0x30aa: -case 0x30ab: -case 0x30ac: -case 0x30ad: -case 0x30ae: -case 0x30af: -case 0x32a8: -case 0x32a9: -case 0x32aa: -case 0x32ab: -case 0x32ac: -case 0x32ad: -case 0x32ae: -case 0x32af: -case 0x34a8: -case 0x34a9: -case 0x34aa: -case 0x34ab: -case 0x34ac: -case 0x34ad: -case 0x34ae: -case 0x34af: -case 0x36a8: -case 0x36a9: -case 0x36aa: -case 0x36ab: -case 0x36ac: -case 0x36ad: -case 0x36ae: -case 0x36af: -case 0x38a8: -case 0x38a9: -case 0x38aa: -case 0x38ab: -case 0x38ac: -case 0x38ad: -case 0x38ae: -case 0x38af: -case 0x3aa8: -case 0x3aa9: -case 0x3aaa: -case 0x3aab: -case 0x3aac: -case 0x3aad: -case 0x3aae: -case 0x3aaf: -case 0x3ca8: -case 0x3ca9: -case 0x3caa: -case 0x3cab: -case 0x3cac: -case 0x3cad: -case 0x3cae: -case 0x3caf: -case 0x3ea8: -case 0x3ea9: -case 0x3eaa: -case 0x3eab: -case 0x3eac: -case 0x3ead: -case 0x3eae: -case 0x3eaf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3168: -case 0x3169: -case 0x316a: -case 0x316b: -case 0x316c: -case 0x316d: -case 0x316e: -case 0x316f: -case 0x3368: -case 0x3369: -case 0x336a: -case 0x336b: -case 0x336c: -case 0x336d: -case 0x336e: -case 0x336f: -case 0x3568: -case 0x3569: -case 0x356a: -case 0x356b: -case 0x356c: -case 0x356d: -case 0x356e: -case 0x356f: -case 0x3768: -case 0x3769: -case 0x376a: -case 0x376b: -case 0x376c: -case 0x376d: -case 0x376e: -case 0x376f: -case 0x3968: -case 0x3969: -case 0x396a: -case 0x396b: -case 0x396c: -case 0x396d: -case 0x396e: -case 0x396f: -case 0x3b68: -case 0x3b69: -case 0x3b6a: -case 0x3b6b: -case 0x3b6c: -case 0x3b6d: -case 0x3b6e: -case 0x3b6f: -case 0x3d68: -case 0x3d69: -case 0x3d6a: -case 0x3d6b: -case 0x3d6c: -case 0x3d6d: -case 0x3d6e: -case 0x3d6f: -case 0x3f68: -case 0x3f69: -case 0x3f6a: -case 0x3f6b: -case 0x3f6c: -case 0x3f6d: -case 0x3f6e: -case 0x3f6f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x31a8: -case 0x31a9: -case 0x31aa: -case 0x31ab: -case 0x31ac: -case 0x31ad: -case 0x31ae: -case 0x31af: -case 0x33a8: -case 0x33a9: -case 0x33aa: -case 0x33ab: -case 0x33ac: -case 0x33ad: -case 0x33ae: -case 0x33af: -case 0x35a8: -case 0x35a9: -case 0x35aa: -case 0x35ab: -case 0x35ac: -case 0x35ad: -case 0x35ae: -case 0x35af: -case 0x37a8: -case 0x37a9: -case 0x37aa: -case 0x37ab: -case 0x37ac: -case 0x37ad: -case 0x37ae: -case 0x37af: -case 0x39a8: -case 0x39a9: -case 0x39aa: -case 0x39ab: -case 0x39ac: -case 0x39ad: -case 0x39ae: -case 0x39af: -case 0x3ba8: -case 0x3ba9: -case 0x3baa: -case 0x3bab: -case 0x3bac: -case 0x3bad: -case 0x3bae: -case 0x3baf: -case 0x3da8: -case 0x3da9: -case 0x3daa: -case 0x3dab: -case 0x3dac: -case 0x3dad: -case 0x3dae: -case 0x3daf: -case 0x3fa8: -case 0x3fa9: -case 0x3faa: -case 0x3fab: -case 0x3fac: -case 0x3fad: -case 0x3fae: -case 0x3faf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30e8: -case 0x30e9: -case 0x30ea: -case 0x30eb: -case 0x30ec: -case 0x30ed: -case 0x30ee: -case 0x30ef: -case 0x32e8: -case 0x32e9: -case 0x32ea: -case 0x32eb: -case 0x32ec: -case 0x32ed: -case 0x32ee: -case 0x32ef: -case 0x34e8: -case 0x34e9: -case 0x34ea: -case 0x34eb: -case 0x34ec: -case 0x34ed: -case 0x34ee: -case 0x34ef: -case 0x36e8: -case 0x36e9: -case 0x36ea: -case 0x36eb: -case 0x36ec: -case 0x36ed: -case 0x36ee: -case 0x36ef: -case 0x38e8: -case 0x38e9: -case 0x38ea: -case 0x38eb: -case 0x38ec: -case 0x38ed: -case 0x38ee: -case 0x38ef: -case 0x3ae8: -case 0x3ae9: -case 0x3aea: -case 0x3aeb: -case 0x3aec: -case 0x3aed: -case 0x3aee: -case 0x3aef: -case 0x3ce8: -case 0x3ce9: -case 0x3cea: -case 0x3ceb: -case 0x3cec: -case 0x3ced: -case 0x3cee: -case 0x3cef: -case 0x3ee8: -case 0x3ee9: -case 0x3eea: -case 0x3eeb: -case 0x3eec: -case 0x3eed: -case 0x3eee: -case 0x3eef: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3128: -case 0x3129: -case 0x312a: -case 0x312b: -case 0x312c: -case 0x312d: -case 0x312e: -case 0x312f: -case 0x3328: -case 0x3329: -case 0x332a: -case 0x332b: -case 0x332c: -case 0x332d: -case 0x332e: -case 0x332f: -case 0x3528: -case 0x3529: -case 0x352a: -case 0x352b: -case 0x352c: -case 0x352d: -case 0x352e: -case 0x352f: -case 0x3728: -case 0x3729: -case 0x372a: -case 0x372b: -case 0x372c: -case 0x372d: -case 0x372e: -case 0x372f: -case 0x3928: -case 0x3929: -case 0x392a: -case 0x392b: -case 0x392c: -case 0x392d: -case 0x392e: -case 0x392f: -case 0x3b28: -case 0x3b29: -case 0x3b2a: -case 0x3b2b: -case 0x3b2c: -case 0x3b2d: -case 0x3b2e: -case 0x3b2f: -case 0x3d28: -case 0x3d29: -case 0x3d2a: -case 0x3d2b: -case 0x3d2c: -case 0x3d2d: -case 0x3d2e: -case 0x3d2f: -case 0x3f28: -case 0x3f29: -case 0x3f2a: -case 0x3f2b: -case 0x3f2c: -case 0x3f2d: -case 0x3f2e: -case 0x3f2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd068: -case 0xd069: -case 0xd06a: -case 0xd06b: -case 0xd06c: -case 0xd06d: -case 0xd06e: -case 0xd06f: -case 0xd268: -case 0xd269: -case 0xd26a: -case 0xd26b: -case 0xd26c: -case 0xd26d: -case 0xd26e: -case 0xd26f: -case 0xd468: -case 0xd469: -case 0xd46a: -case 0xd46b: -case 0xd46c: -case 0xd46d: -case 0xd46e: -case 0xd46f: -case 0xd668: -case 0xd669: -case 0xd66a: -case 0xd66b: -case 0xd66c: -case 0xd66d: -case 0xd66e: -case 0xd66f: -case 0xd868: -case 0xd869: -case 0xd86a: -case 0xd86b: -case 0xd86c: -case 0xd86d: -case 0xd86e: -case 0xd86f: -case 0xda68: -case 0xda69: -case 0xda6a: -case 0xda6b: -case 0xda6c: -case 0xda6d: -case 0xda6e: -case 0xda6f: -case 0xdc68: -case 0xdc69: -case 0xdc6a: -case 0xdc6b: -case 0xdc6c: -case 0xdc6d: -case 0xdc6e: -case 0xdc6f: -case 0xde68: -case 0xde69: -case 0xde6a: -case 0xde6b: -case 0xde6c: -case 0xde6d: -case 0xde6e: -case 0xde6f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc068: -case 0xc069: -case 0xc06a: -case 0xc06b: -case 0xc06c: -case 0xc06d: -case 0xc06e: -case 0xc06f: -case 0xc268: -case 0xc269: -case 0xc26a: -case 0xc26b: -case 0xc26c: -case 0xc26d: -case 0xc26e: -case 0xc26f: -case 0xc468: -case 0xc469: -case 0xc46a: -case 0xc46b: -case 0xc46c: -case 0xc46d: -case 0xc46e: -case 0xc46f: -case 0xc668: -case 0xc669: -case 0xc66a: -case 0xc66b: -case 0xc66c: -case 0xc66d: -case 0xc66e: -case 0xc66f: -case 0xc868: -case 0xc869: -case 0xc86a: -case 0xc86b: -case 0xc86c: -case 0xc86d: -case 0xc86e: -case 0xc86f: -case 0xca68: -case 0xca69: -case 0xca6a: -case 0xca6b: -case 0xca6c: -case 0xca6d: -case 0xca6e: -case 0xca6f: -case 0xcc68: -case 0xcc69: -case 0xcc6a: -case 0xcc6b: -case 0xcc6c: -case 0xcc6d: -case 0xcc6e: -case 0xcc6f: -case 0xce68: -case 0xce69: -case 0xce6a: -case 0xce6b: -case 0xce6c: -case 0xce6d: -case 0xce6e: -case 0xce6f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x41a8: -case 0x41a9: -case 0x41aa: -case 0x41ab: -case 0x41ac: -case 0x41ad: -case 0x41ae: -case 0x41af: -case 0x43a8: -case 0x43a9: -case 0x43aa: -case 0x43ab: -case 0x43ac: -case 0x43ad: -case 0x43ae: -case 0x43af: -case 0x45a8: -case 0x45a9: -case 0x45aa: -case 0x45ab: -case 0x45ac: -case 0x45ad: -case 0x45ae: -case 0x45af: -case 0x47a8: -case 0x47a9: -case 0x47aa: -case 0x47ab: -case 0x47ac: -case 0x47ad: -case 0x47ae: -case 0x47af: -case 0x49a8: -case 0x49a9: -case 0x49aa: -case 0x49ab: -case 0x49ac: -case 0x49ad: -case 0x49ae: -case 0x49af: -case 0x4ba8: -case 0x4ba9: -case 0x4baa: -case 0x4bab: -case 0x4bac: -case 0x4bad: -case 0x4bae: -case 0x4baf: -case 0x4da8: -case 0x4da9: -case 0x4daa: -case 0x4dab: -case 0x4dac: -case 0x4dad: -case 0x4dae: -case 0x4daf: -case 0x4fa8: -case 0x4fa9: -case 0x4faa: -case 0x4fab: -case 0x4fac: -case 0x4fad: -case 0x4fae: -case 0x4faf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb068: -case 0xb069: -case 0xb06a: -case 0xb06b: -case 0xb06c: -case 0xb06d: -case 0xb06e: -case 0xb06f: -case 0xb268: -case 0xb269: -case 0xb26a: -case 0xb26b: -case 0xb26c: -case 0xb26d: -case 0xb26e: -case 0xb26f: -case 0xb468: -case 0xb469: -case 0xb46a: -case 0xb46b: -case 0xb46c: -case 0xb46d: -case 0xb46e: -case 0xb46f: -case 0xb668: -case 0xb669: -case 0xb66a: -case 0xb66b: -case 0xb66c: -case 0xb66d: -case 0xb66e: -case 0xb66f: -case 0xb868: -case 0xb869: -case 0xb86a: -case 0xb86b: -case 0xb86c: -case 0xb86d: -case 0xb86e: -case 0xb86f: -case 0xba68: -case 0xba69: -case 0xba6a: -case 0xba6b: -case 0xba6c: -case 0xba6d: -case 0xba6e: -case 0xba6f: -case 0xbc68: -case 0xbc69: -case 0xbc6a: -case 0xbc6b: -case 0xbc6c: -case 0xbc6d: -case 0xbc6e: -case 0xbc6f: -case 0xbe68: -case 0xbe69: -case 0xbe6a: -case 0xbe6b: -case 0xbe6c: -case 0xbe6d: -case 0xbe6e: -case 0xbe6f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x3028: -case 0x3029: -case 0x302a: -case 0x302b: -case 0x302c: -case 0x302d: -case 0x302e: -case 0x302f: -case 0x3228: -case 0x3229: -case 0x322a: -case 0x322b: -case 0x322c: -case 0x322d: -case 0x322e: -case 0x322f: -case 0x3428: -case 0x3429: -case 0x342a: -case 0x342b: -case 0x342c: -case 0x342d: -case 0x342e: -case 0x342f: -case 0x3628: -case 0x3629: -case 0x362a: -case 0x362b: -case 0x362c: -case 0x362d: -case 0x362e: -case 0x362f: -case 0x3828: -case 0x3829: -case 0x382a: -case 0x382b: -case 0x382c: -case 0x382d: -case 0x382e: -case 0x382f: -case 0x3a28: -case 0x3a29: -case 0x3a2a: -case 0x3a2b: -case 0x3a2c: -case 0x3a2d: -case 0x3a2e: -case 0x3a2f: -case 0x3c28: -case 0x3c29: -case 0x3c2a: -case 0x3c2b: -case 0x3c2c: -case 0x3c2d: -case 0x3c2e: -case 0x3c2f: -case 0x3e28: -case 0x3e29: -case 0x3e2a: -case 0x3e2b: -case 0x3e2c: -case 0x3e2d: -case 0x3e2e: -case 0x3e2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8068: -case 0x8069: -case 0x806a: -case 0x806b: -case 0x806c: -case 0x806d: -case 0x806e: -case 0x806f: -case 0x8268: -case 0x8269: -case 0x826a: -case 0x826b: -case 0x826c: -case 0x826d: -case 0x826e: -case 0x826f: -case 0x8468: -case 0x8469: -case 0x846a: -case 0x846b: -case 0x846c: -case 0x846d: -case 0x846e: -case 0x846f: -case 0x8668: -case 0x8669: -case 0x866a: -case 0x866b: -case 0x866c: -case 0x866d: -case 0x866e: -case 0x866f: -case 0x8868: -case 0x8869: -case 0x886a: -case 0x886b: -case 0x886c: -case 0x886d: -case 0x886e: -case 0x886f: -case 0x8a68: -case 0x8a69: -case 0x8a6a: -case 0x8a6b: -case 0x8a6c: -case 0x8a6d: -case 0x8a6e: -case 0x8a6f: -case 0x8c68: -case 0x8c69: -case 0x8c6a: -case 0x8c6b: -case 0x8c6c: -case 0x8c6d: -case 0x8c6e: -case 0x8c6f: -case 0x8e68: -case 0x8e69: -case 0x8e6a: -case 0x8e6b: -case 0x8e6c: -case 0x8e6d: -case 0x8e6e: -case 0x8e6f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9068: -case 0x9069: -case 0x906a: -case 0x906b: -case 0x906c: -case 0x906d: -case 0x906e: -case 0x906f: -case 0x9268: -case 0x9269: -case 0x926a: -case 0x926b: -case 0x926c: -case 0x926d: -case 0x926e: -case 0x926f: -case 0x9468: -case 0x9469: -case 0x946a: -case 0x946b: -case 0x946c: -case 0x946d: -case 0x946e: -case 0x946f: -case 0x9668: -case 0x9669: -case 0x966a: -case 0x966b: -case 0x966c: -case 0x966d: -case 0x966e: -case 0x966f: -case 0x9868: -case 0x9869: -case 0x986a: -case 0x986b: -case 0x986c: -case 0x986d: -case 0x986e: -case 0x986f: -case 0x9a68: -case 0x9a69: -case 0x9a6a: -case 0x9a6b: -case 0x9a6c: -case 0x9a6d: -case 0x9a6e: -case 0x9a6f: -case 0x9c68: -case 0x9c69: -case 0x9c6a: -case 0x9c6b: -case 0x9c6c: -case 0x9c6d: -case 0x9c6e: -case 0x9c6f: -case 0x9e68: -case 0x9e69: -case 0x9e6a: -case 0x9e6b: -case 0x9e6c: -case 0x9e6d: -case 0x9e6e: -case 0x9e6f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0e8: -case 0xd0e9: -case 0xd0ea: -case 0xd0eb: -case 0xd0ec: -case 0xd0ed: -case 0xd0ee: -case 0xd0ef: -case 0xd2e8: -case 0xd2e9: -case 0xd2ea: -case 0xd2eb: -case 0xd2ec: -case 0xd2ed: -case 0xd2ee: -case 0xd2ef: -case 0xd4e8: -case 0xd4e9: -case 0xd4ea: -case 0xd4eb: -case 0xd4ec: -case 0xd4ed: -case 0xd4ee: -case 0xd4ef: -case 0xd6e8: -case 0xd6e9: -case 0xd6ea: -case 0xd6eb: -case 0xd6ec: -case 0xd6ed: -case 0xd6ee: -case 0xd6ef: -case 0xd8e8: -case 0xd8e9: -case 0xd8ea: -case 0xd8eb: -case 0xd8ec: -case 0xd8ed: -case 0xd8ee: -case 0xd8ef: -case 0xdae8: -case 0xdae9: -case 0xdaea: -case 0xdaeb: -case 0xdaec: -case 0xdaed: -case 0xdaee: -case 0xdaef: -case 0xdce8: -case 0xdce9: -case 0xdcea: -case 0xdceb: -case 0xdcec: -case 0xdced: -case 0xdcee: -case 0xdcef: -case 0xdee8: -case 0xdee9: -case 0xdeea: -case 0xdeeb: -case 0xdeec: -case 0xdeed: -case 0xdeee: -case 0xdeef: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0e8: -case 0xb0e9: -case 0xb0ea: -case 0xb0eb: -case 0xb0ec: -case 0xb0ed: -case 0xb0ee: -case 0xb0ef: -case 0xb2e8: -case 0xb2e9: -case 0xb2ea: -case 0xb2eb: -case 0xb2ec: -case 0xb2ed: -case 0xb2ee: -case 0xb2ef: -case 0xb4e8: -case 0xb4e9: -case 0xb4ea: -case 0xb4eb: -case 0xb4ec: -case 0xb4ed: -case 0xb4ee: -case 0xb4ef: -case 0xb6e8: -case 0xb6e9: -case 0xb6ea: -case 0xb6eb: -case 0xb6ec: -case 0xb6ed: -case 0xb6ee: -case 0xb6ef: -case 0xb8e8: -case 0xb8e9: -case 0xb8ea: -case 0xb8eb: -case 0xb8ec: -case 0xb8ed: -case 0xb8ee: -case 0xb8ef: -case 0xbae8: -case 0xbae9: -case 0xbaea: -case 0xbaeb: -case 0xbaec: -case 0xbaed: -case 0xbaee: -case 0xbaef: -case 0xbce8: -case 0xbce9: -case 0xbcea: -case 0xbceb: -case 0xbcec: -case 0xbced: -case 0xbcee: -case 0xbcef: -case 0xbee8: -case 0xbee9: -case 0xbeea: -case 0xbeeb: -case 0xbeec: -case 0xbeed: -case 0xbeee: -case 0xbeef: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90e8: -case 0x90e9: -case 0x90ea: -case 0x90eb: -case 0x90ec: -case 0x90ed: -case 0x90ee: -case 0x90ef: -case 0x92e8: -case 0x92e9: -case 0x92ea: -case 0x92eb: -case 0x92ec: -case 0x92ed: -case 0x92ee: -case 0x92ef: -case 0x94e8: -case 0x94e9: -case 0x94ea: -case 0x94eb: -case 0x94ec: -case 0x94ed: -case 0x94ee: -case 0x94ef: -case 0x96e8: -case 0x96e9: -case 0x96ea: -case 0x96eb: -case 0x96ec: -case 0x96ed: -case 0x96ee: -case 0x96ef: -case 0x98e8: -case 0x98e9: -case 0x98ea: -case 0x98eb: -case 0x98ec: -case 0x98ed: -case 0x98ee: -case 0x98ef: -case 0x9ae8: -case 0x9ae9: -case 0x9aea: -case 0x9aeb: -case 0x9aec: -case 0x9aed: -case 0x9aee: -case 0x9aef: -case 0x9ce8: -case 0x9ce9: -case 0x9cea: -case 0x9ceb: -case 0x9cec: -case 0x9ced: -case 0x9cee: -case 0x9cef: -case 0x9ee8: -case 0x9ee9: -case 0x9eea: -case 0x9eeb: -case 0x9eec: -case 0x9eed: -case 0x9eee: -case 0x9eef: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x3068: -case 0x3069: -case 0x306a: -case 0x306b: -case 0x306c: -case 0x306d: -case 0x306e: -case 0x306f: -case 0x3268: -case 0x3269: -case 0x326a: -case 0x326b: -case 0x326c: -case 0x326d: -case 0x326e: -case 0x326f: -case 0x3468: -case 0x3469: -case 0x346a: -case 0x346b: -case 0x346c: -case 0x346d: -case 0x346e: -case 0x346f: -case 0x3668: -case 0x3669: -case 0x366a: -case 0x366b: -case 0x366c: -case 0x366d: -case 0x366e: -case 0x366f: -case 0x3868: -case 0x3869: -case 0x386a: -case 0x386b: -case 0x386c: -case 0x386d: -case 0x386e: -case 0x386f: -case 0x3a68: -case 0x3a69: -case 0x3a6a: -case 0x3a6b: -case 0x3a6c: -case 0x3a6d: -case 0x3a6e: -case 0x3a6f: -case 0x3c68: -case 0x3c69: -case 0x3c6a: -case 0x3c6b: -case 0x3c6c: -case 0x3c6d: -case 0x3c6e: -case 0x3c6f: -case 0x3e68: -case 0x3e69: -case 0x3e6a: -case 0x3e6b: -case 0x3e6c: -case 0x3e6d: -case 0x3e6e: -case 0x3e6f: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44e8: -case 0x44e9: -case 0x44ea: -case 0x44eb: -case 0x44ec: -case 0x44ed: -case 0x44ee: -case 0x44ef: - { - HAM src(this, instr_b2_b0); MOVE_to_CCR(src); - } - break; - -case 0xc1e8: -case 0xc1e9: -case 0xc1ea: -case 0xc1eb: -case 0xc1ec: -case 0xc1ed: -case 0xc1ee: -case 0xc1ef: -case 0xc3e8: -case 0xc3e9: -case 0xc3ea: -case 0xc3eb: -case 0xc3ec: -case 0xc3ed: -case 0xc3ee: -case 0xc3ef: -case 0xc5e8: -case 0xc5e9: -case 0xc5ea: -case 0xc5eb: -case 0xc5ec: -case 0xc5ed: -case 0xc5ee: -case 0xc5ef: -case 0xc7e8: -case 0xc7e9: -case 0xc7ea: -case 0xc7eb: -case 0xc7ec: -case 0xc7ed: -case 0xc7ee: -case 0xc7ef: -case 0xc9e8: -case 0xc9e9: -case 0xc9ea: -case 0xc9eb: -case 0xc9ec: -case 0xc9ed: -case 0xc9ee: -case 0xc9ef: -case 0xcbe8: -case 0xcbe9: -case 0xcbea: -case 0xcbeb: -case 0xcbec: -case 0xcbed: -case 0xcbee: -case 0xcbef: -case 0xcde8: -case 0xcde9: -case 0xcdea: -case 0xcdeb: -case 0xcdec: -case 0xcded: -case 0xcdee: -case 0xcdef: -case 0xcfe8: -case 0xcfe9: -case 0xcfea: -case 0xcfeb: -case 0xcfec: -case 0xcfed: -case 0xcfee: -case 0xcfef: - { - HAM src(this, instr_b2_b0); MULS(src, instr_b11_b9); - } - break; - -case 0xc0e8: -case 0xc0e9: -case 0xc0ea: -case 0xc0eb: -case 0xc0ec: -case 0xc0ed: -case 0xc0ee: -case 0xc0ef: -case 0xc2e8: -case 0xc2e9: -case 0xc2ea: -case 0xc2eb: -case 0xc2ec: -case 0xc2ed: -case 0xc2ee: -case 0xc2ef: -case 0xc4e8: -case 0xc4e9: -case 0xc4ea: -case 0xc4eb: -case 0xc4ec: -case 0xc4ed: -case 0xc4ee: -case 0xc4ef: -case 0xc6e8: -case 0xc6e9: -case 0xc6ea: -case 0xc6eb: -case 0xc6ec: -case 0xc6ed: -case 0xc6ee: -case 0xc6ef: -case 0xc8e8: -case 0xc8e9: -case 0xc8ea: -case 0xc8eb: -case 0xc8ec: -case 0xc8ed: -case 0xc8ee: -case 0xc8ef: -case 0xcae8: -case 0xcae9: -case 0xcaea: -case 0xcaeb: -case 0xcaec: -case 0xcaed: -case 0xcaee: -case 0xcaef: -case 0xcce8: -case 0xcce9: -case 0xccea: -case 0xcceb: -case 0xccec: -case 0xcced: -case 0xccee: -case 0xccef: -case 0xcee8: -case 0xcee9: -case 0xceea: -case 0xceeb: -case 0xceec: -case 0xceed: -case 0xceee: -case 0xceef: - { - HAM src(this, instr_b2_b0); MULU(src, instr_b11_b9); - } - break; - -case 0xe1e8: -case 0xe1e9: -case 0xe1ea: -case 0xe1eb: -case 0xe1ec: -case 0xe1ed: -case 0xe1ee: -case 0xe1ef: - { - HAM targ(this, instr_b2_b0); ASL(targ, 1); - } - break; - -case 0xe0e8: -case 0xe0e9: -case 0xe0ea: -case 0xe0eb: -case 0xe0ec: -case 0xe0ed: -case 0xe0ee: -case 0xe0ef: - { - HAM targ(this, instr_b2_b0); ASR(targ, 1); - } - break; - -case 0xe3e8: -case 0xe3e9: -case 0xe3ea: -case 0xe3eb: -case 0xe3ec: -case 0xe3ed: -case 0xe3ee: -case 0xe3ef: - { - HAM targ(this, instr_b2_b0); LSL(targ, 1); - } - break; - -case 0xe2e8: -case 0xe2e9: -case 0xe2ea: -case 0xe2eb: -case 0xe2ec: -case 0xe2ed: -case 0xe2ee: -case 0xe2ef: - { - HAM targ(this, instr_b2_b0); LSR(targ, 1); - } - break; - -case 0xe7e8: -case 0xe7e9: -case 0xe7ea: -case 0xe7eb: -case 0xe7ec: -case 0xe7ed: -case 0xe7ee: -case 0xe7ef: - { - HAM targ(this, instr_b2_b0); ROL(targ, 1); - } - break; - -case 0xe6e8: -case 0xe6e9: -case 0xe6ea: -case 0xe6eb: -case 0xe6ec: -case 0xe6ed: -case 0xe6ee: -case 0xe6ef: - { - HAM targ(this, instr_b2_b0); ROR(targ, 1); - } - break; - -case 0xe5e8: -case 0xe5e9: -case 0xe5ea: -case 0xe5eb: -case 0xe5ec: -case 0xe5ed: -case 0xe5ee: -case 0xe5ef: - { - HAM targ(this, instr_b2_b0); ROXL(targ, 1); - } - break; - -case 0xe4e8: -case 0xe4e9: -case 0xe4ea: -case 0xe4eb: -case 0xe4ec: -case 0xe4ed: -case 0xe4ee: -case 0xe4ef: - { - HAM targ(this, instr_b2_b0); ROXR(targ, 1); - } - break; - -case 0x4270: -case 0x4271: -case 0x4272: -case 0x4273: -case 0x4274: -case 0x4275: -case 0x4276: -case 0x4277: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4470: -case 0x4471: -case 0x4472: -case 0x4473: -case 0x4474: -case 0x4475: -case 0x4476: -case 0x4477: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4070: -case 0x4071: -case 0x4072: -case 0x4073: -case 0x4074: -case 0x4075: -case 0x4076: -case 0x4077: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4670: -case 0x4671: -case 0x4672: -case 0x4673: -case 0x4674: -case 0x4675: -case 0x4676: -case 0x4677: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4a70: -case 0x4a71: -case 0x4a72: -case 0x4a73: -case 0x4a74: -case 0x4a75: -case 0x4a76: -case 0x4a77: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x81f0: -case 0x81f1: -case 0x81f2: -case 0x81f3: -case 0x81f4: -case 0x81f5: -case 0x81f6: -case 0x81f7: -case 0x83f0: -case 0x83f1: -case 0x83f2: -case 0x83f3: -case 0x83f4: -case 0x83f5: -case 0x83f6: -case 0x83f7: -case 0x85f0: -case 0x85f1: -case 0x85f2: -case 0x85f3: -case 0x85f4: -case 0x85f5: -case 0x85f6: -case 0x85f7: -case 0x87f0: -case 0x87f1: -case 0x87f2: -case 0x87f3: -case 0x87f4: -case 0x87f5: -case 0x87f6: -case 0x87f7: -case 0x89f0: -case 0x89f1: -case 0x89f2: -case 0x89f3: -case 0x89f4: -case 0x89f5: -case 0x89f6: -case 0x89f7: -case 0x8bf0: -case 0x8bf1: -case 0x8bf2: -case 0x8bf3: -case 0x8bf4: -case 0x8bf5: -case 0x8bf6: -case 0x8bf7: -case 0x8df0: -case 0x8df1: -case 0x8df2: -case 0x8df3: -case 0x8df4: -case 0x8df5: -case 0x8df6: -case 0x8df7: -case 0x8ff0: -case 0x8ff1: -case 0x8ff2: -case 0x8ff3: -case 0x8ff4: -case 0x8ff5: -case 0x8ff6: -case 0x8ff7: - { - HAM src(this, instr_b2_b0); DIVS(src, instr_b11_b9); - } - break; - -case 0x80f0: -case 0x80f1: -case 0x80f2: -case 0x80f3: -case 0x80f4: -case 0x80f5: -case 0x80f6: -case 0x80f7: -case 0x82f0: -case 0x82f1: -case 0x82f2: -case 0x82f3: -case 0x82f4: -case 0x82f5: -case 0x82f6: -case 0x82f7: -case 0x84f0: -case 0x84f1: -case 0x84f2: -case 0x84f3: -case 0x84f4: -case 0x84f5: -case 0x84f6: -case 0x84f7: -case 0x86f0: -case 0x86f1: -case 0x86f2: -case 0x86f3: -case 0x86f4: -case 0x86f5: -case 0x86f6: -case 0x86f7: -case 0x88f0: -case 0x88f1: -case 0x88f2: -case 0x88f3: -case 0x88f4: -case 0x88f5: -case 0x88f6: -case 0x88f7: -case 0x8af0: -case 0x8af1: -case 0x8af2: -case 0x8af3: -case 0x8af4: -case 0x8af5: -case 0x8af6: -case 0x8af7: -case 0x8cf0: -case 0x8cf1: -case 0x8cf2: -case 0x8cf3: -case 0x8cf4: -case 0x8cf5: -case 0x8cf6: -case 0x8cf7: -case 0x8ef0: -case 0x8ef1: -case 0x8ef2: -case 0x8ef3: -case 0x8ef4: -case 0x8ef5: -case 0x8ef6: -case 0x8ef7: - { - HAM src(this, instr_b2_b0); DIVU(src, instr_b11_b9); - } - break; - -case 0x33f0: -case 0x33f1: -case 0x33f2: -case 0x33f3: -case 0x33f4: -case 0x33f5: -case 0x33f6: -case 0x33f7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31f0: -case 0x31f1: -case 0x31f2: -case 0x31f3: -case 0x31f4: -case 0x31f5: -case 0x31f6: -case 0x31f7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x30b0: -case 0x30b1: -case 0x30b2: -case 0x30b3: -case 0x30b4: -case 0x30b5: -case 0x30b6: -case 0x30b7: -case 0x32b0: -case 0x32b1: -case 0x32b2: -case 0x32b3: -case 0x32b4: -case 0x32b5: -case 0x32b6: -case 0x32b7: -case 0x34b0: -case 0x34b1: -case 0x34b2: -case 0x34b3: -case 0x34b4: -case 0x34b5: -case 0x34b6: -case 0x34b7: -case 0x36b0: -case 0x36b1: -case 0x36b2: -case 0x36b3: -case 0x36b4: -case 0x36b5: -case 0x36b6: -case 0x36b7: -case 0x38b0: -case 0x38b1: -case 0x38b2: -case 0x38b3: -case 0x38b4: -case 0x38b5: -case 0x38b6: -case 0x38b7: -case 0x3ab0: -case 0x3ab1: -case 0x3ab2: -case 0x3ab3: -case 0x3ab4: -case 0x3ab5: -case 0x3ab6: -case 0x3ab7: -case 0x3cb0: -case 0x3cb1: -case 0x3cb2: -case 0x3cb3: -case 0x3cb4: -case 0x3cb5: -case 0x3cb6: -case 0x3cb7: -case 0x3eb0: -case 0x3eb1: -case 0x3eb2: -case 0x3eb3: -case 0x3eb4: -case 0x3eb5: -case 0x3eb6: -case 0x3eb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3170: -case 0x3171: -case 0x3172: -case 0x3173: -case 0x3174: -case 0x3175: -case 0x3176: -case 0x3177: -case 0x3370: -case 0x3371: -case 0x3372: -case 0x3373: -case 0x3374: -case 0x3375: -case 0x3376: -case 0x3377: -case 0x3570: -case 0x3571: -case 0x3572: -case 0x3573: -case 0x3574: -case 0x3575: -case 0x3576: -case 0x3577: -case 0x3770: -case 0x3771: -case 0x3772: -case 0x3773: -case 0x3774: -case 0x3775: -case 0x3776: -case 0x3777: -case 0x3970: -case 0x3971: -case 0x3972: -case 0x3973: -case 0x3974: -case 0x3975: -case 0x3976: -case 0x3977: -case 0x3b70: -case 0x3b71: -case 0x3b72: -case 0x3b73: -case 0x3b74: -case 0x3b75: -case 0x3b76: -case 0x3b77: -case 0x3d70: -case 0x3d71: -case 0x3d72: -case 0x3d73: -case 0x3d74: -case 0x3d75: -case 0x3d76: -case 0x3d77: -case 0x3f70: -case 0x3f71: -case 0x3f72: -case 0x3f73: -case 0x3f74: -case 0x3f75: -case 0x3f76: -case 0x3f77: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x31b0: -case 0x31b1: -case 0x31b2: -case 0x31b3: -case 0x31b4: -case 0x31b5: -case 0x31b6: -case 0x31b7: -case 0x33b0: -case 0x33b1: -case 0x33b2: -case 0x33b3: -case 0x33b4: -case 0x33b5: -case 0x33b6: -case 0x33b7: -case 0x35b0: -case 0x35b1: -case 0x35b2: -case 0x35b3: -case 0x35b4: -case 0x35b5: -case 0x35b6: -case 0x35b7: -case 0x37b0: -case 0x37b1: -case 0x37b2: -case 0x37b3: -case 0x37b4: -case 0x37b5: -case 0x37b6: -case 0x37b7: -case 0x39b0: -case 0x39b1: -case 0x39b2: -case 0x39b3: -case 0x39b4: -case 0x39b5: -case 0x39b6: -case 0x39b7: -case 0x3bb0: -case 0x3bb1: -case 0x3bb2: -case 0x3bb3: -case 0x3bb4: -case 0x3bb5: -case 0x3bb6: -case 0x3bb7: -case 0x3db0: -case 0x3db1: -case 0x3db2: -case 0x3db3: -case 0x3db4: -case 0x3db5: -case 0x3db6: -case 0x3db7: -case 0x3fb0: -case 0x3fb1: -case 0x3fb2: -case 0x3fb3: -case 0x3fb4: -case 0x3fb5: -case 0x3fb6: -case 0x3fb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30f0: -case 0x30f1: -case 0x30f2: -case 0x30f3: -case 0x30f4: -case 0x30f5: -case 0x30f6: -case 0x30f7: -case 0x32f0: -case 0x32f1: -case 0x32f2: -case 0x32f3: -case 0x32f4: -case 0x32f5: -case 0x32f6: -case 0x32f7: -case 0x34f0: -case 0x34f1: -case 0x34f2: -case 0x34f3: -case 0x34f4: -case 0x34f5: -case 0x34f6: -case 0x34f7: -case 0x36f0: -case 0x36f1: -case 0x36f2: -case 0x36f3: -case 0x36f4: -case 0x36f5: -case 0x36f6: -case 0x36f7: -case 0x38f0: -case 0x38f1: -case 0x38f2: -case 0x38f3: -case 0x38f4: -case 0x38f5: -case 0x38f6: -case 0x38f7: -case 0x3af0: -case 0x3af1: -case 0x3af2: -case 0x3af3: -case 0x3af4: -case 0x3af5: -case 0x3af6: -case 0x3af7: -case 0x3cf0: -case 0x3cf1: -case 0x3cf2: -case 0x3cf3: -case 0x3cf4: -case 0x3cf5: -case 0x3cf6: -case 0x3cf7: -case 0x3ef0: -case 0x3ef1: -case 0x3ef2: -case 0x3ef3: -case 0x3ef4: -case 0x3ef5: -case 0x3ef6: -case 0x3ef7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3130: -case 0x3131: -case 0x3132: -case 0x3133: -case 0x3134: -case 0x3135: -case 0x3136: -case 0x3137: -case 0x3330: -case 0x3331: -case 0x3332: -case 0x3333: -case 0x3334: -case 0x3335: -case 0x3336: -case 0x3337: -case 0x3530: -case 0x3531: -case 0x3532: -case 0x3533: -case 0x3534: -case 0x3535: -case 0x3536: -case 0x3537: -case 0x3730: -case 0x3731: -case 0x3732: -case 0x3733: -case 0x3734: -case 0x3735: -case 0x3736: -case 0x3737: -case 0x3930: -case 0x3931: -case 0x3932: -case 0x3933: -case 0x3934: -case 0x3935: -case 0x3936: -case 0x3937: -case 0x3b30: -case 0x3b31: -case 0x3b32: -case 0x3b33: -case 0x3b34: -case 0x3b35: -case 0x3b36: -case 0x3b37: -case 0x3d30: -case 0x3d31: -case 0x3d32: -case 0x3d33: -case 0x3d34: -case 0x3d35: -case 0x3d36: -case 0x3d37: -case 0x3f30: -case 0x3f31: -case 0x3f32: -case 0x3f33: -case 0x3f34: -case 0x3f35: -case 0x3f36: -case 0x3f37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd070: -case 0xd071: -case 0xd072: -case 0xd073: -case 0xd074: -case 0xd075: -case 0xd076: -case 0xd077: -case 0xd270: -case 0xd271: -case 0xd272: -case 0xd273: -case 0xd274: -case 0xd275: -case 0xd276: -case 0xd277: -case 0xd470: -case 0xd471: -case 0xd472: -case 0xd473: -case 0xd474: -case 0xd475: -case 0xd476: -case 0xd477: -case 0xd670: -case 0xd671: -case 0xd672: -case 0xd673: -case 0xd674: -case 0xd675: -case 0xd676: -case 0xd677: -case 0xd870: -case 0xd871: -case 0xd872: -case 0xd873: -case 0xd874: -case 0xd875: -case 0xd876: -case 0xd877: -case 0xda70: -case 0xda71: -case 0xda72: -case 0xda73: -case 0xda74: -case 0xda75: -case 0xda76: -case 0xda77: -case 0xdc70: -case 0xdc71: -case 0xdc72: -case 0xdc73: -case 0xdc74: -case 0xdc75: -case 0xdc76: -case 0xdc77: -case 0xde70: -case 0xde71: -case 0xde72: -case 0xde73: -case 0xde74: -case 0xde75: -case 0xde76: -case 0xde77: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc070: -case 0xc071: -case 0xc072: -case 0xc073: -case 0xc074: -case 0xc075: -case 0xc076: -case 0xc077: -case 0xc270: -case 0xc271: -case 0xc272: -case 0xc273: -case 0xc274: -case 0xc275: -case 0xc276: -case 0xc277: -case 0xc470: -case 0xc471: -case 0xc472: -case 0xc473: -case 0xc474: -case 0xc475: -case 0xc476: -case 0xc477: -case 0xc670: -case 0xc671: -case 0xc672: -case 0xc673: -case 0xc674: -case 0xc675: -case 0xc676: -case 0xc677: -case 0xc870: -case 0xc871: -case 0xc872: -case 0xc873: -case 0xc874: -case 0xc875: -case 0xc876: -case 0xc877: -case 0xca70: -case 0xca71: -case 0xca72: -case 0xca73: -case 0xca74: -case 0xca75: -case 0xca76: -case 0xca77: -case 0xcc70: -case 0xcc71: -case 0xcc72: -case 0xcc73: -case 0xcc74: -case 0xcc75: -case 0xcc76: -case 0xcc77: -case 0xce70: -case 0xce71: -case 0xce72: -case 0xce73: -case 0xce74: -case 0xce75: -case 0xce76: -case 0xce77: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x41b0: -case 0x41b1: -case 0x41b2: -case 0x41b3: -case 0x41b4: -case 0x41b5: -case 0x41b6: -case 0x41b7: -case 0x43b0: -case 0x43b1: -case 0x43b2: -case 0x43b3: -case 0x43b4: -case 0x43b5: -case 0x43b6: -case 0x43b7: -case 0x45b0: -case 0x45b1: -case 0x45b2: -case 0x45b3: -case 0x45b4: -case 0x45b5: -case 0x45b6: -case 0x45b7: -case 0x47b0: -case 0x47b1: -case 0x47b2: -case 0x47b3: -case 0x47b4: -case 0x47b5: -case 0x47b6: -case 0x47b7: -case 0x49b0: -case 0x49b1: -case 0x49b2: -case 0x49b3: -case 0x49b4: -case 0x49b5: -case 0x49b6: -case 0x49b7: -case 0x4bb0: -case 0x4bb1: -case 0x4bb2: -case 0x4bb3: -case 0x4bb4: -case 0x4bb5: -case 0x4bb6: -case 0x4bb7: -case 0x4db0: -case 0x4db1: -case 0x4db2: -case 0x4db3: -case 0x4db4: -case 0x4db5: -case 0x4db6: -case 0x4db7: -case 0x4fb0: -case 0x4fb1: -case 0x4fb2: -case 0x4fb3: -case 0x4fb4: -case 0x4fb5: -case 0x4fb6: -case 0x4fb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb070: -case 0xb071: -case 0xb072: -case 0xb073: -case 0xb074: -case 0xb075: -case 0xb076: -case 0xb077: -case 0xb270: -case 0xb271: -case 0xb272: -case 0xb273: -case 0xb274: -case 0xb275: -case 0xb276: -case 0xb277: -case 0xb470: -case 0xb471: -case 0xb472: -case 0xb473: -case 0xb474: -case 0xb475: -case 0xb476: -case 0xb477: -case 0xb670: -case 0xb671: -case 0xb672: -case 0xb673: -case 0xb674: -case 0xb675: -case 0xb676: -case 0xb677: -case 0xb870: -case 0xb871: -case 0xb872: -case 0xb873: -case 0xb874: -case 0xb875: -case 0xb876: -case 0xb877: -case 0xba70: -case 0xba71: -case 0xba72: -case 0xba73: -case 0xba74: -case 0xba75: -case 0xba76: -case 0xba77: -case 0xbc70: -case 0xbc71: -case 0xbc72: -case 0xbc73: -case 0xbc74: -case 0xbc75: -case 0xbc76: -case 0xbc77: -case 0xbe70: -case 0xbe71: -case 0xbe72: -case 0xbe73: -case 0xbe74: -case 0xbe75: -case 0xbe76: -case 0xbe77: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x3030: -case 0x3031: -case 0x3032: -case 0x3033: -case 0x3034: -case 0x3035: -case 0x3036: -case 0x3037: -case 0x3230: -case 0x3231: -case 0x3232: -case 0x3233: -case 0x3234: -case 0x3235: -case 0x3236: -case 0x3237: -case 0x3430: -case 0x3431: -case 0x3432: -case 0x3433: -case 0x3434: -case 0x3435: -case 0x3436: -case 0x3437: -case 0x3630: -case 0x3631: -case 0x3632: -case 0x3633: -case 0x3634: -case 0x3635: -case 0x3636: -case 0x3637: -case 0x3830: -case 0x3831: -case 0x3832: -case 0x3833: -case 0x3834: -case 0x3835: -case 0x3836: -case 0x3837: -case 0x3a30: -case 0x3a31: -case 0x3a32: -case 0x3a33: -case 0x3a34: -case 0x3a35: -case 0x3a36: -case 0x3a37: -case 0x3c30: -case 0x3c31: -case 0x3c32: -case 0x3c33: -case 0x3c34: -case 0x3c35: -case 0x3c36: -case 0x3c37: -case 0x3e30: -case 0x3e31: -case 0x3e32: -case 0x3e33: -case 0x3e34: -case 0x3e35: -case 0x3e36: -case 0x3e37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8070: -case 0x8071: -case 0x8072: -case 0x8073: -case 0x8074: -case 0x8075: -case 0x8076: -case 0x8077: -case 0x8270: -case 0x8271: -case 0x8272: -case 0x8273: -case 0x8274: -case 0x8275: -case 0x8276: -case 0x8277: -case 0x8470: -case 0x8471: -case 0x8472: -case 0x8473: -case 0x8474: -case 0x8475: -case 0x8476: -case 0x8477: -case 0x8670: -case 0x8671: -case 0x8672: -case 0x8673: -case 0x8674: -case 0x8675: -case 0x8676: -case 0x8677: -case 0x8870: -case 0x8871: -case 0x8872: -case 0x8873: -case 0x8874: -case 0x8875: -case 0x8876: -case 0x8877: -case 0x8a70: -case 0x8a71: -case 0x8a72: -case 0x8a73: -case 0x8a74: -case 0x8a75: -case 0x8a76: -case 0x8a77: -case 0x8c70: -case 0x8c71: -case 0x8c72: -case 0x8c73: -case 0x8c74: -case 0x8c75: -case 0x8c76: -case 0x8c77: -case 0x8e70: -case 0x8e71: -case 0x8e72: -case 0x8e73: -case 0x8e74: -case 0x8e75: -case 0x8e76: -case 0x8e77: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9070: -case 0x9071: -case 0x9072: -case 0x9073: -case 0x9074: -case 0x9075: -case 0x9076: -case 0x9077: -case 0x9270: -case 0x9271: -case 0x9272: -case 0x9273: -case 0x9274: -case 0x9275: -case 0x9276: -case 0x9277: -case 0x9470: -case 0x9471: -case 0x9472: -case 0x9473: -case 0x9474: -case 0x9475: -case 0x9476: -case 0x9477: -case 0x9670: -case 0x9671: -case 0x9672: -case 0x9673: -case 0x9674: -case 0x9675: -case 0x9676: -case 0x9677: -case 0x9870: -case 0x9871: -case 0x9872: -case 0x9873: -case 0x9874: -case 0x9875: -case 0x9876: -case 0x9877: -case 0x9a70: -case 0x9a71: -case 0x9a72: -case 0x9a73: -case 0x9a74: -case 0x9a75: -case 0x9a76: -case 0x9a77: -case 0x9c70: -case 0x9c71: -case 0x9c72: -case 0x9c73: -case 0x9c74: -case 0x9c75: -case 0x9c76: -case 0x9c77: -case 0x9e70: -case 0x9e71: -case 0x9e72: -case 0x9e73: -case 0x9e74: -case 0x9e75: -case 0x9e76: -case 0x9e77: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0f0: -case 0xd0f1: -case 0xd0f2: -case 0xd0f3: -case 0xd0f4: -case 0xd0f5: -case 0xd0f6: -case 0xd0f7: -case 0xd2f0: -case 0xd2f1: -case 0xd2f2: -case 0xd2f3: -case 0xd2f4: -case 0xd2f5: -case 0xd2f6: -case 0xd2f7: -case 0xd4f0: -case 0xd4f1: -case 0xd4f2: -case 0xd4f3: -case 0xd4f4: -case 0xd4f5: -case 0xd4f6: -case 0xd4f7: -case 0xd6f0: -case 0xd6f1: -case 0xd6f2: -case 0xd6f3: -case 0xd6f4: -case 0xd6f5: -case 0xd6f6: -case 0xd6f7: -case 0xd8f0: -case 0xd8f1: -case 0xd8f2: -case 0xd8f3: -case 0xd8f4: -case 0xd8f5: -case 0xd8f6: -case 0xd8f7: -case 0xdaf0: -case 0xdaf1: -case 0xdaf2: -case 0xdaf3: -case 0xdaf4: -case 0xdaf5: -case 0xdaf6: -case 0xdaf7: -case 0xdcf0: -case 0xdcf1: -case 0xdcf2: -case 0xdcf3: -case 0xdcf4: -case 0xdcf5: -case 0xdcf6: -case 0xdcf7: -case 0xdef0: -case 0xdef1: -case 0xdef2: -case 0xdef3: -case 0xdef4: -case 0xdef5: -case 0xdef6: -case 0xdef7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0f0: -case 0xb0f1: -case 0xb0f2: -case 0xb0f3: -case 0xb0f4: -case 0xb0f5: -case 0xb0f6: -case 0xb0f7: -case 0xb2f0: -case 0xb2f1: -case 0xb2f2: -case 0xb2f3: -case 0xb2f4: -case 0xb2f5: -case 0xb2f6: -case 0xb2f7: -case 0xb4f0: -case 0xb4f1: -case 0xb4f2: -case 0xb4f3: -case 0xb4f4: -case 0xb4f5: -case 0xb4f6: -case 0xb4f7: -case 0xb6f0: -case 0xb6f1: -case 0xb6f2: -case 0xb6f3: -case 0xb6f4: -case 0xb6f5: -case 0xb6f6: -case 0xb6f7: -case 0xb8f0: -case 0xb8f1: -case 0xb8f2: -case 0xb8f3: -case 0xb8f4: -case 0xb8f5: -case 0xb8f6: -case 0xb8f7: -case 0xbaf0: -case 0xbaf1: -case 0xbaf2: -case 0xbaf3: -case 0xbaf4: -case 0xbaf5: -case 0xbaf6: -case 0xbaf7: -case 0xbcf0: -case 0xbcf1: -case 0xbcf2: -case 0xbcf3: -case 0xbcf4: -case 0xbcf5: -case 0xbcf6: -case 0xbcf7: -case 0xbef0: -case 0xbef1: -case 0xbef2: -case 0xbef3: -case 0xbef4: -case 0xbef5: -case 0xbef6: -case 0xbef7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90f0: -case 0x90f1: -case 0x90f2: -case 0x90f3: -case 0x90f4: -case 0x90f5: -case 0x90f6: -case 0x90f7: -case 0x92f0: -case 0x92f1: -case 0x92f2: -case 0x92f3: -case 0x92f4: -case 0x92f5: -case 0x92f6: -case 0x92f7: -case 0x94f0: -case 0x94f1: -case 0x94f2: -case 0x94f3: -case 0x94f4: -case 0x94f5: -case 0x94f6: -case 0x94f7: -case 0x96f0: -case 0x96f1: -case 0x96f2: -case 0x96f3: -case 0x96f4: -case 0x96f5: -case 0x96f6: -case 0x96f7: -case 0x98f0: -case 0x98f1: -case 0x98f2: -case 0x98f3: -case 0x98f4: -case 0x98f5: -case 0x98f6: -case 0x98f7: -case 0x9af0: -case 0x9af1: -case 0x9af2: -case 0x9af3: -case 0x9af4: -case 0x9af5: -case 0x9af6: -case 0x9af7: -case 0x9cf0: -case 0x9cf1: -case 0x9cf2: -case 0x9cf3: -case 0x9cf4: -case 0x9cf5: -case 0x9cf6: -case 0x9cf7: -case 0x9ef0: -case 0x9ef1: -case 0x9ef2: -case 0x9ef3: -case 0x9ef4: -case 0x9ef5: -case 0x9ef6: -case 0x9ef7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x3070: -case 0x3071: -case 0x3072: -case 0x3073: -case 0x3074: -case 0x3075: -case 0x3076: -case 0x3077: -case 0x3270: -case 0x3271: -case 0x3272: -case 0x3273: -case 0x3274: -case 0x3275: -case 0x3276: -case 0x3277: -case 0x3470: -case 0x3471: -case 0x3472: -case 0x3473: -case 0x3474: -case 0x3475: -case 0x3476: -case 0x3477: -case 0x3670: -case 0x3671: -case 0x3672: -case 0x3673: -case 0x3674: -case 0x3675: -case 0x3676: -case 0x3677: -case 0x3870: -case 0x3871: -case 0x3872: -case 0x3873: -case 0x3874: -case 0x3875: -case 0x3876: -case 0x3877: -case 0x3a70: -case 0x3a71: -case 0x3a72: -case 0x3a73: -case 0x3a74: -case 0x3a75: -case 0x3a76: -case 0x3a77: -case 0x3c70: -case 0x3c71: -case 0x3c72: -case 0x3c73: -case 0x3c74: -case 0x3c75: -case 0x3c76: -case 0x3c77: -case 0x3e70: -case 0x3e71: -case 0x3e72: -case 0x3e73: -case 0x3e74: -case 0x3e75: -case 0x3e76: -case 0x3e77: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44f0: -case 0x44f1: -case 0x44f2: -case 0x44f3: -case 0x44f4: -case 0x44f5: -case 0x44f6: -case 0x44f7: - { - HAM src(this, instr_b2_b0); MOVE_to_CCR(src); - } - break; - -case 0xc1f0: -case 0xc1f1: -case 0xc1f2: -case 0xc1f3: -case 0xc1f4: -case 0xc1f5: -case 0xc1f6: -case 0xc1f7: -case 0xc3f0: -case 0xc3f1: -case 0xc3f2: -case 0xc3f3: -case 0xc3f4: -case 0xc3f5: -case 0xc3f6: -case 0xc3f7: -case 0xc5f0: -case 0xc5f1: -case 0xc5f2: -case 0xc5f3: -case 0xc5f4: -case 0xc5f5: -case 0xc5f6: -case 0xc5f7: -case 0xc7f0: -case 0xc7f1: -case 0xc7f2: -case 0xc7f3: -case 0xc7f4: -case 0xc7f5: -case 0xc7f6: -case 0xc7f7: -case 0xc9f0: -case 0xc9f1: -case 0xc9f2: -case 0xc9f3: -case 0xc9f4: -case 0xc9f5: -case 0xc9f6: -case 0xc9f7: -case 0xcbf0: -case 0xcbf1: -case 0xcbf2: -case 0xcbf3: -case 0xcbf4: -case 0xcbf5: -case 0xcbf6: -case 0xcbf7: -case 0xcdf0: -case 0xcdf1: -case 0xcdf2: -case 0xcdf3: -case 0xcdf4: -case 0xcdf5: -case 0xcdf6: -case 0xcdf7: -case 0xcff0: -case 0xcff1: -case 0xcff2: -case 0xcff3: -case 0xcff4: -case 0xcff5: -case 0xcff6: -case 0xcff7: - { - HAM src(this, instr_b2_b0); MULS(src, instr_b11_b9); - } - break; - -case 0xc0f0: -case 0xc0f1: -case 0xc0f2: -case 0xc0f3: -case 0xc0f4: -case 0xc0f5: -case 0xc0f6: -case 0xc0f7: -case 0xc2f0: -case 0xc2f1: -case 0xc2f2: -case 0xc2f3: -case 0xc2f4: -case 0xc2f5: -case 0xc2f6: -case 0xc2f7: -case 0xc4f0: -case 0xc4f1: -case 0xc4f2: -case 0xc4f3: -case 0xc4f4: -case 0xc4f5: -case 0xc4f6: -case 0xc4f7: -case 0xc6f0: -case 0xc6f1: -case 0xc6f2: -case 0xc6f3: -case 0xc6f4: -case 0xc6f5: -case 0xc6f6: -case 0xc6f7: -case 0xc8f0: -case 0xc8f1: -case 0xc8f2: -case 0xc8f3: -case 0xc8f4: -case 0xc8f5: -case 0xc8f6: -case 0xc8f7: -case 0xcaf0: -case 0xcaf1: -case 0xcaf2: -case 0xcaf3: -case 0xcaf4: -case 0xcaf5: -case 0xcaf6: -case 0xcaf7: -case 0xccf0: -case 0xccf1: -case 0xccf2: -case 0xccf3: -case 0xccf4: -case 0xccf5: -case 0xccf6: -case 0xccf7: -case 0xcef0: -case 0xcef1: -case 0xcef2: -case 0xcef3: -case 0xcef4: -case 0xcef5: -case 0xcef6: -case 0xcef7: - { - HAM src(this, instr_b2_b0); MULU(src, instr_b11_b9); - } - break; - -case 0xe1f0: -case 0xe1f1: -case 0xe1f2: -case 0xe1f3: -case 0xe1f4: -case 0xe1f5: -case 0xe1f6: -case 0xe1f7: - { - HAM targ(this, instr_b2_b0); ASL(targ, 1); - } - break; - -case 0xe0f0: -case 0xe0f1: -case 0xe0f2: -case 0xe0f3: -case 0xe0f4: -case 0xe0f5: -case 0xe0f6: -case 0xe0f7: - { - HAM targ(this, instr_b2_b0); ASR(targ, 1); - } - break; - -case 0xe3f0: -case 0xe3f1: -case 0xe3f2: -case 0xe3f3: -case 0xe3f4: -case 0xe3f5: -case 0xe3f6: -case 0xe3f7: - { - HAM targ(this, instr_b2_b0); LSL(targ, 1); - } - break; - -case 0xe2f0: -case 0xe2f1: -case 0xe2f2: -case 0xe2f3: -case 0xe2f4: -case 0xe2f5: -case 0xe2f6: -case 0xe2f7: - { - HAM targ(this, instr_b2_b0); LSR(targ, 1); - } - break; - -case 0xe7f0: -case 0xe7f1: -case 0xe7f2: -case 0xe7f3: -case 0xe7f4: -case 0xe7f5: -case 0xe7f6: -case 0xe7f7: - { - HAM targ(this, instr_b2_b0); ROL(targ, 1); - } - break; - -case 0xe6f0: -case 0xe6f1: -case 0xe6f2: -case 0xe6f3: -case 0xe6f4: -case 0xe6f5: -case 0xe6f6: -case 0xe6f7: - { - HAM targ(this, instr_b2_b0); ROR(targ, 1); - } - break; - -case 0xe5f0: -case 0xe5f1: -case 0xe5f2: -case 0xe5f3: -case 0xe5f4: -case 0xe5f5: -case 0xe5f6: -case 0xe5f7: - { - HAM targ(this, instr_b2_b0); ROXL(targ, 1); - } - break; - -case 0xe4f0: -case 0xe4f1: -case 0xe4f2: -case 0xe4f3: -case 0xe4f4: -case 0xe4f5: -case 0xe4f6: -case 0xe4f7: - { - HAM targ(this, instr_b2_b0); ROXR(targ, 1); - } - break; - -case 0x4258: -case 0x4259: -case 0x425a: -case 0x425b: -case 0x425c: -case 0x425d: -case 0x425e: -case 0x425f: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4458: -case 0x4459: -case 0x445a: -case 0x445b: -case 0x445c: -case 0x445d: -case 0x445e: -case 0x445f: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4058: -case 0x4059: -case 0x405a: -case 0x405b: -case 0x405c: -case 0x405d: -case 0x405e: -case 0x405f: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4658: -case 0x4659: -case 0x465a: -case 0x465b: -case 0x465c: -case 0x465d: -case 0x465e: -case 0x465f: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4a58: -case 0x4a59: -case 0x4a5a: -case 0x4a5b: -case 0x4a5c: -case 0x4a5d: -case 0x4a5e: -case 0x4a5f: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x81d8: -case 0x81d9: -case 0x81da: -case 0x81db: -case 0x81dc: -case 0x81dd: -case 0x81de: -case 0x81df: -case 0x83d8: -case 0x83d9: -case 0x83da: -case 0x83db: -case 0x83dc: -case 0x83dd: -case 0x83de: -case 0x83df: -case 0x85d8: -case 0x85d9: -case 0x85da: -case 0x85db: -case 0x85dc: -case 0x85dd: -case 0x85de: -case 0x85df: -case 0x87d8: -case 0x87d9: -case 0x87da: -case 0x87db: -case 0x87dc: -case 0x87dd: -case 0x87de: -case 0x87df: -case 0x89d8: -case 0x89d9: -case 0x89da: -case 0x89db: -case 0x89dc: -case 0x89dd: -case 0x89de: -case 0x89df: -case 0x8bd8: -case 0x8bd9: -case 0x8bda: -case 0x8bdb: -case 0x8bdc: -case 0x8bdd: -case 0x8bde: -case 0x8bdf: -case 0x8dd8: -case 0x8dd9: -case 0x8dda: -case 0x8ddb: -case 0x8ddc: -case 0x8ddd: -case 0x8dde: -case 0x8ddf: -case 0x8fd8: -case 0x8fd9: -case 0x8fda: -case 0x8fdb: -case 0x8fdc: -case 0x8fdd: -case 0x8fde: -case 0x8fdf: - { - HAM src(this, instr_b2_b0); DIVS(src, instr_b11_b9); - } - break; - -case 0x80d8: -case 0x80d9: -case 0x80da: -case 0x80db: -case 0x80dc: -case 0x80dd: -case 0x80de: -case 0x80df: -case 0x82d8: -case 0x82d9: -case 0x82da: -case 0x82db: -case 0x82dc: -case 0x82dd: -case 0x82de: -case 0x82df: -case 0x84d8: -case 0x84d9: -case 0x84da: -case 0x84db: -case 0x84dc: -case 0x84dd: -case 0x84de: -case 0x84df: -case 0x86d8: -case 0x86d9: -case 0x86da: -case 0x86db: -case 0x86dc: -case 0x86dd: -case 0x86de: -case 0x86df: -case 0x88d8: -case 0x88d9: -case 0x88da: -case 0x88db: -case 0x88dc: -case 0x88dd: -case 0x88de: -case 0x88df: -case 0x8ad8: -case 0x8ad9: -case 0x8ada: -case 0x8adb: -case 0x8adc: -case 0x8add: -case 0x8ade: -case 0x8adf: -case 0x8cd8: -case 0x8cd9: -case 0x8cda: -case 0x8cdb: -case 0x8cdc: -case 0x8cdd: -case 0x8cde: -case 0x8cdf: -case 0x8ed8: -case 0x8ed9: -case 0x8eda: -case 0x8edb: -case 0x8edc: -case 0x8edd: -case 0x8ede: -case 0x8edf: - { - HAM src(this, instr_b2_b0); DIVU(src, instr_b11_b9); - } - break; - -case 0x33d8: -case 0x33d9: -case 0x33da: -case 0x33db: -case 0x33dc: -case 0x33dd: -case 0x33de: -case 0x33df: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31d8: -case 0x31d9: -case 0x31da: -case 0x31db: -case 0x31dc: -case 0x31dd: -case 0x31de: -case 0x31df: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x3098: -case 0x3099: -case 0x309a: -case 0x309b: -case 0x309c: -case 0x309d: -case 0x309e: -case 0x309f: -case 0x3298: -case 0x3299: -case 0x329a: -case 0x329b: -case 0x329c: -case 0x329d: -case 0x329e: -case 0x329f: -case 0x3498: -case 0x3499: -case 0x349a: -case 0x349b: -case 0x349c: -case 0x349d: -case 0x349e: -case 0x349f: -case 0x3698: -case 0x3699: -case 0x369a: -case 0x369b: -case 0x369c: -case 0x369d: -case 0x369e: -case 0x369f: -case 0x3898: -case 0x3899: -case 0x389a: -case 0x389b: -case 0x389c: -case 0x389d: -case 0x389e: -case 0x389f: -case 0x3a98: -case 0x3a99: -case 0x3a9a: -case 0x3a9b: -case 0x3a9c: -case 0x3a9d: -case 0x3a9e: -case 0x3a9f: -case 0x3c98: -case 0x3c99: -case 0x3c9a: -case 0x3c9b: -case 0x3c9c: -case 0x3c9d: -case 0x3c9e: -case 0x3c9f: -case 0x3e98: -case 0x3e99: -case 0x3e9a: -case 0x3e9b: -case 0x3e9c: -case 0x3e9d: -case 0x3e9e: -case 0x3e9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3158: -case 0x3159: -case 0x315a: -case 0x315b: -case 0x315c: -case 0x315d: -case 0x315e: -case 0x315f: -case 0x3358: -case 0x3359: -case 0x335a: -case 0x335b: -case 0x335c: -case 0x335d: -case 0x335e: -case 0x335f: -case 0x3558: -case 0x3559: -case 0x355a: -case 0x355b: -case 0x355c: -case 0x355d: -case 0x355e: -case 0x355f: -case 0x3758: -case 0x3759: -case 0x375a: -case 0x375b: -case 0x375c: -case 0x375d: -case 0x375e: -case 0x375f: -case 0x3958: -case 0x3959: -case 0x395a: -case 0x395b: -case 0x395c: -case 0x395d: -case 0x395e: -case 0x395f: -case 0x3b58: -case 0x3b59: -case 0x3b5a: -case 0x3b5b: -case 0x3b5c: -case 0x3b5d: -case 0x3b5e: -case 0x3b5f: -case 0x3d58: -case 0x3d59: -case 0x3d5a: -case 0x3d5b: -case 0x3d5c: -case 0x3d5d: -case 0x3d5e: -case 0x3d5f: -case 0x3f58: -case 0x3f59: -case 0x3f5a: -case 0x3f5b: -case 0x3f5c: -case 0x3f5d: -case 0x3f5e: -case 0x3f5f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3198: -case 0x3199: -case 0x319a: -case 0x319b: -case 0x319c: -case 0x319d: -case 0x319e: -case 0x319f: -case 0x3398: -case 0x3399: -case 0x339a: -case 0x339b: -case 0x339c: -case 0x339d: -case 0x339e: -case 0x339f: -case 0x3598: -case 0x3599: -case 0x359a: -case 0x359b: -case 0x359c: -case 0x359d: -case 0x359e: -case 0x359f: -case 0x3798: -case 0x3799: -case 0x379a: -case 0x379b: -case 0x379c: -case 0x379d: -case 0x379e: -case 0x379f: -case 0x3998: -case 0x3999: -case 0x399a: -case 0x399b: -case 0x399c: -case 0x399d: -case 0x399e: -case 0x399f: -case 0x3b98: -case 0x3b99: -case 0x3b9a: -case 0x3b9b: -case 0x3b9c: -case 0x3b9d: -case 0x3b9e: -case 0x3b9f: -case 0x3d98: -case 0x3d99: -case 0x3d9a: -case 0x3d9b: -case 0x3d9c: -case 0x3d9d: -case 0x3d9e: -case 0x3d9f: -case 0x3f98: -case 0x3f99: -case 0x3f9a: -case 0x3f9b: -case 0x3f9c: -case 0x3f9d: -case 0x3f9e: -case 0x3f9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xb148: -case 0xb149: -case 0xb14a: -case 0xb14b: -case 0xb14c: -case 0xb14d: -case 0xb14e: -case 0xb14f: -case 0xb348: -case 0xb349: -case 0xb34a: -case 0xb34b: -case 0xb34c: -case 0xb34d: -case 0xb34e: -case 0xb34f: -case 0xb548: -case 0xb549: -case 0xb54a: -case 0xb54b: -case 0xb54c: -case 0xb54d: -case 0xb54e: -case 0xb54f: -case 0xb748: -case 0xb749: -case 0xb74a: -case 0xb74b: -case 0xb74c: -case 0xb74d: -case 0xb74e: -case 0xb74f: -case 0xb948: -case 0xb949: -case 0xb94a: -case 0xb94b: -case 0xb94c: -case 0xb94d: -case 0xb94e: -case 0xb94f: -case 0xbb48: -case 0xbb49: -case 0xbb4a: -case 0xbb4b: -case 0xbb4c: -case 0xbb4d: -case 0xbb4e: -case 0xbb4f: -case 0xbd48: -case 0xbd49: -case 0xbd4a: -case 0xbd4b: -case 0xbd4c: -case 0xbd4d: -case 0xbd4e: -case 0xbd4f: -case 0xbf48: -case 0xbf49: -case 0xbf4a: -case 0xbf4b: -case 0xbf4c: -case 0xbf4d: -case 0xbf4e: -case 0xbf4f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x30d8: -case 0x30d9: -case 0x30da: -case 0x30db: -case 0x30dc: -case 0x30dd: -case 0x30de: -case 0x30df: -case 0x32d8: -case 0x32d9: -case 0x32da: -case 0x32db: -case 0x32dc: -case 0x32dd: -case 0x32de: -case 0x32df: -case 0x34d8: -case 0x34d9: -case 0x34da: -case 0x34db: -case 0x34dc: -case 0x34dd: -case 0x34de: -case 0x34df: -case 0x36d8: -case 0x36d9: -case 0x36da: -case 0x36db: -case 0x36dc: -case 0x36dd: -case 0x36de: -case 0x36df: -case 0x38d8: -case 0x38d9: -case 0x38da: -case 0x38db: -case 0x38dc: -case 0x38dd: -case 0x38de: -case 0x38df: -case 0x3ad8: -case 0x3ad9: -case 0x3ada: -case 0x3adb: -case 0x3adc: -case 0x3add: -case 0x3ade: -case 0x3adf: -case 0x3cd8: -case 0x3cd9: -case 0x3cda: -case 0x3cdb: -case 0x3cdc: -case 0x3cdd: -case 0x3cde: -case 0x3cdf: -case 0x3ed8: -case 0x3ed9: -case 0x3eda: -case 0x3edb: -case 0x3edc: -case 0x3edd: -case 0x3ede: -case 0x3edf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3118: -case 0x3119: -case 0x311a: -case 0x311b: -case 0x311c: -case 0x311d: -case 0x311e: -case 0x311f: -case 0x3318: -case 0x3319: -case 0x331a: -case 0x331b: -case 0x331c: -case 0x331d: -case 0x331e: -case 0x331f: -case 0x3518: -case 0x3519: -case 0x351a: -case 0x351b: -case 0x351c: -case 0x351d: -case 0x351e: -case 0x351f: -case 0x3718: -case 0x3719: -case 0x371a: -case 0x371b: -case 0x371c: -case 0x371d: -case 0x371e: -case 0x371f: -case 0x3918: -case 0x3919: -case 0x391a: -case 0x391b: -case 0x391c: -case 0x391d: -case 0x391e: -case 0x391f: -case 0x3b18: -case 0x3b19: -case 0x3b1a: -case 0x3b1b: -case 0x3b1c: -case 0x3b1d: -case 0x3b1e: -case 0x3b1f: -case 0x3d18: -case 0x3d19: -case 0x3d1a: -case 0x3d1b: -case 0x3d1c: -case 0x3d1d: -case 0x3d1e: -case 0x3d1f: -case 0x3f18: -case 0x3f19: -case 0x3f1a: -case 0x3f1b: -case 0x3f1c: -case 0x3f1d: -case 0x3f1e: -case 0x3f1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd058: -case 0xd059: -case 0xd05a: -case 0xd05b: -case 0xd05c: -case 0xd05d: -case 0xd05e: -case 0xd05f: -case 0xd258: -case 0xd259: -case 0xd25a: -case 0xd25b: -case 0xd25c: -case 0xd25d: -case 0xd25e: -case 0xd25f: -case 0xd458: -case 0xd459: -case 0xd45a: -case 0xd45b: -case 0xd45c: -case 0xd45d: -case 0xd45e: -case 0xd45f: -case 0xd658: -case 0xd659: -case 0xd65a: -case 0xd65b: -case 0xd65c: -case 0xd65d: -case 0xd65e: -case 0xd65f: -case 0xd858: -case 0xd859: -case 0xd85a: -case 0xd85b: -case 0xd85c: -case 0xd85d: -case 0xd85e: -case 0xd85f: -case 0xda58: -case 0xda59: -case 0xda5a: -case 0xda5b: -case 0xda5c: -case 0xda5d: -case 0xda5e: -case 0xda5f: -case 0xdc58: -case 0xdc59: -case 0xdc5a: -case 0xdc5b: -case 0xdc5c: -case 0xdc5d: -case 0xdc5e: -case 0xdc5f: -case 0xde58: -case 0xde59: -case 0xde5a: -case 0xde5b: -case 0xde5c: -case 0xde5d: -case 0xde5e: -case 0xde5f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc058: -case 0xc059: -case 0xc05a: -case 0xc05b: -case 0xc05c: -case 0xc05d: -case 0xc05e: -case 0xc05f: -case 0xc258: -case 0xc259: -case 0xc25a: -case 0xc25b: -case 0xc25c: -case 0xc25d: -case 0xc25e: -case 0xc25f: -case 0xc458: -case 0xc459: -case 0xc45a: -case 0xc45b: -case 0xc45c: -case 0xc45d: -case 0xc45e: -case 0xc45f: -case 0xc658: -case 0xc659: -case 0xc65a: -case 0xc65b: -case 0xc65c: -case 0xc65d: -case 0xc65e: -case 0xc65f: -case 0xc858: -case 0xc859: -case 0xc85a: -case 0xc85b: -case 0xc85c: -case 0xc85d: -case 0xc85e: -case 0xc85f: -case 0xca58: -case 0xca59: -case 0xca5a: -case 0xca5b: -case 0xca5c: -case 0xca5d: -case 0xca5e: -case 0xca5f: -case 0xcc58: -case 0xcc59: -case 0xcc5a: -case 0xcc5b: -case 0xcc5c: -case 0xcc5d: -case 0xcc5e: -case 0xcc5f: -case 0xce58: -case 0xce59: -case 0xce5a: -case 0xce5b: -case 0xce5c: -case 0xce5d: -case 0xce5e: -case 0xce5f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x4198: -case 0x4199: -case 0x419a: -case 0x419b: -case 0x419c: -case 0x419d: -case 0x419e: -case 0x419f: -case 0x4398: -case 0x4399: -case 0x439a: -case 0x439b: -case 0x439c: -case 0x439d: -case 0x439e: -case 0x439f: -case 0x4598: -case 0x4599: -case 0x459a: -case 0x459b: -case 0x459c: -case 0x459d: -case 0x459e: -case 0x459f: -case 0x4798: -case 0x4799: -case 0x479a: -case 0x479b: -case 0x479c: -case 0x479d: -case 0x479e: -case 0x479f: -case 0x4998: -case 0x4999: -case 0x499a: -case 0x499b: -case 0x499c: -case 0x499d: -case 0x499e: -case 0x499f: -case 0x4b98: -case 0x4b99: -case 0x4b9a: -case 0x4b9b: -case 0x4b9c: -case 0x4b9d: -case 0x4b9e: -case 0x4b9f: -case 0x4d98: -case 0x4d99: -case 0x4d9a: -case 0x4d9b: -case 0x4d9c: -case 0x4d9d: -case 0x4d9e: -case 0x4d9f: -case 0x4f98: -case 0x4f99: -case 0x4f9a: -case 0x4f9b: -case 0x4f9c: -case 0x4f9d: -case 0x4f9e: -case 0x4f9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb058: -case 0xb059: -case 0xb05a: -case 0xb05b: -case 0xb05c: -case 0xb05d: -case 0xb05e: -case 0xb05f: -case 0xb258: -case 0xb259: -case 0xb25a: -case 0xb25b: -case 0xb25c: -case 0xb25d: -case 0xb25e: -case 0xb25f: -case 0xb458: -case 0xb459: -case 0xb45a: -case 0xb45b: -case 0xb45c: -case 0xb45d: -case 0xb45e: -case 0xb45f: -case 0xb658: -case 0xb659: -case 0xb65a: -case 0xb65b: -case 0xb65c: -case 0xb65d: -case 0xb65e: -case 0xb65f: -case 0xb858: -case 0xb859: -case 0xb85a: -case 0xb85b: -case 0xb85c: -case 0xb85d: -case 0xb85e: -case 0xb85f: -case 0xba58: -case 0xba59: -case 0xba5a: -case 0xba5b: -case 0xba5c: -case 0xba5d: -case 0xba5e: -case 0xba5f: -case 0xbc58: -case 0xbc59: -case 0xbc5a: -case 0xbc5b: -case 0xbc5c: -case 0xbc5d: -case 0xbc5e: -case 0xbc5f: -case 0xbe58: -case 0xbe59: -case 0xbe5a: -case 0xbe5b: -case 0xbe5c: -case 0xbe5d: -case 0xbe5e: -case 0xbe5f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x3018: -case 0x3019: -case 0x301a: -case 0x301b: -case 0x301c: -case 0x301d: -case 0x301e: -case 0x301f: -case 0x3218: -case 0x3219: -case 0x321a: -case 0x321b: -case 0x321c: -case 0x321d: -case 0x321e: -case 0x321f: -case 0x3418: -case 0x3419: -case 0x341a: -case 0x341b: -case 0x341c: -case 0x341d: -case 0x341e: -case 0x341f: -case 0x3618: -case 0x3619: -case 0x361a: -case 0x361b: -case 0x361c: -case 0x361d: -case 0x361e: -case 0x361f: -case 0x3818: -case 0x3819: -case 0x381a: -case 0x381b: -case 0x381c: -case 0x381d: -case 0x381e: -case 0x381f: -case 0x3a18: -case 0x3a19: -case 0x3a1a: -case 0x3a1b: -case 0x3a1c: -case 0x3a1d: -case 0x3a1e: -case 0x3a1f: -case 0x3c18: -case 0x3c19: -case 0x3c1a: -case 0x3c1b: -case 0x3c1c: -case 0x3c1d: -case 0x3c1e: -case 0x3c1f: -case 0x3e18: -case 0x3e19: -case 0x3e1a: -case 0x3e1b: -case 0x3e1c: -case 0x3e1d: -case 0x3e1e: -case 0x3e1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8058: -case 0x8059: -case 0x805a: -case 0x805b: -case 0x805c: -case 0x805d: -case 0x805e: -case 0x805f: -case 0x8258: -case 0x8259: -case 0x825a: -case 0x825b: -case 0x825c: -case 0x825d: -case 0x825e: -case 0x825f: -case 0x8458: -case 0x8459: -case 0x845a: -case 0x845b: -case 0x845c: -case 0x845d: -case 0x845e: -case 0x845f: -case 0x8658: -case 0x8659: -case 0x865a: -case 0x865b: -case 0x865c: -case 0x865d: -case 0x865e: -case 0x865f: -case 0x8858: -case 0x8859: -case 0x885a: -case 0x885b: -case 0x885c: -case 0x885d: -case 0x885e: -case 0x885f: -case 0x8a58: -case 0x8a59: -case 0x8a5a: -case 0x8a5b: -case 0x8a5c: -case 0x8a5d: -case 0x8a5e: -case 0x8a5f: -case 0x8c58: -case 0x8c59: -case 0x8c5a: -case 0x8c5b: -case 0x8c5c: -case 0x8c5d: -case 0x8c5e: -case 0x8c5f: -case 0x8e58: -case 0x8e59: -case 0x8e5a: -case 0x8e5b: -case 0x8e5c: -case 0x8e5d: -case 0x8e5e: -case 0x8e5f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9058: -case 0x9059: -case 0x905a: -case 0x905b: -case 0x905c: -case 0x905d: -case 0x905e: -case 0x905f: -case 0x9258: -case 0x9259: -case 0x925a: -case 0x925b: -case 0x925c: -case 0x925d: -case 0x925e: -case 0x925f: -case 0x9458: -case 0x9459: -case 0x945a: -case 0x945b: -case 0x945c: -case 0x945d: -case 0x945e: -case 0x945f: -case 0x9658: -case 0x9659: -case 0x965a: -case 0x965b: -case 0x965c: -case 0x965d: -case 0x965e: -case 0x965f: -case 0x9858: -case 0x9859: -case 0x985a: -case 0x985b: -case 0x985c: -case 0x985d: -case 0x985e: -case 0x985f: -case 0x9a58: -case 0x9a59: -case 0x9a5a: -case 0x9a5b: -case 0x9a5c: -case 0x9a5d: -case 0x9a5e: -case 0x9a5f: -case 0x9c58: -case 0x9c59: -case 0x9c5a: -case 0x9c5b: -case 0x9c5c: -case 0x9c5d: -case 0x9c5e: -case 0x9c5f: -case 0x9e58: -case 0x9e59: -case 0x9e5a: -case 0x9e5b: -case 0x9e5c: -case 0x9e5d: -case 0x9e5e: -case 0x9e5f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0d8: -case 0xd0d9: -case 0xd0da: -case 0xd0db: -case 0xd0dc: -case 0xd0dd: -case 0xd0de: -case 0xd0df: -case 0xd2d8: -case 0xd2d9: -case 0xd2da: -case 0xd2db: -case 0xd2dc: -case 0xd2dd: -case 0xd2de: -case 0xd2df: -case 0xd4d8: -case 0xd4d9: -case 0xd4da: -case 0xd4db: -case 0xd4dc: -case 0xd4dd: -case 0xd4de: -case 0xd4df: -case 0xd6d8: -case 0xd6d9: -case 0xd6da: -case 0xd6db: -case 0xd6dc: -case 0xd6dd: -case 0xd6de: -case 0xd6df: -case 0xd8d8: -case 0xd8d9: -case 0xd8da: -case 0xd8db: -case 0xd8dc: -case 0xd8dd: -case 0xd8de: -case 0xd8df: -case 0xdad8: -case 0xdad9: -case 0xdada: -case 0xdadb: -case 0xdadc: -case 0xdadd: -case 0xdade: -case 0xdadf: -case 0xdcd8: -case 0xdcd9: -case 0xdcda: -case 0xdcdb: -case 0xdcdc: -case 0xdcdd: -case 0xdcde: -case 0xdcdf: -case 0xded8: -case 0xded9: -case 0xdeda: -case 0xdedb: -case 0xdedc: -case 0xdedd: -case 0xdede: -case 0xdedf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0d8: -case 0xb0d9: -case 0xb0da: -case 0xb0db: -case 0xb0dc: -case 0xb0dd: -case 0xb0de: -case 0xb0df: -case 0xb2d8: -case 0xb2d9: -case 0xb2da: -case 0xb2db: -case 0xb2dc: -case 0xb2dd: -case 0xb2de: -case 0xb2df: -case 0xb4d8: -case 0xb4d9: -case 0xb4da: -case 0xb4db: -case 0xb4dc: -case 0xb4dd: -case 0xb4de: -case 0xb4df: -case 0xb6d8: -case 0xb6d9: -case 0xb6da: -case 0xb6db: -case 0xb6dc: -case 0xb6dd: -case 0xb6de: -case 0xb6df: -case 0xb8d8: -case 0xb8d9: -case 0xb8da: -case 0xb8db: -case 0xb8dc: -case 0xb8dd: -case 0xb8de: -case 0xb8df: -case 0xbad8: -case 0xbad9: -case 0xbada: -case 0xbadb: -case 0xbadc: -case 0xbadd: -case 0xbade: -case 0xbadf: -case 0xbcd8: -case 0xbcd9: -case 0xbcda: -case 0xbcdb: -case 0xbcdc: -case 0xbcdd: -case 0xbcde: -case 0xbcdf: -case 0xbed8: -case 0xbed9: -case 0xbeda: -case 0xbedb: -case 0xbedc: -case 0xbedd: -case 0xbede: -case 0xbedf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90d8: -case 0x90d9: -case 0x90da: -case 0x90db: -case 0x90dc: -case 0x90dd: -case 0x90de: -case 0x90df: -case 0x92d8: -case 0x92d9: -case 0x92da: -case 0x92db: -case 0x92dc: -case 0x92dd: -case 0x92de: -case 0x92df: -case 0x94d8: -case 0x94d9: -case 0x94da: -case 0x94db: -case 0x94dc: -case 0x94dd: -case 0x94de: -case 0x94df: -case 0x96d8: -case 0x96d9: -case 0x96da: -case 0x96db: -case 0x96dc: -case 0x96dd: -case 0x96de: -case 0x96df: -case 0x98d8: -case 0x98d9: -case 0x98da: -case 0x98db: -case 0x98dc: -case 0x98dd: -case 0x98de: -case 0x98df: -case 0x9ad8: -case 0x9ad9: -case 0x9ada: -case 0x9adb: -case 0x9adc: -case 0x9add: -case 0x9ade: -case 0x9adf: -case 0x9cd8: -case 0x9cd9: -case 0x9cda: -case 0x9cdb: -case 0x9cdc: -case 0x9cdd: -case 0x9cde: -case 0x9cdf: -case 0x9ed8: -case 0x9ed9: -case 0x9eda: -case 0x9edb: -case 0x9edc: -case 0x9edd: -case 0x9ede: -case 0x9edf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x3058: -case 0x3059: -case 0x305a: -case 0x305b: -case 0x305c: -case 0x305d: -case 0x305e: -case 0x305f: -case 0x3258: -case 0x3259: -case 0x325a: -case 0x325b: -case 0x325c: -case 0x325d: -case 0x325e: -case 0x325f: -case 0x3458: -case 0x3459: -case 0x345a: -case 0x345b: -case 0x345c: -case 0x345d: -case 0x345e: -case 0x345f: -case 0x3658: -case 0x3659: -case 0x365a: -case 0x365b: -case 0x365c: -case 0x365d: -case 0x365e: -case 0x365f: -case 0x3858: -case 0x3859: -case 0x385a: -case 0x385b: -case 0x385c: -case 0x385d: -case 0x385e: -case 0x385f: -case 0x3a58: -case 0x3a59: -case 0x3a5a: -case 0x3a5b: -case 0x3a5c: -case 0x3a5d: -case 0x3a5e: -case 0x3a5f: -case 0x3c58: -case 0x3c59: -case 0x3c5a: -case 0x3c5b: -case 0x3c5c: -case 0x3c5d: -case 0x3c5e: -case 0x3c5f: -case 0x3e58: -case 0x3e59: -case 0x3e5a: -case 0x3e5b: -case 0x3e5c: -case 0x3e5d: -case 0x3e5e: -case 0x3e5f: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44d8: -case 0x44d9: -case 0x44da: -case 0x44db: -case 0x44dc: -case 0x44dd: -case 0x44de: -case 0x44df: - { - HAM src(this, instr_b2_b0); MOVE_to_CCR(src); - } - break; - -case 0xc1d8: -case 0xc1d9: -case 0xc1da: -case 0xc1db: -case 0xc1dc: -case 0xc1dd: -case 0xc1de: -case 0xc1df: -case 0xc3d8: -case 0xc3d9: -case 0xc3da: -case 0xc3db: -case 0xc3dc: -case 0xc3dd: -case 0xc3de: -case 0xc3df: -case 0xc5d8: -case 0xc5d9: -case 0xc5da: -case 0xc5db: -case 0xc5dc: -case 0xc5dd: -case 0xc5de: -case 0xc5df: -case 0xc7d8: -case 0xc7d9: -case 0xc7da: -case 0xc7db: -case 0xc7dc: -case 0xc7dd: -case 0xc7de: -case 0xc7df: -case 0xc9d8: -case 0xc9d9: -case 0xc9da: -case 0xc9db: -case 0xc9dc: -case 0xc9dd: -case 0xc9de: -case 0xc9df: -case 0xcbd8: -case 0xcbd9: -case 0xcbda: -case 0xcbdb: -case 0xcbdc: -case 0xcbdd: -case 0xcbde: -case 0xcbdf: -case 0xcdd8: -case 0xcdd9: -case 0xcdda: -case 0xcddb: -case 0xcddc: -case 0xcddd: -case 0xcdde: -case 0xcddf: -case 0xcfd8: -case 0xcfd9: -case 0xcfda: -case 0xcfdb: -case 0xcfdc: -case 0xcfdd: -case 0xcfde: -case 0xcfdf: - { - HAM src(this, instr_b2_b0); MULS(src, instr_b11_b9); - } - break; - -case 0xc0d8: -case 0xc0d9: -case 0xc0da: -case 0xc0db: -case 0xc0dc: -case 0xc0dd: -case 0xc0de: -case 0xc0df: -case 0xc2d8: -case 0xc2d9: -case 0xc2da: -case 0xc2db: -case 0xc2dc: -case 0xc2dd: -case 0xc2de: -case 0xc2df: -case 0xc4d8: -case 0xc4d9: -case 0xc4da: -case 0xc4db: -case 0xc4dc: -case 0xc4dd: -case 0xc4de: -case 0xc4df: -case 0xc6d8: -case 0xc6d9: -case 0xc6da: -case 0xc6db: -case 0xc6dc: -case 0xc6dd: -case 0xc6de: -case 0xc6df: -case 0xc8d8: -case 0xc8d9: -case 0xc8da: -case 0xc8db: -case 0xc8dc: -case 0xc8dd: -case 0xc8de: -case 0xc8df: -case 0xcad8: -case 0xcad9: -case 0xcada: -case 0xcadb: -case 0xcadc: -case 0xcadd: -case 0xcade: -case 0xcadf: -case 0xccd8: -case 0xccd9: -case 0xccda: -case 0xccdb: -case 0xccdc: -case 0xccdd: -case 0xccde: -case 0xccdf: -case 0xced8: -case 0xced9: -case 0xceda: -case 0xcedb: -case 0xcedc: -case 0xcedd: -case 0xcede: -case 0xcedf: - { - HAM src(this, instr_b2_b0); MULU(src, instr_b11_b9); - } - break; - -case 0xe1d8: -case 0xe1d9: -case 0xe1da: -case 0xe1db: -case 0xe1dc: -case 0xe1dd: -case 0xe1de: -case 0xe1df: - { - HAM targ(this, instr_b2_b0); ASL(targ, 1); - } - break; - -case 0xe0d8: -case 0xe0d9: -case 0xe0da: -case 0xe0db: -case 0xe0dc: -case 0xe0dd: -case 0xe0de: -case 0xe0df: - { - HAM targ(this, instr_b2_b0); ASR(targ, 1); - } - break; - -case 0xe3d8: -case 0xe3d9: -case 0xe3da: -case 0xe3db: -case 0xe3dc: -case 0xe3dd: -case 0xe3de: -case 0xe3df: - { - HAM targ(this, instr_b2_b0); LSL(targ, 1); - } - break; - -case 0xe2d8: -case 0xe2d9: -case 0xe2da: -case 0xe2db: -case 0xe2dc: -case 0xe2dd: -case 0xe2de: -case 0xe2df: - { - HAM targ(this, instr_b2_b0); LSR(targ, 1); - } - break; - -case 0xe7d8: -case 0xe7d9: -case 0xe7da: -case 0xe7db: -case 0xe7dc: -case 0xe7dd: -case 0xe7de: -case 0xe7df: - { - HAM targ(this, instr_b2_b0); ROL(targ, 1); - } - break; - -case 0xe6d8: -case 0xe6d9: -case 0xe6da: -case 0xe6db: -case 0xe6dc: -case 0xe6dd: -case 0xe6de: -case 0xe6df: - { - HAM targ(this, instr_b2_b0); ROR(targ, 1); - } - break; - -case 0xe5d8: -case 0xe5d9: -case 0xe5da: -case 0xe5db: -case 0xe5dc: -case 0xe5dd: -case 0xe5de: -case 0xe5df: - { - HAM targ(this, instr_b2_b0); ROXL(targ, 1); - } - break; - -case 0xe4d8: -case 0xe4d9: -case 0xe4da: -case 0xe4db: -case 0xe4dc: -case 0xe4dd: -case 0xe4de: -case 0xe4df: - { - HAM targ(this, instr_b2_b0); ROXR(targ, 1); - } - break; - -case 0x4260: -case 0x4261: -case 0x4262: -case 0x4263: -case 0x4264: -case 0x4265: -case 0x4266: -case 0x4267: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4460: -case 0x4461: -case 0x4462: -case 0x4463: -case 0x4464: -case 0x4465: -case 0x4466: -case 0x4467: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4060: -case 0x4061: -case 0x4062: -case 0x4063: -case 0x4064: -case 0x4065: -case 0x4066: -case 0x4067: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4660: -case 0x4661: -case 0x4662: -case 0x4663: -case 0x4664: -case 0x4665: -case 0x4666: -case 0x4667: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4a60: -case 0x4a61: -case 0x4a62: -case 0x4a63: -case 0x4a64: -case 0x4a65: -case 0x4a66: -case 0x4a67: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x81e0: -case 0x81e1: -case 0x81e2: -case 0x81e3: -case 0x81e4: -case 0x81e5: -case 0x81e6: -case 0x81e7: -case 0x83e0: -case 0x83e1: -case 0x83e2: -case 0x83e3: -case 0x83e4: -case 0x83e5: -case 0x83e6: -case 0x83e7: -case 0x85e0: -case 0x85e1: -case 0x85e2: -case 0x85e3: -case 0x85e4: -case 0x85e5: -case 0x85e6: -case 0x85e7: -case 0x87e0: -case 0x87e1: -case 0x87e2: -case 0x87e3: -case 0x87e4: -case 0x87e5: -case 0x87e6: -case 0x87e7: -case 0x89e0: -case 0x89e1: -case 0x89e2: -case 0x89e3: -case 0x89e4: -case 0x89e5: -case 0x89e6: -case 0x89e7: -case 0x8be0: -case 0x8be1: -case 0x8be2: -case 0x8be3: -case 0x8be4: -case 0x8be5: -case 0x8be6: -case 0x8be7: -case 0x8de0: -case 0x8de1: -case 0x8de2: -case 0x8de3: -case 0x8de4: -case 0x8de5: -case 0x8de6: -case 0x8de7: -case 0x8fe0: -case 0x8fe1: -case 0x8fe2: -case 0x8fe3: -case 0x8fe4: -case 0x8fe5: -case 0x8fe6: -case 0x8fe7: - { - HAM src(this, instr_b2_b0); DIVS(src, instr_b11_b9); - } - break; - -case 0x80e0: -case 0x80e1: -case 0x80e2: -case 0x80e3: -case 0x80e4: -case 0x80e5: -case 0x80e6: -case 0x80e7: -case 0x82e0: -case 0x82e1: -case 0x82e2: -case 0x82e3: -case 0x82e4: -case 0x82e5: -case 0x82e6: -case 0x82e7: -case 0x84e0: -case 0x84e1: -case 0x84e2: -case 0x84e3: -case 0x84e4: -case 0x84e5: -case 0x84e6: -case 0x84e7: -case 0x86e0: -case 0x86e1: -case 0x86e2: -case 0x86e3: -case 0x86e4: -case 0x86e5: -case 0x86e6: -case 0x86e7: -case 0x88e0: -case 0x88e1: -case 0x88e2: -case 0x88e3: -case 0x88e4: -case 0x88e5: -case 0x88e6: -case 0x88e7: -case 0x8ae0: -case 0x8ae1: -case 0x8ae2: -case 0x8ae3: -case 0x8ae4: -case 0x8ae5: -case 0x8ae6: -case 0x8ae7: -case 0x8ce0: -case 0x8ce1: -case 0x8ce2: -case 0x8ce3: -case 0x8ce4: -case 0x8ce5: -case 0x8ce6: -case 0x8ce7: -case 0x8ee0: -case 0x8ee1: -case 0x8ee2: -case 0x8ee3: -case 0x8ee4: -case 0x8ee5: -case 0x8ee6: -case 0x8ee7: - { - HAM src(this, instr_b2_b0); DIVU(src, instr_b11_b9); - } - break; - -case 0x33e0: -case 0x33e1: -case 0x33e2: -case 0x33e3: -case 0x33e4: -case 0x33e5: -case 0x33e6: -case 0x33e7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31e0: -case 0x31e1: -case 0x31e2: -case 0x31e3: -case 0x31e4: -case 0x31e5: -case 0x31e6: -case 0x31e7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x30a0: -case 0x30a1: -case 0x30a2: -case 0x30a3: -case 0x30a4: -case 0x30a5: -case 0x30a6: -case 0x30a7: -case 0x32a0: -case 0x32a1: -case 0x32a2: -case 0x32a3: -case 0x32a4: -case 0x32a5: -case 0x32a6: -case 0x32a7: -case 0x34a0: -case 0x34a1: -case 0x34a2: -case 0x34a3: -case 0x34a4: -case 0x34a5: -case 0x34a6: -case 0x34a7: -case 0x36a0: -case 0x36a1: -case 0x36a2: -case 0x36a3: -case 0x36a4: -case 0x36a5: -case 0x36a6: -case 0x36a7: -case 0x38a0: -case 0x38a1: -case 0x38a2: -case 0x38a3: -case 0x38a4: -case 0x38a5: -case 0x38a6: -case 0x38a7: -case 0x3aa0: -case 0x3aa1: -case 0x3aa2: -case 0x3aa3: -case 0x3aa4: -case 0x3aa5: -case 0x3aa6: -case 0x3aa7: -case 0x3ca0: -case 0x3ca1: -case 0x3ca2: -case 0x3ca3: -case 0x3ca4: -case 0x3ca5: -case 0x3ca6: -case 0x3ca7: -case 0x3ea0: -case 0x3ea1: -case 0x3ea2: -case 0x3ea3: -case 0x3ea4: -case 0x3ea5: -case 0x3ea6: -case 0x3ea7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3160: -case 0x3161: -case 0x3162: -case 0x3163: -case 0x3164: -case 0x3165: -case 0x3166: -case 0x3167: -case 0x3360: -case 0x3361: -case 0x3362: -case 0x3363: -case 0x3364: -case 0x3365: -case 0x3366: -case 0x3367: -case 0x3560: -case 0x3561: -case 0x3562: -case 0x3563: -case 0x3564: -case 0x3565: -case 0x3566: -case 0x3567: -case 0x3760: -case 0x3761: -case 0x3762: -case 0x3763: -case 0x3764: -case 0x3765: -case 0x3766: -case 0x3767: -case 0x3960: -case 0x3961: -case 0x3962: -case 0x3963: -case 0x3964: -case 0x3965: -case 0x3966: -case 0x3967: -case 0x3b60: -case 0x3b61: -case 0x3b62: -case 0x3b63: -case 0x3b64: -case 0x3b65: -case 0x3b66: -case 0x3b67: -case 0x3d60: -case 0x3d61: -case 0x3d62: -case 0x3d63: -case 0x3d64: -case 0x3d65: -case 0x3d66: -case 0x3d67: -case 0x3f60: -case 0x3f61: -case 0x3f62: -case 0x3f63: -case 0x3f64: -case 0x3f65: -case 0x3f66: -case 0x3f67: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x31a0: -case 0x31a1: -case 0x31a2: -case 0x31a3: -case 0x31a4: -case 0x31a5: -case 0x31a6: -case 0x31a7: -case 0x33a0: -case 0x33a1: -case 0x33a2: -case 0x33a3: -case 0x33a4: -case 0x33a5: -case 0x33a6: -case 0x33a7: -case 0x35a0: -case 0x35a1: -case 0x35a2: -case 0x35a3: -case 0x35a4: -case 0x35a5: -case 0x35a6: -case 0x35a7: -case 0x37a0: -case 0x37a1: -case 0x37a2: -case 0x37a3: -case 0x37a4: -case 0x37a5: -case 0x37a6: -case 0x37a7: -case 0x39a0: -case 0x39a1: -case 0x39a2: -case 0x39a3: -case 0x39a4: -case 0x39a5: -case 0x39a6: -case 0x39a7: -case 0x3ba0: -case 0x3ba1: -case 0x3ba2: -case 0x3ba3: -case 0x3ba4: -case 0x3ba5: -case 0x3ba6: -case 0x3ba7: -case 0x3da0: -case 0x3da1: -case 0x3da2: -case 0x3da3: -case 0x3da4: -case 0x3da5: -case 0x3da6: -case 0x3da7: -case 0x3fa0: -case 0x3fa1: -case 0x3fa2: -case 0x3fa3: -case 0x3fa4: -case 0x3fa5: -case 0x3fa6: -case 0x3fa7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30e0: -case 0x30e1: -case 0x30e2: -case 0x30e3: -case 0x30e4: -case 0x30e5: -case 0x30e6: -case 0x30e7: -case 0x32e0: -case 0x32e1: -case 0x32e2: -case 0x32e3: -case 0x32e4: -case 0x32e5: -case 0x32e6: -case 0x32e7: -case 0x34e0: -case 0x34e1: -case 0x34e2: -case 0x34e3: -case 0x34e4: -case 0x34e5: -case 0x34e6: -case 0x34e7: -case 0x36e0: -case 0x36e1: -case 0x36e2: -case 0x36e3: -case 0x36e4: -case 0x36e5: -case 0x36e6: -case 0x36e7: -case 0x38e0: -case 0x38e1: -case 0x38e2: -case 0x38e3: -case 0x38e4: -case 0x38e5: -case 0x38e6: -case 0x38e7: -case 0x3ae0: -case 0x3ae1: -case 0x3ae2: -case 0x3ae3: -case 0x3ae4: -case 0x3ae5: -case 0x3ae6: -case 0x3ae7: -case 0x3ce0: -case 0x3ce1: -case 0x3ce2: -case 0x3ce3: -case 0x3ce4: -case 0x3ce5: -case 0x3ce6: -case 0x3ce7: -case 0x3ee0: -case 0x3ee1: -case 0x3ee2: -case 0x3ee3: -case 0x3ee4: -case 0x3ee5: -case 0x3ee6: -case 0x3ee7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd148: -case 0xd149: -case 0xd14a: -case 0xd14b: -case 0xd14c: -case 0xd14d: -case 0xd14e: -case 0xd14f: -case 0xd348: -case 0xd349: -case 0xd34a: -case 0xd34b: -case 0xd34c: -case 0xd34d: -case 0xd34e: -case 0xd34f: -case 0xd548: -case 0xd549: -case 0xd54a: -case 0xd54b: -case 0xd54c: -case 0xd54d: -case 0xd54e: -case 0xd54f: -case 0xd748: -case 0xd749: -case 0xd74a: -case 0xd74b: -case 0xd74c: -case 0xd74d: -case 0xd74e: -case 0xd74f: -case 0xd948: -case 0xd949: -case 0xd94a: -case 0xd94b: -case 0xd94c: -case 0xd94d: -case 0xd94e: -case 0xd94f: -case 0xdb48: -case 0xdb49: -case 0xdb4a: -case 0xdb4b: -case 0xdb4c: -case 0xdb4d: -case 0xdb4e: -case 0xdb4f: -case 0xdd48: -case 0xdd49: -case 0xdd4a: -case 0xdd4b: -case 0xdd4c: -case 0xdd4d: -case 0xdd4e: -case 0xdd4f: -case 0xdf48: -case 0xdf49: -case 0xdf4a: -case 0xdf4b: -case 0xdf4c: -case 0xdf4d: -case 0xdf4e: -case 0xdf4f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADDX(src, dst); - } - break; - -case 0x3120: -case 0x3121: -case 0x3122: -case 0x3123: -case 0x3124: -case 0x3125: -case 0x3126: -case 0x3127: -case 0x3320: -case 0x3321: -case 0x3322: -case 0x3323: -case 0x3324: -case 0x3325: -case 0x3326: -case 0x3327: -case 0x3520: -case 0x3521: -case 0x3522: -case 0x3523: -case 0x3524: -case 0x3525: -case 0x3526: -case 0x3527: -case 0x3720: -case 0x3721: -case 0x3722: -case 0x3723: -case 0x3724: -case 0x3725: -case 0x3726: -case 0x3727: -case 0x3920: -case 0x3921: -case 0x3922: -case 0x3923: -case 0x3924: -case 0x3925: -case 0x3926: -case 0x3927: -case 0x3b20: -case 0x3b21: -case 0x3b22: -case 0x3b23: -case 0x3b24: -case 0x3b25: -case 0x3b26: -case 0x3b27: -case 0x3d20: -case 0x3d21: -case 0x3d22: -case 0x3d23: -case 0x3d24: -case 0x3d25: -case 0x3d26: -case 0x3d27: -case 0x3f20: -case 0x3f21: -case 0x3f22: -case 0x3f23: -case 0x3f24: -case 0x3f25: -case 0x3f26: -case 0x3f27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x9148: -case 0x9149: -case 0x914a: -case 0x914b: -case 0x914c: -case 0x914d: -case 0x914e: -case 0x914f: -case 0x9348: -case 0x9349: -case 0x934a: -case 0x934b: -case 0x934c: -case 0x934d: -case 0x934e: -case 0x934f: -case 0x9548: -case 0x9549: -case 0x954a: -case 0x954b: -case 0x954c: -case 0x954d: -case 0x954e: -case 0x954f: -case 0x9748: -case 0x9749: -case 0x974a: -case 0x974b: -case 0x974c: -case 0x974d: -case 0x974e: -case 0x974f: -case 0x9948: -case 0x9949: -case 0x994a: -case 0x994b: -case 0x994c: -case 0x994d: -case 0x994e: -case 0x994f: -case 0x9b48: -case 0x9b49: -case 0x9b4a: -case 0x9b4b: -case 0x9b4c: -case 0x9b4d: -case 0x9b4e: -case 0x9b4f: -case 0x9d48: -case 0x9d49: -case 0x9d4a: -case 0x9d4b: -case 0x9d4c: -case 0x9d4d: -case 0x9d4e: -case 0x9d4f: -case 0x9f48: -case 0x9f49: -case 0x9f4a: -case 0x9f4b: -case 0x9f4c: -case 0x9f4d: -case 0x9f4e: -case 0x9f4f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUBX(src, dst); - } - break; - -case 0xd060: -case 0xd061: -case 0xd062: -case 0xd063: -case 0xd064: -case 0xd065: -case 0xd066: -case 0xd067: -case 0xd260: -case 0xd261: -case 0xd262: -case 0xd263: -case 0xd264: -case 0xd265: -case 0xd266: -case 0xd267: -case 0xd460: -case 0xd461: -case 0xd462: -case 0xd463: -case 0xd464: -case 0xd465: -case 0xd466: -case 0xd467: -case 0xd660: -case 0xd661: -case 0xd662: -case 0xd663: -case 0xd664: -case 0xd665: -case 0xd666: -case 0xd667: -case 0xd860: -case 0xd861: -case 0xd862: -case 0xd863: -case 0xd864: -case 0xd865: -case 0xd866: -case 0xd867: -case 0xda60: -case 0xda61: -case 0xda62: -case 0xda63: -case 0xda64: -case 0xda65: -case 0xda66: -case 0xda67: -case 0xdc60: -case 0xdc61: -case 0xdc62: -case 0xdc63: -case 0xdc64: -case 0xdc65: -case 0xdc66: -case 0xdc67: -case 0xde60: -case 0xde61: -case 0xde62: -case 0xde63: -case 0xde64: -case 0xde65: -case 0xde66: -case 0xde67: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc060: -case 0xc061: -case 0xc062: -case 0xc063: -case 0xc064: -case 0xc065: -case 0xc066: -case 0xc067: -case 0xc260: -case 0xc261: -case 0xc262: -case 0xc263: -case 0xc264: -case 0xc265: -case 0xc266: -case 0xc267: -case 0xc460: -case 0xc461: -case 0xc462: -case 0xc463: -case 0xc464: -case 0xc465: -case 0xc466: -case 0xc467: -case 0xc660: -case 0xc661: -case 0xc662: -case 0xc663: -case 0xc664: -case 0xc665: -case 0xc666: -case 0xc667: -case 0xc860: -case 0xc861: -case 0xc862: -case 0xc863: -case 0xc864: -case 0xc865: -case 0xc866: -case 0xc867: -case 0xca60: -case 0xca61: -case 0xca62: -case 0xca63: -case 0xca64: -case 0xca65: -case 0xca66: -case 0xca67: -case 0xcc60: -case 0xcc61: -case 0xcc62: -case 0xcc63: -case 0xcc64: -case 0xcc65: -case 0xcc66: -case 0xcc67: -case 0xce60: -case 0xce61: -case 0xce62: -case 0xce63: -case 0xce64: -case 0xce65: -case 0xce66: -case 0xce67: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x41a0: -case 0x41a1: -case 0x41a2: -case 0x41a3: -case 0x41a4: -case 0x41a5: -case 0x41a6: -case 0x41a7: -case 0x43a0: -case 0x43a1: -case 0x43a2: -case 0x43a3: -case 0x43a4: -case 0x43a5: -case 0x43a6: -case 0x43a7: -case 0x45a0: -case 0x45a1: -case 0x45a2: -case 0x45a3: -case 0x45a4: -case 0x45a5: -case 0x45a6: -case 0x45a7: -case 0x47a0: -case 0x47a1: -case 0x47a2: -case 0x47a3: -case 0x47a4: -case 0x47a5: -case 0x47a6: -case 0x47a7: -case 0x49a0: -case 0x49a1: -case 0x49a2: -case 0x49a3: -case 0x49a4: -case 0x49a5: -case 0x49a6: -case 0x49a7: -case 0x4ba0: -case 0x4ba1: -case 0x4ba2: -case 0x4ba3: -case 0x4ba4: -case 0x4ba5: -case 0x4ba6: -case 0x4ba7: -case 0x4da0: -case 0x4da1: -case 0x4da2: -case 0x4da3: -case 0x4da4: -case 0x4da5: -case 0x4da6: -case 0x4da7: -case 0x4fa0: -case 0x4fa1: -case 0x4fa2: -case 0x4fa3: -case 0x4fa4: -case 0x4fa5: -case 0x4fa6: -case 0x4fa7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb060: -case 0xb061: -case 0xb062: -case 0xb063: -case 0xb064: -case 0xb065: -case 0xb066: -case 0xb067: -case 0xb260: -case 0xb261: -case 0xb262: -case 0xb263: -case 0xb264: -case 0xb265: -case 0xb266: -case 0xb267: -case 0xb460: -case 0xb461: -case 0xb462: -case 0xb463: -case 0xb464: -case 0xb465: -case 0xb466: -case 0xb467: -case 0xb660: -case 0xb661: -case 0xb662: -case 0xb663: -case 0xb664: -case 0xb665: -case 0xb666: -case 0xb667: -case 0xb860: -case 0xb861: -case 0xb862: -case 0xb863: -case 0xb864: -case 0xb865: -case 0xb866: -case 0xb867: -case 0xba60: -case 0xba61: -case 0xba62: -case 0xba63: -case 0xba64: -case 0xba65: -case 0xba66: -case 0xba67: -case 0xbc60: -case 0xbc61: -case 0xbc62: -case 0xbc63: -case 0xbc64: -case 0xbc65: -case 0xbc66: -case 0xbc67: -case 0xbe60: -case 0xbe61: -case 0xbe62: -case 0xbe63: -case 0xbe64: -case 0xbe65: -case 0xbe66: -case 0xbe67: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x3020: -case 0x3021: -case 0x3022: -case 0x3023: -case 0x3024: -case 0x3025: -case 0x3026: -case 0x3027: -case 0x3220: -case 0x3221: -case 0x3222: -case 0x3223: -case 0x3224: -case 0x3225: -case 0x3226: -case 0x3227: -case 0x3420: -case 0x3421: -case 0x3422: -case 0x3423: -case 0x3424: -case 0x3425: -case 0x3426: -case 0x3427: -case 0x3620: -case 0x3621: -case 0x3622: -case 0x3623: -case 0x3624: -case 0x3625: -case 0x3626: -case 0x3627: -case 0x3820: -case 0x3821: -case 0x3822: -case 0x3823: -case 0x3824: -case 0x3825: -case 0x3826: -case 0x3827: -case 0x3a20: -case 0x3a21: -case 0x3a22: -case 0x3a23: -case 0x3a24: -case 0x3a25: -case 0x3a26: -case 0x3a27: -case 0x3c20: -case 0x3c21: -case 0x3c22: -case 0x3c23: -case 0x3c24: -case 0x3c25: -case 0x3c26: -case 0x3c27: -case 0x3e20: -case 0x3e21: -case 0x3e22: -case 0x3e23: -case 0x3e24: -case 0x3e25: -case 0x3e26: -case 0x3e27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8060: -case 0x8061: -case 0x8062: -case 0x8063: -case 0x8064: -case 0x8065: -case 0x8066: -case 0x8067: -case 0x8260: -case 0x8261: -case 0x8262: -case 0x8263: -case 0x8264: -case 0x8265: -case 0x8266: -case 0x8267: -case 0x8460: -case 0x8461: -case 0x8462: -case 0x8463: -case 0x8464: -case 0x8465: -case 0x8466: -case 0x8467: -case 0x8660: -case 0x8661: -case 0x8662: -case 0x8663: -case 0x8664: -case 0x8665: -case 0x8666: -case 0x8667: -case 0x8860: -case 0x8861: -case 0x8862: -case 0x8863: -case 0x8864: -case 0x8865: -case 0x8866: -case 0x8867: -case 0x8a60: -case 0x8a61: -case 0x8a62: -case 0x8a63: -case 0x8a64: -case 0x8a65: -case 0x8a66: -case 0x8a67: -case 0x8c60: -case 0x8c61: -case 0x8c62: -case 0x8c63: -case 0x8c64: -case 0x8c65: -case 0x8c66: -case 0x8c67: -case 0x8e60: -case 0x8e61: -case 0x8e62: -case 0x8e63: -case 0x8e64: -case 0x8e65: -case 0x8e66: -case 0x8e67: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9060: -case 0x9061: -case 0x9062: -case 0x9063: -case 0x9064: -case 0x9065: -case 0x9066: -case 0x9067: -case 0x9260: -case 0x9261: -case 0x9262: -case 0x9263: -case 0x9264: -case 0x9265: -case 0x9266: -case 0x9267: -case 0x9460: -case 0x9461: -case 0x9462: -case 0x9463: -case 0x9464: -case 0x9465: -case 0x9466: -case 0x9467: -case 0x9660: -case 0x9661: -case 0x9662: -case 0x9663: -case 0x9664: -case 0x9665: -case 0x9666: -case 0x9667: -case 0x9860: -case 0x9861: -case 0x9862: -case 0x9863: -case 0x9864: -case 0x9865: -case 0x9866: -case 0x9867: -case 0x9a60: -case 0x9a61: -case 0x9a62: -case 0x9a63: -case 0x9a64: -case 0x9a65: -case 0x9a66: -case 0x9a67: -case 0x9c60: -case 0x9c61: -case 0x9c62: -case 0x9c63: -case 0x9c64: -case 0x9c65: -case 0x9c66: -case 0x9c67: -case 0x9e60: -case 0x9e61: -case 0x9e62: -case 0x9e63: -case 0x9e64: -case 0x9e65: -case 0x9e66: -case 0x9e67: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0e0: -case 0xd0e1: -case 0xd0e2: -case 0xd0e3: -case 0xd0e4: -case 0xd0e5: -case 0xd0e6: -case 0xd0e7: -case 0xd2e0: -case 0xd2e1: -case 0xd2e2: -case 0xd2e3: -case 0xd2e4: -case 0xd2e5: -case 0xd2e6: -case 0xd2e7: -case 0xd4e0: -case 0xd4e1: -case 0xd4e2: -case 0xd4e3: -case 0xd4e4: -case 0xd4e5: -case 0xd4e6: -case 0xd4e7: -case 0xd6e0: -case 0xd6e1: -case 0xd6e2: -case 0xd6e3: -case 0xd6e4: -case 0xd6e5: -case 0xd6e6: -case 0xd6e7: -case 0xd8e0: -case 0xd8e1: -case 0xd8e2: -case 0xd8e3: -case 0xd8e4: -case 0xd8e5: -case 0xd8e6: -case 0xd8e7: -case 0xdae0: -case 0xdae1: -case 0xdae2: -case 0xdae3: -case 0xdae4: -case 0xdae5: -case 0xdae6: -case 0xdae7: -case 0xdce0: -case 0xdce1: -case 0xdce2: -case 0xdce3: -case 0xdce4: -case 0xdce5: -case 0xdce6: -case 0xdce7: -case 0xdee0: -case 0xdee1: -case 0xdee2: -case 0xdee3: -case 0xdee4: -case 0xdee5: -case 0xdee6: -case 0xdee7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0e0: -case 0xb0e1: -case 0xb0e2: -case 0xb0e3: -case 0xb0e4: -case 0xb0e5: -case 0xb0e6: -case 0xb0e7: -case 0xb2e0: -case 0xb2e1: -case 0xb2e2: -case 0xb2e3: -case 0xb2e4: -case 0xb2e5: -case 0xb2e6: -case 0xb2e7: -case 0xb4e0: -case 0xb4e1: -case 0xb4e2: -case 0xb4e3: -case 0xb4e4: -case 0xb4e5: -case 0xb4e6: -case 0xb4e7: -case 0xb6e0: -case 0xb6e1: -case 0xb6e2: -case 0xb6e3: -case 0xb6e4: -case 0xb6e5: -case 0xb6e6: -case 0xb6e7: -case 0xb8e0: -case 0xb8e1: -case 0xb8e2: -case 0xb8e3: -case 0xb8e4: -case 0xb8e5: -case 0xb8e6: -case 0xb8e7: -case 0xbae0: -case 0xbae1: -case 0xbae2: -case 0xbae3: -case 0xbae4: -case 0xbae5: -case 0xbae6: -case 0xbae7: -case 0xbce0: -case 0xbce1: -case 0xbce2: -case 0xbce3: -case 0xbce4: -case 0xbce5: -case 0xbce6: -case 0xbce7: -case 0xbee0: -case 0xbee1: -case 0xbee2: -case 0xbee3: -case 0xbee4: -case 0xbee5: -case 0xbee6: -case 0xbee7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90e0: -case 0x90e1: -case 0x90e2: -case 0x90e3: -case 0x90e4: -case 0x90e5: -case 0x90e6: -case 0x90e7: -case 0x92e0: -case 0x92e1: -case 0x92e2: -case 0x92e3: -case 0x92e4: -case 0x92e5: -case 0x92e6: -case 0x92e7: -case 0x94e0: -case 0x94e1: -case 0x94e2: -case 0x94e3: -case 0x94e4: -case 0x94e5: -case 0x94e6: -case 0x94e7: -case 0x96e0: -case 0x96e1: -case 0x96e2: -case 0x96e3: -case 0x96e4: -case 0x96e5: -case 0x96e6: -case 0x96e7: -case 0x98e0: -case 0x98e1: -case 0x98e2: -case 0x98e3: -case 0x98e4: -case 0x98e5: -case 0x98e6: -case 0x98e7: -case 0x9ae0: -case 0x9ae1: -case 0x9ae2: -case 0x9ae3: -case 0x9ae4: -case 0x9ae5: -case 0x9ae6: -case 0x9ae7: -case 0x9ce0: -case 0x9ce1: -case 0x9ce2: -case 0x9ce3: -case 0x9ce4: -case 0x9ce5: -case 0x9ce6: -case 0x9ce7: -case 0x9ee0: -case 0x9ee1: -case 0x9ee2: -case 0x9ee3: -case 0x9ee4: -case 0x9ee5: -case 0x9ee6: -case 0x9ee7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x3060: -case 0x3061: -case 0x3062: -case 0x3063: -case 0x3064: -case 0x3065: -case 0x3066: -case 0x3067: -case 0x3260: -case 0x3261: -case 0x3262: -case 0x3263: -case 0x3264: -case 0x3265: -case 0x3266: -case 0x3267: -case 0x3460: -case 0x3461: -case 0x3462: -case 0x3463: -case 0x3464: -case 0x3465: -case 0x3466: -case 0x3467: -case 0x3660: -case 0x3661: -case 0x3662: -case 0x3663: -case 0x3664: -case 0x3665: -case 0x3666: -case 0x3667: -case 0x3860: -case 0x3861: -case 0x3862: -case 0x3863: -case 0x3864: -case 0x3865: -case 0x3866: -case 0x3867: -case 0x3a60: -case 0x3a61: -case 0x3a62: -case 0x3a63: -case 0x3a64: -case 0x3a65: -case 0x3a66: -case 0x3a67: -case 0x3c60: -case 0x3c61: -case 0x3c62: -case 0x3c63: -case 0x3c64: -case 0x3c65: -case 0x3c66: -case 0x3c67: -case 0x3e60: -case 0x3e61: -case 0x3e62: -case 0x3e63: -case 0x3e64: -case 0x3e65: -case 0x3e66: -case 0x3e67: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44e0: -case 0x44e1: -case 0x44e2: -case 0x44e3: -case 0x44e4: -case 0x44e5: -case 0x44e6: -case 0x44e7: - { - HAM src(this, instr_b2_b0); MOVE_to_CCR(src); - } - break; - -case 0xc1e0: -case 0xc1e1: -case 0xc1e2: -case 0xc1e3: -case 0xc1e4: -case 0xc1e5: -case 0xc1e6: -case 0xc1e7: -case 0xc3e0: -case 0xc3e1: -case 0xc3e2: -case 0xc3e3: -case 0xc3e4: -case 0xc3e5: -case 0xc3e6: -case 0xc3e7: -case 0xc5e0: -case 0xc5e1: -case 0xc5e2: -case 0xc5e3: -case 0xc5e4: -case 0xc5e5: -case 0xc5e6: -case 0xc5e7: -case 0xc7e0: -case 0xc7e1: -case 0xc7e2: -case 0xc7e3: -case 0xc7e4: -case 0xc7e5: -case 0xc7e6: -case 0xc7e7: -case 0xc9e0: -case 0xc9e1: -case 0xc9e2: -case 0xc9e3: -case 0xc9e4: -case 0xc9e5: -case 0xc9e6: -case 0xc9e7: -case 0xcbe0: -case 0xcbe1: -case 0xcbe2: -case 0xcbe3: -case 0xcbe4: -case 0xcbe5: -case 0xcbe6: -case 0xcbe7: -case 0xcde0: -case 0xcde1: -case 0xcde2: -case 0xcde3: -case 0xcde4: -case 0xcde5: -case 0xcde6: -case 0xcde7: -case 0xcfe0: -case 0xcfe1: -case 0xcfe2: -case 0xcfe3: -case 0xcfe4: -case 0xcfe5: -case 0xcfe6: -case 0xcfe7: - { - HAM src(this, instr_b2_b0); MULS(src, instr_b11_b9); - } - break; - -case 0xc0e0: -case 0xc0e1: -case 0xc0e2: -case 0xc0e3: -case 0xc0e4: -case 0xc0e5: -case 0xc0e6: -case 0xc0e7: -case 0xc2e0: -case 0xc2e1: -case 0xc2e2: -case 0xc2e3: -case 0xc2e4: -case 0xc2e5: -case 0xc2e6: -case 0xc2e7: -case 0xc4e0: -case 0xc4e1: -case 0xc4e2: -case 0xc4e3: -case 0xc4e4: -case 0xc4e5: -case 0xc4e6: -case 0xc4e7: -case 0xc6e0: -case 0xc6e1: -case 0xc6e2: -case 0xc6e3: -case 0xc6e4: -case 0xc6e5: -case 0xc6e6: -case 0xc6e7: -case 0xc8e0: -case 0xc8e1: -case 0xc8e2: -case 0xc8e3: -case 0xc8e4: -case 0xc8e5: -case 0xc8e6: -case 0xc8e7: -case 0xcae0: -case 0xcae1: -case 0xcae2: -case 0xcae3: -case 0xcae4: -case 0xcae5: -case 0xcae6: -case 0xcae7: -case 0xcce0: -case 0xcce1: -case 0xcce2: -case 0xcce3: -case 0xcce4: -case 0xcce5: -case 0xcce6: -case 0xcce7: -case 0xcee0: -case 0xcee1: -case 0xcee2: -case 0xcee3: -case 0xcee4: -case 0xcee5: -case 0xcee6: -case 0xcee7: - { - HAM src(this, instr_b2_b0); MULU(src, instr_b11_b9); - } - break; - -case 0xe1e0: -case 0xe1e1: -case 0xe1e2: -case 0xe1e3: -case 0xe1e4: -case 0xe1e5: -case 0xe1e6: -case 0xe1e7: - { - HAM targ(this, instr_b2_b0); ASL(targ, 1); - } - break; - -case 0xe0e0: -case 0xe0e1: -case 0xe0e2: -case 0xe0e3: -case 0xe0e4: -case 0xe0e5: -case 0xe0e6: -case 0xe0e7: - { - HAM targ(this, instr_b2_b0); ASR(targ, 1); - } - break; - -case 0xe3e0: -case 0xe3e1: -case 0xe3e2: -case 0xe3e3: -case 0xe3e4: -case 0xe3e5: -case 0xe3e6: -case 0xe3e7: - { - HAM targ(this, instr_b2_b0); LSL(targ, 1); - } - break; - -case 0xe2e0: -case 0xe2e1: -case 0xe2e2: -case 0xe2e3: -case 0xe2e4: -case 0xe2e5: -case 0xe2e6: -case 0xe2e7: - { - HAM targ(this, instr_b2_b0); LSR(targ, 1); - } - break; - -case 0xe7e0: -case 0xe7e1: -case 0xe7e2: -case 0xe7e3: -case 0xe7e4: -case 0xe7e5: -case 0xe7e6: -case 0xe7e7: - { - HAM targ(this, instr_b2_b0); ROL(targ, 1); - } - break; - -case 0xe6e0: -case 0xe6e1: -case 0xe6e2: -case 0xe6e3: -case 0xe6e4: -case 0xe6e5: -case 0xe6e6: -case 0xe6e7: - { - HAM targ(this, instr_b2_b0); ROR(targ, 1); - } - break; - -case 0xe5e0: -case 0xe5e1: -case 0xe5e2: -case 0xe5e3: -case 0xe5e4: -case 0xe5e5: -case 0xe5e6: -case 0xe5e7: - { - HAM targ(this, instr_b2_b0); ROXL(targ, 1); - } - break; - -case 0xe4e0: -case 0xe4e1: -case 0xe4e2: -case 0xe4e3: -case 0xe4e4: -case 0xe4e5: -case 0xe4e6: -case 0xe4e7: - { - HAM targ(this, instr_b2_b0); ROXR(targ, 1); - } - break; - -case 0x4240: -case 0x4241: -case 0x4242: -case 0x4243: -case 0x4244: -case 0x4245: -case 0x4246: -case 0x4247: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4880: -case 0x4881: -case 0x4882: -case 0x4883: -case 0x4884: -case 0x4885: -case 0x4886: -case 0x4887: - { - HAM dst(this, instr_b2_b0); EXT(dst); - } - break; - -case 0x4440: -case 0x4441: -case 0x4442: -case 0x4443: -case 0x4444: -case 0x4445: -case 0x4446: -case 0x4447: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4040: -case 0x4041: -case 0x4042: -case 0x4043: -case 0x4044: -case 0x4045: -case 0x4046: -case 0x4047: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4640: -case 0x4641: -case 0x4642: -case 0x4643: -case 0x4644: -case 0x4645: -case 0x4646: -case 0x4647: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4a40: -case 0x4a41: -case 0x4a42: -case 0x4a43: -case 0x4a44: -case 0x4a45: -case 0x4a46: -case 0x4a47: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0xd179: -case 0xd379: -case 0xd579: -case 0xd779: -case 0xd979: -case 0xdb79: -case 0xdd79: -case 0xdf79: - { - HAM src(this, instr_b11_b9); HAM dst(this); ADD(src, dst); - } - break; - -case 0xc179: -case 0xc379: -case 0xc579: -case 0xc779: -case 0xc979: -case 0xcb79: -case 0xcd79: -case 0xcf79: - { - HAM src(this, instr_b11_b9); HAM dst(this); AND(src, dst); - } - break; - -case 0xb179: -case 0xb379: -case 0xb579: -case 0xb779: -case 0xb979: -case 0xbb79: -case 0xbd79: -case 0xbf79: - { - HAM src(this, instr_b11_b9); HAM dst(this); EOR(src, dst); - } - break; - -case 0x8179: -case 0x8379: -case 0x8579: -case 0x8779: -case 0x8979: -case 0x8b79: -case 0x8d79: -case 0x8f79: - { - HAM src(this, instr_b11_b9); HAM dst(this); OR(src, dst); - } - break; - -case 0x9179: -case 0x9379: -case 0x9579: -case 0x9779: -case 0x9979: -case 0x9b79: -case 0x9d79: -case 0x9f79: - { - HAM src(this, instr_b11_b9); HAM dst(this); SUB(src, dst); - } - break; - -case 0xd178: -case 0xd378: -case 0xd578: -case 0xd778: -case 0xd978: -case 0xdb78: -case 0xdd78: -case 0xdf78: - { - HAM src(this, instr_b11_b9); HAM dst(this); ADD(src, dst); - } - break; - -case 0xc178: -case 0xc378: -case 0xc578: -case 0xc778: -case 0xc978: -case 0xcb78: -case 0xcd78: -case 0xcf78: - { - HAM src(this, instr_b11_b9); HAM dst(this); AND(src, dst); - } - break; - -case 0xb178: -case 0xb378: -case 0xb578: -case 0xb778: -case 0xb978: -case 0xbb78: -case 0xbd78: -case 0xbf78: - { - HAM src(this, instr_b11_b9); HAM dst(this); EOR(src, dst); - } - break; - -case 0x8178: -case 0x8378: -case 0x8578: -case 0x8778: -case 0x8978: -case 0x8b78: -case 0x8d78: -case 0x8f78: - { - HAM src(this, instr_b11_b9); HAM dst(this); OR(src, dst); - } - break; - -case 0x9178: -case 0x9378: -case 0x9578: -case 0x9778: -case 0x9978: -case 0x9b78: -case 0x9d78: -case 0x9f78: - { - HAM src(this, instr_b11_b9); HAM dst(this); SUB(src, dst); - } - break; - -case 0xd150: -case 0xd151: -case 0xd152: -case 0xd153: -case 0xd154: -case 0xd155: -case 0xd156: -case 0xd157: -case 0xd350: -case 0xd351: -case 0xd352: -case 0xd353: -case 0xd354: -case 0xd355: -case 0xd356: -case 0xd357: -case 0xd550: -case 0xd551: -case 0xd552: -case 0xd553: -case 0xd554: -case 0xd555: -case 0xd556: -case 0xd557: -case 0xd750: -case 0xd751: -case 0xd752: -case 0xd753: -case 0xd754: -case 0xd755: -case 0xd756: -case 0xd757: -case 0xd950: -case 0xd951: -case 0xd952: -case 0xd953: -case 0xd954: -case 0xd955: -case 0xd956: -case 0xd957: -case 0xdb50: -case 0xdb51: -case 0xdb52: -case 0xdb53: -case 0xdb54: -case 0xdb55: -case 0xdb56: -case 0xdb57: -case 0xdd50: -case 0xdd51: -case 0xdd52: -case 0xdd53: -case 0xdd54: -case 0xdd55: -case 0xdd56: -case 0xdd57: -case 0xdf50: -case 0xdf51: -case 0xdf52: -case 0xdf53: -case 0xdf54: -case 0xdf55: -case 0xdf56: -case 0xdf57: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc150: -case 0xc151: -case 0xc152: -case 0xc153: -case 0xc154: -case 0xc155: -case 0xc156: -case 0xc157: -case 0xc350: -case 0xc351: -case 0xc352: -case 0xc353: -case 0xc354: -case 0xc355: -case 0xc356: -case 0xc357: -case 0xc550: -case 0xc551: -case 0xc552: -case 0xc553: -case 0xc554: -case 0xc555: -case 0xc556: -case 0xc557: -case 0xc750: -case 0xc751: -case 0xc752: -case 0xc753: -case 0xc754: -case 0xc755: -case 0xc756: -case 0xc757: -case 0xc950: -case 0xc951: -case 0xc952: -case 0xc953: -case 0xc954: -case 0xc955: -case 0xc956: -case 0xc957: -case 0xcb50: -case 0xcb51: -case 0xcb52: -case 0xcb53: -case 0xcb54: -case 0xcb55: -case 0xcb56: -case 0xcb57: -case 0xcd50: -case 0xcd51: -case 0xcd52: -case 0xcd53: -case 0xcd54: -case 0xcd55: -case 0xcd56: -case 0xcd57: -case 0xcf50: -case 0xcf51: -case 0xcf52: -case 0xcf53: -case 0xcf54: -case 0xcf55: -case 0xcf56: -case 0xcf57: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb150: -case 0xb151: -case 0xb152: -case 0xb153: -case 0xb154: -case 0xb155: -case 0xb156: -case 0xb157: -case 0xb350: -case 0xb351: -case 0xb352: -case 0xb353: -case 0xb354: -case 0xb355: -case 0xb356: -case 0xb357: -case 0xb550: -case 0xb551: -case 0xb552: -case 0xb553: -case 0xb554: -case 0xb555: -case 0xb556: -case 0xb557: -case 0xb750: -case 0xb751: -case 0xb752: -case 0xb753: -case 0xb754: -case 0xb755: -case 0xb756: -case 0xb757: -case 0xb950: -case 0xb951: -case 0xb952: -case 0xb953: -case 0xb954: -case 0xb955: -case 0xb956: -case 0xb957: -case 0xbb50: -case 0xbb51: -case 0xbb52: -case 0xbb53: -case 0xbb54: -case 0xbb55: -case 0xbb56: -case 0xbb57: -case 0xbd50: -case 0xbd51: -case 0xbd52: -case 0xbd53: -case 0xbd54: -case 0xbd55: -case 0xbd56: -case 0xbd57: -case 0xbf50: -case 0xbf51: -case 0xbf52: -case 0xbf53: -case 0xbf54: -case 0xbf55: -case 0xbf56: -case 0xbf57: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8150: -case 0x8151: -case 0x8152: -case 0x8153: -case 0x8154: -case 0x8155: -case 0x8156: -case 0x8157: -case 0x8350: -case 0x8351: -case 0x8352: -case 0x8353: -case 0x8354: -case 0x8355: -case 0x8356: -case 0x8357: -case 0x8550: -case 0x8551: -case 0x8552: -case 0x8553: -case 0x8554: -case 0x8555: -case 0x8556: -case 0x8557: -case 0x8750: -case 0x8751: -case 0x8752: -case 0x8753: -case 0x8754: -case 0x8755: -case 0x8756: -case 0x8757: -case 0x8950: -case 0x8951: -case 0x8952: -case 0x8953: -case 0x8954: -case 0x8955: -case 0x8956: -case 0x8957: -case 0x8b50: -case 0x8b51: -case 0x8b52: -case 0x8b53: -case 0x8b54: -case 0x8b55: -case 0x8b56: -case 0x8b57: -case 0x8d50: -case 0x8d51: -case 0x8d52: -case 0x8d53: -case 0x8d54: -case 0x8d55: -case 0x8d56: -case 0x8d57: -case 0x8f50: -case 0x8f51: -case 0x8f52: -case 0x8f53: -case 0x8f54: -case 0x8f55: -case 0x8f56: -case 0x8f57: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9150: -case 0x9151: -case 0x9152: -case 0x9153: -case 0x9154: -case 0x9155: -case 0x9156: -case 0x9157: -case 0x9350: -case 0x9351: -case 0x9352: -case 0x9353: -case 0x9354: -case 0x9355: -case 0x9356: -case 0x9357: -case 0x9550: -case 0x9551: -case 0x9552: -case 0x9553: -case 0x9554: -case 0x9555: -case 0x9556: -case 0x9557: -case 0x9750: -case 0x9751: -case 0x9752: -case 0x9753: -case 0x9754: -case 0x9755: -case 0x9756: -case 0x9757: -case 0x9950: -case 0x9951: -case 0x9952: -case 0x9953: -case 0x9954: -case 0x9955: -case 0x9956: -case 0x9957: -case 0x9b50: -case 0x9b51: -case 0x9b52: -case 0x9b53: -case 0x9b54: -case 0x9b55: -case 0x9b56: -case 0x9b57: -case 0x9d50: -case 0x9d51: -case 0x9d52: -case 0x9d53: -case 0x9d54: -case 0x9d55: -case 0x9d56: -case 0x9d57: -case 0x9f50: -case 0x9f51: -case 0x9f52: -case 0x9f53: -case 0x9f54: -case 0x9f55: -case 0x9f56: -case 0x9f57: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd168: -case 0xd169: -case 0xd16a: -case 0xd16b: -case 0xd16c: -case 0xd16d: -case 0xd16e: -case 0xd16f: -case 0xd368: -case 0xd369: -case 0xd36a: -case 0xd36b: -case 0xd36c: -case 0xd36d: -case 0xd36e: -case 0xd36f: -case 0xd568: -case 0xd569: -case 0xd56a: -case 0xd56b: -case 0xd56c: -case 0xd56d: -case 0xd56e: -case 0xd56f: -case 0xd768: -case 0xd769: -case 0xd76a: -case 0xd76b: -case 0xd76c: -case 0xd76d: -case 0xd76e: -case 0xd76f: -case 0xd968: -case 0xd969: -case 0xd96a: -case 0xd96b: -case 0xd96c: -case 0xd96d: -case 0xd96e: -case 0xd96f: -case 0xdb68: -case 0xdb69: -case 0xdb6a: -case 0xdb6b: -case 0xdb6c: -case 0xdb6d: -case 0xdb6e: -case 0xdb6f: -case 0xdd68: -case 0xdd69: -case 0xdd6a: -case 0xdd6b: -case 0xdd6c: -case 0xdd6d: -case 0xdd6e: -case 0xdd6f: -case 0xdf68: -case 0xdf69: -case 0xdf6a: -case 0xdf6b: -case 0xdf6c: -case 0xdf6d: -case 0xdf6e: -case 0xdf6f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc168: -case 0xc169: -case 0xc16a: -case 0xc16b: -case 0xc16c: -case 0xc16d: -case 0xc16e: -case 0xc16f: -case 0xc368: -case 0xc369: -case 0xc36a: -case 0xc36b: -case 0xc36c: -case 0xc36d: -case 0xc36e: -case 0xc36f: -case 0xc568: -case 0xc569: -case 0xc56a: -case 0xc56b: -case 0xc56c: -case 0xc56d: -case 0xc56e: -case 0xc56f: -case 0xc768: -case 0xc769: -case 0xc76a: -case 0xc76b: -case 0xc76c: -case 0xc76d: -case 0xc76e: -case 0xc76f: -case 0xc968: -case 0xc969: -case 0xc96a: -case 0xc96b: -case 0xc96c: -case 0xc96d: -case 0xc96e: -case 0xc96f: -case 0xcb68: -case 0xcb69: -case 0xcb6a: -case 0xcb6b: -case 0xcb6c: -case 0xcb6d: -case 0xcb6e: -case 0xcb6f: -case 0xcd68: -case 0xcd69: -case 0xcd6a: -case 0xcd6b: -case 0xcd6c: -case 0xcd6d: -case 0xcd6e: -case 0xcd6f: -case 0xcf68: -case 0xcf69: -case 0xcf6a: -case 0xcf6b: -case 0xcf6c: -case 0xcf6d: -case 0xcf6e: -case 0xcf6f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb168: -case 0xb169: -case 0xb16a: -case 0xb16b: -case 0xb16c: -case 0xb16d: -case 0xb16e: -case 0xb16f: -case 0xb368: -case 0xb369: -case 0xb36a: -case 0xb36b: -case 0xb36c: -case 0xb36d: -case 0xb36e: -case 0xb36f: -case 0xb568: -case 0xb569: -case 0xb56a: -case 0xb56b: -case 0xb56c: -case 0xb56d: -case 0xb56e: -case 0xb56f: -case 0xb768: -case 0xb769: -case 0xb76a: -case 0xb76b: -case 0xb76c: -case 0xb76d: -case 0xb76e: -case 0xb76f: -case 0xb968: -case 0xb969: -case 0xb96a: -case 0xb96b: -case 0xb96c: -case 0xb96d: -case 0xb96e: -case 0xb96f: -case 0xbb68: -case 0xbb69: -case 0xbb6a: -case 0xbb6b: -case 0xbb6c: -case 0xbb6d: -case 0xbb6e: -case 0xbb6f: -case 0xbd68: -case 0xbd69: -case 0xbd6a: -case 0xbd6b: -case 0xbd6c: -case 0xbd6d: -case 0xbd6e: -case 0xbd6f: -case 0xbf68: -case 0xbf69: -case 0xbf6a: -case 0xbf6b: -case 0xbf6c: -case 0xbf6d: -case 0xbf6e: -case 0xbf6f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8168: -case 0x8169: -case 0x816a: -case 0x816b: -case 0x816c: -case 0x816d: -case 0x816e: -case 0x816f: -case 0x8368: -case 0x8369: -case 0x836a: -case 0x836b: -case 0x836c: -case 0x836d: -case 0x836e: -case 0x836f: -case 0x8568: -case 0x8569: -case 0x856a: -case 0x856b: -case 0x856c: -case 0x856d: -case 0x856e: -case 0x856f: -case 0x8768: -case 0x8769: -case 0x876a: -case 0x876b: -case 0x876c: -case 0x876d: -case 0x876e: -case 0x876f: -case 0x8968: -case 0x8969: -case 0x896a: -case 0x896b: -case 0x896c: -case 0x896d: -case 0x896e: -case 0x896f: -case 0x8b68: -case 0x8b69: -case 0x8b6a: -case 0x8b6b: -case 0x8b6c: -case 0x8b6d: -case 0x8b6e: -case 0x8b6f: -case 0x8d68: -case 0x8d69: -case 0x8d6a: -case 0x8d6b: -case 0x8d6c: -case 0x8d6d: -case 0x8d6e: -case 0x8d6f: -case 0x8f68: -case 0x8f69: -case 0x8f6a: -case 0x8f6b: -case 0x8f6c: -case 0x8f6d: -case 0x8f6e: -case 0x8f6f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9168: -case 0x9169: -case 0x916a: -case 0x916b: -case 0x916c: -case 0x916d: -case 0x916e: -case 0x916f: -case 0x9368: -case 0x9369: -case 0x936a: -case 0x936b: -case 0x936c: -case 0x936d: -case 0x936e: -case 0x936f: -case 0x9568: -case 0x9569: -case 0x956a: -case 0x956b: -case 0x956c: -case 0x956d: -case 0x956e: -case 0x956f: -case 0x9768: -case 0x9769: -case 0x976a: -case 0x976b: -case 0x976c: -case 0x976d: -case 0x976e: -case 0x976f: -case 0x9968: -case 0x9969: -case 0x996a: -case 0x996b: -case 0x996c: -case 0x996d: -case 0x996e: -case 0x996f: -case 0x9b68: -case 0x9b69: -case 0x9b6a: -case 0x9b6b: -case 0x9b6c: -case 0x9b6d: -case 0x9b6e: -case 0x9b6f: -case 0x9d68: -case 0x9d69: -case 0x9d6a: -case 0x9d6b: -case 0x9d6c: -case 0x9d6d: -case 0x9d6e: -case 0x9d6f: -case 0x9f68: -case 0x9f69: -case 0x9f6a: -case 0x9f6b: -case 0x9f6c: -case 0x9f6d: -case 0x9f6e: -case 0x9f6f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd170: -case 0xd171: -case 0xd172: -case 0xd173: -case 0xd174: -case 0xd175: -case 0xd176: -case 0xd177: -case 0xd370: -case 0xd371: -case 0xd372: -case 0xd373: -case 0xd374: -case 0xd375: -case 0xd376: -case 0xd377: -case 0xd570: -case 0xd571: -case 0xd572: -case 0xd573: -case 0xd574: -case 0xd575: -case 0xd576: -case 0xd577: -case 0xd770: -case 0xd771: -case 0xd772: -case 0xd773: -case 0xd774: -case 0xd775: -case 0xd776: -case 0xd777: -case 0xd970: -case 0xd971: -case 0xd972: -case 0xd973: -case 0xd974: -case 0xd975: -case 0xd976: -case 0xd977: -case 0xdb70: -case 0xdb71: -case 0xdb72: -case 0xdb73: -case 0xdb74: -case 0xdb75: -case 0xdb76: -case 0xdb77: -case 0xdd70: -case 0xdd71: -case 0xdd72: -case 0xdd73: -case 0xdd74: -case 0xdd75: -case 0xdd76: -case 0xdd77: -case 0xdf70: -case 0xdf71: -case 0xdf72: -case 0xdf73: -case 0xdf74: -case 0xdf75: -case 0xdf76: -case 0xdf77: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc170: -case 0xc171: -case 0xc172: -case 0xc173: -case 0xc174: -case 0xc175: -case 0xc176: -case 0xc177: -case 0xc370: -case 0xc371: -case 0xc372: -case 0xc373: -case 0xc374: -case 0xc375: -case 0xc376: -case 0xc377: -case 0xc570: -case 0xc571: -case 0xc572: -case 0xc573: -case 0xc574: -case 0xc575: -case 0xc576: -case 0xc577: -case 0xc770: -case 0xc771: -case 0xc772: -case 0xc773: -case 0xc774: -case 0xc775: -case 0xc776: -case 0xc777: -case 0xc970: -case 0xc971: -case 0xc972: -case 0xc973: -case 0xc974: -case 0xc975: -case 0xc976: -case 0xc977: -case 0xcb70: -case 0xcb71: -case 0xcb72: -case 0xcb73: -case 0xcb74: -case 0xcb75: -case 0xcb76: -case 0xcb77: -case 0xcd70: -case 0xcd71: -case 0xcd72: -case 0xcd73: -case 0xcd74: -case 0xcd75: -case 0xcd76: -case 0xcd77: -case 0xcf70: -case 0xcf71: -case 0xcf72: -case 0xcf73: -case 0xcf74: -case 0xcf75: -case 0xcf76: -case 0xcf77: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb170: -case 0xb171: -case 0xb172: -case 0xb173: -case 0xb174: -case 0xb175: -case 0xb176: -case 0xb177: -case 0xb370: -case 0xb371: -case 0xb372: -case 0xb373: -case 0xb374: -case 0xb375: -case 0xb376: -case 0xb377: -case 0xb570: -case 0xb571: -case 0xb572: -case 0xb573: -case 0xb574: -case 0xb575: -case 0xb576: -case 0xb577: -case 0xb770: -case 0xb771: -case 0xb772: -case 0xb773: -case 0xb774: -case 0xb775: -case 0xb776: -case 0xb777: -case 0xb970: -case 0xb971: -case 0xb972: -case 0xb973: -case 0xb974: -case 0xb975: -case 0xb976: -case 0xb977: -case 0xbb70: -case 0xbb71: -case 0xbb72: -case 0xbb73: -case 0xbb74: -case 0xbb75: -case 0xbb76: -case 0xbb77: -case 0xbd70: -case 0xbd71: -case 0xbd72: -case 0xbd73: -case 0xbd74: -case 0xbd75: -case 0xbd76: -case 0xbd77: -case 0xbf70: -case 0xbf71: -case 0xbf72: -case 0xbf73: -case 0xbf74: -case 0xbf75: -case 0xbf76: -case 0xbf77: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8170: -case 0x8171: -case 0x8172: -case 0x8173: -case 0x8174: -case 0x8175: -case 0x8176: -case 0x8177: -case 0x8370: -case 0x8371: -case 0x8372: -case 0x8373: -case 0x8374: -case 0x8375: -case 0x8376: -case 0x8377: -case 0x8570: -case 0x8571: -case 0x8572: -case 0x8573: -case 0x8574: -case 0x8575: -case 0x8576: -case 0x8577: -case 0x8770: -case 0x8771: -case 0x8772: -case 0x8773: -case 0x8774: -case 0x8775: -case 0x8776: -case 0x8777: -case 0x8970: -case 0x8971: -case 0x8972: -case 0x8973: -case 0x8974: -case 0x8975: -case 0x8976: -case 0x8977: -case 0x8b70: -case 0x8b71: -case 0x8b72: -case 0x8b73: -case 0x8b74: -case 0x8b75: -case 0x8b76: -case 0x8b77: -case 0x8d70: -case 0x8d71: -case 0x8d72: -case 0x8d73: -case 0x8d74: -case 0x8d75: -case 0x8d76: -case 0x8d77: -case 0x8f70: -case 0x8f71: -case 0x8f72: -case 0x8f73: -case 0x8f74: -case 0x8f75: -case 0x8f76: -case 0x8f77: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9170: -case 0x9171: -case 0x9172: -case 0x9173: -case 0x9174: -case 0x9175: -case 0x9176: -case 0x9177: -case 0x9370: -case 0x9371: -case 0x9372: -case 0x9373: -case 0x9374: -case 0x9375: -case 0x9376: -case 0x9377: -case 0x9570: -case 0x9571: -case 0x9572: -case 0x9573: -case 0x9574: -case 0x9575: -case 0x9576: -case 0x9577: -case 0x9770: -case 0x9771: -case 0x9772: -case 0x9773: -case 0x9774: -case 0x9775: -case 0x9776: -case 0x9777: -case 0x9970: -case 0x9971: -case 0x9972: -case 0x9973: -case 0x9974: -case 0x9975: -case 0x9976: -case 0x9977: -case 0x9b70: -case 0x9b71: -case 0x9b72: -case 0x9b73: -case 0x9b74: -case 0x9b75: -case 0x9b76: -case 0x9b77: -case 0x9d70: -case 0x9d71: -case 0x9d72: -case 0x9d73: -case 0x9d74: -case 0x9d75: -case 0x9d76: -case 0x9d77: -case 0x9f70: -case 0x9f71: -case 0x9f72: -case 0x9f73: -case 0x9f74: -case 0x9f75: -case 0x9f76: -case 0x9f77: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd158: -case 0xd159: -case 0xd15a: -case 0xd15b: -case 0xd15c: -case 0xd15d: -case 0xd15e: -case 0xd15f: -case 0xd358: -case 0xd359: -case 0xd35a: -case 0xd35b: -case 0xd35c: -case 0xd35d: -case 0xd35e: -case 0xd35f: -case 0xd558: -case 0xd559: -case 0xd55a: -case 0xd55b: -case 0xd55c: -case 0xd55d: -case 0xd55e: -case 0xd55f: -case 0xd758: -case 0xd759: -case 0xd75a: -case 0xd75b: -case 0xd75c: -case 0xd75d: -case 0xd75e: -case 0xd75f: -case 0xd958: -case 0xd959: -case 0xd95a: -case 0xd95b: -case 0xd95c: -case 0xd95d: -case 0xd95e: -case 0xd95f: -case 0xdb58: -case 0xdb59: -case 0xdb5a: -case 0xdb5b: -case 0xdb5c: -case 0xdb5d: -case 0xdb5e: -case 0xdb5f: -case 0xdd58: -case 0xdd59: -case 0xdd5a: -case 0xdd5b: -case 0xdd5c: -case 0xdd5d: -case 0xdd5e: -case 0xdd5f: -case 0xdf58: -case 0xdf59: -case 0xdf5a: -case 0xdf5b: -case 0xdf5c: -case 0xdf5d: -case 0xdf5e: -case 0xdf5f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc158: -case 0xc159: -case 0xc15a: -case 0xc15b: -case 0xc15c: -case 0xc15d: -case 0xc15e: -case 0xc15f: -case 0xc358: -case 0xc359: -case 0xc35a: -case 0xc35b: -case 0xc35c: -case 0xc35d: -case 0xc35e: -case 0xc35f: -case 0xc558: -case 0xc559: -case 0xc55a: -case 0xc55b: -case 0xc55c: -case 0xc55d: -case 0xc55e: -case 0xc55f: -case 0xc758: -case 0xc759: -case 0xc75a: -case 0xc75b: -case 0xc75c: -case 0xc75d: -case 0xc75e: -case 0xc75f: -case 0xc958: -case 0xc959: -case 0xc95a: -case 0xc95b: -case 0xc95c: -case 0xc95d: -case 0xc95e: -case 0xc95f: -case 0xcb58: -case 0xcb59: -case 0xcb5a: -case 0xcb5b: -case 0xcb5c: -case 0xcb5d: -case 0xcb5e: -case 0xcb5f: -case 0xcd58: -case 0xcd59: -case 0xcd5a: -case 0xcd5b: -case 0xcd5c: -case 0xcd5d: -case 0xcd5e: -case 0xcd5f: -case 0xcf58: -case 0xcf59: -case 0xcf5a: -case 0xcf5b: -case 0xcf5c: -case 0xcf5d: -case 0xcf5e: -case 0xcf5f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb158: -case 0xb159: -case 0xb15a: -case 0xb15b: -case 0xb15c: -case 0xb15d: -case 0xb15e: -case 0xb15f: -case 0xb358: -case 0xb359: -case 0xb35a: -case 0xb35b: -case 0xb35c: -case 0xb35d: -case 0xb35e: -case 0xb35f: -case 0xb558: -case 0xb559: -case 0xb55a: -case 0xb55b: -case 0xb55c: -case 0xb55d: -case 0xb55e: -case 0xb55f: -case 0xb758: -case 0xb759: -case 0xb75a: -case 0xb75b: -case 0xb75c: -case 0xb75d: -case 0xb75e: -case 0xb75f: -case 0xb958: -case 0xb959: -case 0xb95a: -case 0xb95b: -case 0xb95c: -case 0xb95d: -case 0xb95e: -case 0xb95f: -case 0xbb58: -case 0xbb59: -case 0xbb5a: -case 0xbb5b: -case 0xbb5c: -case 0xbb5d: -case 0xbb5e: -case 0xbb5f: -case 0xbd58: -case 0xbd59: -case 0xbd5a: -case 0xbd5b: -case 0xbd5c: -case 0xbd5d: -case 0xbd5e: -case 0xbd5f: -case 0xbf58: -case 0xbf59: -case 0xbf5a: -case 0xbf5b: -case 0xbf5c: -case 0xbf5d: -case 0xbf5e: -case 0xbf5f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8158: -case 0x8159: -case 0x815a: -case 0x815b: -case 0x815c: -case 0x815d: -case 0x815e: -case 0x815f: -case 0x8358: -case 0x8359: -case 0x835a: -case 0x835b: -case 0x835c: -case 0x835d: -case 0x835e: -case 0x835f: -case 0x8558: -case 0x8559: -case 0x855a: -case 0x855b: -case 0x855c: -case 0x855d: -case 0x855e: -case 0x855f: -case 0x8758: -case 0x8759: -case 0x875a: -case 0x875b: -case 0x875c: -case 0x875d: -case 0x875e: -case 0x875f: -case 0x8958: -case 0x8959: -case 0x895a: -case 0x895b: -case 0x895c: -case 0x895d: -case 0x895e: -case 0x895f: -case 0x8b58: -case 0x8b59: -case 0x8b5a: -case 0x8b5b: -case 0x8b5c: -case 0x8b5d: -case 0x8b5e: -case 0x8b5f: -case 0x8d58: -case 0x8d59: -case 0x8d5a: -case 0x8d5b: -case 0x8d5c: -case 0x8d5d: -case 0x8d5e: -case 0x8d5f: -case 0x8f58: -case 0x8f59: -case 0x8f5a: -case 0x8f5b: -case 0x8f5c: -case 0x8f5d: -case 0x8f5e: -case 0x8f5f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9158: -case 0x9159: -case 0x915a: -case 0x915b: -case 0x915c: -case 0x915d: -case 0x915e: -case 0x915f: -case 0x9358: -case 0x9359: -case 0x935a: -case 0x935b: -case 0x935c: -case 0x935d: -case 0x935e: -case 0x935f: -case 0x9558: -case 0x9559: -case 0x955a: -case 0x955b: -case 0x955c: -case 0x955d: -case 0x955e: -case 0x955f: -case 0x9758: -case 0x9759: -case 0x975a: -case 0x975b: -case 0x975c: -case 0x975d: -case 0x975e: -case 0x975f: -case 0x9958: -case 0x9959: -case 0x995a: -case 0x995b: -case 0x995c: -case 0x995d: -case 0x995e: -case 0x995f: -case 0x9b58: -case 0x9b59: -case 0x9b5a: -case 0x9b5b: -case 0x9b5c: -case 0x9b5d: -case 0x9b5e: -case 0x9b5f: -case 0x9d58: -case 0x9d59: -case 0x9d5a: -case 0x9d5b: -case 0x9d5c: -case 0x9d5d: -case 0x9d5e: -case 0x9d5f: -case 0x9f58: -case 0x9f59: -case 0x9f5a: -case 0x9f5b: -case 0x9f5c: -case 0x9f5d: -case 0x9f5e: -case 0x9f5f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd160: -case 0xd161: -case 0xd162: -case 0xd163: -case 0xd164: -case 0xd165: -case 0xd166: -case 0xd167: -case 0xd360: -case 0xd361: -case 0xd362: -case 0xd363: -case 0xd364: -case 0xd365: -case 0xd366: -case 0xd367: -case 0xd560: -case 0xd561: -case 0xd562: -case 0xd563: -case 0xd564: -case 0xd565: -case 0xd566: -case 0xd567: -case 0xd760: -case 0xd761: -case 0xd762: -case 0xd763: -case 0xd764: -case 0xd765: -case 0xd766: -case 0xd767: -case 0xd960: -case 0xd961: -case 0xd962: -case 0xd963: -case 0xd964: -case 0xd965: -case 0xd966: -case 0xd967: -case 0xdb60: -case 0xdb61: -case 0xdb62: -case 0xdb63: -case 0xdb64: -case 0xdb65: -case 0xdb66: -case 0xdb67: -case 0xdd60: -case 0xdd61: -case 0xdd62: -case 0xdd63: -case 0xdd64: -case 0xdd65: -case 0xdd66: -case 0xdd67: -case 0xdf60: -case 0xdf61: -case 0xdf62: -case 0xdf63: -case 0xdf64: -case 0xdf65: -case 0xdf66: -case 0xdf67: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc160: -case 0xc161: -case 0xc162: -case 0xc163: -case 0xc164: -case 0xc165: -case 0xc166: -case 0xc167: -case 0xc360: -case 0xc361: -case 0xc362: -case 0xc363: -case 0xc364: -case 0xc365: -case 0xc366: -case 0xc367: -case 0xc560: -case 0xc561: -case 0xc562: -case 0xc563: -case 0xc564: -case 0xc565: -case 0xc566: -case 0xc567: -case 0xc760: -case 0xc761: -case 0xc762: -case 0xc763: -case 0xc764: -case 0xc765: -case 0xc766: -case 0xc767: -case 0xc960: -case 0xc961: -case 0xc962: -case 0xc963: -case 0xc964: -case 0xc965: -case 0xc966: -case 0xc967: -case 0xcb60: -case 0xcb61: -case 0xcb62: -case 0xcb63: -case 0xcb64: -case 0xcb65: -case 0xcb66: -case 0xcb67: -case 0xcd60: -case 0xcd61: -case 0xcd62: -case 0xcd63: -case 0xcd64: -case 0xcd65: -case 0xcd66: -case 0xcd67: -case 0xcf60: -case 0xcf61: -case 0xcf62: -case 0xcf63: -case 0xcf64: -case 0xcf65: -case 0xcf66: -case 0xcf67: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb160: -case 0xb161: -case 0xb162: -case 0xb163: -case 0xb164: -case 0xb165: -case 0xb166: -case 0xb167: -case 0xb360: -case 0xb361: -case 0xb362: -case 0xb363: -case 0xb364: -case 0xb365: -case 0xb366: -case 0xb367: -case 0xb560: -case 0xb561: -case 0xb562: -case 0xb563: -case 0xb564: -case 0xb565: -case 0xb566: -case 0xb567: -case 0xb760: -case 0xb761: -case 0xb762: -case 0xb763: -case 0xb764: -case 0xb765: -case 0xb766: -case 0xb767: -case 0xb960: -case 0xb961: -case 0xb962: -case 0xb963: -case 0xb964: -case 0xb965: -case 0xb966: -case 0xb967: -case 0xbb60: -case 0xbb61: -case 0xbb62: -case 0xbb63: -case 0xbb64: -case 0xbb65: -case 0xbb66: -case 0xbb67: -case 0xbd60: -case 0xbd61: -case 0xbd62: -case 0xbd63: -case 0xbd64: -case 0xbd65: -case 0xbd66: -case 0xbd67: -case 0xbf60: -case 0xbf61: -case 0xbf62: -case 0xbf63: -case 0xbf64: -case 0xbf65: -case 0xbf66: -case 0xbf67: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8160: -case 0x8161: -case 0x8162: -case 0x8163: -case 0x8164: -case 0x8165: -case 0x8166: -case 0x8167: -case 0x8360: -case 0x8361: -case 0x8362: -case 0x8363: -case 0x8364: -case 0x8365: -case 0x8366: -case 0x8367: -case 0x8560: -case 0x8561: -case 0x8562: -case 0x8563: -case 0x8564: -case 0x8565: -case 0x8566: -case 0x8567: -case 0x8760: -case 0x8761: -case 0x8762: -case 0x8763: -case 0x8764: -case 0x8765: -case 0x8766: -case 0x8767: -case 0x8960: -case 0x8961: -case 0x8962: -case 0x8963: -case 0x8964: -case 0x8965: -case 0x8966: -case 0x8967: -case 0x8b60: -case 0x8b61: -case 0x8b62: -case 0x8b63: -case 0x8b64: -case 0x8b65: -case 0x8b66: -case 0x8b67: -case 0x8d60: -case 0x8d61: -case 0x8d62: -case 0x8d63: -case 0x8d64: -case 0x8d65: -case 0x8d66: -case 0x8d67: -case 0x8f60: -case 0x8f61: -case 0x8f62: -case 0x8f63: -case 0x8f64: -case 0x8f65: -case 0x8f66: -case 0x8f67: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9160: -case 0x9161: -case 0x9162: -case 0x9163: -case 0x9164: -case 0x9165: -case 0x9166: -case 0x9167: -case 0x9360: -case 0x9361: -case 0x9362: -case 0x9363: -case 0x9364: -case 0x9365: -case 0x9366: -case 0x9367: -case 0x9560: -case 0x9561: -case 0x9562: -case 0x9563: -case 0x9564: -case 0x9565: -case 0x9566: -case 0x9567: -case 0x9760: -case 0x9761: -case 0x9762: -case 0x9763: -case 0x9764: -case 0x9765: -case 0x9766: -case 0x9767: -case 0x9960: -case 0x9961: -case 0x9962: -case 0x9963: -case 0x9964: -case 0x9965: -case 0x9966: -case 0x9967: -case 0x9b60: -case 0x9b61: -case 0x9b62: -case 0x9b63: -case 0x9b64: -case 0x9b65: -case 0x9b66: -case 0x9b67: -case 0x9d60: -case 0x9d61: -case 0x9d62: -case 0x9d63: -case 0x9d64: -case 0x9d65: -case 0x9d66: -case 0x9d67: -case 0x9f60: -case 0x9f61: -case 0x9f62: -case 0x9f63: -case 0x9f64: -case 0x9f65: -case 0x9f66: -case 0x9f67: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xb140: -case 0xb141: -case 0xb142: -case 0xb143: -case 0xb144: -case 0xb145: -case 0xb146: -case 0xb147: -case 0xb340: -case 0xb341: -case 0xb342: -case 0xb343: -case 0xb344: -case 0xb345: -case 0xb346: -case 0xb347: -case 0xb540: -case 0xb541: -case 0xb542: -case 0xb543: -case 0xb544: -case 0xb545: -case 0xb546: -case 0xb547: -case 0xb740: -case 0xb741: -case 0xb742: -case 0xb743: -case 0xb744: -case 0xb745: -case 0xb746: -case 0xb747: -case 0xb940: -case 0xb941: -case 0xb942: -case 0xb943: -case 0xb944: -case 0xb945: -case 0xb946: -case 0xb947: -case 0xbb40: -case 0xbb41: -case 0xbb42: -case 0xbb43: -case 0xbb44: -case 0xbb45: -case 0xbb46: -case 0xbb47: -case 0xbd40: -case 0xbd41: -case 0xbd42: -case 0xbd43: -case 0xbd44: -case 0xbd45: -case 0xbd46: -case 0xbd47: -case 0xbf40: -case 0xbf41: -case 0xbf42: -case 0xbf43: -case 0xbf44: -case 0xbf45: -case 0xbf46: -case 0xbf47: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x81c0: -case 0x81c1: -case 0x81c2: -case 0x81c3: -case 0x81c4: -case 0x81c5: -case 0x81c6: -case 0x81c7: -case 0x83c0: -case 0x83c1: -case 0x83c2: -case 0x83c3: -case 0x83c4: -case 0x83c5: -case 0x83c6: -case 0x83c7: -case 0x85c0: -case 0x85c1: -case 0x85c2: -case 0x85c3: -case 0x85c4: -case 0x85c5: -case 0x85c6: -case 0x85c7: -case 0x87c0: -case 0x87c1: -case 0x87c2: -case 0x87c3: -case 0x87c4: -case 0x87c5: -case 0x87c6: -case 0x87c7: -case 0x89c0: -case 0x89c1: -case 0x89c2: -case 0x89c3: -case 0x89c4: -case 0x89c5: -case 0x89c6: -case 0x89c7: -case 0x8bc0: -case 0x8bc1: -case 0x8bc2: -case 0x8bc3: -case 0x8bc4: -case 0x8bc5: -case 0x8bc6: -case 0x8bc7: -case 0x8dc0: -case 0x8dc1: -case 0x8dc2: -case 0x8dc3: -case 0x8dc4: -case 0x8dc5: -case 0x8dc6: -case 0x8dc7: -case 0x8fc0: -case 0x8fc1: -case 0x8fc2: -case 0x8fc3: -case 0x8fc4: -case 0x8fc5: -case 0x8fc6: -case 0x8fc7: - { - HAM src(this, instr_b2_b0); DIVS(src, instr_b11_b9); - } - break; - -case 0x80c0: -case 0x80c1: -case 0x80c2: -case 0x80c3: -case 0x80c4: -case 0x80c5: -case 0x80c6: -case 0x80c7: -case 0x82c0: -case 0x82c1: -case 0x82c2: -case 0x82c3: -case 0x82c4: -case 0x82c5: -case 0x82c6: -case 0x82c7: -case 0x84c0: -case 0x84c1: -case 0x84c2: -case 0x84c3: -case 0x84c4: -case 0x84c5: -case 0x84c6: -case 0x84c7: -case 0x86c0: -case 0x86c1: -case 0x86c2: -case 0x86c3: -case 0x86c4: -case 0x86c5: -case 0x86c6: -case 0x86c7: -case 0x88c0: -case 0x88c1: -case 0x88c2: -case 0x88c3: -case 0x88c4: -case 0x88c5: -case 0x88c6: -case 0x88c7: -case 0x8ac0: -case 0x8ac1: -case 0x8ac2: -case 0x8ac3: -case 0x8ac4: -case 0x8ac5: -case 0x8ac6: -case 0x8ac7: -case 0x8cc0: -case 0x8cc1: -case 0x8cc2: -case 0x8cc3: -case 0x8cc4: -case 0x8cc5: -case 0x8cc6: -case 0x8cc7: -case 0x8ec0: -case 0x8ec1: -case 0x8ec2: -case 0x8ec3: -case 0x8ec4: -case 0x8ec5: -case 0x8ec6: -case 0x8ec7: - { - HAM src(this, instr_b2_b0); DIVU(src, instr_b11_b9); - } - break; - -case 0x33c0: -case 0x33c1: -case 0x33c2: -case 0x33c3: -case 0x33c4: -case 0x33c5: -case 0x33c6: -case 0x33c7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31c0: -case 0x31c1: -case 0x31c2: -case 0x31c3: -case 0x31c4: -case 0x31c5: -case 0x31c6: -case 0x31c7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x3080: -case 0x3081: -case 0x3082: -case 0x3083: -case 0x3084: -case 0x3085: -case 0x3086: -case 0x3087: -case 0x3280: -case 0x3281: -case 0x3282: -case 0x3283: -case 0x3284: -case 0x3285: -case 0x3286: -case 0x3287: -case 0x3480: -case 0x3481: -case 0x3482: -case 0x3483: -case 0x3484: -case 0x3485: -case 0x3486: -case 0x3487: -case 0x3680: -case 0x3681: -case 0x3682: -case 0x3683: -case 0x3684: -case 0x3685: -case 0x3686: -case 0x3687: -case 0x3880: -case 0x3881: -case 0x3882: -case 0x3883: -case 0x3884: -case 0x3885: -case 0x3886: -case 0x3887: -case 0x3a80: -case 0x3a81: -case 0x3a82: -case 0x3a83: -case 0x3a84: -case 0x3a85: -case 0x3a86: -case 0x3a87: -case 0x3c80: -case 0x3c81: -case 0x3c82: -case 0x3c83: -case 0x3c84: -case 0x3c85: -case 0x3c86: -case 0x3c87: -case 0x3e80: -case 0x3e81: -case 0x3e82: -case 0x3e83: -case 0x3e84: -case 0x3e85: -case 0x3e86: -case 0x3e87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3140: -case 0x3141: -case 0x3142: -case 0x3143: -case 0x3144: -case 0x3145: -case 0x3146: -case 0x3147: -case 0x3340: -case 0x3341: -case 0x3342: -case 0x3343: -case 0x3344: -case 0x3345: -case 0x3346: -case 0x3347: -case 0x3540: -case 0x3541: -case 0x3542: -case 0x3543: -case 0x3544: -case 0x3545: -case 0x3546: -case 0x3547: -case 0x3740: -case 0x3741: -case 0x3742: -case 0x3743: -case 0x3744: -case 0x3745: -case 0x3746: -case 0x3747: -case 0x3940: -case 0x3941: -case 0x3942: -case 0x3943: -case 0x3944: -case 0x3945: -case 0x3946: -case 0x3947: -case 0x3b40: -case 0x3b41: -case 0x3b42: -case 0x3b43: -case 0x3b44: -case 0x3b45: -case 0x3b46: -case 0x3b47: -case 0x3d40: -case 0x3d41: -case 0x3d42: -case 0x3d43: -case 0x3d44: -case 0x3d45: -case 0x3d46: -case 0x3d47: -case 0x3f40: -case 0x3f41: -case 0x3f42: -case 0x3f43: -case 0x3f44: -case 0x3f45: -case 0x3f46: -case 0x3f47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3180: -case 0x3181: -case 0x3182: -case 0x3183: -case 0x3184: -case 0x3185: -case 0x3186: -case 0x3187: -case 0x3380: -case 0x3381: -case 0x3382: -case 0x3383: -case 0x3384: -case 0x3385: -case 0x3386: -case 0x3387: -case 0x3580: -case 0x3581: -case 0x3582: -case 0x3583: -case 0x3584: -case 0x3585: -case 0x3586: -case 0x3587: -case 0x3780: -case 0x3781: -case 0x3782: -case 0x3783: -case 0x3784: -case 0x3785: -case 0x3786: -case 0x3787: -case 0x3980: -case 0x3981: -case 0x3982: -case 0x3983: -case 0x3984: -case 0x3985: -case 0x3986: -case 0x3987: -case 0x3b80: -case 0x3b81: -case 0x3b82: -case 0x3b83: -case 0x3b84: -case 0x3b85: -case 0x3b86: -case 0x3b87: -case 0x3d80: -case 0x3d81: -case 0x3d82: -case 0x3d83: -case 0x3d84: -case 0x3d85: -case 0x3d86: -case 0x3d87: -case 0x3f80: -case 0x3f81: -case 0x3f82: -case 0x3f83: -case 0x3f84: -case 0x3f85: -case 0x3f86: -case 0x3f87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30c0: -case 0x30c1: -case 0x30c2: -case 0x30c3: -case 0x30c4: -case 0x30c5: -case 0x30c6: -case 0x30c7: -case 0x32c0: -case 0x32c1: -case 0x32c2: -case 0x32c3: -case 0x32c4: -case 0x32c5: -case 0x32c6: -case 0x32c7: -case 0x34c0: -case 0x34c1: -case 0x34c2: -case 0x34c3: -case 0x34c4: -case 0x34c5: -case 0x34c6: -case 0x34c7: -case 0x36c0: -case 0x36c1: -case 0x36c2: -case 0x36c3: -case 0x36c4: -case 0x36c5: -case 0x36c6: -case 0x36c7: -case 0x38c0: -case 0x38c1: -case 0x38c2: -case 0x38c3: -case 0x38c4: -case 0x38c5: -case 0x38c6: -case 0x38c7: -case 0x3ac0: -case 0x3ac1: -case 0x3ac2: -case 0x3ac3: -case 0x3ac4: -case 0x3ac5: -case 0x3ac6: -case 0x3ac7: -case 0x3cc0: -case 0x3cc1: -case 0x3cc2: -case 0x3cc3: -case 0x3cc4: -case 0x3cc5: -case 0x3cc6: -case 0x3cc7: -case 0x3ec0: -case 0x3ec1: -case 0x3ec2: -case 0x3ec3: -case 0x3ec4: -case 0x3ec5: -case 0x3ec6: -case 0x3ec7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x3100: -case 0x3101: -case 0x3102: -case 0x3103: -case 0x3104: -case 0x3105: -case 0x3106: -case 0x3107: -case 0x3300: -case 0x3301: -case 0x3302: -case 0x3303: -case 0x3304: -case 0x3305: -case 0x3306: -case 0x3307: -case 0x3500: -case 0x3501: -case 0x3502: -case 0x3503: -case 0x3504: -case 0x3505: -case 0x3506: -case 0x3507: -case 0x3700: -case 0x3701: -case 0x3702: -case 0x3703: -case 0x3704: -case 0x3705: -case 0x3706: -case 0x3707: -case 0x3900: -case 0x3901: -case 0x3902: -case 0x3903: -case 0x3904: -case 0x3905: -case 0x3906: -case 0x3907: -case 0x3b00: -case 0x3b01: -case 0x3b02: -case 0x3b03: -case 0x3b04: -case 0x3b05: -case 0x3b06: -case 0x3b07: -case 0x3d00: -case 0x3d01: -case 0x3d02: -case 0x3d03: -case 0x3d04: -case 0x3d05: -case 0x3d06: -case 0x3d07: -case 0x3f00: -case 0x3f01: -case 0x3f02: -case 0x3f03: -case 0x3f04: -case 0x3f05: -case 0x3f06: -case 0x3f07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd040: -case 0xd041: -case 0xd042: -case 0xd043: -case 0xd044: -case 0xd045: -case 0xd046: -case 0xd047: -case 0xd240: -case 0xd241: -case 0xd242: -case 0xd243: -case 0xd244: -case 0xd245: -case 0xd246: -case 0xd247: -case 0xd440: -case 0xd441: -case 0xd442: -case 0xd443: -case 0xd444: -case 0xd445: -case 0xd446: -case 0xd447: -case 0xd640: -case 0xd641: -case 0xd642: -case 0xd643: -case 0xd644: -case 0xd645: -case 0xd646: -case 0xd647: -case 0xd840: -case 0xd841: -case 0xd842: -case 0xd843: -case 0xd844: -case 0xd845: -case 0xd846: -case 0xd847: -case 0xda40: -case 0xda41: -case 0xda42: -case 0xda43: -case 0xda44: -case 0xda45: -case 0xda46: -case 0xda47: -case 0xdc40: -case 0xdc41: -case 0xdc42: -case 0xdc43: -case 0xdc44: -case 0xdc45: -case 0xdc46: -case 0xdc47: -case 0xde40: -case 0xde41: -case 0xde42: -case 0xde43: -case 0xde44: -case 0xde45: -case 0xde46: -case 0xde47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xd140: -case 0xd141: -case 0xd142: -case 0xd143: -case 0xd144: -case 0xd145: -case 0xd146: -case 0xd147: -case 0xd340: -case 0xd341: -case 0xd342: -case 0xd343: -case 0xd344: -case 0xd345: -case 0xd346: -case 0xd347: -case 0xd540: -case 0xd541: -case 0xd542: -case 0xd543: -case 0xd544: -case 0xd545: -case 0xd546: -case 0xd547: -case 0xd740: -case 0xd741: -case 0xd742: -case 0xd743: -case 0xd744: -case 0xd745: -case 0xd746: -case 0xd747: -case 0xd940: -case 0xd941: -case 0xd942: -case 0xd943: -case 0xd944: -case 0xd945: -case 0xd946: -case 0xd947: -case 0xdb40: -case 0xdb41: -case 0xdb42: -case 0xdb43: -case 0xdb44: -case 0xdb45: -case 0xdb46: -case 0xdb47: -case 0xdd40: -case 0xdd41: -case 0xdd42: -case 0xdd43: -case 0xdd44: -case 0xdd45: -case 0xdd46: -case 0xdd47: -case 0xdf40: -case 0xdf41: -case 0xdf42: -case 0xdf43: -case 0xdf44: -case 0xdf45: -case 0xdf46: -case 0xdf47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADDX(src, dst); - } - break; - -case 0xc040: -case 0xc041: -case 0xc042: -case 0xc043: -case 0xc044: -case 0xc045: -case 0xc046: -case 0xc047: -case 0xc240: -case 0xc241: -case 0xc242: -case 0xc243: -case 0xc244: -case 0xc245: -case 0xc246: -case 0xc247: -case 0xc440: -case 0xc441: -case 0xc442: -case 0xc443: -case 0xc444: -case 0xc445: -case 0xc446: -case 0xc447: -case 0xc640: -case 0xc641: -case 0xc642: -case 0xc643: -case 0xc644: -case 0xc645: -case 0xc646: -case 0xc647: -case 0xc840: -case 0xc841: -case 0xc842: -case 0xc843: -case 0xc844: -case 0xc845: -case 0xc846: -case 0xc847: -case 0xca40: -case 0xca41: -case 0xca42: -case 0xca43: -case 0xca44: -case 0xca45: -case 0xca46: -case 0xca47: -case 0xcc40: -case 0xcc41: -case 0xcc42: -case 0xcc43: -case 0xcc44: -case 0xcc45: -case 0xcc46: -case 0xcc47: -case 0xce40: -case 0xce41: -case 0xce42: -case 0xce43: -case 0xce44: -case 0xce45: -case 0xce46: -case 0xce47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x4180: -case 0x4181: -case 0x4182: -case 0x4183: -case 0x4184: -case 0x4185: -case 0x4186: -case 0x4187: -case 0x4380: -case 0x4381: -case 0x4382: -case 0x4383: -case 0x4384: -case 0x4385: -case 0x4386: -case 0x4387: -case 0x4580: -case 0x4581: -case 0x4582: -case 0x4583: -case 0x4584: -case 0x4585: -case 0x4586: -case 0x4587: -case 0x4780: -case 0x4781: -case 0x4782: -case 0x4783: -case 0x4784: -case 0x4785: -case 0x4786: -case 0x4787: -case 0x4980: -case 0x4981: -case 0x4982: -case 0x4983: -case 0x4984: -case 0x4985: -case 0x4986: -case 0x4987: -case 0x4b80: -case 0x4b81: -case 0x4b82: -case 0x4b83: -case 0x4b84: -case 0x4b85: -case 0x4b86: -case 0x4b87: -case 0x4d80: -case 0x4d81: -case 0x4d82: -case 0x4d83: -case 0x4d84: -case 0x4d85: -case 0x4d86: -case 0x4d87: -case 0x4f80: -case 0x4f81: -case 0x4f82: -case 0x4f83: -case 0x4f84: -case 0x4f85: -case 0x4f86: -case 0x4f87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb040: -case 0xb041: -case 0xb042: -case 0xb043: -case 0xb044: -case 0xb045: -case 0xb046: -case 0xb047: -case 0xb240: -case 0xb241: -case 0xb242: -case 0xb243: -case 0xb244: -case 0xb245: -case 0xb246: -case 0xb247: -case 0xb440: -case 0xb441: -case 0xb442: -case 0xb443: -case 0xb444: -case 0xb445: -case 0xb446: -case 0xb447: -case 0xb640: -case 0xb641: -case 0xb642: -case 0xb643: -case 0xb644: -case 0xb645: -case 0xb646: -case 0xb647: -case 0xb840: -case 0xb841: -case 0xb842: -case 0xb843: -case 0xb844: -case 0xb845: -case 0xb846: -case 0xb847: -case 0xba40: -case 0xba41: -case 0xba42: -case 0xba43: -case 0xba44: -case 0xba45: -case 0xba46: -case 0xba47: -case 0xbc40: -case 0xbc41: -case 0xbc42: -case 0xbc43: -case 0xbc44: -case 0xbc45: -case 0xbc46: -case 0xbc47: -case 0xbe40: -case 0xbe41: -case 0xbe42: -case 0xbe43: -case 0xbe44: -case 0xbe45: -case 0xbe46: -case 0xbe47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x3000: -case 0x3001: -case 0x3002: -case 0x3003: -case 0x3004: -case 0x3005: -case 0x3006: -case 0x3007: -case 0x3200: -case 0x3201: -case 0x3202: -case 0x3203: -case 0x3204: -case 0x3205: -case 0x3206: -case 0x3207: -case 0x3400: -case 0x3401: -case 0x3402: -case 0x3403: -case 0x3404: -case 0x3405: -case 0x3406: -case 0x3407: -case 0x3600: -case 0x3601: -case 0x3602: -case 0x3603: -case 0x3604: -case 0x3605: -case 0x3606: -case 0x3607: -case 0x3800: -case 0x3801: -case 0x3802: -case 0x3803: -case 0x3804: -case 0x3805: -case 0x3806: -case 0x3807: -case 0x3a00: -case 0x3a01: -case 0x3a02: -case 0x3a03: -case 0x3a04: -case 0x3a05: -case 0x3a06: -case 0x3a07: -case 0x3c00: -case 0x3c01: -case 0x3c02: -case 0x3c03: -case 0x3c04: -case 0x3c05: -case 0x3c06: -case 0x3c07: -case 0x3e00: -case 0x3e01: -case 0x3e02: -case 0x3e03: -case 0x3e04: -case 0x3e05: -case 0x3e06: -case 0x3e07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8040: -case 0x8041: -case 0x8042: -case 0x8043: -case 0x8044: -case 0x8045: -case 0x8046: -case 0x8047: -case 0x8240: -case 0x8241: -case 0x8242: -case 0x8243: -case 0x8244: -case 0x8245: -case 0x8246: -case 0x8247: -case 0x8440: -case 0x8441: -case 0x8442: -case 0x8443: -case 0x8444: -case 0x8445: -case 0x8446: -case 0x8447: -case 0x8640: -case 0x8641: -case 0x8642: -case 0x8643: -case 0x8644: -case 0x8645: -case 0x8646: -case 0x8647: -case 0x8840: -case 0x8841: -case 0x8842: -case 0x8843: -case 0x8844: -case 0x8845: -case 0x8846: -case 0x8847: -case 0x8a40: -case 0x8a41: -case 0x8a42: -case 0x8a43: -case 0x8a44: -case 0x8a45: -case 0x8a46: -case 0x8a47: -case 0x8c40: -case 0x8c41: -case 0x8c42: -case 0x8c43: -case 0x8c44: -case 0x8c45: -case 0x8c46: -case 0x8c47: -case 0x8e40: -case 0x8e41: -case 0x8e42: -case 0x8e43: -case 0x8e44: -case 0x8e45: -case 0x8e46: -case 0x8e47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9040: -case 0x9041: -case 0x9042: -case 0x9043: -case 0x9044: -case 0x9045: -case 0x9046: -case 0x9047: -case 0x9240: -case 0x9241: -case 0x9242: -case 0x9243: -case 0x9244: -case 0x9245: -case 0x9246: -case 0x9247: -case 0x9440: -case 0x9441: -case 0x9442: -case 0x9443: -case 0x9444: -case 0x9445: -case 0x9446: -case 0x9447: -case 0x9640: -case 0x9641: -case 0x9642: -case 0x9643: -case 0x9644: -case 0x9645: -case 0x9646: -case 0x9647: -case 0x9840: -case 0x9841: -case 0x9842: -case 0x9843: -case 0x9844: -case 0x9845: -case 0x9846: -case 0x9847: -case 0x9a40: -case 0x9a41: -case 0x9a42: -case 0x9a43: -case 0x9a44: -case 0x9a45: -case 0x9a46: -case 0x9a47: -case 0x9c40: -case 0x9c41: -case 0x9c42: -case 0x9c43: -case 0x9c44: -case 0x9c45: -case 0x9c46: -case 0x9c47: -case 0x9e40: -case 0x9e41: -case 0x9e42: -case 0x9e43: -case 0x9e44: -case 0x9e45: -case 0x9e46: -case 0x9e47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x9140: -case 0x9141: -case 0x9142: -case 0x9143: -case 0x9144: -case 0x9145: -case 0x9146: -case 0x9147: -case 0x9340: -case 0x9341: -case 0x9342: -case 0x9343: -case 0x9344: -case 0x9345: -case 0x9346: -case 0x9347: -case 0x9540: -case 0x9541: -case 0x9542: -case 0x9543: -case 0x9544: -case 0x9545: -case 0x9546: -case 0x9547: -case 0x9740: -case 0x9741: -case 0x9742: -case 0x9743: -case 0x9744: -case 0x9745: -case 0x9746: -case 0x9747: -case 0x9940: -case 0x9941: -case 0x9942: -case 0x9943: -case 0x9944: -case 0x9945: -case 0x9946: -case 0x9947: -case 0x9b40: -case 0x9b41: -case 0x9b42: -case 0x9b43: -case 0x9b44: -case 0x9b45: -case 0x9b46: -case 0x9b47: -case 0x9d40: -case 0x9d41: -case 0x9d42: -case 0x9d43: -case 0x9d44: -case 0x9d45: -case 0x9d46: -case 0x9d47: -case 0x9f40: -case 0x9f41: -case 0x9f42: -case 0x9f43: -case 0x9f44: -case 0x9f45: -case 0x9f46: -case 0x9f47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUBX(src, dst); - } - break; - -case 0xd0c0: -case 0xd0c1: -case 0xd0c2: -case 0xd0c3: -case 0xd0c4: -case 0xd0c5: -case 0xd0c6: -case 0xd0c7: -case 0xd2c0: -case 0xd2c1: -case 0xd2c2: -case 0xd2c3: -case 0xd2c4: -case 0xd2c5: -case 0xd2c6: -case 0xd2c7: -case 0xd4c0: -case 0xd4c1: -case 0xd4c2: -case 0xd4c3: -case 0xd4c4: -case 0xd4c5: -case 0xd4c6: -case 0xd4c7: -case 0xd6c0: -case 0xd6c1: -case 0xd6c2: -case 0xd6c3: -case 0xd6c4: -case 0xd6c5: -case 0xd6c6: -case 0xd6c7: -case 0xd8c0: -case 0xd8c1: -case 0xd8c2: -case 0xd8c3: -case 0xd8c4: -case 0xd8c5: -case 0xd8c6: -case 0xd8c7: -case 0xdac0: -case 0xdac1: -case 0xdac2: -case 0xdac3: -case 0xdac4: -case 0xdac5: -case 0xdac6: -case 0xdac7: -case 0xdcc0: -case 0xdcc1: -case 0xdcc2: -case 0xdcc3: -case 0xdcc4: -case 0xdcc5: -case 0xdcc6: -case 0xdcc7: -case 0xdec0: -case 0xdec1: -case 0xdec2: -case 0xdec3: -case 0xdec4: -case 0xdec5: -case 0xdec6: -case 0xdec7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0c0: -case 0xb0c1: -case 0xb0c2: -case 0xb0c3: -case 0xb0c4: -case 0xb0c5: -case 0xb0c6: -case 0xb0c7: -case 0xb2c0: -case 0xb2c1: -case 0xb2c2: -case 0xb2c3: -case 0xb2c4: -case 0xb2c5: -case 0xb2c6: -case 0xb2c7: -case 0xb4c0: -case 0xb4c1: -case 0xb4c2: -case 0xb4c3: -case 0xb4c4: -case 0xb4c5: -case 0xb4c6: -case 0xb4c7: -case 0xb6c0: -case 0xb6c1: -case 0xb6c2: -case 0xb6c3: -case 0xb6c4: -case 0xb6c5: -case 0xb6c6: -case 0xb6c7: -case 0xb8c0: -case 0xb8c1: -case 0xb8c2: -case 0xb8c3: -case 0xb8c4: -case 0xb8c5: -case 0xb8c6: -case 0xb8c7: -case 0xbac0: -case 0xbac1: -case 0xbac2: -case 0xbac3: -case 0xbac4: -case 0xbac5: -case 0xbac6: -case 0xbac7: -case 0xbcc0: -case 0xbcc1: -case 0xbcc2: -case 0xbcc3: -case 0xbcc4: -case 0xbcc5: -case 0xbcc6: -case 0xbcc7: -case 0xbec0: -case 0xbec1: -case 0xbec2: -case 0xbec3: -case 0xbec4: -case 0xbec5: -case 0xbec6: -case 0xbec7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90c0: -case 0x90c1: -case 0x90c2: -case 0x90c3: -case 0x90c4: -case 0x90c5: -case 0x90c6: -case 0x90c7: -case 0x92c0: -case 0x92c1: -case 0x92c2: -case 0x92c3: -case 0x92c4: -case 0x92c5: -case 0x92c6: -case 0x92c7: -case 0x94c0: -case 0x94c1: -case 0x94c2: -case 0x94c3: -case 0x94c4: -case 0x94c5: -case 0x94c6: -case 0x94c7: -case 0x96c0: -case 0x96c1: -case 0x96c2: -case 0x96c3: -case 0x96c4: -case 0x96c5: -case 0x96c6: -case 0x96c7: -case 0x98c0: -case 0x98c1: -case 0x98c2: -case 0x98c3: -case 0x98c4: -case 0x98c5: -case 0x98c6: -case 0x98c7: -case 0x9ac0: -case 0x9ac1: -case 0x9ac2: -case 0x9ac3: -case 0x9ac4: -case 0x9ac5: -case 0x9ac6: -case 0x9ac7: -case 0x9cc0: -case 0x9cc1: -case 0x9cc2: -case 0x9cc3: -case 0x9cc4: -case 0x9cc5: -case 0x9cc6: -case 0x9cc7: -case 0x9ec0: -case 0x9ec1: -case 0x9ec2: -case 0x9ec3: -case 0x9ec4: -case 0x9ec5: -case 0x9ec6: -case 0x9ec7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x3040: -case 0x3041: -case 0x3042: -case 0x3043: -case 0x3044: -case 0x3045: -case 0x3046: -case 0x3047: -case 0x3240: -case 0x3241: -case 0x3242: -case 0x3243: -case 0x3244: -case 0x3245: -case 0x3246: -case 0x3247: -case 0x3440: -case 0x3441: -case 0x3442: -case 0x3443: -case 0x3444: -case 0x3445: -case 0x3446: -case 0x3447: -case 0x3640: -case 0x3641: -case 0x3642: -case 0x3643: -case 0x3644: -case 0x3645: -case 0x3646: -case 0x3647: -case 0x3840: -case 0x3841: -case 0x3842: -case 0x3843: -case 0x3844: -case 0x3845: -case 0x3846: -case 0x3847: -case 0x3a40: -case 0x3a41: -case 0x3a42: -case 0x3a43: -case 0x3a44: -case 0x3a45: -case 0x3a46: -case 0x3a47: -case 0x3c40: -case 0x3c41: -case 0x3c42: -case 0x3c43: -case 0x3c44: -case 0x3c45: -case 0x3c46: -case 0x3c47: -case 0x3e40: -case 0x3e41: -case 0x3e42: -case 0x3e43: -case 0x3e44: -case 0x3e45: -case 0x3e46: -case 0x3e47: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44c0: -case 0x44c1: -case 0x44c2: -case 0x44c3: -case 0x44c4: -case 0x44c5: -case 0x44c6: -case 0x44c7: - { - HAM src(this, instr_b2_b0); MOVE_to_CCR(src); - } - break; - -case 0xc1c0: -case 0xc1c1: -case 0xc1c2: -case 0xc1c3: -case 0xc1c4: -case 0xc1c5: -case 0xc1c6: -case 0xc1c7: -case 0xc3c0: -case 0xc3c1: -case 0xc3c2: -case 0xc3c3: -case 0xc3c4: -case 0xc3c5: -case 0xc3c6: -case 0xc3c7: -case 0xc5c0: -case 0xc5c1: -case 0xc5c2: -case 0xc5c3: -case 0xc5c4: -case 0xc5c5: -case 0xc5c6: -case 0xc5c7: -case 0xc7c0: -case 0xc7c1: -case 0xc7c2: -case 0xc7c3: -case 0xc7c4: -case 0xc7c5: -case 0xc7c6: -case 0xc7c7: -case 0xc9c0: -case 0xc9c1: -case 0xc9c2: -case 0xc9c3: -case 0xc9c4: -case 0xc9c5: -case 0xc9c6: -case 0xc9c7: -case 0xcbc0: -case 0xcbc1: -case 0xcbc2: -case 0xcbc3: -case 0xcbc4: -case 0xcbc5: -case 0xcbc6: -case 0xcbc7: -case 0xcdc0: -case 0xcdc1: -case 0xcdc2: -case 0xcdc3: -case 0xcdc4: -case 0xcdc5: -case 0xcdc6: -case 0xcdc7: -case 0xcfc0: -case 0xcfc1: -case 0xcfc2: -case 0xcfc3: -case 0xcfc4: -case 0xcfc5: -case 0xcfc6: -case 0xcfc7: - { - HAM src(this, instr_b2_b0); MULS(src, instr_b11_b9); - } - break; - -case 0xc0c0: -case 0xc0c1: -case 0xc0c2: -case 0xc0c3: -case 0xc0c4: -case 0xc0c5: -case 0xc0c6: -case 0xc0c7: -case 0xc2c0: -case 0xc2c1: -case 0xc2c2: -case 0xc2c3: -case 0xc2c4: -case 0xc2c5: -case 0xc2c6: -case 0xc2c7: -case 0xc4c0: -case 0xc4c1: -case 0xc4c2: -case 0xc4c3: -case 0xc4c4: -case 0xc4c5: -case 0xc4c6: -case 0xc4c7: -case 0xc6c0: -case 0xc6c1: -case 0xc6c2: -case 0xc6c3: -case 0xc6c4: -case 0xc6c5: -case 0xc6c6: -case 0xc6c7: -case 0xc8c0: -case 0xc8c1: -case 0xc8c2: -case 0xc8c3: -case 0xc8c4: -case 0xc8c5: -case 0xc8c6: -case 0xc8c7: -case 0xcac0: -case 0xcac1: -case 0xcac2: -case 0xcac3: -case 0xcac4: -case 0xcac5: -case 0xcac6: -case 0xcac7: -case 0xccc0: -case 0xccc1: -case 0xccc2: -case 0xccc3: -case 0xccc4: -case 0xccc5: -case 0xccc6: -case 0xccc7: -case 0xcec0: -case 0xcec1: -case 0xcec2: -case 0xcec3: -case 0xcec4: -case 0xcec5: -case 0xcec6: -case 0xcec7: - { - HAM src(this, instr_b2_b0); MULU(src, instr_b11_b9); - } - break; - -case 0xe160: -case 0xe161: -case 0xe162: -case 0xe163: -case 0xe164: -case 0xe165: -case 0xe166: -case 0xe167: -case 0xe360: -case 0xe361: -case 0xe362: -case 0xe363: -case 0xe364: -case 0xe365: -case 0xe366: -case 0xe367: -case 0xe560: -case 0xe561: -case 0xe562: -case 0xe563: -case 0xe564: -case 0xe565: -case 0xe566: -case 0xe567: -case 0xe760: -case 0xe761: -case 0xe762: -case 0xe763: -case 0xe764: -case 0xe765: -case 0xe766: -case 0xe767: -case 0xe960: -case 0xe961: -case 0xe962: -case 0xe963: -case 0xe964: -case 0xe965: -case 0xe966: -case 0xe967: -case 0xeb60: -case 0xeb61: -case 0xeb62: -case 0xeb63: -case 0xeb64: -case 0xeb65: -case 0xeb66: -case 0xeb67: -case 0xed60: -case 0xed61: -case 0xed62: -case 0xed63: -case 0xed64: -case 0xed65: -case 0xed66: -case 0xed67: -case 0xef60: -case 0xef61: -case 0xef62: -case 0xef63: -case 0xef64: -case 0xef65: -case 0xef66: -case 0xef67: - { - HAM targ(this, instr_b2_b0); ASL(targ, D[instr_b11_b9]); - } - break; - -case 0xe140: -case 0xe141: -case 0xe142: -case 0xe143: -case 0xe144: -case 0xe145: -case 0xe146: -case 0xe147: -case 0xe340: -case 0xe341: -case 0xe342: -case 0xe343: -case 0xe344: -case 0xe345: -case 0xe346: -case 0xe347: -case 0xe540: -case 0xe541: -case 0xe542: -case 0xe543: -case 0xe544: -case 0xe545: -case 0xe546: -case 0xe547: -case 0xe740: -case 0xe741: -case 0xe742: -case 0xe743: -case 0xe744: -case 0xe745: -case 0xe746: -case 0xe747: -case 0xe940: -case 0xe941: -case 0xe942: -case 0xe943: -case 0xe944: -case 0xe945: -case 0xe946: -case 0xe947: -case 0xeb40: -case 0xeb41: -case 0xeb42: -case 0xeb43: -case 0xeb44: -case 0xeb45: -case 0xeb46: -case 0xeb47: -case 0xed40: -case 0xed41: -case 0xed42: -case 0xed43: -case 0xed44: -case 0xed45: -case 0xed46: -case 0xed47: -case 0xef40: -case 0xef41: -case 0xef42: -case 0xef43: -case 0xef44: -case 0xef45: -case 0xef46: -case 0xef47: - { - HAM targ(this, instr_b2_b0); ASL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe060: -case 0xe061: -case 0xe062: -case 0xe063: -case 0xe064: -case 0xe065: -case 0xe066: -case 0xe067: -case 0xe260: -case 0xe261: -case 0xe262: -case 0xe263: -case 0xe264: -case 0xe265: -case 0xe266: -case 0xe267: -case 0xe460: -case 0xe461: -case 0xe462: -case 0xe463: -case 0xe464: -case 0xe465: -case 0xe466: -case 0xe467: -case 0xe660: -case 0xe661: -case 0xe662: -case 0xe663: -case 0xe664: -case 0xe665: -case 0xe666: -case 0xe667: -case 0xe860: -case 0xe861: -case 0xe862: -case 0xe863: -case 0xe864: -case 0xe865: -case 0xe866: -case 0xe867: -case 0xea60: -case 0xea61: -case 0xea62: -case 0xea63: -case 0xea64: -case 0xea65: -case 0xea66: -case 0xea67: -case 0xec60: -case 0xec61: -case 0xec62: -case 0xec63: -case 0xec64: -case 0xec65: -case 0xec66: -case 0xec67: -case 0xee60: -case 0xee61: -case 0xee62: -case 0xee63: -case 0xee64: -case 0xee65: -case 0xee66: -case 0xee67: - { - HAM targ(this, instr_b2_b0); ASR(targ, D[instr_b11_b9]); - } - break; - -case 0xe040: -case 0xe041: -case 0xe042: -case 0xe043: -case 0xe044: -case 0xe045: -case 0xe046: -case 0xe047: -case 0xe240: -case 0xe241: -case 0xe242: -case 0xe243: -case 0xe244: -case 0xe245: -case 0xe246: -case 0xe247: -case 0xe440: -case 0xe441: -case 0xe442: -case 0xe443: -case 0xe444: -case 0xe445: -case 0xe446: -case 0xe447: -case 0xe640: -case 0xe641: -case 0xe642: -case 0xe643: -case 0xe644: -case 0xe645: -case 0xe646: -case 0xe647: -case 0xe840: -case 0xe841: -case 0xe842: -case 0xe843: -case 0xe844: -case 0xe845: -case 0xe846: -case 0xe847: -case 0xea40: -case 0xea41: -case 0xea42: -case 0xea43: -case 0xea44: -case 0xea45: -case 0xea46: -case 0xea47: -case 0xec40: -case 0xec41: -case 0xec42: -case 0xec43: -case 0xec44: -case 0xec45: -case 0xec46: -case 0xec47: -case 0xee40: -case 0xee41: -case 0xee42: -case 0xee43: -case 0xee44: -case 0xee45: -case 0xee46: -case 0xee47: - { - HAM targ(this, instr_b2_b0); ASR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe168: -case 0xe169: -case 0xe16a: -case 0xe16b: -case 0xe16c: -case 0xe16d: -case 0xe16e: -case 0xe16f: -case 0xe368: -case 0xe369: -case 0xe36a: -case 0xe36b: -case 0xe36c: -case 0xe36d: -case 0xe36e: -case 0xe36f: -case 0xe568: -case 0xe569: -case 0xe56a: -case 0xe56b: -case 0xe56c: -case 0xe56d: -case 0xe56e: -case 0xe56f: -case 0xe768: -case 0xe769: -case 0xe76a: -case 0xe76b: -case 0xe76c: -case 0xe76d: -case 0xe76e: -case 0xe76f: -case 0xe968: -case 0xe969: -case 0xe96a: -case 0xe96b: -case 0xe96c: -case 0xe96d: -case 0xe96e: -case 0xe96f: -case 0xeb68: -case 0xeb69: -case 0xeb6a: -case 0xeb6b: -case 0xeb6c: -case 0xeb6d: -case 0xeb6e: -case 0xeb6f: -case 0xed68: -case 0xed69: -case 0xed6a: -case 0xed6b: -case 0xed6c: -case 0xed6d: -case 0xed6e: -case 0xed6f: -case 0xef68: -case 0xef69: -case 0xef6a: -case 0xef6b: -case 0xef6c: -case 0xef6d: -case 0xef6e: -case 0xef6f: - { - HAM targ(this, instr_b2_b0); LSL(targ, D[instr_b11_b9]); - } - break; - -case 0xe148: -case 0xe149: -case 0xe14a: -case 0xe14b: -case 0xe14c: -case 0xe14d: -case 0xe14e: -case 0xe14f: -case 0xe348: -case 0xe349: -case 0xe34a: -case 0xe34b: -case 0xe34c: -case 0xe34d: -case 0xe34e: -case 0xe34f: -case 0xe548: -case 0xe549: -case 0xe54a: -case 0xe54b: -case 0xe54c: -case 0xe54d: -case 0xe54e: -case 0xe54f: -case 0xe748: -case 0xe749: -case 0xe74a: -case 0xe74b: -case 0xe74c: -case 0xe74d: -case 0xe74e: -case 0xe74f: -case 0xe948: -case 0xe949: -case 0xe94a: -case 0xe94b: -case 0xe94c: -case 0xe94d: -case 0xe94e: -case 0xe94f: -case 0xeb48: -case 0xeb49: -case 0xeb4a: -case 0xeb4b: -case 0xeb4c: -case 0xeb4d: -case 0xeb4e: -case 0xeb4f: -case 0xed48: -case 0xed49: -case 0xed4a: -case 0xed4b: -case 0xed4c: -case 0xed4d: -case 0xed4e: -case 0xed4f: -case 0xef48: -case 0xef49: -case 0xef4a: -case 0xef4b: -case 0xef4c: -case 0xef4d: -case 0xef4e: -case 0xef4f: - { - HAM targ(this, instr_b2_b0); LSL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe068: -case 0xe069: -case 0xe06a: -case 0xe06b: -case 0xe06c: -case 0xe06d: -case 0xe06e: -case 0xe06f: -case 0xe268: -case 0xe269: -case 0xe26a: -case 0xe26b: -case 0xe26c: -case 0xe26d: -case 0xe26e: -case 0xe26f: -case 0xe468: -case 0xe469: -case 0xe46a: -case 0xe46b: -case 0xe46c: -case 0xe46d: -case 0xe46e: -case 0xe46f: -case 0xe668: -case 0xe669: -case 0xe66a: -case 0xe66b: -case 0xe66c: -case 0xe66d: -case 0xe66e: -case 0xe66f: -case 0xe868: -case 0xe869: -case 0xe86a: -case 0xe86b: -case 0xe86c: -case 0xe86d: -case 0xe86e: -case 0xe86f: -case 0xea68: -case 0xea69: -case 0xea6a: -case 0xea6b: -case 0xea6c: -case 0xea6d: -case 0xea6e: -case 0xea6f: -case 0xec68: -case 0xec69: -case 0xec6a: -case 0xec6b: -case 0xec6c: -case 0xec6d: -case 0xec6e: -case 0xec6f: -case 0xee68: -case 0xee69: -case 0xee6a: -case 0xee6b: -case 0xee6c: -case 0xee6d: -case 0xee6e: -case 0xee6f: - { - HAM targ(this, instr_b2_b0); LSR(targ, D[instr_b11_b9]); - } - break; - -case 0xe048: -case 0xe049: -case 0xe04a: -case 0xe04b: -case 0xe04c: -case 0xe04d: -case 0xe04e: -case 0xe04f: -case 0xe248: -case 0xe249: -case 0xe24a: -case 0xe24b: -case 0xe24c: -case 0xe24d: -case 0xe24e: -case 0xe24f: -case 0xe448: -case 0xe449: -case 0xe44a: -case 0xe44b: -case 0xe44c: -case 0xe44d: -case 0xe44e: -case 0xe44f: -case 0xe648: -case 0xe649: -case 0xe64a: -case 0xe64b: -case 0xe64c: -case 0xe64d: -case 0xe64e: -case 0xe64f: -case 0xe848: -case 0xe849: -case 0xe84a: -case 0xe84b: -case 0xe84c: -case 0xe84d: -case 0xe84e: -case 0xe84f: -case 0xea48: -case 0xea49: -case 0xea4a: -case 0xea4b: -case 0xea4c: -case 0xea4d: -case 0xea4e: -case 0xea4f: -case 0xec48: -case 0xec49: -case 0xec4a: -case 0xec4b: -case 0xec4c: -case 0xec4d: -case 0xec4e: -case 0xec4f: -case 0xee48: -case 0xee49: -case 0xee4a: -case 0xee4b: -case 0xee4c: -case 0xee4d: -case 0xee4e: -case 0xee4f: - { - HAM targ(this, instr_b2_b0); LSR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe178: -case 0xe179: -case 0xe17a: -case 0xe17b: -case 0xe17c: -case 0xe17d: -case 0xe17e: -case 0xe17f: -case 0xe378: -case 0xe379: -case 0xe37a: -case 0xe37b: -case 0xe37c: -case 0xe37d: -case 0xe37e: -case 0xe37f: -case 0xe578: -case 0xe579: -case 0xe57a: -case 0xe57b: -case 0xe57c: -case 0xe57d: -case 0xe57e: -case 0xe57f: -case 0xe778: -case 0xe779: -case 0xe77a: -case 0xe77b: -case 0xe77c: -case 0xe77d: -case 0xe77e: -case 0xe77f: -case 0xe978: -case 0xe979: -case 0xe97a: -case 0xe97b: -case 0xe97c: -case 0xe97d: -case 0xe97e: -case 0xe97f: -case 0xeb78: -case 0xeb79: -case 0xeb7a: -case 0xeb7b: -case 0xeb7c: -case 0xeb7d: -case 0xeb7e: -case 0xeb7f: -case 0xed78: -case 0xed79: -case 0xed7a: -case 0xed7b: -case 0xed7c: -case 0xed7d: -case 0xed7e: -case 0xed7f: -case 0xef78: -case 0xef79: -case 0xef7a: -case 0xef7b: -case 0xef7c: -case 0xef7d: -case 0xef7e: -case 0xef7f: - { - HAM targ(this, instr_b2_b0); ROL(targ, D[instr_b11_b9]); - } - break; - -case 0xe158: -case 0xe159: -case 0xe15a: -case 0xe15b: -case 0xe15c: -case 0xe15d: -case 0xe15e: -case 0xe15f: -case 0xe358: -case 0xe359: -case 0xe35a: -case 0xe35b: -case 0xe35c: -case 0xe35d: -case 0xe35e: -case 0xe35f: -case 0xe558: -case 0xe559: -case 0xe55a: -case 0xe55b: -case 0xe55c: -case 0xe55d: -case 0xe55e: -case 0xe55f: -case 0xe758: -case 0xe759: -case 0xe75a: -case 0xe75b: -case 0xe75c: -case 0xe75d: -case 0xe75e: -case 0xe75f: -case 0xe958: -case 0xe959: -case 0xe95a: -case 0xe95b: -case 0xe95c: -case 0xe95d: -case 0xe95e: -case 0xe95f: -case 0xeb58: -case 0xeb59: -case 0xeb5a: -case 0xeb5b: -case 0xeb5c: -case 0xeb5d: -case 0xeb5e: -case 0xeb5f: -case 0xed58: -case 0xed59: -case 0xed5a: -case 0xed5b: -case 0xed5c: -case 0xed5d: -case 0xed5e: -case 0xed5f: -case 0xef58: -case 0xef59: -case 0xef5a: -case 0xef5b: -case 0xef5c: -case 0xef5d: -case 0xef5e: -case 0xef5f: - { - HAM targ(this, instr_b2_b0); ROL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe078: -case 0xe079: -case 0xe07a: -case 0xe07b: -case 0xe07c: -case 0xe07d: -case 0xe07e: -case 0xe07f: -case 0xe278: -case 0xe279: -case 0xe27a: -case 0xe27b: -case 0xe27c: -case 0xe27d: -case 0xe27e: -case 0xe27f: -case 0xe478: -case 0xe479: -case 0xe47a: -case 0xe47b: -case 0xe47c: -case 0xe47d: -case 0xe47e: -case 0xe47f: -case 0xe678: -case 0xe679: -case 0xe67a: -case 0xe67b: -case 0xe67c: -case 0xe67d: -case 0xe67e: -case 0xe67f: -case 0xe878: -case 0xe879: -case 0xe87a: -case 0xe87b: -case 0xe87c: -case 0xe87d: -case 0xe87e: -case 0xe87f: -case 0xea78: -case 0xea79: -case 0xea7a: -case 0xea7b: -case 0xea7c: -case 0xea7d: -case 0xea7e: -case 0xea7f: -case 0xec78: -case 0xec79: -case 0xec7a: -case 0xec7b: -case 0xec7c: -case 0xec7d: -case 0xec7e: -case 0xec7f: -case 0xee78: -case 0xee79: -case 0xee7a: -case 0xee7b: -case 0xee7c: -case 0xee7d: -case 0xee7e: -case 0xee7f: - { - HAM targ(this, instr_b2_b0); ROR(targ, D[instr_b11_b9]); - } - break; - -case 0xe058: -case 0xe059: -case 0xe05a: -case 0xe05b: -case 0xe05c: -case 0xe05d: -case 0xe05e: -case 0xe05f: -case 0xe258: -case 0xe259: -case 0xe25a: -case 0xe25b: -case 0xe25c: -case 0xe25d: -case 0xe25e: -case 0xe25f: -case 0xe458: -case 0xe459: -case 0xe45a: -case 0xe45b: -case 0xe45c: -case 0xe45d: -case 0xe45e: -case 0xe45f: -case 0xe658: -case 0xe659: -case 0xe65a: -case 0xe65b: -case 0xe65c: -case 0xe65d: -case 0xe65e: -case 0xe65f: -case 0xe858: -case 0xe859: -case 0xe85a: -case 0xe85b: -case 0xe85c: -case 0xe85d: -case 0xe85e: -case 0xe85f: -case 0xea58: -case 0xea59: -case 0xea5a: -case 0xea5b: -case 0xea5c: -case 0xea5d: -case 0xea5e: -case 0xea5f: -case 0xec58: -case 0xec59: -case 0xec5a: -case 0xec5b: -case 0xec5c: -case 0xec5d: -case 0xec5e: -case 0xec5f: -case 0xee58: -case 0xee59: -case 0xee5a: -case 0xee5b: -case 0xee5c: -case 0xee5d: -case 0xee5e: -case 0xee5f: - { - HAM targ(this, instr_b2_b0); ROR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe170: -case 0xe171: -case 0xe172: -case 0xe173: -case 0xe174: -case 0xe175: -case 0xe176: -case 0xe177: -case 0xe370: -case 0xe371: -case 0xe372: -case 0xe373: -case 0xe374: -case 0xe375: -case 0xe376: -case 0xe377: -case 0xe570: -case 0xe571: -case 0xe572: -case 0xe573: -case 0xe574: -case 0xe575: -case 0xe576: -case 0xe577: -case 0xe770: -case 0xe771: -case 0xe772: -case 0xe773: -case 0xe774: -case 0xe775: -case 0xe776: -case 0xe777: -case 0xe970: -case 0xe971: -case 0xe972: -case 0xe973: -case 0xe974: -case 0xe975: -case 0xe976: -case 0xe977: -case 0xeb70: -case 0xeb71: -case 0xeb72: -case 0xeb73: -case 0xeb74: -case 0xeb75: -case 0xeb76: -case 0xeb77: -case 0xed70: -case 0xed71: -case 0xed72: -case 0xed73: -case 0xed74: -case 0xed75: -case 0xed76: -case 0xed77: -case 0xef70: -case 0xef71: -case 0xef72: -case 0xef73: -case 0xef74: -case 0xef75: -case 0xef76: -case 0xef77: - { - HAM targ(this, instr_b2_b0); ROXL(targ, D[instr_b11_b9]); - } - break; - -case 0xe150: -case 0xe151: -case 0xe152: -case 0xe153: -case 0xe154: -case 0xe155: -case 0xe156: -case 0xe157: -case 0xe350: -case 0xe351: -case 0xe352: -case 0xe353: -case 0xe354: -case 0xe355: -case 0xe356: -case 0xe357: -case 0xe550: -case 0xe551: -case 0xe552: -case 0xe553: -case 0xe554: -case 0xe555: -case 0xe556: -case 0xe557: -case 0xe750: -case 0xe751: -case 0xe752: -case 0xe753: -case 0xe754: -case 0xe755: -case 0xe756: -case 0xe757: -case 0xe950: -case 0xe951: -case 0xe952: -case 0xe953: -case 0xe954: -case 0xe955: -case 0xe956: -case 0xe957: -case 0xeb50: -case 0xeb51: -case 0xeb52: -case 0xeb53: -case 0xeb54: -case 0xeb55: -case 0xeb56: -case 0xeb57: -case 0xed50: -case 0xed51: -case 0xed52: -case 0xed53: -case 0xed54: -case 0xed55: -case 0xed56: -case 0xed57: -case 0xef50: -case 0xef51: -case 0xef52: -case 0xef53: -case 0xef54: -case 0xef55: -case 0xef56: -case 0xef57: - { - HAM targ(this, instr_b2_b0); ROXL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe070: -case 0xe071: -case 0xe072: -case 0xe073: -case 0xe074: -case 0xe075: -case 0xe076: -case 0xe077: -case 0xe270: -case 0xe271: -case 0xe272: -case 0xe273: -case 0xe274: -case 0xe275: -case 0xe276: -case 0xe277: -case 0xe470: -case 0xe471: -case 0xe472: -case 0xe473: -case 0xe474: -case 0xe475: -case 0xe476: -case 0xe477: -case 0xe670: -case 0xe671: -case 0xe672: -case 0xe673: -case 0xe674: -case 0xe675: -case 0xe676: -case 0xe677: -case 0xe870: -case 0xe871: -case 0xe872: -case 0xe873: -case 0xe874: -case 0xe875: -case 0xe876: -case 0xe877: -case 0xea70: -case 0xea71: -case 0xea72: -case 0xea73: -case 0xea74: -case 0xea75: -case 0xea76: -case 0xea77: -case 0xec70: -case 0xec71: -case 0xec72: -case 0xec73: -case 0xec74: -case 0xec75: -case 0xec76: -case 0xec77: -case 0xee70: -case 0xee71: -case 0xee72: -case 0xee73: -case 0xee74: -case 0xee75: -case 0xee76: -case 0xee77: - { - HAM targ(this, instr_b2_b0); ROXR(targ, D[instr_b11_b9]); - } - break; - -case 0xe050: -case 0xe051: -case 0xe052: -case 0xe053: -case 0xe054: -case 0xe055: -case 0xe056: -case 0xe057: -case 0xe250: -case 0xe251: -case 0xe252: -case 0xe253: -case 0xe254: -case 0xe255: -case 0xe256: -case 0xe257: -case 0xe450: -case 0xe451: -case 0xe452: -case 0xe453: -case 0xe454: -case 0xe455: -case 0xe456: -case 0xe457: -case 0xe650: -case 0xe651: -case 0xe652: -case 0xe653: -case 0xe654: -case 0xe655: -case 0xe656: -case 0xe657: -case 0xe850: -case 0xe851: -case 0xe852: -case 0xe853: -case 0xe854: -case 0xe855: -case 0xe856: -case 0xe857: -case 0xea50: -case 0xea51: -case 0xea52: -case 0xea53: -case 0xea54: -case 0xea55: -case 0xea56: -case 0xea57: -case 0xec50: -case 0xec51: -case 0xec52: -case 0xec53: -case 0xec54: -case 0xec55: -case 0xec56: -case 0xec57: -case 0xee50: -case 0xee51: -case 0xee52: -case 0xee53: -case 0xee54: -case 0xee55: -case 0xee56: -case 0xee57: - { - HAM targ(this, instr_b2_b0); ROXR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0x81fc: -case 0x83fc: -case 0x85fc: -case 0x87fc: -case 0x89fc: -case 0x8bfc: -case 0x8dfc: -case 0x8ffc: - { - HAM src(this); DIVS(src, instr_b11_b9); - } - break; - -case 0x80fc: -case 0x82fc: -case 0x84fc: -case 0x86fc: -case 0x88fc: -case 0x8afc: -case 0x8cfc: -case 0x8efc: - { - HAM src(this); DIVU(src, instr_b11_b9); - } - break; - -case 0x0679: - { - HAM src(this); HAM dst(this); ADD(src, dst); - } - break; - -case 0x0279: - { - HAM src(this); HAM dst(this); AND(src, dst); - } - break; - -case 0x0c79: - { - HAM src(this); HAM dst(this); CMP(src, dst); - } - break; - -case 0x0a79: - { - HAM src(this); HAM dst(this); EOR(src, dst); - } - break; - -case 0x33fc: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x0079: - { - HAM src(this); HAM dst(this); OR(src, dst); - } - break; - -case 0x0479: - { - HAM src(this); HAM dst(this); SUB(src, dst); - } - break; - -case 0x0678: - { - HAM src(this); HAM dst(this); ADD(src, dst); - } - break; - -case 0x0278: - { - HAM src(this); HAM dst(this); AND(src, dst); - } - break; - -case 0x0c78: - { - HAM src(this); HAM dst(this); CMP(src, dst); - } - break; - -case 0x0a78: - { - HAM src(this); HAM dst(this); EOR(src, dst); - } - break; - -case 0x31fc: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x0078: - { - HAM src(this); HAM dst(this); OR(src, dst); - } - break; - -case 0x0478: - { - HAM src(this); HAM dst(this); SUB(src, dst); - } - break; - -case 0x30bc: -case 0x32bc: -case 0x34bc: -case 0x36bc: -case 0x38bc: -case 0x3abc: -case 0x3cbc: -case 0x3ebc: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0650: -case 0x0651: -case 0x0652: -case 0x0653: -case 0x0654: -case 0x0655: -case 0x0656: -case 0x0657: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0250: -case 0x0251: -case 0x0252: -case 0x0253: -case 0x0254: -case 0x0255: -case 0x0256: -case 0x0257: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c50: -case 0x0c51: -case 0x0c52: -case 0x0c53: -case 0x0c54: -case 0x0c55: -case 0x0c56: -case 0x0c57: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a50: -case 0x0a51: -case 0x0a52: -case 0x0a53: -case 0x0a54: -case 0x0a55: -case 0x0a56: -case 0x0a57: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0050: -case 0x0051: -case 0x0052: -case 0x0053: -case 0x0054: -case 0x0055: -case 0x0056: -case 0x0057: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0450: -case 0x0451: -case 0x0452: -case 0x0453: -case 0x0454: -case 0x0455: -case 0x0456: -case 0x0457: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x317c: -case 0x337c: -case 0x357c: -case 0x377c: -case 0x397c: -case 0x3b7c: -case 0x3d7c: -case 0x3f7c: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0668: -case 0x0669: -case 0x066a: -case 0x066b: -case 0x066c: -case 0x066d: -case 0x066e: -case 0x066f: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0268: -case 0x0269: -case 0x026a: -case 0x026b: -case 0x026c: -case 0x026d: -case 0x026e: -case 0x026f: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c68: -case 0x0c69: -case 0x0c6a: -case 0x0c6b: -case 0x0c6c: -case 0x0c6d: -case 0x0c6e: -case 0x0c6f: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a68: -case 0x0a69: -case 0x0a6a: -case 0x0a6b: -case 0x0a6c: -case 0x0a6d: -case 0x0a6e: -case 0x0a6f: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0068: -case 0x0069: -case 0x006a: -case 0x006b: -case 0x006c: -case 0x006d: -case 0x006e: -case 0x006f: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0468: -case 0x0469: -case 0x046a: -case 0x046b: -case 0x046c: -case 0x046d: -case 0x046e: -case 0x046f: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x31bc: -case 0x33bc: -case 0x35bc: -case 0x37bc: -case 0x39bc: -case 0x3bbc: -case 0x3dbc: -case 0x3fbc: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0670: -case 0x0671: -case 0x0672: -case 0x0673: -case 0x0674: -case 0x0675: -case 0x0676: -case 0x0677: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0270: -case 0x0271: -case 0x0272: -case 0x0273: -case 0x0274: -case 0x0275: -case 0x0276: -case 0x0277: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c70: -case 0x0c71: -case 0x0c72: -case 0x0c73: -case 0x0c74: -case 0x0c75: -case 0x0c76: -case 0x0c77: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a70: -case 0x0a71: -case 0x0a72: -case 0x0a73: -case 0x0a74: -case 0x0a75: -case 0x0a76: -case 0x0a77: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0070: -case 0x0071: -case 0x0072: -case 0x0073: -case 0x0074: -case 0x0075: -case 0x0076: -case 0x0077: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0470: -case 0x0471: -case 0x0472: -case 0x0473: -case 0x0474: -case 0x0475: -case 0x0476: -case 0x0477: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x30fc: -case 0x32fc: -case 0x34fc: -case 0x36fc: -case 0x38fc: -case 0x3afc: -case 0x3cfc: -case 0x3efc: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0658: -case 0x0659: -case 0x065a: -case 0x065b: -case 0x065c: -case 0x065d: -case 0x065e: -case 0x065f: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0258: -case 0x0259: -case 0x025a: -case 0x025b: -case 0x025c: -case 0x025d: -case 0x025e: -case 0x025f: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c58: -case 0x0c59: -case 0x0c5a: -case 0x0c5b: -case 0x0c5c: -case 0x0c5d: -case 0x0c5e: -case 0x0c5f: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a58: -case 0x0a59: -case 0x0a5a: -case 0x0a5b: -case 0x0a5c: -case 0x0a5d: -case 0x0a5e: -case 0x0a5f: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0058: -case 0x0059: -case 0x005a: -case 0x005b: -case 0x005c: -case 0x005d: -case 0x005e: -case 0x005f: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0458: -case 0x0459: -case 0x045a: -case 0x045b: -case 0x045c: -case 0x045d: -case 0x045e: -case 0x045f: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x313c: -case 0x333c: -case 0x353c: -case 0x373c: -case 0x393c: -case 0x3b3c: -case 0x3d3c: -case 0x3f3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0660: -case 0x0661: -case 0x0662: -case 0x0663: -case 0x0664: -case 0x0665: -case 0x0666: -case 0x0667: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0260: -case 0x0261: -case 0x0262: -case 0x0263: -case 0x0264: -case 0x0265: -case 0x0266: -case 0x0267: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c60: -case 0x0c61: -case 0x0c62: -case 0x0c63: -case 0x0c64: -case 0x0c65: -case 0x0c66: -case 0x0c67: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a60: -case 0x0a61: -case 0x0a62: -case 0x0a63: -case 0x0a64: -case 0x0a65: -case 0x0a66: -case 0x0a67: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0060: -case 0x0061: -case 0x0062: -case 0x0063: -case 0x0064: -case 0x0065: -case 0x0066: -case 0x0067: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0460: -case 0x0461: -case 0x0462: -case 0x0463: -case 0x0464: -case 0x0465: -case 0x0466: -case 0x0467: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd07c: -case 0xd27c: -case 0xd47c: -case 0xd67c: -case 0xd87c: -case 0xda7c: -case 0xdc7c: -case 0xde7c: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc07c: -case 0xc27c: -case 0xc47c: -case 0xc67c: -case 0xc87c: -case 0xca7c: -case 0xcc7c: -case 0xce7c: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x41bc: -case 0x43bc: -case 0x45bc: -case 0x47bc: -case 0x49bc: -case 0x4bbc: -case 0x4dbc: -case 0x4fbc: - { - HAM src(this); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb07c: -case 0xb27c: -case 0xb47c: -case 0xb67c: -case 0xb87c: -case 0xba7c: -case 0xbc7c: -case 0xbe7c: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x303c: -case 0x323c: -case 0x343c: -case 0x363c: -case 0x383c: -case 0x3a3c: -case 0x3c3c: -case 0x3e3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x807c: -case 0x827c: -case 0x847c: -case 0x867c: -case 0x887c: -case 0x8a7c: -case 0x8c7c: -case 0x8e7c: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x907c: -case 0x927c: -case 0x947c: -case 0x967c: -case 0x987c: -case 0x9a7c: -case 0x9c7c: -case 0x9e7c: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0640: -case 0x0641: -case 0x0642: -case 0x0643: -case 0x0644: -case 0x0645: -case 0x0646: -case 0x0647: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0240: -case 0x0241: -case 0x0242: -case 0x0243: -case 0x0244: -case 0x0245: -case 0x0246: -case 0x0247: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c40: -case 0x0c41: -case 0x0c42: -case 0x0c43: -case 0x0c44: -case 0x0c45: -case 0x0c46: -case 0x0c47: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a40: -case 0x0a41: -case 0x0a42: -case 0x0a43: -case 0x0a44: -case 0x0a45: -case 0x0a46: -case 0x0a47: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0040: -case 0x0041: -case 0x0042: -case 0x0043: -case 0x0044: -case 0x0045: -case 0x0046: -case 0x0047: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0440: -case 0x0441: -case 0x0442: -case 0x0443: -case 0x0444: -case 0x0445: -case 0x0446: -case 0x0447: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd0fc: -case 0xd2fc: -case 0xd4fc: -case 0xd6fc: -case 0xd8fc: -case 0xdafc: -case 0xdcfc: -case 0xdefc: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0fc: -case 0xb2fc: -case 0xb4fc: -case 0xb6fc: -case 0xb8fc: -case 0xbafc: -case 0xbcfc: -case 0xbefc: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90fc: -case 0x92fc: -case 0x94fc: -case 0x96fc: -case 0x98fc: -case 0x9afc: -case 0x9cfc: -case 0x9efc: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x307c: -case 0x327c: -case 0x347c: -case 0x367c: -case 0x387c: -case 0x3a7c: -case 0x3c7c: -case 0x3e7c: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44fc: - { - HAM src(this); MOVE_to_CCR(src); - } - break; - -case 0xc1fc: -case 0xc3fc: -case 0xc5fc: -case 0xc7fc: -case 0xc9fc: -case 0xcbfc: -case 0xcdfc: -case 0xcffc: - { - HAM src(this); MULS(src, instr_b11_b9); - } - break; - -case 0xc0fc: -case 0xc2fc: -case 0xc4fc: -case 0xc6fc: -case 0xc8fc: -case 0xcafc: -case 0xccfc: -case 0xcefc: - { - HAM src(this); MULU(src, instr_b11_b9); - } - break; - -case 0x5079: -case 0x5279: -case 0x5479: -case 0x5679: -case 0x5879: -case 0x5a79: -case 0x5c79: -case 0x5e79: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); ADD(src, dst); - } - break; - -case 0x5179: -case 0x5379: -case 0x5579: -case 0x5779: -case 0x5979: -case 0x5b79: -case 0x5d79: -case 0x5f79: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); SUB(src, dst); - } - break; - -case 0x5078: -case 0x5278: -case 0x5478: -case 0x5678: -case 0x5878: -case 0x5a78: -case 0x5c78: -case 0x5e78: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); ADD(src, dst); - } - break; - -case 0x5178: -case 0x5378: -case 0x5578: -case 0x5778: -case 0x5978: -case 0x5b78: -case 0x5d78: -case 0x5f78: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); SUB(src, dst); - } - break; - -case 0x5050: -case 0x5051: -case 0x5052: -case 0x5053: -case 0x5054: -case 0x5055: -case 0x5056: -case 0x5057: -case 0x5250: -case 0x5251: -case 0x5252: -case 0x5253: -case 0x5254: -case 0x5255: -case 0x5256: -case 0x5257: -case 0x5450: -case 0x5451: -case 0x5452: -case 0x5453: -case 0x5454: -case 0x5455: -case 0x5456: -case 0x5457: -case 0x5650: -case 0x5651: -case 0x5652: -case 0x5653: -case 0x5654: -case 0x5655: -case 0x5656: -case 0x5657: -case 0x5850: -case 0x5851: -case 0x5852: -case 0x5853: -case 0x5854: -case 0x5855: -case 0x5856: -case 0x5857: -case 0x5a50: -case 0x5a51: -case 0x5a52: -case 0x5a53: -case 0x5a54: -case 0x5a55: -case 0x5a56: -case 0x5a57: -case 0x5c50: -case 0x5c51: -case 0x5c52: -case 0x5c53: -case 0x5c54: -case 0x5c55: -case 0x5c56: -case 0x5c57: -case 0x5e50: -case 0x5e51: -case 0x5e52: -case 0x5e53: -case 0x5e54: -case 0x5e55: -case 0x5e56: -case 0x5e57: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5150: -case 0x5151: -case 0x5152: -case 0x5153: -case 0x5154: -case 0x5155: -case 0x5156: -case 0x5157: -case 0x5350: -case 0x5351: -case 0x5352: -case 0x5353: -case 0x5354: -case 0x5355: -case 0x5356: -case 0x5357: -case 0x5550: -case 0x5551: -case 0x5552: -case 0x5553: -case 0x5554: -case 0x5555: -case 0x5556: -case 0x5557: -case 0x5750: -case 0x5751: -case 0x5752: -case 0x5753: -case 0x5754: -case 0x5755: -case 0x5756: -case 0x5757: -case 0x5950: -case 0x5951: -case 0x5952: -case 0x5953: -case 0x5954: -case 0x5955: -case 0x5956: -case 0x5957: -case 0x5b50: -case 0x5b51: -case 0x5b52: -case 0x5b53: -case 0x5b54: -case 0x5b55: -case 0x5b56: -case 0x5b57: -case 0x5d50: -case 0x5d51: -case 0x5d52: -case 0x5d53: -case 0x5d54: -case 0x5d55: -case 0x5d56: -case 0x5d57: -case 0x5f50: -case 0x5f51: -case 0x5f52: -case 0x5f53: -case 0x5f54: -case 0x5f55: -case 0x5f56: -case 0x5f57: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5068: -case 0x5069: -case 0x506a: -case 0x506b: -case 0x506c: -case 0x506d: -case 0x506e: -case 0x506f: -case 0x5268: -case 0x5269: -case 0x526a: -case 0x526b: -case 0x526c: -case 0x526d: -case 0x526e: -case 0x526f: -case 0x5468: -case 0x5469: -case 0x546a: -case 0x546b: -case 0x546c: -case 0x546d: -case 0x546e: -case 0x546f: -case 0x5668: -case 0x5669: -case 0x566a: -case 0x566b: -case 0x566c: -case 0x566d: -case 0x566e: -case 0x566f: -case 0x5868: -case 0x5869: -case 0x586a: -case 0x586b: -case 0x586c: -case 0x586d: -case 0x586e: -case 0x586f: -case 0x5a68: -case 0x5a69: -case 0x5a6a: -case 0x5a6b: -case 0x5a6c: -case 0x5a6d: -case 0x5a6e: -case 0x5a6f: -case 0x5c68: -case 0x5c69: -case 0x5c6a: -case 0x5c6b: -case 0x5c6c: -case 0x5c6d: -case 0x5c6e: -case 0x5c6f: -case 0x5e68: -case 0x5e69: -case 0x5e6a: -case 0x5e6b: -case 0x5e6c: -case 0x5e6d: -case 0x5e6e: -case 0x5e6f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5168: -case 0x5169: -case 0x516a: -case 0x516b: -case 0x516c: -case 0x516d: -case 0x516e: -case 0x516f: -case 0x5368: -case 0x5369: -case 0x536a: -case 0x536b: -case 0x536c: -case 0x536d: -case 0x536e: -case 0x536f: -case 0x5568: -case 0x5569: -case 0x556a: -case 0x556b: -case 0x556c: -case 0x556d: -case 0x556e: -case 0x556f: -case 0x5768: -case 0x5769: -case 0x576a: -case 0x576b: -case 0x576c: -case 0x576d: -case 0x576e: -case 0x576f: -case 0x5968: -case 0x5969: -case 0x596a: -case 0x596b: -case 0x596c: -case 0x596d: -case 0x596e: -case 0x596f: -case 0x5b68: -case 0x5b69: -case 0x5b6a: -case 0x5b6b: -case 0x5b6c: -case 0x5b6d: -case 0x5b6e: -case 0x5b6f: -case 0x5d68: -case 0x5d69: -case 0x5d6a: -case 0x5d6b: -case 0x5d6c: -case 0x5d6d: -case 0x5d6e: -case 0x5d6f: -case 0x5f68: -case 0x5f69: -case 0x5f6a: -case 0x5f6b: -case 0x5f6c: -case 0x5f6d: -case 0x5f6e: -case 0x5f6f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5070: -case 0x5071: -case 0x5072: -case 0x5073: -case 0x5074: -case 0x5075: -case 0x5076: -case 0x5077: -case 0x5270: -case 0x5271: -case 0x5272: -case 0x5273: -case 0x5274: -case 0x5275: -case 0x5276: -case 0x5277: -case 0x5470: -case 0x5471: -case 0x5472: -case 0x5473: -case 0x5474: -case 0x5475: -case 0x5476: -case 0x5477: -case 0x5670: -case 0x5671: -case 0x5672: -case 0x5673: -case 0x5674: -case 0x5675: -case 0x5676: -case 0x5677: -case 0x5870: -case 0x5871: -case 0x5872: -case 0x5873: -case 0x5874: -case 0x5875: -case 0x5876: -case 0x5877: -case 0x5a70: -case 0x5a71: -case 0x5a72: -case 0x5a73: -case 0x5a74: -case 0x5a75: -case 0x5a76: -case 0x5a77: -case 0x5c70: -case 0x5c71: -case 0x5c72: -case 0x5c73: -case 0x5c74: -case 0x5c75: -case 0x5c76: -case 0x5c77: -case 0x5e70: -case 0x5e71: -case 0x5e72: -case 0x5e73: -case 0x5e74: -case 0x5e75: -case 0x5e76: -case 0x5e77: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5170: -case 0x5171: -case 0x5172: -case 0x5173: -case 0x5174: -case 0x5175: -case 0x5176: -case 0x5177: -case 0x5370: -case 0x5371: -case 0x5372: -case 0x5373: -case 0x5374: -case 0x5375: -case 0x5376: -case 0x5377: -case 0x5570: -case 0x5571: -case 0x5572: -case 0x5573: -case 0x5574: -case 0x5575: -case 0x5576: -case 0x5577: -case 0x5770: -case 0x5771: -case 0x5772: -case 0x5773: -case 0x5774: -case 0x5775: -case 0x5776: -case 0x5777: -case 0x5970: -case 0x5971: -case 0x5972: -case 0x5973: -case 0x5974: -case 0x5975: -case 0x5976: -case 0x5977: -case 0x5b70: -case 0x5b71: -case 0x5b72: -case 0x5b73: -case 0x5b74: -case 0x5b75: -case 0x5b76: -case 0x5b77: -case 0x5d70: -case 0x5d71: -case 0x5d72: -case 0x5d73: -case 0x5d74: -case 0x5d75: -case 0x5d76: -case 0x5d77: -case 0x5f70: -case 0x5f71: -case 0x5f72: -case 0x5f73: -case 0x5f74: -case 0x5f75: -case 0x5f76: -case 0x5f77: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5058: -case 0x5059: -case 0x505a: -case 0x505b: -case 0x505c: -case 0x505d: -case 0x505e: -case 0x505f: -case 0x5258: -case 0x5259: -case 0x525a: -case 0x525b: -case 0x525c: -case 0x525d: -case 0x525e: -case 0x525f: -case 0x5458: -case 0x5459: -case 0x545a: -case 0x545b: -case 0x545c: -case 0x545d: -case 0x545e: -case 0x545f: -case 0x5658: -case 0x5659: -case 0x565a: -case 0x565b: -case 0x565c: -case 0x565d: -case 0x565e: -case 0x565f: -case 0x5858: -case 0x5859: -case 0x585a: -case 0x585b: -case 0x585c: -case 0x585d: -case 0x585e: -case 0x585f: -case 0x5a58: -case 0x5a59: -case 0x5a5a: -case 0x5a5b: -case 0x5a5c: -case 0x5a5d: -case 0x5a5e: -case 0x5a5f: -case 0x5c58: -case 0x5c59: -case 0x5c5a: -case 0x5c5b: -case 0x5c5c: -case 0x5c5d: -case 0x5c5e: -case 0x5c5f: -case 0x5e58: -case 0x5e59: -case 0x5e5a: -case 0x5e5b: -case 0x5e5c: -case 0x5e5d: -case 0x5e5e: -case 0x5e5f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5158: -case 0x5159: -case 0x515a: -case 0x515b: -case 0x515c: -case 0x515d: -case 0x515e: -case 0x515f: -case 0x5358: -case 0x5359: -case 0x535a: -case 0x535b: -case 0x535c: -case 0x535d: -case 0x535e: -case 0x535f: -case 0x5558: -case 0x5559: -case 0x555a: -case 0x555b: -case 0x555c: -case 0x555d: -case 0x555e: -case 0x555f: -case 0x5758: -case 0x5759: -case 0x575a: -case 0x575b: -case 0x575c: -case 0x575d: -case 0x575e: -case 0x575f: -case 0x5958: -case 0x5959: -case 0x595a: -case 0x595b: -case 0x595c: -case 0x595d: -case 0x595e: -case 0x595f: -case 0x5b58: -case 0x5b59: -case 0x5b5a: -case 0x5b5b: -case 0x5b5c: -case 0x5b5d: -case 0x5b5e: -case 0x5b5f: -case 0x5d58: -case 0x5d59: -case 0x5d5a: -case 0x5d5b: -case 0x5d5c: -case 0x5d5d: -case 0x5d5e: -case 0x5d5f: -case 0x5f58: -case 0x5f59: -case 0x5f5a: -case 0x5f5b: -case 0x5f5c: -case 0x5f5d: -case 0x5f5e: -case 0x5f5f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5060: -case 0x5061: -case 0x5062: -case 0x5063: -case 0x5064: -case 0x5065: -case 0x5066: -case 0x5067: -case 0x5260: -case 0x5261: -case 0x5262: -case 0x5263: -case 0x5264: -case 0x5265: -case 0x5266: -case 0x5267: -case 0x5460: -case 0x5461: -case 0x5462: -case 0x5463: -case 0x5464: -case 0x5465: -case 0x5466: -case 0x5467: -case 0x5660: -case 0x5661: -case 0x5662: -case 0x5663: -case 0x5664: -case 0x5665: -case 0x5666: -case 0x5667: -case 0x5860: -case 0x5861: -case 0x5862: -case 0x5863: -case 0x5864: -case 0x5865: -case 0x5866: -case 0x5867: -case 0x5a60: -case 0x5a61: -case 0x5a62: -case 0x5a63: -case 0x5a64: -case 0x5a65: -case 0x5a66: -case 0x5a67: -case 0x5c60: -case 0x5c61: -case 0x5c62: -case 0x5c63: -case 0x5c64: -case 0x5c65: -case 0x5c66: -case 0x5c67: -case 0x5e60: -case 0x5e61: -case 0x5e62: -case 0x5e63: -case 0x5e64: -case 0x5e65: -case 0x5e66: -case 0x5e67: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5160: -case 0x5161: -case 0x5162: -case 0x5163: -case 0x5164: -case 0x5165: -case 0x5166: -case 0x5167: -case 0x5360: -case 0x5361: -case 0x5362: -case 0x5363: -case 0x5364: -case 0x5365: -case 0x5366: -case 0x5367: -case 0x5560: -case 0x5561: -case 0x5562: -case 0x5563: -case 0x5564: -case 0x5565: -case 0x5566: -case 0x5567: -case 0x5760: -case 0x5761: -case 0x5762: -case 0x5763: -case 0x5764: -case 0x5765: -case 0x5766: -case 0x5767: -case 0x5960: -case 0x5961: -case 0x5962: -case 0x5963: -case 0x5964: -case 0x5965: -case 0x5966: -case 0x5967: -case 0x5b60: -case 0x5b61: -case 0x5b62: -case 0x5b63: -case 0x5b64: -case 0x5b65: -case 0x5b66: -case 0x5b67: -case 0x5d60: -case 0x5d61: -case 0x5d62: -case 0x5d63: -case 0x5d64: -case 0x5d65: -case 0x5d66: -case 0x5d67: -case 0x5f60: -case 0x5f61: -case 0x5f62: -case 0x5f63: -case 0x5f64: -case 0x5f65: -case 0x5f66: -case 0x5f67: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5040: -case 0x5041: -case 0x5042: -case 0x5043: -case 0x5044: -case 0x5045: -case 0x5046: -case 0x5047: -case 0x5240: -case 0x5241: -case 0x5242: -case 0x5243: -case 0x5244: -case 0x5245: -case 0x5246: -case 0x5247: -case 0x5440: -case 0x5441: -case 0x5442: -case 0x5443: -case 0x5444: -case 0x5445: -case 0x5446: -case 0x5447: -case 0x5640: -case 0x5641: -case 0x5642: -case 0x5643: -case 0x5644: -case 0x5645: -case 0x5646: -case 0x5647: -case 0x5840: -case 0x5841: -case 0x5842: -case 0x5843: -case 0x5844: -case 0x5845: -case 0x5846: -case 0x5847: -case 0x5a40: -case 0x5a41: -case 0x5a42: -case 0x5a43: -case 0x5a44: -case 0x5a45: -case 0x5a46: -case 0x5a47: -case 0x5c40: -case 0x5c41: -case 0x5c42: -case 0x5c43: -case 0x5c44: -case 0x5c45: -case 0x5c46: -case 0x5c47: -case 0x5e40: -case 0x5e41: -case 0x5e42: -case 0x5e43: -case 0x5e44: -case 0x5e45: -case 0x5e46: -case 0x5e47: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5140: -case 0x5141: -case 0x5142: -case 0x5143: -case 0x5144: -case 0x5145: -case 0x5146: -case 0x5147: -case 0x5340: -case 0x5341: -case 0x5342: -case 0x5343: -case 0x5344: -case 0x5345: -case 0x5346: -case 0x5347: -case 0x5540: -case 0x5541: -case 0x5542: -case 0x5543: -case 0x5544: -case 0x5545: -case 0x5546: -case 0x5547: -case 0x5740: -case 0x5741: -case 0x5742: -case 0x5743: -case 0x5744: -case 0x5745: -case 0x5746: -case 0x5747: -case 0x5940: -case 0x5941: -case 0x5942: -case 0x5943: -case 0x5944: -case 0x5945: -case 0x5946: -case 0x5947: -case 0x5b40: -case 0x5b41: -case 0x5b42: -case 0x5b43: -case 0x5b44: -case 0x5b45: -case 0x5b46: -case 0x5b47: -case 0x5d40: -case 0x5d41: -case 0x5d42: -case 0x5d43: -case 0x5d44: -case 0x5d45: -case 0x5d46: -case 0x5d47: -case 0x5f40: -case 0x5f41: -case 0x5f42: -case 0x5f43: -case 0x5f44: -case 0x5f45: -case 0x5f46: -case 0x5f47: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5048: -case 0x5049: -case 0x504a: -case 0x504b: -case 0x504c: -case 0x504d: -case 0x504e: -case 0x504f: -case 0x5248: -case 0x5249: -case 0x524a: -case 0x524b: -case 0x524c: -case 0x524d: -case 0x524e: -case 0x524f: -case 0x5448: -case 0x5449: -case 0x544a: -case 0x544b: -case 0x544c: -case 0x544d: -case 0x544e: -case 0x544f: -case 0x5648: -case 0x5649: -case 0x564a: -case 0x564b: -case 0x564c: -case 0x564d: -case 0x564e: -case 0x564f: -case 0x5848: -case 0x5849: -case 0x584a: -case 0x584b: -case 0x584c: -case 0x584d: -case 0x584e: -case 0x584f: -case 0x5a48: -case 0x5a49: -case 0x5a4a: -case 0x5a4b: -case 0x5a4c: -case 0x5a4d: -case 0x5a4e: -case 0x5a4f: -case 0x5c48: -case 0x5c49: -case 0x5c4a: -case 0x5c4b: -case 0x5c4c: -case 0x5c4d: -case 0x5c4e: -case 0x5c4f: -case 0x5e48: -case 0x5e49: -case 0x5e4a: -case 0x5e4b: -case 0x5e4c: -case 0x5e4d: -case 0x5e4e: -case 0x5e4f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5148: -case 0x5149: -case 0x514a: -case 0x514b: -case 0x514c: -case 0x514d: -case 0x514e: -case 0x514f: -case 0x5348: -case 0x5349: -case 0x534a: -case 0x534b: -case 0x534c: -case 0x534d: -case 0x534e: -case 0x534f: -case 0x5548: -case 0x5549: -case 0x554a: -case 0x554b: -case 0x554c: -case 0x554d: -case 0x554e: -case 0x554f: -case 0x5748: -case 0x5749: -case 0x574a: -case 0x574b: -case 0x574c: -case 0x574d: -case 0x574e: -case 0x574f: -case 0x5948: -case 0x5949: -case 0x594a: -case 0x594b: -case 0x594c: -case 0x594d: -case 0x594e: -case 0x594f: -case 0x5b48: -case 0x5b49: -case 0x5b4a: -case 0x5b4b: -case 0x5b4c: -case 0x5b4d: -case 0x5b4e: -case 0x5b4f: -case 0x5d48: -case 0x5d49: -case 0x5d4a: -case 0x5d4b: -case 0x5d4c: -case 0x5d4d: -case 0x5d4e: -case 0x5d4f: -case 0x5f48: -case 0x5f49: -case 0x5f4a: -case 0x5f4b: -case 0x5f4c: -case 0x5f4d: -case 0x5f4e: -case 0x5f4f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x81fa: -case 0x83fa: -case 0x85fa: -case 0x87fa: -case 0x89fa: -case 0x8bfa: -case 0x8dfa: -case 0x8ffa: - { - HAM src(this); DIVS(src, instr_b11_b9); - } - break; - -case 0x80fa: -case 0x82fa: -case 0x84fa: -case 0x86fa: -case 0x88fa: -case 0x8afa: -case 0x8cfa: -case 0x8efa: - { - HAM src(this); DIVU(src, instr_b11_b9); - } - break; - -case 0x33fa: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31fa: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x30ba: -case 0x32ba: -case 0x34ba: -case 0x36ba: -case 0x38ba: -case 0x3aba: -case 0x3cba: -case 0x3eba: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x317a: -case 0x337a: -case 0x357a: -case 0x377a: -case 0x397a: -case 0x3b7a: -case 0x3d7a: -case 0x3f7a: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x31ba: -case 0x33ba: -case 0x35ba: -case 0x37ba: -case 0x39ba: -case 0x3bba: -case 0x3dba: -case 0x3fba: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30fa: -case 0x32fa: -case 0x34fa: -case 0x36fa: -case 0x38fa: -case 0x3afa: -case 0x3cfa: -case 0x3efa: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x313a: -case 0x333a: -case 0x353a: -case 0x373a: -case 0x393a: -case 0x3b3a: -case 0x3d3a: -case 0x3f3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd07a: -case 0xd27a: -case 0xd47a: -case 0xd67a: -case 0xd87a: -case 0xda7a: -case 0xdc7a: -case 0xde7a: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc07a: -case 0xc27a: -case 0xc47a: -case 0xc67a: -case 0xc87a: -case 0xca7a: -case 0xcc7a: -case 0xce7a: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x41ba: -case 0x43ba: -case 0x45ba: -case 0x47ba: -case 0x49ba: -case 0x4bba: -case 0x4dba: -case 0x4fba: - { - HAM src(this); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb07a: -case 0xb27a: -case 0xb47a: -case 0xb67a: -case 0xb87a: -case 0xba7a: -case 0xbc7a: -case 0xbe7a: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x303a: -case 0x323a: -case 0x343a: -case 0x363a: -case 0x383a: -case 0x3a3a: -case 0x3c3a: -case 0x3e3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x807a: -case 0x827a: -case 0x847a: -case 0x867a: -case 0x887a: -case 0x8a7a: -case 0x8c7a: -case 0x8e7a: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x907a: -case 0x927a: -case 0x947a: -case 0x967a: -case 0x987a: -case 0x9a7a: -case 0x9c7a: -case 0x9e7a: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0fa: -case 0xd2fa: -case 0xd4fa: -case 0xd6fa: -case 0xd8fa: -case 0xdafa: -case 0xdcfa: -case 0xdefa: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0fa: -case 0xb2fa: -case 0xb4fa: -case 0xb6fa: -case 0xb8fa: -case 0xbafa: -case 0xbcfa: -case 0xbefa: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90fa: -case 0x92fa: -case 0x94fa: -case 0x96fa: -case 0x98fa: -case 0x9afa: -case 0x9cfa: -case 0x9efa: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x307a: -case 0x327a: -case 0x347a: -case 0x367a: -case 0x387a: -case 0x3a7a: -case 0x3c7a: -case 0x3e7a: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44fa: - { - HAM src(this); MOVE_to_CCR(src); - } - break; - -case 0xc1fa: -case 0xc3fa: -case 0xc5fa: -case 0xc7fa: -case 0xc9fa: -case 0xcbfa: -case 0xcdfa: -case 0xcffa: - { - HAM src(this); MULS(src, instr_b11_b9); - } - break; - -case 0xc0fa: -case 0xc2fa: -case 0xc4fa: -case 0xc6fa: -case 0xc8fa: -case 0xcafa: -case 0xccfa: -case 0xcefa: - { - HAM src(this); MULU(src, instr_b11_b9); - } - break; - -case 0x81fb: -case 0x83fb: -case 0x85fb: -case 0x87fb: -case 0x89fb: -case 0x8bfb: -case 0x8dfb: -case 0x8ffb: - { - HAM src(this); DIVS(src, instr_b11_b9); - } - break; - -case 0x80fb: -case 0x82fb: -case 0x84fb: -case 0x86fb: -case 0x88fb: -case 0x8afb: -case 0x8cfb: -case 0x8efb: - { - HAM src(this); DIVU(src, instr_b11_b9); - } - break; - -case 0x33fb: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x31fb: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x30bb: -case 0x32bb: -case 0x34bb: -case 0x36bb: -case 0x38bb: -case 0x3abb: -case 0x3cbb: -case 0x3ebb: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x317b: -case 0x337b: -case 0x357b: -case 0x377b: -case 0x397b: -case 0x3b7b: -case 0x3d7b: -case 0x3f7b: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x31bb: -case 0x33bb: -case 0x35bb: -case 0x37bb: -case 0x39bb: -case 0x3bbb: -case 0x3dbb: -case 0x3fbb: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x30fb: -case 0x32fb: -case 0x34fb: -case 0x36fb: -case 0x38fb: -case 0x3afb: -case 0x3cfb: -case 0x3efb: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x313b: -case 0x333b: -case 0x353b: -case 0x373b: -case 0x393b: -case 0x3b3b: -case 0x3d3b: -case 0x3f3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd07b: -case 0xd27b: -case 0xd47b: -case 0xd67b: -case 0xd87b: -case 0xda7b: -case 0xdc7b: -case 0xde7b: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc07b: -case 0xc27b: -case 0xc47b: -case 0xc67b: -case 0xc87b: -case 0xca7b: -case 0xcc7b: -case 0xce7b: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0x41bb: -case 0x43bb: -case 0x45bb: -case 0x47bb: -case 0x49bb: -case 0x4bbb: -case 0x4dbb: -case 0x4fbb: - { - HAM src(this); HAM dst(this, instr_b11_b9); CHK(src, dst); - } - break; - -case 0xb07b: -case 0xb27b: -case 0xb47b: -case 0xb67b: -case 0xb87b: -case 0xba7b: -case 0xbc7b: -case 0xbe7b: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x303b: -case 0x323b: -case 0x343b: -case 0x363b: -case 0x383b: -case 0x3a3b: -case 0x3c3b: -case 0x3e3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x807b: -case 0x827b: -case 0x847b: -case 0x867b: -case 0x887b: -case 0x8a7b: -case 0x8c7b: -case 0x8e7b: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x907b: -case 0x927b: -case 0x947b: -case 0x967b: -case 0x987b: -case 0x9a7b: -case 0x9c7b: -case 0x9e7b: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0xd0fb: -case 0xd2fb: -case 0xd4fb: -case 0xd6fb: -case 0xd8fb: -case 0xdafb: -case 0xdcfb: -case 0xdefb: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb0fb: -case 0xb2fb: -case 0xb4fb: -case 0xb6fb: -case 0xb8fb: -case 0xbafb: -case 0xbcfb: -case 0xbefb: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x90fb: -case 0x92fb: -case 0x94fb: -case 0x96fb: -case 0x98fb: -case 0x9afb: -case 0x9cfb: -case 0x9efb: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x307b: -case 0x327b: -case 0x347b: -case 0x367b: -case 0x387b: -case 0x3a7b: -case 0x3c7b: -case 0x3e7b: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x44fb: - { - HAM src(this); MOVE_to_CCR(src); - } - break; - -case 0xc1fb: -case 0xc3fb: -case 0xc5fb: -case 0xc7fb: -case 0xc9fb: -case 0xcbfb: -case 0xcdfb: -case 0xcffb: - { - HAM src(this); MULS(src, instr_b11_b9); - } - break; - -case 0xc0fb: -case 0xc2fb: -case 0xc4fb: -case 0xc6fb: -case 0xc8fb: -case 0xcafb: -case 0xccfb: -case 0xcefb: - { - HAM src(this); MULU(src, instr_b11_b9); - } - break; - -case 0x42b9: - { - HAM dst(this); CLR(dst); - } - break; - -case 0x44b9: - { - HAM dst(this); NEG(dst); - } - break; - -case 0x40b9: - { - HAM dst(this); NEGX(dst); - } - break; - -case 0x46b9: - { - HAM dst(this); NOT(dst); - } - break; - -case 0x4ab9: - { - HAM dst(this); TST(dst); - } - break; - -case 0x23f9: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21f9: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1f9: -case 0xd3f9: -case 0xd5f9: -case 0xd7f9: -case 0xd9f9: -case 0xdbf9: -case 0xddf9: -case 0xdff9: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1f9: -case 0xb3f9: -case 0xb5f9: -case 0xb7f9: -case 0xb9f9: -case 0xbbf9: -case 0xbdf9: -case 0xbff9: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91f9: -case 0x93f9: -case 0x95f9: -case 0x97f9: -case 0x99f9: -case 0x9bf9: -case 0x9df9: -case 0x9ff9: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x20b9: -case 0x22b9: -case 0x24b9: -case 0x26b9: -case 0x28b9: -case 0x2ab9: -case 0x2cb9: -case 0x2eb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2179: -case 0x2379: -case 0x2579: -case 0x2779: -case 0x2979: -case 0x2b79: -case 0x2d79: -case 0x2f79: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x21b9: -case 0x23b9: -case 0x25b9: -case 0x27b9: -case 0x29b9: -case 0x2bb9: -case 0x2db9: -case 0x2fb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20f9: -case 0x22f9: -case 0x24f9: -case 0x26f9: -case 0x28f9: -case 0x2af9: -case 0x2cf9: -case 0x2ef9: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2139: -case 0x2339: -case 0x2539: -case 0x2739: -case 0x2939: -case 0x2b39: -case 0x2d39: -case 0x2f39: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd0b9: -case 0xd2b9: -case 0xd4b9: -case 0xd6b9: -case 0xd8b9: -case 0xdab9: -case 0xdcb9: -case 0xdeb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc0b9: -case 0xc2b9: -case 0xc4b9: -case 0xc6b9: -case 0xc8b9: -case 0xcab9: -case 0xccb9: -case 0xceb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb0b9: -case 0xb2b9: -case 0xb4b9: -case 0xb6b9: -case 0xb8b9: -case 0xbab9: -case 0xbcb9: -case 0xbeb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x2039: -case 0x2239: -case 0x2439: -case 0x2639: -case 0x2839: -case 0x2a39: -case 0x2c39: -case 0x2e39: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x80b9: -case 0x82b9: -case 0x84b9: -case 0x86b9: -case 0x88b9: -case 0x8ab9: -case 0x8cb9: -case 0x8eb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x90b9: -case 0x92b9: -case 0x94b9: -case 0x96b9: -case 0x98b9: -case 0x9ab9: -case 0x9cb9: -case 0x9eb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2079: -case 0x2279: -case 0x2479: -case 0x2679: -case 0x2879: -case 0x2a79: -case 0x2c79: -case 0x2e79: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x42b8: - { - HAM dst(this); CLR(dst); - } - break; - -case 0x44b8: - { - HAM dst(this); NEG(dst); - } - break; - -case 0x40b8: - { - HAM dst(this); NEGX(dst); - } - break; - -case 0x46b8: - { - HAM dst(this); NOT(dst); - } - break; - -case 0x4ab8: - { - HAM dst(this); TST(dst); - } - break; - -case 0x23f8: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21f8: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1f8: -case 0xd3f8: -case 0xd5f8: -case 0xd7f8: -case 0xd9f8: -case 0xdbf8: -case 0xddf8: -case 0xdff8: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1f8: -case 0xb3f8: -case 0xb5f8: -case 0xb7f8: -case 0xb9f8: -case 0xbbf8: -case 0xbdf8: -case 0xbff8: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91f8: -case 0x93f8: -case 0x95f8: -case 0x97f8: -case 0x99f8: -case 0x9bf8: -case 0x9df8: -case 0x9ff8: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x20b8: -case 0x22b8: -case 0x24b8: -case 0x26b8: -case 0x28b8: -case 0x2ab8: -case 0x2cb8: -case 0x2eb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2178: -case 0x2378: -case 0x2578: -case 0x2778: -case 0x2978: -case 0x2b78: -case 0x2d78: -case 0x2f78: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x21b8: -case 0x23b8: -case 0x25b8: -case 0x27b8: -case 0x29b8: -case 0x2bb8: -case 0x2db8: -case 0x2fb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20f8: -case 0x22f8: -case 0x24f8: -case 0x26f8: -case 0x28f8: -case 0x2af8: -case 0x2cf8: -case 0x2ef8: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2138: -case 0x2338: -case 0x2538: -case 0x2738: -case 0x2938: -case 0x2b38: -case 0x2d38: -case 0x2f38: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd0b8: -case 0xd2b8: -case 0xd4b8: -case 0xd6b8: -case 0xd8b8: -case 0xdab8: -case 0xdcb8: -case 0xdeb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc0b8: -case 0xc2b8: -case 0xc4b8: -case 0xc6b8: -case 0xc8b8: -case 0xcab8: -case 0xccb8: -case 0xceb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb0b8: -case 0xb2b8: -case 0xb4b8: -case 0xb6b8: -case 0xb8b8: -case 0xbab8: -case 0xbcb8: -case 0xbeb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x2038: -case 0x2238: -case 0x2438: -case 0x2638: -case 0x2838: -case 0x2a38: -case 0x2c38: -case 0x2e38: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x80b8: -case 0x82b8: -case 0x84b8: -case 0x86b8: -case 0x88b8: -case 0x8ab8: -case 0x8cb8: -case 0x8eb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x90b8: -case 0x92b8: -case 0x94b8: -case 0x96b8: -case 0x98b8: -case 0x9ab8: -case 0x9cb8: -case 0x9eb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2078: -case 0x2278: -case 0x2478: -case 0x2678: -case 0x2878: -case 0x2a78: -case 0x2c78: -case 0x2e78: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x23c8: -case 0x23c9: -case 0x23ca: -case 0x23cb: -case 0x23cc: -case 0x23cd: -case 0x23ce: -case 0x23cf: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21c8: -case 0x21c9: -case 0x21ca: -case 0x21cb: -case 0x21cc: -case 0x21cd: -case 0x21ce: -case 0x21cf: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1c8: -case 0xd1c9: -case 0xd1ca: -case 0xd1cb: -case 0xd1cc: -case 0xd1cd: -case 0xd1ce: -case 0xd1cf: -case 0xd3c8: -case 0xd3c9: -case 0xd3ca: -case 0xd3cb: -case 0xd3cc: -case 0xd3cd: -case 0xd3ce: -case 0xd3cf: -case 0xd5c8: -case 0xd5c9: -case 0xd5ca: -case 0xd5cb: -case 0xd5cc: -case 0xd5cd: -case 0xd5ce: -case 0xd5cf: -case 0xd7c8: -case 0xd7c9: -case 0xd7ca: -case 0xd7cb: -case 0xd7cc: -case 0xd7cd: -case 0xd7ce: -case 0xd7cf: -case 0xd9c8: -case 0xd9c9: -case 0xd9ca: -case 0xd9cb: -case 0xd9cc: -case 0xd9cd: -case 0xd9ce: -case 0xd9cf: -case 0xdbc8: -case 0xdbc9: -case 0xdbca: -case 0xdbcb: -case 0xdbcc: -case 0xdbcd: -case 0xdbce: -case 0xdbcf: -case 0xddc8: -case 0xddc9: -case 0xddca: -case 0xddcb: -case 0xddcc: -case 0xddcd: -case 0xddce: -case 0xddcf: -case 0xdfc8: -case 0xdfc9: -case 0xdfca: -case 0xdfcb: -case 0xdfcc: -case 0xdfcd: -case 0xdfce: -case 0xdfcf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1c8: -case 0xb1c9: -case 0xb1ca: -case 0xb1cb: -case 0xb1cc: -case 0xb1cd: -case 0xb1ce: -case 0xb1cf: -case 0xb3c8: -case 0xb3c9: -case 0xb3ca: -case 0xb3cb: -case 0xb3cc: -case 0xb3cd: -case 0xb3ce: -case 0xb3cf: -case 0xb5c8: -case 0xb5c9: -case 0xb5ca: -case 0xb5cb: -case 0xb5cc: -case 0xb5cd: -case 0xb5ce: -case 0xb5cf: -case 0xb7c8: -case 0xb7c9: -case 0xb7ca: -case 0xb7cb: -case 0xb7cc: -case 0xb7cd: -case 0xb7ce: -case 0xb7cf: -case 0xb9c8: -case 0xb9c9: -case 0xb9ca: -case 0xb9cb: -case 0xb9cc: -case 0xb9cd: -case 0xb9ce: -case 0xb9cf: -case 0xbbc8: -case 0xbbc9: -case 0xbbca: -case 0xbbcb: -case 0xbbcc: -case 0xbbcd: -case 0xbbce: -case 0xbbcf: -case 0xbdc8: -case 0xbdc9: -case 0xbdca: -case 0xbdcb: -case 0xbdcc: -case 0xbdcd: -case 0xbdce: -case 0xbdcf: -case 0xbfc8: -case 0xbfc9: -case 0xbfca: -case 0xbfcb: -case 0xbfcc: -case 0xbfcd: -case 0xbfce: -case 0xbfcf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91c8: -case 0x91c9: -case 0x91ca: -case 0x91cb: -case 0x91cc: -case 0x91cd: -case 0x91ce: -case 0x91cf: -case 0x93c8: -case 0x93c9: -case 0x93ca: -case 0x93cb: -case 0x93cc: -case 0x93cd: -case 0x93ce: -case 0x93cf: -case 0x95c8: -case 0x95c9: -case 0x95ca: -case 0x95cb: -case 0x95cc: -case 0x95cd: -case 0x95ce: -case 0x95cf: -case 0x97c8: -case 0x97c9: -case 0x97ca: -case 0x97cb: -case 0x97cc: -case 0x97cd: -case 0x97ce: -case 0x97cf: -case 0x99c8: -case 0x99c9: -case 0x99ca: -case 0x99cb: -case 0x99cc: -case 0x99cd: -case 0x99ce: -case 0x99cf: -case 0x9bc8: -case 0x9bc9: -case 0x9bca: -case 0x9bcb: -case 0x9bcc: -case 0x9bcd: -case 0x9bce: -case 0x9bcf: -case 0x9dc8: -case 0x9dc9: -case 0x9dca: -case 0x9dcb: -case 0x9dcc: -case 0x9dcd: -case 0x9dce: -case 0x9dcf: -case 0x9fc8: -case 0x9fc9: -case 0x9fca: -case 0x9fcb: -case 0x9fcc: -case 0x9fcd: -case 0x9fce: -case 0x9fcf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2088: -case 0x2089: -case 0x208a: -case 0x208b: -case 0x208c: -case 0x208d: -case 0x208e: -case 0x208f: -case 0x2288: -case 0x2289: -case 0x228a: -case 0x228b: -case 0x228c: -case 0x228d: -case 0x228e: -case 0x228f: -case 0x2488: -case 0x2489: -case 0x248a: -case 0x248b: -case 0x248c: -case 0x248d: -case 0x248e: -case 0x248f: -case 0x2688: -case 0x2689: -case 0x268a: -case 0x268b: -case 0x268c: -case 0x268d: -case 0x268e: -case 0x268f: -case 0x2888: -case 0x2889: -case 0x288a: -case 0x288b: -case 0x288c: -case 0x288d: -case 0x288e: -case 0x288f: -case 0x2a88: -case 0x2a89: -case 0x2a8a: -case 0x2a8b: -case 0x2a8c: -case 0x2a8d: -case 0x2a8e: -case 0x2a8f: -case 0x2c88: -case 0x2c89: -case 0x2c8a: -case 0x2c8b: -case 0x2c8c: -case 0x2c8d: -case 0x2c8e: -case 0x2c8f: -case 0x2e88: -case 0x2e89: -case 0x2e8a: -case 0x2e8b: -case 0x2e8c: -case 0x2e8d: -case 0x2e8e: -case 0x2e8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2148: -case 0x2149: -case 0x214a: -case 0x214b: -case 0x214c: -case 0x214d: -case 0x214e: -case 0x214f: -case 0x2348: -case 0x2349: -case 0x234a: -case 0x234b: -case 0x234c: -case 0x234d: -case 0x234e: -case 0x234f: -case 0x2548: -case 0x2549: -case 0x254a: -case 0x254b: -case 0x254c: -case 0x254d: -case 0x254e: -case 0x254f: -case 0x2748: -case 0x2749: -case 0x274a: -case 0x274b: -case 0x274c: -case 0x274d: -case 0x274e: -case 0x274f: -case 0x2948: -case 0x2949: -case 0x294a: -case 0x294b: -case 0x294c: -case 0x294d: -case 0x294e: -case 0x294f: -case 0x2b48: -case 0x2b49: -case 0x2b4a: -case 0x2b4b: -case 0x2b4c: -case 0x2b4d: -case 0x2b4e: -case 0x2b4f: -case 0x2d48: -case 0x2d49: -case 0x2d4a: -case 0x2d4b: -case 0x2d4c: -case 0x2d4d: -case 0x2d4e: -case 0x2d4f: -case 0x2f48: -case 0x2f49: -case 0x2f4a: -case 0x2f4b: -case 0x2f4c: -case 0x2f4d: -case 0x2f4e: -case 0x2f4f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2188: -case 0x2189: -case 0x218a: -case 0x218b: -case 0x218c: -case 0x218d: -case 0x218e: -case 0x218f: -case 0x2388: -case 0x2389: -case 0x238a: -case 0x238b: -case 0x238c: -case 0x238d: -case 0x238e: -case 0x238f: -case 0x2588: -case 0x2589: -case 0x258a: -case 0x258b: -case 0x258c: -case 0x258d: -case 0x258e: -case 0x258f: -case 0x2788: -case 0x2789: -case 0x278a: -case 0x278b: -case 0x278c: -case 0x278d: -case 0x278e: -case 0x278f: -case 0x2988: -case 0x2989: -case 0x298a: -case 0x298b: -case 0x298c: -case 0x298d: -case 0x298e: -case 0x298f: -case 0x2b88: -case 0x2b89: -case 0x2b8a: -case 0x2b8b: -case 0x2b8c: -case 0x2b8d: -case 0x2b8e: -case 0x2b8f: -case 0x2d88: -case 0x2d89: -case 0x2d8a: -case 0x2d8b: -case 0x2d8c: -case 0x2d8d: -case 0x2d8e: -case 0x2d8f: -case 0x2f88: -case 0x2f89: -case 0x2f8a: -case 0x2f8b: -case 0x2f8c: -case 0x2f8d: -case 0x2f8e: -case 0x2f8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20c8: -case 0x20c9: -case 0x20ca: -case 0x20cb: -case 0x20cc: -case 0x20cd: -case 0x20ce: -case 0x20cf: -case 0x22c8: -case 0x22c9: -case 0x22ca: -case 0x22cb: -case 0x22cc: -case 0x22cd: -case 0x22ce: -case 0x22cf: -case 0x24c8: -case 0x24c9: -case 0x24ca: -case 0x24cb: -case 0x24cc: -case 0x24cd: -case 0x24ce: -case 0x24cf: -case 0x26c8: -case 0x26c9: -case 0x26ca: -case 0x26cb: -case 0x26cc: -case 0x26cd: -case 0x26ce: -case 0x26cf: -case 0x28c8: -case 0x28c9: -case 0x28ca: -case 0x28cb: -case 0x28cc: -case 0x28cd: -case 0x28ce: -case 0x28cf: -case 0x2ac8: -case 0x2ac9: -case 0x2aca: -case 0x2acb: -case 0x2acc: -case 0x2acd: -case 0x2ace: -case 0x2acf: -case 0x2cc8: -case 0x2cc9: -case 0x2cca: -case 0x2ccb: -case 0x2ccc: -case 0x2ccd: -case 0x2cce: -case 0x2ccf: -case 0x2ec8: -case 0x2ec9: -case 0x2eca: -case 0x2ecb: -case 0x2ecc: -case 0x2ecd: -case 0x2ece: -case 0x2ecf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2108: -case 0x2109: -case 0x210a: -case 0x210b: -case 0x210c: -case 0x210d: -case 0x210e: -case 0x210f: -case 0x2308: -case 0x2309: -case 0x230a: -case 0x230b: -case 0x230c: -case 0x230d: -case 0x230e: -case 0x230f: -case 0x2508: -case 0x2509: -case 0x250a: -case 0x250b: -case 0x250c: -case 0x250d: -case 0x250e: -case 0x250f: -case 0x2708: -case 0x2709: -case 0x270a: -case 0x270b: -case 0x270c: -case 0x270d: -case 0x270e: -case 0x270f: -case 0x2908: -case 0x2909: -case 0x290a: -case 0x290b: -case 0x290c: -case 0x290d: -case 0x290e: -case 0x290f: -case 0x2b08: -case 0x2b09: -case 0x2b0a: -case 0x2b0b: -case 0x2b0c: -case 0x2b0d: -case 0x2b0e: -case 0x2b0f: -case 0x2d08: -case 0x2d09: -case 0x2d0a: -case 0x2d0b: -case 0x2d0c: -case 0x2d0d: -case 0x2d0e: -case 0x2d0f: -case 0x2f08: -case 0x2f09: -case 0x2f0a: -case 0x2f0b: -case 0x2f0c: -case 0x2f0d: -case 0x2f0e: -case 0x2f0f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd088: -case 0xd089: -case 0xd08a: -case 0xd08b: -case 0xd08c: -case 0xd08d: -case 0xd08e: -case 0xd08f: -case 0xd288: -case 0xd289: -case 0xd28a: -case 0xd28b: -case 0xd28c: -case 0xd28d: -case 0xd28e: -case 0xd28f: -case 0xd488: -case 0xd489: -case 0xd48a: -case 0xd48b: -case 0xd48c: -case 0xd48d: -case 0xd48e: -case 0xd48f: -case 0xd688: -case 0xd689: -case 0xd68a: -case 0xd68b: -case 0xd68c: -case 0xd68d: -case 0xd68e: -case 0xd68f: -case 0xd888: -case 0xd889: -case 0xd88a: -case 0xd88b: -case 0xd88c: -case 0xd88d: -case 0xd88e: -case 0xd88f: -case 0xda88: -case 0xda89: -case 0xda8a: -case 0xda8b: -case 0xda8c: -case 0xda8d: -case 0xda8e: -case 0xda8f: -case 0xdc88: -case 0xdc89: -case 0xdc8a: -case 0xdc8b: -case 0xdc8c: -case 0xdc8d: -case 0xdc8e: -case 0xdc8f: -case 0xde88: -case 0xde89: -case 0xde8a: -case 0xde8b: -case 0xde8c: -case 0xde8d: -case 0xde8e: -case 0xde8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb088: -case 0xb089: -case 0xb08a: -case 0xb08b: -case 0xb08c: -case 0xb08d: -case 0xb08e: -case 0xb08f: -case 0xb288: -case 0xb289: -case 0xb28a: -case 0xb28b: -case 0xb28c: -case 0xb28d: -case 0xb28e: -case 0xb28f: -case 0xb488: -case 0xb489: -case 0xb48a: -case 0xb48b: -case 0xb48c: -case 0xb48d: -case 0xb48e: -case 0xb48f: -case 0xb688: -case 0xb689: -case 0xb68a: -case 0xb68b: -case 0xb68c: -case 0xb68d: -case 0xb68e: -case 0xb68f: -case 0xb888: -case 0xb889: -case 0xb88a: -case 0xb88b: -case 0xb88c: -case 0xb88d: -case 0xb88e: -case 0xb88f: -case 0xba88: -case 0xba89: -case 0xba8a: -case 0xba8b: -case 0xba8c: -case 0xba8d: -case 0xba8e: -case 0xba8f: -case 0xbc88: -case 0xbc89: -case 0xbc8a: -case 0xbc8b: -case 0xbc8c: -case 0xbc8d: -case 0xbc8e: -case 0xbc8f: -case 0xbe88: -case 0xbe89: -case 0xbe8a: -case 0xbe8b: -case 0xbe8c: -case 0xbe8d: -case 0xbe8e: -case 0xbe8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x2008: -case 0x2009: -case 0x200a: -case 0x200b: -case 0x200c: -case 0x200d: -case 0x200e: -case 0x200f: -case 0x2208: -case 0x2209: -case 0x220a: -case 0x220b: -case 0x220c: -case 0x220d: -case 0x220e: -case 0x220f: -case 0x2408: -case 0x2409: -case 0x240a: -case 0x240b: -case 0x240c: -case 0x240d: -case 0x240e: -case 0x240f: -case 0x2608: -case 0x2609: -case 0x260a: -case 0x260b: -case 0x260c: -case 0x260d: -case 0x260e: -case 0x260f: -case 0x2808: -case 0x2809: -case 0x280a: -case 0x280b: -case 0x280c: -case 0x280d: -case 0x280e: -case 0x280f: -case 0x2a08: -case 0x2a09: -case 0x2a0a: -case 0x2a0b: -case 0x2a0c: -case 0x2a0d: -case 0x2a0e: -case 0x2a0f: -case 0x2c08: -case 0x2c09: -case 0x2c0a: -case 0x2c0b: -case 0x2c0c: -case 0x2c0d: -case 0x2c0e: -case 0x2c0f: -case 0x2e08: -case 0x2e09: -case 0x2e0a: -case 0x2e0b: -case 0x2e0c: -case 0x2e0d: -case 0x2e0e: -case 0x2e0f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x9088: -case 0x9089: -case 0x908a: -case 0x908b: -case 0x908c: -case 0x908d: -case 0x908e: -case 0x908f: -case 0x9288: -case 0x9289: -case 0x928a: -case 0x928b: -case 0x928c: -case 0x928d: -case 0x928e: -case 0x928f: -case 0x9488: -case 0x9489: -case 0x948a: -case 0x948b: -case 0x948c: -case 0x948d: -case 0x948e: -case 0x948f: -case 0x9688: -case 0x9689: -case 0x968a: -case 0x968b: -case 0x968c: -case 0x968d: -case 0x968e: -case 0x968f: -case 0x9888: -case 0x9889: -case 0x988a: -case 0x988b: -case 0x988c: -case 0x988d: -case 0x988e: -case 0x988f: -case 0x9a88: -case 0x9a89: -case 0x9a8a: -case 0x9a8b: -case 0x9a8c: -case 0x9a8d: -case 0x9a8e: -case 0x9a8f: -case 0x9c88: -case 0x9c89: -case 0x9c8a: -case 0x9c8b: -case 0x9c8c: -case 0x9c8d: -case 0x9c8e: -case 0x9c8f: -case 0x9e88: -case 0x9e89: -case 0x9e8a: -case 0x9e8b: -case 0x9e8c: -case 0x9e8d: -case 0x9e8e: -case 0x9e8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2048: -case 0x2049: -case 0x204a: -case 0x204b: -case 0x204c: -case 0x204d: -case 0x204e: -case 0x204f: -case 0x2248: -case 0x2249: -case 0x224a: -case 0x224b: -case 0x224c: -case 0x224d: -case 0x224e: -case 0x224f: -case 0x2448: -case 0x2449: -case 0x244a: -case 0x244b: -case 0x244c: -case 0x244d: -case 0x244e: -case 0x244f: -case 0x2648: -case 0x2649: -case 0x264a: -case 0x264b: -case 0x264c: -case 0x264d: -case 0x264e: -case 0x264f: -case 0x2848: -case 0x2849: -case 0x284a: -case 0x284b: -case 0x284c: -case 0x284d: -case 0x284e: -case 0x284f: -case 0x2a48: -case 0x2a49: -case 0x2a4a: -case 0x2a4b: -case 0x2a4c: -case 0x2a4d: -case 0x2a4e: -case 0x2a4f: -case 0x2c48: -case 0x2c49: -case 0x2c4a: -case 0x2c4b: -case 0x2c4c: -case 0x2c4d: -case 0x2c4e: -case 0x2c4f: -case 0x2e48: -case 0x2e49: -case 0x2e4a: -case 0x2e4b: -case 0x2e4c: -case 0x2e4d: -case 0x2e4e: -case 0x2e4f: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x4290: -case 0x4291: -case 0x4292: -case 0x4293: -case 0x4294: -case 0x4295: -case 0x4296: -case 0x4297: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4490: -case 0x4491: -case 0x4492: -case 0x4493: -case 0x4494: -case 0x4495: -case 0x4496: -case 0x4497: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4090: -case 0x4091: -case 0x4092: -case 0x4093: -case 0x4094: -case 0x4095: -case 0x4096: -case 0x4097: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4690: -case 0x4691: -case 0x4692: -case 0x4693: -case 0x4694: -case 0x4695: -case 0x4696: -case 0x4697: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4a90: -case 0x4a91: -case 0x4a92: -case 0x4a93: -case 0x4a94: -case 0x4a95: -case 0x4a96: -case 0x4a97: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x23d0: -case 0x23d1: -case 0x23d2: -case 0x23d3: -case 0x23d4: -case 0x23d5: -case 0x23d6: -case 0x23d7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21d0: -case 0x21d1: -case 0x21d2: -case 0x21d3: -case 0x21d4: -case 0x21d5: -case 0x21d6: -case 0x21d7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1d0: -case 0xd1d1: -case 0xd1d2: -case 0xd1d3: -case 0xd1d4: -case 0xd1d5: -case 0xd1d6: -case 0xd1d7: -case 0xd3d0: -case 0xd3d1: -case 0xd3d2: -case 0xd3d3: -case 0xd3d4: -case 0xd3d5: -case 0xd3d6: -case 0xd3d7: -case 0xd5d0: -case 0xd5d1: -case 0xd5d2: -case 0xd5d3: -case 0xd5d4: -case 0xd5d5: -case 0xd5d6: -case 0xd5d7: -case 0xd7d0: -case 0xd7d1: -case 0xd7d2: -case 0xd7d3: -case 0xd7d4: -case 0xd7d5: -case 0xd7d6: -case 0xd7d7: -case 0xd9d0: -case 0xd9d1: -case 0xd9d2: -case 0xd9d3: -case 0xd9d4: -case 0xd9d5: -case 0xd9d6: -case 0xd9d7: -case 0xdbd0: -case 0xdbd1: -case 0xdbd2: -case 0xdbd3: -case 0xdbd4: -case 0xdbd5: -case 0xdbd6: -case 0xdbd7: -case 0xddd0: -case 0xddd1: -case 0xddd2: -case 0xddd3: -case 0xddd4: -case 0xddd5: -case 0xddd6: -case 0xddd7: -case 0xdfd0: -case 0xdfd1: -case 0xdfd2: -case 0xdfd3: -case 0xdfd4: -case 0xdfd5: -case 0xdfd6: -case 0xdfd7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1d0: -case 0xb1d1: -case 0xb1d2: -case 0xb1d3: -case 0xb1d4: -case 0xb1d5: -case 0xb1d6: -case 0xb1d7: -case 0xb3d0: -case 0xb3d1: -case 0xb3d2: -case 0xb3d3: -case 0xb3d4: -case 0xb3d5: -case 0xb3d6: -case 0xb3d7: -case 0xb5d0: -case 0xb5d1: -case 0xb5d2: -case 0xb5d3: -case 0xb5d4: -case 0xb5d5: -case 0xb5d6: -case 0xb5d7: -case 0xb7d0: -case 0xb7d1: -case 0xb7d2: -case 0xb7d3: -case 0xb7d4: -case 0xb7d5: -case 0xb7d6: -case 0xb7d7: -case 0xb9d0: -case 0xb9d1: -case 0xb9d2: -case 0xb9d3: -case 0xb9d4: -case 0xb9d5: -case 0xb9d6: -case 0xb9d7: -case 0xbbd0: -case 0xbbd1: -case 0xbbd2: -case 0xbbd3: -case 0xbbd4: -case 0xbbd5: -case 0xbbd6: -case 0xbbd7: -case 0xbdd0: -case 0xbdd1: -case 0xbdd2: -case 0xbdd3: -case 0xbdd4: -case 0xbdd5: -case 0xbdd6: -case 0xbdd7: -case 0xbfd0: -case 0xbfd1: -case 0xbfd2: -case 0xbfd3: -case 0xbfd4: -case 0xbfd5: -case 0xbfd6: -case 0xbfd7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91d0: -case 0x91d1: -case 0x91d2: -case 0x91d3: -case 0x91d4: -case 0x91d5: -case 0x91d6: -case 0x91d7: -case 0x93d0: -case 0x93d1: -case 0x93d2: -case 0x93d3: -case 0x93d4: -case 0x93d5: -case 0x93d6: -case 0x93d7: -case 0x95d0: -case 0x95d1: -case 0x95d2: -case 0x95d3: -case 0x95d4: -case 0x95d5: -case 0x95d6: -case 0x95d7: -case 0x97d0: -case 0x97d1: -case 0x97d2: -case 0x97d3: -case 0x97d4: -case 0x97d5: -case 0x97d6: -case 0x97d7: -case 0x99d0: -case 0x99d1: -case 0x99d2: -case 0x99d3: -case 0x99d4: -case 0x99d5: -case 0x99d6: -case 0x99d7: -case 0x9bd0: -case 0x9bd1: -case 0x9bd2: -case 0x9bd3: -case 0x9bd4: -case 0x9bd5: -case 0x9bd6: -case 0x9bd7: -case 0x9dd0: -case 0x9dd1: -case 0x9dd2: -case 0x9dd3: -case 0x9dd4: -case 0x9dd5: -case 0x9dd6: -case 0x9dd7: -case 0x9fd0: -case 0x9fd1: -case 0x9fd2: -case 0x9fd3: -case 0x9fd4: -case 0x9fd5: -case 0x9fd6: -case 0x9fd7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2090: -case 0x2091: -case 0x2092: -case 0x2093: -case 0x2094: -case 0x2095: -case 0x2096: -case 0x2097: -case 0x2290: -case 0x2291: -case 0x2292: -case 0x2293: -case 0x2294: -case 0x2295: -case 0x2296: -case 0x2297: -case 0x2490: -case 0x2491: -case 0x2492: -case 0x2493: -case 0x2494: -case 0x2495: -case 0x2496: -case 0x2497: -case 0x2690: -case 0x2691: -case 0x2692: -case 0x2693: -case 0x2694: -case 0x2695: -case 0x2696: -case 0x2697: -case 0x2890: -case 0x2891: -case 0x2892: -case 0x2893: -case 0x2894: -case 0x2895: -case 0x2896: -case 0x2897: -case 0x2a90: -case 0x2a91: -case 0x2a92: -case 0x2a93: -case 0x2a94: -case 0x2a95: -case 0x2a96: -case 0x2a97: -case 0x2c90: -case 0x2c91: -case 0x2c92: -case 0x2c93: -case 0x2c94: -case 0x2c95: -case 0x2c96: -case 0x2c97: -case 0x2e90: -case 0x2e91: -case 0x2e92: -case 0x2e93: -case 0x2e94: -case 0x2e95: -case 0x2e96: -case 0x2e97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2150: -case 0x2151: -case 0x2152: -case 0x2153: -case 0x2154: -case 0x2155: -case 0x2156: -case 0x2157: -case 0x2350: -case 0x2351: -case 0x2352: -case 0x2353: -case 0x2354: -case 0x2355: -case 0x2356: -case 0x2357: -case 0x2550: -case 0x2551: -case 0x2552: -case 0x2553: -case 0x2554: -case 0x2555: -case 0x2556: -case 0x2557: -case 0x2750: -case 0x2751: -case 0x2752: -case 0x2753: -case 0x2754: -case 0x2755: -case 0x2756: -case 0x2757: -case 0x2950: -case 0x2951: -case 0x2952: -case 0x2953: -case 0x2954: -case 0x2955: -case 0x2956: -case 0x2957: -case 0x2b50: -case 0x2b51: -case 0x2b52: -case 0x2b53: -case 0x2b54: -case 0x2b55: -case 0x2b56: -case 0x2b57: -case 0x2d50: -case 0x2d51: -case 0x2d52: -case 0x2d53: -case 0x2d54: -case 0x2d55: -case 0x2d56: -case 0x2d57: -case 0x2f50: -case 0x2f51: -case 0x2f52: -case 0x2f53: -case 0x2f54: -case 0x2f55: -case 0x2f56: -case 0x2f57: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2190: -case 0x2191: -case 0x2192: -case 0x2193: -case 0x2194: -case 0x2195: -case 0x2196: -case 0x2197: -case 0x2390: -case 0x2391: -case 0x2392: -case 0x2393: -case 0x2394: -case 0x2395: -case 0x2396: -case 0x2397: -case 0x2590: -case 0x2591: -case 0x2592: -case 0x2593: -case 0x2594: -case 0x2595: -case 0x2596: -case 0x2597: -case 0x2790: -case 0x2791: -case 0x2792: -case 0x2793: -case 0x2794: -case 0x2795: -case 0x2796: -case 0x2797: -case 0x2990: -case 0x2991: -case 0x2992: -case 0x2993: -case 0x2994: -case 0x2995: -case 0x2996: -case 0x2997: -case 0x2b90: -case 0x2b91: -case 0x2b92: -case 0x2b93: -case 0x2b94: -case 0x2b95: -case 0x2b96: -case 0x2b97: -case 0x2d90: -case 0x2d91: -case 0x2d92: -case 0x2d93: -case 0x2d94: -case 0x2d95: -case 0x2d96: -case 0x2d97: -case 0x2f90: -case 0x2f91: -case 0x2f92: -case 0x2f93: -case 0x2f94: -case 0x2f95: -case 0x2f96: -case 0x2f97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20d0: -case 0x20d1: -case 0x20d2: -case 0x20d3: -case 0x20d4: -case 0x20d5: -case 0x20d6: -case 0x20d7: -case 0x22d0: -case 0x22d1: -case 0x22d2: -case 0x22d3: -case 0x22d4: -case 0x22d5: -case 0x22d6: -case 0x22d7: -case 0x24d0: -case 0x24d1: -case 0x24d2: -case 0x24d3: -case 0x24d4: -case 0x24d5: -case 0x24d6: -case 0x24d7: -case 0x26d0: -case 0x26d1: -case 0x26d2: -case 0x26d3: -case 0x26d4: -case 0x26d5: -case 0x26d6: -case 0x26d7: -case 0x28d0: -case 0x28d1: -case 0x28d2: -case 0x28d3: -case 0x28d4: -case 0x28d5: -case 0x28d6: -case 0x28d7: -case 0x2ad0: -case 0x2ad1: -case 0x2ad2: -case 0x2ad3: -case 0x2ad4: -case 0x2ad5: -case 0x2ad6: -case 0x2ad7: -case 0x2cd0: -case 0x2cd1: -case 0x2cd2: -case 0x2cd3: -case 0x2cd4: -case 0x2cd5: -case 0x2cd6: -case 0x2cd7: -case 0x2ed0: -case 0x2ed1: -case 0x2ed2: -case 0x2ed3: -case 0x2ed4: -case 0x2ed5: -case 0x2ed6: -case 0x2ed7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2110: -case 0x2111: -case 0x2112: -case 0x2113: -case 0x2114: -case 0x2115: -case 0x2116: -case 0x2117: -case 0x2310: -case 0x2311: -case 0x2312: -case 0x2313: -case 0x2314: -case 0x2315: -case 0x2316: -case 0x2317: -case 0x2510: -case 0x2511: -case 0x2512: -case 0x2513: -case 0x2514: -case 0x2515: -case 0x2516: -case 0x2517: -case 0x2710: -case 0x2711: -case 0x2712: -case 0x2713: -case 0x2714: -case 0x2715: -case 0x2716: -case 0x2717: -case 0x2910: -case 0x2911: -case 0x2912: -case 0x2913: -case 0x2914: -case 0x2915: -case 0x2916: -case 0x2917: -case 0x2b10: -case 0x2b11: -case 0x2b12: -case 0x2b13: -case 0x2b14: -case 0x2b15: -case 0x2b16: -case 0x2b17: -case 0x2d10: -case 0x2d11: -case 0x2d12: -case 0x2d13: -case 0x2d14: -case 0x2d15: -case 0x2d16: -case 0x2d17: -case 0x2f10: -case 0x2f11: -case 0x2f12: -case 0x2f13: -case 0x2f14: -case 0x2f15: -case 0x2f16: -case 0x2f17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd090: -case 0xd091: -case 0xd092: -case 0xd093: -case 0xd094: -case 0xd095: -case 0xd096: -case 0xd097: -case 0xd290: -case 0xd291: -case 0xd292: -case 0xd293: -case 0xd294: -case 0xd295: -case 0xd296: -case 0xd297: -case 0xd490: -case 0xd491: -case 0xd492: -case 0xd493: -case 0xd494: -case 0xd495: -case 0xd496: -case 0xd497: -case 0xd690: -case 0xd691: -case 0xd692: -case 0xd693: -case 0xd694: -case 0xd695: -case 0xd696: -case 0xd697: -case 0xd890: -case 0xd891: -case 0xd892: -case 0xd893: -case 0xd894: -case 0xd895: -case 0xd896: -case 0xd897: -case 0xda90: -case 0xda91: -case 0xda92: -case 0xda93: -case 0xda94: -case 0xda95: -case 0xda96: -case 0xda97: -case 0xdc90: -case 0xdc91: -case 0xdc92: -case 0xdc93: -case 0xdc94: -case 0xdc95: -case 0xdc96: -case 0xdc97: -case 0xde90: -case 0xde91: -case 0xde92: -case 0xde93: -case 0xde94: -case 0xde95: -case 0xde96: -case 0xde97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc090: -case 0xc091: -case 0xc092: -case 0xc093: -case 0xc094: -case 0xc095: -case 0xc096: -case 0xc097: -case 0xc290: -case 0xc291: -case 0xc292: -case 0xc293: -case 0xc294: -case 0xc295: -case 0xc296: -case 0xc297: -case 0xc490: -case 0xc491: -case 0xc492: -case 0xc493: -case 0xc494: -case 0xc495: -case 0xc496: -case 0xc497: -case 0xc690: -case 0xc691: -case 0xc692: -case 0xc693: -case 0xc694: -case 0xc695: -case 0xc696: -case 0xc697: -case 0xc890: -case 0xc891: -case 0xc892: -case 0xc893: -case 0xc894: -case 0xc895: -case 0xc896: -case 0xc897: -case 0xca90: -case 0xca91: -case 0xca92: -case 0xca93: -case 0xca94: -case 0xca95: -case 0xca96: -case 0xca97: -case 0xcc90: -case 0xcc91: -case 0xcc92: -case 0xcc93: -case 0xcc94: -case 0xcc95: -case 0xcc96: -case 0xcc97: -case 0xce90: -case 0xce91: -case 0xce92: -case 0xce93: -case 0xce94: -case 0xce95: -case 0xce96: -case 0xce97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb090: -case 0xb091: -case 0xb092: -case 0xb093: -case 0xb094: -case 0xb095: -case 0xb096: -case 0xb097: -case 0xb290: -case 0xb291: -case 0xb292: -case 0xb293: -case 0xb294: -case 0xb295: -case 0xb296: -case 0xb297: -case 0xb490: -case 0xb491: -case 0xb492: -case 0xb493: -case 0xb494: -case 0xb495: -case 0xb496: -case 0xb497: -case 0xb690: -case 0xb691: -case 0xb692: -case 0xb693: -case 0xb694: -case 0xb695: -case 0xb696: -case 0xb697: -case 0xb890: -case 0xb891: -case 0xb892: -case 0xb893: -case 0xb894: -case 0xb895: -case 0xb896: -case 0xb897: -case 0xba90: -case 0xba91: -case 0xba92: -case 0xba93: -case 0xba94: -case 0xba95: -case 0xba96: -case 0xba97: -case 0xbc90: -case 0xbc91: -case 0xbc92: -case 0xbc93: -case 0xbc94: -case 0xbc95: -case 0xbc96: -case 0xbc97: -case 0xbe90: -case 0xbe91: -case 0xbe92: -case 0xbe93: -case 0xbe94: -case 0xbe95: -case 0xbe96: -case 0xbe97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x2010: -case 0x2011: -case 0x2012: -case 0x2013: -case 0x2014: -case 0x2015: -case 0x2016: -case 0x2017: -case 0x2210: -case 0x2211: -case 0x2212: -case 0x2213: -case 0x2214: -case 0x2215: -case 0x2216: -case 0x2217: -case 0x2410: -case 0x2411: -case 0x2412: -case 0x2413: -case 0x2414: -case 0x2415: -case 0x2416: -case 0x2417: -case 0x2610: -case 0x2611: -case 0x2612: -case 0x2613: -case 0x2614: -case 0x2615: -case 0x2616: -case 0x2617: -case 0x2810: -case 0x2811: -case 0x2812: -case 0x2813: -case 0x2814: -case 0x2815: -case 0x2816: -case 0x2817: -case 0x2a10: -case 0x2a11: -case 0x2a12: -case 0x2a13: -case 0x2a14: -case 0x2a15: -case 0x2a16: -case 0x2a17: -case 0x2c10: -case 0x2c11: -case 0x2c12: -case 0x2c13: -case 0x2c14: -case 0x2c15: -case 0x2c16: -case 0x2c17: -case 0x2e10: -case 0x2e11: -case 0x2e12: -case 0x2e13: -case 0x2e14: -case 0x2e15: -case 0x2e16: -case 0x2e17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8090: -case 0x8091: -case 0x8092: -case 0x8093: -case 0x8094: -case 0x8095: -case 0x8096: -case 0x8097: -case 0x8290: -case 0x8291: -case 0x8292: -case 0x8293: -case 0x8294: -case 0x8295: -case 0x8296: -case 0x8297: -case 0x8490: -case 0x8491: -case 0x8492: -case 0x8493: -case 0x8494: -case 0x8495: -case 0x8496: -case 0x8497: -case 0x8690: -case 0x8691: -case 0x8692: -case 0x8693: -case 0x8694: -case 0x8695: -case 0x8696: -case 0x8697: -case 0x8890: -case 0x8891: -case 0x8892: -case 0x8893: -case 0x8894: -case 0x8895: -case 0x8896: -case 0x8897: -case 0x8a90: -case 0x8a91: -case 0x8a92: -case 0x8a93: -case 0x8a94: -case 0x8a95: -case 0x8a96: -case 0x8a97: -case 0x8c90: -case 0x8c91: -case 0x8c92: -case 0x8c93: -case 0x8c94: -case 0x8c95: -case 0x8c96: -case 0x8c97: -case 0x8e90: -case 0x8e91: -case 0x8e92: -case 0x8e93: -case 0x8e94: -case 0x8e95: -case 0x8e96: -case 0x8e97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9090: -case 0x9091: -case 0x9092: -case 0x9093: -case 0x9094: -case 0x9095: -case 0x9096: -case 0x9097: -case 0x9290: -case 0x9291: -case 0x9292: -case 0x9293: -case 0x9294: -case 0x9295: -case 0x9296: -case 0x9297: -case 0x9490: -case 0x9491: -case 0x9492: -case 0x9493: -case 0x9494: -case 0x9495: -case 0x9496: -case 0x9497: -case 0x9690: -case 0x9691: -case 0x9692: -case 0x9693: -case 0x9694: -case 0x9695: -case 0x9696: -case 0x9697: -case 0x9890: -case 0x9891: -case 0x9892: -case 0x9893: -case 0x9894: -case 0x9895: -case 0x9896: -case 0x9897: -case 0x9a90: -case 0x9a91: -case 0x9a92: -case 0x9a93: -case 0x9a94: -case 0x9a95: -case 0x9a96: -case 0x9a97: -case 0x9c90: -case 0x9c91: -case 0x9c92: -case 0x9c93: -case 0x9c94: -case 0x9c95: -case 0x9c96: -case 0x9c97: -case 0x9e90: -case 0x9e91: -case 0x9e92: -case 0x9e93: -case 0x9e94: -case 0x9e95: -case 0x9e96: -case 0x9e97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2050: -case 0x2051: -case 0x2052: -case 0x2053: -case 0x2054: -case 0x2055: -case 0x2056: -case 0x2057: -case 0x2250: -case 0x2251: -case 0x2252: -case 0x2253: -case 0x2254: -case 0x2255: -case 0x2256: -case 0x2257: -case 0x2450: -case 0x2451: -case 0x2452: -case 0x2453: -case 0x2454: -case 0x2455: -case 0x2456: -case 0x2457: -case 0x2650: -case 0x2651: -case 0x2652: -case 0x2653: -case 0x2654: -case 0x2655: -case 0x2656: -case 0x2657: -case 0x2850: -case 0x2851: -case 0x2852: -case 0x2853: -case 0x2854: -case 0x2855: -case 0x2856: -case 0x2857: -case 0x2a50: -case 0x2a51: -case 0x2a52: -case 0x2a53: -case 0x2a54: -case 0x2a55: -case 0x2a56: -case 0x2a57: -case 0x2c50: -case 0x2c51: -case 0x2c52: -case 0x2c53: -case 0x2c54: -case 0x2c55: -case 0x2c56: -case 0x2c57: -case 0x2e50: -case 0x2e51: -case 0x2e52: -case 0x2e53: -case 0x2e54: -case 0x2e55: -case 0x2e56: -case 0x2e57: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x42a8: -case 0x42a9: -case 0x42aa: -case 0x42ab: -case 0x42ac: -case 0x42ad: -case 0x42ae: -case 0x42af: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x44a8: -case 0x44a9: -case 0x44aa: -case 0x44ab: -case 0x44ac: -case 0x44ad: -case 0x44ae: -case 0x44af: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x40a8: -case 0x40a9: -case 0x40aa: -case 0x40ab: -case 0x40ac: -case 0x40ad: -case 0x40ae: -case 0x40af: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x46a8: -case 0x46a9: -case 0x46aa: -case 0x46ab: -case 0x46ac: -case 0x46ad: -case 0x46ae: -case 0x46af: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4aa8: -case 0x4aa9: -case 0x4aaa: -case 0x4aab: -case 0x4aac: -case 0x4aad: -case 0x4aae: -case 0x4aaf: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x23e8: -case 0x23e9: -case 0x23ea: -case 0x23eb: -case 0x23ec: -case 0x23ed: -case 0x23ee: -case 0x23ef: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21e8: -case 0x21e9: -case 0x21ea: -case 0x21eb: -case 0x21ec: -case 0x21ed: -case 0x21ee: -case 0x21ef: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1e8: -case 0xd1e9: -case 0xd1ea: -case 0xd1eb: -case 0xd1ec: -case 0xd1ed: -case 0xd1ee: -case 0xd1ef: -case 0xd3e8: -case 0xd3e9: -case 0xd3ea: -case 0xd3eb: -case 0xd3ec: -case 0xd3ed: -case 0xd3ee: -case 0xd3ef: -case 0xd5e8: -case 0xd5e9: -case 0xd5ea: -case 0xd5eb: -case 0xd5ec: -case 0xd5ed: -case 0xd5ee: -case 0xd5ef: -case 0xd7e8: -case 0xd7e9: -case 0xd7ea: -case 0xd7eb: -case 0xd7ec: -case 0xd7ed: -case 0xd7ee: -case 0xd7ef: -case 0xd9e8: -case 0xd9e9: -case 0xd9ea: -case 0xd9eb: -case 0xd9ec: -case 0xd9ed: -case 0xd9ee: -case 0xd9ef: -case 0xdbe8: -case 0xdbe9: -case 0xdbea: -case 0xdbeb: -case 0xdbec: -case 0xdbed: -case 0xdbee: -case 0xdbef: -case 0xdde8: -case 0xdde9: -case 0xddea: -case 0xddeb: -case 0xddec: -case 0xdded: -case 0xddee: -case 0xddef: -case 0xdfe8: -case 0xdfe9: -case 0xdfea: -case 0xdfeb: -case 0xdfec: -case 0xdfed: -case 0xdfee: -case 0xdfef: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1e8: -case 0xb1e9: -case 0xb1ea: -case 0xb1eb: -case 0xb1ec: -case 0xb1ed: -case 0xb1ee: -case 0xb1ef: -case 0xb3e8: -case 0xb3e9: -case 0xb3ea: -case 0xb3eb: -case 0xb3ec: -case 0xb3ed: -case 0xb3ee: -case 0xb3ef: -case 0xb5e8: -case 0xb5e9: -case 0xb5ea: -case 0xb5eb: -case 0xb5ec: -case 0xb5ed: -case 0xb5ee: -case 0xb5ef: -case 0xb7e8: -case 0xb7e9: -case 0xb7ea: -case 0xb7eb: -case 0xb7ec: -case 0xb7ed: -case 0xb7ee: -case 0xb7ef: -case 0xb9e8: -case 0xb9e9: -case 0xb9ea: -case 0xb9eb: -case 0xb9ec: -case 0xb9ed: -case 0xb9ee: -case 0xb9ef: -case 0xbbe8: -case 0xbbe9: -case 0xbbea: -case 0xbbeb: -case 0xbbec: -case 0xbbed: -case 0xbbee: -case 0xbbef: -case 0xbde8: -case 0xbde9: -case 0xbdea: -case 0xbdeb: -case 0xbdec: -case 0xbded: -case 0xbdee: -case 0xbdef: -case 0xbfe8: -case 0xbfe9: -case 0xbfea: -case 0xbfeb: -case 0xbfec: -case 0xbfed: -case 0xbfee: -case 0xbfef: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91e8: -case 0x91e9: -case 0x91ea: -case 0x91eb: -case 0x91ec: -case 0x91ed: -case 0x91ee: -case 0x91ef: -case 0x93e8: -case 0x93e9: -case 0x93ea: -case 0x93eb: -case 0x93ec: -case 0x93ed: -case 0x93ee: -case 0x93ef: -case 0x95e8: -case 0x95e9: -case 0x95ea: -case 0x95eb: -case 0x95ec: -case 0x95ed: -case 0x95ee: -case 0x95ef: -case 0x97e8: -case 0x97e9: -case 0x97ea: -case 0x97eb: -case 0x97ec: -case 0x97ed: -case 0x97ee: -case 0x97ef: -case 0x99e8: -case 0x99e9: -case 0x99ea: -case 0x99eb: -case 0x99ec: -case 0x99ed: -case 0x99ee: -case 0x99ef: -case 0x9be8: -case 0x9be9: -case 0x9bea: -case 0x9beb: -case 0x9bec: -case 0x9bed: -case 0x9bee: -case 0x9bef: -case 0x9de8: -case 0x9de9: -case 0x9dea: -case 0x9deb: -case 0x9dec: -case 0x9ded: -case 0x9dee: -case 0x9def: -case 0x9fe8: -case 0x9fe9: -case 0x9fea: -case 0x9feb: -case 0x9fec: -case 0x9fed: -case 0x9fee: -case 0x9fef: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x20a8: -case 0x20a9: -case 0x20aa: -case 0x20ab: -case 0x20ac: -case 0x20ad: -case 0x20ae: -case 0x20af: -case 0x22a8: -case 0x22a9: -case 0x22aa: -case 0x22ab: -case 0x22ac: -case 0x22ad: -case 0x22ae: -case 0x22af: -case 0x24a8: -case 0x24a9: -case 0x24aa: -case 0x24ab: -case 0x24ac: -case 0x24ad: -case 0x24ae: -case 0x24af: -case 0x26a8: -case 0x26a9: -case 0x26aa: -case 0x26ab: -case 0x26ac: -case 0x26ad: -case 0x26ae: -case 0x26af: -case 0x28a8: -case 0x28a9: -case 0x28aa: -case 0x28ab: -case 0x28ac: -case 0x28ad: -case 0x28ae: -case 0x28af: -case 0x2aa8: -case 0x2aa9: -case 0x2aaa: -case 0x2aab: -case 0x2aac: -case 0x2aad: -case 0x2aae: -case 0x2aaf: -case 0x2ca8: -case 0x2ca9: -case 0x2caa: -case 0x2cab: -case 0x2cac: -case 0x2cad: -case 0x2cae: -case 0x2caf: -case 0x2ea8: -case 0x2ea9: -case 0x2eaa: -case 0x2eab: -case 0x2eac: -case 0x2ead: -case 0x2eae: -case 0x2eaf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2168: -case 0x2169: -case 0x216a: -case 0x216b: -case 0x216c: -case 0x216d: -case 0x216e: -case 0x216f: -case 0x2368: -case 0x2369: -case 0x236a: -case 0x236b: -case 0x236c: -case 0x236d: -case 0x236e: -case 0x236f: -case 0x2568: -case 0x2569: -case 0x256a: -case 0x256b: -case 0x256c: -case 0x256d: -case 0x256e: -case 0x256f: -case 0x2768: -case 0x2769: -case 0x276a: -case 0x276b: -case 0x276c: -case 0x276d: -case 0x276e: -case 0x276f: -case 0x2968: -case 0x2969: -case 0x296a: -case 0x296b: -case 0x296c: -case 0x296d: -case 0x296e: -case 0x296f: -case 0x2b68: -case 0x2b69: -case 0x2b6a: -case 0x2b6b: -case 0x2b6c: -case 0x2b6d: -case 0x2b6e: -case 0x2b6f: -case 0x2d68: -case 0x2d69: -case 0x2d6a: -case 0x2d6b: -case 0x2d6c: -case 0x2d6d: -case 0x2d6e: -case 0x2d6f: -case 0x2f68: -case 0x2f69: -case 0x2f6a: -case 0x2f6b: -case 0x2f6c: -case 0x2f6d: -case 0x2f6e: -case 0x2f6f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x21a8: -case 0x21a9: -case 0x21aa: -case 0x21ab: -case 0x21ac: -case 0x21ad: -case 0x21ae: -case 0x21af: -case 0x23a8: -case 0x23a9: -case 0x23aa: -case 0x23ab: -case 0x23ac: -case 0x23ad: -case 0x23ae: -case 0x23af: -case 0x25a8: -case 0x25a9: -case 0x25aa: -case 0x25ab: -case 0x25ac: -case 0x25ad: -case 0x25ae: -case 0x25af: -case 0x27a8: -case 0x27a9: -case 0x27aa: -case 0x27ab: -case 0x27ac: -case 0x27ad: -case 0x27ae: -case 0x27af: -case 0x29a8: -case 0x29a9: -case 0x29aa: -case 0x29ab: -case 0x29ac: -case 0x29ad: -case 0x29ae: -case 0x29af: -case 0x2ba8: -case 0x2ba9: -case 0x2baa: -case 0x2bab: -case 0x2bac: -case 0x2bad: -case 0x2bae: -case 0x2baf: -case 0x2da8: -case 0x2da9: -case 0x2daa: -case 0x2dab: -case 0x2dac: -case 0x2dad: -case 0x2dae: -case 0x2daf: -case 0x2fa8: -case 0x2fa9: -case 0x2faa: -case 0x2fab: -case 0x2fac: -case 0x2fad: -case 0x2fae: -case 0x2faf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20e8: -case 0x20e9: -case 0x20ea: -case 0x20eb: -case 0x20ec: -case 0x20ed: -case 0x20ee: -case 0x20ef: -case 0x22e8: -case 0x22e9: -case 0x22ea: -case 0x22eb: -case 0x22ec: -case 0x22ed: -case 0x22ee: -case 0x22ef: -case 0x24e8: -case 0x24e9: -case 0x24ea: -case 0x24eb: -case 0x24ec: -case 0x24ed: -case 0x24ee: -case 0x24ef: -case 0x26e8: -case 0x26e9: -case 0x26ea: -case 0x26eb: -case 0x26ec: -case 0x26ed: -case 0x26ee: -case 0x26ef: -case 0x28e8: -case 0x28e9: -case 0x28ea: -case 0x28eb: -case 0x28ec: -case 0x28ed: -case 0x28ee: -case 0x28ef: -case 0x2ae8: -case 0x2ae9: -case 0x2aea: -case 0x2aeb: -case 0x2aec: -case 0x2aed: -case 0x2aee: -case 0x2aef: -case 0x2ce8: -case 0x2ce9: -case 0x2cea: -case 0x2ceb: -case 0x2cec: -case 0x2ced: -case 0x2cee: -case 0x2cef: -case 0x2ee8: -case 0x2ee9: -case 0x2eea: -case 0x2eeb: -case 0x2eec: -case 0x2eed: -case 0x2eee: -case 0x2eef: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2128: -case 0x2129: -case 0x212a: -case 0x212b: -case 0x212c: -case 0x212d: -case 0x212e: -case 0x212f: -case 0x2328: -case 0x2329: -case 0x232a: -case 0x232b: -case 0x232c: -case 0x232d: -case 0x232e: -case 0x232f: -case 0x2528: -case 0x2529: -case 0x252a: -case 0x252b: -case 0x252c: -case 0x252d: -case 0x252e: -case 0x252f: -case 0x2728: -case 0x2729: -case 0x272a: -case 0x272b: -case 0x272c: -case 0x272d: -case 0x272e: -case 0x272f: -case 0x2928: -case 0x2929: -case 0x292a: -case 0x292b: -case 0x292c: -case 0x292d: -case 0x292e: -case 0x292f: -case 0x2b28: -case 0x2b29: -case 0x2b2a: -case 0x2b2b: -case 0x2b2c: -case 0x2b2d: -case 0x2b2e: -case 0x2b2f: -case 0x2d28: -case 0x2d29: -case 0x2d2a: -case 0x2d2b: -case 0x2d2c: -case 0x2d2d: -case 0x2d2e: -case 0x2d2f: -case 0x2f28: -case 0x2f29: -case 0x2f2a: -case 0x2f2b: -case 0x2f2c: -case 0x2f2d: -case 0x2f2e: -case 0x2f2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd0a8: -case 0xd0a9: -case 0xd0aa: -case 0xd0ab: -case 0xd0ac: -case 0xd0ad: -case 0xd0ae: -case 0xd0af: -case 0xd2a8: -case 0xd2a9: -case 0xd2aa: -case 0xd2ab: -case 0xd2ac: -case 0xd2ad: -case 0xd2ae: -case 0xd2af: -case 0xd4a8: -case 0xd4a9: -case 0xd4aa: -case 0xd4ab: -case 0xd4ac: -case 0xd4ad: -case 0xd4ae: -case 0xd4af: -case 0xd6a8: -case 0xd6a9: -case 0xd6aa: -case 0xd6ab: -case 0xd6ac: -case 0xd6ad: -case 0xd6ae: -case 0xd6af: -case 0xd8a8: -case 0xd8a9: -case 0xd8aa: -case 0xd8ab: -case 0xd8ac: -case 0xd8ad: -case 0xd8ae: -case 0xd8af: -case 0xdaa8: -case 0xdaa9: -case 0xdaaa: -case 0xdaab: -case 0xdaac: -case 0xdaad: -case 0xdaae: -case 0xdaaf: -case 0xdca8: -case 0xdca9: -case 0xdcaa: -case 0xdcab: -case 0xdcac: -case 0xdcad: -case 0xdcae: -case 0xdcaf: -case 0xdea8: -case 0xdea9: -case 0xdeaa: -case 0xdeab: -case 0xdeac: -case 0xdead: -case 0xdeae: -case 0xdeaf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc0a8: -case 0xc0a9: -case 0xc0aa: -case 0xc0ab: -case 0xc0ac: -case 0xc0ad: -case 0xc0ae: -case 0xc0af: -case 0xc2a8: -case 0xc2a9: -case 0xc2aa: -case 0xc2ab: -case 0xc2ac: -case 0xc2ad: -case 0xc2ae: -case 0xc2af: -case 0xc4a8: -case 0xc4a9: -case 0xc4aa: -case 0xc4ab: -case 0xc4ac: -case 0xc4ad: -case 0xc4ae: -case 0xc4af: -case 0xc6a8: -case 0xc6a9: -case 0xc6aa: -case 0xc6ab: -case 0xc6ac: -case 0xc6ad: -case 0xc6ae: -case 0xc6af: -case 0xc8a8: -case 0xc8a9: -case 0xc8aa: -case 0xc8ab: -case 0xc8ac: -case 0xc8ad: -case 0xc8ae: -case 0xc8af: -case 0xcaa8: -case 0xcaa9: -case 0xcaaa: -case 0xcaab: -case 0xcaac: -case 0xcaad: -case 0xcaae: -case 0xcaaf: -case 0xcca8: -case 0xcca9: -case 0xccaa: -case 0xccab: -case 0xccac: -case 0xccad: -case 0xccae: -case 0xccaf: -case 0xcea8: -case 0xcea9: -case 0xceaa: -case 0xceab: -case 0xceac: -case 0xcead: -case 0xceae: -case 0xceaf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb0a8: -case 0xb0a9: -case 0xb0aa: -case 0xb0ab: -case 0xb0ac: -case 0xb0ad: -case 0xb0ae: -case 0xb0af: -case 0xb2a8: -case 0xb2a9: -case 0xb2aa: -case 0xb2ab: -case 0xb2ac: -case 0xb2ad: -case 0xb2ae: -case 0xb2af: -case 0xb4a8: -case 0xb4a9: -case 0xb4aa: -case 0xb4ab: -case 0xb4ac: -case 0xb4ad: -case 0xb4ae: -case 0xb4af: -case 0xb6a8: -case 0xb6a9: -case 0xb6aa: -case 0xb6ab: -case 0xb6ac: -case 0xb6ad: -case 0xb6ae: -case 0xb6af: -case 0xb8a8: -case 0xb8a9: -case 0xb8aa: -case 0xb8ab: -case 0xb8ac: -case 0xb8ad: -case 0xb8ae: -case 0xb8af: -case 0xbaa8: -case 0xbaa9: -case 0xbaaa: -case 0xbaab: -case 0xbaac: -case 0xbaad: -case 0xbaae: -case 0xbaaf: -case 0xbca8: -case 0xbca9: -case 0xbcaa: -case 0xbcab: -case 0xbcac: -case 0xbcad: -case 0xbcae: -case 0xbcaf: -case 0xbea8: -case 0xbea9: -case 0xbeaa: -case 0xbeab: -case 0xbeac: -case 0xbead: -case 0xbeae: -case 0xbeaf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x2028: -case 0x2029: -case 0x202a: -case 0x202b: -case 0x202c: -case 0x202d: -case 0x202e: -case 0x202f: -case 0x2228: -case 0x2229: -case 0x222a: -case 0x222b: -case 0x222c: -case 0x222d: -case 0x222e: -case 0x222f: -case 0x2428: -case 0x2429: -case 0x242a: -case 0x242b: -case 0x242c: -case 0x242d: -case 0x242e: -case 0x242f: -case 0x2628: -case 0x2629: -case 0x262a: -case 0x262b: -case 0x262c: -case 0x262d: -case 0x262e: -case 0x262f: -case 0x2828: -case 0x2829: -case 0x282a: -case 0x282b: -case 0x282c: -case 0x282d: -case 0x282e: -case 0x282f: -case 0x2a28: -case 0x2a29: -case 0x2a2a: -case 0x2a2b: -case 0x2a2c: -case 0x2a2d: -case 0x2a2e: -case 0x2a2f: -case 0x2c28: -case 0x2c29: -case 0x2c2a: -case 0x2c2b: -case 0x2c2c: -case 0x2c2d: -case 0x2c2e: -case 0x2c2f: -case 0x2e28: -case 0x2e29: -case 0x2e2a: -case 0x2e2b: -case 0x2e2c: -case 0x2e2d: -case 0x2e2e: -case 0x2e2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x80a8: -case 0x80a9: -case 0x80aa: -case 0x80ab: -case 0x80ac: -case 0x80ad: -case 0x80ae: -case 0x80af: -case 0x82a8: -case 0x82a9: -case 0x82aa: -case 0x82ab: -case 0x82ac: -case 0x82ad: -case 0x82ae: -case 0x82af: -case 0x84a8: -case 0x84a9: -case 0x84aa: -case 0x84ab: -case 0x84ac: -case 0x84ad: -case 0x84ae: -case 0x84af: -case 0x86a8: -case 0x86a9: -case 0x86aa: -case 0x86ab: -case 0x86ac: -case 0x86ad: -case 0x86ae: -case 0x86af: -case 0x88a8: -case 0x88a9: -case 0x88aa: -case 0x88ab: -case 0x88ac: -case 0x88ad: -case 0x88ae: -case 0x88af: -case 0x8aa8: -case 0x8aa9: -case 0x8aaa: -case 0x8aab: -case 0x8aac: -case 0x8aad: -case 0x8aae: -case 0x8aaf: -case 0x8ca8: -case 0x8ca9: -case 0x8caa: -case 0x8cab: -case 0x8cac: -case 0x8cad: -case 0x8cae: -case 0x8caf: -case 0x8ea8: -case 0x8ea9: -case 0x8eaa: -case 0x8eab: -case 0x8eac: -case 0x8ead: -case 0x8eae: -case 0x8eaf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x90a8: -case 0x90a9: -case 0x90aa: -case 0x90ab: -case 0x90ac: -case 0x90ad: -case 0x90ae: -case 0x90af: -case 0x92a8: -case 0x92a9: -case 0x92aa: -case 0x92ab: -case 0x92ac: -case 0x92ad: -case 0x92ae: -case 0x92af: -case 0x94a8: -case 0x94a9: -case 0x94aa: -case 0x94ab: -case 0x94ac: -case 0x94ad: -case 0x94ae: -case 0x94af: -case 0x96a8: -case 0x96a9: -case 0x96aa: -case 0x96ab: -case 0x96ac: -case 0x96ad: -case 0x96ae: -case 0x96af: -case 0x98a8: -case 0x98a9: -case 0x98aa: -case 0x98ab: -case 0x98ac: -case 0x98ad: -case 0x98ae: -case 0x98af: -case 0x9aa8: -case 0x9aa9: -case 0x9aaa: -case 0x9aab: -case 0x9aac: -case 0x9aad: -case 0x9aae: -case 0x9aaf: -case 0x9ca8: -case 0x9ca9: -case 0x9caa: -case 0x9cab: -case 0x9cac: -case 0x9cad: -case 0x9cae: -case 0x9caf: -case 0x9ea8: -case 0x9ea9: -case 0x9eaa: -case 0x9eab: -case 0x9eac: -case 0x9ead: -case 0x9eae: -case 0x9eaf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2068: -case 0x2069: -case 0x206a: -case 0x206b: -case 0x206c: -case 0x206d: -case 0x206e: -case 0x206f: -case 0x2268: -case 0x2269: -case 0x226a: -case 0x226b: -case 0x226c: -case 0x226d: -case 0x226e: -case 0x226f: -case 0x2468: -case 0x2469: -case 0x246a: -case 0x246b: -case 0x246c: -case 0x246d: -case 0x246e: -case 0x246f: -case 0x2668: -case 0x2669: -case 0x266a: -case 0x266b: -case 0x266c: -case 0x266d: -case 0x266e: -case 0x266f: -case 0x2868: -case 0x2869: -case 0x286a: -case 0x286b: -case 0x286c: -case 0x286d: -case 0x286e: -case 0x286f: -case 0x2a68: -case 0x2a69: -case 0x2a6a: -case 0x2a6b: -case 0x2a6c: -case 0x2a6d: -case 0x2a6e: -case 0x2a6f: -case 0x2c68: -case 0x2c69: -case 0x2c6a: -case 0x2c6b: -case 0x2c6c: -case 0x2c6d: -case 0x2c6e: -case 0x2c6f: -case 0x2e68: -case 0x2e69: -case 0x2e6a: -case 0x2e6b: -case 0x2e6c: -case 0x2e6d: -case 0x2e6e: -case 0x2e6f: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x42b0: -case 0x42b1: -case 0x42b2: -case 0x42b3: -case 0x42b4: -case 0x42b5: -case 0x42b6: -case 0x42b7: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x44b0: -case 0x44b1: -case 0x44b2: -case 0x44b3: -case 0x44b4: -case 0x44b5: -case 0x44b6: -case 0x44b7: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x40b0: -case 0x40b1: -case 0x40b2: -case 0x40b3: -case 0x40b4: -case 0x40b5: -case 0x40b6: -case 0x40b7: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x46b0: -case 0x46b1: -case 0x46b2: -case 0x46b3: -case 0x46b4: -case 0x46b5: -case 0x46b6: -case 0x46b7: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4ab0: -case 0x4ab1: -case 0x4ab2: -case 0x4ab3: -case 0x4ab4: -case 0x4ab5: -case 0x4ab6: -case 0x4ab7: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x23f0: -case 0x23f1: -case 0x23f2: -case 0x23f3: -case 0x23f4: -case 0x23f5: -case 0x23f6: -case 0x23f7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21f0: -case 0x21f1: -case 0x21f2: -case 0x21f3: -case 0x21f4: -case 0x21f5: -case 0x21f6: -case 0x21f7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1f0: -case 0xd1f1: -case 0xd1f2: -case 0xd1f3: -case 0xd1f4: -case 0xd1f5: -case 0xd1f6: -case 0xd1f7: -case 0xd3f0: -case 0xd3f1: -case 0xd3f2: -case 0xd3f3: -case 0xd3f4: -case 0xd3f5: -case 0xd3f6: -case 0xd3f7: -case 0xd5f0: -case 0xd5f1: -case 0xd5f2: -case 0xd5f3: -case 0xd5f4: -case 0xd5f5: -case 0xd5f6: -case 0xd5f7: -case 0xd7f0: -case 0xd7f1: -case 0xd7f2: -case 0xd7f3: -case 0xd7f4: -case 0xd7f5: -case 0xd7f6: -case 0xd7f7: -case 0xd9f0: -case 0xd9f1: -case 0xd9f2: -case 0xd9f3: -case 0xd9f4: -case 0xd9f5: -case 0xd9f6: -case 0xd9f7: -case 0xdbf0: -case 0xdbf1: -case 0xdbf2: -case 0xdbf3: -case 0xdbf4: -case 0xdbf5: -case 0xdbf6: -case 0xdbf7: -case 0xddf0: -case 0xddf1: -case 0xddf2: -case 0xddf3: -case 0xddf4: -case 0xddf5: -case 0xddf6: -case 0xddf7: -case 0xdff0: -case 0xdff1: -case 0xdff2: -case 0xdff3: -case 0xdff4: -case 0xdff5: -case 0xdff6: -case 0xdff7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1f0: -case 0xb1f1: -case 0xb1f2: -case 0xb1f3: -case 0xb1f4: -case 0xb1f5: -case 0xb1f6: -case 0xb1f7: -case 0xb3f0: -case 0xb3f1: -case 0xb3f2: -case 0xb3f3: -case 0xb3f4: -case 0xb3f5: -case 0xb3f6: -case 0xb3f7: -case 0xb5f0: -case 0xb5f1: -case 0xb5f2: -case 0xb5f3: -case 0xb5f4: -case 0xb5f5: -case 0xb5f6: -case 0xb5f7: -case 0xb7f0: -case 0xb7f1: -case 0xb7f2: -case 0xb7f3: -case 0xb7f4: -case 0xb7f5: -case 0xb7f6: -case 0xb7f7: -case 0xb9f0: -case 0xb9f1: -case 0xb9f2: -case 0xb9f3: -case 0xb9f4: -case 0xb9f5: -case 0xb9f6: -case 0xb9f7: -case 0xbbf0: -case 0xbbf1: -case 0xbbf2: -case 0xbbf3: -case 0xbbf4: -case 0xbbf5: -case 0xbbf6: -case 0xbbf7: -case 0xbdf0: -case 0xbdf1: -case 0xbdf2: -case 0xbdf3: -case 0xbdf4: -case 0xbdf5: -case 0xbdf6: -case 0xbdf7: -case 0xbff0: -case 0xbff1: -case 0xbff2: -case 0xbff3: -case 0xbff4: -case 0xbff5: -case 0xbff6: -case 0xbff7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91f0: -case 0x91f1: -case 0x91f2: -case 0x91f3: -case 0x91f4: -case 0x91f5: -case 0x91f6: -case 0x91f7: -case 0x93f0: -case 0x93f1: -case 0x93f2: -case 0x93f3: -case 0x93f4: -case 0x93f5: -case 0x93f6: -case 0x93f7: -case 0x95f0: -case 0x95f1: -case 0x95f2: -case 0x95f3: -case 0x95f4: -case 0x95f5: -case 0x95f6: -case 0x95f7: -case 0x97f0: -case 0x97f1: -case 0x97f2: -case 0x97f3: -case 0x97f4: -case 0x97f5: -case 0x97f6: -case 0x97f7: -case 0x99f0: -case 0x99f1: -case 0x99f2: -case 0x99f3: -case 0x99f4: -case 0x99f5: -case 0x99f6: -case 0x99f7: -case 0x9bf0: -case 0x9bf1: -case 0x9bf2: -case 0x9bf3: -case 0x9bf4: -case 0x9bf5: -case 0x9bf6: -case 0x9bf7: -case 0x9df0: -case 0x9df1: -case 0x9df2: -case 0x9df3: -case 0x9df4: -case 0x9df5: -case 0x9df6: -case 0x9df7: -case 0x9ff0: -case 0x9ff1: -case 0x9ff2: -case 0x9ff3: -case 0x9ff4: -case 0x9ff5: -case 0x9ff6: -case 0x9ff7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x20b0: -case 0x20b1: -case 0x20b2: -case 0x20b3: -case 0x20b4: -case 0x20b5: -case 0x20b6: -case 0x20b7: -case 0x22b0: -case 0x22b1: -case 0x22b2: -case 0x22b3: -case 0x22b4: -case 0x22b5: -case 0x22b6: -case 0x22b7: -case 0x24b0: -case 0x24b1: -case 0x24b2: -case 0x24b3: -case 0x24b4: -case 0x24b5: -case 0x24b6: -case 0x24b7: -case 0x26b0: -case 0x26b1: -case 0x26b2: -case 0x26b3: -case 0x26b4: -case 0x26b5: -case 0x26b6: -case 0x26b7: -case 0x28b0: -case 0x28b1: -case 0x28b2: -case 0x28b3: -case 0x28b4: -case 0x28b5: -case 0x28b6: -case 0x28b7: -case 0x2ab0: -case 0x2ab1: -case 0x2ab2: -case 0x2ab3: -case 0x2ab4: -case 0x2ab5: -case 0x2ab6: -case 0x2ab7: -case 0x2cb0: -case 0x2cb1: -case 0x2cb2: -case 0x2cb3: -case 0x2cb4: -case 0x2cb5: -case 0x2cb6: -case 0x2cb7: -case 0x2eb0: -case 0x2eb1: -case 0x2eb2: -case 0x2eb3: -case 0x2eb4: -case 0x2eb5: -case 0x2eb6: -case 0x2eb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2170: -case 0x2171: -case 0x2172: -case 0x2173: -case 0x2174: -case 0x2175: -case 0x2176: -case 0x2177: -case 0x2370: -case 0x2371: -case 0x2372: -case 0x2373: -case 0x2374: -case 0x2375: -case 0x2376: -case 0x2377: -case 0x2570: -case 0x2571: -case 0x2572: -case 0x2573: -case 0x2574: -case 0x2575: -case 0x2576: -case 0x2577: -case 0x2770: -case 0x2771: -case 0x2772: -case 0x2773: -case 0x2774: -case 0x2775: -case 0x2776: -case 0x2777: -case 0x2970: -case 0x2971: -case 0x2972: -case 0x2973: -case 0x2974: -case 0x2975: -case 0x2976: -case 0x2977: -case 0x2b70: -case 0x2b71: -case 0x2b72: -case 0x2b73: -case 0x2b74: -case 0x2b75: -case 0x2b76: -case 0x2b77: -case 0x2d70: -case 0x2d71: -case 0x2d72: -case 0x2d73: -case 0x2d74: -case 0x2d75: -case 0x2d76: -case 0x2d77: -case 0x2f70: -case 0x2f71: -case 0x2f72: -case 0x2f73: -case 0x2f74: -case 0x2f75: -case 0x2f76: -case 0x2f77: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x21b0: -case 0x21b1: -case 0x21b2: -case 0x21b3: -case 0x21b4: -case 0x21b5: -case 0x21b6: -case 0x21b7: -case 0x23b0: -case 0x23b1: -case 0x23b2: -case 0x23b3: -case 0x23b4: -case 0x23b5: -case 0x23b6: -case 0x23b7: -case 0x25b0: -case 0x25b1: -case 0x25b2: -case 0x25b3: -case 0x25b4: -case 0x25b5: -case 0x25b6: -case 0x25b7: -case 0x27b0: -case 0x27b1: -case 0x27b2: -case 0x27b3: -case 0x27b4: -case 0x27b5: -case 0x27b6: -case 0x27b7: -case 0x29b0: -case 0x29b1: -case 0x29b2: -case 0x29b3: -case 0x29b4: -case 0x29b5: -case 0x29b6: -case 0x29b7: -case 0x2bb0: -case 0x2bb1: -case 0x2bb2: -case 0x2bb3: -case 0x2bb4: -case 0x2bb5: -case 0x2bb6: -case 0x2bb7: -case 0x2db0: -case 0x2db1: -case 0x2db2: -case 0x2db3: -case 0x2db4: -case 0x2db5: -case 0x2db6: -case 0x2db7: -case 0x2fb0: -case 0x2fb1: -case 0x2fb2: -case 0x2fb3: -case 0x2fb4: -case 0x2fb5: -case 0x2fb6: -case 0x2fb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20f0: -case 0x20f1: -case 0x20f2: -case 0x20f3: -case 0x20f4: -case 0x20f5: -case 0x20f6: -case 0x20f7: -case 0x22f0: -case 0x22f1: -case 0x22f2: -case 0x22f3: -case 0x22f4: -case 0x22f5: -case 0x22f6: -case 0x22f7: -case 0x24f0: -case 0x24f1: -case 0x24f2: -case 0x24f3: -case 0x24f4: -case 0x24f5: -case 0x24f6: -case 0x24f7: -case 0x26f0: -case 0x26f1: -case 0x26f2: -case 0x26f3: -case 0x26f4: -case 0x26f5: -case 0x26f6: -case 0x26f7: -case 0x28f0: -case 0x28f1: -case 0x28f2: -case 0x28f3: -case 0x28f4: -case 0x28f5: -case 0x28f6: -case 0x28f7: -case 0x2af0: -case 0x2af1: -case 0x2af2: -case 0x2af3: -case 0x2af4: -case 0x2af5: -case 0x2af6: -case 0x2af7: -case 0x2cf0: -case 0x2cf1: -case 0x2cf2: -case 0x2cf3: -case 0x2cf4: -case 0x2cf5: -case 0x2cf6: -case 0x2cf7: -case 0x2ef0: -case 0x2ef1: -case 0x2ef2: -case 0x2ef3: -case 0x2ef4: -case 0x2ef5: -case 0x2ef6: -case 0x2ef7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2130: -case 0x2131: -case 0x2132: -case 0x2133: -case 0x2134: -case 0x2135: -case 0x2136: -case 0x2137: -case 0x2330: -case 0x2331: -case 0x2332: -case 0x2333: -case 0x2334: -case 0x2335: -case 0x2336: -case 0x2337: -case 0x2530: -case 0x2531: -case 0x2532: -case 0x2533: -case 0x2534: -case 0x2535: -case 0x2536: -case 0x2537: -case 0x2730: -case 0x2731: -case 0x2732: -case 0x2733: -case 0x2734: -case 0x2735: -case 0x2736: -case 0x2737: -case 0x2930: -case 0x2931: -case 0x2932: -case 0x2933: -case 0x2934: -case 0x2935: -case 0x2936: -case 0x2937: -case 0x2b30: -case 0x2b31: -case 0x2b32: -case 0x2b33: -case 0x2b34: -case 0x2b35: -case 0x2b36: -case 0x2b37: -case 0x2d30: -case 0x2d31: -case 0x2d32: -case 0x2d33: -case 0x2d34: -case 0x2d35: -case 0x2d36: -case 0x2d37: -case 0x2f30: -case 0x2f31: -case 0x2f32: -case 0x2f33: -case 0x2f34: -case 0x2f35: -case 0x2f36: -case 0x2f37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd0b0: -case 0xd0b1: -case 0xd0b2: -case 0xd0b3: -case 0xd0b4: -case 0xd0b5: -case 0xd0b6: -case 0xd0b7: -case 0xd2b0: -case 0xd2b1: -case 0xd2b2: -case 0xd2b3: -case 0xd2b4: -case 0xd2b5: -case 0xd2b6: -case 0xd2b7: -case 0xd4b0: -case 0xd4b1: -case 0xd4b2: -case 0xd4b3: -case 0xd4b4: -case 0xd4b5: -case 0xd4b6: -case 0xd4b7: -case 0xd6b0: -case 0xd6b1: -case 0xd6b2: -case 0xd6b3: -case 0xd6b4: -case 0xd6b5: -case 0xd6b6: -case 0xd6b7: -case 0xd8b0: -case 0xd8b1: -case 0xd8b2: -case 0xd8b3: -case 0xd8b4: -case 0xd8b5: -case 0xd8b6: -case 0xd8b7: -case 0xdab0: -case 0xdab1: -case 0xdab2: -case 0xdab3: -case 0xdab4: -case 0xdab5: -case 0xdab6: -case 0xdab7: -case 0xdcb0: -case 0xdcb1: -case 0xdcb2: -case 0xdcb3: -case 0xdcb4: -case 0xdcb5: -case 0xdcb6: -case 0xdcb7: -case 0xdeb0: -case 0xdeb1: -case 0xdeb2: -case 0xdeb3: -case 0xdeb4: -case 0xdeb5: -case 0xdeb6: -case 0xdeb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc0b0: -case 0xc0b1: -case 0xc0b2: -case 0xc0b3: -case 0xc0b4: -case 0xc0b5: -case 0xc0b6: -case 0xc0b7: -case 0xc2b0: -case 0xc2b1: -case 0xc2b2: -case 0xc2b3: -case 0xc2b4: -case 0xc2b5: -case 0xc2b6: -case 0xc2b7: -case 0xc4b0: -case 0xc4b1: -case 0xc4b2: -case 0xc4b3: -case 0xc4b4: -case 0xc4b5: -case 0xc4b6: -case 0xc4b7: -case 0xc6b0: -case 0xc6b1: -case 0xc6b2: -case 0xc6b3: -case 0xc6b4: -case 0xc6b5: -case 0xc6b6: -case 0xc6b7: -case 0xc8b0: -case 0xc8b1: -case 0xc8b2: -case 0xc8b3: -case 0xc8b4: -case 0xc8b5: -case 0xc8b6: -case 0xc8b7: -case 0xcab0: -case 0xcab1: -case 0xcab2: -case 0xcab3: -case 0xcab4: -case 0xcab5: -case 0xcab6: -case 0xcab7: -case 0xccb0: -case 0xccb1: -case 0xccb2: -case 0xccb3: -case 0xccb4: -case 0xccb5: -case 0xccb6: -case 0xccb7: -case 0xceb0: -case 0xceb1: -case 0xceb2: -case 0xceb3: -case 0xceb4: -case 0xceb5: -case 0xceb6: -case 0xceb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb0b0: -case 0xb0b1: -case 0xb0b2: -case 0xb0b3: -case 0xb0b4: -case 0xb0b5: -case 0xb0b6: -case 0xb0b7: -case 0xb2b0: -case 0xb2b1: -case 0xb2b2: -case 0xb2b3: -case 0xb2b4: -case 0xb2b5: -case 0xb2b6: -case 0xb2b7: -case 0xb4b0: -case 0xb4b1: -case 0xb4b2: -case 0xb4b3: -case 0xb4b4: -case 0xb4b5: -case 0xb4b6: -case 0xb4b7: -case 0xb6b0: -case 0xb6b1: -case 0xb6b2: -case 0xb6b3: -case 0xb6b4: -case 0xb6b5: -case 0xb6b6: -case 0xb6b7: -case 0xb8b0: -case 0xb8b1: -case 0xb8b2: -case 0xb8b3: -case 0xb8b4: -case 0xb8b5: -case 0xb8b6: -case 0xb8b7: -case 0xbab0: -case 0xbab1: -case 0xbab2: -case 0xbab3: -case 0xbab4: -case 0xbab5: -case 0xbab6: -case 0xbab7: -case 0xbcb0: -case 0xbcb1: -case 0xbcb2: -case 0xbcb3: -case 0xbcb4: -case 0xbcb5: -case 0xbcb6: -case 0xbcb7: -case 0xbeb0: -case 0xbeb1: -case 0xbeb2: -case 0xbeb3: -case 0xbeb4: -case 0xbeb5: -case 0xbeb6: -case 0xbeb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x2030: -case 0x2031: -case 0x2032: -case 0x2033: -case 0x2034: -case 0x2035: -case 0x2036: -case 0x2037: -case 0x2230: -case 0x2231: -case 0x2232: -case 0x2233: -case 0x2234: -case 0x2235: -case 0x2236: -case 0x2237: -case 0x2430: -case 0x2431: -case 0x2432: -case 0x2433: -case 0x2434: -case 0x2435: -case 0x2436: -case 0x2437: -case 0x2630: -case 0x2631: -case 0x2632: -case 0x2633: -case 0x2634: -case 0x2635: -case 0x2636: -case 0x2637: -case 0x2830: -case 0x2831: -case 0x2832: -case 0x2833: -case 0x2834: -case 0x2835: -case 0x2836: -case 0x2837: -case 0x2a30: -case 0x2a31: -case 0x2a32: -case 0x2a33: -case 0x2a34: -case 0x2a35: -case 0x2a36: -case 0x2a37: -case 0x2c30: -case 0x2c31: -case 0x2c32: -case 0x2c33: -case 0x2c34: -case 0x2c35: -case 0x2c36: -case 0x2c37: -case 0x2e30: -case 0x2e31: -case 0x2e32: -case 0x2e33: -case 0x2e34: -case 0x2e35: -case 0x2e36: -case 0x2e37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x80b0: -case 0x80b1: -case 0x80b2: -case 0x80b3: -case 0x80b4: -case 0x80b5: -case 0x80b6: -case 0x80b7: -case 0x82b0: -case 0x82b1: -case 0x82b2: -case 0x82b3: -case 0x82b4: -case 0x82b5: -case 0x82b6: -case 0x82b7: -case 0x84b0: -case 0x84b1: -case 0x84b2: -case 0x84b3: -case 0x84b4: -case 0x84b5: -case 0x84b6: -case 0x84b7: -case 0x86b0: -case 0x86b1: -case 0x86b2: -case 0x86b3: -case 0x86b4: -case 0x86b5: -case 0x86b6: -case 0x86b7: -case 0x88b0: -case 0x88b1: -case 0x88b2: -case 0x88b3: -case 0x88b4: -case 0x88b5: -case 0x88b6: -case 0x88b7: -case 0x8ab0: -case 0x8ab1: -case 0x8ab2: -case 0x8ab3: -case 0x8ab4: -case 0x8ab5: -case 0x8ab6: -case 0x8ab7: -case 0x8cb0: -case 0x8cb1: -case 0x8cb2: -case 0x8cb3: -case 0x8cb4: -case 0x8cb5: -case 0x8cb6: -case 0x8cb7: -case 0x8eb0: -case 0x8eb1: -case 0x8eb2: -case 0x8eb3: -case 0x8eb4: -case 0x8eb5: -case 0x8eb6: -case 0x8eb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x90b0: -case 0x90b1: -case 0x90b2: -case 0x90b3: -case 0x90b4: -case 0x90b5: -case 0x90b6: -case 0x90b7: -case 0x92b0: -case 0x92b1: -case 0x92b2: -case 0x92b3: -case 0x92b4: -case 0x92b5: -case 0x92b6: -case 0x92b7: -case 0x94b0: -case 0x94b1: -case 0x94b2: -case 0x94b3: -case 0x94b4: -case 0x94b5: -case 0x94b6: -case 0x94b7: -case 0x96b0: -case 0x96b1: -case 0x96b2: -case 0x96b3: -case 0x96b4: -case 0x96b5: -case 0x96b6: -case 0x96b7: -case 0x98b0: -case 0x98b1: -case 0x98b2: -case 0x98b3: -case 0x98b4: -case 0x98b5: -case 0x98b6: -case 0x98b7: -case 0x9ab0: -case 0x9ab1: -case 0x9ab2: -case 0x9ab3: -case 0x9ab4: -case 0x9ab5: -case 0x9ab6: -case 0x9ab7: -case 0x9cb0: -case 0x9cb1: -case 0x9cb2: -case 0x9cb3: -case 0x9cb4: -case 0x9cb5: -case 0x9cb6: -case 0x9cb7: -case 0x9eb0: -case 0x9eb1: -case 0x9eb2: -case 0x9eb3: -case 0x9eb4: -case 0x9eb5: -case 0x9eb6: -case 0x9eb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2070: -case 0x2071: -case 0x2072: -case 0x2073: -case 0x2074: -case 0x2075: -case 0x2076: -case 0x2077: -case 0x2270: -case 0x2271: -case 0x2272: -case 0x2273: -case 0x2274: -case 0x2275: -case 0x2276: -case 0x2277: -case 0x2470: -case 0x2471: -case 0x2472: -case 0x2473: -case 0x2474: -case 0x2475: -case 0x2476: -case 0x2477: -case 0x2670: -case 0x2671: -case 0x2672: -case 0x2673: -case 0x2674: -case 0x2675: -case 0x2676: -case 0x2677: -case 0x2870: -case 0x2871: -case 0x2872: -case 0x2873: -case 0x2874: -case 0x2875: -case 0x2876: -case 0x2877: -case 0x2a70: -case 0x2a71: -case 0x2a72: -case 0x2a73: -case 0x2a74: -case 0x2a75: -case 0x2a76: -case 0x2a77: -case 0x2c70: -case 0x2c71: -case 0x2c72: -case 0x2c73: -case 0x2c74: -case 0x2c75: -case 0x2c76: -case 0x2c77: -case 0x2e70: -case 0x2e71: -case 0x2e72: -case 0x2e73: -case 0x2e74: -case 0x2e75: -case 0x2e76: -case 0x2e77: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x4298: -case 0x4299: -case 0x429a: -case 0x429b: -case 0x429c: -case 0x429d: -case 0x429e: -case 0x429f: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4498: -case 0x4499: -case 0x449a: -case 0x449b: -case 0x449c: -case 0x449d: -case 0x449e: -case 0x449f: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4098: -case 0x4099: -case 0x409a: -case 0x409b: -case 0x409c: -case 0x409d: -case 0x409e: -case 0x409f: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4698: -case 0x4699: -case 0x469a: -case 0x469b: -case 0x469c: -case 0x469d: -case 0x469e: -case 0x469f: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4a98: -case 0x4a99: -case 0x4a9a: -case 0x4a9b: -case 0x4a9c: -case 0x4a9d: -case 0x4a9e: -case 0x4a9f: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x23d8: -case 0x23d9: -case 0x23da: -case 0x23db: -case 0x23dc: -case 0x23dd: -case 0x23de: -case 0x23df: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21d8: -case 0x21d9: -case 0x21da: -case 0x21db: -case 0x21dc: -case 0x21dd: -case 0x21de: -case 0x21df: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1d8: -case 0xd1d9: -case 0xd1da: -case 0xd1db: -case 0xd1dc: -case 0xd1dd: -case 0xd1de: -case 0xd1df: -case 0xd3d8: -case 0xd3d9: -case 0xd3da: -case 0xd3db: -case 0xd3dc: -case 0xd3dd: -case 0xd3de: -case 0xd3df: -case 0xd5d8: -case 0xd5d9: -case 0xd5da: -case 0xd5db: -case 0xd5dc: -case 0xd5dd: -case 0xd5de: -case 0xd5df: -case 0xd7d8: -case 0xd7d9: -case 0xd7da: -case 0xd7db: -case 0xd7dc: -case 0xd7dd: -case 0xd7de: -case 0xd7df: -case 0xd9d8: -case 0xd9d9: -case 0xd9da: -case 0xd9db: -case 0xd9dc: -case 0xd9dd: -case 0xd9de: -case 0xd9df: -case 0xdbd8: -case 0xdbd9: -case 0xdbda: -case 0xdbdb: -case 0xdbdc: -case 0xdbdd: -case 0xdbde: -case 0xdbdf: -case 0xddd8: -case 0xddd9: -case 0xddda: -case 0xdddb: -case 0xdddc: -case 0xdddd: -case 0xddde: -case 0xdddf: -case 0xdfd8: -case 0xdfd9: -case 0xdfda: -case 0xdfdb: -case 0xdfdc: -case 0xdfdd: -case 0xdfde: -case 0xdfdf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1d8: -case 0xb1d9: -case 0xb1da: -case 0xb1db: -case 0xb1dc: -case 0xb1dd: -case 0xb1de: -case 0xb1df: -case 0xb3d8: -case 0xb3d9: -case 0xb3da: -case 0xb3db: -case 0xb3dc: -case 0xb3dd: -case 0xb3de: -case 0xb3df: -case 0xb5d8: -case 0xb5d9: -case 0xb5da: -case 0xb5db: -case 0xb5dc: -case 0xb5dd: -case 0xb5de: -case 0xb5df: -case 0xb7d8: -case 0xb7d9: -case 0xb7da: -case 0xb7db: -case 0xb7dc: -case 0xb7dd: -case 0xb7de: -case 0xb7df: -case 0xb9d8: -case 0xb9d9: -case 0xb9da: -case 0xb9db: -case 0xb9dc: -case 0xb9dd: -case 0xb9de: -case 0xb9df: -case 0xbbd8: -case 0xbbd9: -case 0xbbda: -case 0xbbdb: -case 0xbbdc: -case 0xbbdd: -case 0xbbde: -case 0xbbdf: -case 0xbdd8: -case 0xbdd9: -case 0xbdda: -case 0xbddb: -case 0xbddc: -case 0xbddd: -case 0xbdde: -case 0xbddf: -case 0xbfd8: -case 0xbfd9: -case 0xbfda: -case 0xbfdb: -case 0xbfdc: -case 0xbfdd: -case 0xbfde: -case 0xbfdf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91d8: -case 0x91d9: -case 0x91da: -case 0x91db: -case 0x91dc: -case 0x91dd: -case 0x91de: -case 0x91df: -case 0x93d8: -case 0x93d9: -case 0x93da: -case 0x93db: -case 0x93dc: -case 0x93dd: -case 0x93de: -case 0x93df: -case 0x95d8: -case 0x95d9: -case 0x95da: -case 0x95db: -case 0x95dc: -case 0x95dd: -case 0x95de: -case 0x95df: -case 0x97d8: -case 0x97d9: -case 0x97da: -case 0x97db: -case 0x97dc: -case 0x97dd: -case 0x97de: -case 0x97df: -case 0x99d8: -case 0x99d9: -case 0x99da: -case 0x99db: -case 0x99dc: -case 0x99dd: -case 0x99de: -case 0x99df: -case 0x9bd8: -case 0x9bd9: -case 0x9bda: -case 0x9bdb: -case 0x9bdc: -case 0x9bdd: -case 0x9bde: -case 0x9bdf: -case 0x9dd8: -case 0x9dd9: -case 0x9dda: -case 0x9ddb: -case 0x9ddc: -case 0x9ddd: -case 0x9dde: -case 0x9ddf: -case 0x9fd8: -case 0x9fd9: -case 0x9fda: -case 0x9fdb: -case 0x9fdc: -case 0x9fdd: -case 0x9fde: -case 0x9fdf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2098: -case 0x2099: -case 0x209a: -case 0x209b: -case 0x209c: -case 0x209d: -case 0x209e: -case 0x209f: -case 0x2298: -case 0x2299: -case 0x229a: -case 0x229b: -case 0x229c: -case 0x229d: -case 0x229e: -case 0x229f: -case 0x2498: -case 0x2499: -case 0x249a: -case 0x249b: -case 0x249c: -case 0x249d: -case 0x249e: -case 0x249f: -case 0x2698: -case 0x2699: -case 0x269a: -case 0x269b: -case 0x269c: -case 0x269d: -case 0x269e: -case 0x269f: -case 0x2898: -case 0x2899: -case 0x289a: -case 0x289b: -case 0x289c: -case 0x289d: -case 0x289e: -case 0x289f: -case 0x2a98: -case 0x2a99: -case 0x2a9a: -case 0x2a9b: -case 0x2a9c: -case 0x2a9d: -case 0x2a9e: -case 0x2a9f: -case 0x2c98: -case 0x2c99: -case 0x2c9a: -case 0x2c9b: -case 0x2c9c: -case 0x2c9d: -case 0x2c9e: -case 0x2c9f: -case 0x2e98: -case 0x2e99: -case 0x2e9a: -case 0x2e9b: -case 0x2e9c: -case 0x2e9d: -case 0x2e9e: -case 0x2e9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2158: -case 0x2159: -case 0x215a: -case 0x215b: -case 0x215c: -case 0x215d: -case 0x215e: -case 0x215f: -case 0x2358: -case 0x2359: -case 0x235a: -case 0x235b: -case 0x235c: -case 0x235d: -case 0x235e: -case 0x235f: -case 0x2558: -case 0x2559: -case 0x255a: -case 0x255b: -case 0x255c: -case 0x255d: -case 0x255e: -case 0x255f: -case 0x2758: -case 0x2759: -case 0x275a: -case 0x275b: -case 0x275c: -case 0x275d: -case 0x275e: -case 0x275f: -case 0x2958: -case 0x2959: -case 0x295a: -case 0x295b: -case 0x295c: -case 0x295d: -case 0x295e: -case 0x295f: -case 0x2b58: -case 0x2b59: -case 0x2b5a: -case 0x2b5b: -case 0x2b5c: -case 0x2b5d: -case 0x2b5e: -case 0x2b5f: -case 0x2d58: -case 0x2d59: -case 0x2d5a: -case 0x2d5b: -case 0x2d5c: -case 0x2d5d: -case 0x2d5e: -case 0x2d5f: -case 0x2f58: -case 0x2f59: -case 0x2f5a: -case 0x2f5b: -case 0x2f5c: -case 0x2f5d: -case 0x2f5e: -case 0x2f5f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2198: -case 0x2199: -case 0x219a: -case 0x219b: -case 0x219c: -case 0x219d: -case 0x219e: -case 0x219f: -case 0x2398: -case 0x2399: -case 0x239a: -case 0x239b: -case 0x239c: -case 0x239d: -case 0x239e: -case 0x239f: -case 0x2598: -case 0x2599: -case 0x259a: -case 0x259b: -case 0x259c: -case 0x259d: -case 0x259e: -case 0x259f: -case 0x2798: -case 0x2799: -case 0x279a: -case 0x279b: -case 0x279c: -case 0x279d: -case 0x279e: -case 0x279f: -case 0x2998: -case 0x2999: -case 0x299a: -case 0x299b: -case 0x299c: -case 0x299d: -case 0x299e: -case 0x299f: -case 0x2b98: -case 0x2b99: -case 0x2b9a: -case 0x2b9b: -case 0x2b9c: -case 0x2b9d: -case 0x2b9e: -case 0x2b9f: -case 0x2d98: -case 0x2d99: -case 0x2d9a: -case 0x2d9b: -case 0x2d9c: -case 0x2d9d: -case 0x2d9e: -case 0x2d9f: -case 0x2f98: -case 0x2f99: -case 0x2f9a: -case 0x2f9b: -case 0x2f9c: -case 0x2f9d: -case 0x2f9e: -case 0x2f9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xb188: -case 0xb189: -case 0xb18a: -case 0xb18b: -case 0xb18c: -case 0xb18d: -case 0xb18e: -case 0xb18f: -case 0xb388: -case 0xb389: -case 0xb38a: -case 0xb38b: -case 0xb38c: -case 0xb38d: -case 0xb38e: -case 0xb38f: -case 0xb588: -case 0xb589: -case 0xb58a: -case 0xb58b: -case 0xb58c: -case 0xb58d: -case 0xb58e: -case 0xb58f: -case 0xb788: -case 0xb789: -case 0xb78a: -case 0xb78b: -case 0xb78c: -case 0xb78d: -case 0xb78e: -case 0xb78f: -case 0xb988: -case 0xb989: -case 0xb98a: -case 0xb98b: -case 0xb98c: -case 0xb98d: -case 0xb98e: -case 0xb98f: -case 0xbb88: -case 0xbb89: -case 0xbb8a: -case 0xbb8b: -case 0xbb8c: -case 0xbb8d: -case 0xbb8e: -case 0xbb8f: -case 0xbd88: -case 0xbd89: -case 0xbd8a: -case 0xbd8b: -case 0xbd8c: -case 0xbd8d: -case 0xbd8e: -case 0xbd8f: -case 0xbf88: -case 0xbf89: -case 0xbf8a: -case 0xbf8b: -case 0xbf8c: -case 0xbf8d: -case 0xbf8e: -case 0xbf8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x20d8: -case 0x20d9: -case 0x20da: -case 0x20db: -case 0x20dc: -case 0x20dd: -case 0x20de: -case 0x20df: -case 0x22d8: -case 0x22d9: -case 0x22da: -case 0x22db: -case 0x22dc: -case 0x22dd: -case 0x22de: -case 0x22df: -case 0x24d8: -case 0x24d9: -case 0x24da: -case 0x24db: -case 0x24dc: -case 0x24dd: -case 0x24de: -case 0x24df: -case 0x26d8: -case 0x26d9: -case 0x26da: -case 0x26db: -case 0x26dc: -case 0x26dd: -case 0x26de: -case 0x26df: -case 0x28d8: -case 0x28d9: -case 0x28da: -case 0x28db: -case 0x28dc: -case 0x28dd: -case 0x28de: -case 0x28df: -case 0x2ad8: -case 0x2ad9: -case 0x2ada: -case 0x2adb: -case 0x2adc: -case 0x2add: -case 0x2ade: -case 0x2adf: -case 0x2cd8: -case 0x2cd9: -case 0x2cda: -case 0x2cdb: -case 0x2cdc: -case 0x2cdd: -case 0x2cde: -case 0x2cdf: -case 0x2ed8: -case 0x2ed9: -case 0x2eda: -case 0x2edb: -case 0x2edc: -case 0x2edd: -case 0x2ede: -case 0x2edf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2118: -case 0x2119: -case 0x211a: -case 0x211b: -case 0x211c: -case 0x211d: -case 0x211e: -case 0x211f: -case 0x2318: -case 0x2319: -case 0x231a: -case 0x231b: -case 0x231c: -case 0x231d: -case 0x231e: -case 0x231f: -case 0x2518: -case 0x2519: -case 0x251a: -case 0x251b: -case 0x251c: -case 0x251d: -case 0x251e: -case 0x251f: -case 0x2718: -case 0x2719: -case 0x271a: -case 0x271b: -case 0x271c: -case 0x271d: -case 0x271e: -case 0x271f: -case 0x2918: -case 0x2919: -case 0x291a: -case 0x291b: -case 0x291c: -case 0x291d: -case 0x291e: -case 0x291f: -case 0x2b18: -case 0x2b19: -case 0x2b1a: -case 0x2b1b: -case 0x2b1c: -case 0x2b1d: -case 0x2b1e: -case 0x2b1f: -case 0x2d18: -case 0x2d19: -case 0x2d1a: -case 0x2d1b: -case 0x2d1c: -case 0x2d1d: -case 0x2d1e: -case 0x2d1f: -case 0x2f18: -case 0x2f19: -case 0x2f1a: -case 0x2f1b: -case 0x2f1c: -case 0x2f1d: -case 0x2f1e: -case 0x2f1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd098: -case 0xd099: -case 0xd09a: -case 0xd09b: -case 0xd09c: -case 0xd09d: -case 0xd09e: -case 0xd09f: -case 0xd298: -case 0xd299: -case 0xd29a: -case 0xd29b: -case 0xd29c: -case 0xd29d: -case 0xd29e: -case 0xd29f: -case 0xd498: -case 0xd499: -case 0xd49a: -case 0xd49b: -case 0xd49c: -case 0xd49d: -case 0xd49e: -case 0xd49f: -case 0xd698: -case 0xd699: -case 0xd69a: -case 0xd69b: -case 0xd69c: -case 0xd69d: -case 0xd69e: -case 0xd69f: -case 0xd898: -case 0xd899: -case 0xd89a: -case 0xd89b: -case 0xd89c: -case 0xd89d: -case 0xd89e: -case 0xd89f: -case 0xda98: -case 0xda99: -case 0xda9a: -case 0xda9b: -case 0xda9c: -case 0xda9d: -case 0xda9e: -case 0xda9f: -case 0xdc98: -case 0xdc99: -case 0xdc9a: -case 0xdc9b: -case 0xdc9c: -case 0xdc9d: -case 0xdc9e: -case 0xdc9f: -case 0xde98: -case 0xde99: -case 0xde9a: -case 0xde9b: -case 0xde9c: -case 0xde9d: -case 0xde9e: -case 0xde9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc098: -case 0xc099: -case 0xc09a: -case 0xc09b: -case 0xc09c: -case 0xc09d: -case 0xc09e: -case 0xc09f: -case 0xc298: -case 0xc299: -case 0xc29a: -case 0xc29b: -case 0xc29c: -case 0xc29d: -case 0xc29e: -case 0xc29f: -case 0xc498: -case 0xc499: -case 0xc49a: -case 0xc49b: -case 0xc49c: -case 0xc49d: -case 0xc49e: -case 0xc49f: -case 0xc698: -case 0xc699: -case 0xc69a: -case 0xc69b: -case 0xc69c: -case 0xc69d: -case 0xc69e: -case 0xc69f: -case 0xc898: -case 0xc899: -case 0xc89a: -case 0xc89b: -case 0xc89c: -case 0xc89d: -case 0xc89e: -case 0xc89f: -case 0xca98: -case 0xca99: -case 0xca9a: -case 0xca9b: -case 0xca9c: -case 0xca9d: -case 0xca9e: -case 0xca9f: -case 0xcc98: -case 0xcc99: -case 0xcc9a: -case 0xcc9b: -case 0xcc9c: -case 0xcc9d: -case 0xcc9e: -case 0xcc9f: -case 0xce98: -case 0xce99: -case 0xce9a: -case 0xce9b: -case 0xce9c: -case 0xce9d: -case 0xce9e: -case 0xce9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb098: -case 0xb099: -case 0xb09a: -case 0xb09b: -case 0xb09c: -case 0xb09d: -case 0xb09e: -case 0xb09f: -case 0xb298: -case 0xb299: -case 0xb29a: -case 0xb29b: -case 0xb29c: -case 0xb29d: -case 0xb29e: -case 0xb29f: -case 0xb498: -case 0xb499: -case 0xb49a: -case 0xb49b: -case 0xb49c: -case 0xb49d: -case 0xb49e: -case 0xb49f: -case 0xb698: -case 0xb699: -case 0xb69a: -case 0xb69b: -case 0xb69c: -case 0xb69d: -case 0xb69e: -case 0xb69f: -case 0xb898: -case 0xb899: -case 0xb89a: -case 0xb89b: -case 0xb89c: -case 0xb89d: -case 0xb89e: -case 0xb89f: -case 0xba98: -case 0xba99: -case 0xba9a: -case 0xba9b: -case 0xba9c: -case 0xba9d: -case 0xba9e: -case 0xba9f: -case 0xbc98: -case 0xbc99: -case 0xbc9a: -case 0xbc9b: -case 0xbc9c: -case 0xbc9d: -case 0xbc9e: -case 0xbc9f: -case 0xbe98: -case 0xbe99: -case 0xbe9a: -case 0xbe9b: -case 0xbe9c: -case 0xbe9d: -case 0xbe9e: -case 0xbe9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x2018: -case 0x2019: -case 0x201a: -case 0x201b: -case 0x201c: -case 0x201d: -case 0x201e: -case 0x201f: -case 0x2218: -case 0x2219: -case 0x221a: -case 0x221b: -case 0x221c: -case 0x221d: -case 0x221e: -case 0x221f: -case 0x2418: -case 0x2419: -case 0x241a: -case 0x241b: -case 0x241c: -case 0x241d: -case 0x241e: -case 0x241f: -case 0x2618: -case 0x2619: -case 0x261a: -case 0x261b: -case 0x261c: -case 0x261d: -case 0x261e: -case 0x261f: -case 0x2818: -case 0x2819: -case 0x281a: -case 0x281b: -case 0x281c: -case 0x281d: -case 0x281e: -case 0x281f: -case 0x2a18: -case 0x2a19: -case 0x2a1a: -case 0x2a1b: -case 0x2a1c: -case 0x2a1d: -case 0x2a1e: -case 0x2a1f: -case 0x2c18: -case 0x2c19: -case 0x2c1a: -case 0x2c1b: -case 0x2c1c: -case 0x2c1d: -case 0x2c1e: -case 0x2c1f: -case 0x2e18: -case 0x2e19: -case 0x2e1a: -case 0x2e1b: -case 0x2e1c: -case 0x2e1d: -case 0x2e1e: -case 0x2e1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8098: -case 0x8099: -case 0x809a: -case 0x809b: -case 0x809c: -case 0x809d: -case 0x809e: -case 0x809f: -case 0x8298: -case 0x8299: -case 0x829a: -case 0x829b: -case 0x829c: -case 0x829d: -case 0x829e: -case 0x829f: -case 0x8498: -case 0x8499: -case 0x849a: -case 0x849b: -case 0x849c: -case 0x849d: -case 0x849e: -case 0x849f: -case 0x8698: -case 0x8699: -case 0x869a: -case 0x869b: -case 0x869c: -case 0x869d: -case 0x869e: -case 0x869f: -case 0x8898: -case 0x8899: -case 0x889a: -case 0x889b: -case 0x889c: -case 0x889d: -case 0x889e: -case 0x889f: -case 0x8a98: -case 0x8a99: -case 0x8a9a: -case 0x8a9b: -case 0x8a9c: -case 0x8a9d: -case 0x8a9e: -case 0x8a9f: -case 0x8c98: -case 0x8c99: -case 0x8c9a: -case 0x8c9b: -case 0x8c9c: -case 0x8c9d: -case 0x8c9e: -case 0x8c9f: -case 0x8e98: -case 0x8e99: -case 0x8e9a: -case 0x8e9b: -case 0x8e9c: -case 0x8e9d: -case 0x8e9e: -case 0x8e9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9098: -case 0x9099: -case 0x909a: -case 0x909b: -case 0x909c: -case 0x909d: -case 0x909e: -case 0x909f: -case 0x9298: -case 0x9299: -case 0x929a: -case 0x929b: -case 0x929c: -case 0x929d: -case 0x929e: -case 0x929f: -case 0x9498: -case 0x9499: -case 0x949a: -case 0x949b: -case 0x949c: -case 0x949d: -case 0x949e: -case 0x949f: -case 0x9698: -case 0x9699: -case 0x969a: -case 0x969b: -case 0x969c: -case 0x969d: -case 0x969e: -case 0x969f: -case 0x9898: -case 0x9899: -case 0x989a: -case 0x989b: -case 0x989c: -case 0x989d: -case 0x989e: -case 0x989f: -case 0x9a98: -case 0x9a99: -case 0x9a9a: -case 0x9a9b: -case 0x9a9c: -case 0x9a9d: -case 0x9a9e: -case 0x9a9f: -case 0x9c98: -case 0x9c99: -case 0x9c9a: -case 0x9c9b: -case 0x9c9c: -case 0x9c9d: -case 0x9c9e: -case 0x9c9f: -case 0x9e98: -case 0x9e99: -case 0x9e9a: -case 0x9e9b: -case 0x9e9c: -case 0x9e9d: -case 0x9e9e: -case 0x9e9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2058: -case 0x2059: -case 0x205a: -case 0x205b: -case 0x205c: -case 0x205d: -case 0x205e: -case 0x205f: -case 0x2258: -case 0x2259: -case 0x225a: -case 0x225b: -case 0x225c: -case 0x225d: -case 0x225e: -case 0x225f: -case 0x2458: -case 0x2459: -case 0x245a: -case 0x245b: -case 0x245c: -case 0x245d: -case 0x245e: -case 0x245f: -case 0x2658: -case 0x2659: -case 0x265a: -case 0x265b: -case 0x265c: -case 0x265d: -case 0x265e: -case 0x265f: -case 0x2858: -case 0x2859: -case 0x285a: -case 0x285b: -case 0x285c: -case 0x285d: -case 0x285e: -case 0x285f: -case 0x2a58: -case 0x2a59: -case 0x2a5a: -case 0x2a5b: -case 0x2a5c: -case 0x2a5d: -case 0x2a5e: -case 0x2a5f: -case 0x2c58: -case 0x2c59: -case 0x2c5a: -case 0x2c5b: -case 0x2c5c: -case 0x2c5d: -case 0x2c5e: -case 0x2c5f: -case 0x2e58: -case 0x2e59: -case 0x2e5a: -case 0x2e5b: -case 0x2e5c: -case 0x2e5d: -case 0x2e5e: -case 0x2e5f: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x42a0: -case 0x42a1: -case 0x42a2: -case 0x42a3: -case 0x42a4: -case 0x42a5: -case 0x42a6: -case 0x42a7: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x44a0: -case 0x44a1: -case 0x44a2: -case 0x44a3: -case 0x44a4: -case 0x44a5: -case 0x44a6: -case 0x44a7: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x40a0: -case 0x40a1: -case 0x40a2: -case 0x40a3: -case 0x40a4: -case 0x40a5: -case 0x40a6: -case 0x40a7: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x46a0: -case 0x46a1: -case 0x46a2: -case 0x46a3: -case 0x46a4: -case 0x46a5: -case 0x46a6: -case 0x46a7: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4aa0: -case 0x4aa1: -case 0x4aa2: -case 0x4aa3: -case 0x4aa4: -case 0x4aa5: -case 0x4aa6: -case 0x4aa7: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x23e0: -case 0x23e1: -case 0x23e2: -case 0x23e3: -case 0x23e4: -case 0x23e5: -case 0x23e6: -case 0x23e7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21e0: -case 0x21e1: -case 0x21e2: -case 0x21e3: -case 0x21e4: -case 0x21e5: -case 0x21e6: -case 0x21e7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1e0: -case 0xd1e1: -case 0xd1e2: -case 0xd1e3: -case 0xd1e4: -case 0xd1e5: -case 0xd1e6: -case 0xd1e7: -case 0xd3e0: -case 0xd3e1: -case 0xd3e2: -case 0xd3e3: -case 0xd3e4: -case 0xd3e5: -case 0xd3e6: -case 0xd3e7: -case 0xd5e0: -case 0xd5e1: -case 0xd5e2: -case 0xd5e3: -case 0xd5e4: -case 0xd5e5: -case 0xd5e6: -case 0xd5e7: -case 0xd7e0: -case 0xd7e1: -case 0xd7e2: -case 0xd7e3: -case 0xd7e4: -case 0xd7e5: -case 0xd7e6: -case 0xd7e7: -case 0xd9e0: -case 0xd9e1: -case 0xd9e2: -case 0xd9e3: -case 0xd9e4: -case 0xd9e5: -case 0xd9e6: -case 0xd9e7: -case 0xdbe0: -case 0xdbe1: -case 0xdbe2: -case 0xdbe3: -case 0xdbe4: -case 0xdbe5: -case 0xdbe6: -case 0xdbe7: -case 0xdde0: -case 0xdde1: -case 0xdde2: -case 0xdde3: -case 0xdde4: -case 0xdde5: -case 0xdde6: -case 0xdde7: -case 0xdfe0: -case 0xdfe1: -case 0xdfe2: -case 0xdfe3: -case 0xdfe4: -case 0xdfe5: -case 0xdfe6: -case 0xdfe7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1e0: -case 0xb1e1: -case 0xb1e2: -case 0xb1e3: -case 0xb1e4: -case 0xb1e5: -case 0xb1e6: -case 0xb1e7: -case 0xb3e0: -case 0xb3e1: -case 0xb3e2: -case 0xb3e3: -case 0xb3e4: -case 0xb3e5: -case 0xb3e6: -case 0xb3e7: -case 0xb5e0: -case 0xb5e1: -case 0xb5e2: -case 0xb5e3: -case 0xb5e4: -case 0xb5e5: -case 0xb5e6: -case 0xb5e7: -case 0xb7e0: -case 0xb7e1: -case 0xb7e2: -case 0xb7e3: -case 0xb7e4: -case 0xb7e5: -case 0xb7e6: -case 0xb7e7: -case 0xb9e0: -case 0xb9e1: -case 0xb9e2: -case 0xb9e3: -case 0xb9e4: -case 0xb9e5: -case 0xb9e6: -case 0xb9e7: -case 0xbbe0: -case 0xbbe1: -case 0xbbe2: -case 0xbbe3: -case 0xbbe4: -case 0xbbe5: -case 0xbbe6: -case 0xbbe7: -case 0xbde0: -case 0xbde1: -case 0xbde2: -case 0xbde3: -case 0xbde4: -case 0xbde5: -case 0xbde6: -case 0xbde7: -case 0xbfe0: -case 0xbfe1: -case 0xbfe2: -case 0xbfe3: -case 0xbfe4: -case 0xbfe5: -case 0xbfe6: -case 0xbfe7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91e0: -case 0x91e1: -case 0x91e2: -case 0x91e3: -case 0x91e4: -case 0x91e5: -case 0x91e6: -case 0x91e7: -case 0x93e0: -case 0x93e1: -case 0x93e2: -case 0x93e3: -case 0x93e4: -case 0x93e5: -case 0x93e6: -case 0x93e7: -case 0x95e0: -case 0x95e1: -case 0x95e2: -case 0x95e3: -case 0x95e4: -case 0x95e5: -case 0x95e6: -case 0x95e7: -case 0x97e0: -case 0x97e1: -case 0x97e2: -case 0x97e3: -case 0x97e4: -case 0x97e5: -case 0x97e6: -case 0x97e7: -case 0x99e0: -case 0x99e1: -case 0x99e2: -case 0x99e3: -case 0x99e4: -case 0x99e5: -case 0x99e6: -case 0x99e7: -case 0x9be0: -case 0x9be1: -case 0x9be2: -case 0x9be3: -case 0x9be4: -case 0x9be5: -case 0x9be6: -case 0x9be7: -case 0x9de0: -case 0x9de1: -case 0x9de2: -case 0x9de3: -case 0x9de4: -case 0x9de5: -case 0x9de6: -case 0x9de7: -case 0x9fe0: -case 0x9fe1: -case 0x9fe2: -case 0x9fe3: -case 0x9fe4: -case 0x9fe5: -case 0x9fe6: -case 0x9fe7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x20a0: -case 0x20a1: -case 0x20a2: -case 0x20a3: -case 0x20a4: -case 0x20a5: -case 0x20a6: -case 0x20a7: -case 0x22a0: -case 0x22a1: -case 0x22a2: -case 0x22a3: -case 0x22a4: -case 0x22a5: -case 0x22a6: -case 0x22a7: -case 0x24a0: -case 0x24a1: -case 0x24a2: -case 0x24a3: -case 0x24a4: -case 0x24a5: -case 0x24a6: -case 0x24a7: -case 0x26a0: -case 0x26a1: -case 0x26a2: -case 0x26a3: -case 0x26a4: -case 0x26a5: -case 0x26a6: -case 0x26a7: -case 0x28a0: -case 0x28a1: -case 0x28a2: -case 0x28a3: -case 0x28a4: -case 0x28a5: -case 0x28a6: -case 0x28a7: -case 0x2aa0: -case 0x2aa1: -case 0x2aa2: -case 0x2aa3: -case 0x2aa4: -case 0x2aa5: -case 0x2aa6: -case 0x2aa7: -case 0x2ca0: -case 0x2ca1: -case 0x2ca2: -case 0x2ca3: -case 0x2ca4: -case 0x2ca5: -case 0x2ca6: -case 0x2ca7: -case 0x2ea0: -case 0x2ea1: -case 0x2ea2: -case 0x2ea3: -case 0x2ea4: -case 0x2ea5: -case 0x2ea6: -case 0x2ea7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2160: -case 0x2161: -case 0x2162: -case 0x2163: -case 0x2164: -case 0x2165: -case 0x2166: -case 0x2167: -case 0x2360: -case 0x2361: -case 0x2362: -case 0x2363: -case 0x2364: -case 0x2365: -case 0x2366: -case 0x2367: -case 0x2560: -case 0x2561: -case 0x2562: -case 0x2563: -case 0x2564: -case 0x2565: -case 0x2566: -case 0x2567: -case 0x2760: -case 0x2761: -case 0x2762: -case 0x2763: -case 0x2764: -case 0x2765: -case 0x2766: -case 0x2767: -case 0x2960: -case 0x2961: -case 0x2962: -case 0x2963: -case 0x2964: -case 0x2965: -case 0x2966: -case 0x2967: -case 0x2b60: -case 0x2b61: -case 0x2b62: -case 0x2b63: -case 0x2b64: -case 0x2b65: -case 0x2b66: -case 0x2b67: -case 0x2d60: -case 0x2d61: -case 0x2d62: -case 0x2d63: -case 0x2d64: -case 0x2d65: -case 0x2d66: -case 0x2d67: -case 0x2f60: -case 0x2f61: -case 0x2f62: -case 0x2f63: -case 0x2f64: -case 0x2f65: -case 0x2f66: -case 0x2f67: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x21a0: -case 0x21a1: -case 0x21a2: -case 0x21a3: -case 0x21a4: -case 0x21a5: -case 0x21a6: -case 0x21a7: -case 0x23a0: -case 0x23a1: -case 0x23a2: -case 0x23a3: -case 0x23a4: -case 0x23a5: -case 0x23a6: -case 0x23a7: -case 0x25a0: -case 0x25a1: -case 0x25a2: -case 0x25a3: -case 0x25a4: -case 0x25a5: -case 0x25a6: -case 0x25a7: -case 0x27a0: -case 0x27a1: -case 0x27a2: -case 0x27a3: -case 0x27a4: -case 0x27a5: -case 0x27a6: -case 0x27a7: -case 0x29a0: -case 0x29a1: -case 0x29a2: -case 0x29a3: -case 0x29a4: -case 0x29a5: -case 0x29a6: -case 0x29a7: -case 0x2ba0: -case 0x2ba1: -case 0x2ba2: -case 0x2ba3: -case 0x2ba4: -case 0x2ba5: -case 0x2ba6: -case 0x2ba7: -case 0x2da0: -case 0x2da1: -case 0x2da2: -case 0x2da3: -case 0x2da4: -case 0x2da5: -case 0x2da6: -case 0x2da7: -case 0x2fa0: -case 0x2fa1: -case 0x2fa2: -case 0x2fa3: -case 0x2fa4: -case 0x2fa5: -case 0x2fa6: -case 0x2fa7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20e0: -case 0x20e1: -case 0x20e2: -case 0x20e3: -case 0x20e4: -case 0x20e5: -case 0x20e6: -case 0x20e7: -case 0x22e0: -case 0x22e1: -case 0x22e2: -case 0x22e3: -case 0x22e4: -case 0x22e5: -case 0x22e6: -case 0x22e7: -case 0x24e0: -case 0x24e1: -case 0x24e2: -case 0x24e3: -case 0x24e4: -case 0x24e5: -case 0x24e6: -case 0x24e7: -case 0x26e0: -case 0x26e1: -case 0x26e2: -case 0x26e3: -case 0x26e4: -case 0x26e5: -case 0x26e6: -case 0x26e7: -case 0x28e0: -case 0x28e1: -case 0x28e2: -case 0x28e3: -case 0x28e4: -case 0x28e5: -case 0x28e6: -case 0x28e7: -case 0x2ae0: -case 0x2ae1: -case 0x2ae2: -case 0x2ae3: -case 0x2ae4: -case 0x2ae5: -case 0x2ae6: -case 0x2ae7: -case 0x2ce0: -case 0x2ce1: -case 0x2ce2: -case 0x2ce3: -case 0x2ce4: -case 0x2ce5: -case 0x2ce6: -case 0x2ce7: -case 0x2ee0: -case 0x2ee1: -case 0x2ee2: -case 0x2ee3: -case 0x2ee4: -case 0x2ee5: -case 0x2ee6: -case 0x2ee7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd188: -case 0xd189: -case 0xd18a: -case 0xd18b: -case 0xd18c: -case 0xd18d: -case 0xd18e: -case 0xd18f: -case 0xd388: -case 0xd389: -case 0xd38a: -case 0xd38b: -case 0xd38c: -case 0xd38d: -case 0xd38e: -case 0xd38f: -case 0xd588: -case 0xd589: -case 0xd58a: -case 0xd58b: -case 0xd58c: -case 0xd58d: -case 0xd58e: -case 0xd58f: -case 0xd788: -case 0xd789: -case 0xd78a: -case 0xd78b: -case 0xd78c: -case 0xd78d: -case 0xd78e: -case 0xd78f: -case 0xd988: -case 0xd989: -case 0xd98a: -case 0xd98b: -case 0xd98c: -case 0xd98d: -case 0xd98e: -case 0xd98f: -case 0xdb88: -case 0xdb89: -case 0xdb8a: -case 0xdb8b: -case 0xdb8c: -case 0xdb8d: -case 0xdb8e: -case 0xdb8f: -case 0xdd88: -case 0xdd89: -case 0xdd8a: -case 0xdd8b: -case 0xdd8c: -case 0xdd8d: -case 0xdd8e: -case 0xdd8f: -case 0xdf88: -case 0xdf89: -case 0xdf8a: -case 0xdf8b: -case 0xdf8c: -case 0xdf8d: -case 0xdf8e: -case 0xdf8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADDX(src, dst); - } - break; - -case 0x2120: -case 0x2121: -case 0x2122: -case 0x2123: -case 0x2124: -case 0x2125: -case 0x2126: -case 0x2127: -case 0x2320: -case 0x2321: -case 0x2322: -case 0x2323: -case 0x2324: -case 0x2325: -case 0x2326: -case 0x2327: -case 0x2520: -case 0x2521: -case 0x2522: -case 0x2523: -case 0x2524: -case 0x2525: -case 0x2526: -case 0x2527: -case 0x2720: -case 0x2721: -case 0x2722: -case 0x2723: -case 0x2724: -case 0x2725: -case 0x2726: -case 0x2727: -case 0x2920: -case 0x2921: -case 0x2922: -case 0x2923: -case 0x2924: -case 0x2925: -case 0x2926: -case 0x2927: -case 0x2b20: -case 0x2b21: -case 0x2b22: -case 0x2b23: -case 0x2b24: -case 0x2b25: -case 0x2b26: -case 0x2b27: -case 0x2d20: -case 0x2d21: -case 0x2d22: -case 0x2d23: -case 0x2d24: -case 0x2d25: -case 0x2d26: -case 0x2d27: -case 0x2f20: -case 0x2f21: -case 0x2f22: -case 0x2f23: -case 0x2f24: -case 0x2f25: -case 0x2f26: -case 0x2f27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x9188: -case 0x9189: -case 0x918a: -case 0x918b: -case 0x918c: -case 0x918d: -case 0x918e: -case 0x918f: -case 0x9388: -case 0x9389: -case 0x938a: -case 0x938b: -case 0x938c: -case 0x938d: -case 0x938e: -case 0x938f: -case 0x9588: -case 0x9589: -case 0x958a: -case 0x958b: -case 0x958c: -case 0x958d: -case 0x958e: -case 0x958f: -case 0x9788: -case 0x9789: -case 0x978a: -case 0x978b: -case 0x978c: -case 0x978d: -case 0x978e: -case 0x978f: -case 0x9988: -case 0x9989: -case 0x998a: -case 0x998b: -case 0x998c: -case 0x998d: -case 0x998e: -case 0x998f: -case 0x9b88: -case 0x9b89: -case 0x9b8a: -case 0x9b8b: -case 0x9b8c: -case 0x9b8d: -case 0x9b8e: -case 0x9b8f: -case 0x9d88: -case 0x9d89: -case 0x9d8a: -case 0x9d8b: -case 0x9d8c: -case 0x9d8d: -case 0x9d8e: -case 0x9d8f: -case 0x9f88: -case 0x9f89: -case 0x9f8a: -case 0x9f8b: -case 0x9f8c: -case 0x9f8d: -case 0x9f8e: -case 0x9f8f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUBX(src, dst); - } - break; - -case 0xd0a0: -case 0xd0a1: -case 0xd0a2: -case 0xd0a3: -case 0xd0a4: -case 0xd0a5: -case 0xd0a6: -case 0xd0a7: -case 0xd2a0: -case 0xd2a1: -case 0xd2a2: -case 0xd2a3: -case 0xd2a4: -case 0xd2a5: -case 0xd2a6: -case 0xd2a7: -case 0xd4a0: -case 0xd4a1: -case 0xd4a2: -case 0xd4a3: -case 0xd4a4: -case 0xd4a5: -case 0xd4a6: -case 0xd4a7: -case 0xd6a0: -case 0xd6a1: -case 0xd6a2: -case 0xd6a3: -case 0xd6a4: -case 0xd6a5: -case 0xd6a6: -case 0xd6a7: -case 0xd8a0: -case 0xd8a1: -case 0xd8a2: -case 0xd8a3: -case 0xd8a4: -case 0xd8a5: -case 0xd8a6: -case 0xd8a7: -case 0xdaa0: -case 0xdaa1: -case 0xdaa2: -case 0xdaa3: -case 0xdaa4: -case 0xdaa5: -case 0xdaa6: -case 0xdaa7: -case 0xdca0: -case 0xdca1: -case 0xdca2: -case 0xdca3: -case 0xdca4: -case 0xdca5: -case 0xdca6: -case 0xdca7: -case 0xdea0: -case 0xdea1: -case 0xdea2: -case 0xdea3: -case 0xdea4: -case 0xdea5: -case 0xdea6: -case 0xdea7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc0a0: -case 0xc0a1: -case 0xc0a2: -case 0xc0a3: -case 0xc0a4: -case 0xc0a5: -case 0xc0a6: -case 0xc0a7: -case 0xc2a0: -case 0xc2a1: -case 0xc2a2: -case 0xc2a3: -case 0xc2a4: -case 0xc2a5: -case 0xc2a6: -case 0xc2a7: -case 0xc4a0: -case 0xc4a1: -case 0xc4a2: -case 0xc4a3: -case 0xc4a4: -case 0xc4a5: -case 0xc4a6: -case 0xc4a7: -case 0xc6a0: -case 0xc6a1: -case 0xc6a2: -case 0xc6a3: -case 0xc6a4: -case 0xc6a5: -case 0xc6a6: -case 0xc6a7: -case 0xc8a0: -case 0xc8a1: -case 0xc8a2: -case 0xc8a3: -case 0xc8a4: -case 0xc8a5: -case 0xc8a6: -case 0xc8a7: -case 0xcaa0: -case 0xcaa1: -case 0xcaa2: -case 0xcaa3: -case 0xcaa4: -case 0xcaa5: -case 0xcaa6: -case 0xcaa7: -case 0xcca0: -case 0xcca1: -case 0xcca2: -case 0xcca3: -case 0xcca4: -case 0xcca5: -case 0xcca6: -case 0xcca7: -case 0xcea0: -case 0xcea1: -case 0xcea2: -case 0xcea3: -case 0xcea4: -case 0xcea5: -case 0xcea6: -case 0xcea7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb0a0: -case 0xb0a1: -case 0xb0a2: -case 0xb0a3: -case 0xb0a4: -case 0xb0a5: -case 0xb0a6: -case 0xb0a7: -case 0xb2a0: -case 0xb2a1: -case 0xb2a2: -case 0xb2a3: -case 0xb2a4: -case 0xb2a5: -case 0xb2a6: -case 0xb2a7: -case 0xb4a0: -case 0xb4a1: -case 0xb4a2: -case 0xb4a3: -case 0xb4a4: -case 0xb4a5: -case 0xb4a6: -case 0xb4a7: -case 0xb6a0: -case 0xb6a1: -case 0xb6a2: -case 0xb6a3: -case 0xb6a4: -case 0xb6a5: -case 0xb6a6: -case 0xb6a7: -case 0xb8a0: -case 0xb8a1: -case 0xb8a2: -case 0xb8a3: -case 0xb8a4: -case 0xb8a5: -case 0xb8a6: -case 0xb8a7: -case 0xbaa0: -case 0xbaa1: -case 0xbaa2: -case 0xbaa3: -case 0xbaa4: -case 0xbaa5: -case 0xbaa6: -case 0xbaa7: -case 0xbca0: -case 0xbca1: -case 0xbca2: -case 0xbca3: -case 0xbca4: -case 0xbca5: -case 0xbca6: -case 0xbca7: -case 0xbea0: -case 0xbea1: -case 0xbea2: -case 0xbea3: -case 0xbea4: -case 0xbea5: -case 0xbea6: -case 0xbea7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x2020: -case 0x2021: -case 0x2022: -case 0x2023: -case 0x2024: -case 0x2025: -case 0x2026: -case 0x2027: -case 0x2220: -case 0x2221: -case 0x2222: -case 0x2223: -case 0x2224: -case 0x2225: -case 0x2226: -case 0x2227: -case 0x2420: -case 0x2421: -case 0x2422: -case 0x2423: -case 0x2424: -case 0x2425: -case 0x2426: -case 0x2427: -case 0x2620: -case 0x2621: -case 0x2622: -case 0x2623: -case 0x2624: -case 0x2625: -case 0x2626: -case 0x2627: -case 0x2820: -case 0x2821: -case 0x2822: -case 0x2823: -case 0x2824: -case 0x2825: -case 0x2826: -case 0x2827: -case 0x2a20: -case 0x2a21: -case 0x2a22: -case 0x2a23: -case 0x2a24: -case 0x2a25: -case 0x2a26: -case 0x2a27: -case 0x2c20: -case 0x2c21: -case 0x2c22: -case 0x2c23: -case 0x2c24: -case 0x2c25: -case 0x2c26: -case 0x2c27: -case 0x2e20: -case 0x2e21: -case 0x2e22: -case 0x2e23: -case 0x2e24: -case 0x2e25: -case 0x2e26: -case 0x2e27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x80a0: -case 0x80a1: -case 0x80a2: -case 0x80a3: -case 0x80a4: -case 0x80a5: -case 0x80a6: -case 0x80a7: -case 0x82a0: -case 0x82a1: -case 0x82a2: -case 0x82a3: -case 0x82a4: -case 0x82a5: -case 0x82a6: -case 0x82a7: -case 0x84a0: -case 0x84a1: -case 0x84a2: -case 0x84a3: -case 0x84a4: -case 0x84a5: -case 0x84a6: -case 0x84a7: -case 0x86a0: -case 0x86a1: -case 0x86a2: -case 0x86a3: -case 0x86a4: -case 0x86a5: -case 0x86a6: -case 0x86a7: -case 0x88a0: -case 0x88a1: -case 0x88a2: -case 0x88a3: -case 0x88a4: -case 0x88a5: -case 0x88a6: -case 0x88a7: -case 0x8aa0: -case 0x8aa1: -case 0x8aa2: -case 0x8aa3: -case 0x8aa4: -case 0x8aa5: -case 0x8aa6: -case 0x8aa7: -case 0x8ca0: -case 0x8ca1: -case 0x8ca2: -case 0x8ca3: -case 0x8ca4: -case 0x8ca5: -case 0x8ca6: -case 0x8ca7: -case 0x8ea0: -case 0x8ea1: -case 0x8ea2: -case 0x8ea3: -case 0x8ea4: -case 0x8ea5: -case 0x8ea6: -case 0x8ea7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x90a0: -case 0x90a1: -case 0x90a2: -case 0x90a3: -case 0x90a4: -case 0x90a5: -case 0x90a6: -case 0x90a7: -case 0x92a0: -case 0x92a1: -case 0x92a2: -case 0x92a3: -case 0x92a4: -case 0x92a5: -case 0x92a6: -case 0x92a7: -case 0x94a0: -case 0x94a1: -case 0x94a2: -case 0x94a3: -case 0x94a4: -case 0x94a5: -case 0x94a6: -case 0x94a7: -case 0x96a0: -case 0x96a1: -case 0x96a2: -case 0x96a3: -case 0x96a4: -case 0x96a5: -case 0x96a6: -case 0x96a7: -case 0x98a0: -case 0x98a1: -case 0x98a2: -case 0x98a3: -case 0x98a4: -case 0x98a5: -case 0x98a6: -case 0x98a7: -case 0x9aa0: -case 0x9aa1: -case 0x9aa2: -case 0x9aa3: -case 0x9aa4: -case 0x9aa5: -case 0x9aa6: -case 0x9aa7: -case 0x9ca0: -case 0x9ca1: -case 0x9ca2: -case 0x9ca3: -case 0x9ca4: -case 0x9ca5: -case 0x9ca6: -case 0x9ca7: -case 0x9ea0: -case 0x9ea1: -case 0x9ea2: -case 0x9ea3: -case 0x9ea4: -case 0x9ea5: -case 0x9ea6: -case 0x9ea7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2060: -case 0x2061: -case 0x2062: -case 0x2063: -case 0x2064: -case 0x2065: -case 0x2066: -case 0x2067: -case 0x2260: -case 0x2261: -case 0x2262: -case 0x2263: -case 0x2264: -case 0x2265: -case 0x2266: -case 0x2267: -case 0x2460: -case 0x2461: -case 0x2462: -case 0x2463: -case 0x2464: -case 0x2465: -case 0x2466: -case 0x2467: -case 0x2660: -case 0x2661: -case 0x2662: -case 0x2663: -case 0x2664: -case 0x2665: -case 0x2666: -case 0x2667: -case 0x2860: -case 0x2861: -case 0x2862: -case 0x2863: -case 0x2864: -case 0x2865: -case 0x2866: -case 0x2867: -case 0x2a60: -case 0x2a61: -case 0x2a62: -case 0x2a63: -case 0x2a64: -case 0x2a65: -case 0x2a66: -case 0x2a67: -case 0x2c60: -case 0x2c61: -case 0x2c62: -case 0x2c63: -case 0x2c64: -case 0x2c65: -case 0x2c66: -case 0x2c67: -case 0x2e60: -case 0x2e61: -case 0x2e62: -case 0x2e63: -case 0x2e64: -case 0x2e65: -case 0x2e66: -case 0x2e67: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0x4280: -case 0x4281: -case 0x4282: -case 0x4283: -case 0x4284: -case 0x4285: -case 0x4286: -case 0x4287: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x48c0: -case 0x48c1: -case 0x48c2: -case 0x48c3: -case 0x48c4: -case 0x48c5: -case 0x48c6: -case 0x48c7: - { - HAM dst(this, instr_b2_b0); EXT(dst); - } - break; - -case 0x4480: -case 0x4481: -case 0x4482: -case 0x4483: -case 0x4484: -case 0x4485: -case 0x4486: -case 0x4487: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4080: -case 0x4081: -case 0x4082: -case 0x4083: -case 0x4084: -case 0x4085: -case 0x4086: -case 0x4087: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4680: -case 0x4681: -case 0x4682: -case 0x4683: -case 0x4684: -case 0x4685: -case 0x4686: -case 0x4687: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x4a80: -case 0x4a81: -case 0x4a82: -case 0x4a83: -case 0x4a84: -case 0x4a85: -case 0x4a86: -case 0x4a87: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0xd1b9: -case 0xd3b9: -case 0xd5b9: -case 0xd7b9: -case 0xd9b9: -case 0xdbb9: -case 0xddb9: -case 0xdfb9: - { - HAM src(this, instr_b11_b9); HAM dst(this); ADD(src, dst); - } - break; - -case 0xc1b9: -case 0xc3b9: -case 0xc5b9: -case 0xc7b9: -case 0xc9b9: -case 0xcbb9: -case 0xcdb9: -case 0xcfb9: - { - HAM src(this, instr_b11_b9); HAM dst(this); AND(src, dst); - } - break; - -case 0xb1b9: -case 0xb3b9: -case 0xb5b9: -case 0xb7b9: -case 0xb9b9: -case 0xbbb9: -case 0xbdb9: -case 0xbfb9: - { - HAM src(this, instr_b11_b9); HAM dst(this); EOR(src, dst); - } - break; - -case 0x81b9: -case 0x83b9: -case 0x85b9: -case 0x87b9: -case 0x89b9: -case 0x8bb9: -case 0x8db9: -case 0x8fb9: - { - HAM src(this, instr_b11_b9); HAM dst(this); OR(src, dst); - } - break; - -case 0x91b9: -case 0x93b9: -case 0x95b9: -case 0x97b9: -case 0x99b9: -case 0x9bb9: -case 0x9db9: -case 0x9fb9: - { - HAM src(this, instr_b11_b9); HAM dst(this); SUB(src, dst); - } - break; - -case 0xd1b8: -case 0xd3b8: -case 0xd5b8: -case 0xd7b8: -case 0xd9b8: -case 0xdbb8: -case 0xddb8: -case 0xdfb8: - { - HAM src(this, instr_b11_b9); HAM dst(this); ADD(src, dst); - } - break; - -case 0xc1b8: -case 0xc3b8: -case 0xc5b8: -case 0xc7b8: -case 0xc9b8: -case 0xcbb8: -case 0xcdb8: -case 0xcfb8: - { - HAM src(this, instr_b11_b9); HAM dst(this); AND(src, dst); - } - break; - -case 0xb1b8: -case 0xb3b8: -case 0xb5b8: -case 0xb7b8: -case 0xb9b8: -case 0xbbb8: -case 0xbdb8: -case 0xbfb8: - { - HAM src(this, instr_b11_b9); HAM dst(this); EOR(src, dst); - } - break; - -case 0x81b8: -case 0x83b8: -case 0x85b8: -case 0x87b8: -case 0x89b8: -case 0x8bb8: -case 0x8db8: -case 0x8fb8: - { - HAM src(this, instr_b11_b9); HAM dst(this); OR(src, dst); - } - break; - -case 0x91b8: -case 0x93b8: -case 0x95b8: -case 0x97b8: -case 0x99b8: -case 0x9bb8: -case 0x9db8: -case 0x9fb8: - { - HAM src(this, instr_b11_b9); HAM dst(this); SUB(src, dst); - } - break; - -case 0xd190: -case 0xd191: -case 0xd192: -case 0xd193: -case 0xd194: -case 0xd195: -case 0xd196: -case 0xd197: -case 0xd390: -case 0xd391: -case 0xd392: -case 0xd393: -case 0xd394: -case 0xd395: -case 0xd396: -case 0xd397: -case 0xd590: -case 0xd591: -case 0xd592: -case 0xd593: -case 0xd594: -case 0xd595: -case 0xd596: -case 0xd597: -case 0xd790: -case 0xd791: -case 0xd792: -case 0xd793: -case 0xd794: -case 0xd795: -case 0xd796: -case 0xd797: -case 0xd990: -case 0xd991: -case 0xd992: -case 0xd993: -case 0xd994: -case 0xd995: -case 0xd996: -case 0xd997: -case 0xdb90: -case 0xdb91: -case 0xdb92: -case 0xdb93: -case 0xdb94: -case 0xdb95: -case 0xdb96: -case 0xdb97: -case 0xdd90: -case 0xdd91: -case 0xdd92: -case 0xdd93: -case 0xdd94: -case 0xdd95: -case 0xdd96: -case 0xdd97: -case 0xdf90: -case 0xdf91: -case 0xdf92: -case 0xdf93: -case 0xdf94: -case 0xdf95: -case 0xdf96: -case 0xdf97: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc190: -case 0xc191: -case 0xc192: -case 0xc193: -case 0xc194: -case 0xc195: -case 0xc196: -case 0xc197: -case 0xc390: -case 0xc391: -case 0xc392: -case 0xc393: -case 0xc394: -case 0xc395: -case 0xc396: -case 0xc397: -case 0xc590: -case 0xc591: -case 0xc592: -case 0xc593: -case 0xc594: -case 0xc595: -case 0xc596: -case 0xc597: -case 0xc790: -case 0xc791: -case 0xc792: -case 0xc793: -case 0xc794: -case 0xc795: -case 0xc796: -case 0xc797: -case 0xc990: -case 0xc991: -case 0xc992: -case 0xc993: -case 0xc994: -case 0xc995: -case 0xc996: -case 0xc997: -case 0xcb90: -case 0xcb91: -case 0xcb92: -case 0xcb93: -case 0xcb94: -case 0xcb95: -case 0xcb96: -case 0xcb97: -case 0xcd90: -case 0xcd91: -case 0xcd92: -case 0xcd93: -case 0xcd94: -case 0xcd95: -case 0xcd96: -case 0xcd97: -case 0xcf90: -case 0xcf91: -case 0xcf92: -case 0xcf93: -case 0xcf94: -case 0xcf95: -case 0xcf96: -case 0xcf97: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb190: -case 0xb191: -case 0xb192: -case 0xb193: -case 0xb194: -case 0xb195: -case 0xb196: -case 0xb197: -case 0xb390: -case 0xb391: -case 0xb392: -case 0xb393: -case 0xb394: -case 0xb395: -case 0xb396: -case 0xb397: -case 0xb590: -case 0xb591: -case 0xb592: -case 0xb593: -case 0xb594: -case 0xb595: -case 0xb596: -case 0xb597: -case 0xb790: -case 0xb791: -case 0xb792: -case 0xb793: -case 0xb794: -case 0xb795: -case 0xb796: -case 0xb797: -case 0xb990: -case 0xb991: -case 0xb992: -case 0xb993: -case 0xb994: -case 0xb995: -case 0xb996: -case 0xb997: -case 0xbb90: -case 0xbb91: -case 0xbb92: -case 0xbb93: -case 0xbb94: -case 0xbb95: -case 0xbb96: -case 0xbb97: -case 0xbd90: -case 0xbd91: -case 0xbd92: -case 0xbd93: -case 0xbd94: -case 0xbd95: -case 0xbd96: -case 0xbd97: -case 0xbf90: -case 0xbf91: -case 0xbf92: -case 0xbf93: -case 0xbf94: -case 0xbf95: -case 0xbf96: -case 0xbf97: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8190: -case 0x8191: -case 0x8192: -case 0x8193: -case 0x8194: -case 0x8195: -case 0x8196: -case 0x8197: -case 0x8390: -case 0x8391: -case 0x8392: -case 0x8393: -case 0x8394: -case 0x8395: -case 0x8396: -case 0x8397: -case 0x8590: -case 0x8591: -case 0x8592: -case 0x8593: -case 0x8594: -case 0x8595: -case 0x8596: -case 0x8597: -case 0x8790: -case 0x8791: -case 0x8792: -case 0x8793: -case 0x8794: -case 0x8795: -case 0x8796: -case 0x8797: -case 0x8990: -case 0x8991: -case 0x8992: -case 0x8993: -case 0x8994: -case 0x8995: -case 0x8996: -case 0x8997: -case 0x8b90: -case 0x8b91: -case 0x8b92: -case 0x8b93: -case 0x8b94: -case 0x8b95: -case 0x8b96: -case 0x8b97: -case 0x8d90: -case 0x8d91: -case 0x8d92: -case 0x8d93: -case 0x8d94: -case 0x8d95: -case 0x8d96: -case 0x8d97: -case 0x8f90: -case 0x8f91: -case 0x8f92: -case 0x8f93: -case 0x8f94: -case 0x8f95: -case 0x8f96: -case 0x8f97: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9190: -case 0x9191: -case 0x9192: -case 0x9193: -case 0x9194: -case 0x9195: -case 0x9196: -case 0x9197: -case 0x9390: -case 0x9391: -case 0x9392: -case 0x9393: -case 0x9394: -case 0x9395: -case 0x9396: -case 0x9397: -case 0x9590: -case 0x9591: -case 0x9592: -case 0x9593: -case 0x9594: -case 0x9595: -case 0x9596: -case 0x9597: -case 0x9790: -case 0x9791: -case 0x9792: -case 0x9793: -case 0x9794: -case 0x9795: -case 0x9796: -case 0x9797: -case 0x9990: -case 0x9991: -case 0x9992: -case 0x9993: -case 0x9994: -case 0x9995: -case 0x9996: -case 0x9997: -case 0x9b90: -case 0x9b91: -case 0x9b92: -case 0x9b93: -case 0x9b94: -case 0x9b95: -case 0x9b96: -case 0x9b97: -case 0x9d90: -case 0x9d91: -case 0x9d92: -case 0x9d93: -case 0x9d94: -case 0x9d95: -case 0x9d96: -case 0x9d97: -case 0x9f90: -case 0x9f91: -case 0x9f92: -case 0x9f93: -case 0x9f94: -case 0x9f95: -case 0x9f96: -case 0x9f97: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd1a8: -case 0xd1a9: -case 0xd1aa: -case 0xd1ab: -case 0xd1ac: -case 0xd1ad: -case 0xd1ae: -case 0xd1af: -case 0xd3a8: -case 0xd3a9: -case 0xd3aa: -case 0xd3ab: -case 0xd3ac: -case 0xd3ad: -case 0xd3ae: -case 0xd3af: -case 0xd5a8: -case 0xd5a9: -case 0xd5aa: -case 0xd5ab: -case 0xd5ac: -case 0xd5ad: -case 0xd5ae: -case 0xd5af: -case 0xd7a8: -case 0xd7a9: -case 0xd7aa: -case 0xd7ab: -case 0xd7ac: -case 0xd7ad: -case 0xd7ae: -case 0xd7af: -case 0xd9a8: -case 0xd9a9: -case 0xd9aa: -case 0xd9ab: -case 0xd9ac: -case 0xd9ad: -case 0xd9ae: -case 0xd9af: -case 0xdba8: -case 0xdba9: -case 0xdbaa: -case 0xdbab: -case 0xdbac: -case 0xdbad: -case 0xdbae: -case 0xdbaf: -case 0xdda8: -case 0xdda9: -case 0xddaa: -case 0xddab: -case 0xddac: -case 0xddad: -case 0xddae: -case 0xddaf: -case 0xdfa8: -case 0xdfa9: -case 0xdfaa: -case 0xdfab: -case 0xdfac: -case 0xdfad: -case 0xdfae: -case 0xdfaf: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc1a8: -case 0xc1a9: -case 0xc1aa: -case 0xc1ab: -case 0xc1ac: -case 0xc1ad: -case 0xc1ae: -case 0xc1af: -case 0xc3a8: -case 0xc3a9: -case 0xc3aa: -case 0xc3ab: -case 0xc3ac: -case 0xc3ad: -case 0xc3ae: -case 0xc3af: -case 0xc5a8: -case 0xc5a9: -case 0xc5aa: -case 0xc5ab: -case 0xc5ac: -case 0xc5ad: -case 0xc5ae: -case 0xc5af: -case 0xc7a8: -case 0xc7a9: -case 0xc7aa: -case 0xc7ab: -case 0xc7ac: -case 0xc7ad: -case 0xc7ae: -case 0xc7af: -case 0xc9a8: -case 0xc9a9: -case 0xc9aa: -case 0xc9ab: -case 0xc9ac: -case 0xc9ad: -case 0xc9ae: -case 0xc9af: -case 0xcba8: -case 0xcba9: -case 0xcbaa: -case 0xcbab: -case 0xcbac: -case 0xcbad: -case 0xcbae: -case 0xcbaf: -case 0xcda8: -case 0xcda9: -case 0xcdaa: -case 0xcdab: -case 0xcdac: -case 0xcdad: -case 0xcdae: -case 0xcdaf: -case 0xcfa8: -case 0xcfa9: -case 0xcfaa: -case 0xcfab: -case 0xcfac: -case 0xcfad: -case 0xcfae: -case 0xcfaf: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb1a8: -case 0xb1a9: -case 0xb1aa: -case 0xb1ab: -case 0xb1ac: -case 0xb1ad: -case 0xb1ae: -case 0xb1af: -case 0xb3a8: -case 0xb3a9: -case 0xb3aa: -case 0xb3ab: -case 0xb3ac: -case 0xb3ad: -case 0xb3ae: -case 0xb3af: -case 0xb5a8: -case 0xb5a9: -case 0xb5aa: -case 0xb5ab: -case 0xb5ac: -case 0xb5ad: -case 0xb5ae: -case 0xb5af: -case 0xb7a8: -case 0xb7a9: -case 0xb7aa: -case 0xb7ab: -case 0xb7ac: -case 0xb7ad: -case 0xb7ae: -case 0xb7af: -case 0xb9a8: -case 0xb9a9: -case 0xb9aa: -case 0xb9ab: -case 0xb9ac: -case 0xb9ad: -case 0xb9ae: -case 0xb9af: -case 0xbba8: -case 0xbba9: -case 0xbbaa: -case 0xbbab: -case 0xbbac: -case 0xbbad: -case 0xbbae: -case 0xbbaf: -case 0xbda8: -case 0xbda9: -case 0xbdaa: -case 0xbdab: -case 0xbdac: -case 0xbdad: -case 0xbdae: -case 0xbdaf: -case 0xbfa8: -case 0xbfa9: -case 0xbfaa: -case 0xbfab: -case 0xbfac: -case 0xbfad: -case 0xbfae: -case 0xbfaf: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x81a8: -case 0x81a9: -case 0x81aa: -case 0x81ab: -case 0x81ac: -case 0x81ad: -case 0x81ae: -case 0x81af: -case 0x83a8: -case 0x83a9: -case 0x83aa: -case 0x83ab: -case 0x83ac: -case 0x83ad: -case 0x83ae: -case 0x83af: -case 0x85a8: -case 0x85a9: -case 0x85aa: -case 0x85ab: -case 0x85ac: -case 0x85ad: -case 0x85ae: -case 0x85af: -case 0x87a8: -case 0x87a9: -case 0x87aa: -case 0x87ab: -case 0x87ac: -case 0x87ad: -case 0x87ae: -case 0x87af: -case 0x89a8: -case 0x89a9: -case 0x89aa: -case 0x89ab: -case 0x89ac: -case 0x89ad: -case 0x89ae: -case 0x89af: -case 0x8ba8: -case 0x8ba9: -case 0x8baa: -case 0x8bab: -case 0x8bac: -case 0x8bad: -case 0x8bae: -case 0x8baf: -case 0x8da8: -case 0x8da9: -case 0x8daa: -case 0x8dab: -case 0x8dac: -case 0x8dad: -case 0x8dae: -case 0x8daf: -case 0x8fa8: -case 0x8fa9: -case 0x8faa: -case 0x8fab: -case 0x8fac: -case 0x8fad: -case 0x8fae: -case 0x8faf: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x91a8: -case 0x91a9: -case 0x91aa: -case 0x91ab: -case 0x91ac: -case 0x91ad: -case 0x91ae: -case 0x91af: -case 0x93a8: -case 0x93a9: -case 0x93aa: -case 0x93ab: -case 0x93ac: -case 0x93ad: -case 0x93ae: -case 0x93af: -case 0x95a8: -case 0x95a9: -case 0x95aa: -case 0x95ab: -case 0x95ac: -case 0x95ad: -case 0x95ae: -case 0x95af: -case 0x97a8: -case 0x97a9: -case 0x97aa: -case 0x97ab: -case 0x97ac: -case 0x97ad: -case 0x97ae: -case 0x97af: -case 0x99a8: -case 0x99a9: -case 0x99aa: -case 0x99ab: -case 0x99ac: -case 0x99ad: -case 0x99ae: -case 0x99af: -case 0x9ba8: -case 0x9ba9: -case 0x9baa: -case 0x9bab: -case 0x9bac: -case 0x9bad: -case 0x9bae: -case 0x9baf: -case 0x9da8: -case 0x9da9: -case 0x9daa: -case 0x9dab: -case 0x9dac: -case 0x9dad: -case 0x9dae: -case 0x9daf: -case 0x9fa8: -case 0x9fa9: -case 0x9faa: -case 0x9fab: -case 0x9fac: -case 0x9fad: -case 0x9fae: -case 0x9faf: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd1b0: -case 0xd1b1: -case 0xd1b2: -case 0xd1b3: -case 0xd1b4: -case 0xd1b5: -case 0xd1b6: -case 0xd1b7: -case 0xd3b0: -case 0xd3b1: -case 0xd3b2: -case 0xd3b3: -case 0xd3b4: -case 0xd3b5: -case 0xd3b6: -case 0xd3b7: -case 0xd5b0: -case 0xd5b1: -case 0xd5b2: -case 0xd5b3: -case 0xd5b4: -case 0xd5b5: -case 0xd5b6: -case 0xd5b7: -case 0xd7b0: -case 0xd7b1: -case 0xd7b2: -case 0xd7b3: -case 0xd7b4: -case 0xd7b5: -case 0xd7b6: -case 0xd7b7: -case 0xd9b0: -case 0xd9b1: -case 0xd9b2: -case 0xd9b3: -case 0xd9b4: -case 0xd9b5: -case 0xd9b6: -case 0xd9b7: -case 0xdbb0: -case 0xdbb1: -case 0xdbb2: -case 0xdbb3: -case 0xdbb4: -case 0xdbb5: -case 0xdbb6: -case 0xdbb7: -case 0xddb0: -case 0xddb1: -case 0xddb2: -case 0xddb3: -case 0xddb4: -case 0xddb5: -case 0xddb6: -case 0xddb7: -case 0xdfb0: -case 0xdfb1: -case 0xdfb2: -case 0xdfb3: -case 0xdfb4: -case 0xdfb5: -case 0xdfb6: -case 0xdfb7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc1b0: -case 0xc1b1: -case 0xc1b2: -case 0xc1b3: -case 0xc1b4: -case 0xc1b5: -case 0xc1b6: -case 0xc1b7: -case 0xc3b0: -case 0xc3b1: -case 0xc3b2: -case 0xc3b3: -case 0xc3b4: -case 0xc3b5: -case 0xc3b6: -case 0xc3b7: -case 0xc5b0: -case 0xc5b1: -case 0xc5b2: -case 0xc5b3: -case 0xc5b4: -case 0xc5b5: -case 0xc5b6: -case 0xc5b7: -case 0xc7b0: -case 0xc7b1: -case 0xc7b2: -case 0xc7b3: -case 0xc7b4: -case 0xc7b5: -case 0xc7b6: -case 0xc7b7: -case 0xc9b0: -case 0xc9b1: -case 0xc9b2: -case 0xc9b3: -case 0xc9b4: -case 0xc9b5: -case 0xc9b6: -case 0xc9b7: -case 0xcbb0: -case 0xcbb1: -case 0xcbb2: -case 0xcbb3: -case 0xcbb4: -case 0xcbb5: -case 0xcbb6: -case 0xcbb7: -case 0xcdb0: -case 0xcdb1: -case 0xcdb2: -case 0xcdb3: -case 0xcdb4: -case 0xcdb5: -case 0xcdb6: -case 0xcdb7: -case 0xcfb0: -case 0xcfb1: -case 0xcfb2: -case 0xcfb3: -case 0xcfb4: -case 0xcfb5: -case 0xcfb6: -case 0xcfb7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb1b0: -case 0xb1b1: -case 0xb1b2: -case 0xb1b3: -case 0xb1b4: -case 0xb1b5: -case 0xb1b6: -case 0xb1b7: -case 0xb3b0: -case 0xb3b1: -case 0xb3b2: -case 0xb3b3: -case 0xb3b4: -case 0xb3b5: -case 0xb3b6: -case 0xb3b7: -case 0xb5b0: -case 0xb5b1: -case 0xb5b2: -case 0xb5b3: -case 0xb5b4: -case 0xb5b5: -case 0xb5b6: -case 0xb5b7: -case 0xb7b0: -case 0xb7b1: -case 0xb7b2: -case 0xb7b3: -case 0xb7b4: -case 0xb7b5: -case 0xb7b6: -case 0xb7b7: -case 0xb9b0: -case 0xb9b1: -case 0xb9b2: -case 0xb9b3: -case 0xb9b4: -case 0xb9b5: -case 0xb9b6: -case 0xb9b7: -case 0xbbb0: -case 0xbbb1: -case 0xbbb2: -case 0xbbb3: -case 0xbbb4: -case 0xbbb5: -case 0xbbb6: -case 0xbbb7: -case 0xbdb0: -case 0xbdb1: -case 0xbdb2: -case 0xbdb3: -case 0xbdb4: -case 0xbdb5: -case 0xbdb6: -case 0xbdb7: -case 0xbfb0: -case 0xbfb1: -case 0xbfb2: -case 0xbfb3: -case 0xbfb4: -case 0xbfb5: -case 0xbfb6: -case 0xbfb7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x81b0: -case 0x81b1: -case 0x81b2: -case 0x81b3: -case 0x81b4: -case 0x81b5: -case 0x81b6: -case 0x81b7: -case 0x83b0: -case 0x83b1: -case 0x83b2: -case 0x83b3: -case 0x83b4: -case 0x83b5: -case 0x83b6: -case 0x83b7: -case 0x85b0: -case 0x85b1: -case 0x85b2: -case 0x85b3: -case 0x85b4: -case 0x85b5: -case 0x85b6: -case 0x85b7: -case 0x87b0: -case 0x87b1: -case 0x87b2: -case 0x87b3: -case 0x87b4: -case 0x87b5: -case 0x87b6: -case 0x87b7: -case 0x89b0: -case 0x89b1: -case 0x89b2: -case 0x89b3: -case 0x89b4: -case 0x89b5: -case 0x89b6: -case 0x89b7: -case 0x8bb0: -case 0x8bb1: -case 0x8bb2: -case 0x8bb3: -case 0x8bb4: -case 0x8bb5: -case 0x8bb6: -case 0x8bb7: -case 0x8db0: -case 0x8db1: -case 0x8db2: -case 0x8db3: -case 0x8db4: -case 0x8db5: -case 0x8db6: -case 0x8db7: -case 0x8fb0: -case 0x8fb1: -case 0x8fb2: -case 0x8fb3: -case 0x8fb4: -case 0x8fb5: -case 0x8fb6: -case 0x8fb7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x91b0: -case 0x91b1: -case 0x91b2: -case 0x91b3: -case 0x91b4: -case 0x91b5: -case 0x91b6: -case 0x91b7: -case 0x93b0: -case 0x93b1: -case 0x93b2: -case 0x93b3: -case 0x93b4: -case 0x93b5: -case 0x93b6: -case 0x93b7: -case 0x95b0: -case 0x95b1: -case 0x95b2: -case 0x95b3: -case 0x95b4: -case 0x95b5: -case 0x95b6: -case 0x95b7: -case 0x97b0: -case 0x97b1: -case 0x97b2: -case 0x97b3: -case 0x97b4: -case 0x97b5: -case 0x97b6: -case 0x97b7: -case 0x99b0: -case 0x99b1: -case 0x99b2: -case 0x99b3: -case 0x99b4: -case 0x99b5: -case 0x99b6: -case 0x99b7: -case 0x9bb0: -case 0x9bb1: -case 0x9bb2: -case 0x9bb3: -case 0x9bb4: -case 0x9bb5: -case 0x9bb6: -case 0x9bb7: -case 0x9db0: -case 0x9db1: -case 0x9db2: -case 0x9db3: -case 0x9db4: -case 0x9db5: -case 0x9db6: -case 0x9db7: -case 0x9fb0: -case 0x9fb1: -case 0x9fb2: -case 0x9fb3: -case 0x9fb4: -case 0x9fb5: -case 0x9fb6: -case 0x9fb7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd198: -case 0xd199: -case 0xd19a: -case 0xd19b: -case 0xd19c: -case 0xd19d: -case 0xd19e: -case 0xd19f: -case 0xd398: -case 0xd399: -case 0xd39a: -case 0xd39b: -case 0xd39c: -case 0xd39d: -case 0xd39e: -case 0xd39f: -case 0xd598: -case 0xd599: -case 0xd59a: -case 0xd59b: -case 0xd59c: -case 0xd59d: -case 0xd59e: -case 0xd59f: -case 0xd798: -case 0xd799: -case 0xd79a: -case 0xd79b: -case 0xd79c: -case 0xd79d: -case 0xd79e: -case 0xd79f: -case 0xd998: -case 0xd999: -case 0xd99a: -case 0xd99b: -case 0xd99c: -case 0xd99d: -case 0xd99e: -case 0xd99f: -case 0xdb98: -case 0xdb99: -case 0xdb9a: -case 0xdb9b: -case 0xdb9c: -case 0xdb9d: -case 0xdb9e: -case 0xdb9f: -case 0xdd98: -case 0xdd99: -case 0xdd9a: -case 0xdd9b: -case 0xdd9c: -case 0xdd9d: -case 0xdd9e: -case 0xdd9f: -case 0xdf98: -case 0xdf99: -case 0xdf9a: -case 0xdf9b: -case 0xdf9c: -case 0xdf9d: -case 0xdf9e: -case 0xdf9f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc198: -case 0xc199: -case 0xc19a: -case 0xc19b: -case 0xc19c: -case 0xc19d: -case 0xc19e: -case 0xc19f: -case 0xc398: -case 0xc399: -case 0xc39a: -case 0xc39b: -case 0xc39c: -case 0xc39d: -case 0xc39e: -case 0xc39f: -case 0xc598: -case 0xc599: -case 0xc59a: -case 0xc59b: -case 0xc59c: -case 0xc59d: -case 0xc59e: -case 0xc59f: -case 0xc798: -case 0xc799: -case 0xc79a: -case 0xc79b: -case 0xc79c: -case 0xc79d: -case 0xc79e: -case 0xc79f: -case 0xc998: -case 0xc999: -case 0xc99a: -case 0xc99b: -case 0xc99c: -case 0xc99d: -case 0xc99e: -case 0xc99f: -case 0xcb98: -case 0xcb99: -case 0xcb9a: -case 0xcb9b: -case 0xcb9c: -case 0xcb9d: -case 0xcb9e: -case 0xcb9f: -case 0xcd98: -case 0xcd99: -case 0xcd9a: -case 0xcd9b: -case 0xcd9c: -case 0xcd9d: -case 0xcd9e: -case 0xcd9f: -case 0xcf98: -case 0xcf99: -case 0xcf9a: -case 0xcf9b: -case 0xcf9c: -case 0xcf9d: -case 0xcf9e: -case 0xcf9f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb198: -case 0xb199: -case 0xb19a: -case 0xb19b: -case 0xb19c: -case 0xb19d: -case 0xb19e: -case 0xb19f: -case 0xb398: -case 0xb399: -case 0xb39a: -case 0xb39b: -case 0xb39c: -case 0xb39d: -case 0xb39e: -case 0xb39f: -case 0xb598: -case 0xb599: -case 0xb59a: -case 0xb59b: -case 0xb59c: -case 0xb59d: -case 0xb59e: -case 0xb59f: -case 0xb798: -case 0xb799: -case 0xb79a: -case 0xb79b: -case 0xb79c: -case 0xb79d: -case 0xb79e: -case 0xb79f: -case 0xb998: -case 0xb999: -case 0xb99a: -case 0xb99b: -case 0xb99c: -case 0xb99d: -case 0xb99e: -case 0xb99f: -case 0xbb98: -case 0xbb99: -case 0xbb9a: -case 0xbb9b: -case 0xbb9c: -case 0xbb9d: -case 0xbb9e: -case 0xbb9f: -case 0xbd98: -case 0xbd99: -case 0xbd9a: -case 0xbd9b: -case 0xbd9c: -case 0xbd9d: -case 0xbd9e: -case 0xbd9f: -case 0xbf98: -case 0xbf99: -case 0xbf9a: -case 0xbf9b: -case 0xbf9c: -case 0xbf9d: -case 0xbf9e: -case 0xbf9f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8198: -case 0x8199: -case 0x819a: -case 0x819b: -case 0x819c: -case 0x819d: -case 0x819e: -case 0x819f: -case 0x8398: -case 0x8399: -case 0x839a: -case 0x839b: -case 0x839c: -case 0x839d: -case 0x839e: -case 0x839f: -case 0x8598: -case 0x8599: -case 0x859a: -case 0x859b: -case 0x859c: -case 0x859d: -case 0x859e: -case 0x859f: -case 0x8798: -case 0x8799: -case 0x879a: -case 0x879b: -case 0x879c: -case 0x879d: -case 0x879e: -case 0x879f: -case 0x8998: -case 0x8999: -case 0x899a: -case 0x899b: -case 0x899c: -case 0x899d: -case 0x899e: -case 0x899f: -case 0x8b98: -case 0x8b99: -case 0x8b9a: -case 0x8b9b: -case 0x8b9c: -case 0x8b9d: -case 0x8b9e: -case 0x8b9f: -case 0x8d98: -case 0x8d99: -case 0x8d9a: -case 0x8d9b: -case 0x8d9c: -case 0x8d9d: -case 0x8d9e: -case 0x8d9f: -case 0x8f98: -case 0x8f99: -case 0x8f9a: -case 0x8f9b: -case 0x8f9c: -case 0x8f9d: -case 0x8f9e: -case 0x8f9f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9198: -case 0x9199: -case 0x919a: -case 0x919b: -case 0x919c: -case 0x919d: -case 0x919e: -case 0x919f: -case 0x9398: -case 0x9399: -case 0x939a: -case 0x939b: -case 0x939c: -case 0x939d: -case 0x939e: -case 0x939f: -case 0x9598: -case 0x9599: -case 0x959a: -case 0x959b: -case 0x959c: -case 0x959d: -case 0x959e: -case 0x959f: -case 0x9798: -case 0x9799: -case 0x979a: -case 0x979b: -case 0x979c: -case 0x979d: -case 0x979e: -case 0x979f: -case 0x9998: -case 0x9999: -case 0x999a: -case 0x999b: -case 0x999c: -case 0x999d: -case 0x999e: -case 0x999f: -case 0x9b98: -case 0x9b99: -case 0x9b9a: -case 0x9b9b: -case 0x9b9c: -case 0x9b9d: -case 0x9b9e: -case 0x9b9f: -case 0x9d98: -case 0x9d99: -case 0x9d9a: -case 0x9d9b: -case 0x9d9c: -case 0x9d9d: -case 0x9d9e: -case 0x9d9f: -case 0x9f98: -case 0x9f99: -case 0x9f9a: -case 0x9f9b: -case 0x9f9c: -case 0x9f9d: -case 0x9f9e: -case 0x9f9f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd1a0: -case 0xd1a1: -case 0xd1a2: -case 0xd1a3: -case 0xd1a4: -case 0xd1a5: -case 0xd1a6: -case 0xd1a7: -case 0xd3a0: -case 0xd3a1: -case 0xd3a2: -case 0xd3a3: -case 0xd3a4: -case 0xd3a5: -case 0xd3a6: -case 0xd3a7: -case 0xd5a0: -case 0xd5a1: -case 0xd5a2: -case 0xd5a3: -case 0xd5a4: -case 0xd5a5: -case 0xd5a6: -case 0xd5a7: -case 0xd7a0: -case 0xd7a1: -case 0xd7a2: -case 0xd7a3: -case 0xd7a4: -case 0xd7a5: -case 0xd7a6: -case 0xd7a7: -case 0xd9a0: -case 0xd9a1: -case 0xd9a2: -case 0xd9a3: -case 0xd9a4: -case 0xd9a5: -case 0xd9a6: -case 0xd9a7: -case 0xdba0: -case 0xdba1: -case 0xdba2: -case 0xdba3: -case 0xdba4: -case 0xdba5: -case 0xdba6: -case 0xdba7: -case 0xdda0: -case 0xdda1: -case 0xdda2: -case 0xdda3: -case 0xdda4: -case 0xdda5: -case 0xdda6: -case 0xdda7: -case 0xdfa0: -case 0xdfa1: -case 0xdfa2: -case 0xdfa3: -case 0xdfa4: -case 0xdfa5: -case 0xdfa6: -case 0xdfa7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc1a0: -case 0xc1a1: -case 0xc1a2: -case 0xc1a3: -case 0xc1a4: -case 0xc1a5: -case 0xc1a6: -case 0xc1a7: -case 0xc3a0: -case 0xc3a1: -case 0xc3a2: -case 0xc3a3: -case 0xc3a4: -case 0xc3a5: -case 0xc3a6: -case 0xc3a7: -case 0xc5a0: -case 0xc5a1: -case 0xc5a2: -case 0xc5a3: -case 0xc5a4: -case 0xc5a5: -case 0xc5a6: -case 0xc5a7: -case 0xc7a0: -case 0xc7a1: -case 0xc7a2: -case 0xc7a3: -case 0xc7a4: -case 0xc7a5: -case 0xc7a6: -case 0xc7a7: -case 0xc9a0: -case 0xc9a1: -case 0xc9a2: -case 0xc9a3: -case 0xc9a4: -case 0xc9a5: -case 0xc9a6: -case 0xc9a7: -case 0xcba0: -case 0xcba1: -case 0xcba2: -case 0xcba3: -case 0xcba4: -case 0xcba5: -case 0xcba6: -case 0xcba7: -case 0xcda0: -case 0xcda1: -case 0xcda2: -case 0xcda3: -case 0xcda4: -case 0xcda5: -case 0xcda6: -case 0xcda7: -case 0xcfa0: -case 0xcfa1: -case 0xcfa2: -case 0xcfa3: -case 0xcfa4: -case 0xcfa5: -case 0xcfa6: -case 0xcfa7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb1a0: -case 0xb1a1: -case 0xb1a2: -case 0xb1a3: -case 0xb1a4: -case 0xb1a5: -case 0xb1a6: -case 0xb1a7: -case 0xb3a0: -case 0xb3a1: -case 0xb3a2: -case 0xb3a3: -case 0xb3a4: -case 0xb3a5: -case 0xb3a6: -case 0xb3a7: -case 0xb5a0: -case 0xb5a1: -case 0xb5a2: -case 0xb5a3: -case 0xb5a4: -case 0xb5a5: -case 0xb5a6: -case 0xb5a7: -case 0xb7a0: -case 0xb7a1: -case 0xb7a2: -case 0xb7a3: -case 0xb7a4: -case 0xb7a5: -case 0xb7a6: -case 0xb7a7: -case 0xb9a0: -case 0xb9a1: -case 0xb9a2: -case 0xb9a3: -case 0xb9a4: -case 0xb9a5: -case 0xb9a6: -case 0xb9a7: -case 0xbba0: -case 0xbba1: -case 0xbba2: -case 0xbba3: -case 0xbba4: -case 0xbba5: -case 0xbba6: -case 0xbba7: -case 0xbda0: -case 0xbda1: -case 0xbda2: -case 0xbda3: -case 0xbda4: -case 0xbda5: -case 0xbda6: -case 0xbda7: -case 0xbfa0: -case 0xbfa1: -case 0xbfa2: -case 0xbfa3: -case 0xbfa4: -case 0xbfa5: -case 0xbfa6: -case 0xbfa7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x81a0: -case 0x81a1: -case 0x81a2: -case 0x81a3: -case 0x81a4: -case 0x81a5: -case 0x81a6: -case 0x81a7: -case 0x83a0: -case 0x83a1: -case 0x83a2: -case 0x83a3: -case 0x83a4: -case 0x83a5: -case 0x83a6: -case 0x83a7: -case 0x85a0: -case 0x85a1: -case 0x85a2: -case 0x85a3: -case 0x85a4: -case 0x85a5: -case 0x85a6: -case 0x85a7: -case 0x87a0: -case 0x87a1: -case 0x87a2: -case 0x87a3: -case 0x87a4: -case 0x87a5: -case 0x87a6: -case 0x87a7: -case 0x89a0: -case 0x89a1: -case 0x89a2: -case 0x89a3: -case 0x89a4: -case 0x89a5: -case 0x89a6: -case 0x89a7: -case 0x8ba0: -case 0x8ba1: -case 0x8ba2: -case 0x8ba3: -case 0x8ba4: -case 0x8ba5: -case 0x8ba6: -case 0x8ba7: -case 0x8da0: -case 0x8da1: -case 0x8da2: -case 0x8da3: -case 0x8da4: -case 0x8da5: -case 0x8da6: -case 0x8da7: -case 0x8fa0: -case 0x8fa1: -case 0x8fa2: -case 0x8fa3: -case 0x8fa4: -case 0x8fa5: -case 0x8fa6: -case 0x8fa7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x91a0: -case 0x91a1: -case 0x91a2: -case 0x91a3: -case 0x91a4: -case 0x91a5: -case 0x91a6: -case 0x91a7: -case 0x93a0: -case 0x93a1: -case 0x93a2: -case 0x93a3: -case 0x93a4: -case 0x93a5: -case 0x93a6: -case 0x93a7: -case 0x95a0: -case 0x95a1: -case 0x95a2: -case 0x95a3: -case 0x95a4: -case 0x95a5: -case 0x95a6: -case 0x95a7: -case 0x97a0: -case 0x97a1: -case 0x97a2: -case 0x97a3: -case 0x97a4: -case 0x97a5: -case 0x97a6: -case 0x97a7: -case 0x99a0: -case 0x99a1: -case 0x99a2: -case 0x99a3: -case 0x99a4: -case 0x99a5: -case 0x99a6: -case 0x99a7: -case 0x9ba0: -case 0x9ba1: -case 0x9ba2: -case 0x9ba3: -case 0x9ba4: -case 0x9ba5: -case 0x9ba6: -case 0x9ba7: -case 0x9da0: -case 0x9da1: -case 0x9da2: -case 0x9da3: -case 0x9da4: -case 0x9da5: -case 0x9da6: -case 0x9da7: -case 0x9fa0: -case 0x9fa1: -case 0x9fa2: -case 0x9fa3: -case 0x9fa4: -case 0x9fa5: -case 0x9fa6: -case 0x9fa7: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xb180: -case 0xb181: -case 0xb182: -case 0xb183: -case 0xb184: -case 0xb185: -case 0xb186: -case 0xb187: -case 0xb380: -case 0xb381: -case 0xb382: -case 0xb383: -case 0xb384: -case 0xb385: -case 0xb386: -case 0xb387: -case 0xb580: -case 0xb581: -case 0xb582: -case 0xb583: -case 0xb584: -case 0xb585: -case 0xb586: -case 0xb587: -case 0xb780: -case 0xb781: -case 0xb782: -case 0xb783: -case 0xb784: -case 0xb785: -case 0xb786: -case 0xb787: -case 0xb980: -case 0xb981: -case 0xb982: -case 0xb983: -case 0xb984: -case 0xb985: -case 0xb986: -case 0xb987: -case 0xbb80: -case 0xbb81: -case 0xbb82: -case 0xbb83: -case 0xbb84: -case 0xbb85: -case 0xbb86: -case 0xbb87: -case 0xbd80: -case 0xbd81: -case 0xbd82: -case 0xbd83: -case 0xbd84: -case 0xbd85: -case 0xbd86: -case 0xbd87: -case 0xbf80: -case 0xbf81: -case 0xbf82: -case 0xbf83: -case 0xbf84: -case 0xbf85: -case 0xbf86: -case 0xbf87: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x23c0: -case 0x23c1: -case 0x23c2: -case 0x23c3: -case 0x23c4: -case 0x23c5: -case 0x23c6: -case 0x23c7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21c0: -case 0x21c1: -case 0x21c2: -case 0x21c3: -case 0x21c4: -case 0x21c5: -case 0x21c6: -case 0x21c7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1c0: -case 0xd1c1: -case 0xd1c2: -case 0xd1c3: -case 0xd1c4: -case 0xd1c5: -case 0xd1c6: -case 0xd1c7: -case 0xd3c0: -case 0xd3c1: -case 0xd3c2: -case 0xd3c3: -case 0xd3c4: -case 0xd3c5: -case 0xd3c6: -case 0xd3c7: -case 0xd5c0: -case 0xd5c1: -case 0xd5c2: -case 0xd5c3: -case 0xd5c4: -case 0xd5c5: -case 0xd5c6: -case 0xd5c7: -case 0xd7c0: -case 0xd7c1: -case 0xd7c2: -case 0xd7c3: -case 0xd7c4: -case 0xd7c5: -case 0xd7c6: -case 0xd7c7: -case 0xd9c0: -case 0xd9c1: -case 0xd9c2: -case 0xd9c3: -case 0xd9c4: -case 0xd9c5: -case 0xd9c6: -case 0xd9c7: -case 0xdbc0: -case 0xdbc1: -case 0xdbc2: -case 0xdbc3: -case 0xdbc4: -case 0xdbc5: -case 0xdbc6: -case 0xdbc7: -case 0xddc0: -case 0xddc1: -case 0xddc2: -case 0xddc3: -case 0xddc4: -case 0xddc5: -case 0xddc6: -case 0xddc7: -case 0xdfc0: -case 0xdfc1: -case 0xdfc2: -case 0xdfc3: -case 0xdfc4: -case 0xdfc5: -case 0xdfc6: -case 0xdfc7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1c0: -case 0xb1c1: -case 0xb1c2: -case 0xb1c3: -case 0xb1c4: -case 0xb1c5: -case 0xb1c6: -case 0xb1c7: -case 0xb3c0: -case 0xb3c1: -case 0xb3c2: -case 0xb3c3: -case 0xb3c4: -case 0xb3c5: -case 0xb3c6: -case 0xb3c7: -case 0xb5c0: -case 0xb5c1: -case 0xb5c2: -case 0xb5c3: -case 0xb5c4: -case 0xb5c5: -case 0xb5c6: -case 0xb5c7: -case 0xb7c0: -case 0xb7c1: -case 0xb7c2: -case 0xb7c3: -case 0xb7c4: -case 0xb7c5: -case 0xb7c6: -case 0xb7c7: -case 0xb9c0: -case 0xb9c1: -case 0xb9c2: -case 0xb9c3: -case 0xb9c4: -case 0xb9c5: -case 0xb9c6: -case 0xb9c7: -case 0xbbc0: -case 0xbbc1: -case 0xbbc2: -case 0xbbc3: -case 0xbbc4: -case 0xbbc5: -case 0xbbc6: -case 0xbbc7: -case 0xbdc0: -case 0xbdc1: -case 0xbdc2: -case 0xbdc3: -case 0xbdc4: -case 0xbdc5: -case 0xbdc6: -case 0xbdc7: -case 0xbfc0: -case 0xbfc1: -case 0xbfc2: -case 0xbfc3: -case 0xbfc4: -case 0xbfc5: -case 0xbfc6: -case 0xbfc7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91c0: -case 0x91c1: -case 0x91c2: -case 0x91c3: -case 0x91c4: -case 0x91c5: -case 0x91c6: -case 0x91c7: -case 0x93c0: -case 0x93c1: -case 0x93c2: -case 0x93c3: -case 0x93c4: -case 0x93c5: -case 0x93c6: -case 0x93c7: -case 0x95c0: -case 0x95c1: -case 0x95c2: -case 0x95c3: -case 0x95c4: -case 0x95c5: -case 0x95c6: -case 0x95c7: -case 0x97c0: -case 0x97c1: -case 0x97c2: -case 0x97c3: -case 0x97c4: -case 0x97c5: -case 0x97c6: -case 0x97c7: -case 0x99c0: -case 0x99c1: -case 0x99c2: -case 0x99c3: -case 0x99c4: -case 0x99c5: -case 0x99c6: -case 0x99c7: -case 0x9bc0: -case 0x9bc1: -case 0x9bc2: -case 0x9bc3: -case 0x9bc4: -case 0x9bc5: -case 0x9bc6: -case 0x9bc7: -case 0x9dc0: -case 0x9dc1: -case 0x9dc2: -case 0x9dc3: -case 0x9dc4: -case 0x9dc5: -case 0x9dc6: -case 0x9dc7: -case 0x9fc0: -case 0x9fc1: -case 0x9fc2: -case 0x9fc3: -case 0x9fc4: -case 0x9fc5: -case 0x9fc6: -case 0x9fc7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x2080: -case 0x2081: -case 0x2082: -case 0x2083: -case 0x2084: -case 0x2085: -case 0x2086: -case 0x2087: -case 0x2280: -case 0x2281: -case 0x2282: -case 0x2283: -case 0x2284: -case 0x2285: -case 0x2286: -case 0x2287: -case 0x2480: -case 0x2481: -case 0x2482: -case 0x2483: -case 0x2484: -case 0x2485: -case 0x2486: -case 0x2487: -case 0x2680: -case 0x2681: -case 0x2682: -case 0x2683: -case 0x2684: -case 0x2685: -case 0x2686: -case 0x2687: -case 0x2880: -case 0x2881: -case 0x2882: -case 0x2883: -case 0x2884: -case 0x2885: -case 0x2886: -case 0x2887: -case 0x2a80: -case 0x2a81: -case 0x2a82: -case 0x2a83: -case 0x2a84: -case 0x2a85: -case 0x2a86: -case 0x2a87: -case 0x2c80: -case 0x2c81: -case 0x2c82: -case 0x2c83: -case 0x2c84: -case 0x2c85: -case 0x2c86: -case 0x2c87: -case 0x2e80: -case 0x2e81: -case 0x2e82: -case 0x2e83: -case 0x2e84: -case 0x2e85: -case 0x2e86: -case 0x2e87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2140: -case 0x2141: -case 0x2142: -case 0x2143: -case 0x2144: -case 0x2145: -case 0x2146: -case 0x2147: -case 0x2340: -case 0x2341: -case 0x2342: -case 0x2343: -case 0x2344: -case 0x2345: -case 0x2346: -case 0x2347: -case 0x2540: -case 0x2541: -case 0x2542: -case 0x2543: -case 0x2544: -case 0x2545: -case 0x2546: -case 0x2547: -case 0x2740: -case 0x2741: -case 0x2742: -case 0x2743: -case 0x2744: -case 0x2745: -case 0x2746: -case 0x2747: -case 0x2940: -case 0x2941: -case 0x2942: -case 0x2943: -case 0x2944: -case 0x2945: -case 0x2946: -case 0x2947: -case 0x2b40: -case 0x2b41: -case 0x2b42: -case 0x2b43: -case 0x2b44: -case 0x2b45: -case 0x2b46: -case 0x2b47: -case 0x2d40: -case 0x2d41: -case 0x2d42: -case 0x2d43: -case 0x2d44: -case 0x2d45: -case 0x2d46: -case 0x2d47: -case 0x2f40: -case 0x2f41: -case 0x2f42: -case 0x2f43: -case 0x2f44: -case 0x2f45: -case 0x2f46: -case 0x2f47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2180: -case 0x2181: -case 0x2182: -case 0x2183: -case 0x2184: -case 0x2185: -case 0x2186: -case 0x2187: -case 0x2380: -case 0x2381: -case 0x2382: -case 0x2383: -case 0x2384: -case 0x2385: -case 0x2386: -case 0x2387: -case 0x2580: -case 0x2581: -case 0x2582: -case 0x2583: -case 0x2584: -case 0x2585: -case 0x2586: -case 0x2587: -case 0x2780: -case 0x2781: -case 0x2782: -case 0x2783: -case 0x2784: -case 0x2785: -case 0x2786: -case 0x2787: -case 0x2980: -case 0x2981: -case 0x2982: -case 0x2983: -case 0x2984: -case 0x2985: -case 0x2986: -case 0x2987: -case 0x2b80: -case 0x2b81: -case 0x2b82: -case 0x2b83: -case 0x2b84: -case 0x2b85: -case 0x2b86: -case 0x2b87: -case 0x2d80: -case 0x2d81: -case 0x2d82: -case 0x2d83: -case 0x2d84: -case 0x2d85: -case 0x2d86: -case 0x2d87: -case 0x2f80: -case 0x2f81: -case 0x2f82: -case 0x2f83: -case 0x2f84: -case 0x2f85: -case 0x2f86: -case 0x2f87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20c0: -case 0x20c1: -case 0x20c2: -case 0x20c3: -case 0x20c4: -case 0x20c5: -case 0x20c6: -case 0x20c7: -case 0x22c0: -case 0x22c1: -case 0x22c2: -case 0x22c3: -case 0x22c4: -case 0x22c5: -case 0x22c6: -case 0x22c7: -case 0x24c0: -case 0x24c1: -case 0x24c2: -case 0x24c3: -case 0x24c4: -case 0x24c5: -case 0x24c6: -case 0x24c7: -case 0x26c0: -case 0x26c1: -case 0x26c2: -case 0x26c3: -case 0x26c4: -case 0x26c5: -case 0x26c6: -case 0x26c7: -case 0x28c0: -case 0x28c1: -case 0x28c2: -case 0x28c3: -case 0x28c4: -case 0x28c5: -case 0x28c6: -case 0x28c7: -case 0x2ac0: -case 0x2ac1: -case 0x2ac2: -case 0x2ac3: -case 0x2ac4: -case 0x2ac5: -case 0x2ac6: -case 0x2ac7: -case 0x2cc0: -case 0x2cc1: -case 0x2cc2: -case 0x2cc3: -case 0x2cc4: -case 0x2cc5: -case 0x2cc6: -case 0x2cc7: -case 0x2ec0: -case 0x2ec1: -case 0x2ec2: -case 0x2ec3: -case 0x2ec4: -case 0x2ec5: -case 0x2ec6: -case 0x2ec7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x2100: -case 0x2101: -case 0x2102: -case 0x2103: -case 0x2104: -case 0x2105: -case 0x2106: -case 0x2107: -case 0x2300: -case 0x2301: -case 0x2302: -case 0x2303: -case 0x2304: -case 0x2305: -case 0x2306: -case 0x2307: -case 0x2500: -case 0x2501: -case 0x2502: -case 0x2503: -case 0x2504: -case 0x2505: -case 0x2506: -case 0x2507: -case 0x2700: -case 0x2701: -case 0x2702: -case 0x2703: -case 0x2704: -case 0x2705: -case 0x2706: -case 0x2707: -case 0x2900: -case 0x2901: -case 0x2902: -case 0x2903: -case 0x2904: -case 0x2905: -case 0x2906: -case 0x2907: -case 0x2b00: -case 0x2b01: -case 0x2b02: -case 0x2b03: -case 0x2b04: -case 0x2b05: -case 0x2b06: -case 0x2b07: -case 0x2d00: -case 0x2d01: -case 0x2d02: -case 0x2d03: -case 0x2d04: -case 0x2d05: -case 0x2d06: -case 0x2d07: -case 0x2f00: -case 0x2f01: -case 0x2f02: -case 0x2f03: -case 0x2f04: -case 0x2f05: -case 0x2f06: -case 0x2f07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd080: -case 0xd081: -case 0xd082: -case 0xd083: -case 0xd084: -case 0xd085: -case 0xd086: -case 0xd087: -case 0xd280: -case 0xd281: -case 0xd282: -case 0xd283: -case 0xd284: -case 0xd285: -case 0xd286: -case 0xd287: -case 0xd480: -case 0xd481: -case 0xd482: -case 0xd483: -case 0xd484: -case 0xd485: -case 0xd486: -case 0xd487: -case 0xd680: -case 0xd681: -case 0xd682: -case 0xd683: -case 0xd684: -case 0xd685: -case 0xd686: -case 0xd687: -case 0xd880: -case 0xd881: -case 0xd882: -case 0xd883: -case 0xd884: -case 0xd885: -case 0xd886: -case 0xd887: -case 0xda80: -case 0xda81: -case 0xda82: -case 0xda83: -case 0xda84: -case 0xda85: -case 0xda86: -case 0xda87: -case 0xdc80: -case 0xdc81: -case 0xdc82: -case 0xdc83: -case 0xdc84: -case 0xdc85: -case 0xdc86: -case 0xdc87: -case 0xde80: -case 0xde81: -case 0xde82: -case 0xde83: -case 0xde84: -case 0xde85: -case 0xde86: -case 0xde87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xd180: -case 0xd181: -case 0xd182: -case 0xd183: -case 0xd184: -case 0xd185: -case 0xd186: -case 0xd187: -case 0xd380: -case 0xd381: -case 0xd382: -case 0xd383: -case 0xd384: -case 0xd385: -case 0xd386: -case 0xd387: -case 0xd580: -case 0xd581: -case 0xd582: -case 0xd583: -case 0xd584: -case 0xd585: -case 0xd586: -case 0xd587: -case 0xd780: -case 0xd781: -case 0xd782: -case 0xd783: -case 0xd784: -case 0xd785: -case 0xd786: -case 0xd787: -case 0xd980: -case 0xd981: -case 0xd982: -case 0xd983: -case 0xd984: -case 0xd985: -case 0xd986: -case 0xd987: -case 0xdb80: -case 0xdb81: -case 0xdb82: -case 0xdb83: -case 0xdb84: -case 0xdb85: -case 0xdb86: -case 0xdb87: -case 0xdd80: -case 0xdd81: -case 0xdd82: -case 0xdd83: -case 0xdd84: -case 0xdd85: -case 0xdd86: -case 0xdd87: -case 0xdf80: -case 0xdf81: -case 0xdf82: -case 0xdf83: -case 0xdf84: -case 0xdf85: -case 0xdf86: -case 0xdf87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADDX(src, dst); - } - break; - -case 0xc080: -case 0xc081: -case 0xc082: -case 0xc083: -case 0xc084: -case 0xc085: -case 0xc086: -case 0xc087: -case 0xc280: -case 0xc281: -case 0xc282: -case 0xc283: -case 0xc284: -case 0xc285: -case 0xc286: -case 0xc287: -case 0xc480: -case 0xc481: -case 0xc482: -case 0xc483: -case 0xc484: -case 0xc485: -case 0xc486: -case 0xc487: -case 0xc680: -case 0xc681: -case 0xc682: -case 0xc683: -case 0xc684: -case 0xc685: -case 0xc686: -case 0xc687: -case 0xc880: -case 0xc881: -case 0xc882: -case 0xc883: -case 0xc884: -case 0xc885: -case 0xc886: -case 0xc887: -case 0xca80: -case 0xca81: -case 0xca82: -case 0xca83: -case 0xca84: -case 0xca85: -case 0xca86: -case 0xca87: -case 0xcc80: -case 0xcc81: -case 0xcc82: -case 0xcc83: -case 0xcc84: -case 0xcc85: -case 0xcc86: -case 0xcc87: -case 0xce80: -case 0xce81: -case 0xce82: -case 0xce83: -case 0xce84: -case 0xce85: -case 0xce86: -case 0xce87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb080: -case 0xb081: -case 0xb082: -case 0xb083: -case 0xb084: -case 0xb085: -case 0xb086: -case 0xb087: -case 0xb280: -case 0xb281: -case 0xb282: -case 0xb283: -case 0xb284: -case 0xb285: -case 0xb286: -case 0xb287: -case 0xb480: -case 0xb481: -case 0xb482: -case 0xb483: -case 0xb484: -case 0xb485: -case 0xb486: -case 0xb487: -case 0xb680: -case 0xb681: -case 0xb682: -case 0xb683: -case 0xb684: -case 0xb685: -case 0xb686: -case 0xb687: -case 0xb880: -case 0xb881: -case 0xb882: -case 0xb883: -case 0xb884: -case 0xb885: -case 0xb886: -case 0xb887: -case 0xba80: -case 0xba81: -case 0xba82: -case 0xba83: -case 0xba84: -case 0xba85: -case 0xba86: -case 0xba87: -case 0xbc80: -case 0xbc81: -case 0xbc82: -case 0xbc83: -case 0xbc84: -case 0xbc85: -case 0xbc86: -case 0xbc87: -case 0xbe80: -case 0xbe81: -case 0xbe82: -case 0xbe83: -case 0xbe84: -case 0xbe85: -case 0xbe86: -case 0xbe87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x2000: -case 0x2001: -case 0x2002: -case 0x2003: -case 0x2004: -case 0x2005: -case 0x2006: -case 0x2007: -case 0x2200: -case 0x2201: -case 0x2202: -case 0x2203: -case 0x2204: -case 0x2205: -case 0x2206: -case 0x2207: -case 0x2400: -case 0x2401: -case 0x2402: -case 0x2403: -case 0x2404: -case 0x2405: -case 0x2406: -case 0x2407: -case 0x2600: -case 0x2601: -case 0x2602: -case 0x2603: -case 0x2604: -case 0x2605: -case 0x2606: -case 0x2607: -case 0x2800: -case 0x2801: -case 0x2802: -case 0x2803: -case 0x2804: -case 0x2805: -case 0x2806: -case 0x2807: -case 0x2a00: -case 0x2a01: -case 0x2a02: -case 0x2a03: -case 0x2a04: -case 0x2a05: -case 0x2a06: -case 0x2a07: -case 0x2c00: -case 0x2c01: -case 0x2c02: -case 0x2c03: -case 0x2c04: -case 0x2c05: -case 0x2c06: -case 0x2c07: -case 0x2e00: -case 0x2e01: -case 0x2e02: -case 0x2e03: -case 0x2e04: -case 0x2e05: -case 0x2e06: -case 0x2e07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8080: -case 0x8081: -case 0x8082: -case 0x8083: -case 0x8084: -case 0x8085: -case 0x8086: -case 0x8087: -case 0x8280: -case 0x8281: -case 0x8282: -case 0x8283: -case 0x8284: -case 0x8285: -case 0x8286: -case 0x8287: -case 0x8480: -case 0x8481: -case 0x8482: -case 0x8483: -case 0x8484: -case 0x8485: -case 0x8486: -case 0x8487: -case 0x8680: -case 0x8681: -case 0x8682: -case 0x8683: -case 0x8684: -case 0x8685: -case 0x8686: -case 0x8687: -case 0x8880: -case 0x8881: -case 0x8882: -case 0x8883: -case 0x8884: -case 0x8885: -case 0x8886: -case 0x8887: -case 0x8a80: -case 0x8a81: -case 0x8a82: -case 0x8a83: -case 0x8a84: -case 0x8a85: -case 0x8a86: -case 0x8a87: -case 0x8c80: -case 0x8c81: -case 0x8c82: -case 0x8c83: -case 0x8c84: -case 0x8c85: -case 0x8c86: -case 0x8c87: -case 0x8e80: -case 0x8e81: -case 0x8e82: -case 0x8e83: -case 0x8e84: -case 0x8e85: -case 0x8e86: -case 0x8e87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9080: -case 0x9081: -case 0x9082: -case 0x9083: -case 0x9084: -case 0x9085: -case 0x9086: -case 0x9087: -case 0x9280: -case 0x9281: -case 0x9282: -case 0x9283: -case 0x9284: -case 0x9285: -case 0x9286: -case 0x9287: -case 0x9480: -case 0x9481: -case 0x9482: -case 0x9483: -case 0x9484: -case 0x9485: -case 0x9486: -case 0x9487: -case 0x9680: -case 0x9681: -case 0x9682: -case 0x9683: -case 0x9684: -case 0x9685: -case 0x9686: -case 0x9687: -case 0x9880: -case 0x9881: -case 0x9882: -case 0x9883: -case 0x9884: -case 0x9885: -case 0x9886: -case 0x9887: -case 0x9a80: -case 0x9a81: -case 0x9a82: -case 0x9a83: -case 0x9a84: -case 0x9a85: -case 0x9a86: -case 0x9a87: -case 0x9c80: -case 0x9c81: -case 0x9c82: -case 0x9c83: -case 0x9c84: -case 0x9c85: -case 0x9c86: -case 0x9c87: -case 0x9e80: -case 0x9e81: -case 0x9e82: -case 0x9e83: -case 0x9e84: -case 0x9e85: -case 0x9e86: -case 0x9e87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x9180: -case 0x9181: -case 0x9182: -case 0x9183: -case 0x9184: -case 0x9185: -case 0x9186: -case 0x9187: -case 0x9380: -case 0x9381: -case 0x9382: -case 0x9383: -case 0x9384: -case 0x9385: -case 0x9386: -case 0x9387: -case 0x9580: -case 0x9581: -case 0x9582: -case 0x9583: -case 0x9584: -case 0x9585: -case 0x9586: -case 0x9587: -case 0x9780: -case 0x9781: -case 0x9782: -case 0x9783: -case 0x9784: -case 0x9785: -case 0x9786: -case 0x9787: -case 0x9980: -case 0x9981: -case 0x9982: -case 0x9983: -case 0x9984: -case 0x9985: -case 0x9986: -case 0x9987: -case 0x9b80: -case 0x9b81: -case 0x9b82: -case 0x9b83: -case 0x9b84: -case 0x9b85: -case 0x9b86: -case 0x9b87: -case 0x9d80: -case 0x9d81: -case 0x9d82: -case 0x9d83: -case 0x9d84: -case 0x9d85: -case 0x9d86: -case 0x9d87: -case 0x9f80: -case 0x9f81: -case 0x9f82: -case 0x9f83: -case 0x9f84: -case 0x9f85: -case 0x9f86: -case 0x9f87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUBX(src, dst); - } - break; - -case 0x2040: -case 0x2041: -case 0x2042: -case 0x2043: -case 0x2044: -case 0x2045: -case 0x2046: -case 0x2047: -case 0x2240: -case 0x2241: -case 0x2242: -case 0x2243: -case 0x2244: -case 0x2245: -case 0x2246: -case 0x2247: -case 0x2440: -case 0x2441: -case 0x2442: -case 0x2443: -case 0x2444: -case 0x2445: -case 0x2446: -case 0x2447: -case 0x2640: -case 0x2641: -case 0x2642: -case 0x2643: -case 0x2644: -case 0x2645: -case 0x2646: -case 0x2647: -case 0x2840: -case 0x2841: -case 0x2842: -case 0x2843: -case 0x2844: -case 0x2845: -case 0x2846: -case 0x2847: -case 0x2a40: -case 0x2a41: -case 0x2a42: -case 0x2a43: -case 0x2a44: -case 0x2a45: -case 0x2a46: -case 0x2a47: -case 0x2c40: -case 0x2c41: -case 0x2c42: -case 0x2c43: -case 0x2c44: -case 0x2c45: -case 0x2c46: -case 0x2c47: -case 0x2e40: -case 0x2e41: -case 0x2e42: -case 0x2e43: -case 0x2e44: -case 0x2e45: -case 0x2e46: -case 0x2e47: - { - HAM src(this, instr_b2_b0); MOVEA(src, instr_b11_b9); - } - break; - -case 0xe1a0: -case 0xe1a1: -case 0xe1a2: -case 0xe1a3: -case 0xe1a4: -case 0xe1a5: -case 0xe1a6: -case 0xe1a7: -case 0xe3a0: -case 0xe3a1: -case 0xe3a2: -case 0xe3a3: -case 0xe3a4: -case 0xe3a5: -case 0xe3a6: -case 0xe3a7: -case 0xe5a0: -case 0xe5a1: -case 0xe5a2: -case 0xe5a3: -case 0xe5a4: -case 0xe5a5: -case 0xe5a6: -case 0xe5a7: -case 0xe7a0: -case 0xe7a1: -case 0xe7a2: -case 0xe7a3: -case 0xe7a4: -case 0xe7a5: -case 0xe7a6: -case 0xe7a7: -case 0xe9a0: -case 0xe9a1: -case 0xe9a2: -case 0xe9a3: -case 0xe9a4: -case 0xe9a5: -case 0xe9a6: -case 0xe9a7: -case 0xeba0: -case 0xeba1: -case 0xeba2: -case 0xeba3: -case 0xeba4: -case 0xeba5: -case 0xeba6: -case 0xeba7: -case 0xeda0: -case 0xeda1: -case 0xeda2: -case 0xeda3: -case 0xeda4: -case 0xeda5: -case 0xeda6: -case 0xeda7: -case 0xefa0: -case 0xefa1: -case 0xefa2: -case 0xefa3: -case 0xefa4: -case 0xefa5: -case 0xefa6: -case 0xefa7: - { - HAM targ(this, instr_b2_b0); ASL(targ, D[instr_b11_b9]); - } - break; - -case 0xe180: -case 0xe181: -case 0xe182: -case 0xe183: -case 0xe184: -case 0xe185: -case 0xe186: -case 0xe187: -case 0xe380: -case 0xe381: -case 0xe382: -case 0xe383: -case 0xe384: -case 0xe385: -case 0xe386: -case 0xe387: -case 0xe580: -case 0xe581: -case 0xe582: -case 0xe583: -case 0xe584: -case 0xe585: -case 0xe586: -case 0xe587: -case 0xe780: -case 0xe781: -case 0xe782: -case 0xe783: -case 0xe784: -case 0xe785: -case 0xe786: -case 0xe787: -case 0xe980: -case 0xe981: -case 0xe982: -case 0xe983: -case 0xe984: -case 0xe985: -case 0xe986: -case 0xe987: -case 0xeb80: -case 0xeb81: -case 0xeb82: -case 0xeb83: -case 0xeb84: -case 0xeb85: -case 0xeb86: -case 0xeb87: -case 0xed80: -case 0xed81: -case 0xed82: -case 0xed83: -case 0xed84: -case 0xed85: -case 0xed86: -case 0xed87: -case 0xef80: -case 0xef81: -case 0xef82: -case 0xef83: -case 0xef84: -case 0xef85: -case 0xef86: -case 0xef87: - { - HAM targ(this, instr_b2_b0); ASL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe0a0: -case 0xe0a1: -case 0xe0a2: -case 0xe0a3: -case 0xe0a4: -case 0xe0a5: -case 0xe0a6: -case 0xe0a7: -case 0xe2a0: -case 0xe2a1: -case 0xe2a2: -case 0xe2a3: -case 0xe2a4: -case 0xe2a5: -case 0xe2a6: -case 0xe2a7: -case 0xe4a0: -case 0xe4a1: -case 0xe4a2: -case 0xe4a3: -case 0xe4a4: -case 0xe4a5: -case 0xe4a6: -case 0xe4a7: -case 0xe6a0: -case 0xe6a1: -case 0xe6a2: -case 0xe6a3: -case 0xe6a4: -case 0xe6a5: -case 0xe6a6: -case 0xe6a7: -case 0xe8a0: -case 0xe8a1: -case 0xe8a2: -case 0xe8a3: -case 0xe8a4: -case 0xe8a5: -case 0xe8a6: -case 0xe8a7: -case 0xeaa0: -case 0xeaa1: -case 0xeaa2: -case 0xeaa3: -case 0xeaa4: -case 0xeaa5: -case 0xeaa6: -case 0xeaa7: -case 0xeca0: -case 0xeca1: -case 0xeca2: -case 0xeca3: -case 0xeca4: -case 0xeca5: -case 0xeca6: -case 0xeca7: -case 0xeea0: -case 0xeea1: -case 0xeea2: -case 0xeea3: -case 0xeea4: -case 0xeea5: -case 0xeea6: -case 0xeea7: - { - HAM targ(this, instr_b2_b0); ASR(targ, D[instr_b11_b9]); - } - break; - -case 0xe080: -case 0xe081: -case 0xe082: -case 0xe083: -case 0xe084: -case 0xe085: -case 0xe086: -case 0xe087: -case 0xe280: -case 0xe281: -case 0xe282: -case 0xe283: -case 0xe284: -case 0xe285: -case 0xe286: -case 0xe287: -case 0xe480: -case 0xe481: -case 0xe482: -case 0xe483: -case 0xe484: -case 0xe485: -case 0xe486: -case 0xe487: -case 0xe680: -case 0xe681: -case 0xe682: -case 0xe683: -case 0xe684: -case 0xe685: -case 0xe686: -case 0xe687: -case 0xe880: -case 0xe881: -case 0xe882: -case 0xe883: -case 0xe884: -case 0xe885: -case 0xe886: -case 0xe887: -case 0xea80: -case 0xea81: -case 0xea82: -case 0xea83: -case 0xea84: -case 0xea85: -case 0xea86: -case 0xea87: -case 0xec80: -case 0xec81: -case 0xec82: -case 0xec83: -case 0xec84: -case 0xec85: -case 0xec86: -case 0xec87: -case 0xee80: -case 0xee81: -case 0xee82: -case 0xee83: -case 0xee84: -case 0xee85: -case 0xee86: -case 0xee87: - { - HAM targ(this, instr_b2_b0); ASR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0x0140: -case 0x0141: -case 0x0142: -case 0x0143: -case 0x0144: -case 0x0145: -case 0x0146: -case 0x0147: -case 0x0340: -case 0x0341: -case 0x0342: -case 0x0343: -case 0x0344: -case 0x0345: -case 0x0346: -case 0x0347: -case 0x0540: -case 0x0541: -case 0x0542: -case 0x0543: -case 0x0544: -case 0x0545: -case 0x0546: -case 0x0547: -case 0x0740: -case 0x0741: -case 0x0742: -case 0x0743: -case 0x0744: -case 0x0745: -case 0x0746: -case 0x0747: -case 0x0940: -case 0x0941: -case 0x0942: -case 0x0943: -case 0x0944: -case 0x0945: -case 0x0946: -case 0x0947: -case 0x0b40: -case 0x0b41: -case 0x0b42: -case 0x0b43: -case 0x0b44: -case 0x0b45: -case 0x0b46: -case 0x0b47: -case 0x0d40: -case 0x0d41: -case 0x0d42: -case 0x0d43: -case 0x0d44: -case 0x0d45: -case 0x0d46: -case 0x0d47: -case 0x0f40: -case 0x0f41: -case 0x0f42: -case 0x0f43: -case 0x0f44: -case 0x0f45: -case 0x0f46: -case 0x0f47: - { - HAM targ(this, instr_b2_b0); BCHG(targ, D[instr_b11_b9]); - } - break; - -case 0x0180: -case 0x0181: -case 0x0182: -case 0x0183: -case 0x0184: -case 0x0185: -case 0x0186: -case 0x0187: -case 0x0380: -case 0x0381: -case 0x0382: -case 0x0383: -case 0x0384: -case 0x0385: -case 0x0386: -case 0x0387: -case 0x0580: -case 0x0581: -case 0x0582: -case 0x0583: -case 0x0584: -case 0x0585: -case 0x0586: -case 0x0587: -case 0x0780: -case 0x0781: -case 0x0782: -case 0x0783: -case 0x0784: -case 0x0785: -case 0x0786: -case 0x0787: -case 0x0980: -case 0x0981: -case 0x0982: -case 0x0983: -case 0x0984: -case 0x0985: -case 0x0986: -case 0x0987: -case 0x0b80: -case 0x0b81: -case 0x0b82: -case 0x0b83: -case 0x0b84: -case 0x0b85: -case 0x0b86: -case 0x0b87: -case 0x0d80: -case 0x0d81: -case 0x0d82: -case 0x0d83: -case 0x0d84: -case 0x0d85: -case 0x0d86: -case 0x0d87: -case 0x0f80: -case 0x0f81: -case 0x0f82: -case 0x0f83: -case 0x0f84: -case 0x0f85: -case 0x0f86: -case 0x0f87: - { - HAM targ(this, instr_b2_b0); BCLR(targ, D[instr_b11_b9]); - } - break; - -case 0x01c0: -case 0x01c1: -case 0x01c2: -case 0x01c3: -case 0x01c4: -case 0x01c5: -case 0x01c6: -case 0x01c7: -case 0x03c0: -case 0x03c1: -case 0x03c2: -case 0x03c3: -case 0x03c4: -case 0x03c5: -case 0x03c6: -case 0x03c7: -case 0x05c0: -case 0x05c1: -case 0x05c2: -case 0x05c3: -case 0x05c4: -case 0x05c5: -case 0x05c6: -case 0x05c7: -case 0x07c0: -case 0x07c1: -case 0x07c2: -case 0x07c3: -case 0x07c4: -case 0x07c5: -case 0x07c6: -case 0x07c7: -case 0x09c0: -case 0x09c1: -case 0x09c2: -case 0x09c3: -case 0x09c4: -case 0x09c5: -case 0x09c6: -case 0x09c7: -case 0x0bc0: -case 0x0bc1: -case 0x0bc2: -case 0x0bc3: -case 0x0bc4: -case 0x0bc5: -case 0x0bc6: -case 0x0bc7: -case 0x0dc0: -case 0x0dc1: -case 0x0dc2: -case 0x0dc3: -case 0x0dc4: -case 0x0dc5: -case 0x0dc6: -case 0x0dc7: -case 0x0fc0: -case 0x0fc1: -case 0x0fc2: -case 0x0fc3: -case 0x0fc4: -case 0x0fc5: -case 0x0fc6: -case 0x0fc7: - { - HAM targ(this, instr_b2_b0); BSET(targ, D[instr_b11_b9]); - } - break; - -case 0x0100: -case 0x0101: -case 0x0102: -case 0x0103: -case 0x0104: -case 0x0105: -case 0x0106: -case 0x0107: -case 0x0300: -case 0x0301: -case 0x0302: -case 0x0303: -case 0x0304: -case 0x0305: -case 0x0306: -case 0x0307: -case 0x0500: -case 0x0501: -case 0x0502: -case 0x0503: -case 0x0504: -case 0x0505: -case 0x0506: -case 0x0507: -case 0x0700: -case 0x0701: -case 0x0702: -case 0x0703: -case 0x0704: -case 0x0705: -case 0x0706: -case 0x0707: -case 0x0900: -case 0x0901: -case 0x0902: -case 0x0903: -case 0x0904: -case 0x0905: -case 0x0906: -case 0x0907: -case 0x0b00: -case 0x0b01: -case 0x0b02: -case 0x0b03: -case 0x0b04: -case 0x0b05: -case 0x0b06: -case 0x0b07: -case 0x0d00: -case 0x0d01: -case 0x0d02: -case 0x0d03: -case 0x0d04: -case 0x0d05: -case 0x0d06: -case 0x0d07: -case 0x0f00: -case 0x0f01: -case 0x0f02: -case 0x0f03: -case 0x0f04: -case 0x0f05: -case 0x0f06: -case 0x0f07: - { - HAM targ(this, instr_b2_b0); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0xe1a8: -case 0xe1a9: -case 0xe1aa: -case 0xe1ab: -case 0xe1ac: -case 0xe1ad: -case 0xe1ae: -case 0xe1af: -case 0xe3a8: -case 0xe3a9: -case 0xe3aa: -case 0xe3ab: -case 0xe3ac: -case 0xe3ad: -case 0xe3ae: -case 0xe3af: -case 0xe5a8: -case 0xe5a9: -case 0xe5aa: -case 0xe5ab: -case 0xe5ac: -case 0xe5ad: -case 0xe5ae: -case 0xe5af: -case 0xe7a8: -case 0xe7a9: -case 0xe7aa: -case 0xe7ab: -case 0xe7ac: -case 0xe7ad: -case 0xe7ae: -case 0xe7af: -case 0xe9a8: -case 0xe9a9: -case 0xe9aa: -case 0xe9ab: -case 0xe9ac: -case 0xe9ad: -case 0xe9ae: -case 0xe9af: -case 0xeba8: -case 0xeba9: -case 0xebaa: -case 0xebab: -case 0xebac: -case 0xebad: -case 0xebae: -case 0xebaf: -case 0xeda8: -case 0xeda9: -case 0xedaa: -case 0xedab: -case 0xedac: -case 0xedad: -case 0xedae: -case 0xedaf: -case 0xefa8: -case 0xefa9: -case 0xefaa: -case 0xefab: -case 0xefac: -case 0xefad: -case 0xefae: -case 0xefaf: - { - HAM targ(this, instr_b2_b0); LSL(targ, D[instr_b11_b9]); - } - break; - -case 0xe188: -case 0xe189: -case 0xe18a: -case 0xe18b: -case 0xe18c: -case 0xe18d: -case 0xe18e: -case 0xe18f: -case 0xe388: -case 0xe389: -case 0xe38a: -case 0xe38b: -case 0xe38c: -case 0xe38d: -case 0xe38e: -case 0xe38f: -case 0xe588: -case 0xe589: -case 0xe58a: -case 0xe58b: -case 0xe58c: -case 0xe58d: -case 0xe58e: -case 0xe58f: -case 0xe788: -case 0xe789: -case 0xe78a: -case 0xe78b: -case 0xe78c: -case 0xe78d: -case 0xe78e: -case 0xe78f: -case 0xe988: -case 0xe989: -case 0xe98a: -case 0xe98b: -case 0xe98c: -case 0xe98d: -case 0xe98e: -case 0xe98f: -case 0xeb88: -case 0xeb89: -case 0xeb8a: -case 0xeb8b: -case 0xeb8c: -case 0xeb8d: -case 0xeb8e: -case 0xeb8f: -case 0xed88: -case 0xed89: -case 0xed8a: -case 0xed8b: -case 0xed8c: -case 0xed8d: -case 0xed8e: -case 0xed8f: -case 0xef88: -case 0xef89: -case 0xef8a: -case 0xef8b: -case 0xef8c: -case 0xef8d: -case 0xef8e: -case 0xef8f: - { - HAM targ(this, instr_b2_b0); LSL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe0a8: -case 0xe0a9: -case 0xe0aa: -case 0xe0ab: -case 0xe0ac: -case 0xe0ad: -case 0xe0ae: -case 0xe0af: -case 0xe2a8: -case 0xe2a9: -case 0xe2aa: -case 0xe2ab: -case 0xe2ac: -case 0xe2ad: -case 0xe2ae: -case 0xe2af: -case 0xe4a8: -case 0xe4a9: -case 0xe4aa: -case 0xe4ab: -case 0xe4ac: -case 0xe4ad: -case 0xe4ae: -case 0xe4af: -case 0xe6a8: -case 0xe6a9: -case 0xe6aa: -case 0xe6ab: -case 0xe6ac: -case 0xe6ad: -case 0xe6ae: -case 0xe6af: -case 0xe8a8: -case 0xe8a9: -case 0xe8aa: -case 0xe8ab: -case 0xe8ac: -case 0xe8ad: -case 0xe8ae: -case 0xe8af: -case 0xeaa8: -case 0xeaa9: -case 0xeaaa: -case 0xeaab: -case 0xeaac: -case 0xeaad: -case 0xeaae: -case 0xeaaf: -case 0xeca8: -case 0xeca9: -case 0xecaa: -case 0xecab: -case 0xecac: -case 0xecad: -case 0xecae: -case 0xecaf: -case 0xeea8: -case 0xeea9: -case 0xeeaa: -case 0xeeab: -case 0xeeac: -case 0xeead: -case 0xeeae: -case 0xeeaf: - { - HAM targ(this, instr_b2_b0); LSR(targ, D[instr_b11_b9]); - } - break; - -case 0xe088: -case 0xe089: -case 0xe08a: -case 0xe08b: -case 0xe08c: -case 0xe08d: -case 0xe08e: -case 0xe08f: -case 0xe288: -case 0xe289: -case 0xe28a: -case 0xe28b: -case 0xe28c: -case 0xe28d: -case 0xe28e: -case 0xe28f: -case 0xe488: -case 0xe489: -case 0xe48a: -case 0xe48b: -case 0xe48c: -case 0xe48d: -case 0xe48e: -case 0xe48f: -case 0xe688: -case 0xe689: -case 0xe68a: -case 0xe68b: -case 0xe68c: -case 0xe68d: -case 0xe68e: -case 0xe68f: -case 0xe888: -case 0xe889: -case 0xe88a: -case 0xe88b: -case 0xe88c: -case 0xe88d: -case 0xe88e: -case 0xe88f: -case 0xea88: -case 0xea89: -case 0xea8a: -case 0xea8b: -case 0xea8c: -case 0xea8d: -case 0xea8e: -case 0xea8f: -case 0xec88: -case 0xec89: -case 0xec8a: -case 0xec8b: -case 0xec8c: -case 0xec8d: -case 0xec8e: -case 0xec8f: -case 0xee88: -case 0xee89: -case 0xee8a: -case 0xee8b: -case 0xee8c: -case 0xee8d: -case 0xee8e: -case 0xee8f: - { - HAM targ(this, instr_b2_b0); LSR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe1b8: -case 0xe1b9: -case 0xe1ba: -case 0xe1bb: -case 0xe1bc: -case 0xe1bd: -case 0xe1be: -case 0xe1bf: -case 0xe3b8: -case 0xe3b9: -case 0xe3ba: -case 0xe3bb: -case 0xe3bc: -case 0xe3bd: -case 0xe3be: -case 0xe3bf: -case 0xe5b8: -case 0xe5b9: -case 0xe5ba: -case 0xe5bb: -case 0xe5bc: -case 0xe5bd: -case 0xe5be: -case 0xe5bf: -case 0xe7b8: -case 0xe7b9: -case 0xe7ba: -case 0xe7bb: -case 0xe7bc: -case 0xe7bd: -case 0xe7be: -case 0xe7bf: -case 0xe9b8: -case 0xe9b9: -case 0xe9ba: -case 0xe9bb: -case 0xe9bc: -case 0xe9bd: -case 0xe9be: -case 0xe9bf: -case 0xebb8: -case 0xebb9: -case 0xebba: -case 0xebbb: -case 0xebbc: -case 0xebbd: -case 0xebbe: -case 0xebbf: -case 0xedb8: -case 0xedb9: -case 0xedba: -case 0xedbb: -case 0xedbc: -case 0xedbd: -case 0xedbe: -case 0xedbf: -case 0xefb8: -case 0xefb9: -case 0xefba: -case 0xefbb: -case 0xefbc: -case 0xefbd: -case 0xefbe: -case 0xefbf: - { - HAM targ(this, instr_b2_b0); ROL(targ, D[instr_b11_b9]); - } - break; - -case 0xe198: -case 0xe199: -case 0xe19a: -case 0xe19b: -case 0xe19c: -case 0xe19d: -case 0xe19e: -case 0xe19f: -case 0xe398: -case 0xe399: -case 0xe39a: -case 0xe39b: -case 0xe39c: -case 0xe39d: -case 0xe39e: -case 0xe39f: -case 0xe598: -case 0xe599: -case 0xe59a: -case 0xe59b: -case 0xe59c: -case 0xe59d: -case 0xe59e: -case 0xe59f: -case 0xe798: -case 0xe799: -case 0xe79a: -case 0xe79b: -case 0xe79c: -case 0xe79d: -case 0xe79e: -case 0xe79f: -case 0xe998: -case 0xe999: -case 0xe99a: -case 0xe99b: -case 0xe99c: -case 0xe99d: -case 0xe99e: -case 0xe99f: -case 0xeb98: -case 0xeb99: -case 0xeb9a: -case 0xeb9b: -case 0xeb9c: -case 0xeb9d: -case 0xeb9e: -case 0xeb9f: -case 0xed98: -case 0xed99: -case 0xed9a: -case 0xed9b: -case 0xed9c: -case 0xed9d: -case 0xed9e: -case 0xed9f: -case 0xef98: -case 0xef99: -case 0xef9a: -case 0xef9b: -case 0xef9c: -case 0xef9d: -case 0xef9e: -case 0xef9f: - { - HAM targ(this, instr_b2_b0); ROL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe0b8: -case 0xe0b9: -case 0xe0ba: -case 0xe0bb: -case 0xe0bc: -case 0xe0bd: -case 0xe0be: -case 0xe0bf: -case 0xe2b8: -case 0xe2b9: -case 0xe2ba: -case 0xe2bb: -case 0xe2bc: -case 0xe2bd: -case 0xe2be: -case 0xe2bf: -case 0xe4b8: -case 0xe4b9: -case 0xe4ba: -case 0xe4bb: -case 0xe4bc: -case 0xe4bd: -case 0xe4be: -case 0xe4bf: -case 0xe6b8: -case 0xe6b9: -case 0xe6ba: -case 0xe6bb: -case 0xe6bc: -case 0xe6bd: -case 0xe6be: -case 0xe6bf: -case 0xe8b8: -case 0xe8b9: -case 0xe8ba: -case 0xe8bb: -case 0xe8bc: -case 0xe8bd: -case 0xe8be: -case 0xe8bf: -case 0xeab8: -case 0xeab9: -case 0xeaba: -case 0xeabb: -case 0xeabc: -case 0xeabd: -case 0xeabe: -case 0xeabf: -case 0xecb8: -case 0xecb9: -case 0xecba: -case 0xecbb: -case 0xecbc: -case 0xecbd: -case 0xecbe: -case 0xecbf: -case 0xeeb8: -case 0xeeb9: -case 0xeeba: -case 0xeebb: -case 0xeebc: -case 0xeebd: -case 0xeebe: -case 0xeebf: - { - HAM targ(this, instr_b2_b0); ROR(targ, D[instr_b11_b9]); - } - break; - -case 0xe098: -case 0xe099: -case 0xe09a: -case 0xe09b: -case 0xe09c: -case 0xe09d: -case 0xe09e: -case 0xe09f: -case 0xe298: -case 0xe299: -case 0xe29a: -case 0xe29b: -case 0xe29c: -case 0xe29d: -case 0xe29e: -case 0xe29f: -case 0xe498: -case 0xe499: -case 0xe49a: -case 0xe49b: -case 0xe49c: -case 0xe49d: -case 0xe49e: -case 0xe49f: -case 0xe698: -case 0xe699: -case 0xe69a: -case 0xe69b: -case 0xe69c: -case 0xe69d: -case 0xe69e: -case 0xe69f: -case 0xe898: -case 0xe899: -case 0xe89a: -case 0xe89b: -case 0xe89c: -case 0xe89d: -case 0xe89e: -case 0xe89f: -case 0xea98: -case 0xea99: -case 0xea9a: -case 0xea9b: -case 0xea9c: -case 0xea9d: -case 0xea9e: -case 0xea9f: -case 0xec98: -case 0xec99: -case 0xec9a: -case 0xec9b: -case 0xec9c: -case 0xec9d: -case 0xec9e: -case 0xec9f: -case 0xee98: -case 0xee99: -case 0xee9a: -case 0xee9b: -case 0xee9c: -case 0xee9d: -case 0xee9e: -case 0xee9f: - { - HAM targ(this, instr_b2_b0); ROR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe1b0: -case 0xe1b1: -case 0xe1b2: -case 0xe1b3: -case 0xe1b4: -case 0xe1b5: -case 0xe1b6: -case 0xe1b7: -case 0xe3b0: -case 0xe3b1: -case 0xe3b2: -case 0xe3b3: -case 0xe3b4: -case 0xe3b5: -case 0xe3b6: -case 0xe3b7: -case 0xe5b0: -case 0xe5b1: -case 0xe5b2: -case 0xe5b3: -case 0xe5b4: -case 0xe5b5: -case 0xe5b6: -case 0xe5b7: -case 0xe7b0: -case 0xe7b1: -case 0xe7b2: -case 0xe7b3: -case 0xe7b4: -case 0xe7b5: -case 0xe7b6: -case 0xe7b7: -case 0xe9b0: -case 0xe9b1: -case 0xe9b2: -case 0xe9b3: -case 0xe9b4: -case 0xe9b5: -case 0xe9b6: -case 0xe9b7: -case 0xebb0: -case 0xebb1: -case 0xebb2: -case 0xebb3: -case 0xebb4: -case 0xebb5: -case 0xebb6: -case 0xebb7: -case 0xedb0: -case 0xedb1: -case 0xedb2: -case 0xedb3: -case 0xedb4: -case 0xedb5: -case 0xedb6: -case 0xedb7: -case 0xefb0: -case 0xefb1: -case 0xefb2: -case 0xefb3: -case 0xefb4: -case 0xefb5: -case 0xefb6: -case 0xefb7: - { - HAM targ(this, instr_b2_b0); ROXL(targ, D[instr_b11_b9]); - } - break; - -case 0xe190: -case 0xe191: -case 0xe192: -case 0xe193: -case 0xe194: -case 0xe195: -case 0xe196: -case 0xe197: -case 0xe390: -case 0xe391: -case 0xe392: -case 0xe393: -case 0xe394: -case 0xe395: -case 0xe396: -case 0xe397: -case 0xe590: -case 0xe591: -case 0xe592: -case 0xe593: -case 0xe594: -case 0xe595: -case 0xe596: -case 0xe597: -case 0xe790: -case 0xe791: -case 0xe792: -case 0xe793: -case 0xe794: -case 0xe795: -case 0xe796: -case 0xe797: -case 0xe990: -case 0xe991: -case 0xe992: -case 0xe993: -case 0xe994: -case 0xe995: -case 0xe996: -case 0xe997: -case 0xeb90: -case 0xeb91: -case 0xeb92: -case 0xeb93: -case 0xeb94: -case 0xeb95: -case 0xeb96: -case 0xeb97: -case 0xed90: -case 0xed91: -case 0xed92: -case 0xed93: -case 0xed94: -case 0xed95: -case 0xed96: -case 0xed97: -case 0xef90: -case 0xef91: -case 0xef92: -case 0xef93: -case 0xef94: -case 0xef95: -case 0xef96: -case 0xef97: - { - HAM targ(this, instr_b2_b0); ROXL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe0b0: -case 0xe0b1: -case 0xe0b2: -case 0xe0b3: -case 0xe0b4: -case 0xe0b5: -case 0xe0b6: -case 0xe0b7: -case 0xe2b0: -case 0xe2b1: -case 0xe2b2: -case 0xe2b3: -case 0xe2b4: -case 0xe2b5: -case 0xe2b6: -case 0xe2b7: -case 0xe4b0: -case 0xe4b1: -case 0xe4b2: -case 0xe4b3: -case 0xe4b4: -case 0xe4b5: -case 0xe4b6: -case 0xe4b7: -case 0xe6b0: -case 0xe6b1: -case 0xe6b2: -case 0xe6b3: -case 0xe6b4: -case 0xe6b5: -case 0xe6b6: -case 0xe6b7: -case 0xe8b0: -case 0xe8b1: -case 0xe8b2: -case 0xe8b3: -case 0xe8b4: -case 0xe8b5: -case 0xe8b6: -case 0xe8b7: -case 0xeab0: -case 0xeab1: -case 0xeab2: -case 0xeab3: -case 0xeab4: -case 0xeab5: -case 0xeab6: -case 0xeab7: -case 0xecb0: -case 0xecb1: -case 0xecb2: -case 0xecb3: -case 0xecb4: -case 0xecb5: -case 0xecb6: -case 0xecb7: -case 0xeeb0: -case 0xeeb1: -case 0xeeb2: -case 0xeeb3: -case 0xeeb4: -case 0xeeb5: -case 0xeeb6: -case 0xeeb7: - { - HAM targ(this, instr_b2_b0); ROXR(targ, D[instr_b11_b9]); - } - break; - -case 0xe090: -case 0xe091: -case 0xe092: -case 0xe093: -case 0xe094: -case 0xe095: -case 0xe096: -case 0xe097: -case 0xe290: -case 0xe291: -case 0xe292: -case 0xe293: -case 0xe294: -case 0xe295: -case 0xe296: -case 0xe297: -case 0xe490: -case 0xe491: -case 0xe492: -case 0xe493: -case 0xe494: -case 0xe495: -case 0xe496: -case 0xe497: -case 0xe690: -case 0xe691: -case 0xe692: -case 0xe693: -case 0xe694: -case 0xe695: -case 0xe696: -case 0xe697: -case 0xe890: -case 0xe891: -case 0xe892: -case 0xe893: -case 0xe894: -case 0xe895: -case 0xe896: -case 0xe897: -case 0xea90: -case 0xea91: -case 0xea92: -case 0xea93: -case 0xea94: -case 0xea95: -case 0xea96: -case 0xea97: -case 0xec90: -case 0xec91: -case 0xec92: -case 0xec93: -case 0xec94: -case 0xec95: -case 0xec96: -case 0xec97: -case 0xee90: -case 0xee91: -case 0xee92: -case 0xee93: -case 0xee94: -case 0xee95: -case 0xee96: -case 0xee97: - { - HAM targ(this, instr_b2_b0); ROXR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0x06b9: - { - HAM src(this); HAM dst(this); ADD(src, dst); - } - break; - -case 0x02b9: - { - HAM src(this); HAM dst(this); AND(src, dst); - } - break; - -case 0x0cb9: - { - HAM src(this); HAM dst(this); CMP(src, dst); - } - break; - -case 0x0ab9: - { - HAM src(this); HAM dst(this); EOR(src, dst); - } - break; - -case 0x23fc: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x00b9: - { - HAM src(this); HAM dst(this); OR(src, dst); - } - break; - -case 0x04b9: - { - HAM src(this); HAM dst(this); SUB(src, dst); - } - break; - -case 0x06b8: - { - HAM src(this); HAM dst(this); ADD(src, dst); - } - break; - -case 0x02b8: - { - HAM src(this); HAM dst(this); AND(src, dst); - } - break; - -case 0x0cb8: - { - HAM src(this); HAM dst(this); CMP(src, dst); - } - break; - -case 0x0ab8: - { - HAM src(this); HAM dst(this); EOR(src, dst); - } - break; - -case 0x21fc: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x00b8: - { - HAM src(this); HAM dst(this); OR(src, dst); - } - break; - -case 0x04b8: - { - HAM src(this); HAM dst(this); SUB(src, dst); - } - break; - -case 0xd1fc: -case 0xd3fc: -case 0xd5fc: -case 0xd7fc: -case 0xd9fc: -case 0xdbfc: -case 0xddfc: -case 0xdffc: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1fc: -case 0xb3fc: -case 0xb5fc: -case 0xb7fc: -case 0xb9fc: -case 0xbbfc: -case 0xbdfc: -case 0xbffc: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91fc: -case 0x93fc: -case 0x95fc: -case 0x97fc: -case 0x99fc: -case 0x9bfc: -case 0x9dfc: -case 0x9ffc: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x20bc: -case 0x22bc: -case 0x24bc: -case 0x26bc: -case 0x28bc: -case 0x2abc: -case 0x2cbc: -case 0x2ebc: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0690: -case 0x0691: -case 0x0692: -case 0x0693: -case 0x0694: -case 0x0695: -case 0x0696: -case 0x0697: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0290: -case 0x0291: -case 0x0292: -case 0x0293: -case 0x0294: -case 0x0295: -case 0x0296: -case 0x0297: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c90: -case 0x0c91: -case 0x0c92: -case 0x0c93: -case 0x0c94: -case 0x0c95: -case 0x0c96: -case 0x0c97: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a90: -case 0x0a91: -case 0x0a92: -case 0x0a93: -case 0x0a94: -case 0x0a95: -case 0x0a96: -case 0x0a97: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0090: -case 0x0091: -case 0x0092: -case 0x0093: -case 0x0094: -case 0x0095: -case 0x0096: -case 0x0097: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0490: -case 0x0491: -case 0x0492: -case 0x0493: -case 0x0494: -case 0x0495: -case 0x0496: -case 0x0497: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x217c: -case 0x237c: -case 0x257c: -case 0x277c: -case 0x297c: -case 0x2b7c: -case 0x2d7c: -case 0x2f7c: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x06a8: -case 0x06a9: -case 0x06aa: -case 0x06ab: -case 0x06ac: -case 0x06ad: -case 0x06ae: -case 0x06af: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x02a8: -case 0x02a9: -case 0x02aa: -case 0x02ab: -case 0x02ac: -case 0x02ad: -case 0x02ae: -case 0x02af: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0ca8: -case 0x0ca9: -case 0x0caa: -case 0x0cab: -case 0x0cac: -case 0x0cad: -case 0x0cae: -case 0x0caf: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0aa8: -case 0x0aa9: -case 0x0aaa: -case 0x0aab: -case 0x0aac: -case 0x0aad: -case 0x0aae: -case 0x0aaf: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x00a8: -case 0x00a9: -case 0x00aa: -case 0x00ab: -case 0x00ac: -case 0x00ad: -case 0x00ae: -case 0x00af: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x04a8: -case 0x04a9: -case 0x04aa: -case 0x04ab: -case 0x04ac: -case 0x04ad: -case 0x04ae: -case 0x04af: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x21bc: -case 0x23bc: -case 0x25bc: -case 0x27bc: -case 0x29bc: -case 0x2bbc: -case 0x2dbc: -case 0x2fbc: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x06b0: -case 0x06b1: -case 0x06b2: -case 0x06b3: -case 0x06b4: -case 0x06b5: -case 0x06b6: -case 0x06b7: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x02b0: -case 0x02b1: -case 0x02b2: -case 0x02b3: -case 0x02b4: -case 0x02b5: -case 0x02b6: -case 0x02b7: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0cb0: -case 0x0cb1: -case 0x0cb2: -case 0x0cb3: -case 0x0cb4: -case 0x0cb5: -case 0x0cb6: -case 0x0cb7: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0ab0: -case 0x0ab1: -case 0x0ab2: -case 0x0ab3: -case 0x0ab4: -case 0x0ab5: -case 0x0ab6: -case 0x0ab7: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x00b0: -case 0x00b1: -case 0x00b2: -case 0x00b3: -case 0x00b4: -case 0x00b5: -case 0x00b6: -case 0x00b7: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x04b0: -case 0x04b1: -case 0x04b2: -case 0x04b3: -case 0x04b4: -case 0x04b5: -case 0x04b6: -case 0x04b7: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x20fc: -case 0x22fc: -case 0x24fc: -case 0x26fc: -case 0x28fc: -case 0x2afc: -case 0x2cfc: -case 0x2efc: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0698: -case 0x0699: -case 0x069a: -case 0x069b: -case 0x069c: -case 0x069d: -case 0x069e: -case 0x069f: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0298: -case 0x0299: -case 0x029a: -case 0x029b: -case 0x029c: -case 0x029d: -case 0x029e: -case 0x029f: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c98: -case 0x0c99: -case 0x0c9a: -case 0x0c9b: -case 0x0c9c: -case 0x0c9d: -case 0x0c9e: -case 0x0c9f: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a98: -case 0x0a99: -case 0x0a9a: -case 0x0a9b: -case 0x0a9c: -case 0x0a9d: -case 0x0a9e: -case 0x0a9f: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0098: -case 0x0099: -case 0x009a: -case 0x009b: -case 0x009c: -case 0x009d: -case 0x009e: -case 0x009f: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0498: -case 0x0499: -case 0x049a: -case 0x049b: -case 0x049c: -case 0x049d: -case 0x049e: -case 0x049f: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x213c: -case 0x233c: -case 0x253c: -case 0x273c: -case 0x293c: -case 0x2b3c: -case 0x2d3c: -case 0x2f3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x06a0: -case 0x06a1: -case 0x06a2: -case 0x06a3: -case 0x06a4: -case 0x06a5: -case 0x06a6: -case 0x06a7: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x02a0: -case 0x02a1: -case 0x02a2: -case 0x02a3: -case 0x02a4: -case 0x02a5: -case 0x02a6: -case 0x02a7: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0ca0: -case 0x0ca1: -case 0x0ca2: -case 0x0ca3: -case 0x0ca4: -case 0x0ca5: -case 0x0ca6: -case 0x0ca7: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0aa0: -case 0x0aa1: -case 0x0aa2: -case 0x0aa3: -case 0x0aa4: -case 0x0aa5: -case 0x0aa6: -case 0x0aa7: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x00a0: -case 0x00a1: -case 0x00a2: -case 0x00a3: -case 0x00a4: -case 0x00a5: -case 0x00a6: -case 0x00a7: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x04a0: -case 0x04a1: -case 0x04a2: -case 0x04a3: -case 0x04a4: -case 0x04a5: -case 0x04a6: -case 0x04a7: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd0bc: -case 0xd2bc: -case 0xd4bc: -case 0xd6bc: -case 0xd8bc: -case 0xdabc: -case 0xdcbc: -case 0xdebc: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc0bc: -case 0xc2bc: -case 0xc4bc: -case 0xc6bc: -case 0xc8bc: -case 0xcabc: -case 0xccbc: -case 0xcebc: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb0bc: -case 0xb2bc: -case 0xb4bc: -case 0xb6bc: -case 0xb8bc: -case 0xbabc: -case 0xbcbc: -case 0xbebc: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x203c: -case 0x223c: -case 0x243c: -case 0x263c: -case 0x283c: -case 0x2a3c: -case 0x2c3c: -case 0x2e3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x80bc: -case 0x82bc: -case 0x84bc: -case 0x86bc: -case 0x88bc: -case 0x8abc: -case 0x8cbc: -case 0x8ebc: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x90bc: -case 0x92bc: -case 0x94bc: -case 0x96bc: -case 0x98bc: -case 0x9abc: -case 0x9cbc: -case 0x9ebc: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0680: -case 0x0681: -case 0x0682: -case 0x0683: -case 0x0684: -case 0x0685: -case 0x0686: -case 0x0687: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0280: -case 0x0281: -case 0x0282: -case 0x0283: -case 0x0284: -case 0x0285: -case 0x0286: -case 0x0287: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c80: -case 0x0c81: -case 0x0c82: -case 0x0c83: -case 0x0c84: -case 0x0c85: -case 0x0c86: -case 0x0c87: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a80: -case 0x0a81: -case 0x0a82: -case 0x0a83: -case 0x0a84: -case 0x0a85: -case 0x0a86: -case 0x0a87: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0080: -case 0x0081: -case 0x0082: -case 0x0083: -case 0x0084: -case 0x0085: -case 0x0086: -case 0x0087: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0480: -case 0x0481: -case 0x0482: -case 0x0483: -case 0x0484: -case 0x0485: -case 0x0486: -case 0x0487: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x207c: -case 0x227c: -case 0x247c: -case 0x267c: -case 0x287c: -case 0x2a7c: -case 0x2c7c: -case 0x2e7c: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x7000: -case 0x7001: -case 0x7002: -case 0x7003: -case 0x7004: -case 0x7005: -case 0x7006: -case 0x7007: -case 0x7008: -case 0x7009: -case 0x700a: -case 0x700b: -case 0x700c: -case 0x700d: -case 0x700e: -case 0x700f: -case 0x7010: -case 0x7011: -case 0x7012: -case 0x7013: -case 0x7014: -case 0x7015: -case 0x7016: -case 0x7017: -case 0x7018: -case 0x7019: -case 0x701a: -case 0x701b: -case 0x701c: -case 0x701d: -case 0x701e: -case 0x701f: -case 0x7020: -case 0x7021: -case 0x7022: -case 0x7023: -case 0x7024: -case 0x7025: -case 0x7026: -case 0x7027: -case 0x7028: -case 0x7029: -case 0x702a: -case 0x702b: -case 0x702c: -case 0x702d: -case 0x702e: -case 0x702f: -case 0x7030: -case 0x7031: -case 0x7032: -case 0x7033: -case 0x7034: -case 0x7035: -case 0x7036: -case 0x7037: -case 0x7038: -case 0x7039: -case 0x703a: -case 0x703b: -case 0x703c: -case 0x703d: -case 0x703e: -case 0x703f: -case 0x7040: -case 0x7041: -case 0x7042: -case 0x7043: -case 0x7044: -case 0x7045: -case 0x7046: -case 0x7047: -case 0x7048: -case 0x7049: -case 0x704a: -case 0x704b: -case 0x704c: -case 0x704d: -case 0x704e: -case 0x704f: -case 0x7050: -case 0x7051: -case 0x7052: -case 0x7053: -case 0x7054: -case 0x7055: -case 0x7056: -case 0x7057: -case 0x7058: -case 0x7059: -case 0x705a: -case 0x705b: -case 0x705c: -case 0x705d: -case 0x705e: -case 0x705f: -case 0x7060: -case 0x7061: -case 0x7062: -case 0x7063: -case 0x7064: -case 0x7065: -case 0x7066: -case 0x7067: -case 0x7068: -case 0x7069: -case 0x706a: -case 0x706b: -case 0x706c: -case 0x706d: -case 0x706e: -case 0x706f: -case 0x7070: -case 0x7071: -case 0x7072: -case 0x7073: -case 0x7074: -case 0x7075: -case 0x7076: -case 0x7077: -case 0x7078: -case 0x7079: -case 0x707a: -case 0x707b: -case 0x707c: -case 0x707d: -case 0x707e: -case 0x707f: -case 0x7080: -case 0x7081: -case 0x7082: -case 0x7083: -case 0x7084: -case 0x7085: -case 0x7086: -case 0x7087: -case 0x7088: -case 0x7089: -case 0x708a: -case 0x708b: -case 0x708c: -case 0x708d: -case 0x708e: -case 0x708f: -case 0x7090: -case 0x7091: -case 0x7092: -case 0x7093: -case 0x7094: -case 0x7095: -case 0x7096: -case 0x7097: -case 0x7098: -case 0x7099: -case 0x709a: -case 0x709b: -case 0x709c: -case 0x709d: -case 0x709e: -case 0x709f: -case 0x70a0: -case 0x70a1: -case 0x70a2: -case 0x70a3: -case 0x70a4: -case 0x70a5: -case 0x70a6: -case 0x70a7: -case 0x70a8: -case 0x70a9: -case 0x70aa: -case 0x70ab: -case 0x70ac: -case 0x70ad: -case 0x70ae: -case 0x70af: -case 0x70b0: -case 0x70b1: -case 0x70b2: -case 0x70b3: -case 0x70b4: -case 0x70b5: -case 0x70b6: -case 0x70b7: -case 0x70b8: -case 0x70b9: -case 0x70ba: -case 0x70bb: -case 0x70bc: -case 0x70bd: -case 0x70be: -case 0x70bf: -case 0x70c0: -case 0x70c1: -case 0x70c2: -case 0x70c3: -case 0x70c4: -case 0x70c5: -case 0x70c6: -case 0x70c7: -case 0x70c8: -case 0x70c9: -case 0x70ca: -case 0x70cb: -case 0x70cc: -case 0x70cd: -case 0x70ce: -case 0x70cf: -case 0x70d0: -case 0x70d1: -case 0x70d2: -case 0x70d3: -case 0x70d4: -case 0x70d5: -case 0x70d6: -case 0x70d7: -case 0x70d8: -case 0x70d9: -case 0x70da: -case 0x70db: -case 0x70dc: -case 0x70dd: -case 0x70de: -case 0x70df: -case 0x70e0: -case 0x70e1: -case 0x70e2: -case 0x70e3: -case 0x70e4: -case 0x70e5: -case 0x70e6: -case 0x70e7: -case 0x70e8: -case 0x70e9: -case 0x70ea: -case 0x70eb: -case 0x70ec: -case 0x70ed: -case 0x70ee: -case 0x70ef: -case 0x70f0: -case 0x70f1: -case 0x70f2: -case 0x70f3: -case 0x70f4: -case 0x70f5: -case 0x70f6: -case 0x70f7: -case 0x70f8: -case 0x70f9: -case 0x70fa: -case 0x70fb: -case 0x70fc: -case 0x70fd: -case 0x70fe: -case 0x70ff: -case 0x7200: -case 0x7201: -case 0x7202: -case 0x7203: -case 0x7204: -case 0x7205: -case 0x7206: -case 0x7207: -case 0x7208: -case 0x7209: -case 0x720a: -case 0x720b: -case 0x720c: -case 0x720d: -case 0x720e: -case 0x720f: -case 0x7210: -case 0x7211: -case 0x7212: -case 0x7213: -case 0x7214: -case 0x7215: -case 0x7216: -case 0x7217: -case 0x7218: -case 0x7219: -case 0x721a: -case 0x721b: -case 0x721c: -case 0x721d: -case 0x721e: -case 0x721f: -case 0x7220: -case 0x7221: -case 0x7222: -case 0x7223: -case 0x7224: -case 0x7225: -case 0x7226: -case 0x7227: -case 0x7228: -case 0x7229: -case 0x722a: -case 0x722b: -case 0x722c: -case 0x722d: -case 0x722e: -case 0x722f: -case 0x7230: -case 0x7231: -case 0x7232: -case 0x7233: -case 0x7234: -case 0x7235: -case 0x7236: -case 0x7237: -case 0x7238: -case 0x7239: -case 0x723a: -case 0x723b: -case 0x723c: -case 0x723d: -case 0x723e: -case 0x723f: -case 0x7240: -case 0x7241: -case 0x7242: -case 0x7243: -case 0x7244: -case 0x7245: -case 0x7246: -case 0x7247: -case 0x7248: -case 0x7249: -case 0x724a: -case 0x724b: -case 0x724c: -case 0x724d: -case 0x724e: -case 0x724f: -case 0x7250: -case 0x7251: -case 0x7252: -case 0x7253: -case 0x7254: -case 0x7255: -case 0x7256: -case 0x7257: -case 0x7258: -case 0x7259: -case 0x725a: -case 0x725b: -case 0x725c: -case 0x725d: -case 0x725e: -case 0x725f: -case 0x7260: -case 0x7261: -case 0x7262: -case 0x7263: -case 0x7264: -case 0x7265: -case 0x7266: -case 0x7267: -case 0x7268: -case 0x7269: -case 0x726a: -case 0x726b: -case 0x726c: -case 0x726d: -case 0x726e: -case 0x726f: -case 0x7270: -case 0x7271: -case 0x7272: -case 0x7273: -case 0x7274: -case 0x7275: -case 0x7276: -case 0x7277: -case 0x7278: -case 0x7279: -case 0x727a: -case 0x727b: -case 0x727c: -case 0x727d: -case 0x727e: -case 0x727f: -case 0x7280: -case 0x7281: -case 0x7282: -case 0x7283: -case 0x7284: -case 0x7285: -case 0x7286: -case 0x7287: -case 0x7288: -case 0x7289: -case 0x728a: -case 0x728b: -case 0x728c: -case 0x728d: -case 0x728e: -case 0x728f: -case 0x7290: -case 0x7291: -case 0x7292: -case 0x7293: -case 0x7294: -case 0x7295: -case 0x7296: -case 0x7297: -case 0x7298: -case 0x7299: -case 0x729a: -case 0x729b: -case 0x729c: -case 0x729d: -case 0x729e: -case 0x729f: -case 0x72a0: -case 0x72a1: -case 0x72a2: -case 0x72a3: -case 0x72a4: -case 0x72a5: -case 0x72a6: -case 0x72a7: -case 0x72a8: -case 0x72a9: -case 0x72aa: -case 0x72ab: -case 0x72ac: -case 0x72ad: -case 0x72ae: -case 0x72af: -case 0x72b0: -case 0x72b1: -case 0x72b2: -case 0x72b3: -case 0x72b4: -case 0x72b5: -case 0x72b6: -case 0x72b7: -case 0x72b8: -case 0x72b9: -case 0x72ba: -case 0x72bb: -case 0x72bc: -case 0x72bd: -case 0x72be: -case 0x72bf: -case 0x72c0: -case 0x72c1: -case 0x72c2: -case 0x72c3: -case 0x72c4: -case 0x72c5: -case 0x72c6: -case 0x72c7: -case 0x72c8: -case 0x72c9: -case 0x72ca: -case 0x72cb: -case 0x72cc: -case 0x72cd: -case 0x72ce: -case 0x72cf: -case 0x72d0: -case 0x72d1: -case 0x72d2: -case 0x72d3: -case 0x72d4: -case 0x72d5: -case 0x72d6: -case 0x72d7: -case 0x72d8: -case 0x72d9: -case 0x72da: -case 0x72db: -case 0x72dc: -case 0x72dd: -case 0x72de: -case 0x72df: -case 0x72e0: -case 0x72e1: -case 0x72e2: -case 0x72e3: -case 0x72e4: -case 0x72e5: -case 0x72e6: -case 0x72e7: -case 0x72e8: -case 0x72e9: -case 0x72ea: -case 0x72eb: -case 0x72ec: -case 0x72ed: -case 0x72ee: -case 0x72ef: -case 0x72f0: -case 0x72f1: -case 0x72f2: -case 0x72f3: -case 0x72f4: -case 0x72f5: -case 0x72f6: -case 0x72f7: -case 0x72f8: -case 0x72f9: -case 0x72fa: -case 0x72fb: -case 0x72fc: -case 0x72fd: -case 0x72fe: -case 0x72ff: -case 0x7400: -case 0x7401: -case 0x7402: -case 0x7403: -case 0x7404: -case 0x7405: -case 0x7406: -case 0x7407: -case 0x7408: -case 0x7409: -case 0x740a: -case 0x740b: -case 0x740c: -case 0x740d: -case 0x740e: -case 0x740f: -case 0x7410: -case 0x7411: -case 0x7412: -case 0x7413: -case 0x7414: -case 0x7415: -case 0x7416: -case 0x7417: -case 0x7418: -case 0x7419: -case 0x741a: -case 0x741b: -case 0x741c: -case 0x741d: -case 0x741e: -case 0x741f: -case 0x7420: -case 0x7421: -case 0x7422: -case 0x7423: -case 0x7424: -case 0x7425: -case 0x7426: -case 0x7427: -case 0x7428: -case 0x7429: -case 0x742a: -case 0x742b: -case 0x742c: -case 0x742d: -case 0x742e: -case 0x742f: -case 0x7430: -case 0x7431: -case 0x7432: -case 0x7433: -case 0x7434: -case 0x7435: -case 0x7436: -case 0x7437: -case 0x7438: -case 0x7439: -case 0x743a: -case 0x743b: -case 0x743c: -case 0x743d: -case 0x743e: -case 0x743f: -case 0x7440: -case 0x7441: -case 0x7442: -case 0x7443: -case 0x7444: -case 0x7445: -case 0x7446: -case 0x7447: -case 0x7448: -case 0x7449: -case 0x744a: -case 0x744b: -case 0x744c: -case 0x744d: -case 0x744e: -case 0x744f: -case 0x7450: -case 0x7451: -case 0x7452: -case 0x7453: -case 0x7454: -case 0x7455: -case 0x7456: -case 0x7457: -case 0x7458: -case 0x7459: -case 0x745a: -case 0x745b: -case 0x745c: -case 0x745d: -case 0x745e: -case 0x745f: -case 0x7460: -case 0x7461: -case 0x7462: -case 0x7463: -case 0x7464: -case 0x7465: -case 0x7466: -case 0x7467: -case 0x7468: -case 0x7469: -case 0x746a: -case 0x746b: -case 0x746c: -case 0x746d: -case 0x746e: -case 0x746f: -case 0x7470: -case 0x7471: -case 0x7472: -case 0x7473: -case 0x7474: -case 0x7475: -case 0x7476: -case 0x7477: -case 0x7478: -case 0x7479: -case 0x747a: -case 0x747b: -case 0x747c: -case 0x747d: -case 0x747e: -case 0x747f: -case 0x7480: -case 0x7481: -case 0x7482: -case 0x7483: -case 0x7484: -case 0x7485: -case 0x7486: -case 0x7487: -case 0x7488: -case 0x7489: -case 0x748a: -case 0x748b: -case 0x748c: -case 0x748d: -case 0x748e: -case 0x748f: -case 0x7490: -case 0x7491: -case 0x7492: -case 0x7493: -case 0x7494: -case 0x7495: -case 0x7496: -case 0x7497: -case 0x7498: -case 0x7499: -case 0x749a: -case 0x749b: -case 0x749c: -case 0x749d: -case 0x749e: -case 0x749f: -case 0x74a0: -case 0x74a1: -case 0x74a2: -case 0x74a3: -case 0x74a4: -case 0x74a5: -case 0x74a6: -case 0x74a7: -case 0x74a8: -case 0x74a9: -case 0x74aa: -case 0x74ab: -case 0x74ac: -case 0x74ad: -case 0x74ae: -case 0x74af: -case 0x74b0: -case 0x74b1: -case 0x74b2: -case 0x74b3: -case 0x74b4: -case 0x74b5: -case 0x74b6: -case 0x74b7: -case 0x74b8: -case 0x74b9: -case 0x74ba: -case 0x74bb: -case 0x74bc: -case 0x74bd: -case 0x74be: -case 0x74bf: -case 0x74c0: -case 0x74c1: -case 0x74c2: -case 0x74c3: -case 0x74c4: -case 0x74c5: -case 0x74c6: -case 0x74c7: -case 0x74c8: -case 0x74c9: -case 0x74ca: -case 0x74cb: -case 0x74cc: -case 0x74cd: -case 0x74ce: -case 0x74cf: -case 0x74d0: -case 0x74d1: -case 0x74d2: -case 0x74d3: -case 0x74d4: -case 0x74d5: -case 0x74d6: -case 0x74d7: -case 0x74d8: -case 0x74d9: -case 0x74da: -case 0x74db: -case 0x74dc: -case 0x74dd: -case 0x74de: -case 0x74df: -case 0x74e0: -case 0x74e1: -case 0x74e2: -case 0x74e3: -case 0x74e4: -case 0x74e5: -case 0x74e6: -case 0x74e7: -case 0x74e8: -case 0x74e9: -case 0x74ea: -case 0x74eb: -case 0x74ec: -case 0x74ed: -case 0x74ee: -case 0x74ef: -case 0x74f0: -case 0x74f1: -case 0x74f2: -case 0x74f3: -case 0x74f4: -case 0x74f5: -case 0x74f6: -case 0x74f7: -case 0x74f8: -case 0x74f9: -case 0x74fa: -case 0x74fb: -case 0x74fc: -case 0x74fd: -case 0x74fe: -case 0x74ff: -case 0x7600: -case 0x7601: -case 0x7602: -case 0x7603: -case 0x7604: -case 0x7605: -case 0x7606: -case 0x7607: -case 0x7608: -case 0x7609: -case 0x760a: -case 0x760b: -case 0x760c: -case 0x760d: -case 0x760e: -case 0x760f: -case 0x7610: -case 0x7611: -case 0x7612: -case 0x7613: -case 0x7614: -case 0x7615: -case 0x7616: -case 0x7617: -case 0x7618: -case 0x7619: -case 0x761a: -case 0x761b: -case 0x761c: -case 0x761d: -case 0x761e: -case 0x761f: -case 0x7620: -case 0x7621: -case 0x7622: -case 0x7623: -case 0x7624: -case 0x7625: -case 0x7626: -case 0x7627: -case 0x7628: -case 0x7629: -case 0x762a: -case 0x762b: -case 0x762c: -case 0x762d: -case 0x762e: -case 0x762f: -case 0x7630: -case 0x7631: -case 0x7632: -case 0x7633: -case 0x7634: -case 0x7635: -case 0x7636: -case 0x7637: -case 0x7638: -case 0x7639: -case 0x763a: -case 0x763b: -case 0x763c: -case 0x763d: -case 0x763e: -case 0x763f: -case 0x7640: -case 0x7641: -case 0x7642: -case 0x7643: -case 0x7644: -case 0x7645: -case 0x7646: -case 0x7647: -case 0x7648: -case 0x7649: -case 0x764a: -case 0x764b: -case 0x764c: -case 0x764d: -case 0x764e: -case 0x764f: -case 0x7650: -case 0x7651: -case 0x7652: -case 0x7653: -case 0x7654: -case 0x7655: -case 0x7656: -case 0x7657: -case 0x7658: -case 0x7659: -case 0x765a: -case 0x765b: -case 0x765c: -case 0x765d: -case 0x765e: -case 0x765f: -case 0x7660: -case 0x7661: -case 0x7662: -case 0x7663: -case 0x7664: -case 0x7665: -case 0x7666: -case 0x7667: -case 0x7668: -case 0x7669: -case 0x766a: -case 0x766b: -case 0x766c: -case 0x766d: -case 0x766e: -case 0x766f: -case 0x7670: -case 0x7671: -case 0x7672: -case 0x7673: -case 0x7674: -case 0x7675: -case 0x7676: -case 0x7677: -case 0x7678: -case 0x7679: -case 0x767a: -case 0x767b: -case 0x767c: -case 0x767d: -case 0x767e: -case 0x767f: -case 0x7680: -case 0x7681: -case 0x7682: -case 0x7683: -case 0x7684: -case 0x7685: -case 0x7686: -case 0x7687: -case 0x7688: -case 0x7689: -case 0x768a: -case 0x768b: -case 0x768c: -case 0x768d: -case 0x768e: -case 0x768f: -case 0x7690: -case 0x7691: -case 0x7692: -case 0x7693: -case 0x7694: -case 0x7695: -case 0x7696: -case 0x7697: -case 0x7698: -case 0x7699: -case 0x769a: -case 0x769b: -case 0x769c: -case 0x769d: -case 0x769e: -case 0x769f: -case 0x76a0: -case 0x76a1: -case 0x76a2: -case 0x76a3: -case 0x76a4: -case 0x76a5: -case 0x76a6: -case 0x76a7: -case 0x76a8: -case 0x76a9: -case 0x76aa: -case 0x76ab: -case 0x76ac: -case 0x76ad: -case 0x76ae: -case 0x76af: -case 0x76b0: -case 0x76b1: -case 0x76b2: -case 0x76b3: -case 0x76b4: -case 0x76b5: -case 0x76b6: -case 0x76b7: -case 0x76b8: -case 0x76b9: -case 0x76ba: -case 0x76bb: -case 0x76bc: -case 0x76bd: -case 0x76be: -case 0x76bf: -case 0x76c0: -case 0x76c1: -case 0x76c2: -case 0x76c3: -case 0x76c4: -case 0x76c5: -case 0x76c6: -case 0x76c7: -case 0x76c8: -case 0x76c9: -case 0x76ca: -case 0x76cb: -case 0x76cc: -case 0x76cd: -case 0x76ce: -case 0x76cf: -case 0x76d0: -case 0x76d1: -case 0x76d2: -case 0x76d3: -case 0x76d4: -case 0x76d5: -case 0x76d6: -case 0x76d7: -case 0x76d8: -case 0x76d9: -case 0x76da: -case 0x76db: -case 0x76dc: -case 0x76dd: -case 0x76de: -case 0x76df: -case 0x76e0: -case 0x76e1: -case 0x76e2: -case 0x76e3: -case 0x76e4: -case 0x76e5: -case 0x76e6: -case 0x76e7: -case 0x76e8: -case 0x76e9: -case 0x76ea: -case 0x76eb: -case 0x76ec: -case 0x76ed: -case 0x76ee: -case 0x76ef: -case 0x76f0: -case 0x76f1: -case 0x76f2: -case 0x76f3: -case 0x76f4: -case 0x76f5: -case 0x76f6: -case 0x76f7: -case 0x76f8: -case 0x76f9: -case 0x76fa: -case 0x76fb: -case 0x76fc: -case 0x76fd: -case 0x76fe: -case 0x76ff: -case 0x7800: -case 0x7801: -case 0x7802: -case 0x7803: -case 0x7804: -case 0x7805: -case 0x7806: -case 0x7807: -case 0x7808: -case 0x7809: -case 0x780a: -case 0x780b: -case 0x780c: -case 0x780d: -case 0x780e: -case 0x780f: -case 0x7810: -case 0x7811: -case 0x7812: -case 0x7813: -case 0x7814: -case 0x7815: -case 0x7816: -case 0x7817: -case 0x7818: -case 0x7819: -case 0x781a: -case 0x781b: -case 0x781c: -case 0x781d: -case 0x781e: -case 0x781f: -case 0x7820: -case 0x7821: -case 0x7822: -case 0x7823: -case 0x7824: -case 0x7825: -case 0x7826: -case 0x7827: -case 0x7828: -case 0x7829: -case 0x782a: -case 0x782b: -case 0x782c: -case 0x782d: -case 0x782e: -case 0x782f: -case 0x7830: -case 0x7831: -case 0x7832: -case 0x7833: -case 0x7834: -case 0x7835: -case 0x7836: -case 0x7837: -case 0x7838: -case 0x7839: -case 0x783a: -case 0x783b: -case 0x783c: -case 0x783d: -case 0x783e: -case 0x783f: -case 0x7840: -case 0x7841: -case 0x7842: -case 0x7843: -case 0x7844: -case 0x7845: -case 0x7846: -case 0x7847: -case 0x7848: -case 0x7849: -case 0x784a: -case 0x784b: -case 0x784c: -case 0x784d: -case 0x784e: -case 0x784f: -case 0x7850: -case 0x7851: -case 0x7852: -case 0x7853: -case 0x7854: -case 0x7855: -case 0x7856: -case 0x7857: -case 0x7858: -case 0x7859: -case 0x785a: -case 0x785b: -case 0x785c: -case 0x785d: -case 0x785e: -case 0x785f: -case 0x7860: -case 0x7861: -case 0x7862: -case 0x7863: -case 0x7864: -case 0x7865: -case 0x7866: -case 0x7867: -case 0x7868: -case 0x7869: -case 0x786a: -case 0x786b: -case 0x786c: -case 0x786d: -case 0x786e: -case 0x786f: -case 0x7870: -case 0x7871: -case 0x7872: -case 0x7873: -case 0x7874: -case 0x7875: -case 0x7876: -case 0x7877: -case 0x7878: -case 0x7879: -case 0x787a: -case 0x787b: -case 0x787c: -case 0x787d: -case 0x787e: -case 0x787f: -case 0x7880: -case 0x7881: -case 0x7882: -case 0x7883: -case 0x7884: -case 0x7885: -case 0x7886: -case 0x7887: -case 0x7888: -case 0x7889: -case 0x788a: -case 0x788b: -case 0x788c: -case 0x788d: -case 0x788e: -case 0x788f: -case 0x7890: -case 0x7891: -case 0x7892: -case 0x7893: -case 0x7894: -case 0x7895: -case 0x7896: -case 0x7897: -case 0x7898: -case 0x7899: -case 0x789a: -case 0x789b: -case 0x789c: -case 0x789d: -case 0x789e: -case 0x789f: -case 0x78a0: -case 0x78a1: -case 0x78a2: -case 0x78a3: -case 0x78a4: -case 0x78a5: -case 0x78a6: -case 0x78a7: -case 0x78a8: -case 0x78a9: -case 0x78aa: -case 0x78ab: -case 0x78ac: -case 0x78ad: -case 0x78ae: -case 0x78af: -case 0x78b0: -case 0x78b1: -case 0x78b2: -case 0x78b3: -case 0x78b4: -case 0x78b5: -case 0x78b6: -case 0x78b7: -case 0x78b8: -case 0x78b9: -case 0x78ba: -case 0x78bb: -case 0x78bc: -case 0x78bd: -case 0x78be: -case 0x78bf: -case 0x78c0: -case 0x78c1: -case 0x78c2: -case 0x78c3: -case 0x78c4: -case 0x78c5: -case 0x78c6: -case 0x78c7: -case 0x78c8: -case 0x78c9: -case 0x78ca: -case 0x78cb: -case 0x78cc: -case 0x78cd: -case 0x78ce: -case 0x78cf: -case 0x78d0: -case 0x78d1: -case 0x78d2: -case 0x78d3: -case 0x78d4: -case 0x78d5: -case 0x78d6: -case 0x78d7: -case 0x78d8: -case 0x78d9: -case 0x78da: -case 0x78db: -case 0x78dc: -case 0x78dd: -case 0x78de: -case 0x78df: -case 0x78e0: -case 0x78e1: -case 0x78e2: -case 0x78e3: -case 0x78e4: -case 0x78e5: -case 0x78e6: -case 0x78e7: -case 0x78e8: -case 0x78e9: -case 0x78ea: -case 0x78eb: -case 0x78ec: -case 0x78ed: -case 0x78ee: -case 0x78ef: -case 0x78f0: -case 0x78f1: -case 0x78f2: -case 0x78f3: -case 0x78f4: -case 0x78f5: -case 0x78f6: -case 0x78f7: -case 0x78f8: -case 0x78f9: -case 0x78fa: -case 0x78fb: -case 0x78fc: -case 0x78fd: -case 0x78fe: -case 0x78ff: -case 0x7a00: -case 0x7a01: -case 0x7a02: -case 0x7a03: -case 0x7a04: -case 0x7a05: -case 0x7a06: -case 0x7a07: -case 0x7a08: -case 0x7a09: -case 0x7a0a: -case 0x7a0b: -case 0x7a0c: -case 0x7a0d: -case 0x7a0e: -case 0x7a0f: -case 0x7a10: -case 0x7a11: -case 0x7a12: -case 0x7a13: -case 0x7a14: -case 0x7a15: -case 0x7a16: -case 0x7a17: -case 0x7a18: -case 0x7a19: -case 0x7a1a: -case 0x7a1b: -case 0x7a1c: -case 0x7a1d: -case 0x7a1e: -case 0x7a1f: -case 0x7a20: -case 0x7a21: -case 0x7a22: -case 0x7a23: -case 0x7a24: -case 0x7a25: -case 0x7a26: -case 0x7a27: -case 0x7a28: -case 0x7a29: -case 0x7a2a: -case 0x7a2b: -case 0x7a2c: -case 0x7a2d: -case 0x7a2e: -case 0x7a2f: -case 0x7a30: -case 0x7a31: -case 0x7a32: -case 0x7a33: -case 0x7a34: -case 0x7a35: -case 0x7a36: -case 0x7a37: -case 0x7a38: -case 0x7a39: -case 0x7a3a: -case 0x7a3b: -case 0x7a3c: -case 0x7a3d: -case 0x7a3e: -case 0x7a3f: -case 0x7a40: -case 0x7a41: -case 0x7a42: -case 0x7a43: -case 0x7a44: -case 0x7a45: -case 0x7a46: -case 0x7a47: -case 0x7a48: -case 0x7a49: -case 0x7a4a: -case 0x7a4b: -case 0x7a4c: -case 0x7a4d: -case 0x7a4e: -case 0x7a4f: -case 0x7a50: -case 0x7a51: -case 0x7a52: -case 0x7a53: -case 0x7a54: -case 0x7a55: -case 0x7a56: -case 0x7a57: -case 0x7a58: -case 0x7a59: -case 0x7a5a: -case 0x7a5b: -case 0x7a5c: -case 0x7a5d: -case 0x7a5e: -case 0x7a5f: -case 0x7a60: -case 0x7a61: -case 0x7a62: -case 0x7a63: -case 0x7a64: -case 0x7a65: -case 0x7a66: -case 0x7a67: -case 0x7a68: -case 0x7a69: -case 0x7a6a: -case 0x7a6b: -case 0x7a6c: -case 0x7a6d: -case 0x7a6e: -case 0x7a6f: -case 0x7a70: -case 0x7a71: -case 0x7a72: -case 0x7a73: -case 0x7a74: -case 0x7a75: -case 0x7a76: -case 0x7a77: -case 0x7a78: -case 0x7a79: -case 0x7a7a: -case 0x7a7b: -case 0x7a7c: -case 0x7a7d: -case 0x7a7e: -case 0x7a7f: -case 0x7a80: -case 0x7a81: -case 0x7a82: -case 0x7a83: -case 0x7a84: -case 0x7a85: -case 0x7a86: -case 0x7a87: -case 0x7a88: -case 0x7a89: -case 0x7a8a: -case 0x7a8b: -case 0x7a8c: -case 0x7a8d: -case 0x7a8e: -case 0x7a8f: -case 0x7a90: -case 0x7a91: -case 0x7a92: -case 0x7a93: -case 0x7a94: -case 0x7a95: -case 0x7a96: -case 0x7a97: -case 0x7a98: -case 0x7a99: -case 0x7a9a: -case 0x7a9b: -case 0x7a9c: -case 0x7a9d: -case 0x7a9e: -case 0x7a9f: -case 0x7aa0: -case 0x7aa1: -case 0x7aa2: -case 0x7aa3: -case 0x7aa4: -case 0x7aa5: -case 0x7aa6: -case 0x7aa7: -case 0x7aa8: -case 0x7aa9: -case 0x7aaa: -case 0x7aab: -case 0x7aac: -case 0x7aad: -case 0x7aae: -case 0x7aaf: -case 0x7ab0: -case 0x7ab1: -case 0x7ab2: -case 0x7ab3: -case 0x7ab4: -case 0x7ab5: -case 0x7ab6: -case 0x7ab7: -case 0x7ab8: -case 0x7ab9: -case 0x7aba: -case 0x7abb: -case 0x7abc: -case 0x7abd: -case 0x7abe: -case 0x7abf: -case 0x7ac0: -case 0x7ac1: -case 0x7ac2: -case 0x7ac3: -case 0x7ac4: -case 0x7ac5: -case 0x7ac6: -case 0x7ac7: -case 0x7ac8: -case 0x7ac9: -case 0x7aca: -case 0x7acb: -case 0x7acc: -case 0x7acd: -case 0x7ace: -case 0x7acf: -case 0x7ad0: -case 0x7ad1: -case 0x7ad2: -case 0x7ad3: -case 0x7ad4: -case 0x7ad5: -case 0x7ad6: -case 0x7ad7: -case 0x7ad8: -case 0x7ad9: -case 0x7ada: -case 0x7adb: -case 0x7adc: -case 0x7add: -case 0x7ade: -case 0x7adf: -case 0x7ae0: -case 0x7ae1: -case 0x7ae2: -case 0x7ae3: -case 0x7ae4: -case 0x7ae5: -case 0x7ae6: -case 0x7ae7: -case 0x7ae8: -case 0x7ae9: -case 0x7aea: -case 0x7aeb: -case 0x7aec: -case 0x7aed: -case 0x7aee: -case 0x7aef: -case 0x7af0: -case 0x7af1: -case 0x7af2: -case 0x7af3: -case 0x7af4: -case 0x7af5: -case 0x7af6: -case 0x7af7: -case 0x7af8: -case 0x7af9: -case 0x7afa: -case 0x7afb: -case 0x7afc: -case 0x7afd: -case 0x7afe: -case 0x7aff: -case 0x7c00: -case 0x7c01: -case 0x7c02: -case 0x7c03: -case 0x7c04: -case 0x7c05: -case 0x7c06: -case 0x7c07: -case 0x7c08: -case 0x7c09: -case 0x7c0a: -case 0x7c0b: -case 0x7c0c: -case 0x7c0d: -case 0x7c0e: -case 0x7c0f: -case 0x7c10: -case 0x7c11: -case 0x7c12: -case 0x7c13: -case 0x7c14: -case 0x7c15: -case 0x7c16: -case 0x7c17: -case 0x7c18: -case 0x7c19: -case 0x7c1a: -case 0x7c1b: -case 0x7c1c: -case 0x7c1d: -case 0x7c1e: -case 0x7c1f: -case 0x7c20: -case 0x7c21: -case 0x7c22: -case 0x7c23: -case 0x7c24: -case 0x7c25: -case 0x7c26: -case 0x7c27: -case 0x7c28: -case 0x7c29: -case 0x7c2a: -case 0x7c2b: -case 0x7c2c: -case 0x7c2d: -case 0x7c2e: -case 0x7c2f: -case 0x7c30: -case 0x7c31: -case 0x7c32: -case 0x7c33: -case 0x7c34: -case 0x7c35: -case 0x7c36: -case 0x7c37: -case 0x7c38: -case 0x7c39: -case 0x7c3a: -case 0x7c3b: -case 0x7c3c: -case 0x7c3d: -case 0x7c3e: -case 0x7c3f: -case 0x7c40: -case 0x7c41: -case 0x7c42: -case 0x7c43: -case 0x7c44: -case 0x7c45: -case 0x7c46: -case 0x7c47: -case 0x7c48: -case 0x7c49: -case 0x7c4a: -case 0x7c4b: -case 0x7c4c: -case 0x7c4d: -case 0x7c4e: -case 0x7c4f: -case 0x7c50: -case 0x7c51: -case 0x7c52: -case 0x7c53: -case 0x7c54: -case 0x7c55: -case 0x7c56: -case 0x7c57: -case 0x7c58: -case 0x7c59: -case 0x7c5a: -case 0x7c5b: -case 0x7c5c: -case 0x7c5d: -case 0x7c5e: -case 0x7c5f: -case 0x7c60: -case 0x7c61: -case 0x7c62: -case 0x7c63: -case 0x7c64: -case 0x7c65: -case 0x7c66: -case 0x7c67: -case 0x7c68: -case 0x7c69: -case 0x7c6a: -case 0x7c6b: -case 0x7c6c: -case 0x7c6d: -case 0x7c6e: -case 0x7c6f: -case 0x7c70: -case 0x7c71: -case 0x7c72: -case 0x7c73: -case 0x7c74: -case 0x7c75: -case 0x7c76: -case 0x7c77: -case 0x7c78: -case 0x7c79: -case 0x7c7a: -case 0x7c7b: -case 0x7c7c: -case 0x7c7d: -case 0x7c7e: -case 0x7c7f: -case 0x7c80: -case 0x7c81: -case 0x7c82: -case 0x7c83: -case 0x7c84: -case 0x7c85: -case 0x7c86: -case 0x7c87: -case 0x7c88: -case 0x7c89: -case 0x7c8a: -case 0x7c8b: -case 0x7c8c: -case 0x7c8d: -case 0x7c8e: -case 0x7c8f: -case 0x7c90: -case 0x7c91: -case 0x7c92: -case 0x7c93: -case 0x7c94: -case 0x7c95: -case 0x7c96: -case 0x7c97: -case 0x7c98: -case 0x7c99: -case 0x7c9a: -case 0x7c9b: -case 0x7c9c: -case 0x7c9d: -case 0x7c9e: -case 0x7c9f: -case 0x7ca0: -case 0x7ca1: -case 0x7ca2: -case 0x7ca3: -case 0x7ca4: -case 0x7ca5: -case 0x7ca6: -case 0x7ca7: -case 0x7ca8: -case 0x7ca9: -case 0x7caa: -case 0x7cab: -case 0x7cac: -case 0x7cad: -case 0x7cae: -case 0x7caf: -case 0x7cb0: -case 0x7cb1: -case 0x7cb2: -case 0x7cb3: -case 0x7cb4: -case 0x7cb5: -case 0x7cb6: -case 0x7cb7: -case 0x7cb8: -case 0x7cb9: -case 0x7cba: -case 0x7cbb: -case 0x7cbc: -case 0x7cbd: -case 0x7cbe: -case 0x7cbf: -case 0x7cc0: -case 0x7cc1: -case 0x7cc2: -case 0x7cc3: -case 0x7cc4: -case 0x7cc5: -case 0x7cc6: -case 0x7cc7: -case 0x7cc8: -case 0x7cc9: -case 0x7cca: -case 0x7ccb: -case 0x7ccc: -case 0x7ccd: -case 0x7cce: -case 0x7ccf: -case 0x7cd0: -case 0x7cd1: -case 0x7cd2: -case 0x7cd3: -case 0x7cd4: -case 0x7cd5: -case 0x7cd6: -case 0x7cd7: -case 0x7cd8: -case 0x7cd9: -case 0x7cda: -case 0x7cdb: -case 0x7cdc: -case 0x7cdd: -case 0x7cde: -case 0x7cdf: -case 0x7ce0: -case 0x7ce1: -case 0x7ce2: -case 0x7ce3: -case 0x7ce4: -case 0x7ce5: -case 0x7ce6: -case 0x7ce7: -case 0x7ce8: -case 0x7ce9: -case 0x7cea: -case 0x7ceb: -case 0x7cec: -case 0x7ced: -case 0x7cee: -case 0x7cef: -case 0x7cf0: -case 0x7cf1: -case 0x7cf2: -case 0x7cf3: -case 0x7cf4: -case 0x7cf5: -case 0x7cf6: -case 0x7cf7: -case 0x7cf8: -case 0x7cf9: -case 0x7cfa: -case 0x7cfb: -case 0x7cfc: -case 0x7cfd: -case 0x7cfe: -case 0x7cff: -case 0x7e00: -case 0x7e01: -case 0x7e02: -case 0x7e03: -case 0x7e04: -case 0x7e05: -case 0x7e06: -case 0x7e07: -case 0x7e08: -case 0x7e09: -case 0x7e0a: -case 0x7e0b: -case 0x7e0c: -case 0x7e0d: -case 0x7e0e: -case 0x7e0f: -case 0x7e10: -case 0x7e11: -case 0x7e12: -case 0x7e13: -case 0x7e14: -case 0x7e15: -case 0x7e16: -case 0x7e17: -case 0x7e18: -case 0x7e19: -case 0x7e1a: -case 0x7e1b: -case 0x7e1c: -case 0x7e1d: -case 0x7e1e: -case 0x7e1f: -case 0x7e20: -case 0x7e21: -case 0x7e22: -case 0x7e23: -case 0x7e24: -case 0x7e25: -case 0x7e26: -case 0x7e27: -case 0x7e28: -case 0x7e29: -case 0x7e2a: -case 0x7e2b: -case 0x7e2c: -case 0x7e2d: -case 0x7e2e: -case 0x7e2f: -case 0x7e30: -case 0x7e31: -case 0x7e32: -case 0x7e33: -case 0x7e34: -case 0x7e35: -case 0x7e36: -case 0x7e37: -case 0x7e38: -case 0x7e39: -case 0x7e3a: -case 0x7e3b: -case 0x7e3c: -case 0x7e3d: -case 0x7e3e: -case 0x7e3f: -case 0x7e40: -case 0x7e41: -case 0x7e42: -case 0x7e43: -case 0x7e44: -case 0x7e45: -case 0x7e46: -case 0x7e47: -case 0x7e48: -case 0x7e49: -case 0x7e4a: -case 0x7e4b: -case 0x7e4c: -case 0x7e4d: -case 0x7e4e: -case 0x7e4f: -case 0x7e50: -case 0x7e51: -case 0x7e52: -case 0x7e53: -case 0x7e54: -case 0x7e55: -case 0x7e56: -case 0x7e57: -case 0x7e58: -case 0x7e59: -case 0x7e5a: -case 0x7e5b: -case 0x7e5c: -case 0x7e5d: -case 0x7e5e: -case 0x7e5f: -case 0x7e60: -case 0x7e61: -case 0x7e62: -case 0x7e63: -case 0x7e64: -case 0x7e65: -case 0x7e66: -case 0x7e67: -case 0x7e68: -case 0x7e69: -case 0x7e6a: -case 0x7e6b: -case 0x7e6c: -case 0x7e6d: -case 0x7e6e: -case 0x7e6f: -case 0x7e70: -case 0x7e71: -case 0x7e72: -case 0x7e73: -case 0x7e74: -case 0x7e75: -case 0x7e76: -case 0x7e77: -case 0x7e78: -case 0x7e79: -case 0x7e7a: -case 0x7e7b: -case 0x7e7c: -case 0x7e7d: -case 0x7e7e: -case 0x7e7f: -case 0x7e80: -case 0x7e81: -case 0x7e82: -case 0x7e83: -case 0x7e84: -case 0x7e85: -case 0x7e86: -case 0x7e87: -case 0x7e88: -case 0x7e89: -case 0x7e8a: -case 0x7e8b: -case 0x7e8c: -case 0x7e8d: -case 0x7e8e: -case 0x7e8f: -case 0x7e90: -case 0x7e91: -case 0x7e92: -case 0x7e93: -case 0x7e94: -case 0x7e95: -case 0x7e96: -case 0x7e97: -case 0x7e98: -case 0x7e99: -case 0x7e9a: -case 0x7e9b: -case 0x7e9c: -case 0x7e9d: -case 0x7e9e: -case 0x7e9f: -case 0x7ea0: -case 0x7ea1: -case 0x7ea2: -case 0x7ea3: -case 0x7ea4: -case 0x7ea5: -case 0x7ea6: -case 0x7ea7: -case 0x7ea8: -case 0x7ea9: -case 0x7eaa: -case 0x7eab: -case 0x7eac: -case 0x7ead: -case 0x7eae: -case 0x7eaf: -case 0x7eb0: -case 0x7eb1: -case 0x7eb2: -case 0x7eb3: -case 0x7eb4: -case 0x7eb5: -case 0x7eb6: -case 0x7eb7: -case 0x7eb8: -case 0x7eb9: -case 0x7eba: -case 0x7ebb: -case 0x7ebc: -case 0x7ebd: -case 0x7ebe: -case 0x7ebf: -case 0x7ec0: -case 0x7ec1: -case 0x7ec2: -case 0x7ec3: -case 0x7ec4: -case 0x7ec5: -case 0x7ec6: -case 0x7ec7: -case 0x7ec8: -case 0x7ec9: -case 0x7eca: -case 0x7ecb: -case 0x7ecc: -case 0x7ecd: -case 0x7ece: -case 0x7ecf: -case 0x7ed0: -case 0x7ed1: -case 0x7ed2: -case 0x7ed3: -case 0x7ed4: -case 0x7ed5: -case 0x7ed6: -case 0x7ed7: -case 0x7ed8: -case 0x7ed9: -case 0x7eda: -case 0x7edb: -case 0x7edc: -case 0x7edd: -case 0x7ede: -case 0x7edf: -case 0x7ee0: -case 0x7ee1: -case 0x7ee2: -case 0x7ee3: -case 0x7ee4: -case 0x7ee5: -case 0x7ee6: -case 0x7ee7: -case 0x7ee8: -case 0x7ee9: -case 0x7eea: -case 0x7eeb: -case 0x7eec: -case 0x7eed: -case 0x7eee: -case 0x7eef: -case 0x7ef0: -case 0x7ef1: -case 0x7ef2: -case 0x7ef3: -case 0x7ef4: -case 0x7ef5: -case 0x7ef6: -case 0x7ef7: -case 0x7ef8: -case 0x7ef9: -case 0x7efa: -case 0x7efb: -case 0x7efc: -case 0x7efd: -case 0x7efe: -case 0x7eff: - { - HAM src(this, (int8)instr); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x50b9: -case 0x52b9: -case 0x54b9: -case 0x56b9: -case 0x58b9: -case 0x5ab9: -case 0x5cb9: -case 0x5eb9: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); ADD(src, dst); - } - break; - -case 0x51b9: -case 0x53b9: -case 0x55b9: -case 0x57b9: -case 0x59b9: -case 0x5bb9: -case 0x5db9: -case 0x5fb9: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); SUB(src, dst); - } - break; - -case 0x50b8: -case 0x52b8: -case 0x54b8: -case 0x56b8: -case 0x58b8: -case 0x5ab8: -case 0x5cb8: -case 0x5eb8: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); ADD(src, dst); - } - break; - -case 0x51b8: -case 0x53b8: -case 0x55b8: -case 0x57b8: -case 0x59b8: -case 0x5bb8: -case 0x5db8: -case 0x5fb8: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); SUB(src, dst); - } - break; - -case 0x5088: -case 0x5089: -case 0x508a: -case 0x508b: -case 0x508c: -case 0x508d: -case 0x508e: -case 0x508f: -case 0x5288: -case 0x5289: -case 0x528a: -case 0x528b: -case 0x528c: -case 0x528d: -case 0x528e: -case 0x528f: -case 0x5488: -case 0x5489: -case 0x548a: -case 0x548b: -case 0x548c: -case 0x548d: -case 0x548e: -case 0x548f: -case 0x5688: -case 0x5689: -case 0x568a: -case 0x568b: -case 0x568c: -case 0x568d: -case 0x568e: -case 0x568f: -case 0x5888: -case 0x5889: -case 0x588a: -case 0x588b: -case 0x588c: -case 0x588d: -case 0x588e: -case 0x588f: -case 0x5a88: -case 0x5a89: -case 0x5a8a: -case 0x5a8b: -case 0x5a8c: -case 0x5a8d: -case 0x5a8e: -case 0x5a8f: -case 0x5c88: -case 0x5c89: -case 0x5c8a: -case 0x5c8b: -case 0x5c8c: -case 0x5c8d: -case 0x5c8e: -case 0x5c8f: -case 0x5e88: -case 0x5e89: -case 0x5e8a: -case 0x5e8b: -case 0x5e8c: -case 0x5e8d: -case 0x5e8e: -case 0x5e8f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5188: -case 0x5189: -case 0x518a: -case 0x518b: -case 0x518c: -case 0x518d: -case 0x518e: -case 0x518f: -case 0x5388: -case 0x5389: -case 0x538a: -case 0x538b: -case 0x538c: -case 0x538d: -case 0x538e: -case 0x538f: -case 0x5588: -case 0x5589: -case 0x558a: -case 0x558b: -case 0x558c: -case 0x558d: -case 0x558e: -case 0x558f: -case 0x5788: -case 0x5789: -case 0x578a: -case 0x578b: -case 0x578c: -case 0x578d: -case 0x578e: -case 0x578f: -case 0x5988: -case 0x5989: -case 0x598a: -case 0x598b: -case 0x598c: -case 0x598d: -case 0x598e: -case 0x598f: -case 0x5b88: -case 0x5b89: -case 0x5b8a: -case 0x5b8b: -case 0x5b8c: -case 0x5b8d: -case 0x5b8e: -case 0x5b8f: -case 0x5d88: -case 0x5d89: -case 0x5d8a: -case 0x5d8b: -case 0x5d8c: -case 0x5d8d: -case 0x5d8e: -case 0x5d8f: -case 0x5f88: -case 0x5f89: -case 0x5f8a: -case 0x5f8b: -case 0x5f8c: -case 0x5f8d: -case 0x5f8e: -case 0x5f8f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5090: -case 0x5091: -case 0x5092: -case 0x5093: -case 0x5094: -case 0x5095: -case 0x5096: -case 0x5097: -case 0x5290: -case 0x5291: -case 0x5292: -case 0x5293: -case 0x5294: -case 0x5295: -case 0x5296: -case 0x5297: -case 0x5490: -case 0x5491: -case 0x5492: -case 0x5493: -case 0x5494: -case 0x5495: -case 0x5496: -case 0x5497: -case 0x5690: -case 0x5691: -case 0x5692: -case 0x5693: -case 0x5694: -case 0x5695: -case 0x5696: -case 0x5697: -case 0x5890: -case 0x5891: -case 0x5892: -case 0x5893: -case 0x5894: -case 0x5895: -case 0x5896: -case 0x5897: -case 0x5a90: -case 0x5a91: -case 0x5a92: -case 0x5a93: -case 0x5a94: -case 0x5a95: -case 0x5a96: -case 0x5a97: -case 0x5c90: -case 0x5c91: -case 0x5c92: -case 0x5c93: -case 0x5c94: -case 0x5c95: -case 0x5c96: -case 0x5c97: -case 0x5e90: -case 0x5e91: -case 0x5e92: -case 0x5e93: -case 0x5e94: -case 0x5e95: -case 0x5e96: -case 0x5e97: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5190: -case 0x5191: -case 0x5192: -case 0x5193: -case 0x5194: -case 0x5195: -case 0x5196: -case 0x5197: -case 0x5390: -case 0x5391: -case 0x5392: -case 0x5393: -case 0x5394: -case 0x5395: -case 0x5396: -case 0x5397: -case 0x5590: -case 0x5591: -case 0x5592: -case 0x5593: -case 0x5594: -case 0x5595: -case 0x5596: -case 0x5597: -case 0x5790: -case 0x5791: -case 0x5792: -case 0x5793: -case 0x5794: -case 0x5795: -case 0x5796: -case 0x5797: -case 0x5990: -case 0x5991: -case 0x5992: -case 0x5993: -case 0x5994: -case 0x5995: -case 0x5996: -case 0x5997: -case 0x5b90: -case 0x5b91: -case 0x5b92: -case 0x5b93: -case 0x5b94: -case 0x5b95: -case 0x5b96: -case 0x5b97: -case 0x5d90: -case 0x5d91: -case 0x5d92: -case 0x5d93: -case 0x5d94: -case 0x5d95: -case 0x5d96: -case 0x5d97: -case 0x5f90: -case 0x5f91: -case 0x5f92: -case 0x5f93: -case 0x5f94: -case 0x5f95: -case 0x5f96: -case 0x5f97: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x50a8: -case 0x50a9: -case 0x50aa: -case 0x50ab: -case 0x50ac: -case 0x50ad: -case 0x50ae: -case 0x50af: -case 0x52a8: -case 0x52a9: -case 0x52aa: -case 0x52ab: -case 0x52ac: -case 0x52ad: -case 0x52ae: -case 0x52af: -case 0x54a8: -case 0x54a9: -case 0x54aa: -case 0x54ab: -case 0x54ac: -case 0x54ad: -case 0x54ae: -case 0x54af: -case 0x56a8: -case 0x56a9: -case 0x56aa: -case 0x56ab: -case 0x56ac: -case 0x56ad: -case 0x56ae: -case 0x56af: -case 0x58a8: -case 0x58a9: -case 0x58aa: -case 0x58ab: -case 0x58ac: -case 0x58ad: -case 0x58ae: -case 0x58af: -case 0x5aa8: -case 0x5aa9: -case 0x5aaa: -case 0x5aab: -case 0x5aac: -case 0x5aad: -case 0x5aae: -case 0x5aaf: -case 0x5ca8: -case 0x5ca9: -case 0x5caa: -case 0x5cab: -case 0x5cac: -case 0x5cad: -case 0x5cae: -case 0x5caf: -case 0x5ea8: -case 0x5ea9: -case 0x5eaa: -case 0x5eab: -case 0x5eac: -case 0x5ead: -case 0x5eae: -case 0x5eaf: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x51a8: -case 0x51a9: -case 0x51aa: -case 0x51ab: -case 0x51ac: -case 0x51ad: -case 0x51ae: -case 0x51af: -case 0x53a8: -case 0x53a9: -case 0x53aa: -case 0x53ab: -case 0x53ac: -case 0x53ad: -case 0x53ae: -case 0x53af: -case 0x55a8: -case 0x55a9: -case 0x55aa: -case 0x55ab: -case 0x55ac: -case 0x55ad: -case 0x55ae: -case 0x55af: -case 0x57a8: -case 0x57a9: -case 0x57aa: -case 0x57ab: -case 0x57ac: -case 0x57ad: -case 0x57ae: -case 0x57af: -case 0x59a8: -case 0x59a9: -case 0x59aa: -case 0x59ab: -case 0x59ac: -case 0x59ad: -case 0x59ae: -case 0x59af: -case 0x5ba8: -case 0x5ba9: -case 0x5baa: -case 0x5bab: -case 0x5bac: -case 0x5bad: -case 0x5bae: -case 0x5baf: -case 0x5da8: -case 0x5da9: -case 0x5daa: -case 0x5dab: -case 0x5dac: -case 0x5dad: -case 0x5dae: -case 0x5daf: -case 0x5fa8: -case 0x5fa9: -case 0x5faa: -case 0x5fab: -case 0x5fac: -case 0x5fad: -case 0x5fae: -case 0x5faf: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x50b0: -case 0x50b1: -case 0x50b2: -case 0x50b3: -case 0x50b4: -case 0x50b5: -case 0x50b6: -case 0x50b7: -case 0x52b0: -case 0x52b1: -case 0x52b2: -case 0x52b3: -case 0x52b4: -case 0x52b5: -case 0x52b6: -case 0x52b7: -case 0x54b0: -case 0x54b1: -case 0x54b2: -case 0x54b3: -case 0x54b4: -case 0x54b5: -case 0x54b6: -case 0x54b7: -case 0x56b0: -case 0x56b1: -case 0x56b2: -case 0x56b3: -case 0x56b4: -case 0x56b5: -case 0x56b6: -case 0x56b7: -case 0x58b0: -case 0x58b1: -case 0x58b2: -case 0x58b3: -case 0x58b4: -case 0x58b5: -case 0x58b6: -case 0x58b7: -case 0x5ab0: -case 0x5ab1: -case 0x5ab2: -case 0x5ab3: -case 0x5ab4: -case 0x5ab5: -case 0x5ab6: -case 0x5ab7: -case 0x5cb0: -case 0x5cb1: -case 0x5cb2: -case 0x5cb3: -case 0x5cb4: -case 0x5cb5: -case 0x5cb6: -case 0x5cb7: -case 0x5eb0: -case 0x5eb1: -case 0x5eb2: -case 0x5eb3: -case 0x5eb4: -case 0x5eb5: -case 0x5eb6: -case 0x5eb7: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x51b0: -case 0x51b1: -case 0x51b2: -case 0x51b3: -case 0x51b4: -case 0x51b5: -case 0x51b6: -case 0x51b7: -case 0x53b0: -case 0x53b1: -case 0x53b2: -case 0x53b3: -case 0x53b4: -case 0x53b5: -case 0x53b6: -case 0x53b7: -case 0x55b0: -case 0x55b1: -case 0x55b2: -case 0x55b3: -case 0x55b4: -case 0x55b5: -case 0x55b6: -case 0x55b7: -case 0x57b0: -case 0x57b1: -case 0x57b2: -case 0x57b3: -case 0x57b4: -case 0x57b5: -case 0x57b6: -case 0x57b7: -case 0x59b0: -case 0x59b1: -case 0x59b2: -case 0x59b3: -case 0x59b4: -case 0x59b5: -case 0x59b6: -case 0x59b7: -case 0x5bb0: -case 0x5bb1: -case 0x5bb2: -case 0x5bb3: -case 0x5bb4: -case 0x5bb5: -case 0x5bb6: -case 0x5bb7: -case 0x5db0: -case 0x5db1: -case 0x5db2: -case 0x5db3: -case 0x5db4: -case 0x5db5: -case 0x5db6: -case 0x5db7: -case 0x5fb0: -case 0x5fb1: -case 0x5fb2: -case 0x5fb3: -case 0x5fb4: -case 0x5fb5: -case 0x5fb6: -case 0x5fb7: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5098: -case 0x5099: -case 0x509a: -case 0x509b: -case 0x509c: -case 0x509d: -case 0x509e: -case 0x509f: -case 0x5298: -case 0x5299: -case 0x529a: -case 0x529b: -case 0x529c: -case 0x529d: -case 0x529e: -case 0x529f: -case 0x5498: -case 0x5499: -case 0x549a: -case 0x549b: -case 0x549c: -case 0x549d: -case 0x549e: -case 0x549f: -case 0x5698: -case 0x5699: -case 0x569a: -case 0x569b: -case 0x569c: -case 0x569d: -case 0x569e: -case 0x569f: -case 0x5898: -case 0x5899: -case 0x589a: -case 0x589b: -case 0x589c: -case 0x589d: -case 0x589e: -case 0x589f: -case 0x5a98: -case 0x5a99: -case 0x5a9a: -case 0x5a9b: -case 0x5a9c: -case 0x5a9d: -case 0x5a9e: -case 0x5a9f: -case 0x5c98: -case 0x5c99: -case 0x5c9a: -case 0x5c9b: -case 0x5c9c: -case 0x5c9d: -case 0x5c9e: -case 0x5c9f: -case 0x5e98: -case 0x5e99: -case 0x5e9a: -case 0x5e9b: -case 0x5e9c: -case 0x5e9d: -case 0x5e9e: -case 0x5e9f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5198: -case 0x5199: -case 0x519a: -case 0x519b: -case 0x519c: -case 0x519d: -case 0x519e: -case 0x519f: -case 0x5398: -case 0x5399: -case 0x539a: -case 0x539b: -case 0x539c: -case 0x539d: -case 0x539e: -case 0x539f: -case 0x5598: -case 0x5599: -case 0x559a: -case 0x559b: -case 0x559c: -case 0x559d: -case 0x559e: -case 0x559f: -case 0x5798: -case 0x5799: -case 0x579a: -case 0x579b: -case 0x579c: -case 0x579d: -case 0x579e: -case 0x579f: -case 0x5998: -case 0x5999: -case 0x599a: -case 0x599b: -case 0x599c: -case 0x599d: -case 0x599e: -case 0x599f: -case 0x5b98: -case 0x5b99: -case 0x5b9a: -case 0x5b9b: -case 0x5b9c: -case 0x5b9d: -case 0x5b9e: -case 0x5b9f: -case 0x5d98: -case 0x5d99: -case 0x5d9a: -case 0x5d9b: -case 0x5d9c: -case 0x5d9d: -case 0x5d9e: -case 0x5d9f: -case 0x5f98: -case 0x5f99: -case 0x5f9a: -case 0x5f9b: -case 0x5f9c: -case 0x5f9d: -case 0x5f9e: -case 0x5f9f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x50a0: -case 0x50a1: -case 0x50a2: -case 0x50a3: -case 0x50a4: -case 0x50a5: -case 0x50a6: -case 0x50a7: -case 0x52a0: -case 0x52a1: -case 0x52a2: -case 0x52a3: -case 0x52a4: -case 0x52a5: -case 0x52a6: -case 0x52a7: -case 0x54a0: -case 0x54a1: -case 0x54a2: -case 0x54a3: -case 0x54a4: -case 0x54a5: -case 0x54a6: -case 0x54a7: -case 0x56a0: -case 0x56a1: -case 0x56a2: -case 0x56a3: -case 0x56a4: -case 0x56a5: -case 0x56a6: -case 0x56a7: -case 0x58a0: -case 0x58a1: -case 0x58a2: -case 0x58a3: -case 0x58a4: -case 0x58a5: -case 0x58a6: -case 0x58a7: -case 0x5aa0: -case 0x5aa1: -case 0x5aa2: -case 0x5aa3: -case 0x5aa4: -case 0x5aa5: -case 0x5aa6: -case 0x5aa7: -case 0x5ca0: -case 0x5ca1: -case 0x5ca2: -case 0x5ca3: -case 0x5ca4: -case 0x5ca5: -case 0x5ca6: -case 0x5ca7: -case 0x5ea0: -case 0x5ea1: -case 0x5ea2: -case 0x5ea3: -case 0x5ea4: -case 0x5ea5: -case 0x5ea6: -case 0x5ea7: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x51a0: -case 0x51a1: -case 0x51a2: -case 0x51a3: -case 0x51a4: -case 0x51a5: -case 0x51a6: -case 0x51a7: -case 0x53a0: -case 0x53a1: -case 0x53a2: -case 0x53a3: -case 0x53a4: -case 0x53a5: -case 0x53a6: -case 0x53a7: -case 0x55a0: -case 0x55a1: -case 0x55a2: -case 0x55a3: -case 0x55a4: -case 0x55a5: -case 0x55a6: -case 0x55a7: -case 0x57a0: -case 0x57a1: -case 0x57a2: -case 0x57a3: -case 0x57a4: -case 0x57a5: -case 0x57a6: -case 0x57a7: -case 0x59a0: -case 0x59a1: -case 0x59a2: -case 0x59a3: -case 0x59a4: -case 0x59a5: -case 0x59a6: -case 0x59a7: -case 0x5ba0: -case 0x5ba1: -case 0x5ba2: -case 0x5ba3: -case 0x5ba4: -case 0x5ba5: -case 0x5ba6: -case 0x5ba7: -case 0x5da0: -case 0x5da1: -case 0x5da2: -case 0x5da3: -case 0x5da4: -case 0x5da5: -case 0x5da6: -case 0x5da7: -case 0x5fa0: -case 0x5fa1: -case 0x5fa2: -case 0x5fa3: -case 0x5fa4: -case 0x5fa5: -case 0x5fa6: -case 0x5fa7: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5080: -case 0x5081: -case 0x5082: -case 0x5083: -case 0x5084: -case 0x5085: -case 0x5086: -case 0x5087: -case 0x5280: -case 0x5281: -case 0x5282: -case 0x5283: -case 0x5284: -case 0x5285: -case 0x5286: -case 0x5287: -case 0x5480: -case 0x5481: -case 0x5482: -case 0x5483: -case 0x5484: -case 0x5485: -case 0x5486: -case 0x5487: -case 0x5680: -case 0x5681: -case 0x5682: -case 0x5683: -case 0x5684: -case 0x5685: -case 0x5686: -case 0x5687: -case 0x5880: -case 0x5881: -case 0x5882: -case 0x5883: -case 0x5884: -case 0x5885: -case 0x5886: -case 0x5887: -case 0x5a80: -case 0x5a81: -case 0x5a82: -case 0x5a83: -case 0x5a84: -case 0x5a85: -case 0x5a86: -case 0x5a87: -case 0x5c80: -case 0x5c81: -case 0x5c82: -case 0x5c83: -case 0x5c84: -case 0x5c85: -case 0x5c86: -case 0x5c87: -case 0x5e80: -case 0x5e81: -case 0x5e82: -case 0x5e83: -case 0x5e84: -case 0x5e85: -case 0x5e86: -case 0x5e87: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5180: -case 0x5181: -case 0x5182: -case 0x5183: -case 0x5184: -case 0x5185: -case 0x5186: -case 0x5187: -case 0x5380: -case 0x5381: -case 0x5382: -case 0x5383: -case 0x5384: -case 0x5385: -case 0x5386: -case 0x5387: -case 0x5580: -case 0x5581: -case 0x5582: -case 0x5583: -case 0x5584: -case 0x5585: -case 0x5586: -case 0x5587: -case 0x5780: -case 0x5781: -case 0x5782: -case 0x5783: -case 0x5784: -case 0x5785: -case 0x5786: -case 0x5787: -case 0x5980: -case 0x5981: -case 0x5982: -case 0x5983: -case 0x5984: -case 0x5985: -case 0x5986: -case 0x5987: -case 0x5b80: -case 0x5b81: -case 0x5b82: -case 0x5b83: -case 0x5b84: -case 0x5b85: -case 0x5b86: -case 0x5b87: -case 0x5d80: -case 0x5d81: -case 0x5d82: -case 0x5d83: -case 0x5d84: -case 0x5d85: -case 0x5d86: -case 0x5d87: -case 0x5f80: -case 0x5f81: -case 0x5f82: -case 0x5f83: -case 0x5f84: -case 0x5f85: -case 0x5f86: -case 0x5f87: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x23fa: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21fa: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1fa: -case 0xd3fa: -case 0xd5fa: -case 0xd7fa: -case 0xd9fa: -case 0xdbfa: -case 0xddfa: -case 0xdffa: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1fa: -case 0xb3fa: -case 0xb5fa: -case 0xb7fa: -case 0xb9fa: -case 0xbbfa: -case 0xbdfa: -case 0xbffa: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91fa: -case 0x93fa: -case 0x95fa: -case 0x97fa: -case 0x99fa: -case 0x9bfa: -case 0x9dfa: -case 0x9ffa: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x20ba: -case 0x22ba: -case 0x24ba: -case 0x26ba: -case 0x28ba: -case 0x2aba: -case 0x2cba: -case 0x2eba: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x217a: -case 0x237a: -case 0x257a: -case 0x277a: -case 0x297a: -case 0x2b7a: -case 0x2d7a: -case 0x2f7a: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x21ba: -case 0x23ba: -case 0x25ba: -case 0x27ba: -case 0x29ba: -case 0x2bba: -case 0x2dba: -case 0x2fba: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20fa: -case 0x22fa: -case 0x24fa: -case 0x26fa: -case 0x28fa: -case 0x2afa: -case 0x2cfa: -case 0x2efa: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x213a: -case 0x233a: -case 0x253a: -case 0x273a: -case 0x293a: -case 0x2b3a: -case 0x2d3a: -case 0x2f3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd0ba: -case 0xd2ba: -case 0xd4ba: -case 0xd6ba: -case 0xd8ba: -case 0xdaba: -case 0xdcba: -case 0xdeba: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc0ba: -case 0xc2ba: -case 0xc4ba: -case 0xc6ba: -case 0xc8ba: -case 0xcaba: -case 0xccba: -case 0xceba: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb0ba: -case 0xb2ba: -case 0xb4ba: -case 0xb6ba: -case 0xb8ba: -case 0xbaba: -case 0xbcba: -case 0xbeba: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x203a: -case 0x223a: -case 0x243a: -case 0x263a: -case 0x283a: -case 0x2a3a: -case 0x2c3a: -case 0x2e3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x80ba: -case 0x82ba: -case 0x84ba: -case 0x86ba: -case 0x88ba: -case 0x8aba: -case 0x8cba: -case 0x8eba: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x90ba: -case 0x92ba: -case 0x94ba: -case 0x96ba: -case 0x98ba: -case 0x9aba: -case 0x9cba: -case 0x9eba: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x207a: -case 0x227a: -case 0x247a: -case 0x267a: -case 0x287a: -case 0x2a7a: -case 0x2c7a: -case 0x2e7a: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x23fb: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x21fb: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0xd1fb: -case 0xd3fb: -case 0xd5fb: -case 0xd7fb: -case 0xd9fb: -case 0xdbfb: -case 0xddfb: -case 0xdffb: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xb1fb: -case 0xb3fb: -case 0xb5fb: -case 0xb7fb: -case 0xb9fb: -case 0xbbfb: -case 0xbdfb: -case 0xbffb: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x91fb: -case 0x93fb: -case 0x95fb: -case 0x97fb: -case 0x99fb: -case 0x9bfb: -case 0x9dfb: -case 0x9ffb: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x20bb: -case 0x22bb: -case 0x24bb: -case 0x26bb: -case 0x28bb: -case 0x2abb: -case 0x2cbb: -case 0x2ebb: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x217b: -case 0x237b: -case 0x257b: -case 0x277b: -case 0x297b: -case 0x2b7b: -case 0x2d7b: -case 0x2f7b: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x21bb: -case 0x23bb: -case 0x25bb: -case 0x27bb: -case 0x29bb: -case 0x2bbb: -case 0x2dbb: -case 0x2fbb: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x20fb: -case 0x22fb: -case 0x24fb: -case 0x26fb: -case 0x28fb: -case 0x2afb: -case 0x2cfb: -case 0x2efb: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x213b: -case 0x233b: -case 0x253b: -case 0x273b: -case 0x293b: -case 0x2b3b: -case 0x2d3b: -case 0x2f3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd0bb: -case 0xd2bb: -case 0xd4bb: -case 0xd6bb: -case 0xd8bb: -case 0xdabb: -case 0xdcbb: -case 0xdebb: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc0bb: -case 0xc2bb: -case 0xc4bb: -case 0xc6bb: -case 0xc8bb: -case 0xcabb: -case 0xccbb: -case 0xcebb: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb0bb: -case 0xb2bb: -case 0xb4bb: -case 0xb6bb: -case 0xb8bb: -case 0xbabb: -case 0xbcbb: -case 0xbebb: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x203b: -case 0x223b: -case 0x243b: -case 0x263b: -case 0x283b: -case 0x2a3b: -case 0x2c3b: -case 0x2e3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x80bb: -case 0x82bb: -case 0x84bb: -case 0x86bb: -case 0x88bb: -case 0x8abb: -case 0x8cbb: -case 0x8ebb: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x90bb: -case 0x92bb: -case 0x94bb: -case 0x96bb: -case 0x98bb: -case 0x9abb: -case 0x9cbb: -case 0x9ebb: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x207b: -case 0x227b: -case 0x247b: -case 0x267b: -case 0x287b: -case 0x2a7b: -case 0x2c7b: -case 0x2e7b: - { - HAM src(this); MOVEA(src, instr_b11_b9); - } - break; - -case 0x4239: - { - HAM dst(this); CLR(dst); - } - break; - -case 0x4839: - { - HAM dst(this); NBCD(dst); - } - break; - -case 0x4439: - { - HAM dst(this); NEG(dst); - } - break; - -case 0x4039: - { - HAM dst(this); NEGX(dst); - } - break; - -case 0x4639: - { - HAM dst(this); NOT(dst); - } - break; - -case 0x50f9: - { - HAM dst(this); Scc<0x00>(dst); - } - break; - -case 0x51f9: - { - HAM dst(this); Scc<0x01>(dst); - } - break; - -case 0x52f9: - { - HAM dst(this); Scc<0x02>(dst); - } - break; - -case 0x53f9: - { - HAM dst(this); Scc<0x03>(dst); - } - break; - -case 0x54f9: - { - HAM dst(this); Scc<0x04>(dst); - } - break; - -case 0x55f9: - { - HAM dst(this); Scc<0x05>(dst); - } - break; - -case 0x56f9: - { - HAM dst(this); Scc<0x06>(dst); - } - break; - -case 0x57f9: - { - HAM dst(this); Scc<0x07>(dst); - } - break; - -case 0x58f9: - { - HAM dst(this); Scc<0x08>(dst); - } - break; - -case 0x59f9: - { - HAM dst(this); Scc<0x09>(dst); - } - break; - -case 0x5af9: - { - HAM dst(this); Scc<0x0a>(dst); - } - break; - -case 0x5bf9: - { - HAM dst(this); Scc<0x0b>(dst); - } - break; - -case 0x5cf9: - { - HAM dst(this); Scc<0x0c>(dst); - } - break; - -case 0x5df9: - { - HAM dst(this); Scc<0x0d>(dst); - } - break; - -case 0x5ef9: - { - HAM dst(this); Scc<0x0e>(dst); - } - break; - -case 0x5ff9: - { - HAM dst(this); Scc<0x0f>(dst); - } - break; - -case 0x4af9: - { - HAM dst(this); TAS(dst); - } - break; - -case 0x4a39: - { - HAM dst(this); TST(dst); - } - break; - -case 0x13f9: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11f9: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x10b9: -case 0x12b9: -case 0x14b9: -case 0x16b9: -case 0x18b9: -case 0x1ab9: -case 0x1cb9: -case 0x1eb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1179: -case 0x1379: -case 0x1579: -case 0x1779: -case 0x1979: -case 0x1b79: -case 0x1d79: -case 0x1f79: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x11b9: -case 0x13b9: -case 0x15b9: -case 0x17b9: -case 0x19b9: -case 0x1bb9: -case 0x1db9: -case 0x1fb9: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x10f9: -case 0x12f9: -case 0x14f9: -case 0x16f9: -case 0x18f9: -case 0x1af9: -case 0x1cf9: -case 0x1ef9: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1139: -case 0x1339: -case 0x1539: -case 0x1739: -case 0x1939: -case 0x1b39: -case 0x1d39: -case 0x1f39: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd039: -case 0xd239: -case 0xd439: -case 0xd639: -case 0xd839: -case 0xda39: -case 0xdc39: -case 0xde39: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc039: -case 0xc239: -case 0xc439: -case 0xc639: -case 0xc839: -case 0xca39: -case 0xcc39: -case 0xce39: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb039: -case 0xb239: -case 0xb439: -case 0xb639: -case 0xb839: -case 0xba39: -case 0xbc39: -case 0xbe39: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x1039: -case 0x1239: -case 0x1439: -case 0x1639: -case 0x1839: -case 0x1a39: -case 0x1c39: -case 0x1e39: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8039: -case 0x8239: -case 0x8439: -case 0x8639: -case 0x8839: -case 0x8a39: -case 0x8c39: -case 0x8e39: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9039: -case 0x9239: -case 0x9439: -case 0x9639: -case 0x9839: -case 0x9a39: -case 0x9c39: -case 0x9e39: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0179: -case 0x0379: -case 0x0579: -case 0x0779: -case 0x0979: -case 0x0b79: -case 0x0d79: -case 0x0f79: - { - HAM targ(this); BCHG(targ, D[instr_b11_b9]); - } - break; - -case 0x01b9: -case 0x03b9: -case 0x05b9: -case 0x07b9: -case 0x09b9: -case 0x0bb9: -case 0x0db9: -case 0x0fb9: - { - HAM targ(this); BCLR(targ, D[instr_b11_b9]); - } - break; - -case 0x01f9: -case 0x03f9: -case 0x05f9: -case 0x07f9: -case 0x09f9: -case 0x0bf9: -case 0x0df9: -case 0x0ff9: - { - HAM targ(this); BSET(targ, D[instr_b11_b9]); - } - break; - -case 0x0139: -case 0x0339: -case 0x0539: -case 0x0739: -case 0x0939: -case 0x0b39: -case 0x0d39: -case 0x0f39: - { - HAM targ(this); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0x4238: - { - HAM dst(this); CLR(dst); - } - break; - -case 0x4838: - { - HAM dst(this); NBCD(dst); - } - break; - -case 0x4438: - { - HAM dst(this); NEG(dst); - } - break; - -case 0x4038: - { - HAM dst(this); NEGX(dst); - } - break; - -case 0x4638: - { - HAM dst(this); NOT(dst); - } - break; - -case 0x50f8: - { - HAM dst(this); Scc<0x00>(dst); - } - break; - -case 0x51f8: - { - HAM dst(this); Scc<0x01>(dst); - } - break; - -case 0x52f8: - { - HAM dst(this); Scc<0x02>(dst); - } - break; - -case 0x53f8: - { - HAM dst(this); Scc<0x03>(dst); - } - break; - -case 0x54f8: - { - HAM dst(this); Scc<0x04>(dst); - } - break; - -case 0x55f8: - { - HAM dst(this); Scc<0x05>(dst); - } - break; - -case 0x56f8: - { - HAM dst(this); Scc<0x06>(dst); - } - break; - -case 0x57f8: - { - HAM dst(this); Scc<0x07>(dst); - } - break; - -case 0x58f8: - { - HAM dst(this); Scc<0x08>(dst); - } - break; - -case 0x59f8: - { - HAM dst(this); Scc<0x09>(dst); - } - break; - -case 0x5af8: - { - HAM dst(this); Scc<0x0a>(dst); - } - break; - -case 0x5bf8: - { - HAM dst(this); Scc<0x0b>(dst); - } - break; - -case 0x5cf8: - { - HAM dst(this); Scc<0x0c>(dst); - } - break; - -case 0x5df8: - { - HAM dst(this); Scc<0x0d>(dst); - } - break; - -case 0x5ef8: - { - HAM dst(this); Scc<0x0e>(dst); - } - break; - -case 0x5ff8: - { - HAM dst(this); Scc<0x0f>(dst); - } - break; - -case 0x4af8: - { - HAM dst(this); TAS(dst); - } - break; - -case 0x4a38: - { - HAM dst(this); TST(dst); - } - break; - -case 0x13f8: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11f8: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x10b8: -case 0x12b8: -case 0x14b8: -case 0x16b8: -case 0x18b8: -case 0x1ab8: -case 0x1cb8: -case 0x1eb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1178: -case 0x1378: -case 0x1578: -case 0x1778: -case 0x1978: -case 0x1b78: -case 0x1d78: -case 0x1f78: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x11b8: -case 0x13b8: -case 0x15b8: -case 0x17b8: -case 0x19b8: -case 0x1bb8: -case 0x1db8: -case 0x1fb8: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x10f8: -case 0x12f8: -case 0x14f8: -case 0x16f8: -case 0x18f8: -case 0x1af8: -case 0x1cf8: -case 0x1ef8: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1138: -case 0x1338: -case 0x1538: -case 0x1738: -case 0x1938: -case 0x1b38: -case 0x1d38: -case 0x1f38: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd038: -case 0xd238: -case 0xd438: -case 0xd638: -case 0xd838: -case 0xda38: -case 0xdc38: -case 0xde38: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc038: -case 0xc238: -case 0xc438: -case 0xc638: -case 0xc838: -case 0xca38: -case 0xcc38: -case 0xce38: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb038: -case 0xb238: -case 0xb438: -case 0xb638: -case 0xb838: -case 0xba38: -case 0xbc38: -case 0xbe38: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x1038: -case 0x1238: -case 0x1438: -case 0x1638: -case 0x1838: -case 0x1a38: -case 0x1c38: -case 0x1e38: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8038: -case 0x8238: -case 0x8438: -case 0x8638: -case 0x8838: -case 0x8a38: -case 0x8c38: -case 0x8e38: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9038: -case 0x9238: -case 0x9438: -case 0x9638: -case 0x9838: -case 0x9a38: -case 0x9c38: -case 0x9e38: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0178: -case 0x0378: -case 0x0578: -case 0x0778: -case 0x0978: -case 0x0b78: -case 0x0d78: -case 0x0f78: - { - HAM targ(this); BCHG(targ, D[instr_b11_b9]); - } - break; - -case 0x01b8: -case 0x03b8: -case 0x05b8: -case 0x07b8: -case 0x09b8: -case 0x0bb8: -case 0x0db8: -case 0x0fb8: - { - HAM targ(this); BCLR(targ, D[instr_b11_b9]); - } - break; - -case 0x01f8: -case 0x03f8: -case 0x05f8: -case 0x07f8: -case 0x09f8: -case 0x0bf8: -case 0x0df8: -case 0x0ff8: - { - HAM targ(this); BSET(targ, D[instr_b11_b9]); - } - break; - -case 0x0138: -case 0x0338: -case 0x0538: -case 0x0738: -case 0x0938: -case 0x0b38: -case 0x0d38: -case 0x0f38: - { - HAM targ(this); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0x4210: -case 0x4211: -case 0x4212: -case 0x4213: -case 0x4214: -case 0x4215: -case 0x4216: -case 0x4217: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4810: -case 0x4811: -case 0x4812: -case 0x4813: -case 0x4814: -case 0x4815: -case 0x4816: -case 0x4817: - { - HAM dst(this, instr_b2_b0); NBCD(dst); - } - break; - -case 0x4410: -case 0x4411: -case 0x4412: -case 0x4413: -case 0x4414: -case 0x4415: -case 0x4416: -case 0x4417: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4010: -case 0x4011: -case 0x4012: -case 0x4013: -case 0x4014: -case 0x4015: -case 0x4016: -case 0x4017: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4610: -case 0x4611: -case 0x4612: -case 0x4613: -case 0x4614: -case 0x4615: -case 0x4616: -case 0x4617: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x50d0: -case 0x50d1: -case 0x50d2: -case 0x50d3: -case 0x50d4: -case 0x50d5: -case 0x50d6: -case 0x50d7: - { - HAM dst(this, instr_b2_b0); Scc<0x00>(dst); - } - break; - -case 0x51d0: -case 0x51d1: -case 0x51d2: -case 0x51d3: -case 0x51d4: -case 0x51d5: -case 0x51d6: -case 0x51d7: - { - HAM dst(this, instr_b2_b0); Scc<0x01>(dst); - } - break; - -case 0x52d0: -case 0x52d1: -case 0x52d2: -case 0x52d3: -case 0x52d4: -case 0x52d5: -case 0x52d6: -case 0x52d7: - { - HAM dst(this, instr_b2_b0); Scc<0x02>(dst); - } - break; - -case 0x53d0: -case 0x53d1: -case 0x53d2: -case 0x53d3: -case 0x53d4: -case 0x53d5: -case 0x53d6: -case 0x53d7: - { - HAM dst(this, instr_b2_b0); Scc<0x03>(dst); - } - break; - -case 0x54d0: -case 0x54d1: -case 0x54d2: -case 0x54d3: -case 0x54d4: -case 0x54d5: -case 0x54d6: -case 0x54d7: - { - HAM dst(this, instr_b2_b0); Scc<0x04>(dst); - } - break; - -case 0x55d0: -case 0x55d1: -case 0x55d2: -case 0x55d3: -case 0x55d4: -case 0x55d5: -case 0x55d6: -case 0x55d7: - { - HAM dst(this, instr_b2_b0); Scc<0x05>(dst); - } - break; - -case 0x56d0: -case 0x56d1: -case 0x56d2: -case 0x56d3: -case 0x56d4: -case 0x56d5: -case 0x56d6: -case 0x56d7: - { - HAM dst(this, instr_b2_b0); Scc<0x06>(dst); - } - break; - -case 0x57d0: -case 0x57d1: -case 0x57d2: -case 0x57d3: -case 0x57d4: -case 0x57d5: -case 0x57d6: -case 0x57d7: - { - HAM dst(this, instr_b2_b0); Scc<0x07>(dst); - } - break; - -case 0x58d0: -case 0x58d1: -case 0x58d2: -case 0x58d3: -case 0x58d4: -case 0x58d5: -case 0x58d6: -case 0x58d7: - { - HAM dst(this, instr_b2_b0); Scc<0x08>(dst); - } - break; - -case 0x59d0: -case 0x59d1: -case 0x59d2: -case 0x59d3: -case 0x59d4: -case 0x59d5: -case 0x59d6: -case 0x59d7: - { - HAM dst(this, instr_b2_b0); Scc<0x09>(dst); - } - break; - -case 0x5ad0: -case 0x5ad1: -case 0x5ad2: -case 0x5ad3: -case 0x5ad4: -case 0x5ad5: -case 0x5ad6: -case 0x5ad7: - { - HAM dst(this, instr_b2_b0); Scc<0x0a>(dst); - } - break; - -case 0x5bd0: -case 0x5bd1: -case 0x5bd2: -case 0x5bd3: -case 0x5bd4: -case 0x5bd5: -case 0x5bd6: -case 0x5bd7: - { - HAM dst(this, instr_b2_b0); Scc<0x0b>(dst); - } - break; - -case 0x5cd0: -case 0x5cd1: -case 0x5cd2: -case 0x5cd3: -case 0x5cd4: -case 0x5cd5: -case 0x5cd6: -case 0x5cd7: - { - HAM dst(this, instr_b2_b0); Scc<0x0c>(dst); - } - break; - -case 0x5dd0: -case 0x5dd1: -case 0x5dd2: -case 0x5dd3: -case 0x5dd4: -case 0x5dd5: -case 0x5dd6: -case 0x5dd7: - { - HAM dst(this, instr_b2_b0); Scc<0x0d>(dst); - } - break; - -case 0x5ed0: -case 0x5ed1: -case 0x5ed2: -case 0x5ed3: -case 0x5ed4: -case 0x5ed5: -case 0x5ed6: -case 0x5ed7: - { - HAM dst(this, instr_b2_b0); Scc<0x0e>(dst); - } - break; - -case 0x5fd0: -case 0x5fd1: -case 0x5fd2: -case 0x5fd3: -case 0x5fd4: -case 0x5fd5: -case 0x5fd6: -case 0x5fd7: - { - HAM dst(this, instr_b2_b0); Scc<0x0f>(dst); - } - break; - -case 0x4ad0: -case 0x4ad1: -case 0x4ad2: -case 0x4ad3: -case 0x4ad4: -case 0x4ad5: -case 0x4ad6: -case 0x4ad7: - { - HAM dst(this, instr_b2_b0); TAS(dst); - } - break; - -case 0x4a10: -case 0x4a11: -case 0x4a12: -case 0x4a13: -case 0x4a14: -case 0x4a15: -case 0x4a16: -case 0x4a17: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x13d0: -case 0x13d1: -case 0x13d2: -case 0x13d3: -case 0x13d4: -case 0x13d5: -case 0x13d6: -case 0x13d7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11d0: -case 0x11d1: -case 0x11d2: -case 0x11d3: -case 0x11d4: -case 0x11d5: -case 0x11d6: -case 0x11d7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x1090: -case 0x1091: -case 0x1092: -case 0x1093: -case 0x1094: -case 0x1095: -case 0x1096: -case 0x1097: -case 0x1290: -case 0x1291: -case 0x1292: -case 0x1293: -case 0x1294: -case 0x1295: -case 0x1296: -case 0x1297: -case 0x1490: -case 0x1491: -case 0x1492: -case 0x1493: -case 0x1494: -case 0x1495: -case 0x1496: -case 0x1497: -case 0x1690: -case 0x1691: -case 0x1692: -case 0x1693: -case 0x1694: -case 0x1695: -case 0x1696: -case 0x1697: -case 0x1890: -case 0x1891: -case 0x1892: -case 0x1893: -case 0x1894: -case 0x1895: -case 0x1896: -case 0x1897: -case 0x1a90: -case 0x1a91: -case 0x1a92: -case 0x1a93: -case 0x1a94: -case 0x1a95: -case 0x1a96: -case 0x1a97: -case 0x1c90: -case 0x1c91: -case 0x1c92: -case 0x1c93: -case 0x1c94: -case 0x1c95: -case 0x1c96: -case 0x1c97: -case 0x1e90: -case 0x1e91: -case 0x1e92: -case 0x1e93: -case 0x1e94: -case 0x1e95: -case 0x1e96: -case 0x1e97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1150: -case 0x1151: -case 0x1152: -case 0x1153: -case 0x1154: -case 0x1155: -case 0x1156: -case 0x1157: -case 0x1350: -case 0x1351: -case 0x1352: -case 0x1353: -case 0x1354: -case 0x1355: -case 0x1356: -case 0x1357: -case 0x1550: -case 0x1551: -case 0x1552: -case 0x1553: -case 0x1554: -case 0x1555: -case 0x1556: -case 0x1557: -case 0x1750: -case 0x1751: -case 0x1752: -case 0x1753: -case 0x1754: -case 0x1755: -case 0x1756: -case 0x1757: -case 0x1950: -case 0x1951: -case 0x1952: -case 0x1953: -case 0x1954: -case 0x1955: -case 0x1956: -case 0x1957: -case 0x1b50: -case 0x1b51: -case 0x1b52: -case 0x1b53: -case 0x1b54: -case 0x1b55: -case 0x1b56: -case 0x1b57: -case 0x1d50: -case 0x1d51: -case 0x1d52: -case 0x1d53: -case 0x1d54: -case 0x1d55: -case 0x1d56: -case 0x1d57: -case 0x1f50: -case 0x1f51: -case 0x1f52: -case 0x1f53: -case 0x1f54: -case 0x1f55: -case 0x1f56: -case 0x1f57: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1190: -case 0x1191: -case 0x1192: -case 0x1193: -case 0x1194: -case 0x1195: -case 0x1196: -case 0x1197: -case 0x1390: -case 0x1391: -case 0x1392: -case 0x1393: -case 0x1394: -case 0x1395: -case 0x1396: -case 0x1397: -case 0x1590: -case 0x1591: -case 0x1592: -case 0x1593: -case 0x1594: -case 0x1595: -case 0x1596: -case 0x1597: -case 0x1790: -case 0x1791: -case 0x1792: -case 0x1793: -case 0x1794: -case 0x1795: -case 0x1796: -case 0x1797: -case 0x1990: -case 0x1991: -case 0x1992: -case 0x1993: -case 0x1994: -case 0x1995: -case 0x1996: -case 0x1997: -case 0x1b90: -case 0x1b91: -case 0x1b92: -case 0x1b93: -case 0x1b94: -case 0x1b95: -case 0x1b96: -case 0x1b97: -case 0x1d90: -case 0x1d91: -case 0x1d92: -case 0x1d93: -case 0x1d94: -case 0x1d95: -case 0x1d96: -case 0x1d97: -case 0x1f90: -case 0x1f91: -case 0x1f92: -case 0x1f93: -case 0x1f94: -case 0x1f95: -case 0x1f96: -case 0x1f97: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x10d0: -case 0x10d1: -case 0x10d2: -case 0x10d3: -case 0x10d4: -case 0x10d5: -case 0x10d6: -case 0x10d7: -case 0x12d0: -case 0x12d1: -case 0x12d2: -case 0x12d3: -case 0x12d4: -case 0x12d5: -case 0x12d6: -case 0x12d7: -case 0x14d0: -case 0x14d1: -case 0x14d2: -case 0x14d3: -case 0x14d4: -case 0x14d5: -case 0x14d6: -case 0x14d7: -case 0x16d0: -case 0x16d1: -case 0x16d2: -case 0x16d3: -case 0x16d4: -case 0x16d5: -case 0x16d6: -case 0x16d7: -case 0x18d0: -case 0x18d1: -case 0x18d2: -case 0x18d3: -case 0x18d4: -case 0x18d5: -case 0x18d6: -case 0x18d7: -case 0x1ad0: -case 0x1ad1: -case 0x1ad2: -case 0x1ad3: -case 0x1ad4: -case 0x1ad5: -case 0x1ad6: -case 0x1ad7: -case 0x1cd0: -case 0x1cd1: -case 0x1cd2: -case 0x1cd3: -case 0x1cd4: -case 0x1cd5: -case 0x1cd6: -case 0x1cd7: -case 0x1ed0: -case 0x1ed1: -case 0x1ed2: -case 0x1ed3: -case 0x1ed4: -case 0x1ed5: -case 0x1ed6: -case 0x1ed7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1110: -case 0x1111: -case 0x1112: -case 0x1113: -case 0x1114: -case 0x1115: -case 0x1116: -case 0x1117: -case 0x1310: -case 0x1311: -case 0x1312: -case 0x1313: -case 0x1314: -case 0x1315: -case 0x1316: -case 0x1317: -case 0x1510: -case 0x1511: -case 0x1512: -case 0x1513: -case 0x1514: -case 0x1515: -case 0x1516: -case 0x1517: -case 0x1710: -case 0x1711: -case 0x1712: -case 0x1713: -case 0x1714: -case 0x1715: -case 0x1716: -case 0x1717: -case 0x1910: -case 0x1911: -case 0x1912: -case 0x1913: -case 0x1914: -case 0x1915: -case 0x1916: -case 0x1917: -case 0x1b10: -case 0x1b11: -case 0x1b12: -case 0x1b13: -case 0x1b14: -case 0x1b15: -case 0x1b16: -case 0x1b17: -case 0x1d10: -case 0x1d11: -case 0x1d12: -case 0x1d13: -case 0x1d14: -case 0x1d15: -case 0x1d16: -case 0x1d17: -case 0x1f10: -case 0x1f11: -case 0x1f12: -case 0x1f13: -case 0x1f14: -case 0x1f15: -case 0x1f16: -case 0x1f17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd010: -case 0xd011: -case 0xd012: -case 0xd013: -case 0xd014: -case 0xd015: -case 0xd016: -case 0xd017: -case 0xd210: -case 0xd211: -case 0xd212: -case 0xd213: -case 0xd214: -case 0xd215: -case 0xd216: -case 0xd217: -case 0xd410: -case 0xd411: -case 0xd412: -case 0xd413: -case 0xd414: -case 0xd415: -case 0xd416: -case 0xd417: -case 0xd610: -case 0xd611: -case 0xd612: -case 0xd613: -case 0xd614: -case 0xd615: -case 0xd616: -case 0xd617: -case 0xd810: -case 0xd811: -case 0xd812: -case 0xd813: -case 0xd814: -case 0xd815: -case 0xd816: -case 0xd817: -case 0xda10: -case 0xda11: -case 0xda12: -case 0xda13: -case 0xda14: -case 0xda15: -case 0xda16: -case 0xda17: -case 0xdc10: -case 0xdc11: -case 0xdc12: -case 0xdc13: -case 0xdc14: -case 0xdc15: -case 0xdc16: -case 0xdc17: -case 0xde10: -case 0xde11: -case 0xde12: -case 0xde13: -case 0xde14: -case 0xde15: -case 0xde16: -case 0xde17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc010: -case 0xc011: -case 0xc012: -case 0xc013: -case 0xc014: -case 0xc015: -case 0xc016: -case 0xc017: -case 0xc210: -case 0xc211: -case 0xc212: -case 0xc213: -case 0xc214: -case 0xc215: -case 0xc216: -case 0xc217: -case 0xc410: -case 0xc411: -case 0xc412: -case 0xc413: -case 0xc414: -case 0xc415: -case 0xc416: -case 0xc417: -case 0xc610: -case 0xc611: -case 0xc612: -case 0xc613: -case 0xc614: -case 0xc615: -case 0xc616: -case 0xc617: -case 0xc810: -case 0xc811: -case 0xc812: -case 0xc813: -case 0xc814: -case 0xc815: -case 0xc816: -case 0xc817: -case 0xca10: -case 0xca11: -case 0xca12: -case 0xca13: -case 0xca14: -case 0xca15: -case 0xca16: -case 0xca17: -case 0xcc10: -case 0xcc11: -case 0xcc12: -case 0xcc13: -case 0xcc14: -case 0xcc15: -case 0xcc16: -case 0xcc17: -case 0xce10: -case 0xce11: -case 0xce12: -case 0xce13: -case 0xce14: -case 0xce15: -case 0xce16: -case 0xce17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb010: -case 0xb011: -case 0xb012: -case 0xb013: -case 0xb014: -case 0xb015: -case 0xb016: -case 0xb017: -case 0xb210: -case 0xb211: -case 0xb212: -case 0xb213: -case 0xb214: -case 0xb215: -case 0xb216: -case 0xb217: -case 0xb410: -case 0xb411: -case 0xb412: -case 0xb413: -case 0xb414: -case 0xb415: -case 0xb416: -case 0xb417: -case 0xb610: -case 0xb611: -case 0xb612: -case 0xb613: -case 0xb614: -case 0xb615: -case 0xb616: -case 0xb617: -case 0xb810: -case 0xb811: -case 0xb812: -case 0xb813: -case 0xb814: -case 0xb815: -case 0xb816: -case 0xb817: -case 0xba10: -case 0xba11: -case 0xba12: -case 0xba13: -case 0xba14: -case 0xba15: -case 0xba16: -case 0xba17: -case 0xbc10: -case 0xbc11: -case 0xbc12: -case 0xbc13: -case 0xbc14: -case 0xbc15: -case 0xbc16: -case 0xbc17: -case 0xbe10: -case 0xbe11: -case 0xbe12: -case 0xbe13: -case 0xbe14: -case 0xbe15: -case 0xbe16: -case 0xbe17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x1010: -case 0x1011: -case 0x1012: -case 0x1013: -case 0x1014: -case 0x1015: -case 0x1016: -case 0x1017: -case 0x1210: -case 0x1211: -case 0x1212: -case 0x1213: -case 0x1214: -case 0x1215: -case 0x1216: -case 0x1217: -case 0x1410: -case 0x1411: -case 0x1412: -case 0x1413: -case 0x1414: -case 0x1415: -case 0x1416: -case 0x1417: -case 0x1610: -case 0x1611: -case 0x1612: -case 0x1613: -case 0x1614: -case 0x1615: -case 0x1616: -case 0x1617: -case 0x1810: -case 0x1811: -case 0x1812: -case 0x1813: -case 0x1814: -case 0x1815: -case 0x1816: -case 0x1817: -case 0x1a10: -case 0x1a11: -case 0x1a12: -case 0x1a13: -case 0x1a14: -case 0x1a15: -case 0x1a16: -case 0x1a17: -case 0x1c10: -case 0x1c11: -case 0x1c12: -case 0x1c13: -case 0x1c14: -case 0x1c15: -case 0x1c16: -case 0x1c17: -case 0x1e10: -case 0x1e11: -case 0x1e12: -case 0x1e13: -case 0x1e14: -case 0x1e15: -case 0x1e16: -case 0x1e17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8010: -case 0x8011: -case 0x8012: -case 0x8013: -case 0x8014: -case 0x8015: -case 0x8016: -case 0x8017: -case 0x8210: -case 0x8211: -case 0x8212: -case 0x8213: -case 0x8214: -case 0x8215: -case 0x8216: -case 0x8217: -case 0x8410: -case 0x8411: -case 0x8412: -case 0x8413: -case 0x8414: -case 0x8415: -case 0x8416: -case 0x8417: -case 0x8610: -case 0x8611: -case 0x8612: -case 0x8613: -case 0x8614: -case 0x8615: -case 0x8616: -case 0x8617: -case 0x8810: -case 0x8811: -case 0x8812: -case 0x8813: -case 0x8814: -case 0x8815: -case 0x8816: -case 0x8817: -case 0x8a10: -case 0x8a11: -case 0x8a12: -case 0x8a13: -case 0x8a14: -case 0x8a15: -case 0x8a16: -case 0x8a17: -case 0x8c10: -case 0x8c11: -case 0x8c12: -case 0x8c13: -case 0x8c14: -case 0x8c15: -case 0x8c16: -case 0x8c17: -case 0x8e10: -case 0x8e11: -case 0x8e12: -case 0x8e13: -case 0x8e14: -case 0x8e15: -case 0x8e16: -case 0x8e17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9010: -case 0x9011: -case 0x9012: -case 0x9013: -case 0x9014: -case 0x9015: -case 0x9016: -case 0x9017: -case 0x9210: -case 0x9211: -case 0x9212: -case 0x9213: -case 0x9214: -case 0x9215: -case 0x9216: -case 0x9217: -case 0x9410: -case 0x9411: -case 0x9412: -case 0x9413: -case 0x9414: -case 0x9415: -case 0x9416: -case 0x9417: -case 0x9610: -case 0x9611: -case 0x9612: -case 0x9613: -case 0x9614: -case 0x9615: -case 0x9616: -case 0x9617: -case 0x9810: -case 0x9811: -case 0x9812: -case 0x9813: -case 0x9814: -case 0x9815: -case 0x9816: -case 0x9817: -case 0x9a10: -case 0x9a11: -case 0x9a12: -case 0x9a13: -case 0x9a14: -case 0x9a15: -case 0x9a16: -case 0x9a17: -case 0x9c10: -case 0x9c11: -case 0x9c12: -case 0x9c13: -case 0x9c14: -case 0x9c15: -case 0x9c16: -case 0x9c17: -case 0x9e10: -case 0x9e11: -case 0x9e12: -case 0x9e13: -case 0x9e14: -case 0x9e15: -case 0x9e16: -case 0x9e17: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0150: -case 0x0151: -case 0x0152: -case 0x0153: -case 0x0154: -case 0x0155: -case 0x0156: -case 0x0157: -case 0x0350: -case 0x0351: -case 0x0352: -case 0x0353: -case 0x0354: -case 0x0355: -case 0x0356: -case 0x0357: -case 0x0550: -case 0x0551: -case 0x0552: -case 0x0553: -case 0x0554: -case 0x0555: -case 0x0556: -case 0x0557: -case 0x0750: -case 0x0751: -case 0x0752: -case 0x0753: -case 0x0754: -case 0x0755: -case 0x0756: -case 0x0757: -case 0x0950: -case 0x0951: -case 0x0952: -case 0x0953: -case 0x0954: -case 0x0955: -case 0x0956: -case 0x0957: -case 0x0b50: -case 0x0b51: -case 0x0b52: -case 0x0b53: -case 0x0b54: -case 0x0b55: -case 0x0b56: -case 0x0b57: -case 0x0d50: -case 0x0d51: -case 0x0d52: -case 0x0d53: -case 0x0d54: -case 0x0d55: -case 0x0d56: -case 0x0d57: -case 0x0f50: -case 0x0f51: -case 0x0f52: -case 0x0f53: -case 0x0f54: -case 0x0f55: -case 0x0f56: -case 0x0f57: - { - HAM targ(this, instr_b2_b0); BCHG(targ, D[instr_b11_b9]); - } - break; - -case 0x0190: -case 0x0191: -case 0x0192: -case 0x0193: -case 0x0194: -case 0x0195: -case 0x0196: -case 0x0197: -case 0x0390: -case 0x0391: -case 0x0392: -case 0x0393: -case 0x0394: -case 0x0395: -case 0x0396: -case 0x0397: -case 0x0590: -case 0x0591: -case 0x0592: -case 0x0593: -case 0x0594: -case 0x0595: -case 0x0596: -case 0x0597: -case 0x0790: -case 0x0791: -case 0x0792: -case 0x0793: -case 0x0794: -case 0x0795: -case 0x0796: -case 0x0797: -case 0x0990: -case 0x0991: -case 0x0992: -case 0x0993: -case 0x0994: -case 0x0995: -case 0x0996: -case 0x0997: -case 0x0b90: -case 0x0b91: -case 0x0b92: -case 0x0b93: -case 0x0b94: -case 0x0b95: -case 0x0b96: -case 0x0b97: -case 0x0d90: -case 0x0d91: -case 0x0d92: -case 0x0d93: -case 0x0d94: -case 0x0d95: -case 0x0d96: -case 0x0d97: -case 0x0f90: -case 0x0f91: -case 0x0f92: -case 0x0f93: -case 0x0f94: -case 0x0f95: -case 0x0f96: -case 0x0f97: - { - HAM targ(this, instr_b2_b0); BCLR(targ, D[instr_b11_b9]); - } - break; - -case 0x01d0: -case 0x01d1: -case 0x01d2: -case 0x01d3: -case 0x01d4: -case 0x01d5: -case 0x01d6: -case 0x01d7: -case 0x03d0: -case 0x03d1: -case 0x03d2: -case 0x03d3: -case 0x03d4: -case 0x03d5: -case 0x03d6: -case 0x03d7: -case 0x05d0: -case 0x05d1: -case 0x05d2: -case 0x05d3: -case 0x05d4: -case 0x05d5: -case 0x05d6: -case 0x05d7: -case 0x07d0: -case 0x07d1: -case 0x07d2: -case 0x07d3: -case 0x07d4: -case 0x07d5: -case 0x07d6: -case 0x07d7: -case 0x09d0: -case 0x09d1: -case 0x09d2: -case 0x09d3: -case 0x09d4: -case 0x09d5: -case 0x09d6: -case 0x09d7: -case 0x0bd0: -case 0x0bd1: -case 0x0bd2: -case 0x0bd3: -case 0x0bd4: -case 0x0bd5: -case 0x0bd6: -case 0x0bd7: -case 0x0dd0: -case 0x0dd1: -case 0x0dd2: -case 0x0dd3: -case 0x0dd4: -case 0x0dd5: -case 0x0dd6: -case 0x0dd7: -case 0x0fd0: -case 0x0fd1: -case 0x0fd2: -case 0x0fd3: -case 0x0fd4: -case 0x0fd5: -case 0x0fd6: -case 0x0fd7: - { - HAM targ(this, instr_b2_b0); BSET(targ, D[instr_b11_b9]); - } - break; - -case 0x0110: -case 0x0111: -case 0x0112: -case 0x0113: -case 0x0114: -case 0x0115: -case 0x0116: -case 0x0117: -case 0x0310: -case 0x0311: -case 0x0312: -case 0x0313: -case 0x0314: -case 0x0315: -case 0x0316: -case 0x0317: -case 0x0510: -case 0x0511: -case 0x0512: -case 0x0513: -case 0x0514: -case 0x0515: -case 0x0516: -case 0x0517: -case 0x0710: -case 0x0711: -case 0x0712: -case 0x0713: -case 0x0714: -case 0x0715: -case 0x0716: -case 0x0717: -case 0x0910: -case 0x0911: -case 0x0912: -case 0x0913: -case 0x0914: -case 0x0915: -case 0x0916: -case 0x0917: -case 0x0b10: -case 0x0b11: -case 0x0b12: -case 0x0b13: -case 0x0b14: -case 0x0b15: -case 0x0b16: -case 0x0b17: -case 0x0d10: -case 0x0d11: -case 0x0d12: -case 0x0d13: -case 0x0d14: -case 0x0d15: -case 0x0d16: -case 0x0d17: -case 0x0f10: -case 0x0f11: -case 0x0f12: -case 0x0f13: -case 0x0f14: -case 0x0f15: -case 0x0f16: -case 0x0f17: - { - HAM targ(this, instr_b2_b0); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0x4228: -case 0x4229: -case 0x422a: -case 0x422b: -case 0x422c: -case 0x422d: -case 0x422e: -case 0x422f: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4828: -case 0x4829: -case 0x482a: -case 0x482b: -case 0x482c: -case 0x482d: -case 0x482e: -case 0x482f: - { - HAM dst(this, instr_b2_b0); NBCD(dst); - } - break; - -case 0x4428: -case 0x4429: -case 0x442a: -case 0x442b: -case 0x442c: -case 0x442d: -case 0x442e: -case 0x442f: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4028: -case 0x4029: -case 0x402a: -case 0x402b: -case 0x402c: -case 0x402d: -case 0x402e: -case 0x402f: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4628: -case 0x4629: -case 0x462a: -case 0x462b: -case 0x462c: -case 0x462d: -case 0x462e: -case 0x462f: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x50e8: -case 0x50e9: -case 0x50ea: -case 0x50eb: -case 0x50ec: -case 0x50ed: -case 0x50ee: -case 0x50ef: - { - HAM dst(this, instr_b2_b0); Scc<0x00>(dst); - } - break; - -case 0x51e8: -case 0x51e9: -case 0x51ea: -case 0x51eb: -case 0x51ec: -case 0x51ed: -case 0x51ee: -case 0x51ef: - { - HAM dst(this, instr_b2_b0); Scc<0x01>(dst); - } - break; - -case 0x52e8: -case 0x52e9: -case 0x52ea: -case 0x52eb: -case 0x52ec: -case 0x52ed: -case 0x52ee: -case 0x52ef: - { - HAM dst(this, instr_b2_b0); Scc<0x02>(dst); - } - break; - -case 0x53e8: -case 0x53e9: -case 0x53ea: -case 0x53eb: -case 0x53ec: -case 0x53ed: -case 0x53ee: -case 0x53ef: - { - HAM dst(this, instr_b2_b0); Scc<0x03>(dst); - } - break; - -case 0x54e8: -case 0x54e9: -case 0x54ea: -case 0x54eb: -case 0x54ec: -case 0x54ed: -case 0x54ee: -case 0x54ef: - { - HAM dst(this, instr_b2_b0); Scc<0x04>(dst); - } - break; - -case 0x55e8: -case 0x55e9: -case 0x55ea: -case 0x55eb: -case 0x55ec: -case 0x55ed: -case 0x55ee: -case 0x55ef: - { - HAM dst(this, instr_b2_b0); Scc<0x05>(dst); - } - break; - -case 0x56e8: -case 0x56e9: -case 0x56ea: -case 0x56eb: -case 0x56ec: -case 0x56ed: -case 0x56ee: -case 0x56ef: - { - HAM dst(this, instr_b2_b0); Scc<0x06>(dst); - } - break; - -case 0x57e8: -case 0x57e9: -case 0x57ea: -case 0x57eb: -case 0x57ec: -case 0x57ed: -case 0x57ee: -case 0x57ef: - { - HAM dst(this, instr_b2_b0); Scc<0x07>(dst); - } - break; - -case 0x58e8: -case 0x58e9: -case 0x58ea: -case 0x58eb: -case 0x58ec: -case 0x58ed: -case 0x58ee: -case 0x58ef: - { - HAM dst(this, instr_b2_b0); Scc<0x08>(dst); - } - break; - -case 0x59e8: -case 0x59e9: -case 0x59ea: -case 0x59eb: -case 0x59ec: -case 0x59ed: -case 0x59ee: -case 0x59ef: - { - HAM dst(this, instr_b2_b0); Scc<0x09>(dst); - } - break; - -case 0x5ae8: -case 0x5ae9: -case 0x5aea: -case 0x5aeb: -case 0x5aec: -case 0x5aed: -case 0x5aee: -case 0x5aef: - { - HAM dst(this, instr_b2_b0); Scc<0x0a>(dst); - } - break; - -case 0x5be8: -case 0x5be9: -case 0x5bea: -case 0x5beb: -case 0x5bec: -case 0x5bed: -case 0x5bee: -case 0x5bef: - { - HAM dst(this, instr_b2_b0); Scc<0x0b>(dst); - } - break; - -case 0x5ce8: -case 0x5ce9: -case 0x5cea: -case 0x5ceb: -case 0x5cec: -case 0x5ced: -case 0x5cee: -case 0x5cef: - { - HAM dst(this, instr_b2_b0); Scc<0x0c>(dst); - } - break; - -case 0x5de8: -case 0x5de9: -case 0x5dea: -case 0x5deb: -case 0x5dec: -case 0x5ded: -case 0x5dee: -case 0x5def: - { - HAM dst(this, instr_b2_b0); Scc<0x0d>(dst); - } - break; - -case 0x5ee8: -case 0x5ee9: -case 0x5eea: -case 0x5eeb: -case 0x5eec: -case 0x5eed: -case 0x5eee: -case 0x5eef: - { - HAM dst(this, instr_b2_b0); Scc<0x0e>(dst); - } - break; - -case 0x5fe8: -case 0x5fe9: -case 0x5fea: -case 0x5feb: -case 0x5fec: -case 0x5fed: -case 0x5fee: -case 0x5fef: - { - HAM dst(this, instr_b2_b0); Scc<0x0f>(dst); - } - break; - -case 0x4ae8: -case 0x4ae9: -case 0x4aea: -case 0x4aeb: -case 0x4aec: -case 0x4aed: -case 0x4aee: -case 0x4aef: - { - HAM dst(this, instr_b2_b0); TAS(dst); - } - break; - -case 0x4a28: -case 0x4a29: -case 0x4a2a: -case 0x4a2b: -case 0x4a2c: -case 0x4a2d: -case 0x4a2e: -case 0x4a2f: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x13e8: -case 0x13e9: -case 0x13ea: -case 0x13eb: -case 0x13ec: -case 0x13ed: -case 0x13ee: -case 0x13ef: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11e8: -case 0x11e9: -case 0x11ea: -case 0x11eb: -case 0x11ec: -case 0x11ed: -case 0x11ee: -case 0x11ef: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x10a8: -case 0x10a9: -case 0x10aa: -case 0x10ab: -case 0x10ac: -case 0x10ad: -case 0x10ae: -case 0x10af: -case 0x12a8: -case 0x12a9: -case 0x12aa: -case 0x12ab: -case 0x12ac: -case 0x12ad: -case 0x12ae: -case 0x12af: -case 0x14a8: -case 0x14a9: -case 0x14aa: -case 0x14ab: -case 0x14ac: -case 0x14ad: -case 0x14ae: -case 0x14af: -case 0x16a8: -case 0x16a9: -case 0x16aa: -case 0x16ab: -case 0x16ac: -case 0x16ad: -case 0x16ae: -case 0x16af: -case 0x18a8: -case 0x18a9: -case 0x18aa: -case 0x18ab: -case 0x18ac: -case 0x18ad: -case 0x18ae: -case 0x18af: -case 0x1aa8: -case 0x1aa9: -case 0x1aaa: -case 0x1aab: -case 0x1aac: -case 0x1aad: -case 0x1aae: -case 0x1aaf: -case 0x1ca8: -case 0x1ca9: -case 0x1caa: -case 0x1cab: -case 0x1cac: -case 0x1cad: -case 0x1cae: -case 0x1caf: -case 0x1ea8: -case 0x1ea9: -case 0x1eaa: -case 0x1eab: -case 0x1eac: -case 0x1ead: -case 0x1eae: -case 0x1eaf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1168: -case 0x1169: -case 0x116a: -case 0x116b: -case 0x116c: -case 0x116d: -case 0x116e: -case 0x116f: -case 0x1368: -case 0x1369: -case 0x136a: -case 0x136b: -case 0x136c: -case 0x136d: -case 0x136e: -case 0x136f: -case 0x1568: -case 0x1569: -case 0x156a: -case 0x156b: -case 0x156c: -case 0x156d: -case 0x156e: -case 0x156f: -case 0x1768: -case 0x1769: -case 0x176a: -case 0x176b: -case 0x176c: -case 0x176d: -case 0x176e: -case 0x176f: -case 0x1968: -case 0x1969: -case 0x196a: -case 0x196b: -case 0x196c: -case 0x196d: -case 0x196e: -case 0x196f: -case 0x1b68: -case 0x1b69: -case 0x1b6a: -case 0x1b6b: -case 0x1b6c: -case 0x1b6d: -case 0x1b6e: -case 0x1b6f: -case 0x1d68: -case 0x1d69: -case 0x1d6a: -case 0x1d6b: -case 0x1d6c: -case 0x1d6d: -case 0x1d6e: -case 0x1d6f: -case 0x1f68: -case 0x1f69: -case 0x1f6a: -case 0x1f6b: -case 0x1f6c: -case 0x1f6d: -case 0x1f6e: -case 0x1f6f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x11a8: -case 0x11a9: -case 0x11aa: -case 0x11ab: -case 0x11ac: -case 0x11ad: -case 0x11ae: -case 0x11af: -case 0x13a8: -case 0x13a9: -case 0x13aa: -case 0x13ab: -case 0x13ac: -case 0x13ad: -case 0x13ae: -case 0x13af: -case 0x15a8: -case 0x15a9: -case 0x15aa: -case 0x15ab: -case 0x15ac: -case 0x15ad: -case 0x15ae: -case 0x15af: -case 0x17a8: -case 0x17a9: -case 0x17aa: -case 0x17ab: -case 0x17ac: -case 0x17ad: -case 0x17ae: -case 0x17af: -case 0x19a8: -case 0x19a9: -case 0x19aa: -case 0x19ab: -case 0x19ac: -case 0x19ad: -case 0x19ae: -case 0x19af: -case 0x1ba8: -case 0x1ba9: -case 0x1baa: -case 0x1bab: -case 0x1bac: -case 0x1bad: -case 0x1bae: -case 0x1baf: -case 0x1da8: -case 0x1da9: -case 0x1daa: -case 0x1dab: -case 0x1dac: -case 0x1dad: -case 0x1dae: -case 0x1daf: -case 0x1fa8: -case 0x1fa9: -case 0x1faa: -case 0x1fab: -case 0x1fac: -case 0x1fad: -case 0x1fae: -case 0x1faf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x10e8: -case 0x10e9: -case 0x10ea: -case 0x10eb: -case 0x10ec: -case 0x10ed: -case 0x10ee: -case 0x10ef: -case 0x12e8: -case 0x12e9: -case 0x12ea: -case 0x12eb: -case 0x12ec: -case 0x12ed: -case 0x12ee: -case 0x12ef: -case 0x14e8: -case 0x14e9: -case 0x14ea: -case 0x14eb: -case 0x14ec: -case 0x14ed: -case 0x14ee: -case 0x14ef: -case 0x16e8: -case 0x16e9: -case 0x16ea: -case 0x16eb: -case 0x16ec: -case 0x16ed: -case 0x16ee: -case 0x16ef: -case 0x18e8: -case 0x18e9: -case 0x18ea: -case 0x18eb: -case 0x18ec: -case 0x18ed: -case 0x18ee: -case 0x18ef: -case 0x1ae8: -case 0x1ae9: -case 0x1aea: -case 0x1aeb: -case 0x1aec: -case 0x1aed: -case 0x1aee: -case 0x1aef: -case 0x1ce8: -case 0x1ce9: -case 0x1cea: -case 0x1ceb: -case 0x1cec: -case 0x1ced: -case 0x1cee: -case 0x1cef: -case 0x1ee8: -case 0x1ee9: -case 0x1eea: -case 0x1eeb: -case 0x1eec: -case 0x1eed: -case 0x1eee: -case 0x1eef: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1128: -case 0x1129: -case 0x112a: -case 0x112b: -case 0x112c: -case 0x112d: -case 0x112e: -case 0x112f: -case 0x1328: -case 0x1329: -case 0x132a: -case 0x132b: -case 0x132c: -case 0x132d: -case 0x132e: -case 0x132f: -case 0x1528: -case 0x1529: -case 0x152a: -case 0x152b: -case 0x152c: -case 0x152d: -case 0x152e: -case 0x152f: -case 0x1728: -case 0x1729: -case 0x172a: -case 0x172b: -case 0x172c: -case 0x172d: -case 0x172e: -case 0x172f: -case 0x1928: -case 0x1929: -case 0x192a: -case 0x192b: -case 0x192c: -case 0x192d: -case 0x192e: -case 0x192f: -case 0x1b28: -case 0x1b29: -case 0x1b2a: -case 0x1b2b: -case 0x1b2c: -case 0x1b2d: -case 0x1b2e: -case 0x1b2f: -case 0x1d28: -case 0x1d29: -case 0x1d2a: -case 0x1d2b: -case 0x1d2c: -case 0x1d2d: -case 0x1d2e: -case 0x1d2f: -case 0x1f28: -case 0x1f29: -case 0x1f2a: -case 0x1f2b: -case 0x1f2c: -case 0x1f2d: -case 0x1f2e: -case 0x1f2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd028: -case 0xd029: -case 0xd02a: -case 0xd02b: -case 0xd02c: -case 0xd02d: -case 0xd02e: -case 0xd02f: -case 0xd228: -case 0xd229: -case 0xd22a: -case 0xd22b: -case 0xd22c: -case 0xd22d: -case 0xd22e: -case 0xd22f: -case 0xd428: -case 0xd429: -case 0xd42a: -case 0xd42b: -case 0xd42c: -case 0xd42d: -case 0xd42e: -case 0xd42f: -case 0xd628: -case 0xd629: -case 0xd62a: -case 0xd62b: -case 0xd62c: -case 0xd62d: -case 0xd62e: -case 0xd62f: -case 0xd828: -case 0xd829: -case 0xd82a: -case 0xd82b: -case 0xd82c: -case 0xd82d: -case 0xd82e: -case 0xd82f: -case 0xda28: -case 0xda29: -case 0xda2a: -case 0xda2b: -case 0xda2c: -case 0xda2d: -case 0xda2e: -case 0xda2f: -case 0xdc28: -case 0xdc29: -case 0xdc2a: -case 0xdc2b: -case 0xdc2c: -case 0xdc2d: -case 0xdc2e: -case 0xdc2f: -case 0xde28: -case 0xde29: -case 0xde2a: -case 0xde2b: -case 0xde2c: -case 0xde2d: -case 0xde2e: -case 0xde2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc028: -case 0xc029: -case 0xc02a: -case 0xc02b: -case 0xc02c: -case 0xc02d: -case 0xc02e: -case 0xc02f: -case 0xc228: -case 0xc229: -case 0xc22a: -case 0xc22b: -case 0xc22c: -case 0xc22d: -case 0xc22e: -case 0xc22f: -case 0xc428: -case 0xc429: -case 0xc42a: -case 0xc42b: -case 0xc42c: -case 0xc42d: -case 0xc42e: -case 0xc42f: -case 0xc628: -case 0xc629: -case 0xc62a: -case 0xc62b: -case 0xc62c: -case 0xc62d: -case 0xc62e: -case 0xc62f: -case 0xc828: -case 0xc829: -case 0xc82a: -case 0xc82b: -case 0xc82c: -case 0xc82d: -case 0xc82e: -case 0xc82f: -case 0xca28: -case 0xca29: -case 0xca2a: -case 0xca2b: -case 0xca2c: -case 0xca2d: -case 0xca2e: -case 0xca2f: -case 0xcc28: -case 0xcc29: -case 0xcc2a: -case 0xcc2b: -case 0xcc2c: -case 0xcc2d: -case 0xcc2e: -case 0xcc2f: -case 0xce28: -case 0xce29: -case 0xce2a: -case 0xce2b: -case 0xce2c: -case 0xce2d: -case 0xce2e: -case 0xce2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb028: -case 0xb029: -case 0xb02a: -case 0xb02b: -case 0xb02c: -case 0xb02d: -case 0xb02e: -case 0xb02f: -case 0xb228: -case 0xb229: -case 0xb22a: -case 0xb22b: -case 0xb22c: -case 0xb22d: -case 0xb22e: -case 0xb22f: -case 0xb428: -case 0xb429: -case 0xb42a: -case 0xb42b: -case 0xb42c: -case 0xb42d: -case 0xb42e: -case 0xb42f: -case 0xb628: -case 0xb629: -case 0xb62a: -case 0xb62b: -case 0xb62c: -case 0xb62d: -case 0xb62e: -case 0xb62f: -case 0xb828: -case 0xb829: -case 0xb82a: -case 0xb82b: -case 0xb82c: -case 0xb82d: -case 0xb82e: -case 0xb82f: -case 0xba28: -case 0xba29: -case 0xba2a: -case 0xba2b: -case 0xba2c: -case 0xba2d: -case 0xba2e: -case 0xba2f: -case 0xbc28: -case 0xbc29: -case 0xbc2a: -case 0xbc2b: -case 0xbc2c: -case 0xbc2d: -case 0xbc2e: -case 0xbc2f: -case 0xbe28: -case 0xbe29: -case 0xbe2a: -case 0xbe2b: -case 0xbe2c: -case 0xbe2d: -case 0xbe2e: -case 0xbe2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x1028: -case 0x1029: -case 0x102a: -case 0x102b: -case 0x102c: -case 0x102d: -case 0x102e: -case 0x102f: -case 0x1228: -case 0x1229: -case 0x122a: -case 0x122b: -case 0x122c: -case 0x122d: -case 0x122e: -case 0x122f: -case 0x1428: -case 0x1429: -case 0x142a: -case 0x142b: -case 0x142c: -case 0x142d: -case 0x142e: -case 0x142f: -case 0x1628: -case 0x1629: -case 0x162a: -case 0x162b: -case 0x162c: -case 0x162d: -case 0x162e: -case 0x162f: -case 0x1828: -case 0x1829: -case 0x182a: -case 0x182b: -case 0x182c: -case 0x182d: -case 0x182e: -case 0x182f: -case 0x1a28: -case 0x1a29: -case 0x1a2a: -case 0x1a2b: -case 0x1a2c: -case 0x1a2d: -case 0x1a2e: -case 0x1a2f: -case 0x1c28: -case 0x1c29: -case 0x1c2a: -case 0x1c2b: -case 0x1c2c: -case 0x1c2d: -case 0x1c2e: -case 0x1c2f: -case 0x1e28: -case 0x1e29: -case 0x1e2a: -case 0x1e2b: -case 0x1e2c: -case 0x1e2d: -case 0x1e2e: -case 0x1e2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8028: -case 0x8029: -case 0x802a: -case 0x802b: -case 0x802c: -case 0x802d: -case 0x802e: -case 0x802f: -case 0x8228: -case 0x8229: -case 0x822a: -case 0x822b: -case 0x822c: -case 0x822d: -case 0x822e: -case 0x822f: -case 0x8428: -case 0x8429: -case 0x842a: -case 0x842b: -case 0x842c: -case 0x842d: -case 0x842e: -case 0x842f: -case 0x8628: -case 0x8629: -case 0x862a: -case 0x862b: -case 0x862c: -case 0x862d: -case 0x862e: -case 0x862f: -case 0x8828: -case 0x8829: -case 0x882a: -case 0x882b: -case 0x882c: -case 0x882d: -case 0x882e: -case 0x882f: -case 0x8a28: -case 0x8a29: -case 0x8a2a: -case 0x8a2b: -case 0x8a2c: -case 0x8a2d: -case 0x8a2e: -case 0x8a2f: -case 0x8c28: -case 0x8c29: -case 0x8c2a: -case 0x8c2b: -case 0x8c2c: -case 0x8c2d: -case 0x8c2e: -case 0x8c2f: -case 0x8e28: -case 0x8e29: -case 0x8e2a: -case 0x8e2b: -case 0x8e2c: -case 0x8e2d: -case 0x8e2e: -case 0x8e2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9028: -case 0x9029: -case 0x902a: -case 0x902b: -case 0x902c: -case 0x902d: -case 0x902e: -case 0x902f: -case 0x9228: -case 0x9229: -case 0x922a: -case 0x922b: -case 0x922c: -case 0x922d: -case 0x922e: -case 0x922f: -case 0x9428: -case 0x9429: -case 0x942a: -case 0x942b: -case 0x942c: -case 0x942d: -case 0x942e: -case 0x942f: -case 0x9628: -case 0x9629: -case 0x962a: -case 0x962b: -case 0x962c: -case 0x962d: -case 0x962e: -case 0x962f: -case 0x9828: -case 0x9829: -case 0x982a: -case 0x982b: -case 0x982c: -case 0x982d: -case 0x982e: -case 0x982f: -case 0x9a28: -case 0x9a29: -case 0x9a2a: -case 0x9a2b: -case 0x9a2c: -case 0x9a2d: -case 0x9a2e: -case 0x9a2f: -case 0x9c28: -case 0x9c29: -case 0x9c2a: -case 0x9c2b: -case 0x9c2c: -case 0x9c2d: -case 0x9c2e: -case 0x9c2f: -case 0x9e28: -case 0x9e29: -case 0x9e2a: -case 0x9e2b: -case 0x9e2c: -case 0x9e2d: -case 0x9e2e: -case 0x9e2f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0168: -case 0x0169: -case 0x016a: -case 0x016b: -case 0x016c: -case 0x016d: -case 0x016e: -case 0x016f: -case 0x0368: -case 0x0369: -case 0x036a: -case 0x036b: -case 0x036c: -case 0x036d: -case 0x036e: -case 0x036f: -case 0x0568: -case 0x0569: -case 0x056a: -case 0x056b: -case 0x056c: -case 0x056d: -case 0x056e: -case 0x056f: -case 0x0768: -case 0x0769: -case 0x076a: -case 0x076b: -case 0x076c: -case 0x076d: -case 0x076e: -case 0x076f: -case 0x0968: -case 0x0969: -case 0x096a: -case 0x096b: -case 0x096c: -case 0x096d: -case 0x096e: -case 0x096f: -case 0x0b68: -case 0x0b69: -case 0x0b6a: -case 0x0b6b: -case 0x0b6c: -case 0x0b6d: -case 0x0b6e: -case 0x0b6f: -case 0x0d68: -case 0x0d69: -case 0x0d6a: -case 0x0d6b: -case 0x0d6c: -case 0x0d6d: -case 0x0d6e: -case 0x0d6f: -case 0x0f68: -case 0x0f69: -case 0x0f6a: -case 0x0f6b: -case 0x0f6c: -case 0x0f6d: -case 0x0f6e: -case 0x0f6f: - { - HAM targ(this, instr_b2_b0); BCHG(targ, D[instr_b11_b9]); - } - break; - -case 0x01a8: -case 0x01a9: -case 0x01aa: -case 0x01ab: -case 0x01ac: -case 0x01ad: -case 0x01ae: -case 0x01af: -case 0x03a8: -case 0x03a9: -case 0x03aa: -case 0x03ab: -case 0x03ac: -case 0x03ad: -case 0x03ae: -case 0x03af: -case 0x05a8: -case 0x05a9: -case 0x05aa: -case 0x05ab: -case 0x05ac: -case 0x05ad: -case 0x05ae: -case 0x05af: -case 0x07a8: -case 0x07a9: -case 0x07aa: -case 0x07ab: -case 0x07ac: -case 0x07ad: -case 0x07ae: -case 0x07af: -case 0x09a8: -case 0x09a9: -case 0x09aa: -case 0x09ab: -case 0x09ac: -case 0x09ad: -case 0x09ae: -case 0x09af: -case 0x0ba8: -case 0x0ba9: -case 0x0baa: -case 0x0bab: -case 0x0bac: -case 0x0bad: -case 0x0bae: -case 0x0baf: -case 0x0da8: -case 0x0da9: -case 0x0daa: -case 0x0dab: -case 0x0dac: -case 0x0dad: -case 0x0dae: -case 0x0daf: -case 0x0fa8: -case 0x0fa9: -case 0x0faa: -case 0x0fab: -case 0x0fac: -case 0x0fad: -case 0x0fae: -case 0x0faf: - { - HAM targ(this, instr_b2_b0); BCLR(targ, D[instr_b11_b9]); - } - break; - -case 0x01e8: -case 0x01e9: -case 0x01ea: -case 0x01eb: -case 0x01ec: -case 0x01ed: -case 0x01ee: -case 0x01ef: -case 0x03e8: -case 0x03e9: -case 0x03ea: -case 0x03eb: -case 0x03ec: -case 0x03ed: -case 0x03ee: -case 0x03ef: -case 0x05e8: -case 0x05e9: -case 0x05ea: -case 0x05eb: -case 0x05ec: -case 0x05ed: -case 0x05ee: -case 0x05ef: -case 0x07e8: -case 0x07e9: -case 0x07ea: -case 0x07eb: -case 0x07ec: -case 0x07ed: -case 0x07ee: -case 0x07ef: -case 0x09e8: -case 0x09e9: -case 0x09ea: -case 0x09eb: -case 0x09ec: -case 0x09ed: -case 0x09ee: -case 0x09ef: -case 0x0be8: -case 0x0be9: -case 0x0bea: -case 0x0beb: -case 0x0bec: -case 0x0bed: -case 0x0bee: -case 0x0bef: -case 0x0de8: -case 0x0de9: -case 0x0dea: -case 0x0deb: -case 0x0dec: -case 0x0ded: -case 0x0dee: -case 0x0def: -case 0x0fe8: -case 0x0fe9: -case 0x0fea: -case 0x0feb: -case 0x0fec: -case 0x0fed: -case 0x0fee: -case 0x0fef: - { - HAM targ(this, instr_b2_b0); BSET(targ, D[instr_b11_b9]); - } - break; - -case 0x0128: -case 0x0129: -case 0x012a: -case 0x012b: -case 0x012c: -case 0x012d: -case 0x012e: -case 0x012f: -case 0x0328: -case 0x0329: -case 0x032a: -case 0x032b: -case 0x032c: -case 0x032d: -case 0x032e: -case 0x032f: -case 0x0528: -case 0x0529: -case 0x052a: -case 0x052b: -case 0x052c: -case 0x052d: -case 0x052e: -case 0x052f: -case 0x0728: -case 0x0729: -case 0x072a: -case 0x072b: -case 0x072c: -case 0x072d: -case 0x072e: -case 0x072f: -case 0x0928: -case 0x0929: -case 0x092a: -case 0x092b: -case 0x092c: -case 0x092d: -case 0x092e: -case 0x092f: -case 0x0b28: -case 0x0b29: -case 0x0b2a: -case 0x0b2b: -case 0x0b2c: -case 0x0b2d: -case 0x0b2e: -case 0x0b2f: -case 0x0d28: -case 0x0d29: -case 0x0d2a: -case 0x0d2b: -case 0x0d2c: -case 0x0d2d: -case 0x0d2e: -case 0x0d2f: -case 0x0f28: -case 0x0f29: -case 0x0f2a: -case 0x0f2b: -case 0x0f2c: -case 0x0f2d: -case 0x0f2e: -case 0x0f2f: - { - HAM targ(this, instr_b2_b0); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0x4230: -case 0x4231: -case 0x4232: -case 0x4233: -case 0x4234: -case 0x4235: -case 0x4236: -case 0x4237: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4830: -case 0x4831: -case 0x4832: -case 0x4833: -case 0x4834: -case 0x4835: -case 0x4836: -case 0x4837: - { - HAM dst(this, instr_b2_b0); NBCD(dst); - } - break; - -case 0x4430: -case 0x4431: -case 0x4432: -case 0x4433: -case 0x4434: -case 0x4435: -case 0x4436: -case 0x4437: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4030: -case 0x4031: -case 0x4032: -case 0x4033: -case 0x4034: -case 0x4035: -case 0x4036: -case 0x4037: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4630: -case 0x4631: -case 0x4632: -case 0x4633: -case 0x4634: -case 0x4635: -case 0x4636: -case 0x4637: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x50f0: -case 0x50f1: -case 0x50f2: -case 0x50f3: -case 0x50f4: -case 0x50f5: -case 0x50f6: -case 0x50f7: - { - HAM dst(this, instr_b2_b0); Scc<0x00>(dst); - } - break; - -case 0x51f0: -case 0x51f1: -case 0x51f2: -case 0x51f3: -case 0x51f4: -case 0x51f5: -case 0x51f6: -case 0x51f7: - { - HAM dst(this, instr_b2_b0); Scc<0x01>(dst); - } - break; - -case 0x52f0: -case 0x52f1: -case 0x52f2: -case 0x52f3: -case 0x52f4: -case 0x52f5: -case 0x52f6: -case 0x52f7: - { - HAM dst(this, instr_b2_b0); Scc<0x02>(dst); - } - break; - -case 0x53f0: -case 0x53f1: -case 0x53f2: -case 0x53f3: -case 0x53f4: -case 0x53f5: -case 0x53f6: -case 0x53f7: - { - HAM dst(this, instr_b2_b0); Scc<0x03>(dst); - } - break; - -case 0x54f0: -case 0x54f1: -case 0x54f2: -case 0x54f3: -case 0x54f4: -case 0x54f5: -case 0x54f6: -case 0x54f7: - { - HAM dst(this, instr_b2_b0); Scc<0x04>(dst); - } - break; - -case 0x55f0: -case 0x55f1: -case 0x55f2: -case 0x55f3: -case 0x55f4: -case 0x55f5: -case 0x55f6: -case 0x55f7: - { - HAM dst(this, instr_b2_b0); Scc<0x05>(dst); - } - break; - -case 0x56f0: -case 0x56f1: -case 0x56f2: -case 0x56f3: -case 0x56f4: -case 0x56f5: -case 0x56f6: -case 0x56f7: - { - HAM dst(this, instr_b2_b0); Scc<0x06>(dst); - } - break; - -case 0x57f0: -case 0x57f1: -case 0x57f2: -case 0x57f3: -case 0x57f4: -case 0x57f5: -case 0x57f6: -case 0x57f7: - { - HAM dst(this, instr_b2_b0); Scc<0x07>(dst); - } - break; - -case 0x58f0: -case 0x58f1: -case 0x58f2: -case 0x58f3: -case 0x58f4: -case 0x58f5: -case 0x58f6: -case 0x58f7: - { - HAM dst(this, instr_b2_b0); Scc<0x08>(dst); - } - break; - -case 0x59f0: -case 0x59f1: -case 0x59f2: -case 0x59f3: -case 0x59f4: -case 0x59f5: -case 0x59f6: -case 0x59f7: - { - HAM dst(this, instr_b2_b0); Scc<0x09>(dst); - } - break; - -case 0x5af0: -case 0x5af1: -case 0x5af2: -case 0x5af3: -case 0x5af4: -case 0x5af5: -case 0x5af6: -case 0x5af7: - { - HAM dst(this, instr_b2_b0); Scc<0x0a>(dst); - } - break; - -case 0x5bf0: -case 0x5bf1: -case 0x5bf2: -case 0x5bf3: -case 0x5bf4: -case 0x5bf5: -case 0x5bf6: -case 0x5bf7: - { - HAM dst(this, instr_b2_b0); Scc<0x0b>(dst); - } - break; - -case 0x5cf0: -case 0x5cf1: -case 0x5cf2: -case 0x5cf3: -case 0x5cf4: -case 0x5cf5: -case 0x5cf6: -case 0x5cf7: - { - HAM dst(this, instr_b2_b0); Scc<0x0c>(dst); - } - break; - -case 0x5df0: -case 0x5df1: -case 0x5df2: -case 0x5df3: -case 0x5df4: -case 0x5df5: -case 0x5df6: -case 0x5df7: - { - HAM dst(this, instr_b2_b0); Scc<0x0d>(dst); - } - break; - -case 0x5ef0: -case 0x5ef1: -case 0x5ef2: -case 0x5ef3: -case 0x5ef4: -case 0x5ef5: -case 0x5ef6: -case 0x5ef7: - { - HAM dst(this, instr_b2_b0); Scc<0x0e>(dst); - } - break; - -case 0x5ff0: -case 0x5ff1: -case 0x5ff2: -case 0x5ff3: -case 0x5ff4: -case 0x5ff5: -case 0x5ff6: -case 0x5ff7: - { - HAM dst(this, instr_b2_b0); Scc<0x0f>(dst); - } - break; - -case 0x4af0: -case 0x4af1: -case 0x4af2: -case 0x4af3: -case 0x4af4: -case 0x4af5: -case 0x4af6: -case 0x4af7: - { - HAM dst(this, instr_b2_b0); TAS(dst); - } - break; - -case 0x4a30: -case 0x4a31: -case 0x4a32: -case 0x4a33: -case 0x4a34: -case 0x4a35: -case 0x4a36: -case 0x4a37: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x13f0: -case 0x13f1: -case 0x13f2: -case 0x13f3: -case 0x13f4: -case 0x13f5: -case 0x13f6: -case 0x13f7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11f0: -case 0x11f1: -case 0x11f2: -case 0x11f3: -case 0x11f4: -case 0x11f5: -case 0x11f6: -case 0x11f7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x10b0: -case 0x10b1: -case 0x10b2: -case 0x10b3: -case 0x10b4: -case 0x10b5: -case 0x10b6: -case 0x10b7: -case 0x12b0: -case 0x12b1: -case 0x12b2: -case 0x12b3: -case 0x12b4: -case 0x12b5: -case 0x12b6: -case 0x12b7: -case 0x14b0: -case 0x14b1: -case 0x14b2: -case 0x14b3: -case 0x14b4: -case 0x14b5: -case 0x14b6: -case 0x14b7: -case 0x16b0: -case 0x16b1: -case 0x16b2: -case 0x16b3: -case 0x16b4: -case 0x16b5: -case 0x16b6: -case 0x16b7: -case 0x18b0: -case 0x18b1: -case 0x18b2: -case 0x18b3: -case 0x18b4: -case 0x18b5: -case 0x18b6: -case 0x18b7: -case 0x1ab0: -case 0x1ab1: -case 0x1ab2: -case 0x1ab3: -case 0x1ab4: -case 0x1ab5: -case 0x1ab6: -case 0x1ab7: -case 0x1cb0: -case 0x1cb1: -case 0x1cb2: -case 0x1cb3: -case 0x1cb4: -case 0x1cb5: -case 0x1cb6: -case 0x1cb7: -case 0x1eb0: -case 0x1eb1: -case 0x1eb2: -case 0x1eb3: -case 0x1eb4: -case 0x1eb5: -case 0x1eb6: -case 0x1eb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1170: -case 0x1171: -case 0x1172: -case 0x1173: -case 0x1174: -case 0x1175: -case 0x1176: -case 0x1177: -case 0x1370: -case 0x1371: -case 0x1372: -case 0x1373: -case 0x1374: -case 0x1375: -case 0x1376: -case 0x1377: -case 0x1570: -case 0x1571: -case 0x1572: -case 0x1573: -case 0x1574: -case 0x1575: -case 0x1576: -case 0x1577: -case 0x1770: -case 0x1771: -case 0x1772: -case 0x1773: -case 0x1774: -case 0x1775: -case 0x1776: -case 0x1777: -case 0x1970: -case 0x1971: -case 0x1972: -case 0x1973: -case 0x1974: -case 0x1975: -case 0x1976: -case 0x1977: -case 0x1b70: -case 0x1b71: -case 0x1b72: -case 0x1b73: -case 0x1b74: -case 0x1b75: -case 0x1b76: -case 0x1b77: -case 0x1d70: -case 0x1d71: -case 0x1d72: -case 0x1d73: -case 0x1d74: -case 0x1d75: -case 0x1d76: -case 0x1d77: -case 0x1f70: -case 0x1f71: -case 0x1f72: -case 0x1f73: -case 0x1f74: -case 0x1f75: -case 0x1f76: -case 0x1f77: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x11b0: -case 0x11b1: -case 0x11b2: -case 0x11b3: -case 0x11b4: -case 0x11b5: -case 0x11b6: -case 0x11b7: -case 0x13b0: -case 0x13b1: -case 0x13b2: -case 0x13b3: -case 0x13b4: -case 0x13b5: -case 0x13b6: -case 0x13b7: -case 0x15b0: -case 0x15b1: -case 0x15b2: -case 0x15b3: -case 0x15b4: -case 0x15b5: -case 0x15b6: -case 0x15b7: -case 0x17b0: -case 0x17b1: -case 0x17b2: -case 0x17b3: -case 0x17b4: -case 0x17b5: -case 0x17b6: -case 0x17b7: -case 0x19b0: -case 0x19b1: -case 0x19b2: -case 0x19b3: -case 0x19b4: -case 0x19b5: -case 0x19b6: -case 0x19b7: -case 0x1bb0: -case 0x1bb1: -case 0x1bb2: -case 0x1bb3: -case 0x1bb4: -case 0x1bb5: -case 0x1bb6: -case 0x1bb7: -case 0x1db0: -case 0x1db1: -case 0x1db2: -case 0x1db3: -case 0x1db4: -case 0x1db5: -case 0x1db6: -case 0x1db7: -case 0x1fb0: -case 0x1fb1: -case 0x1fb2: -case 0x1fb3: -case 0x1fb4: -case 0x1fb5: -case 0x1fb6: -case 0x1fb7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x10f0: -case 0x10f1: -case 0x10f2: -case 0x10f3: -case 0x10f4: -case 0x10f5: -case 0x10f6: -case 0x10f7: -case 0x12f0: -case 0x12f1: -case 0x12f2: -case 0x12f3: -case 0x12f4: -case 0x12f5: -case 0x12f6: -case 0x12f7: -case 0x14f0: -case 0x14f1: -case 0x14f2: -case 0x14f3: -case 0x14f4: -case 0x14f5: -case 0x14f6: -case 0x14f7: -case 0x16f0: -case 0x16f1: -case 0x16f2: -case 0x16f3: -case 0x16f4: -case 0x16f5: -case 0x16f6: -case 0x16f7: -case 0x18f0: -case 0x18f1: -case 0x18f2: -case 0x18f3: -case 0x18f4: -case 0x18f5: -case 0x18f6: -case 0x18f7: -case 0x1af0: -case 0x1af1: -case 0x1af2: -case 0x1af3: -case 0x1af4: -case 0x1af5: -case 0x1af6: -case 0x1af7: -case 0x1cf0: -case 0x1cf1: -case 0x1cf2: -case 0x1cf3: -case 0x1cf4: -case 0x1cf5: -case 0x1cf6: -case 0x1cf7: -case 0x1ef0: -case 0x1ef1: -case 0x1ef2: -case 0x1ef3: -case 0x1ef4: -case 0x1ef5: -case 0x1ef6: -case 0x1ef7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1130: -case 0x1131: -case 0x1132: -case 0x1133: -case 0x1134: -case 0x1135: -case 0x1136: -case 0x1137: -case 0x1330: -case 0x1331: -case 0x1332: -case 0x1333: -case 0x1334: -case 0x1335: -case 0x1336: -case 0x1337: -case 0x1530: -case 0x1531: -case 0x1532: -case 0x1533: -case 0x1534: -case 0x1535: -case 0x1536: -case 0x1537: -case 0x1730: -case 0x1731: -case 0x1732: -case 0x1733: -case 0x1734: -case 0x1735: -case 0x1736: -case 0x1737: -case 0x1930: -case 0x1931: -case 0x1932: -case 0x1933: -case 0x1934: -case 0x1935: -case 0x1936: -case 0x1937: -case 0x1b30: -case 0x1b31: -case 0x1b32: -case 0x1b33: -case 0x1b34: -case 0x1b35: -case 0x1b36: -case 0x1b37: -case 0x1d30: -case 0x1d31: -case 0x1d32: -case 0x1d33: -case 0x1d34: -case 0x1d35: -case 0x1d36: -case 0x1d37: -case 0x1f30: -case 0x1f31: -case 0x1f32: -case 0x1f33: -case 0x1f34: -case 0x1f35: -case 0x1f36: -case 0x1f37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd030: -case 0xd031: -case 0xd032: -case 0xd033: -case 0xd034: -case 0xd035: -case 0xd036: -case 0xd037: -case 0xd230: -case 0xd231: -case 0xd232: -case 0xd233: -case 0xd234: -case 0xd235: -case 0xd236: -case 0xd237: -case 0xd430: -case 0xd431: -case 0xd432: -case 0xd433: -case 0xd434: -case 0xd435: -case 0xd436: -case 0xd437: -case 0xd630: -case 0xd631: -case 0xd632: -case 0xd633: -case 0xd634: -case 0xd635: -case 0xd636: -case 0xd637: -case 0xd830: -case 0xd831: -case 0xd832: -case 0xd833: -case 0xd834: -case 0xd835: -case 0xd836: -case 0xd837: -case 0xda30: -case 0xda31: -case 0xda32: -case 0xda33: -case 0xda34: -case 0xda35: -case 0xda36: -case 0xda37: -case 0xdc30: -case 0xdc31: -case 0xdc32: -case 0xdc33: -case 0xdc34: -case 0xdc35: -case 0xdc36: -case 0xdc37: -case 0xde30: -case 0xde31: -case 0xde32: -case 0xde33: -case 0xde34: -case 0xde35: -case 0xde36: -case 0xde37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc030: -case 0xc031: -case 0xc032: -case 0xc033: -case 0xc034: -case 0xc035: -case 0xc036: -case 0xc037: -case 0xc230: -case 0xc231: -case 0xc232: -case 0xc233: -case 0xc234: -case 0xc235: -case 0xc236: -case 0xc237: -case 0xc430: -case 0xc431: -case 0xc432: -case 0xc433: -case 0xc434: -case 0xc435: -case 0xc436: -case 0xc437: -case 0xc630: -case 0xc631: -case 0xc632: -case 0xc633: -case 0xc634: -case 0xc635: -case 0xc636: -case 0xc637: -case 0xc830: -case 0xc831: -case 0xc832: -case 0xc833: -case 0xc834: -case 0xc835: -case 0xc836: -case 0xc837: -case 0xca30: -case 0xca31: -case 0xca32: -case 0xca33: -case 0xca34: -case 0xca35: -case 0xca36: -case 0xca37: -case 0xcc30: -case 0xcc31: -case 0xcc32: -case 0xcc33: -case 0xcc34: -case 0xcc35: -case 0xcc36: -case 0xcc37: -case 0xce30: -case 0xce31: -case 0xce32: -case 0xce33: -case 0xce34: -case 0xce35: -case 0xce36: -case 0xce37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb030: -case 0xb031: -case 0xb032: -case 0xb033: -case 0xb034: -case 0xb035: -case 0xb036: -case 0xb037: -case 0xb230: -case 0xb231: -case 0xb232: -case 0xb233: -case 0xb234: -case 0xb235: -case 0xb236: -case 0xb237: -case 0xb430: -case 0xb431: -case 0xb432: -case 0xb433: -case 0xb434: -case 0xb435: -case 0xb436: -case 0xb437: -case 0xb630: -case 0xb631: -case 0xb632: -case 0xb633: -case 0xb634: -case 0xb635: -case 0xb636: -case 0xb637: -case 0xb830: -case 0xb831: -case 0xb832: -case 0xb833: -case 0xb834: -case 0xb835: -case 0xb836: -case 0xb837: -case 0xba30: -case 0xba31: -case 0xba32: -case 0xba33: -case 0xba34: -case 0xba35: -case 0xba36: -case 0xba37: -case 0xbc30: -case 0xbc31: -case 0xbc32: -case 0xbc33: -case 0xbc34: -case 0xbc35: -case 0xbc36: -case 0xbc37: -case 0xbe30: -case 0xbe31: -case 0xbe32: -case 0xbe33: -case 0xbe34: -case 0xbe35: -case 0xbe36: -case 0xbe37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x1030: -case 0x1031: -case 0x1032: -case 0x1033: -case 0x1034: -case 0x1035: -case 0x1036: -case 0x1037: -case 0x1230: -case 0x1231: -case 0x1232: -case 0x1233: -case 0x1234: -case 0x1235: -case 0x1236: -case 0x1237: -case 0x1430: -case 0x1431: -case 0x1432: -case 0x1433: -case 0x1434: -case 0x1435: -case 0x1436: -case 0x1437: -case 0x1630: -case 0x1631: -case 0x1632: -case 0x1633: -case 0x1634: -case 0x1635: -case 0x1636: -case 0x1637: -case 0x1830: -case 0x1831: -case 0x1832: -case 0x1833: -case 0x1834: -case 0x1835: -case 0x1836: -case 0x1837: -case 0x1a30: -case 0x1a31: -case 0x1a32: -case 0x1a33: -case 0x1a34: -case 0x1a35: -case 0x1a36: -case 0x1a37: -case 0x1c30: -case 0x1c31: -case 0x1c32: -case 0x1c33: -case 0x1c34: -case 0x1c35: -case 0x1c36: -case 0x1c37: -case 0x1e30: -case 0x1e31: -case 0x1e32: -case 0x1e33: -case 0x1e34: -case 0x1e35: -case 0x1e36: -case 0x1e37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8030: -case 0x8031: -case 0x8032: -case 0x8033: -case 0x8034: -case 0x8035: -case 0x8036: -case 0x8037: -case 0x8230: -case 0x8231: -case 0x8232: -case 0x8233: -case 0x8234: -case 0x8235: -case 0x8236: -case 0x8237: -case 0x8430: -case 0x8431: -case 0x8432: -case 0x8433: -case 0x8434: -case 0x8435: -case 0x8436: -case 0x8437: -case 0x8630: -case 0x8631: -case 0x8632: -case 0x8633: -case 0x8634: -case 0x8635: -case 0x8636: -case 0x8637: -case 0x8830: -case 0x8831: -case 0x8832: -case 0x8833: -case 0x8834: -case 0x8835: -case 0x8836: -case 0x8837: -case 0x8a30: -case 0x8a31: -case 0x8a32: -case 0x8a33: -case 0x8a34: -case 0x8a35: -case 0x8a36: -case 0x8a37: -case 0x8c30: -case 0x8c31: -case 0x8c32: -case 0x8c33: -case 0x8c34: -case 0x8c35: -case 0x8c36: -case 0x8c37: -case 0x8e30: -case 0x8e31: -case 0x8e32: -case 0x8e33: -case 0x8e34: -case 0x8e35: -case 0x8e36: -case 0x8e37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9030: -case 0x9031: -case 0x9032: -case 0x9033: -case 0x9034: -case 0x9035: -case 0x9036: -case 0x9037: -case 0x9230: -case 0x9231: -case 0x9232: -case 0x9233: -case 0x9234: -case 0x9235: -case 0x9236: -case 0x9237: -case 0x9430: -case 0x9431: -case 0x9432: -case 0x9433: -case 0x9434: -case 0x9435: -case 0x9436: -case 0x9437: -case 0x9630: -case 0x9631: -case 0x9632: -case 0x9633: -case 0x9634: -case 0x9635: -case 0x9636: -case 0x9637: -case 0x9830: -case 0x9831: -case 0x9832: -case 0x9833: -case 0x9834: -case 0x9835: -case 0x9836: -case 0x9837: -case 0x9a30: -case 0x9a31: -case 0x9a32: -case 0x9a33: -case 0x9a34: -case 0x9a35: -case 0x9a36: -case 0x9a37: -case 0x9c30: -case 0x9c31: -case 0x9c32: -case 0x9c33: -case 0x9c34: -case 0x9c35: -case 0x9c36: -case 0x9c37: -case 0x9e30: -case 0x9e31: -case 0x9e32: -case 0x9e33: -case 0x9e34: -case 0x9e35: -case 0x9e36: -case 0x9e37: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0170: -case 0x0171: -case 0x0172: -case 0x0173: -case 0x0174: -case 0x0175: -case 0x0176: -case 0x0177: -case 0x0370: -case 0x0371: -case 0x0372: -case 0x0373: -case 0x0374: -case 0x0375: -case 0x0376: -case 0x0377: -case 0x0570: -case 0x0571: -case 0x0572: -case 0x0573: -case 0x0574: -case 0x0575: -case 0x0576: -case 0x0577: -case 0x0770: -case 0x0771: -case 0x0772: -case 0x0773: -case 0x0774: -case 0x0775: -case 0x0776: -case 0x0777: -case 0x0970: -case 0x0971: -case 0x0972: -case 0x0973: -case 0x0974: -case 0x0975: -case 0x0976: -case 0x0977: -case 0x0b70: -case 0x0b71: -case 0x0b72: -case 0x0b73: -case 0x0b74: -case 0x0b75: -case 0x0b76: -case 0x0b77: -case 0x0d70: -case 0x0d71: -case 0x0d72: -case 0x0d73: -case 0x0d74: -case 0x0d75: -case 0x0d76: -case 0x0d77: -case 0x0f70: -case 0x0f71: -case 0x0f72: -case 0x0f73: -case 0x0f74: -case 0x0f75: -case 0x0f76: -case 0x0f77: - { - HAM targ(this, instr_b2_b0); BCHG(targ, D[instr_b11_b9]); - } - break; - -case 0x01b0: -case 0x01b1: -case 0x01b2: -case 0x01b3: -case 0x01b4: -case 0x01b5: -case 0x01b6: -case 0x01b7: -case 0x03b0: -case 0x03b1: -case 0x03b2: -case 0x03b3: -case 0x03b4: -case 0x03b5: -case 0x03b6: -case 0x03b7: -case 0x05b0: -case 0x05b1: -case 0x05b2: -case 0x05b3: -case 0x05b4: -case 0x05b5: -case 0x05b6: -case 0x05b7: -case 0x07b0: -case 0x07b1: -case 0x07b2: -case 0x07b3: -case 0x07b4: -case 0x07b5: -case 0x07b6: -case 0x07b7: -case 0x09b0: -case 0x09b1: -case 0x09b2: -case 0x09b3: -case 0x09b4: -case 0x09b5: -case 0x09b6: -case 0x09b7: -case 0x0bb0: -case 0x0bb1: -case 0x0bb2: -case 0x0bb3: -case 0x0bb4: -case 0x0bb5: -case 0x0bb6: -case 0x0bb7: -case 0x0db0: -case 0x0db1: -case 0x0db2: -case 0x0db3: -case 0x0db4: -case 0x0db5: -case 0x0db6: -case 0x0db7: -case 0x0fb0: -case 0x0fb1: -case 0x0fb2: -case 0x0fb3: -case 0x0fb4: -case 0x0fb5: -case 0x0fb6: -case 0x0fb7: - { - HAM targ(this, instr_b2_b0); BCLR(targ, D[instr_b11_b9]); - } - break; - -case 0x01f0: -case 0x01f1: -case 0x01f2: -case 0x01f3: -case 0x01f4: -case 0x01f5: -case 0x01f6: -case 0x01f7: -case 0x03f0: -case 0x03f1: -case 0x03f2: -case 0x03f3: -case 0x03f4: -case 0x03f5: -case 0x03f6: -case 0x03f7: -case 0x05f0: -case 0x05f1: -case 0x05f2: -case 0x05f3: -case 0x05f4: -case 0x05f5: -case 0x05f6: -case 0x05f7: -case 0x07f0: -case 0x07f1: -case 0x07f2: -case 0x07f3: -case 0x07f4: -case 0x07f5: -case 0x07f6: -case 0x07f7: -case 0x09f0: -case 0x09f1: -case 0x09f2: -case 0x09f3: -case 0x09f4: -case 0x09f5: -case 0x09f6: -case 0x09f7: -case 0x0bf0: -case 0x0bf1: -case 0x0bf2: -case 0x0bf3: -case 0x0bf4: -case 0x0bf5: -case 0x0bf6: -case 0x0bf7: -case 0x0df0: -case 0x0df1: -case 0x0df2: -case 0x0df3: -case 0x0df4: -case 0x0df5: -case 0x0df6: -case 0x0df7: -case 0x0ff0: -case 0x0ff1: -case 0x0ff2: -case 0x0ff3: -case 0x0ff4: -case 0x0ff5: -case 0x0ff6: -case 0x0ff7: - { - HAM targ(this, instr_b2_b0); BSET(targ, D[instr_b11_b9]); - } - break; - -case 0x0130: -case 0x0131: -case 0x0132: -case 0x0133: -case 0x0134: -case 0x0135: -case 0x0136: -case 0x0137: -case 0x0330: -case 0x0331: -case 0x0332: -case 0x0333: -case 0x0334: -case 0x0335: -case 0x0336: -case 0x0337: -case 0x0530: -case 0x0531: -case 0x0532: -case 0x0533: -case 0x0534: -case 0x0535: -case 0x0536: -case 0x0537: -case 0x0730: -case 0x0731: -case 0x0732: -case 0x0733: -case 0x0734: -case 0x0735: -case 0x0736: -case 0x0737: -case 0x0930: -case 0x0931: -case 0x0932: -case 0x0933: -case 0x0934: -case 0x0935: -case 0x0936: -case 0x0937: -case 0x0b30: -case 0x0b31: -case 0x0b32: -case 0x0b33: -case 0x0b34: -case 0x0b35: -case 0x0b36: -case 0x0b37: -case 0x0d30: -case 0x0d31: -case 0x0d32: -case 0x0d33: -case 0x0d34: -case 0x0d35: -case 0x0d36: -case 0x0d37: -case 0x0f30: -case 0x0f31: -case 0x0f32: -case 0x0f33: -case 0x0f34: -case 0x0f35: -case 0x0f36: -case 0x0f37: - { - HAM targ(this, instr_b2_b0); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0x4218: -case 0x4219: -case 0x421a: -case 0x421b: -case 0x421c: -case 0x421d: -case 0x421e: -case 0x421f: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4818: -case 0x4819: -case 0x481a: -case 0x481b: -case 0x481c: -case 0x481d: -case 0x481e: -case 0x481f: - { - HAM dst(this, instr_b2_b0); NBCD(dst); - } - break; - -case 0x4418: -case 0x4419: -case 0x441a: -case 0x441b: -case 0x441c: -case 0x441d: -case 0x441e: -case 0x441f: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4018: -case 0x4019: -case 0x401a: -case 0x401b: -case 0x401c: -case 0x401d: -case 0x401e: -case 0x401f: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4618: -case 0x4619: -case 0x461a: -case 0x461b: -case 0x461c: -case 0x461d: -case 0x461e: -case 0x461f: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x50d8: -case 0x50d9: -case 0x50da: -case 0x50db: -case 0x50dc: -case 0x50dd: -case 0x50de: -case 0x50df: - { - HAM dst(this, instr_b2_b0); Scc<0x00>(dst); - } - break; - -case 0x51d8: -case 0x51d9: -case 0x51da: -case 0x51db: -case 0x51dc: -case 0x51dd: -case 0x51de: -case 0x51df: - { - HAM dst(this, instr_b2_b0); Scc<0x01>(dst); - } - break; - -case 0x52d8: -case 0x52d9: -case 0x52da: -case 0x52db: -case 0x52dc: -case 0x52dd: -case 0x52de: -case 0x52df: - { - HAM dst(this, instr_b2_b0); Scc<0x02>(dst); - } - break; - -case 0x53d8: -case 0x53d9: -case 0x53da: -case 0x53db: -case 0x53dc: -case 0x53dd: -case 0x53de: -case 0x53df: - { - HAM dst(this, instr_b2_b0); Scc<0x03>(dst); - } - break; - -case 0x54d8: -case 0x54d9: -case 0x54da: -case 0x54db: -case 0x54dc: -case 0x54dd: -case 0x54de: -case 0x54df: - { - HAM dst(this, instr_b2_b0); Scc<0x04>(dst); - } - break; - -case 0x55d8: -case 0x55d9: -case 0x55da: -case 0x55db: -case 0x55dc: -case 0x55dd: -case 0x55de: -case 0x55df: - { - HAM dst(this, instr_b2_b0); Scc<0x05>(dst); - } - break; - -case 0x56d8: -case 0x56d9: -case 0x56da: -case 0x56db: -case 0x56dc: -case 0x56dd: -case 0x56de: -case 0x56df: - { - HAM dst(this, instr_b2_b0); Scc<0x06>(dst); - } - break; - -case 0x57d8: -case 0x57d9: -case 0x57da: -case 0x57db: -case 0x57dc: -case 0x57dd: -case 0x57de: -case 0x57df: - { - HAM dst(this, instr_b2_b0); Scc<0x07>(dst); - } - break; - -case 0x58d8: -case 0x58d9: -case 0x58da: -case 0x58db: -case 0x58dc: -case 0x58dd: -case 0x58de: -case 0x58df: - { - HAM dst(this, instr_b2_b0); Scc<0x08>(dst); - } - break; - -case 0x59d8: -case 0x59d9: -case 0x59da: -case 0x59db: -case 0x59dc: -case 0x59dd: -case 0x59de: -case 0x59df: - { - HAM dst(this, instr_b2_b0); Scc<0x09>(dst); - } - break; - -case 0x5ad8: -case 0x5ad9: -case 0x5ada: -case 0x5adb: -case 0x5adc: -case 0x5add: -case 0x5ade: -case 0x5adf: - { - HAM dst(this, instr_b2_b0); Scc<0x0a>(dst); - } - break; - -case 0x5bd8: -case 0x5bd9: -case 0x5bda: -case 0x5bdb: -case 0x5bdc: -case 0x5bdd: -case 0x5bde: -case 0x5bdf: - { - HAM dst(this, instr_b2_b0); Scc<0x0b>(dst); - } - break; - -case 0x5cd8: -case 0x5cd9: -case 0x5cda: -case 0x5cdb: -case 0x5cdc: -case 0x5cdd: -case 0x5cde: -case 0x5cdf: - { - HAM dst(this, instr_b2_b0); Scc<0x0c>(dst); - } - break; - -case 0x5dd8: -case 0x5dd9: -case 0x5dda: -case 0x5ddb: -case 0x5ddc: -case 0x5ddd: -case 0x5dde: -case 0x5ddf: - { - HAM dst(this, instr_b2_b0); Scc<0x0d>(dst); - } - break; - -case 0x5ed8: -case 0x5ed9: -case 0x5eda: -case 0x5edb: -case 0x5edc: -case 0x5edd: -case 0x5ede: -case 0x5edf: - { - HAM dst(this, instr_b2_b0); Scc<0x0e>(dst); - } - break; - -case 0x5fd8: -case 0x5fd9: -case 0x5fda: -case 0x5fdb: -case 0x5fdc: -case 0x5fdd: -case 0x5fde: -case 0x5fdf: - { - HAM dst(this, instr_b2_b0); Scc<0x0f>(dst); - } - break; - -case 0x4ad8: -case 0x4ad9: -case 0x4ada: -case 0x4adb: -case 0x4adc: -case 0x4add: -case 0x4ade: -case 0x4adf: - { - HAM dst(this, instr_b2_b0); TAS(dst); - } - break; - -case 0x4a18: -case 0x4a19: -case 0x4a1a: -case 0x4a1b: -case 0x4a1c: -case 0x4a1d: -case 0x4a1e: -case 0x4a1f: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x13d8: -case 0x13d9: -case 0x13da: -case 0x13db: -case 0x13dc: -case 0x13dd: -case 0x13de: -case 0x13df: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11d8: -case 0x11d9: -case 0x11da: -case 0x11db: -case 0x11dc: -case 0x11dd: -case 0x11de: -case 0x11df: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x1098: -case 0x1099: -case 0x109a: -case 0x109b: -case 0x109c: -case 0x109d: -case 0x109e: -case 0x109f: -case 0x1298: -case 0x1299: -case 0x129a: -case 0x129b: -case 0x129c: -case 0x129d: -case 0x129e: -case 0x129f: -case 0x1498: -case 0x1499: -case 0x149a: -case 0x149b: -case 0x149c: -case 0x149d: -case 0x149e: -case 0x149f: -case 0x1698: -case 0x1699: -case 0x169a: -case 0x169b: -case 0x169c: -case 0x169d: -case 0x169e: -case 0x169f: -case 0x1898: -case 0x1899: -case 0x189a: -case 0x189b: -case 0x189c: -case 0x189d: -case 0x189e: -case 0x189f: -case 0x1a98: -case 0x1a99: -case 0x1a9a: -case 0x1a9b: -case 0x1a9c: -case 0x1a9d: -case 0x1a9e: -case 0x1a9f: -case 0x1c98: -case 0x1c99: -case 0x1c9a: -case 0x1c9b: -case 0x1c9c: -case 0x1c9d: -case 0x1c9e: -case 0x1c9f: -case 0x1e98: -case 0x1e99: -case 0x1e9a: -case 0x1e9b: -case 0x1e9c: -case 0x1e9d: -case 0x1e9e: -case 0x1e9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1158: -case 0x1159: -case 0x115a: -case 0x115b: -case 0x115c: -case 0x115d: -case 0x115e: -case 0x115f: -case 0x1358: -case 0x1359: -case 0x135a: -case 0x135b: -case 0x135c: -case 0x135d: -case 0x135e: -case 0x135f: -case 0x1558: -case 0x1559: -case 0x155a: -case 0x155b: -case 0x155c: -case 0x155d: -case 0x155e: -case 0x155f: -case 0x1758: -case 0x1759: -case 0x175a: -case 0x175b: -case 0x175c: -case 0x175d: -case 0x175e: -case 0x175f: -case 0x1958: -case 0x1959: -case 0x195a: -case 0x195b: -case 0x195c: -case 0x195d: -case 0x195e: -case 0x195f: -case 0x1b58: -case 0x1b59: -case 0x1b5a: -case 0x1b5b: -case 0x1b5c: -case 0x1b5d: -case 0x1b5e: -case 0x1b5f: -case 0x1d58: -case 0x1d59: -case 0x1d5a: -case 0x1d5b: -case 0x1d5c: -case 0x1d5d: -case 0x1d5e: -case 0x1d5f: -case 0x1f58: -case 0x1f59: -case 0x1f5a: -case 0x1f5b: -case 0x1f5c: -case 0x1f5d: -case 0x1f5e: -case 0x1f5f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1198: -case 0x1199: -case 0x119a: -case 0x119b: -case 0x119c: -case 0x119d: -case 0x119e: -case 0x119f: -case 0x1398: -case 0x1399: -case 0x139a: -case 0x139b: -case 0x139c: -case 0x139d: -case 0x139e: -case 0x139f: -case 0x1598: -case 0x1599: -case 0x159a: -case 0x159b: -case 0x159c: -case 0x159d: -case 0x159e: -case 0x159f: -case 0x1798: -case 0x1799: -case 0x179a: -case 0x179b: -case 0x179c: -case 0x179d: -case 0x179e: -case 0x179f: -case 0x1998: -case 0x1999: -case 0x199a: -case 0x199b: -case 0x199c: -case 0x199d: -case 0x199e: -case 0x199f: -case 0x1b98: -case 0x1b99: -case 0x1b9a: -case 0x1b9b: -case 0x1b9c: -case 0x1b9d: -case 0x1b9e: -case 0x1b9f: -case 0x1d98: -case 0x1d99: -case 0x1d9a: -case 0x1d9b: -case 0x1d9c: -case 0x1d9d: -case 0x1d9e: -case 0x1d9f: -case 0x1f98: -case 0x1f99: -case 0x1f9a: -case 0x1f9b: -case 0x1f9c: -case 0x1f9d: -case 0x1f9e: -case 0x1f9f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xb108: -case 0xb109: -case 0xb10a: -case 0xb10b: -case 0xb10c: -case 0xb10d: -case 0xb10e: -case 0xb10f: -case 0xb308: -case 0xb309: -case 0xb30a: -case 0xb30b: -case 0xb30c: -case 0xb30d: -case 0xb30e: -case 0xb30f: -case 0xb508: -case 0xb509: -case 0xb50a: -case 0xb50b: -case 0xb50c: -case 0xb50d: -case 0xb50e: -case 0xb50f: -case 0xb708: -case 0xb709: -case 0xb70a: -case 0xb70b: -case 0xb70c: -case 0xb70d: -case 0xb70e: -case 0xb70f: -case 0xb908: -case 0xb909: -case 0xb90a: -case 0xb90b: -case 0xb90c: -case 0xb90d: -case 0xb90e: -case 0xb90f: -case 0xbb08: -case 0xbb09: -case 0xbb0a: -case 0xbb0b: -case 0xbb0c: -case 0xbb0d: -case 0xbb0e: -case 0xbb0f: -case 0xbd08: -case 0xbd09: -case 0xbd0a: -case 0xbd0b: -case 0xbd0c: -case 0xbd0d: -case 0xbd0e: -case 0xbd0f: -case 0xbf08: -case 0xbf09: -case 0xbf0a: -case 0xbf0b: -case 0xbf0c: -case 0xbf0d: -case 0xbf0e: -case 0xbf0f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x10d8: -case 0x10d9: -case 0x10da: -case 0x10db: -case 0x10dc: -case 0x10dd: -case 0x10de: -case 0x10df: -case 0x12d8: -case 0x12d9: -case 0x12da: -case 0x12db: -case 0x12dc: -case 0x12dd: -case 0x12de: -case 0x12df: -case 0x14d8: -case 0x14d9: -case 0x14da: -case 0x14db: -case 0x14dc: -case 0x14dd: -case 0x14de: -case 0x14df: -case 0x16d8: -case 0x16d9: -case 0x16da: -case 0x16db: -case 0x16dc: -case 0x16dd: -case 0x16de: -case 0x16df: -case 0x18d8: -case 0x18d9: -case 0x18da: -case 0x18db: -case 0x18dc: -case 0x18dd: -case 0x18de: -case 0x18df: -case 0x1ad8: -case 0x1ad9: -case 0x1ada: -case 0x1adb: -case 0x1adc: -case 0x1add: -case 0x1ade: -case 0x1adf: -case 0x1cd8: -case 0x1cd9: -case 0x1cda: -case 0x1cdb: -case 0x1cdc: -case 0x1cdd: -case 0x1cde: -case 0x1cdf: -case 0x1ed8: -case 0x1ed9: -case 0x1eda: -case 0x1edb: -case 0x1edc: -case 0x1edd: -case 0x1ede: -case 0x1edf: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1118: -case 0x1119: -case 0x111a: -case 0x111b: -case 0x111c: -case 0x111d: -case 0x111e: -case 0x111f: -case 0x1318: -case 0x1319: -case 0x131a: -case 0x131b: -case 0x131c: -case 0x131d: -case 0x131e: -case 0x131f: -case 0x1518: -case 0x1519: -case 0x151a: -case 0x151b: -case 0x151c: -case 0x151d: -case 0x151e: -case 0x151f: -case 0x1718: -case 0x1719: -case 0x171a: -case 0x171b: -case 0x171c: -case 0x171d: -case 0x171e: -case 0x171f: -case 0x1918: -case 0x1919: -case 0x191a: -case 0x191b: -case 0x191c: -case 0x191d: -case 0x191e: -case 0x191f: -case 0x1b18: -case 0x1b19: -case 0x1b1a: -case 0x1b1b: -case 0x1b1c: -case 0x1b1d: -case 0x1b1e: -case 0x1b1f: -case 0x1d18: -case 0x1d19: -case 0x1d1a: -case 0x1d1b: -case 0x1d1c: -case 0x1d1d: -case 0x1d1e: -case 0x1d1f: -case 0x1f18: -case 0x1f19: -case 0x1f1a: -case 0x1f1b: -case 0x1f1c: -case 0x1f1d: -case 0x1f1e: -case 0x1f1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd018: -case 0xd019: -case 0xd01a: -case 0xd01b: -case 0xd01c: -case 0xd01d: -case 0xd01e: -case 0xd01f: -case 0xd218: -case 0xd219: -case 0xd21a: -case 0xd21b: -case 0xd21c: -case 0xd21d: -case 0xd21e: -case 0xd21f: -case 0xd418: -case 0xd419: -case 0xd41a: -case 0xd41b: -case 0xd41c: -case 0xd41d: -case 0xd41e: -case 0xd41f: -case 0xd618: -case 0xd619: -case 0xd61a: -case 0xd61b: -case 0xd61c: -case 0xd61d: -case 0xd61e: -case 0xd61f: -case 0xd818: -case 0xd819: -case 0xd81a: -case 0xd81b: -case 0xd81c: -case 0xd81d: -case 0xd81e: -case 0xd81f: -case 0xda18: -case 0xda19: -case 0xda1a: -case 0xda1b: -case 0xda1c: -case 0xda1d: -case 0xda1e: -case 0xda1f: -case 0xdc18: -case 0xdc19: -case 0xdc1a: -case 0xdc1b: -case 0xdc1c: -case 0xdc1d: -case 0xdc1e: -case 0xdc1f: -case 0xde18: -case 0xde19: -case 0xde1a: -case 0xde1b: -case 0xde1c: -case 0xde1d: -case 0xde1e: -case 0xde1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc018: -case 0xc019: -case 0xc01a: -case 0xc01b: -case 0xc01c: -case 0xc01d: -case 0xc01e: -case 0xc01f: -case 0xc218: -case 0xc219: -case 0xc21a: -case 0xc21b: -case 0xc21c: -case 0xc21d: -case 0xc21e: -case 0xc21f: -case 0xc418: -case 0xc419: -case 0xc41a: -case 0xc41b: -case 0xc41c: -case 0xc41d: -case 0xc41e: -case 0xc41f: -case 0xc618: -case 0xc619: -case 0xc61a: -case 0xc61b: -case 0xc61c: -case 0xc61d: -case 0xc61e: -case 0xc61f: -case 0xc818: -case 0xc819: -case 0xc81a: -case 0xc81b: -case 0xc81c: -case 0xc81d: -case 0xc81e: -case 0xc81f: -case 0xca18: -case 0xca19: -case 0xca1a: -case 0xca1b: -case 0xca1c: -case 0xca1d: -case 0xca1e: -case 0xca1f: -case 0xcc18: -case 0xcc19: -case 0xcc1a: -case 0xcc1b: -case 0xcc1c: -case 0xcc1d: -case 0xcc1e: -case 0xcc1f: -case 0xce18: -case 0xce19: -case 0xce1a: -case 0xce1b: -case 0xce1c: -case 0xce1d: -case 0xce1e: -case 0xce1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb018: -case 0xb019: -case 0xb01a: -case 0xb01b: -case 0xb01c: -case 0xb01d: -case 0xb01e: -case 0xb01f: -case 0xb218: -case 0xb219: -case 0xb21a: -case 0xb21b: -case 0xb21c: -case 0xb21d: -case 0xb21e: -case 0xb21f: -case 0xb418: -case 0xb419: -case 0xb41a: -case 0xb41b: -case 0xb41c: -case 0xb41d: -case 0xb41e: -case 0xb41f: -case 0xb618: -case 0xb619: -case 0xb61a: -case 0xb61b: -case 0xb61c: -case 0xb61d: -case 0xb61e: -case 0xb61f: -case 0xb818: -case 0xb819: -case 0xb81a: -case 0xb81b: -case 0xb81c: -case 0xb81d: -case 0xb81e: -case 0xb81f: -case 0xba18: -case 0xba19: -case 0xba1a: -case 0xba1b: -case 0xba1c: -case 0xba1d: -case 0xba1e: -case 0xba1f: -case 0xbc18: -case 0xbc19: -case 0xbc1a: -case 0xbc1b: -case 0xbc1c: -case 0xbc1d: -case 0xbc1e: -case 0xbc1f: -case 0xbe18: -case 0xbe19: -case 0xbe1a: -case 0xbe1b: -case 0xbe1c: -case 0xbe1d: -case 0xbe1e: -case 0xbe1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x1018: -case 0x1019: -case 0x101a: -case 0x101b: -case 0x101c: -case 0x101d: -case 0x101e: -case 0x101f: -case 0x1218: -case 0x1219: -case 0x121a: -case 0x121b: -case 0x121c: -case 0x121d: -case 0x121e: -case 0x121f: -case 0x1418: -case 0x1419: -case 0x141a: -case 0x141b: -case 0x141c: -case 0x141d: -case 0x141e: -case 0x141f: -case 0x1618: -case 0x1619: -case 0x161a: -case 0x161b: -case 0x161c: -case 0x161d: -case 0x161e: -case 0x161f: -case 0x1818: -case 0x1819: -case 0x181a: -case 0x181b: -case 0x181c: -case 0x181d: -case 0x181e: -case 0x181f: -case 0x1a18: -case 0x1a19: -case 0x1a1a: -case 0x1a1b: -case 0x1a1c: -case 0x1a1d: -case 0x1a1e: -case 0x1a1f: -case 0x1c18: -case 0x1c19: -case 0x1c1a: -case 0x1c1b: -case 0x1c1c: -case 0x1c1d: -case 0x1c1e: -case 0x1c1f: -case 0x1e18: -case 0x1e19: -case 0x1e1a: -case 0x1e1b: -case 0x1e1c: -case 0x1e1d: -case 0x1e1e: -case 0x1e1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8018: -case 0x8019: -case 0x801a: -case 0x801b: -case 0x801c: -case 0x801d: -case 0x801e: -case 0x801f: -case 0x8218: -case 0x8219: -case 0x821a: -case 0x821b: -case 0x821c: -case 0x821d: -case 0x821e: -case 0x821f: -case 0x8418: -case 0x8419: -case 0x841a: -case 0x841b: -case 0x841c: -case 0x841d: -case 0x841e: -case 0x841f: -case 0x8618: -case 0x8619: -case 0x861a: -case 0x861b: -case 0x861c: -case 0x861d: -case 0x861e: -case 0x861f: -case 0x8818: -case 0x8819: -case 0x881a: -case 0x881b: -case 0x881c: -case 0x881d: -case 0x881e: -case 0x881f: -case 0x8a18: -case 0x8a19: -case 0x8a1a: -case 0x8a1b: -case 0x8a1c: -case 0x8a1d: -case 0x8a1e: -case 0x8a1f: -case 0x8c18: -case 0x8c19: -case 0x8c1a: -case 0x8c1b: -case 0x8c1c: -case 0x8c1d: -case 0x8c1e: -case 0x8c1f: -case 0x8e18: -case 0x8e19: -case 0x8e1a: -case 0x8e1b: -case 0x8e1c: -case 0x8e1d: -case 0x8e1e: -case 0x8e1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9018: -case 0x9019: -case 0x901a: -case 0x901b: -case 0x901c: -case 0x901d: -case 0x901e: -case 0x901f: -case 0x9218: -case 0x9219: -case 0x921a: -case 0x921b: -case 0x921c: -case 0x921d: -case 0x921e: -case 0x921f: -case 0x9418: -case 0x9419: -case 0x941a: -case 0x941b: -case 0x941c: -case 0x941d: -case 0x941e: -case 0x941f: -case 0x9618: -case 0x9619: -case 0x961a: -case 0x961b: -case 0x961c: -case 0x961d: -case 0x961e: -case 0x961f: -case 0x9818: -case 0x9819: -case 0x981a: -case 0x981b: -case 0x981c: -case 0x981d: -case 0x981e: -case 0x981f: -case 0x9a18: -case 0x9a19: -case 0x9a1a: -case 0x9a1b: -case 0x9a1c: -case 0x9a1d: -case 0x9a1e: -case 0x9a1f: -case 0x9c18: -case 0x9c19: -case 0x9c1a: -case 0x9c1b: -case 0x9c1c: -case 0x9c1d: -case 0x9c1e: -case 0x9c1f: -case 0x9e18: -case 0x9e19: -case 0x9e1a: -case 0x9e1b: -case 0x9e1c: -case 0x9e1d: -case 0x9e1e: -case 0x9e1f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0158: -case 0x0159: -case 0x015a: -case 0x015b: -case 0x015c: -case 0x015d: -case 0x015e: -case 0x015f: -case 0x0358: -case 0x0359: -case 0x035a: -case 0x035b: -case 0x035c: -case 0x035d: -case 0x035e: -case 0x035f: -case 0x0558: -case 0x0559: -case 0x055a: -case 0x055b: -case 0x055c: -case 0x055d: -case 0x055e: -case 0x055f: -case 0x0758: -case 0x0759: -case 0x075a: -case 0x075b: -case 0x075c: -case 0x075d: -case 0x075e: -case 0x075f: -case 0x0958: -case 0x0959: -case 0x095a: -case 0x095b: -case 0x095c: -case 0x095d: -case 0x095e: -case 0x095f: -case 0x0b58: -case 0x0b59: -case 0x0b5a: -case 0x0b5b: -case 0x0b5c: -case 0x0b5d: -case 0x0b5e: -case 0x0b5f: -case 0x0d58: -case 0x0d59: -case 0x0d5a: -case 0x0d5b: -case 0x0d5c: -case 0x0d5d: -case 0x0d5e: -case 0x0d5f: -case 0x0f58: -case 0x0f59: -case 0x0f5a: -case 0x0f5b: -case 0x0f5c: -case 0x0f5d: -case 0x0f5e: -case 0x0f5f: - { - HAM targ(this, instr_b2_b0); BCHG(targ, D[instr_b11_b9]); - } - break; - -case 0x0198: -case 0x0199: -case 0x019a: -case 0x019b: -case 0x019c: -case 0x019d: -case 0x019e: -case 0x019f: -case 0x0398: -case 0x0399: -case 0x039a: -case 0x039b: -case 0x039c: -case 0x039d: -case 0x039e: -case 0x039f: -case 0x0598: -case 0x0599: -case 0x059a: -case 0x059b: -case 0x059c: -case 0x059d: -case 0x059e: -case 0x059f: -case 0x0798: -case 0x0799: -case 0x079a: -case 0x079b: -case 0x079c: -case 0x079d: -case 0x079e: -case 0x079f: -case 0x0998: -case 0x0999: -case 0x099a: -case 0x099b: -case 0x099c: -case 0x099d: -case 0x099e: -case 0x099f: -case 0x0b98: -case 0x0b99: -case 0x0b9a: -case 0x0b9b: -case 0x0b9c: -case 0x0b9d: -case 0x0b9e: -case 0x0b9f: -case 0x0d98: -case 0x0d99: -case 0x0d9a: -case 0x0d9b: -case 0x0d9c: -case 0x0d9d: -case 0x0d9e: -case 0x0d9f: -case 0x0f98: -case 0x0f99: -case 0x0f9a: -case 0x0f9b: -case 0x0f9c: -case 0x0f9d: -case 0x0f9e: -case 0x0f9f: - { - HAM targ(this, instr_b2_b0); BCLR(targ, D[instr_b11_b9]); - } - break; - -case 0x01d8: -case 0x01d9: -case 0x01da: -case 0x01db: -case 0x01dc: -case 0x01dd: -case 0x01de: -case 0x01df: -case 0x03d8: -case 0x03d9: -case 0x03da: -case 0x03db: -case 0x03dc: -case 0x03dd: -case 0x03de: -case 0x03df: -case 0x05d8: -case 0x05d9: -case 0x05da: -case 0x05db: -case 0x05dc: -case 0x05dd: -case 0x05de: -case 0x05df: -case 0x07d8: -case 0x07d9: -case 0x07da: -case 0x07db: -case 0x07dc: -case 0x07dd: -case 0x07de: -case 0x07df: -case 0x09d8: -case 0x09d9: -case 0x09da: -case 0x09db: -case 0x09dc: -case 0x09dd: -case 0x09de: -case 0x09df: -case 0x0bd8: -case 0x0bd9: -case 0x0bda: -case 0x0bdb: -case 0x0bdc: -case 0x0bdd: -case 0x0bde: -case 0x0bdf: -case 0x0dd8: -case 0x0dd9: -case 0x0dda: -case 0x0ddb: -case 0x0ddc: -case 0x0ddd: -case 0x0dde: -case 0x0ddf: -case 0x0fd8: -case 0x0fd9: -case 0x0fda: -case 0x0fdb: -case 0x0fdc: -case 0x0fdd: -case 0x0fde: -case 0x0fdf: - { - HAM targ(this, instr_b2_b0); BSET(targ, D[instr_b11_b9]); - } - break; - -case 0x0118: -case 0x0119: -case 0x011a: -case 0x011b: -case 0x011c: -case 0x011d: -case 0x011e: -case 0x011f: -case 0x0318: -case 0x0319: -case 0x031a: -case 0x031b: -case 0x031c: -case 0x031d: -case 0x031e: -case 0x031f: -case 0x0518: -case 0x0519: -case 0x051a: -case 0x051b: -case 0x051c: -case 0x051d: -case 0x051e: -case 0x051f: -case 0x0718: -case 0x0719: -case 0x071a: -case 0x071b: -case 0x071c: -case 0x071d: -case 0x071e: -case 0x071f: -case 0x0918: -case 0x0919: -case 0x091a: -case 0x091b: -case 0x091c: -case 0x091d: -case 0x091e: -case 0x091f: -case 0x0b18: -case 0x0b19: -case 0x0b1a: -case 0x0b1b: -case 0x0b1c: -case 0x0b1d: -case 0x0b1e: -case 0x0b1f: -case 0x0d18: -case 0x0d19: -case 0x0d1a: -case 0x0d1b: -case 0x0d1c: -case 0x0d1d: -case 0x0d1e: -case 0x0d1f: -case 0x0f18: -case 0x0f19: -case 0x0f1a: -case 0x0f1b: -case 0x0f1c: -case 0x0f1d: -case 0x0f1e: -case 0x0f1f: - { - HAM targ(this, instr_b2_b0); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0x4220: -case 0x4221: -case 0x4222: -case 0x4223: -case 0x4224: -case 0x4225: -case 0x4226: -case 0x4227: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4820: -case 0x4821: -case 0x4822: -case 0x4823: -case 0x4824: -case 0x4825: -case 0x4826: -case 0x4827: - { - HAM dst(this, instr_b2_b0); NBCD(dst); - } - break; - -case 0x4420: -case 0x4421: -case 0x4422: -case 0x4423: -case 0x4424: -case 0x4425: -case 0x4426: -case 0x4427: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4020: -case 0x4021: -case 0x4022: -case 0x4023: -case 0x4024: -case 0x4025: -case 0x4026: -case 0x4027: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4620: -case 0x4621: -case 0x4622: -case 0x4623: -case 0x4624: -case 0x4625: -case 0x4626: -case 0x4627: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x50e0: -case 0x50e1: -case 0x50e2: -case 0x50e3: -case 0x50e4: -case 0x50e5: -case 0x50e6: -case 0x50e7: - { - HAM dst(this, instr_b2_b0); Scc<0x00>(dst); - } - break; - -case 0x51e0: -case 0x51e1: -case 0x51e2: -case 0x51e3: -case 0x51e4: -case 0x51e5: -case 0x51e6: -case 0x51e7: - { - HAM dst(this, instr_b2_b0); Scc<0x01>(dst); - } - break; - -case 0x52e0: -case 0x52e1: -case 0x52e2: -case 0x52e3: -case 0x52e4: -case 0x52e5: -case 0x52e6: -case 0x52e7: - { - HAM dst(this, instr_b2_b0); Scc<0x02>(dst); - } - break; - -case 0x53e0: -case 0x53e1: -case 0x53e2: -case 0x53e3: -case 0x53e4: -case 0x53e5: -case 0x53e6: -case 0x53e7: - { - HAM dst(this, instr_b2_b0); Scc<0x03>(dst); - } - break; - -case 0x54e0: -case 0x54e1: -case 0x54e2: -case 0x54e3: -case 0x54e4: -case 0x54e5: -case 0x54e6: -case 0x54e7: - { - HAM dst(this, instr_b2_b0); Scc<0x04>(dst); - } - break; - -case 0x55e0: -case 0x55e1: -case 0x55e2: -case 0x55e3: -case 0x55e4: -case 0x55e5: -case 0x55e6: -case 0x55e7: - { - HAM dst(this, instr_b2_b0); Scc<0x05>(dst); - } - break; - -case 0x56e0: -case 0x56e1: -case 0x56e2: -case 0x56e3: -case 0x56e4: -case 0x56e5: -case 0x56e6: -case 0x56e7: - { - HAM dst(this, instr_b2_b0); Scc<0x06>(dst); - } - break; - -case 0x57e0: -case 0x57e1: -case 0x57e2: -case 0x57e3: -case 0x57e4: -case 0x57e5: -case 0x57e6: -case 0x57e7: - { - HAM dst(this, instr_b2_b0); Scc<0x07>(dst); - } - break; - -case 0x58e0: -case 0x58e1: -case 0x58e2: -case 0x58e3: -case 0x58e4: -case 0x58e5: -case 0x58e6: -case 0x58e7: - { - HAM dst(this, instr_b2_b0); Scc<0x08>(dst); - } - break; - -case 0x59e0: -case 0x59e1: -case 0x59e2: -case 0x59e3: -case 0x59e4: -case 0x59e5: -case 0x59e6: -case 0x59e7: - { - HAM dst(this, instr_b2_b0); Scc<0x09>(dst); - } - break; - -case 0x5ae0: -case 0x5ae1: -case 0x5ae2: -case 0x5ae3: -case 0x5ae4: -case 0x5ae5: -case 0x5ae6: -case 0x5ae7: - { - HAM dst(this, instr_b2_b0); Scc<0x0a>(dst); - } - break; - -case 0x5be0: -case 0x5be1: -case 0x5be2: -case 0x5be3: -case 0x5be4: -case 0x5be5: -case 0x5be6: -case 0x5be7: - { - HAM dst(this, instr_b2_b0); Scc<0x0b>(dst); - } - break; - -case 0x5ce0: -case 0x5ce1: -case 0x5ce2: -case 0x5ce3: -case 0x5ce4: -case 0x5ce5: -case 0x5ce6: -case 0x5ce7: - { - HAM dst(this, instr_b2_b0); Scc<0x0c>(dst); - } - break; - -case 0x5de0: -case 0x5de1: -case 0x5de2: -case 0x5de3: -case 0x5de4: -case 0x5de5: -case 0x5de6: -case 0x5de7: - { - HAM dst(this, instr_b2_b0); Scc<0x0d>(dst); - } - break; - -case 0x5ee0: -case 0x5ee1: -case 0x5ee2: -case 0x5ee3: -case 0x5ee4: -case 0x5ee5: -case 0x5ee6: -case 0x5ee7: - { - HAM dst(this, instr_b2_b0); Scc<0x0e>(dst); - } - break; - -case 0x5fe0: -case 0x5fe1: -case 0x5fe2: -case 0x5fe3: -case 0x5fe4: -case 0x5fe5: -case 0x5fe6: -case 0x5fe7: - { - HAM dst(this, instr_b2_b0); Scc<0x0f>(dst); - } - break; - -case 0x4ae0: -case 0x4ae1: -case 0x4ae2: -case 0x4ae3: -case 0x4ae4: -case 0x4ae5: -case 0x4ae6: -case 0x4ae7: - { - HAM dst(this, instr_b2_b0); TAS(dst); - } - break; - -case 0x4a20: -case 0x4a21: -case 0x4a22: -case 0x4a23: -case 0x4a24: -case 0x4a25: -case 0x4a26: -case 0x4a27: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0x13e0: -case 0x13e1: -case 0x13e2: -case 0x13e3: -case 0x13e4: -case 0x13e5: -case 0x13e6: -case 0x13e7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11e0: -case 0x11e1: -case 0x11e2: -case 0x11e3: -case 0x11e4: -case 0x11e5: -case 0x11e6: -case 0x11e7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x10a0: -case 0x10a1: -case 0x10a2: -case 0x10a3: -case 0x10a4: -case 0x10a5: -case 0x10a6: -case 0x10a7: -case 0x12a0: -case 0x12a1: -case 0x12a2: -case 0x12a3: -case 0x12a4: -case 0x12a5: -case 0x12a6: -case 0x12a7: -case 0x14a0: -case 0x14a1: -case 0x14a2: -case 0x14a3: -case 0x14a4: -case 0x14a5: -case 0x14a6: -case 0x14a7: -case 0x16a0: -case 0x16a1: -case 0x16a2: -case 0x16a3: -case 0x16a4: -case 0x16a5: -case 0x16a6: -case 0x16a7: -case 0x18a0: -case 0x18a1: -case 0x18a2: -case 0x18a3: -case 0x18a4: -case 0x18a5: -case 0x18a6: -case 0x18a7: -case 0x1aa0: -case 0x1aa1: -case 0x1aa2: -case 0x1aa3: -case 0x1aa4: -case 0x1aa5: -case 0x1aa6: -case 0x1aa7: -case 0x1ca0: -case 0x1ca1: -case 0x1ca2: -case 0x1ca3: -case 0x1ca4: -case 0x1ca5: -case 0x1ca6: -case 0x1ca7: -case 0x1ea0: -case 0x1ea1: -case 0x1ea2: -case 0x1ea3: -case 0x1ea4: -case 0x1ea5: -case 0x1ea6: -case 0x1ea7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1160: -case 0x1161: -case 0x1162: -case 0x1163: -case 0x1164: -case 0x1165: -case 0x1166: -case 0x1167: -case 0x1360: -case 0x1361: -case 0x1362: -case 0x1363: -case 0x1364: -case 0x1365: -case 0x1366: -case 0x1367: -case 0x1560: -case 0x1561: -case 0x1562: -case 0x1563: -case 0x1564: -case 0x1565: -case 0x1566: -case 0x1567: -case 0x1760: -case 0x1761: -case 0x1762: -case 0x1763: -case 0x1764: -case 0x1765: -case 0x1766: -case 0x1767: -case 0x1960: -case 0x1961: -case 0x1962: -case 0x1963: -case 0x1964: -case 0x1965: -case 0x1966: -case 0x1967: -case 0x1b60: -case 0x1b61: -case 0x1b62: -case 0x1b63: -case 0x1b64: -case 0x1b65: -case 0x1b66: -case 0x1b67: -case 0x1d60: -case 0x1d61: -case 0x1d62: -case 0x1d63: -case 0x1d64: -case 0x1d65: -case 0x1d66: -case 0x1d67: -case 0x1f60: -case 0x1f61: -case 0x1f62: -case 0x1f63: -case 0x1f64: -case 0x1f65: -case 0x1f66: -case 0x1f67: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x11a0: -case 0x11a1: -case 0x11a2: -case 0x11a3: -case 0x11a4: -case 0x11a5: -case 0x11a6: -case 0x11a7: -case 0x13a0: -case 0x13a1: -case 0x13a2: -case 0x13a3: -case 0x13a4: -case 0x13a5: -case 0x13a6: -case 0x13a7: -case 0x15a0: -case 0x15a1: -case 0x15a2: -case 0x15a3: -case 0x15a4: -case 0x15a5: -case 0x15a6: -case 0x15a7: -case 0x17a0: -case 0x17a1: -case 0x17a2: -case 0x17a3: -case 0x17a4: -case 0x17a5: -case 0x17a6: -case 0x17a7: -case 0x19a0: -case 0x19a1: -case 0x19a2: -case 0x19a3: -case 0x19a4: -case 0x19a5: -case 0x19a6: -case 0x19a7: -case 0x1ba0: -case 0x1ba1: -case 0x1ba2: -case 0x1ba3: -case 0x1ba4: -case 0x1ba5: -case 0x1ba6: -case 0x1ba7: -case 0x1da0: -case 0x1da1: -case 0x1da2: -case 0x1da3: -case 0x1da4: -case 0x1da5: -case 0x1da6: -case 0x1da7: -case 0x1fa0: -case 0x1fa1: -case 0x1fa2: -case 0x1fa3: -case 0x1fa4: -case 0x1fa5: -case 0x1fa6: -case 0x1fa7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x10e0: -case 0x10e1: -case 0x10e2: -case 0x10e3: -case 0x10e4: -case 0x10e5: -case 0x10e6: -case 0x10e7: -case 0x12e0: -case 0x12e1: -case 0x12e2: -case 0x12e3: -case 0x12e4: -case 0x12e5: -case 0x12e6: -case 0x12e7: -case 0x14e0: -case 0x14e1: -case 0x14e2: -case 0x14e3: -case 0x14e4: -case 0x14e5: -case 0x14e6: -case 0x14e7: -case 0x16e0: -case 0x16e1: -case 0x16e2: -case 0x16e3: -case 0x16e4: -case 0x16e5: -case 0x16e6: -case 0x16e7: -case 0x18e0: -case 0x18e1: -case 0x18e2: -case 0x18e3: -case 0x18e4: -case 0x18e5: -case 0x18e6: -case 0x18e7: -case 0x1ae0: -case 0x1ae1: -case 0x1ae2: -case 0x1ae3: -case 0x1ae4: -case 0x1ae5: -case 0x1ae6: -case 0x1ae7: -case 0x1ce0: -case 0x1ce1: -case 0x1ce2: -case 0x1ce3: -case 0x1ce4: -case 0x1ce5: -case 0x1ce6: -case 0x1ce7: -case 0x1ee0: -case 0x1ee1: -case 0x1ee2: -case 0x1ee3: -case 0x1ee4: -case 0x1ee5: -case 0x1ee6: -case 0x1ee7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xc108: -case 0xc109: -case 0xc10a: -case 0xc10b: -case 0xc10c: -case 0xc10d: -case 0xc10e: -case 0xc10f: -case 0xc308: -case 0xc309: -case 0xc30a: -case 0xc30b: -case 0xc30c: -case 0xc30d: -case 0xc30e: -case 0xc30f: -case 0xc508: -case 0xc509: -case 0xc50a: -case 0xc50b: -case 0xc50c: -case 0xc50d: -case 0xc50e: -case 0xc50f: -case 0xc708: -case 0xc709: -case 0xc70a: -case 0xc70b: -case 0xc70c: -case 0xc70d: -case 0xc70e: -case 0xc70f: -case 0xc908: -case 0xc909: -case 0xc90a: -case 0xc90b: -case 0xc90c: -case 0xc90d: -case 0xc90e: -case 0xc90f: -case 0xcb08: -case 0xcb09: -case 0xcb0a: -case 0xcb0b: -case 0xcb0c: -case 0xcb0d: -case 0xcb0e: -case 0xcb0f: -case 0xcd08: -case 0xcd09: -case 0xcd0a: -case 0xcd0b: -case 0xcd0c: -case 0xcd0d: -case 0xcd0e: -case 0xcd0f: -case 0xcf08: -case 0xcf09: -case 0xcf0a: -case 0xcf0b: -case 0xcf0c: -case 0xcf0d: -case 0xcf0e: -case 0xcf0f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ABCD(src, dst); - } - break; - -case 0xd108: -case 0xd109: -case 0xd10a: -case 0xd10b: -case 0xd10c: -case 0xd10d: -case 0xd10e: -case 0xd10f: -case 0xd308: -case 0xd309: -case 0xd30a: -case 0xd30b: -case 0xd30c: -case 0xd30d: -case 0xd30e: -case 0xd30f: -case 0xd508: -case 0xd509: -case 0xd50a: -case 0xd50b: -case 0xd50c: -case 0xd50d: -case 0xd50e: -case 0xd50f: -case 0xd708: -case 0xd709: -case 0xd70a: -case 0xd70b: -case 0xd70c: -case 0xd70d: -case 0xd70e: -case 0xd70f: -case 0xd908: -case 0xd909: -case 0xd90a: -case 0xd90b: -case 0xd90c: -case 0xd90d: -case 0xd90e: -case 0xd90f: -case 0xdb08: -case 0xdb09: -case 0xdb0a: -case 0xdb0b: -case 0xdb0c: -case 0xdb0d: -case 0xdb0e: -case 0xdb0f: -case 0xdd08: -case 0xdd09: -case 0xdd0a: -case 0xdd0b: -case 0xdd0c: -case 0xdd0d: -case 0xdd0e: -case 0xdd0f: -case 0xdf08: -case 0xdf09: -case 0xdf0a: -case 0xdf0b: -case 0xdf0c: -case 0xdf0d: -case 0xdf0e: -case 0xdf0f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADDX(src, dst); - } - break; - -case 0x1120: -case 0x1121: -case 0x1122: -case 0x1123: -case 0x1124: -case 0x1125: -case 0x1126: -case 0x1127: -case 0x1320: -case 0x1321: -case 0x1322: -case 0x1323: -case 0x1324: -case 0x1325: -case 0x1326: -case 0x1327: -case 0x1520: -case 0x1521: -case 0x1522: -case 0x1523: -case 0x1524: -case 0x1525: -case 0x1526: -case 0x1527: -case 0x1720: -case 0x1721: -case 0x1722: -case 0x1723: -case 0x1724: -case 0x1725: -case 0x1726: -case 0x1727: -case 0x1920: -case 0x1921: -case 0x1922: -case 0x1923: -case 0x1924: -case 0x1925: -case 0x1926: -case 0x1927: -case 0x1b20: -case 0x1b21: -case 0x1b22: -case 0x1b23: -case 0x1b24: -case 0x1b25: -case 0x1b26: -case 0x1b27: -case 0x1d20: -case 0x1d21: -case 0x1d22: -case 0x1d23: -case 0x1d24: -case 0x1d25: -case 0x1d26: -case 0x1d27: -case 0x1f20: -case 0x1f21: -case 0x1f22: -case 0x1f23: -case 0x1f24: -case 0x1f25: -case 0x1f26: -case 0x1f27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8108: -case 0x8109: -case 0x810a: -case 0x810b: -case 0x810c: -case 0x810d: -case 0x810e: -case 0x810f: -case 0x8308: -case 0x8309: -case 0x830a: -case 0x830b: -case 0x830c: -case 0x830d: -case 0x830e: -case 0x830f: -case 0x8508: -case 0x8509: -case 0x850a: -case 0x850b: -case 0x850c: -case 0x850d: -case 0x850e: -case 0x850f: -case 0x8708: -case 0x8709: -case 0x870a: -case 0x870b: -case 0x870c: -case 0x870d: -case 0x870e: -case 0x870f: -case 0x8908: -case 0x8909: -case 0x890a: -case 0x890b: -case 0x890c: -case 0x890d: -case 0x890e: -case 0x890f: -case 0x8b08: -case 0x8b09: -case 0x8b0a: -case 0x8b0b: -case 0x8b0c: -case 0x8b0d: -case 0x8b0e: -case 0x8b0f: -case 0x8d08: -case 0x8d09: -case 0x8d0a: -case 0x8d0b: -case 0x8d0c: -case 0x8d0d: -case 0x8d0e: -case 0x8d0f: -case 0x8f08: -case 0x8f09: -case 0x8f0a: -case 0x8f0b: -case 0x8f0c: -case 0x8f0d: -case 0x8f0e: -case 0x8f0f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SBCD(src, dst); - } - break; - -case 0x9108: -case 0x9109: -case 0x910a: -case 0x910b: -case 0x910c: -case 0x910d: -case 0x910e: -case 0x910f: -case 0x9308: -case 0x9309: -case 0x930a: -case 0x930b: -case 0x930c: -case 0x930d: -case 0x930e: -case 0x930f: -case 0x9508: -case 0x9509: -case 0x950a: -case 0x950b: -case 0x950c: -case 0x950d: -case 0x950e: -case 0x950f: -case 0x9708: -case 0x9709: -case 0x970a: -case 0x970b: -case 0x970c: -case 0x970d: -case 0x970e: -case 0x970f: -case 0x9908: -case 0x9909: -case 0x990a: -case 0x990b: -case 0x990c: -case 0x990d: -case 0x990e: -case 0x990f: -case 0x9b08: -case 0x9b09: -case 0x9b0a: -case 0x9b0b: -case 0x9b0c: -case 0x9b0d: -case 0x9b0e: -case 0x9b0f: -case 0x9d08: -case 0x9d09: -case 0x9d0a: -case 0x9d0b: -case 0x9d0c: -case 0x9d0d: -case 0x9d0e: -case 0x9d0f: -case 0x9f08: -case 0x9f09: -case 0x9f0a: -case 0x9f0b: -case 0x9f0c: -case 0x9f0d: -case 0x9f0e: -case 0x9f0f: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUBX(src, dst); - } - break; - -case 0xd020: -case 0xd021: -case 0xd022: -case 0xd023: -case 0xd024: -case 0xd025: -case 0xd026: -case 0xd027: -case 0xd220: -case 0xd221: -case 0xd222: -case 0xd223: -case 0xd224: -case 0xd225: -case 0xd226: -case 0xd227: -case 0xd420: -case 0xd421: -case 0xd422: -case 0xd423: -case 0xd424: -case 0xd425: -case 0xd426: -case 0xd427: -case 0xd620: -case 0xd621: -case 0xd622: -case 0xd623: -case 0xd624: -case 0xd625: -case 0xd626: -case 0xd627: -case 0xd820: -case 0xd821: -case 0xd822: -case 0xd823: -case 0xd824: -case 0xd825: -case 0xd826: -case 0xd827: -case 0xda20: -case 0xda21: -case 0xda22: -case 0xda23: -case 0xda24: -case 0xda25: -case 0xda26: -case 0xda27: -case 0xdc20: -case 0xdc21: -case 0xdc22: -case 0xdc23: -case 0xdc24: -case 0xdc25: -case 0xdc26: -case 0xdc27: -case 0xde20: -case 0xde21: -case 0xde22: -case 0xde23: -case 0xde24: -case 0xde25: -case 0xde26: -case 0xde27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc020: -case 0xc021: -case 0xc022: -case 0xc023: -case 0xc024: -case 0xc025: -case 0xc026: -case 0xc027: -case 0xc220: -case 0xc221: -case 0xc222: -case 0xc223: -case 0xc224: -case 0xc225: -case 0xc226: -case 0xc227: -case 0xc420: -case 0xc421: -case 0xc422: -case 0xc423: -case 0xc424: -case 0xc425: -case 0xc426: -case 0xc427: -case 0xc620: -case 0xc621: -case 0xc622: -case 0xc623: -case 0xc624: -case 0xc625: -case 0xc626: -case 0xc627: -case 0xc820: -case 0xc821: -case 0xc822: -case 0xc823: -case 0xc824: -case 0xc825: -case 0xc826: -case 0xc827: -case 0xca20: -case 0xca21: -case 0xca22: -case 0xca23: -case 0xca24: -case 0xca25: -case 0xca26: -case 0xca27: -case 0xcc20: -case 0xcc21: -case 0xcc22: -case 0xcc23: -case 0xcc24: -case 0xcc25: -case 0xcc26: -case 0xcc27: -case 0xce20: -case 0xce21: -case 0xce22: -case 0xce23: -case 0xce24: -case 0xce25: -case 0xce26: -case 0xce27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb020: -case 0xb021: -case 0xb022: -case 0xb023: -case 0xb024: -case 0xb025: -case 0xb026: -case 0xb027: -case 0xb220: -case 0xb221: -case 0xb222: -case 0xb223: -case 0xb224: -case 0xb225: -case 0xb226: -case 0xb227: -case 0xb420: -case 0xb421: -case 0xb422: -case 0xb423: -case 0xb424: -case 0xb425: -case 0xb426: -case 0xb427: -case 0xb620: -case 0xb621: -case 0xb622: -case 0xb623: -case 0xb624: -case 0xb625: -case 0xb626: -case 0xb627: -case 0xb820: -case 0xb821: -case 0xb822: -case 0xb823: -case 0xb824: -case 0xb825: -case 0xb826: -case 0xb827: -case 0xba20: -case 0xba21: -case 0xba22: -case 0xba23: -case 0xba24: -case 0xba25: -case 0xba26: -case 0xba27: -case 0xbc20: -case 0xbc21: -case 0xbc22: -case 0xbc23: -case 0xbc24: -case 0xbc25: -case 0xbc26: -case 0xbc27: -case 0xbe20: -case 0xbe21: -case 0xbe22: -case 0xbe23: -case 0xbe24: -case 0xbe25: -case 0xbe26: -case 0xbe27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x1020: -case 0x1021: -case 0x1022: -case 0x1023: -case 0x1024: -case 0x1025: -case 0x1026: -case 0x1027: -case 0x1220: -case 0x1221: -case 0x1222: -case 0x1223: -case 0x1224: -case 0x1225: -case 0x1226: -case 0x1227: -case 0x1420: -case 0x1421: -case 0x1422: -case 0x1423: -case 0x1424: -case 0x1425: -case 0x1426: -case 0x1427: -case 0x1620: -case 0x1621: -case 0x1622: -case 0x1623: -case 0x1624: -case 0x1625: -case 0x1626: -case 0x1627: -case 0x1820: -case 0x1821: -case 0x1822: -case 0x1823: -case 0x1824: -case 0x1825: -case 0x1826: -case 0x1827: -case 0x1a20: -case 0x1a21: -case 0x1a22: -case 0x1a23: -case 0x1a24: -case 0x1a25: -case 0x1a26: -case 0x1a27: -case 0x1c20: -case 0x1c21: -case 0x1c22: -case 0x1c23: -case 0x1c24: -case 0x1c25: -case 0x1c26: -case 0x1c27: -case 0x1e20: -case 0x1e21: -case 0x1e22: -case 0x1e23: -case 0x1e24: -case 0x1e25: -case 0x1e26: -case 0x1e27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8020: -case 0x8021: -case 0x8022: -case 0x8023: -case 0x8024: -case 0x8025: -case 0x8026: -case 0x8027: -case 0x8220: -case 0x8221: -case 0x8222: -case 0x8223: -case 0x8224: -case 0x8225: -case 0x8226: -case 0x8227: -case 0x8420: -case 0x8421: -case 0x8422: -case 0x8423: -case 0x8424: -case 0x8425: -case 0x8426: -case 0x8427: -case 0x8620: -case 0x8621: -case 0x8622: -case 0x8623: -case 0x8624: -case 0x8625: -case 0x8626: -case 0x8627: -case 0x8820: -case 0x8821: -case 0x8822: -case 0x8823: -case 0x8824: -case 0x8825: -case 0x8826: -case 0x8827: -case 0x8a20: -case 0x8a21: -case 0x8a22: -case 0x8a23: -case 0x8a24: -case 0x8a25: -case 0x8a26: -case 0x8a27: -case 0x8c20: -case 0x8c21: -case 0x8c22: -case 0x8c23: -case 0x8c24: -case 0x8c25: -case 0x8c26: -case 0x8c27: -case 0x8e20: -case 0x8e21: -case 0x8e22: -case 0x8e23: -case 0x8e24: -case 0x8e25: -case 0x8e26: -case 0x8e27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x9020: -case 0x9021: -case 0x9022: -case 0x9023: -case 0x9024: -case 0x9025: -case 0x9026: -case 0x9027: -case 0x9220: -case 0x9221: -case 0x9222: -case 0x9223: -case 0x9224: -case 0x9225: -case 0x9226: -case 0x9227: -case 0x9420: -case 0x9421: -case 0x9422: -case 0x9423: -case 0x9424: -case 0x9425: -case 0x9426: -case 0x9427: -case 0x9620: -case 0x9621: -case 0x9622: -case 0x9623: -case 0x9624: -case 0x9625: -case 0x9626: -case 0x9627: -case 0x9820: -case 0x9821: -case 0x9822: -case 0x9823: -case 0x9824: -case 0x9825: -case 0x9826: -case 0x9827: -case 0x9a20: -case 0x9a21: -case 0x9a22: -case 0x9a23: -case 0x9a24: -case 0x9a25: -case 0x9a26: -case 0x9a27: -case 0x9c20: -case 0x9c21: -case 0x9c22: -case 0x9c23: -case 0x9c24: -case 0x9c25: -case 0x9c26: -case 0x9c27: -case 0x9e20: -case 0x9e21: -case 0x9e22: -case 0x9e23: -case 0x9e24: -case 0x9e25: -case 0x9e26: -case 0x9e27: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0160: -case 0x0161: -case 0x0162: -case 0x0163: -case 0x0164: -case 0x0165: -case 0x0166: -case 0x0167: -case 0x0360: -case 0x0361: -case 0x0362: -case 0x0363: -case 0x0364: -case 0x0365: -case 0x0366: -case 0x0367: -case 0x0560: -case 0x0561: -case 0x0562: -case 0x0563: -case 0x0564: -case 0x0565: -case 0x0566: -case 0x0567: -case 0x0760: -case 0x0761: -case 0x0762: -case 0x0763: -case 0x0764: -case 0x0765: -case 0x0766: -case 0x0767: -case 0x0960: -case 0x0961: -case 0x0962: -case 0x0963: -case 0x0964: -case 0x0965: -case 0x0966: -case 0x0967: -case 0x0b60: -case 0x0b61: -case 0x0b62: -case 0x0b63: -case 0x0b64: -case 0x0b65: -case 0x0b66: -case 0x0b67: -case 0x0d60: -case 0x0d61: -case 0x0d62: -case 0x0d63: -case 0x0d64: -case 0x0d65: -case 0x0d66: -case 0x0d67: -case 0x0f60: -case 0x0f61: -case 0x0f62: -case 0x0f63: -case 0x0f64: -case 0x0f65: -case 0x0f66: -case 0x0f67: - { - HAM targ(this, instr_b2_b0); BCHG(targ, D[instr_b11_b9]); - } - break; - -case 0x01a0: -case 0x01a1: -case 0x01a2: -case 0x01a3: -case 0x01a4: -case 0x01a5: -case 0x01a6: -case 0x01a7: -case 0x03a0: -case 0x03a1: -case 0x03a2: -case 0x03a3: -case 0x03a4: -case 0x03a5: -case 0x03a6: -case 0x03a7: -case 0x05a0: -case 0x05a1: -case 0x05a2: -case 0x05a3: -case 0x05a4: -case 0x05a5: -case 0x05a6: -case 0x05a7: -case 0x07a0: -case 0x07a1: -case 0x07a2: -case 0x07a3: -case 0x07a4: -case 0x07a5: -case 0x07a6: -case 0x07a7: -case 0x09a0: -case 0x09a1: -case 0x09a2: -case 0x09a3: -case 0x09a4: -case 0x09a5: -case 0x09a6: -case 0x09a7: -case 0x0ba0: -case 0x0ba1: -case 0x0ba2: -case 0x0ba3: -case 0x0ba4: -case 0x0ba5: -case 0x0ba6: -case 0x0ba7: -case 0x0da0: -case 0x0da1: -case 0x0da2: -case 0x0da3: -case 0x0da4: -case 0x0da5: -case 0x0da6: -case 0x0da7: -case 0x0fa0: -case 0x0fa1: -case 0x0fa2: -case 0x0fa3: -case 0x0fa4: -case 0x0fa5: -case 0x0fa6: -case 0x0fa7: - { - HAM targ(this, instr_b2_b0); BCLR(targ, D[instr_b11_b9]); - } - break; - -case 0x01e0: -case 0x01e1: -case 0x01e2: -case 0x01e3: -case 0x01e4: -case 0x01e5: -case 0x01e6: -case 0x01e7: -case 0x03e0: -case 0x03e1: -case 0x03e2: -case 0x03e3: -case 0x03e4: -case 0x03e5: -case 0x03e6: -case 0x03e7: -case 0x05e0: -case 0x05e1: -case 0x05e2: -case 0x05e3: -case 0x05e4: -case 0x05e5: -case 0x05e6: -case 0x05e7: -case 0x07e0: -case 0x07e1: -case 0x07e2: -case 0x07e3: -case 0x07e4: -case 0x07e5: -case 0x07e6: -case 0x07e7: -case 0x09e0: -case 0x09e1: -case 0x09e2: -case 0x09e3: -case 0x09e4: -case 0x09e5: -case 0x09e6: -case 0x09e7: -case 0x0be0: -case 0x0be1: -case 0x0be2: -case 0x0be3: -case 0x0be4: -case 0x0be5: -case 0x0be6: -case 0x0be7: -case 0x0de0: -case 0x0de1: -case 0x0de2: -case 0x0de3: -case 0x0de4: -case 0x0de5: -case 0x0de6: -case 0x0de7: -case 0x0fe0: -case 0x0fe1: -case 0x0fe2: -case 0x0fe3: -case 0x0fe4: -case 0x0fe5: -case 0x0fe6: -case 0x0fe7: - { - HAM targ(this, instr_b2_b0); BSET(targ, D[instr_b11_b9]); - } - break; - -case 0x0120: -case 0x0121: -case 0x0122: -case 0x0123: -case 0x0124: -case 0x0125: -case 0x0126: -case 0x0127: -case 0x0320: -case 0x0321: -case 0x0322: -case 0x0323: -case 0x0324: -case 0x0325: -case 0x0326: -case 0x0327: -case 0x0520: -case 0x0521: -case 0x0522: -case 0x0523: -case 0x0524: -case 0x0525: -case 0x0526: -case 0x0527: -case 0x0720: -case 0x0721: -case 0x0722: -case 0x0723: -case 0x0724: -case 0x0725: -case 0x0726: -case 0x0727: -case 0x0920: -case 0x0921: -case 0x0922: -case 0x0923: -case 0x0924: -case 0x0925: -case 0x0926: -case 0x0927: -case 0x0b20: -case 0x0b21: -case 0x0b22: -case 0x0b23: -case 0x0b24: -case 0x0b25: -case 0x0b26: -case 0x0b27: -case 0x0d20: -case 0x0d21: -case 0x0d22: -case 0x0d23: -case 0x0d24: -case 0x0d25: -case 0x0d26: -case 0x0d27: -case 0x0f20: -case 0x0f21: -case 0x0f22: -case 0x0f23: -case 0x0f24: -case 0x0f25: -case 0x0f26: -case 0x0f27: - { - HAM targ(this, instr_b2_b0); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0x4200: -case 0x4201: -case 0x4202: -case 0x4203: -case 0x4204: -case 0x4205: -case 0x4206: -case 0x4207: - { - HAM dst(this, instr_b2_b0); CLR(dst); - } - break; - -case 0x4800: -case 0x4801: -case 0x4802: -case 0x4803: -case 0x4804: -case 0x4805: -case 0x4806: -case 0x4807: - { - HAM dst(this, instr_b2_b0); NBCD(dst); - } - break; - -case 0x4400: -case 0x4401: -case 0x4402: -case 0x4403: -case 0x4404: -case 0x4405: -case 0x4406: -case 0x4407: - { - HAM dst(this, instr_b2_b0); NEG(dst); - } - break; - -case 0x4000: -case 0x4001: -case 0x4002: -case 0x4003: -case 0x4004: -case 0x4005: -case 0x4006: -case 0x4007: - { - HAM dst(this, instr_b2_b0); NEGX(dst); - } - break; - -case 0x4600: -case 0x4601: -case 0x4602: -case 0x4603: -case 0x4604: -case 0x4605: -case 0x4606: -case 0x4607: - { - HAM dst(this, instr_b2_b0); NOT(dst); - } - break; - -case 0x50c0: -case 0x50c1: -case 0x50c2: -case 0x50c3: -case 0x50c4: -case 0x50c5: -case 0x50c6: -case 0x50c7: - { - HAM dst(this, instr_b2_b0); Scc<0x00>(dst); - } - break; - -case 0x51c0: -case 0x51c1: -case 0x51c2: -case 0x51c3: -case 0x51c4: -case 0x51c5: -case 0x51c6: -case 0x51c7: - { - HAM dst(this, instr_b2_b0); Scc<0x01>(dst); - } - break; - -case 0x52c0: -case 0x52c1: -case 0x52c2: -case 0x52c3: -case 0x52c4: -case 0x52c5: -case 0x52c6: -case 0x52c7: - { - HAM dst(this, instr_b2_b0); Scc<0x02>(dst); - } - break; - -case 0x53c0: -case 0x53c1: -case 0x53c2: -case 0x53c3: -case 0x53c4: -case 0x53c5: -case 0x53c6: -case 0x53c7: - { - HAM dst(this, instr_b2_b0); Scc<0x03>(dst); - } - break; - -case 0x54c0: -case 0x54c1: -case 0x54c2: -case 0x54c3: -case 0x54c4: -case 0x54c5: -case 0x54c6: -case 0x54c7: - { - HAM dst(this, instr_b2_b0); Scc<0x04>(dst); - } - break; - -case 0x55c0: -case 0x55c1: -case 0x55c2: -case 0x55c3: -case 0x55c4: -case 0x55c5: -case 0x55c6: -case 0x55c7: - { - HAM dst(this, instr_b2_b0); Scc<0x05>(dst); - } - break; - -case 0x56c0: -case 0x56c1: -case 0x56c2: -case 0x56c3: -case 0x56c4: -case 0x56c5: -case 0x56c6: -case 0x56c7: - { - HAM dst(this, instr_b2_b0); Scc<0x06>(dst); - } - break; - -case 0x57c0: -case 0x57c1: -case 0x57c2: -case 0x57c3: -case 0x57c4: -case 0x57c5: -case 0x57c6: -case 0x57c7: - { - HAM dst(this, instr_b2_b0); Scc<0x07>(dst); - } - break; - -case 0x58c0: -case 0x58c1: -case 0x58c2: -case 0x58c3: -case 0x58c4: -case 0x58c5: -case 0x58c6: -case 0x58c7: - { - HAM dst(this, instr_b2_b0); Scc<0x08>(dst); - } - break; - -case 0x59c0: -case 0x59c1: -case 0x59c2: -case 0x59c3: -case 0x59c4: -case 0x59c5: -case 0x59c6: -case 0x59c7: - { - HAM dst(this, instr_b2_b0); Scc<0x09>(dst); - } - break; - -case 0x5ac0: -case 0x5ac1: -case 0x5ac2: -case 0x5ac3: -case 0x5ac4: -case 0x5ac5: -case 0x5ac6: -case 0x5ac7: - { - HAM dst(this, instr_b2_b0); Scc<0x0a>(dst); - } - break; - -case 0x5bc0: -case 0x5bc1: -case 0x5bc2: -case 0x5bc3: -case 0x5bc4: -case 0x5bc5: -case 0x5bc6: -case 0x5bc7: - { - HAM dst(this, instr_b2_b0); Scc<0x0b>(dst); - } - break; - -case 0x5cc0: -case 0x5cc1: -case 0x5cc2: -case 0x5cc3: -case 0x5cc4: -case 0x5cc5: -case 0x5cc6: -case 0x5cc7: - { - HAM dst(this, instr_b2_b0); Scc<0x0c>(dst); - } - break; - -case 0x5dc0: -case 0x5dc1: -case 0x5dc2: -case 0x5dc3: -case 0x5dc4: -case 0x5dc5: -case 0x5dc6: -case 0x5dc7: - { - HAM dst(this, instr_b2_b0); Scc<0x0d>(dst); - } - break; - -case 0x5ec0: -case 0x5ec1: -case 0x5ec2: -case 0x5ec3: -case 0x5ec4: -case 0x5ec5: -case 0x5ec6: -case 0x5ec7: - { - HAM dst(this, instr_b2_b0); Scc<0x0e>(dst); - } - break; - -case 0x5fc0: -case 0x5fc1: -case 0x5fc2: -case 0x5fc3: -case 0x5fc4: -case 0x5fc5: -case 0x5fc6: -case 0x5fc7: - { - HAM dst(this, instr_b2_b0); Scc<0x0f>(dst); - } - break; - -case 0x4ac0: -case 0x4ac1: -case 0x4ac2: -case 0x4ac3: -case 0x4ac4: -case 0x4ac5: -case 0x4ac6: -case 0x4ac7: - { - HAM dst(this, instr_b2_b0); TAS(dst); - } - break; - -case 0x4a00: -case 0x4a01: -case 0x4a02: -case 0x4a03: -case 0x4a04: -case 0x4a05: -case 0x4a06: -case 0x4a07: - { - HAM dst(this, instr_b2_b0); TST(dst); - } - break; - -case 0xd139: -case 0xd339: -case 0xd539: -case 0xd739: -case 0xd939: -case 0xdb39: -case 0xdd39: -case 0xdf39: - { - HAM src(this, instr_b11_b9); HAM dst(this); ADD(src, dst); - } - break; - -case 0xc139: -case 0xc339: -case 0xc539: -case 0xc739: -case 0xc939: -case 0xcb39: -case 0xcd39: -case 0xcf39: - { - HAM src(this, instr_b11_b9); HAM dst(this); AND(src, dst); - } - break; - -case 0xb139: -case 0xb339: -case 0xb539: -case 0xb739: -case 0xb939: -case 0xbb39: -case 0xbd39: -case 0xbf39: - { - HAM src(this, instr_b11_b9); HAM dst(this); EOR(src, dst); - } - break; - -case 0x8139: -case 0x8339: -case 0x8539: -case 0x8739: -case 0x8939: -case 0x8b39: -case 0x8d39: -case 0x8f39: - { - HAM src(this, instr_b11_b9); HAM dst(this); OR(src, dst); - } - break; - -case 0x9139: -case 0x9339: -case 0x9539: -case 0x9739: -case 0x9939: -case 0x9b39: -case 0x9d39: -case 0x9f39: - { - HAM src(this, instr_b11_b9); HAM dst(this); SUB(src, dst); - } - break; - -case 0xd138: -case 0xd338: -case 0xd538: -case 0xd738: -case 0xd938: -case 0xdb38: -case 0xdd38: -case 0xdf38: - { - HAM src(this, instr_b11_b9); HAM dst(this); ADD(src, dst); - } - break; - -case 0xc138: -case 0xc338: -case 0xc538: -case 0xc738: -case 0xc938: -case 0xcb38: -case 0xcd38: -case 0xcf38: - { - HAM src(this, instr_b11_b9); HAM dst(this); AND(src, dst); - } - break; - -case 0xb138: -case 0xb338: -case 0xb538: -case 0xb738: -case 0xb938: -case 0xbb38: -case 0xbd38: -case 0xbf38: - { - HAM src(this, instr_b11_b9); HAM dst(this); EOR(src, dst); - } - break; - -case 0x8138: -case 0x8338: -case 0x8538: -case 0x8738: -case 0x8938: -case 0x8b38: -case 0x8d38: -case 0x8f38: - { - HAM src(this, instr_b11_b9); HAM dst(this); OR(src, dst); - } - break; - -case 0x9138: -case 0x9338: -case 0x9538: -case 0x9738: -case 0x9938: -case 0x9b38: -case 0x9d38: -case 0x9f38: - { - HAM src(this, instr_b11_b9); HAM dst(this); SUB(src, dst); - } - break; - -case 0xd110: -case 0xd111: -case 0xd112: -case 0xd113: -case 0xd114: -case 0xd115: -case 0xd116: -case 0xd117: -case 0xd310: -case 0xd311: -case 0xd312: -case 0xd313: -case 0xd314: -case 0xd315: -case 0xd316: -case 0xd317: -case 0xd510: -case 0xd511: -case 0xd512: -case 0xd513: -case 0xd514: -case 0xd515: -case 0xd516: -case 0xd517: -case 0xd710: -case 0xd711: -case 0xd712: -case 0xd713: -case 0xd714: -case 0xd715: -case 0xd716: -case 0xd717: -case 0xd910: -case 0xd911: -case 0xd912: -case 0xd913: -case 0xd914: -case 0xd915: -case 0xd916: -case 0xd917: -case 0xdb10: -case 0xdb11: -case 0xdb12: -case 0xdb13: -case 0xdb14: -case 0xdb15: -case 0xdb16: -case 0xdb17: -case 0xdd10: -case 0xdd11: -case 0xdd12: -case 0xdd13: -case 0xdd14: -case 0xdd15: -case 0xdd16: -case 0xdd17: -case 0xdf10: -case 0xdf11: -case 0xdf12: -case 0xdf13: -case 0xdf14: -case 0xdf15: -case 0xdf16: -case 0xdf17: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc110: -case 0xc111: -case 0xc112: -case 0xc113: -case 0xc114: -case 0xc115: -case 0xc116: -case 0xc117: -case 0xc310: -case 0xc311: -case 0xc312: -case 0xc313: -case 0xc314: -case 0xc315: -case 0xc316: -case 0xc317: -case 0xc510: -case 0xc511: -case 0xc512: -case 0xc513: -case 0xc514: -case 0xc515: -case 0xc516: -case 0xc517: -case 0xc710: -case 0xc711: -case 0xc712: -case 0xc713: -case 0xc714: -case 0xc715: -case 0xc716: -case 0xc717: -case 0xc910: -case 0xc911: -case 0xc912: -case 0xc913: -case 0xc914: -case 0xc915: -case 0xc916: -case 0xc917: -case 0xcb10: -case 0xcb11: -case 0xcb12: -case 0xcb13: -case 0xcb14: -case 0xcb15: -case 0xcb16: -case 0xcb17: -case 0xcd10: -case 0xcd11: -case 0xcd12: -case 0xcd13: -case 0xcd14: -case 0xcd15: -case 0xcd16: -case 0xcd17: -case 0xcf10: -case 0xcf11: -case 0xcf12: -case 0xcf13: -case 0xcf14: -case 0xcf15: -case 0xcf16: -case 0xcf17: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb110: -case 0xb111: -case 0xb112: -case 0xb113: -case 0xb114: -case 0xb115: -case 0xb116: -case 0xb117: -case 0xb310: -case 0xb311: -case 0xb312: -case 0xb313: -case 0xb314: -case 0xb315: -case 0xb316: -case 0xb317: -case 0xb510: -case 0xb511: -case 0xb512: -case 0xb513: -case 0xb514: -case 0xb515: -case 0xb516: -case 0xb517: -case 0xb710: -case 0xb711: -case 0xb712: -case 0xb713: -case 0xb714: -case 0xb715: -case 0xb716: -case 0xb717: -case 0xb910: -case 0xb911: -case 0xb912: -case 0xb913: -case 0xb914: -case 0xb915: -case 0xb916: -case 0xb917: -case 0xbb10: -case 0xbb11: -case 0xbb12: -case 0xbb13: -case 0xbb14: -case 0xbb15: -case 0xbb16: -case 0xbb17: -case 0xbd10: -case 0xbd11: -case 0xbd12: -case 0xbd13: -case 0xbd14: -case 0xbd15: -case 0xbd16: -case 0xbd17: -case 0xbf10: -case 0xbf11: -case 0xbf12: -case 0xbf13: -case 0xbf14: -case 0xbf15: -case 0xbf16: -case 0xbf17: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8110: -case 0x8111: -case 0x8112: -case 0x8113: -case 0x8114: -case 0x8115: -case 0x8116: -case 0x8117: -case 0x8310: -case 0x8311: -case 0x8312: -case 0x8313: -case 0x8314: -case 0x8315: -case 0x8316: -case 0x8317: -case 0x8510: -case 0x8511: -case 0x8512: -case 0x8513: -case 0x8514: -case 0x8515: -case 0x8516: -case 0x8517: -case 0x8710: -case 0x8711: -case 0x8712: -case 0x8713: -case 0x8714: -case 0x8715: -case 0x8716: -case 0x8717: -case 0x8910: -case 0x8911: -case 0x8912: -case 0x8913: -case 0x8914: -case 0x8915: -case 0x8916: -case 0x8917: -case 0x8b10: -case 0x8b11: -case 0x8b12: -case 0x8b13: -case 0x8b14: -case 0x8b15: -case 0x8b16: -case 0x8b17: -case 0x8d10: -case 0x8d11: -case 0x8d12: -case 0x8d13: -case 0x8d14: -case 0x8d15: -case 0x8d16: -case 0x8d17: -case 0x8f10: -case 0x8f11: -case 0x8f12: -case 0x8f13: -case 0x8f14: -case 0x8f15: -case 0x8f16: -case 0x8f17: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9110: -case 0x9111: -case 0x9112: -case 0x9113: -case 0x9114: -case 0x9115: -case 0x9116: -case 0x9117: -case 0x9310: -case 0x9311: -case 0x9312: -case 0x9313: -case 0x9314: -case 0x9315: -case 0x9316: -case 0x9317: -case 0x9510: -case 0x9511: -case 0x9512: -case 0x9513: -case 0x9514: -case 0x9515: -case 0x9516: -case 0x9517: -case 0x9710: -case 0x9711: -case 0x9712: -case 0x9713: -case 0x9714: -case 0x9715: -case 0x9716: -case 0x9717: -case 0x9910: -case 0x9911: -case 0x9912: -case 0x9913: -case 0x9914: -case 0x9915: -case 0x9916: -case 0x9917: -case 0x9b10: -case 0x9b11: -case 0x9b12: -case 0x9b13: -case 0x9b14: -case 0x9b15: -case 0x9b16: -case 0x9b17: -case 0x9d10: -case 0x9d11: -case 0x9d12: -case 0x9d13: -case 0x9d14: -case 0x9d15: -case 0x9d16: -case 0x9d17: -case 0x9f10: -case 0x9f11: -case 0x9f12: -case 0x9f13: -case 0x9f14: -case 0x9f15: -case 0x9f16: -case 0x9f17: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd128: -case 0xd129: -case 0xd12a: -case 0xd12b: -case 0xd12c: -case 0xd12d: -case 0xd12e: -case 0xd12f: -case 0xd328: -case 0xd329: -case 0xd32a: -case 0xd32b: -case 0xd32c: -case 0xd32d: -case 0xd32e: -case 0xd32f: -case 0xd528: -case 0xd529: -case 0xd52a: -case 0xd52b: -case 0xd52c: -case 0xd52d: -case 0xd52e: -case 0xd52f: -case 0xd728: -case 0xd729: -case 0xd72a: -case 0xd72b: -case 0xd72c: -case 0xd72d: -case 0xd72e: -case 0xd72f: -case 0xd928: -case 0xd929: -case 0xd92a: -case 0xd92b: -case 0xd92c: -case 0xd92d: -case 0xd92e: -case 0xd92f: -case 0xdb28: -case 0xdb29: -case 0xdb2a: -case 0xdb2b: -case 0xdb2c: -case 0xdb2d: -case 0xdb2e: -case 0xdb2f: -case 0xdd28: -case 0xdd29: -case 0xdd2a: -case 0xdd2b: -case 0xdd2c: -case 0xdd2d: -case 0xdd2e: -case 0xdd2f: -case 0xdf28: -case 0xdf29: -case 0xdf2a: -case 0xdf2b: -case 0xdf2c: -case 0xdf2d: -case 0xdf2e: -case 0xdf2f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc128: -case 0xc129: -case 0xc12a: -case 0xc12b: -case 0xc12c: -case 0xc12d: -case 0xc12e: -case 0xc12f: -case 0xc328: -case 0xc329: -case 0xc32a: -case 0xc32b: -case 0xc32c: -case 0xc32d: -case 0xc32e: -case 0xc32f: -case 0xc528: -case 0xc529: -case 0xc52a: -case 0xc52b: -case 0xc52c: -case 0xc52d: -case 0xc52e: -case 0xc52f: -case 0xc728: -case 0xc729: -case 0xc72a: -case 0xc72b: -case 0xc72c: -case 0xc72d: -case 0xc72e: -case 0xc72f: -case 0xc928: -case 0xc929: -case 0xc92a: -case 0xc92b: -case 0xc92c: -case 0xc92d: -case 0xc92e: -case 0xc92f: -case 0xcb28: -case 0xcb29: -case 0xcb2a: -case 0xcb2b: -case 0xcb2c: -case 0xcb2d: -case 0xcb2e: -case 0xcb2f: -case 0xcd28: -case 0xcd29: -case 0xcd2a: -case 0xcd2b: -case 0xcd2c: -case 0xcd2d: -case 0xcd2e: -case 0xcd2f: -case 0xcf28: -case 0xcf29: -case 0xcf2a: -case 0xcf2b: -case 0xcf2c: -case 0xcf2d: -case 0xcf2e: -case 0xcf2f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb128: -case 0xb129: -case 0xb12a: -case 0xb12b: -case 0xb12c: -case 0xb12d: -case 0xb12e: -case 0xb12f: -case 0xb328: -case 0xb329: -case 0xb32a: -case 0xb32b: -case 0xb32c: -case 0xb32d: -case 0xb32e: -case 0xb32f: -case 0xb528: -case 0xb529: -case 0xb52a: -case 0xb52b: -case 0xb52c: -case 0xb52d: -case 0xb52e: -case 0xb52f: -case 0xb728: -case 0xb729: -case 0xb72a: -case 0xb72b: -case 0xb72c: -case 0xb72d: -case 0xb72e: -case 0xb72f: -case 0xb928: -case 0xb929: -case 0xb92a: -case 0xb92b: -case 0xb92c: -case 0xb92d: -case 0xb92e: -case 0xb92f: -case 0xbb28: -case 0xbb29: -case 0xbb2a: -case 0xbb2b: -case 0xbb2c: -case 0xbb2d: -case 0xbb2e: -case 0xbb2f: -case 0xbd28: -case 0xbd29: -case 0xbd2a: -case 0xbd2b: -case 0xbd2c: -case 0xbd2d: -case 0xbd2e: -case 0xbd2f: -case 0xbf28: -case 0xbf29: -case 0xbf2a: -case 0xbf2b: -case 0xbf2c: -case 0xbf2d: -case 0xbf2e: -case 0xbf2f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8128: -case 0x8129: -case 0x812a: -case 0x812b: -case 0x812c: -case 0x812d: -case 0x812e: -case 0x812f: -case 0x8328: -case 0x8329: -case 0x832a: -case 0x832b: -case 0x832c: -case 0x832d: -case 0x832e: -case 0x832f: -case 0x8528: -case 0x8529: -case 0x852a: -case 0x852b: -case 0x852c: -case 0x852d: -case 0x852e: -case 0x852f: -case 0x8728: -case 0x8729: -case 0x872a: -case 0x872b: -case 0x872c: -case 0x872d: -case 0x872e: -case 0x872f: -case 0x8928: -case 0x8929: -case 0x892a: -case 0x892b: -case 0x892c: -case 0x892d: -case 0x892e: -case 0x892f: -case 0x8b28: -case 0x8b29: -case 0x8b2a: -case 0x8b2b: -case 0x8b2c: -case 0x8b2d: -case 0x8b2e: -case 0x8b2f: -case 0x8d28: -case 0x8d29: -case 0x8d2a: -case 0x8d2b: -case 0x8d2c: -case 0x8d2d: -case 0x8d2e: -case 0x8d2f: -case 0x8f28: -case 0x8f29: -case 0x8f2a: -case 0x8f2b: -case 0x8f2c: -case 0x8f2d: -case 0x8f2e: -case 0x8f2f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9128: -case 0x9129: -case 0x912a: -case 0x912b: -case 0x912c: -case 0x912d: -case 0x912e: -case 0x912f: -case 0x9328: -case 0x9329: -case 0x932a: -case 0x932b: -case 0x932c: -case 0x932d: -case 0x932e: -case 0x932f: -case 0x9528: -case 0x9529: -case 0x952a: -case 0x952b: -case 0x952c: -case 0x952d: -case 0x952e: -case 0x952f: -case 0x9728: -case 0x9729: -case 0x972a: -case 0x972b: -case 0x972c: -case 0x972d: -case 0x972e: -case 0x972f: -case 0x9928: -case 0x9929: -case 0x992a: -case 0x992b: -case 0x992c: -case 0x992d: -case 0x992e: -case 0x992f: -case 0x9b28: -case 0x9b29: -case 0x9b2a: -case 0x9b2b: -case 0x9b2c: -case 0x9b2d: -case 0x9b2e: -case 0x9b2f: -case 0x9d28: -case 0x9d29: -case 0x9d2a: -case 0x9d2b: -case 0x9d2c: -case 0x9d2d: -case 0x9d2e: -case 0x9d2f: -case 0x9f28: -case 0x9f29: -case 0x9f2a: -case 0x9f2b: -case 0x9f2c: -case 0x9f2d: -case 0x9f2e: -case 0x9f2f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd130: -case 0xd131: -case 0xd132: -case 0xd133: -case 0xd134: -case 0xd135: -case 0xd136: -case 0xd137: -case 0xd330: -case 0xd331: -case 0xd332: -case 0xd333: -case 0xd334: -case 0xd335: -case 0xd336: -case 0xd337: -case 0xd530: -case 0xd531: -case 0xd532: -case 0xd533: -case 0xd534: -case 0xd535: -case 0xd536: -case 0xd537: -case 0xd730: -case 0xd731: -case 0xd732: -case 0xd733: -case 0xd734: -case 0xd735: -case 0xd736: -case 0xd737: -case 0xd930: -case 0xd931: -case 0xd932: -case 0xd933: -case 0xd934: -case 0xd935: -case 0xd936: -case 0xd937: -case 0xdb30: -case 0xdb31: -case 0xdb32: -case 0xdb33: -case 0xdb34: -case 0xdb35: -case 0xdb36: -case 0xdb37: -case 0xdd30: -case 0xdd31: -case 0xdd32: -case 0xdd33: -case 0xdd34: -case 0xdd35: -case 0xdd36: -case 0xdd37: -case 0xdf30: -case 0xdf31: -case 0xdf32: -case 0xdf33: -case 0xdf34: -case 0xdf35: -case 0xdf36: -case 0xdf37: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc130: -case 0xc131: -case 0xc132: -case 0xc133: -case 0xc134: -case 0xc135: -case 0xc136: -case 0xc137: -case 0xc330: -case 0xc331: -case 0xc332: -case 0xc333: -case 0xc334: -case 0xc335: -case 0xc336: -case 0xc337: -case 0xc530: -case 0xc531: -case 0xc532: -case 0xc533: -case 0xc534: -case 0xc535: -case 0xc536: -case 0xc537: -case 0xc730: -case 0xc731: -case 0xc732: -case 0xc733: -case 0xc734: -case 0xc735: -case 0xc736: -case 0xc737: -case 0xc930: -case 0xc931: -case 0xc932: -case 0xc933: -case 0xc934: -case 0xc935: -case 0xc936: -case 0xc937: -case 0xcb30: -case 0xcb31: -case 0xcb32: -case 0xcb33: -case 0xcb34: -case 0xcb35: -case 0xcb36: -case 0xcb37: -case 0xcd30: -case 0xcd31: -case 0xcd32: -case 0xcd33: -case 0xcd34: -case 0xcd35: -case 0xcd36: -case 0xcd37: -case 0xcf30: -case 0xcf31: -case 0xcf32: -case 0xcf33: -case 0xcf34: -case 0xcf35: -case 0xcf36: -case 0xcf37: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb130: -case 0xb131: -case 0xb132: -case 0xb133: -case 0xb134: -case 0xb135: -case 0xb136: -case 0xb137: -case 0xb330: -case 0xb331: -case 0xb332: -case 0xb333: -case 0xb334: -case 0xb335: -case 0xb336: -case 0xb337: -case 0xb530: -case 0xb531: -case 0xb532: -case 0xb533: -case 0xb534: -case 0xb535: -case 0xb536: -case 0xb537: -case 0xb730: -case 0xb731: -case 0xb732: -case 0xb733: -case 0xb734: -case 0xb735: -case 0xb736: -case 0xb737: -case 0xb930: -case 0xb931: -case 0xb932: -case 0xb933: -case 0xb934: -case 0xb935: -case 0xb936: -case 0xb937: -case 0xbb30: -case 0xbb31: -case 0xbb32: -case 0xbb33: -case 0xbb34: -case 0xbb35: -case 0xbb36: -case 0xbb37: -case 0xbd30: -case 0xbd31: -case 0xbd32: -case 0xbd33: -case 0xbd34: -case 0xbd35: -case 0xbd36: -case 0xbd37: -case 0xbf30: -case 0xbf31: -case 0xbf32: -case 0xbf33: -case 0xbf34: -case 0xbf35: -case 0xbf36: -case 0xbf37: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8130: -case 0x8131: -case 0x8132: -case 0x8133: -case 0x8134: -case 0x8135: -case 0x8136: -case 0x8137: -case 0x8330: -case 0x8331: -case 0x8332: -case 0x8333: -case 0x8334: -case 0x8335: -case 0x8336: -case 0x8337: -case 0x8530: -case 0x8531: -case 0x8532: -case 0x8533: -case 0x8534: -case 0x8535: -case 0x8536: -case 0x8537: -case 0x8730: -case 0x8731: -case 0x8732: -case 0x8733: -case 0x8734: -case 0x8735: -case 0x8736: -case 0x8737: -case 0x8930: -case 0x8931: -case 0x8932: -case 0x8933: -case 0x8934: -case 0x8935: -case 0x8936: -case 0x8937: -case 0x8b30: -case 0x8b31: -case 0x8b32: -case 0x8b33: -case 0x8b34: -case 0x8b35: -case 0x8b36: -case 0x8b37: -case 0x8d30: -case 0x8d31: -case 0x8d32: -case 0x8d33: -case 0x8d34: -case 0x8d35: -case 0x8d36: -case 0x8d37: -case 0x8f30: -case 0x8f31: -case 0x8f32: -case 0x8f33: -case 0x8f34: -case 0x8f35: -case 0x8f36: -case 0x8f37: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9130: -case 0x9131: -case 0x9132: -case 0x9133: -case 0x9134: -case 0x9135: -case 0x9136: -case 0x9137: -case 0x9330: -case 0x9331: -case 0x9332: -case 0x9333: -case 0x9334: -case 0x9335: -case 0x9336: -case 0x9337: -case 0x9530: -case 0x9531: -case 0x9532: -case 0x9533: -case 0x9534: -case 0x9535: -case 0x9536: -case 0x9537: -case 0x9730: -case 0x9731: -case 0x9732: -case 0x9733: -case 0x9734: -case 0x9735: -case 0x9736: -case 0x9737: -case 0x9930: -case 0x9931: -case 0x9932: -case 0x9933: -case 0x9934: -case 0x9935: -case 0x9936: -case 0x9937: -case 0x9b30: -case 0x9b31: -case 0x9b32: -case 0x9b33: -case 0x9b34: -case 0x9b35: -case 0x9b36: -case 0x9b37: -case 0x9d30: -case 0x9d31: -case 0x9d32: -case 0x9d33: -case 0x9d34: -case 0x9d35: -case 0x9d36: -case 0x9d37: -case 0x9f30: -case 0x9f31: -case 0x9f32: -case 0x9f33: -case 0x9f34: -case 0x9f35: -case 0x9f36: -case 0x9f37: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd118: -case 0xd119: -case 0xd11a: -case 0xd11b: -case 0xd11c: -case 0xd11d: -case 0xd11e: -case 0xd11f: -case 0xd318: -case 0xd319: -case 0xd31a: -case 0xd31b: -case 0xd31c: -case 0xd31d: -case 0xd31e: -case 0xd31f: -case 0xd518: -case 0xd519: -case 0xd51a: -case 0xd51b: -case 0xd51c: -case 0xd51d: -case 0xd51e: -case 0xd51f: -case 0xd718: -case 0xd719: -case 0xd71a: -case 0xd71b: -case 0xd71c: -case 0xd71d: -case 0xd71e: -case 0xd71f: -case 0xd918: -case 0xd919: -case 0xd91a: -case 0xd91b: -case 0xd91c: -case 0xd91d: -case 0xd91e: -case 0xd91f: -case 0xdb18: -case 0xdb19: -case 0xdb1a: -case 0xdb1b: -case 0xdb1c: -case 0xdb1d: -case 0xdb1e: -case 0xdb1f: -case 0xdd18: -case 0xdd19: -case 0xdd1a: -case 0xdd1b: -case 0xdd1c: -case 0xdd1d: -case 0xdd1e: -case 0xdd1f: -case 0xdf18: -case 0xdf19: -case 0xdf1a: -case 0xdf1b: -case 0xdf1c: -case 0xdf1d: -case 0xdf1e: -case 0xdf1f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc118: -case 0xc119: -case 0xc11a: -case 0xc11b: -case 0xc11c: -case 0xc11d: -case 0xc11e: -case 0xc11f: -case 0xc318: -case 0xc319: -case 0xc31a: -case 0xc31b: -case 0xc31c: -case 0xc31d: -case 0xc31e: -case 0xc31f: -case 0xc518: -case 0xc519: -case 0xc51a: -case 0xc51b: -case 0xc51c: -case 0xc51d: -case 0xc51e: -case 0xc51f: -case 0xc718: -case 0xc719: -case 0xc71a: -case 0xc71b: -case 0xc71c: -case 0xc71d: -case 0xc71e: -case 0xc71f: -case 0xc918: -case 0xc919: -case 0xc91a: -case 0xc91b: -case 0xc91c: -case 0xc91d: -case 0xc91e: -case 0xc91f: -case 0xcb18: -case 0xcb19: -case 0xcb1a: -case 0xcb1b: -case 0xcb1c: -case 0xcb1d: -case 0xcb1e: -case 0xcb1f: -case 0xcd18: -case 0xcd19: -case 0xcd1a: -case 0xcd1b: -case 0xcd1c: -case 0xcd1d: -case 0xcd1e: -case 0xcd1f: -case 0xcf18: -case 0xcf19: -case 0xcf1a: -case 0xcf1b: -case 0xcf1c: -case 0xcf1d: -case 0xcf1e: -case 0xcf1f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb118: -case 0xb119: -case 0xb11a: -case 0xb11b: -case 0xb11c: -case 0xb11d: -case 0xb11e: -case 0xb11f: -case 0xb318: -case 0xb319: -case 0xb31a: -case 0xb31b: -case 0xb31c: -case 0xb31d: -case 0xb31e: -case 0xb31f: -case 0xb518: -case 0xb519: -case 0xb51a: -case 0xb51b: -case 0xb51c: -case 0xb51d: -case 0xb51e: -case 0xb51f: -case 0xb718: -case 0xb719: -case 0xb71a: -case 0xb71b: -case 0xb71c: -case 0xb71d: -case 0xb71e: -case 0xb71f: -case 0xb918: -case 0xb919: -case 0xb91a: -case 0xb91b: -case 0xb91c: -case 0xb91d: -case 0xb91e: -case 0xb91f: -case 0xbb18: -case 0xbb19: -case 0xbb1a: -case 0xbb1b: -case 0xbb1c: -case 0xbb1d: -case 0xbb1e: -case 0xbb1f: -case 0xbd18: -case 0xbd19: -case 0xbd1a: -case 0xbd1b: -case 0xbd1c: -case 0xbd1d: -case 0xbd1e: -case 0xbd1f: -case 0xbf18: -case 0xbf19: -case 0xbf1a: -case 0xbf1b: -case 0xbf1c: -case 0xbf1d: -case 0xbf1e: -case 0xbf1f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8118: -case 0x8119: -case 0x811a: -case 0x811b: -case 0x811c: -case 0x811d: -case 0x811e: -case 0x811f: -case 0x8318: -case 0x8319: -case 0x831a: -case 0x831b: -case 0x831c: -case 0x831d: -case 0x831e: -case 0x831f: -case 0x8518: -case 0x8519: -case 0x851a: -case 0x851b: -case 0x851c: -case 0x851d: -case 0x851e: -case 0x851f: -case 0x8718: -case 0x8719: -case 0x871a: -case 0x871b: -case 0x871c: -case 0x871d: -case 0x871e: -case 0x871f: -case 0x8918: -case 0x8919: -case 0x891a: -case 0x891b: -case 0x891c: -case 0x891d: -case 0x891e: -case 0x891f: -case 0x8b18: -case 0x8b19: -case 0x8b1a: -case 0x8b1b: -case 0x8b1c: -case 0x8b1d: -case 0x8b1e: -case 0x8b1f: -case 0x8d18: -case 0x8d19: -case 0x8d1a: -case 0x8d1b: -case 0x8d1c: -case 0x8d1d: -case 0x8d1e: -case 0x8d1f: -case 0x8f18: -case 0x8f19: -case 0x8f1a: -case 0x8f1b: -case 0x8f1c: -case 0x8f1d: -case 0x8f1e: -case 0x8f1f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9118: -case 0x9119: -case 0x911a: -case 0x911b: -case 0x911c: -case 0x911d: -case 0x911e: -case 0x911f: -case 0x9318: -case 0x9319: -case 0x931a: -case 0x931b: -case 0x931c: -case 0x931d: -case 0x931e: -case 0x931f: -case 0x9518: -case 0x9519: -case 0x951a: -case 0x951b: -case 0x951c: -case 0x951d: -case 0x951e: -case 0x951f: -case 0x9718: -case 0x9719: -case 0x971a: -case 0x971b: -case 0x971c: -case 0x971d: -case 0x971e: -case 0x971f: -case 0x9918: -case 0x9919: -case 0x991a: -case 0x991b: -case 0x991c: -case 0x991d: -case 0x991e: -case 0x991f: -case 0x9b18: -case 0x9b19: -case 0x9b1a: -case 0x9b1b: -case 0x9b1c: -case 0x9b1d: -case 0x9b1e: -case 0x9b1f: -case 0x9d18: -case 0x9d19: -case 0x9d1a: -case 0x9d1b: -case 0x9d1c: -case 0x9d1d: -case 0x9d1e: -case 0x9d1f: -case 0x9f18: -case 0x9f19: -case 0x9f1a: -case 0x9f1b: -case 0x9f1c: -case 0x9f1d: -case 0x9f1e: -case 0x9f1f: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd120: -case 0xd121: -case 0xd122: -case 0xd123: -case 0xd124: -case 0xd125: -case 0xd126: -case 0xd127: -case 0xd320: -case 0xd321: -case 0xd322: -case 0xd323: -case 0xd324: -case 0xd325: -case 0xd326: -case 0xd327: -case 0xd520: -case 0xd521: -case 0xd522: -case 0xd523: -case 0xd524: -case 0xd525: -case 0xd526: -case 0xd527: -case 0xd720: -case 0xd721: -case 0xd722: -case 0xd723: -case 0xd724: -case 0xd725: -case 0xd726: -case 0xd727: -case 0xd920: -case 0xd921: -case 0xd922: -case 0xd923: -case 0xd924: -case 0xd925: -case 0xd926: -case 0xd927: -case 0xdb20: -case 0xdb21: -case 0xdb22: -case 0xdb23: -case 0xdb24: -case 0xdb25: -case 0xdb26: -case 0xdb27: -case 0xdd20: -case 0xdd21: -case 0xdd22: -case 0xdd23: -case 0xdd24: -case 0xdd25: -case 0xdd26: -case 0xdd27: -case 0xdf20: -case 0xdf21: -case 0xdf22: -case 0xdf23: -case 0xdf24: -case 0xdf25: -case 0xdf26: -case 0xdf27: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0xc120: -case 0xc121: -case 0xc122: -case 0xc123: -case 0xc124: -case 0xc125: -case 0xc126: -case 0xc127: -case 0xc320: -case 0xc321: -case 0xc322: -case 0xc323: -case 0xc324: -case 0xc325: -case 0xc326: -case 0xc327: -case 0xc520: -case 0xc521: -case 0xc522: -case 0xc523: -case 0xc524: -case 0xc525: -case 0xc526: -case 0xc527: -case 0xc720: -case 0xc721: -case 0xc722: -case 0xc723: -case 0xc724: -case 0xc725: -case 0xc726: -case 0xc727: -case 0xc920: -case 0xc921: -case 0xc922: -case 0xc923: -case 0xc924: -case 0xc925: -case 0xc926: -case 0xc927: -case 0xcb20: -case 0xcb21: -case 0xcb22: -case 0xcb23: -case 0xcb24: -case 0xcb25: -case 0xcb26: -case 0xcb27: -case 0xcd20: -case 0xcd21: -case 0xcd22: -case 0xcd23: -case 0xcd24: -case 0xcd25: -case 0xcd26: -case 0xcd27: -case 0xcf20: -case 0xcf21: -case 0xcf22: -case 0xcf23: -case 0xcf24: -case 0xcf25: -case 0xcf26: -case 0xcf27: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0xb120: -case 0xb121: -case 0xb122: -case 0xb123: -case 0xb124: -case 0xb125: -case 0xb126: -case 0xb127: -case 0xb320: -case 0xb321: -case 0xb322: -case 0xb323: -case 0xb324: -case 0xb325: -case 0xb326: -case 0xb327: -case 0xb520: -case 0xb521: -case 0xb522: -case 0xb523: -case 0xb524: -case 0xb525: -case 0xb526: -case 0xb527: -case 0xb720: -case 0xb721: -case 0xb722: -case 0xb723: -case 0xb724: -case 0xb725: -case 0xb726: -case 0xb727: -case 0xb920: -case 0xb921: -case 0xb922: -case 0xb923: -case 0xb924: -case 0xb925: -case 0xb926: -case 0xb927: -case 0xbb20: -case 0xbb21: -case 0xbb22: -case 0xbb23: -case 0xbb24: -case 0xbb25: -case 0xbb26: -case 0xbb27: -case 0xbd20: -case 0xbd21: -case 0xbd22: -case 0xbd23: -case 0xbd24: -case 0xbd25: -case 0xbd26: -case 0xbd27: -case 0xbf20: -case 0xbf21: -case 0xbf22: -case 0xbf23: -case 0xbf24: -case 0xbf25: -case 0xbf26: -case 0xbf27: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x8120: -case 0x8121: -case 0x8122: -case 0x8123: -case 0x8124: -case 0x8125: -case 0x8126: -case 0x8127: -case 0x8320: -case 0x8321: -case 0x8322: -case 0x8323: -case 0x8324: -case 0x8325: -case 0x8326: -case 0x8327: -case 0x8520: -case 0x8521: -case 0x8522: -case 0x8523: -case 0x8524: -case 0x8525: -case 0x8526: -case 0x8527: -case 0x8720: -case 0x8721: -case 0x8722: -case 0x8723: -case 0x8724: -case 0x8725: -case 0x8726: -case 0x8727: -case 0x8920: -case 0x8921: -case 0x8922: -case 0x8923: -case 0x8924: -case 0x8925: -case 0x8926: -case 0x8927: -case 0x8b20: -case 0x8b21: -case 0x8b22: -case 0x8b23: -case 0x8b24: -case 0x8b25: -case 0x8b26: -case 0x8b27: -case 0x8d20: -case 0x8d21: -case 0x8d22: -case 0x8d23: -case 0x8d24: -case 0x8d25: -case 0x8d26: -case 0x8d27: -case 0x8f20: -case 0x8f21: -case 0x8f22: -case 0x8f23: -case 0x8f24: -case 0x8f25: -case 0x8f26: -case 0x8f27: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x9120: -case 0x9121: -case 0x9122: -case 0x9123: -case 0x9124: -case 0x9125: -case 0x9126: -case 0x9127: -case 0x9320: -case 0x9321: -case 0x9322: -case 0x9323: -case 0x9324: -case 0x9325: -case 0x9326: -case 0x9327: -case 0x9520: -case 0x9521: -case 0x9522: -case 0x9523: -case 0x9524: -case 0x9525: -case 0x9526: -case 0x9527: -case 0x9720: -case 0x9721: -case 0x9722: -case 0x9723: -case 0x9724: -case 0x9725: -case 0x9726: -case 0x9727: -case 0x9920: -case 0x9921: -case 0x9922: -case 0x9923: -case 0x9924: -case 0x9925: -case 0x9926: -case 0x9927: -case 0x9b20: -case 0x9b21: -case 0x9b22: -case 0x9b23: -case 0x9b24: -case 0x9b25: -case 0x9b26: -case 0x9b27: -case 0x9d20: -case 0x9d21: -case 0x9d22: -case 0x9d23: -case 0x9d24: -case 0x9d25: -case 0x9d26: -case 0x9d27: -case 0x9f20: -case 0x9f21: -case 0x9f22: -case 0x9f23: -case 0x9f24: -case 0x9f25: -case 0x9f26: -case 0x9f27: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xb100: -case 0xb101: -case 0xb102: -case 0xb103: -case 0xb104: -case 0xb105: -case 0xb106: -case 0xb107: -case 0xb300: -case 0xb301: -case 0xb302: -case 0xb303: -case 0xb304: -case 0xb305: -case 0xb306: -case 0xb307: -case 0xb500: -case 0xb501: -case 0xb502: -case 0xb503: -case 0xb504: -case 0xb505: -case 0xb506: -case 0xb507: -case 0xb700: -case 0xb701: -case 0xb702: -case 0xb703: -case 0xb704: -case 0xb705: -case 0xb706: -case 0xb707: -case 0xb900: -case 0xb901: -case 0xb902: -case 0xb903: -case 0xb904: -case 0xb905: -case 0xb906: -case 0xb907: -case 0xbb00: -case 0xbb01: -case 0xbb02: -case 0xbb03: -case 0xbb04: -case 0xbb05: -case 0xbb06: -case 0xbb07: -case 0xbd00: -case 0xbd01: -case 0xbd02: -case 0xbd03: -case 0xbd04: -case 0xbd05: -case 0xbd06: -case 0xbd07: -case 0xbf00: -case 0xbf01: -case 0xbf02: -case 0xbf03: -case 0xbf04: -case 0xbf05: -case 0xbf06: -case 0xbf07: - { - HAM src(this, instr_b11_b9); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x13c0: -case 0x13c1: -case 0x13c2: -case 0x13c3: -case 0x13c4: -case 0x13c5: -case 0x13c6: -case 0x13c7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11c0: -case 0x11c1: -case 0x11c2: -case 0x11c3: -case 0x11c4: -case 0x11c5: -case 0x11c6: -case 0x11c7: - { - HAM src(this, instr_b2_b0); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x1080: -case 0x1081: -case 0x1082: -case 0x1083: -case 0x1084: -case 0x1085: -case 0x1086: -case 0x1087: -case 0x1280: -case 0x1281: -case 0x1282: -case 0x1283: -case 0x1284: -case 0x1285: -case 0x1286: -case 0x1287: -case 0x1480: -case 0x1481: -case 0x1482: -case 0x1483: -case 0x1484: -case 0x1485: -case 0x1486: -case 0x1487: -case 0x1680: -case 0x1681: -case 0x1682: -case 0x1683: -case 0x1684: -case 0x1685: -case 0x1686: -case 0x1687: -case 0x1880: -case 0x1881: -case 0x1882: -case 0x1883: -case 0x1884: -case 0x1885: -case 0x1886: -case 0x1887: -case 0x1a80: -case 0x1a81: -case 0x1a82: -case 0x1a83: -case 0x1a84: -case 0x1a85: -case 0x1a86: -case 0x1a87: -case 0x1c80: -case 0x1c81: -case 0x1c82: -case 0x1c83: -case 0x1c84: -case 0x1c85: -case 0x1c86: -case 0x1c87: -case 0x1e80: -case 0x1e81: -case 0x1e82: -case 0x1e83: -case 0x1e84: -case 0x1e85: -case 0x1e86: -case 0x1e87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1140: -case 0x1141: -case 0x1142: -case 0x1143: -case 0x1144: -case 0x1145: -case 0x1146: -case 0x1147: -case 0x1340: -case 0x1341: -case 0x1342: -case 0x1343: -case 0x1344: -case 0x1345: -case 0x1346: -case 0x1347: -case 0x1540: -case 0x1541: -case 0x1542: -case 0x1543: -case 0x1544: -case 0x1545: -case 0x1546: -case 0x1547: -case 0x1740: -case 0x1741: -case 0x1742: -case 0x1743: -case 0x1744: -case 0x1745: -case 0x1746: -case 0x1747: -case 0x1940: -case 0x1941: -case 0x1942: -case 0x1943: -case 0x1944: -case 0x1945: -case 0x1946: -case 0x1947: -case 0x1b40: -case 0x1b41: -case 0x1b42: -case 0x1b43: -case 0x1b44: -case 0x1b45: -case 0x1b46: -case 0x1b47: -case 0x1d40: -case 0x1d41: -case 0x1d42: -case 0x1d43: -case 0x1d44: -case 0x1d45: -case 0x1d46: -case 0x1d47: -case 0x1f40: -case 0x1f41: -case 0x1f42: -case 0x1f43: -case 0x1f44: -case 0x1f45: -case 0x1f46: -case 0x1f47: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1180: -case 0x1181: -case 0x1182: -case 0x1183: -case 0x1184: -case 0x1185: -case 0x1186: -case 0x1187: -case 0x1380: -case 0x1381: -case 0x1382: -case 0x1383: -case 0x1384: -case 0x1385: -case 0x1386: -case 0x1387: -case 0x1580: -case 0x1581: -case 0x1582: -case 0x1583: -case 0x1584: -case 0x1585: -case 0x1586: -case 0x1587: -case 0x1780: -case 0x1781: -case 0x1782: -case 0x1783: -case 0x1784: -case 0x1785: -case 0x1786: -case 0x1787: -case 0x1980: -case 0x1981: -case 0x1982: -case 0x1983: -case 0x1984: -case 0x1985: -case 0x1986: -case 0x1987: -case 0x1b80: -case 0x1b81: -case 0x1b82: -case 0x1b83: -case 0x1b84: -case 0x1b85: -case 0x1b86: -case 0x1b87: -case 0x1d80: -case 0x1d81: -case 0x1d82: -case 0x1d83: -case 0x1d84: -case 0x1d85: -case 0x1d86: -case 0x1d87: -case 0x1f80: -case 0x1f81: -case 0x1f82: -case 0x1f83: -case 0x1f84: -case 0x1f85: -case 0x1f86: -case 0x1f87: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x10c0: -case 0x10c1: -case 0x10c2: -case 0x10c3: -case 0x10c4: -case 0x10c5: -case 0x10c6: -case 0x10c7: -case 0x12c0: -case 0x12c1: -case 0x12c2: -case 0x12c3: -case 0x12c4: -case 0x12c5: -case 0x12c6: -case 0x12c7: -case 0x14c0: -case 0x14c1: -case 0x14c2: -case 0x14c3: -case 0x14c4: -case 0x14c5: -case 0x14c6: -case 0x14c7: -case 0x16c0: -case 0x16c1: -case 0x16c2: -case 0x16c3: -case 0x16c4: -case 0x16c5: -case 0x16c6: -case 0x16c7: -case 0x18c0: -case 0x18c1: -case 0x18c2: -case 0x18c3: -case 0x18c4: -case 0x18c5: -case 0x18c6: -case 0x18c7: -case 0x1ac0: -case 0x1ac1: -case 0x1ac2: -case 0x1ac3: -case 0x1ac4: -case 0x1ac5: -case 0x1ac6: -case 0x1ac7: -case 0x1cc0: -case 0x1cc1: -case 0x1cc2: -case 0x1cc3: -case 0x1cc4: -case 0x1cc5: -case 0x1cc6: -case 0x1cc7: -case 0x1ec0: -case 0x1ec1: -case 0x1ec2: -case 0x1ec3: -case 0x1ec4: -case 0x1ec5: -case 0x1ec6: -case 0x1ec7: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x1100: -case 0x1101: -case 0x1102: -case 0x1103: -case 0x1104: -case 0x1105: -case 0x1106: -case 0x1107: -case 0x1300: -case 0x1301: -case 0x1302: -case 0x1303: -case 0x1304: -case 0x1305: -case 0x1306: -case 0x1307: -case 0x1500: -case 0x1501: -case 0x1502: -case 0x1503: -case 0x1504: -case 0x1505: -case 0x1506: -case 0x1507: -case 0x1700: -case 0x1701: -case 0x1702: -case 0x1703: -case 0x1704: -case 0x1705: -case 0x1706: -case 0x1707: -case 0x1900: -case 0x1901: -case 0x1902: -case 0x1903: -case 0x1904: -case 0x1905: -case 0x1906: -case 0x1907: -case 0x1b00: -case 0x1b01: -case 0x1b02: -case 0x1b03: -case 0x1b04: -case 0x1b05: -case 0x1b06: -case 0x1b07: -case 0x1d00: -case 0x1d01: -case 0x1d02: -case 0x1d03: -case 0x1d04: -case 0x1d05: -case 0x1d06: -case 0x1d07: -case 0x1f00: -case 0x1f01: -case 0x1f02: -case 0x1f03: -case 0x1f04: -case 0x1f05: -case 0x1f06: -case 0x1f07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xc100: -case 0xc101: -case 0xc102: -case 0xc103: -case 0xc104: -case 0xc105: -case 0xc106: -case 0xc107: -case 0xc300: -case 0xc301: -case 0xc302: -case 0xc303: -case 0xc304: -case 0xc305: -case 0xc306: -case 0xc307: -case 0xc500: -case 0xc501: -case 0xc502: -case 0xc503: -case 0xc504: -case 0xc505: -case 0xc506: -case 0xc507: -case 0xc700: -case 0xc701: -case 0xc702: -case 0xc703: -case 0xc704: -case 0xc705: -case 0xc706: -case 0xc707: -case 0xc900: -case 0xc901: -case 0xc902: -case 0xc903: -case 0xc904: -case 0xc905: -case 0xc906: -case 0xc907: -case 0xcb00: -case 0xcb01: -case 0xcb02: -case 0xcb03: -case 0xcb04: -case 0xcb05: -case 0xcb06: -case 0xcb07: -case 0xcd00: -case 0xcd01: -case 0xcd02: -case 0xcd03: -case 0xcd04: -case 0xcd05: -case 0xcd06: -case 0xcd07: -case 0xcf00: -case 0xcf01: -case 0xcf02: -case 0xcf03: -case 0xcf04: -case 0xcf05: -case 0xcf06: -case 0xcf07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ABCD(src, dst); - } - break; - -case 0xd000: -case 0xd001: -case 0xd002: -case 0xd003: -case 0xd004: -case 0xd005: -case 0xd006: -case 0xd007: -case 0xd200: -case 0xd201: -case 0xd202: -case 0xd203: -case 0xd204: -case 0xd205: -case 0xd206: -case 0xd207: -case 0xd400: -case 0xd401: -case 0xd402: -case 0xd403: -case 0xd404: -case 0xd405: -case 0xd406: -case 0xd407: -case 0xd600: -case 0xd601: -case 0xd602: -case 0xd603: -case 0xd604: -case 0xd605: -case 0xd606: -case 0xd607: -case 0xd800: -case 0xd801: -case 0xd802: -case 0xd803: -case 0xd804: -case 0xd805: -case 0xd806: -case 0xd807: -case 0xda00: -case 0xda01: -case 0xda02: -case 0xda03: -case 0xda04: -case 0xda05: -case 0xda06: -case 0xda07: -case 0xdc00: -case 0xdc01: -case 0xdc02: -case 0xdc03: -case 0xdc04: -case 0xdc05: -case 0xdc06: -case 0xdc07: -case 0xde00: -case 0xde01: -case 0xde02: -case 0xde03: -case 0xde04: -case 0xde05: -case 0xde06: -case 0xde07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xd100: -case 0xd101: -case 0xd102: -case 0xd103: -case 0xd104: -case 0xd105: -case 0xd106: -case 0xd107: -case 0xd300: -case 0xd301: -case 0xd302: -case 0xd303: -case 0xd304: -case 0xd305: -case 0xd306: -case 0xd307: -case 0xd500: -case 0xd501: -case 0xd502: -case 0xd503: -case 0xd504: -case 0xd505: -case 0xd506: -case 0xd507: -case 0xd700: -case 0xd701: -case 0xd702: -case 0xd703: -case 0xd704: -case 0xd705: -case 0xd706: -case 0xd707: -case 0xd900: -case 0xd901: -case 0xd902: -case 0xd903: -case 0xd904: -case 0xd905: -case 0xd906: -case 0xd907: -case 0xdb00: -case 0xdb01: -case 0xdb02: -case 0xdb03: -case 0xdb04: -case 0xdb05: -case 0xdb06: -case 0xdb07: -case 0xdd00: -case 0xdd01: -case 0xdd02: -case 0xdd03: -case 0xdd04: -case 0xdd05: -case 0xdd06: -case 0xdd07: -case 0xdf00: -case 0xdf01: -case 0xdf02: -case 0xdf03: -case 0xdf04: -case 0xdf05: -case 0xdf06: -case 0xdf07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); ADDX(src, dst); - } - break; - -case 0xc000: -case 0xc001: -case 0xc002: -case 0xc003: -case 0xc004: -case 0xc005: -case 0xc006: -case 0xc007: -case 0xc200: -case 0xc201: -case 0xc202: -case 0xc203: -case 0xc204: -case 0xc205: -case 0xc206: -case 0xc207: -case 0xc400: -case 0xc401: -case 0xc402: -case 0xc403: -case 0xc404: -case 0xc405: -case 0xc406: -case 0xc407: -case 0xc600: -case 0xc601: -case 0xc602: -case 0xc603: -case 0xc604: -case 0xc605: -case 0xc606: -case 0xc607: -case 0xc800: -case 0xc801: -case 0xc802: -case 0xc803: -case 0xc804: -case 0xc805: -case 0xc806: -case 0xc807: -case 0xca00: -case 0xca01: -case 0xca02: -case 0xca03: -case 0xca04: -case 0xca05: -case 0xca06: -case 0xca07: -case 0xcc00: -case 0xcc01: -case 0xcc02: -case 0xcc03: -case 0xcc04: -case 0xcc05: -case 0xcc06: -case 0xcc07: -case 0xce00: -case 0xce01: -case 0xce02: -case 0xce03: -case 0xce04: -case 0xce05: -case 0xce06: -case 0xce07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb000: -case 0xb001: -case 0xb002: -case 0xb003: -case 0xb004: -case 0xb005: -case 0xb006: -case 0xb007: -case 0xb200: -case 0xb201: -case 0xb202: -case 0xb203: -case 0xb204: -case 0xb205: -case 0xb206: -case 0xb207: -case 0xb400: -case 0xb401: -case 0xb402: -case 0xb403: -case 0xb404: -case 0xb405: -case 0xb406: -case 0xb407: -case 0xb600: -case 0xb601: -case 0xb602: -case 0xb603: -case 0xb604: -case 0xb605: -case 0xb606: -case 0xb607: -case 0xb800: -case 0xb801: -case 0xb802: -case 0xb803: -case 0xb804: -case 0xb805: -case 0xb806: -case 0xb807: -case 0xba00: -case 0xba01: -case 0xba02: -case 0xba03: -case 0xba04: -case 0xba05: -case 0xba06: -case 0xba07: -case 0xbc00: -case 0xbc01: -case 0xbc02: -case 0xbc03: -case 0xbc04: -case 0xbc05: -case 0xbc06: -case 0xbc07: -case 0xbe00: -case 0xbe01: -case 0xbe02: -case 0xbe03: -case 0xbe04: -case 0xbe05: -case 0xbe06: -case 0xbe07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x1000: -case 0x1001: -case 0x1002: -case 0x1003: -case 0x1004: -case 0x1005: -case 0x1006: -case 0x1007: -case 0x1200: -case 0x1201: -case 0x1202: -case 0x1203: -case 0x1204: -case 0x1205: -case 0x1206: -case 0x1207: -case 0x1400: -case 0x1401: -case 0x1402: -case 0x1403: -case 0x1404: -case 0x1405: -case 0x1406: -case 0x1407: -case 0x1600: -case 0x1601: -case 0x1602: -case 0x1603: -case 0x1604: -case 0x1605: -case 0x1606: -case 0x1607: -case 0x1800: -case 0x1801: -case 0x1802: -case 0x1803: -case 0x1804: -case 0x1805: -case 0x1806: -case 0x1807: -case 0x1a00: -case 0x1a01: -case 0x1a02: -case 0x1a03: -case 0x1a04: -case 0x1a05: -case 0x1a06: -case 0x1a07: -case 0x1c00: -case 0x1c01: -case 0x1c02: -case 0x1c03: -case 0x1c04: -case 0x1c05: -case 0x1c06: -case 0x1c07: -case 0x1e00: -case 0x1e01: -case 0x1e02: -case 0x1e03: -case 0x1e04: -case 0x1e05: -case 0x1e06: -case 0x1e07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x8000: -case 0x8001: -case 0x8002: -case 0x8003: -case 0x8004: -case 0x8005: -case 0x8006: -case 0x8007: -case 0x8200: -case 0x8201: -case 0x8202: -case 0x8203: -case 0x8204: -case 0x8205: -case 0x8206: -case 0x8207: -case 0x8400: -case 0x8401: -case 0x8402: -case 0x8403: -case 0x8404: -case 0x8405: -case 0x8406: -case 0x8407: -case 0x8600: -case 0x8601: -case 0x8602: -case 0x8603: -case 0x8604: -case 0x8605: -case 0x8606: -case 0x8607: -case 0x8800: -case 0x8801: -case 0x8802: -case 0x8803: -case 0x8804: -case 0x8805: -case 0x8806: -case 0x8807: -case 0x8a00: -case 0x8a01: -case 0x8a02: -case 0x8a03: -case 0x8a04: -case 0x8a05: -case 0x8a06: -case 0x8a07: -case 0x8c00: -case 0x8c01: -case 0x8c02: -case 0x8c03: -case 0x8c04: -case 0x8c05: -case 0x8c06: -case 0x8c07: -case 0x8e00: -case 0x8e01: -case 0x8e02: -case 0x8e03: -case 0x8e04: -case 0x8e05: -case 0x8e06: -case 0x8e07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x8100: -case 0x8101: -case 0x8102: -case 0x8103: -case 0x8104: -case 0x8105: -case 0x8106: -case 0x8107: -case 0x8300: -case 0x8301: -case 0x8302: -case 0x8303: -case 0x8304: -case 0x8305: -case 0x8306: -case 0x8307: -case 0x8500: -case 0x8501: -case 0x8502: -case 0x8503: -case 0x8504: -case 0x8505: -case 0x8506: -case 0x8507: -case 0x8700: -case 0x8701: -case 0x8702: -case 0x8703: -case 0x8704: -case 0x8705: -case 0x8706: -case 0x8707: -case 0x8900: -case 0x8901: -case 0x8902: -case 0x8903: -case 0x8904: -case 0x8905: -case 0x8906: -case 0x8907: -case 0x8b00: -case 0x8b01: -case 0x8b02: -case 0x8b03: -case 0x8b04: -case 0x8b05: -case 0x8b06: -case 0x8b07: -case 0x8d00: -case 0x8d01: -case 0x8d02: -case 0x8d03: -case 0x8d04: -case 0x8d05: -case 0x8d06: -case 0x8d07: -case 0x8f00: -case 0x8f01: -case 0x8f02: -case 0x8f03: -case 0x8f04: -case 0x8f05: -case 0x8f06: -case 0x8f07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SBCD(src, dst); - } - break; - -case 0x9000: -case 0x9001: -case 0x9002: -case 0x9003: -case 0x9004: -case 0x9005: -case 0x9006: -case 0x9007: -case 0x9200: -case 0x9201: -case 0x9202: -case 0x9203: -case 0x9204: -case 0x9205: -case 0x9206: -case 0x9207: -case 0x9400: -case 0x9401: -case 0x9402: -case 0x9403: -case 0x9404: -case 0x9405: -case 0x9406: -case 0x9407: -case 0x9600: -case 0x9601: -case 0x9602: -case 0x9603: -case 0x9604: -case 0x9605: -case 0x9606: -case 0x9607: -case 0x9800: -case 0x9801: -case 0x9802: -case 0x9803: -case 0x9804: -case 0x9805: -case 0x9806: -case 0x9807: -case 0x9a00: -case 0x9a01: -case 0x9a02: -case 0x9a03: -case 0x9a04: -case 0x9a05: -case 0x9a06: -case 0x9a07: -case 0x9c00: -case 0x9c01: -case 0x9c02: -case 0x9c03: -case 0x9c04: -case 0x9c05: -case 0x9c06: -case 0x9c07: -case 0x9e00: -case 0x9e01: -case 0x9e02: -case 0x9e03: -case 0x9e04: -case 0x9e05: -case 0x9e06: -case 0x9e07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x9100: -case 0x9101: -case 0x9102: -case 0x9103: -case 0x9104: -case 0x9105: -case 0x9106: -case 0x9107: -case 0x9300: -case 0x9301: -case 0x9302: -case 0x9303: -case 0x9304: -case 0x9305: -case 0x9306: -case 0x9307: -case 0x9500: -case 0x9501: -case 0x9502: -case 0x9503: -case 0x9504: -case 0x9505: -case 0x9506: -case 0x9507: -case 0x9700: -case 0x9701: -case 0x9702: -case 0x9703: -case 0x9704: -case 0x9705: -case 0x9706: -case 0x9707: -case 0x9900: -case 0x9901: -case 0x9902: -case 0x9903: -case 0x9904: -case 0x9905: -case 0x9906: -case 0x9907: -case 0x9b00: -case 0x9b01: -case 0x9b02: -case 0x9b03: -case 0x9b04: -case 0x9b05: -case 0x9b06: -case 0x9b07: -case 0x9d00: -case 0x9d01: -case 0x9d02: -case 0x9d03: -case 0x9d04: -case 0x9d05: -case 0x9d06: -case 0x9d07: -case 0x9f00: -case 0x9f01: -case 0x9f02: -case 0x9f03: -case 0x9f04: -case 0x9f05: -case 0x9f06: -case 0x9f07: - { - HAM src(this, instr_b2_b0); HAM dst(this, instr_b11_b9); SUBX(src, dst); - } - break; - -case 0xe120: -case 0xe121: -case 0xe122: -case 0xe123: -case 0xe124: -case 0xe125: -case 0xe126: -case 0xe127: -case 0xe320: -case 0xe321: -case 0xe322: -case 0xe323: -case 0xe324: -case 0xe325: -case 0xe326: -case 0xe327: -case 0xe520: -case 0xe521: -case 0xe522: -case 0xe523: -case 0xe524: -case 0xe525: -case 0xe526: -case 0xe527: -case 0xe720: -case 0xe721: -case 0xe722: -case 0xe723: -case 0xe724: -case 0xe725: -case 0xe726: -case 0xe727: -case 0xe920: -case 0xe921: -case 0xe922: -case 0xe923: -case 0xe924: -case 0xe925: -case 0xe926: -case 0xe927: -case 0xeb20: -case 0xeb21: -case 0xeb22: -case 0xeb23: -case 0xeb24: -case 0xeb25: -case 0xeb26: -case 0xeb27: -case 0xed20: -case 0xed21: -case 0xed22: -case 0xed23: -case 0xed24: -case 0xed25: -case 0xed26: -case 0xed27: -case 0xef20: -case 0xef21: -case 0xef22: -case 0xef23: -case 0xef24: -case 0xef25: -case 0xef26: -case 0xef27: - { - HAM targ(this, instr_b2_b0); ASL(targ, D[instr_b11_b9]); - } - break; - -case 0xe100: -case 0xe101: -case 0xe102: -case 0xe103: -case 0xe104: -case 0xe105: -case 0xe106: -case 0xe107: -case 0xe300: -case 0xe301: -case 0xe302: -case 0xe303: -case 0xe304: -case 0xe305: -case 0xe306: -case 0xe307: -case 0xe500: -case 0xe501: -case 0xe502: -case 0xe503: -case 0xe504: -case 0xe505: -case 0xe506: -case 0xe507: -case 0xe700: -case 0xe701: -case 0xe702: -case 0xe703: -case 0xe704: -case 0xe705: -case 0xe706: -case 0xe707: -case 0xe900: -case 0xe901: -case 0xe902: -case 0xe903: -case 0xe904: -case 0xe905: -case 0xe906: -case 0xe907: -case 0xeb00: -case 0xeb01: -case 0xeb02: -case 0xeb03: -case 0xeb04: -case 0xeb05: -case 0xeb06: -case 0xeb07: -case 0xed00: -case 0xed01: -case 0xed02: -case 0xed03: -case 0xed04: -case 0xed05: -case 0xed06: -case 0xed07: -case 0xef00: -case 0xef01: -case 0xef02: -case 0xef03: -case 0xef04: -case 0xef05: -case 0xef06: -case 0xef07: - { - HAM targ(this, instr_b2_b0); ASL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe020: -case 0xe021: -case 0xe022: -case 0xe023: -case 0xe024: -case 0xe025: -case 0xe026: -case 0xe027: -case 0xe220: -case 0xe221: -case 0xe222: -case 0xe223: -case 0xe224: -case 0xe225: -case 0xe226: -case 0xe227: -case 0xe420: -case 0xe421: -case 0xe422: -case 0xe423: -case 0xe424: -case 0xe425: -case 0xe426: -case 0xe427: -case 0xe620: -case 0xe621: -case 0xe622: -case 0xe623: -case 0xe624: -case 0xe625: -case 0xe626: -case 0xe627: -case 0xe820: -case 0xe821: -case 0xe822: -case 0xe823: -case 0xe824: -case 0xe825: -case 0xe826: -case 0xe827: -case 0xea20: -case 0xea21: -case 0xea22: -case 0xea23: -case 0xea24: -case 0xea25: -case 0xea26: -case 0xea27: -case 0xec20: -case 0xec21: -case 0xec22: -case 0xec23: -case 0xec24: -case 0xec25: -case 0xec26: -case 0xec27: -case 0xee20: -case 0xee21: -case 0xee22: -case 0xee23: -case 0xee24: -case 0xee25: -case 0xee26: -case 0xee27: - { - HAM targ(this, instr_b2_b0); ASR(targ, D[instr_b11_b9]); - } - break; - -case 0xe000: -case 0xe001: -case 0xe002: -case 0xe003: -case 0xe004: -case 0xe005: -case 0xe006: -case 0xe007: -case 0xe200: -case 0xe201: -case 0xe202: -case 0xe203: -case 0xe204: -case 0xe205: -case 0xe206: -case 0xe207: -case 0xe400: -case 0xe401: -case 0xe402: -case 0xe403: -case 0xe404: -case 0xe405: -case 0xe406: -case 0xe407: -case 0xe600: -case 0xe601: -case 0xe602: -case 0xe603: -case 0xe604: -case 0xe605: -case 0xe606: -case 0xe607: -case 0xe800: -case 0xe801: -case 0xe802: -case 0xe803: -case 0xe804: -case 0xe805: -case 0xe806: -case 0xe807: -case 0xea00: -case 0xea01: -case 0xea02: -case 0xea03: -case 0xea04: -case 0xea05: -case 0xea06: -case 0xea07: -case 0xec00: -case 0xec01: -case 0xec02: -case 0xec03: -case 0xec04: -case 0xec05: -case 0xec06: -case 0xec07: -case 0xee00: -case 0xee01: -case 0xee02: -case 0xee03: -case 0xee04: -case 0xee05: -case 0xee06: -case 0xee07: - { - HAM targ(this, instr_b2_b0); ASR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe128: -case 0xe129: -case 0xe12a: -case 0xe12b: -case 0xe12c: -case 0xe12d: -case 0xe12e: -case 0xe12f: -case 0xe328: -case 0xe329: -case 0xe32a: -case 0xe32b: -case 0xe32c: -case 0xe32d: -case 0xe32e: -case 0xe32f: -case 0xe528: -case 0xe529: -case 0xe52a: -case 0xe52b: -case 0xe52c: -case 0xe52d: -case 0xe52e: -case 0xe52f: -case 0xe728: -case 0xe729: -case 0xe72a: -case 0xe72b: -case 0xe72c: -case 0xe72d: -case 0xe72e: -case 0xe72f: -case 0xe928: -case 0xe929: -case 0xe92a: -case 0xe92b: -case 0xe92c: -case 0xe92d: -case 0xe92e: -case 0xe92f: -case 0xeb28: -case 0xeb29: -case 0xeb2a: -case 0xeb2b: -case 0xeb2c: -case 0xeb2d: -case 0xeb2e: -case 0xeb2f: -case 0xed28: -case 0xed29: -case 0xed2a: -case 0xed2b: -case 0xed2c: -case 0xed2d: -case 0xed2e: -case 0xed2f: -case 0xef28: -case 0xef29: -case 0xef2a: -case 0xef2b: -case 0xef2c: -case 0xef2d: -case 0xef2e: -case 0xef2f: - { - HAM targ(this, instr_b2_b0); LSL(targ, D[instr_b11_b9]); - } - break; - -case 0xe108: -case 0xe109: -case 0xe10a: -case 0xe10b: -case 0xe10c: -case 0xe10d: -case 0xe10e: -case 0xe10f: -case 0xe308: -case 0xe309: -case 0xe30a: -case 0xe30b: -case 0xe30c: -case 0xe30d: -case 0xe30e: -case 0xe30f: -case 0xe508: -case 0xe509: -case 0xe50a: -case 0xe50b: -case 0xe50c: -case 0xe50d: -case 0xe50e: -case 0xe50f: -case 0xe708: -case 0xe709: -case 0xe70a: -case 0xe70b: -case 0xe70c: -case 0xe70d: -case 0xe70e: -case 0xe70f: -case 0xe908: -case 0xe909: -case 0xe90a: -case 0xe90b: -case 0xe90c: -case 0xe90d: -case 0xe90e: -case 0xe90f: -case 0xeb08: -case 0xeb09: -case 0xeb0a: -case 0xeb0b: -case 0xeb0c: -case 0xeb0d: -case 0xeb0e: -case 0xeb0f: -case 0xed08: -case 0xed09: -case 0xed0a: -case 0xed0b: -case 0xed0c: -case 0xed0d: -case 0xed0e: -case 0xed0f: -case 0xef08: -case 0xef09: -case 0xef0a: -case 0xef0b: -case 0xef0c: -case 0xef0d: -case 0xef0e: -case 0xef0f: - { - HAM targ(this, instr_b2_b0); LSL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe028: -case 0xe029: -case 0xe02a: -case 0xe02b: -case 0xe02c: -case 0xe02d: -case 0xe02e: -case 0xe02f: -case 0xe228: -case 0xe229: -case 0xe22a: -case 0xe22b: -case 0xe22c: -case 0xe22d: -case 0xe22e: -case 0xe22f: -case 0xe428: -case 0xe429: -case 0xe42a: -case 0xe42b: -case 0xe42c: -case 0xe42d: -case 0xe42e: -case 0xe42f: -case 0xe628: -case 0xe629: -case 0xe62a: -case 0xe62b: -case 0xe62c: -case 0xe62d: -case 0xe62e: -case 0xe62f: -case 0xe828: -case 0xe829: -case 0xe82a: -case 0xe82b: -case 0xe82c: -case 0xe82d: -case 0xe82e: -case 0xe82f: -case 0xea28: -case 0xea29: -case 0xea2a: -case 0xea2b: -case 0xea2c: -case 0xea2d: -case 0xea2e: -case 0xea2f: -case 0xec28: -case 0xec29: -case 0xec2a: -case 0xec2b: -case 0xec2c: -case 0xec2d: -case 0xec2e: -case 0xec2f: -case 0xee28: -case 0xee29: -case 0xee2a: -case 0xee2b: -case 0xee2c: -case 0xee2d: -case 0xee2e: -case 0xee2f: - { - HAM targ(this, instr_b2_b0); LSR(targ, D[instr_b11_b9]); - } - break; - -case 0xe008: -case 0xe009: -case 0xe00a: -case 0xe00b: -case 0xe00c: -case 0xe00d: -case 0xe00e: -case 0xe00f: -case 0xe208: -case 0xe209: -case 0xe20a: -case 0xe20b: -case 0xe20c: -case 0xe20d: -case 0xe20e: -case 0xe20f: -case 0xe408: -case 0xe409: -case 0xe40a: -case 0xe40b: -case 0xe40c: -case 0xe40d: -case 0xe40e: -case 0xe40f: -case 0xe608: -case 0xe609: -case 0xe60a: -case 0xe60b: -case 0xe60c: -case 0xe60d: -case 0xe60e: -case 0xe60f: -case 0xe808: -case 0xe809: -case 0xe80a: -case 0xe80b: -case 0xe80c: -case 0xe80d: -case 0xe80e: -case 0xe80f: -case 0xea08: -case 0xea09: -case 0xea0a: -case 0xea0b: -case 0xea0c: -case 0xea0d: -case 0xea0e: -case 0xea0f: -case 0xec08: -case 0xec09: -case 0xec0a: -case 0xec0b: -case 0xec0c: -case 0xec0d: -case 0xec0e: -case 0xec0f: -case 0xee08: -case 0xee09: -case 0xee0a: -case 0xee0b: -case 0xee0c: -case 0xee0d: -case 0xee0e: -case 0xee0f: - { - HAM targ(this, instr_b2_b0); LSR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe138: -case 0xe139: -case 0xe13a: -case 0xe13b: -case 0xe13c: -case 0xe13d: -case 0xe13e: -case 0xe13f: -case 0xe338: -case 0xe339: -case 0xe33a: -case 0xe33b: -case 0xe33c: -case 0xe33d: -case 0xe33e: -case 0xe33f: -case 0xe538: -case 0xe539: -case 0xe53a: -case 0xe53b: -case 0xe53c: -case 0xe53d: -case 0xe53e: -case 0xe53f: -case 0xe738: -case 0xe739: -case 0xe73a: -case 0xe73b: -case 0xe73c: -case 0xe73d: -case 0xe73e: -case 0xe73f: -case 0xe938: -case 0xe939: -case 0xe93a: -case 0xe93b: -case 0xe93c: -case 0xe93d: -case 0xe93e: -case 0xe93f: -case 0xeb38: -case 0xeb39: -case 0xeb3a: -case 0xeb3b: -case 0xeb3c: -case 0xeb3d: -case 0xeb3e: -case 0xeb3f: -case 0xed38: -case 0xed39: -case 0xed3a: -case 0xed3b: -case 0xed3c: -case 0xed3d: -case 0xed3e: -case 0xed3f: -case 0xef38: -case 0xef39: -case 0xef3a: -case 0xef3b: -case 0xef3c: -case 0xef3d: -case 0xef3e: -case 0xef3f: - { - HAM targ(this, instr_b2_b0); ROL(targ, D[instr_b11_b9]); - } - break; - -case 0xe118: -case 0xe119: -case 0xe11a: -case 0xe11b: -case 0xe11c: -case 0xe11d: -case 0xe11e: -case 0xe11f: -case 0xe318: -case 0xe319: -case 0xe31a: -case 0xe31b: -case 0xe31c: -case 0xe31d: -case 0xe31e: -case 0xe31f: -case 0xe518: -case 0xe519: -case 0xe51a: -case 0xe51b: -case 0xe51c: -case 0xe51d: -case 0xe51e: -case 0xe51f: -case 0xe718: -case 0xe719: -case 0xe71a: -case 0xe71b: -case 0xe71c: -case 0xe71d: -case 0xe71e: -case 0xe71f: -case 0xe918: -case 0xe919: -case 0xe91a: -case 0xe91b: -case 0xe91c: -case 0xe91d: -case 0xe91e: -case 0xe91f: -case 0xeb18: -case 0xeb19: -case 0xeb1a: -case 0xeb1b: -case 0xeb1c: -case 0xeb1d: -case 0xeb1e: -case 0xeb1f: -case 0xed18: -case 0xed19: -case 0xed1a: -case 0xed1b: -case 0xed1c: -case 0xed1d: -case 0xed1e: -case 0xed1f: -case 0xef18: -case 0xef19: -case 0xef1a: -case 0xef1b: -case 0xef1c: -case 0xef1d: -case 0xef1e: -case 0xef1f: - { - HAM targ(this, instr_b2_b0); ROL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe038: -case 0xe039: -case 0xe03a: -case 0xe03b: -case 0xe03c: -case 0xe03d: -case 0xe03e: -case 0xe03f: -case 0xe238: -case 0xe239: -case 0xe23a: -case 0xe23b: -case 0xe23c: -case 0xe23d: -case 0xe23e: -case 0xe23f: -case 0xe438: -case 0xe439: -case 0xe43a: -case 0xe43b: -case 0xe43c: -case 0xe43d: -case 0xe43e: -case 0xe43f: -case 0xe638: -case 0xe639: -case 0xe63a: -case 0xe63b: -case 0xe63c: -case 0xe63d: -case 0xe63e: -case 0xe63f: -case 0xe838: -case 0xe839: -case 0xe83a: -case 0xe83b: -case 0xe83c: -case 0xe83d: -case 0xe83e: -case 0xe83f: -case 0xea38: -case 0xea39: -case 0xea3a: -case 0xea3b: -case 0xea3c: -case 0xea3d: -case 0xea3e: -case 0xea3f: -case 0xec38: -case 0xec39: -case 0xec3a: -case 0xec3b: -case 0xec3c: -case 0xec3d: -case 0xec3e: -case 0xec3f: -case 0xee38: -case 0xee39: -case 0xee3a: -case 0xee3b: -case 0xee3c: -case 0xee3d: -case 0xee3e: -case 0xee3f: - { - HAM targ(this, instr_b2_b0); ROR(targ, D[instr_b11_b9]); - } - break; - -case 0xe018: -case 0xe019: -case 0xe01a: -case 0xe01b: -case 0xe01c: -case 0xe01d: -case 0xe01e: -case 0xe01f: -case 0xe218: -case 0xe219: -case 0xe21a: -case 0xe21b: -case 0xe21c: -case 0xe21d: -case 0xe21e: -case 0xe21f: -case 0xe418: -case 0xe419: -case 0xe41a: -case 0xe41b: -case 0xe41c: -case 0xe41d: -case 0xe41e: -case 0xe41f: -case 0xe618: -case 0xe619: -case 0xe61a: -case 0xe61b: -case 0xe61c: -case 0xe61d: -case 0xe61e: -case 0xe61f: -case 0xe818: -case 0xe819: -case 0xe81a: -case 0xe81b: -case 0xe81c: -case 0xe81d: -case 0xe81e: -case 0xe81f: -case 0xea18: -case 0xea19: -case 0xea1a: -case 0xea1b: -case 0xea1c: -case 0xea1d: -case 0xea1e: -case 0xea1f: -case 0xec18: -case 0xec19: -case 0xec1a: -case 0xec1b: -case 0xec1c: -case 0xec1d: -case 0xec1e: -case 0xec1f: -case 0xee18: -case 0xee19: -case 0xee1a: -case 0xee1b: -case 0xee1c: -case 0xee1d: -case 0xee1e: -case 0xee1f: - { - HAM targ(this, instr_b2_b0); ROR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe130: -case 0xe131: -case 0xe132: -case 0xe133: -case 0xe134: -case 0xe135: -case 0xe136: -case 0xe137: -case 0xe330: -case 0xe331: -case 0xe332: -case 0xe333: -case 0xe334: -case 0xe335: -case 0xe336: -case 0xe337: -case 0xe530: -case 0xe531: -case 0xe532: -case 0xe533: -case 0xe534: -case 0xe535: -case 0xe536: -case 0xe537: -case 0xe730: -case 0xe731: -case 0xe732: -case 0xe733: -case 0xe734: -case 0xe735: -case 0xe736: -case 0xe737: -case 0xe930: -case 0xe931: -case 0xe932: -case 0xe933: -case 0xe934: -case 0xe935: -case 0xe936: -case 0xe937: -case 0xeb30: -case 0xeb31: -case 0xeb32: -case 0xeb33: -case 0xeb34: -case 0xeb35: -case 0xeb36: -case 0xeb37: -case 0xed30: -case 0xed31: -case 0xed32: -case 0xed33: -case 0xed34: -case 0xed35: -case 0xed36: -case 0xed37: -case 0xef30: -case 0xef31: -case 0xef32: -case 0xef33: -case 0xef34: -case 0xef35: -case 0xef36: -case 0xef37: - { - HAM targ(this, instr_b2_b0); ROXL(targ, D[instr_b11_b9]); - } - break; - -case 0xe110: -case 0xe111: -case 0xe112: -case 0xe113: -case 0xe114: -case 0xe115: -case 0xe116: -case 0xe117: -case 0xe310: -case 0xe311: -case 0xe312: -case 0xe313: -case 0xe314: -case 0xe315: -case 0xe316: -case 0xe317: -case 0xe510: -case 0xe511: -case 0xe512: -case 0xe513: -case 0xe514: -case 0xe515: -case 0xe516: -case 0xe517: -case 0xe710: -case 0xe711: -case 0xe712: -case 0xe713: -case 0xe714: -case 0xe715: -case 0xe716: -case 0xe717: -case 0xe910: -case 0xe911: -case 0xe912: -case 0xe913: -case 0xe914: -case 0xe915: -case 0xe916: -case 0xe917: -case 0xeb10: -case 0xeb11: -case 0xeb12: -case 0xeb13: -case 0xeb14: -case 0xeb15: -case 0xeb16: -case 0xeb17: -case 0xed10: -case 0xed11: -case 0xed12: -case 0xed13: -case 0xed14: -case 0xed15: -case 0xed16: -case 0xed17: -case 0xef10: -case 0xef11: -case 0xef12: -case 0xef13: -case 0xef14: -case 0xef15: -case 0xef16: -case 0xef17: - { - HAM targ(this, instr_b2_b0); ROXL(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0xe030: -case 0xe031: -case 0xe032: -case 0xe033: -case 0xe034: -case 0xe035: -case 0xe036: -case 0xe037: -case 0xe230: -case 0xe231: -case 0xe232: -case 0xe233: -case 0xe234: -case 0xe235: -case 0xe236: -case 0xe237: -case 0xe430: -case 0xe431: -case 0xe432: -case 0xe433: -case 0xe434: -case 0xe435: -case 0xe436: -case 0xe437: -case 0xe630: -case 0xe631: -case 0xe632: -case 0xe633: -case 0xe634: -case 0xe635: -case 0xe636: -case 0xe637: -case 0xe830: -case 0xe831: -case 0xe832: -case 0xe833: -case 0xe834: -case 0xe835: -case 0xe836: -case 0xe837: -case 0xea30: -case 0xea31: -case 0xea32: -case 0xea33: -case 0xea34: -case 0xea35: -case 0xea36: -case 0xea37: -case 0xec30: -case 0xec31: -case 0xec32: -case 0xec33: -case 0xec34: -case 0xec35: -case 0xec36: -case 0xec37: -case 0xee30: -case 0xee31: -case 0xee32: -case 0xee33: -case 0xee34: -case 0xee35: -case 0xee36: -case 0xee37: - { - HAM targ(this, instr_b2_b0); ROXR(targ, D[instr_b11_b9]); - } - break; - -case 0xe010: -case 0xe011: -case 0xe012: -case 0xe013: -case 0xe014: -case 0xe015: -case 0xe016: -case 0xe017: -case 0xe210: -case 0xe211: -case 0xe212: -case 0xe213: -case 0xe214: -case 0xe215: -case 0xe216: -case 0xe217: -case 0xe410: -case 0xe411: -case 0xe412: -case 0xe413: -case 0xe414: -case 0xe415: -case 0xe416: -case 0xe417: -case 0xe610: -case 0xe611: -case 0xe612: -case 0xe613: -case 0xe614: -case 0xe615: -case 0xe616: -case 0xe617: -case 0xe810: -case 0xe811: -case 0xe812: -case 0xe813: -case 0xe814: -case 0xe815: -case 0xe816: -case 0xe817: -case 0xea10: -case 0xea11: -case 0xea12: -case 0xea13: -case 0xea14: -case 0xea15: -case 0xea16: -case 0xea17: -case 0xec10: -case 0xec11: -case 0xec12: -case 0xec13: -case 0xec14: -case 0xec15: -case 0xec16: -case 0xec17: -case 0xee10: -case 0xee11: -case 0xee12: -case 0xee13: -case 0xee14: -case 0xee15: -case 0xee16: -case 0xee17: - { - HAM targ(this, instr_b2_b0); ROXR(targ, instr_b11_b9 ? instr_b11_b9 : 8); - } - break; - -case 0x0639: - { - HAM src(this); HAM dst(this); ADD(src, dst); - } - break; - -case 0x0239: - { - HAM src(this); HAM dst(this); AND(src, dst); - } - break; - -case 0x0c39: - { - HAM src(this); HAM dst(this); CMP(src, dst); - } - break; - -case 0x0a39: - { - HAM src(this); HAM dst(this); EOR(src, dst); - } - break; - -case 0x13fc: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x0039: - { - HAM src(this); HAM dst(this); OR(src, dst); - } - break; - -case 0x0439: - { - HAM src(this); HAM dst(this); SUB(src, dst); - } - break; - -case 0x0638: - { - HAM src(this); HAM dst(this); ADD(src, dst); - } - break; - -case 0x0238: - { - HAM src(this); HAM dst(this); AND(src, dst); - } - break; - -case 0x0c38: - { - HAM src(this); HAM dst(this); CMP(src, dst); - } - break; - -case 0x0a38: - { - HAM src(this); HAM dst(this); EOR(src, dst); - } - break; - -case 0x11fc: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x0038: - { - HAM src(this); HAM dst(this); OR(src, dst); - } - break; - -case 0x0438: - { - HAM src(this); HAM dst(this); SUB(src, dst); - } - break; - -case 0x10bc: -case 0x12bc: -case 0x14bc: -case 0x16bc: -case 0x18bc: -case 0x1abc: -case 0x1cbc: -case 0x1ebc: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0610: -case 0x0611: -case 0x0612: -case 0x0613: -case 0x0614: -case 0x0615: -case 0x0616: -case 0x0617: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0210: -case 0x0211: -case 0x0212: -case 0x0213: -case 0x0214: -case 0x0215: -case 0x0216: -case 0x0217: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c10: -case 0x0c11: -case 0x0c12: -case 0x0c13: -case 0x0c14: -case 0x0c15: -case 0x0c16: -case 0x0c17: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a10: -case 0x0a11: -case 0x0a12: -case 0x0a13: -case 0x0a14: -case 0x0a15: -case 0x0a16: -case 0x0a17: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0010: -case 0x0011: -case 0x0012: -case 0x0013: -case 0x0014: -case 0x0015: -case 0x0016: -case 0x0017: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0410: -case 0x0411: -case 0x0412: -case 0x0413: -case 0x0414: -case 0x0415: -case 0x0416: -case 0x0417: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x117c: -case 0x137c: -case 0x157c: -case 0x177c: -case 0x197c: -case 0x1b7c: -case 0x1d7c: -case 0x1f7c: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0628: -case 0x0629: -case 0x062a: -case 0x062b: -case 0x062c: -case 0x062d: -case 0x062e: -case 0x062f: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0228: -case 0x0229: -case 0x022a: -case 0x022b: -case 0x022c: -case 0x022d: -case 0x022e: -case 0x022f: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c28: -case 0x0c29: -case 0x0c2a: -case 0x0c2b: -case 0x0c2c: -case 0x0c2d: -case 0x0c2e: -case 0x0c2f: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a28: -case 0x0a29: -case 0x0a2a: -case 0x0a2b: -case 0x0a2c: -case 0x0a2d: -case 0x0a2e: -case 0x0a2f: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0028: -case 0x0029: -case 0x002a: -case 0x002b: -case 0x002c: -case 0x002d: -case 0x002e: -case 0x002f: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0428: -case 0x0429: -case 0x042a: -case 0x042b: -case 0x042c: -case 0x042d: -case 0x042e: -case 0x042f: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x11bc: -case 0x13bc: -case 0x15bc: -case 0x17bc: -case 0x19bc: -case 0x1bbc: -case 0x1dbc: -case 0x1fbc: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0630: -case 0x0631: -case 0x0632: -case 0x0633: -case 0x0634: -case 0x0635: -case 0x0636: -case 0x0637: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0230: -case 0x0231: -case 0x0232: -case 0x0233: -case 0x0234: -case 0x0235: -case 0x0236: -case 0x0237: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c30: -case 0x0c31: -case 0x0c32: -case 0x0c33: -case 0x0c34: -case 0x0c35: -case 0x0c36: -case 0x0c37: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a30: -case 0x0a31: -case 0x0a32: -case 0x0a33: -case 0x0a34: -case 0x0a35: -case 0x0a36: -case 0x0a37: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0030: -case 0x0031: -case 0x0032: -case 0x0033: -case 0x0034: -case 0x0035: -case 0x0036: -case 0x0037: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0430: -case 0x0431: -case 0x0432: -case 0x0433: -case 0x0434: -case 0x0435: -case 0x0436: -case 0x0437: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x10fc: -case 0x12fc: -case 0x14fc: -case 0x16fc: -case 0x18fc: -case 0x1afc: -case 0x1cfc: -case 0x1efc: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0618: -case 0x0619: -case 0x061a: -case 0x061b: -case 0x061c: -case 0x061d: -case 0x061e: -case 0x061f: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0218: -case 0x0219: -case 0x021a: -case 0x021b: -case 0x021c: -case 0x021d: -case 0x021e: -case 0x021f: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c18: -case 0x0c19: -case 0x0c1a: -case 0x0c1b: -case 0x0c1c: -case 0x0c1d: -case 0x0c1e: -case 0x0c1f: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a18: -case 0x0a19: -case 0x0a1a: -case 0x0a1b: -case 0x0a1c: -case 0x0a1d: -case 0x0a1e: -case 0x0a1f: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0018: -case 0x0019: -case 0x001a: -case 0x001b: -case 0x001c: -case 0x001d: -case 0x001e: -case 0x001f: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0418: -case 0x0419: -case 0x041a: -case 0x041b: -case 0x041c: -case 0x041d: -case 0x041e: -case 0x041f: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x113c: -case 0x133c: -case 0x153c: -case 0x173c: -case 0x193c: -case 0x1b3c: -case 0x1d3c: -case 0x1f3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x0620: -case 0x0621: -case 0x0622: -case 0x0623: -case 0x0624: -case 0x0625: -case 0x0626: -case 0x0627: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0220: -case 0x0221: -case 0x0222: -case 0x0223: -case 0x0224: -case 0x0225: -case 0x0226: -case 0x0227: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c20: -case 0x0c21: -case 0x0c22: -case 0x0c23: -case 0x0c24: -case 0x0c25: -case 0x0c26: -case 0x0c27: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a20: -case 0x0a21: -case 0x0a22: -case 0x0a23: -case 0x0a24: -case 0x0a25: -case 0x0a26: -case 0x0a27: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0020: -case 0x0021: -case 0x0022: -case 0x0023: -case 0x0024: -case 0x0025: -case 0x0026: -case 0x0027: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0420: -case 0x0421: -case 0x0422: -case 0x0423: -case 0x0424: -case 0x0425: -case 0x0426: -case 0x0427: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0xd03c: -case 0xd23c: -case 0xd43c: -case 0xd63c: -case 0xd83c: -case 0xda3c: -case 0xdc3c: -case 0xde3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc03c: -case 0xc23c: -case 0xc43c: -case 0xc63c: -case 0xc83c: -case 0xca3c: -case 0xcc3c: -case 0xce3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb03c: -case 0xb23c: -case 0xb43c: -case 0xb63c: -case 0xb83c: -case 0xba3c: -case 0xbc3c: -case 0xbe3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x103c: -case 0x123c: -case 0x143c: -case 0x163c: -case 0x183c: -case 0x1a3c: -case 0x1c3c: -case 0x1e3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x803c: -case 0x823c: -case 0x843c: -case 0x863c: -case 0x883c: -case 0x8a3c: -case 0x8c3c: -case 0x8e3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x903c: -case 0x923c: -case 0x943c: -case 0x963c: -case 0x983c: -case 0x9a3c: -case 0x9c3c: -case 0x9e3c: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x0600: -case 0x0601: -case 0x0602: -case 0x0603: -case 0x0604: -case 0x0605: -case 0x0606: -case 0x0607: - { - HAM src(this); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x0200: -case 0x0201: -case 0x0202: -case 0x0203: -case 0x0204: -case 0x0205: -case 0x0206: -case 0x0207: - { - HAM src(this); HAM dst(this, instr_b2_b0); AND(src, dst); - } - break; - -case 0x0c00: -case 0x0c01: -case 0x0c02: -case 0x0c03: -case 0x0c04: -case 0x0c05: -case 0x0c06: -case 0x0c07: - { - HAM src(this); HAM dst(this, instr_b2_b0); CMP(src, dst); - } - break; - -case 0x0a00: -case 0x0a01: -case 0x0a02: -case 0x0a03: -case 0x0a04: -case 0x0a05: -case 0x0a06: -case 0x0a07: - { - HAM src(this); HAM dst(this, instr_b2_b0); EOR(src, dst); - } - break; - -case 0x0000: -case 0x0001: -case 0x0002: -case 0x0003: -case 0x0004: -case 0x0005: -case 0x0006: -case 0x0007: - { - HAM src(this); HAM dst(this, instr_b2_b0); OR(src, dst); - } - break; - -case 0x0400: -case 0x0401: -case 0x0402: -case 0x0403: -case 0x0404: -case 0x0405: -case 0x0406: -case 0x0407: - { - HAM src(this); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5008: -case 0x5009: -case 0x500a: -case 0x500b: -case 0x500c: -case 0x500d: -case 0x500e: -case 0x500f: -case 0x5208: -case 0x5209: -case 0x520a: -case 0x520b: -case 0x520c: -case 0x520d: -case 0x520e: -case 0x520f: -case 0x5408: -case 0x5409: -case 0x540a: -case 0x540b: -case 0x540c: -case 0x540d: -case 0x540e: -case 0x540f: -case 0x5608: -case 0x5609: -case 0x560a: -case 0x560b: -case 0x560c: -case 0x560d: -case 0x560e: -case 0x560f: -case 0x5808: -case 0x5809: -case 0x580a: -case 0x580b: -case 0x580c: -case 0x580d: -case 0x580e: -case 0x580f: -case 0x5a08: -case 0x5a09: -case 0x5a0a: -case 0x5a0b: -case 0x5a0c: -case 0x5a0d: -case 0x5a0e: -case 0x5a0f: -case 0x5c08: -case 0x5c09: -case 0x5c0a: -case 0x5c0b: -case 0x5c0c: -case 0x5c0d: -case 0x5c0e: -case 0x5c0f: -case 0x5e08: -case 0x5e09: -case 0x5e0a: -case 0x5e0b: -case 0x5e0c: -case 0x5e0d: -case 0x5e0e: -case 0x5e0f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5108: -case 0x5109: -case 0x510a: -case 0x510b: -case 0x510c: -case 0x510d: -case 0x510e: -case 0x510f: -case 0x5308: -case 0x5309: -case 0x530a: -case 0x530b: -case 0x530c: -case 0x530d: -case 0x530e: -case 0x530f: -case 0x5508: -case 0x5509: -case 0x550a: -case 0x550b: -case 0x550c: -case 0x550d: -case 0x550e: -case 0x550f: -case 0x5708: -case 0x5709: -case 0x570a: -case 0x570b: -case 0x570c: -case 0x570d: -case 0x570e: -case 0x570f: -case 0x5908: -case 0x5909: -case 0x590a: -case 0x590b: -case 0x590c: -case 0x590d: -case 0x590e: -case 0x590f: -case 0x5b08: -case 0x5b09: -case 0x5b0a: -case 0x5b0b: -case 0x5b0c: -case 0x5b0d: -case 0x5b0e: -case 0x5b0f: -case 0x5d08: -case 0x5d09: -case 0x5d0a: -case 0x5d0b: -case 0x5d0c: -case 0x5d0d: -case 0x5d0e: -case 0x5d0f: -case 0x5f08: -case 0x5f09: -case 0x5f0a: -case 0x5f0b: -case 0x5f0c: -case 0x5f0d: -case 0x5f0e: -case 0x5f0f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5039: -case 0x5239: -case 0x5439: -case 0x5639: -case 0x5839: -case 0x5a39: -case 0x5c39: -case 0x5e39: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); ADD(src, dst); - } - break; - -case 0x5139: -case 0x5339: -case 0x5539: -case 0x5739: -case 0x5939: -case 0x5b39: -case 0x5d39: -case 0x5f39: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); SUB(src, dst); - } - break; - -case 0x5038: -case 0x5238: -case 0x5438: -case 0x5638: -case 0x5838: -case 0x5a38: -case 0x5c38: -case 0x5e38: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); ADD(src, dst); - } - break; - -case 0x5138: -case 0x5338: -case 0x5538: -case 0x5738: -case 0x5938: -case 0x5b38: -case 0x5d38: -case 0x5f38: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this); SUB(src, dst); - } - break; - -case 0x5010: -case 0x5011: -case 0x5012: -case 0x5013: -case 0x5014: -case 0x5015: -case 0x5016: -case 0x5017: -case 0x5210: -case 0x5211: -case 0x5212: -case 0x5213: -case 0x5214: -case 0x5215: -case 0x5216: -case 0x5217: -case 0x5410: -case 0x5411: -case 0x5412: -case 0x5413: -case 0x5414: -case 0x5415: -case 0x5416: -case 0x5417: -case 0x5610: -case 0x5611: -case 0x5612: -case 0x5613: -case 0x5614: -case 0x5615: -case 0x5616: -case 0x5617: -case 0x5810: -case 0x5811: -case 0x5812: -case 0x5813: -case 0x5814: -case 0x5815: -case 0x5816: -case 0x5817: -case 0x5a10: -case 0x5a11: -case 0x5a12: -case 0x5a13: -case 0x5a14: -case 0x5a15: -case 0x5a16: -case 0x5a17: -case 0x5c10: -case 0x5c11: -case 0x5c12: -case 0x5c13: -case 0x5c14: -case 0x5c15: -case 0x5c16: -case 0x5c17: -case 0x5e10: -case 0x5e11: -case 0x5e12: -case 0x5e13: -case 0x5e14: -case 0x5e15: -case 0x5e16: -case 0x5e17: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5110: -case 0x5111: -case 0x5112: -case 0x5113: -case 0x5114: -case 0x5115: -case 0x5116: -case 0x5117: -case 0x5310: -case 0x5311: -case 0x5312: -case 0x5313: -case 0x5314: -case 0x5315: -case 0x5316: -case 0x5317: -case 0x5510: -case 0x5511: -case 0x5512: -case 0x5513: -case 0x5514: -case 0x5515: -case 0x5516: -case 0x5517: -case 0x5710: -case 0x5711: -case 0x5712: -case 0x5713: -case 0x5714: -case 0x5715: -case 0x5716: -case 0x5717: -case 0x5910: -case 0x5911: -case 0x5912: -case 0x5913: -case 0x5914: -case 0x5915: -case 0x5916: -case 0x5917: -case 0x5b10: -case 0x5b11: -case 0x5b12: -case 0x5b13: -case 0x5b14: -case 0x5b15: -case 0x5b16: -case 0x5b17: -case 0x5d10: -case 0x5d11: -case 0x5d12: -case 0x5d13: -case 0x5d14: -case 0x5d15: -case 0x5d16: -case 0x5d17: -case 0x5f10: -case 0x5f11: -case 0x5f12: -case 0x5f13: -case 0x5f14: -case 0x5f15: -case 0x5f16: -case 0x5f17: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5028: -case 0x5029: -case 0x502a: -case 0x502b: -case 0x502c: -case 0x502d: -case 0x502e: -case 0x502f: -case 0x5228: -case 0x5229: -case 0x522a: -case 0x522b: -case 0x522c: -case 0x522d: -case 0x522e: -case 0x522f: -case 0x5428: -case 0x5429: -case 0x542a: -case 0x542b: -case 0x542c: -case 0x542d: -case 0x542e: -case 0x542f: -case 0x5628: -case 0x5629: -case 0x562a: -case 0x562b: -case 0x562c: -case 0x562d: -case 0x562e: -case 0x562f: -case 0x5828: -case 0x5829: -case 0x582a: -case 0x582b: -case 0x582c: -case 0x582d: -case 0x582e: -case 0x582f: -case 0x5a28: -case 0x5a29: -case 0x5a2a: -case 0x5a2b: -case 0x5a2c: -case 0x5a2d: -case 0x5a2e: -case 0x5a2f: -case 0x5c28: -case 0x5c29: -case 0x5c2a: -case 0x5c2b: -case 0x5c2c: -case 0x5c2d: -case 0x5c2e: -case 0x5c2f: -case 0x5e28: -case 0x5e29: -case 0x5e2a: -case 0x5e2b: -case 0x5e2c: -case 0x5e2d: -case 0x5e2e: -case 0x5e2f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5128: -case 0x5129: -case 0x512a: -case 0x512b: -case 0x512c: -case 0x512d: -case 0x512e: -case 0x512f: -case 0x5328: -case 0x5329: -case 0x532a: -case 0x532b: -case 0x532c: -case 0x532d: -case 0x532e: -case 0x532f: -case 0x5528: -case 0x5529: -case 0x552a: -case 0x552b: -case 0x552c: -case 0x552d: -case 0x552e: -case 0x552f: -case 0x5728: -case 0x5729: -case 0x572a: -case 0x572b: -case 0x572c: -case 0x572d: -case 0x572e: -case 0x572f: -case 0x5928: -case 0x5929: -case 0x592a: -case 0x592b: -case 0x592c: -case 0x592d: -case 0x592e: -case 0x592f: -case 0x5b28: -case 0x5b29: -case 0x5b2a: -case 0x5b2b: -case 0x5b2c: -case 0x5b2d: -case 0x5b2e: -case 0x5b2f: -case 0x5d28: -case 0x5d29: -case 0x5d2a: -case 0x5d2b: -case 0x5d2c: -case 0x5d2d: -case 0x5d2e: -case 0x5d2f: -case 0x5f28: -case 0x5f29: -case 0x5f2a: -case 0x5f2b: -case 0x5f2c: -case 0x5f2d: -case 0x5f2e: -case 0x5f2f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5030: -case 0x5031: -case 0x5032: -case 0x5033: -case 0x5034: -case 0x5035: -case 0x5036: -case 0x5037: -case 0x5230: -case 0x5231: -case 0x5232: -case 0x5233: -case 0x5234: -case 0x5235: -case 0x5236: -case 0x5237: -case 0x5430: -case 0x5431: -case 0x5432: -case 0x5433: -case 0x5434: -case 0x5435: -case 0x5436: -case 0x5437: -case 0x5630: -case 0x5631: -case 0x5632: -case 0x5633: -case 0x5634: -case 0x5635: -case 0x5636: -case 0x5637: -case 0x5830: -case 0x5831: -case 0x5832: -case 0x5833: -case 0x5834: -case 0x5835: -case 0x5836: -case 0x5837: -case 0x5a30: -case 0x5a31: -case 0x5a32: -case 0x5a33: -case 0x5a34: -case 0x5a35: -case 0x5a36: -case 0x5a37: -case 0x5c30: -case 0x5c31: -case 0x5c32: -case 0x5c33: -case 0x5c34: -case 0x5c35: -case 0x5c36: -case 0x5c37: -case 0x5e30: -case 0x5e31: -case 0x5e32: -case 0x5e33: -case 0x5e34: -case 0x5e35: -case 0x5e36: -case 0x5e37: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5130: -case 0x5131: -case 0x5132: -case 0x5133: -case 0x5134: -case 0x5135: -case 0x5136: -case 0x5137: -case 0x5330: -case 0x5331: -case 0x5332: -case 0x5333: -case 0x5334: -case 0x5335: -case 0x5336: -case 0x5337: -case 0x5530: -case 0x5531: -case 0x5532: -case 0x5533: -case 0x5534: -case 0x5535: -case 0x5536: -case 0x5537: -case 0x5730: -case 0x5731: -case 0x5732: -case 0x5733: -case 0x5734: -case 0x5735: -case 0x5736: -case 0x5737: -case 0x5930: -case 0x5931: -case 0x5932: -case 0x5933: -case 0x5934: -case 0x5935: -case 0x5936: -case 0x5937: -case 0x5b30: -case 0x5b31: -case 0x5b32: -case 0x5b33: -case 0x5b34: -case 0x5b35: -case 0x5b36: -case 0x5b37: -case 0x5d30: -case 0x5d31: -case 0x5d32: -case 0x5d33: -case 0x5d34: -case 0x5d35: -case 0x5d36: -case 0x5d37: -case 0x5f30: -case 0x5f31: -case 0x5f32: -case 0x5f33: -case 0x5f34: -case 0x5f35: -case 0x5f36: -case 0x5f37: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5018: -case 0x5019: -case 0x501a: -case 0x501b: -case 0x501c: -case 0x501d: -case 0x501e: -case 0x501f: -case 0x5218: -case 0x5219: -case 0x521a: -case 0x521b: -case 0x521c: -case 0x521d: -case 0x521e: -case 0x521f: -case 0x5418: -case 0x5419: -case 0x541a: -case 0x541b: -case 0x541c: -case 0x541d: -case 0x541e: -case 0x541f: -case 0x5618: -case 0x5619: -case 0x561a: -case 0x561b: -case 0x561c: -case 0x561d: -case 0x561e: -case 0x561f: -case 0x5818: -case 0x5819: -case 0x581a: -case 0x581b: -case 0x581c: -case 0x581d: -case 0x581e: -case 0x581f: -case 0x5a18: -case 0x5a19: -case 0x5a1a: -case 0x5a1b: -case 0x5a1c: -case 0x5a1d: -case 0x5a1e: -case 0x5a1f: -case 0x5c18: -case 0x5c19: -case 0x5c1a: -case 0x5c1b: -case 0x5c1c: -case 0x5c1d: -case 0x5c1e: -case 0x5c1f: -case 0x5e18: -case 0x5e19: -case 0x5e1a: -case 0x5e1b: -case 0x5e1c: -case 0x5e1d: -case 0x5e1e: -case 0x5e1f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5118: -case 0x5119: -case 0x511a: -case 0x511b: -case 0x511c: -case 0x511d: -case 0x511e: -case 0x511f: -case 0x5318: -case 0x5319: -case 0x531a: -case 0x531b: -case 0x531c: -case 0x531d: -case 0x531e: -case 0x531f: -case 0x5518: -case 0x5519: -case 0x551a: -case 0x551b: -case 0x551c: -case 0x551d: -case 0x551e: -case 0x551f: -case 0x5718: -case 0x5719: -case 0x571a: -case 0x571b: -case 0x571c: -case 0x571d: -case 0x571e: -case 0x571f: -case 0x5918: -case 0x5919: -case 0x591a: -case 0x591b: -case 0x591c: -case 0x591d: -case 0x591e: -case 0x591f: -case 0x5b18: -case 0x5b19: -case 0x5b1a: -case 0x5b1b: -case 0x5b1c: -case 0x5b1d: -case 0x5b1e: -case 0x5b1f: -case 0x5d18: -case 0x5d19: -case 0x5d1a: -case 0x5d1b: -case 0x5d1c: -case 0x5d1d: -case 0x5d1e: -case 0x5d1f: -case 0x5f18: -case 0x5f19: -case 0x5f1a: -case 0x5f1b: -case 0x5f1c: -case 0x5f1d: -case 0x5f1e: -case 0x5f1f: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5020: -case 0x5021: -case 0x5022: -case 0x5023: -case 0x5024: -case 0x5025: -case 0x5026: -case 0x5027: -case 0x5220: -case 0x5221: -case 0x5222: -case 0x5223: -case 0x5224: -case 0x5225: -case 0x5226: -case 0x5227: -case 0x5420: -case 0x5421: -case 0x5422: -case 0x5423: -case 0x5424: -case 0x5425: -case 0x5426: -case 0x5427: -case 0x5620: -case 0x5621: -case 0x5622: -case 0x5623: -case 0x5624: -case 0x5625: -case 0x5626: -case 0x5627: -case 0x5820: -case 0x5821: -case 0x5822: -case 0x5823: -case 0x5824: -case 0x5825: -case 0x5826: -case 0x5827: -case 0x5a20: -case 0x5a21: -case 0x5a22: -case 0x5a23: -case 0x5a24: -case 0x5a25: -case 0x5a26: -case 0x5a27: -case 0x5c20: -case 0x5c21: -case 0x5c22: -case 0x5c23: -case 0x5c24: -case 0x5c25: -case 0x5c26: -case 0x5c27: -case 0x5e20: -case 0x5e21: -case 0x5e22: -case 0x5e23: -case 0x5e24: -case 0x5e25: -case 0x5e26: -case 0x5e27: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5120: -case 0x5121: -case 0x5122: -case 0x5123: -case 0x5124: -case 0x5125: -case 0x5126: -case 0x5127: -case 0x5320: -case 0x5321: -case 0x5322: -case 0x5323: -case 0x5324: -case 0x5325: -case 0x5326: -case 0x5327: -case 0x5520: -case 0x5521: -case 0x5522: -case 0x5523: -case 0x5524: -case 0x5525: -case 0x5526: -case 0x5527: -case 0x5720: -case 0x5721: -case 0x5722: -case 0x5723: -case 0x5724: -case 0x5725: -case 0x5726: -case 0x5727: -case 0x5920: -case 0x5921: -case 0x5922: -case 0x5923: -case 0x5924: -case 0x5925: -case 0x5926: -case 0x5927: -case 0x5b20: -case 0x5b21: -case 0x5b22: -case 0x5b23: -case 0x5b24: -case 0x5b25: -case 0x5b26: -case 0x5b27: -case 0x5d20: -case 0x5d21: -case 0x5d22: -case 0x5d23: -case 0x5d24: -case 0x5d25: -case 0x5d26: -case 0x5d27: -case 0x5f20: -case 0x5f21: -case 0x5f22: -case 0x5f23: -case 0x5f24: -case 0x5f25: -case 0x5f26: -case 0x5f27: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x5000: -case 0x5001: -case 0x5002: -case 0x5003: -case 0x5004: -case 0x5005: -case 0x5006: -case 0x5007: -case 0x5200: -case 0x5201: -case 0x5202: -case 0x5203: -case 0x5204: -case 0x5205: -case 0x5206: -case 0x5207: -case 0x5400: -case 0x5401: -case 0x5402: -case 0x5403: -case 0x5404: -case 0x5405: -case 0x5406: -case 0x5407: -case 0x5600: -case 0x5601: -case 0x5602: -case 0x5603: -case 0x5604: -case 0x5605: -case 0x5606: -case 0x5607: -case 0x5800: -case 0x5801: -case 0x5802: -case 0x5803: -case 0x5804: -case 0x5805: -case 0x5806: -case 0x5807: -case 0x5a00: -case 0x5a01: -case 0x5a02: -case 0x5a03: -case 0x5a04: -case 0x5a05: -case 0x5a06: -case 0x5a07: -case 0x5c00: -case 0x5c01: -case 0x5c02: -case 0x5c03: -case 0x5c04: -case 0x5c05: -case 0x5c06: -case 0x5c07: -case 0x5e00: -case 0x5e01: -case 0x5e02: -case 0x5e03: -case 0x5e04: -case 0x5e05: -case 0x5e06: -case 0x5e07: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); ADD(src, dst); - } - break; - -case 0x5100: -case 0x5101: -case 0x5102: -case 0x5103: -case 0x5104: -case 0x5105: -case 0x5106: -case 0x5107: -case 0x5300: -case 0x5301: -case 0x5302: -case 0x5303: -case 0x5304: -case 0x5305: -case 0x5306: -case 0x5307: -case 0x5500: -case 0x5501: -case 0x5502: -case 0x5503: -case 0x5504: -case 0x5505: -case 0x5506: -case 0x5507: -case 0x5700: -case 0x5701: -case 0x5702: -case 0x5703: -case 0x5704: -case 0x5705: -case 0x5706: -case 0x5707: -case 0x5900: -case 0x5901: -case 0x5902: -case 0x5903: -case 0x5904: -case 0x5905: -case 0x5906: -case 0x5907: -case 0x5b00: -case 0x5b01: -case 0x5b02: -case 0x5b03: -case 0x5b04: -case 0x5b05: -case 0x5b06: -case 0x5b07: -case 0x5d00: -case 0x5d01: -case 0x5d02: -case 0x5d03: -case 0x5d04: -case 0x5d05: -case 0x5d06: -case 0x5d07: -case 0x5f00: -case 0x5f01: -case 0x5f02: -case 0x5f03: -case 0x5f04: -case 0x5f05: -case 0x5f06: -case 0x5f07: - { - HAM src(this, instr_b11_b9 ? instr_b11_b9 : 8); HAM dst(this, instr_b2_b0); SUB(src, dst); - } - break; - -case 0x013c: -case 0x033c: -case 0x053c: -case 0x073c: -case 0x093c: -case 0x0b3c: -case 0x0d3c: -case 0x0f3c: - { - HAM targ(this); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0x13fa: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11fa: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x10ba: -case 0x12ba: -case 0x14ba: -case 0x16ba: -case 0x18ba: -case 0x1aba: -case 0x1cba: -case 0x1eba: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x117a: -case 0x137a: -case 0x157a: -case 0x177a: -case 0x197a: -case 0x1b7a: -case 0x1d7a: -case 0x1f7a: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x11ba: -case 0x13ba: -case 0x15ba: -case 0x17ba: -case 0x19ba: -case 0x1bba: -case 0x1dba: -case 0x1fba: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x10fa: -case 0x12fa: -case 0x14fa: -case 0x16fa: -case 0x18fa: -case 0x1afa: -case 0x1cfa: -case 0x1efa: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x113a: -case 0x133a: -case 0x153a: -case 0x173a: -case 0x193a: -case 0x1b3a: -case 0x1d3a: -case 0x1f3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd03a: -case 0xd23a: -case 0xd43a: -case 0xd63a: -case 0xd83a: -case 0xda3a: -case 0xdc3a: -case 0xde3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc03a: -case 0xc23a: -case 0xc43a: -case 0xc63a: -case 0xc83a: -case 0xca3a: -case 0xcc3a: -case 0xce3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb03a: -case 0xb23a: -case 0xb43a: -case 0xb63a: -case 0xb83a: -case 0xba3a: -case 0xbc3a: -case 0xbe3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x103a: -case 0x123a: -case 0x143a: -case 0x163a: -case 0x183a: -case 0x1a3a: -case 0x1c3a: -case 0x1e3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x803a: -case 0x823a: -case 0x843a: -case 0x863a: -case 0x883a: -case 0x8a3a: -case 0x8c3a: -case 0x8e3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x903a: -case 0x923a: -case 0x943a: -case 0x963a: -case 0x983a: -case 0x9a3a: -case 0x9c3a: -case 0x9e3a: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x013a: -case 0x033a: -case 0x053a: -case 0x073a: -case 0x093a: -case 0x0b3a: -case 0x0d3a: -case 0x0f3a: - { - HAM targ(this); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0x13fb: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x11fb: - { - HAM src(this); HAM dst(this); MOVE(src, dst); - } - break; - -case 0x10bb: -case 0x12bb: -case 0x14bb: -case 0x16bb: -case 0x18bb: -case 0x1abb: -case 0x1cbb: -case 0x1ebb: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x117b: -case 0x137b: -case 0x157b: -case 0x177b: -case 0x197b: -case 0x1b7b: -case 0x1d7b: -case 0x1f7b: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x11bb: -case 0x13bb: -case 0x15bb: -case 0x17bb: -case 0x19bb: -case 0x1bbb: -case 0x1dbb: -case 0x1fbb: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x10fb: -case 0x12fb: -case 0x14fb: -case 0x16fb: -case 0x18fb: -case 0x1afb: -case 0x1cfb: -case 0x1efb: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x113b: -case 0x133b: -case 0x153b: -case 0x173b: -case 0x193b: -case 0x1b3b: -case 0x1d3b: -case 0x1f3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0xd03b: -case 0xd23b: -case 0xd43b: -case 0xd63b: -case 0xd83b: -case 0xda3b: -case 0xdc3b: -case 0xde3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); ADD(src, dst); - } - break; - -case 0xc03b: -case 0xc23b: -case 0xc43b: -case 0xc63b: -case 0xc83b: -case 0xca3b: -case 0xcc3b: -case 0xce3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); AND(src, dst); - } - break; - -case 0xb03b: -case 0xb23b: -case 0xb43b: -case 0xb63b: -case 0xb83b: -case 0xba3b: -case 0xbc3b: -case 0xbe3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); CMP(src, dst); - } - break; - -case 0x103b: -case 0x123b: -case 0x143b: -case 0x163b: -case 0x183b: -case 0x1a3b: -case 0x1c3b: -case 0x1e3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); MOVE(src, dst); - } - break; - -case 0x803b: -case 0x823b: -case 0x843b: -case 0x863b: -case 0x883b: -case 0x8a3b: -case 0x8c3b: -case 0x8e3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); OR(src, dst); - } - break; - -case 0x903b: -case 0x923b: -case 0x943b: -case 0x963b: -case 0x983b: -case 0x9a3b: -case 0x9c3b: -case 0x9e3b: - { - HAM src(this); HAM dst(this, instr_b11_b9); SUB(src, dst); - } - break; - -case 0x013b: -case 0x033b: -case 0x053b: -case 0x073b: -case 0x093b: -case 0x0b3b: -case 0x0d3b: -case 0x0f3b: - { - HAM targ(this); BTST(targ, D[instr_b11_b9]); - } - break; - -case 0xa000: -case 0xa001: -case 0xa002: -case 0xa003: -case 0xa004: -case 0xa005: -case 0xa006: -case 0xa007: -case 0xa008: -case 0xa009: -case 0xa00a: -case 0xa00b: -case 0xa00c: -case 0xa00d: -case 0xa00e: -case 0xa00f: -case 0xa010: -case 0xa011: -case 0xa012: -case 0xa013: -case 0xa014: -case 0xa015: -case 0xa016: -case 0xa017: -case 0xa018: -case 0xa019: -case 0xa01a: -case 0xa01b: -case 0xa01c: -case 0xa01d: -case 0xa01e: -case 0xa01f: -case 0xa020: -case 0xa021: -case 0xa022: -case 0xa023: -case 0xa024: -case 0xa025: -case 0xa026: -case 0xa027: -case 0xa028: -case 0xa029: -case 0xa02a: -case 0xa02b: -case 0xa02c: -case 0xa02d: -case 0xa02e: -case 0xa02f: -case 0xa030: -case 0xa031: -case 0xa032: -case 0xa033: -case 0xa034: -case 0xa035: -case 0xa036: -case 0xa037: -case 0xa038: -case 0xa039: -case 0xa03a: -case 0xa03b: -case 0xa03c: -case 0xa03d: -case 0xa03e: -case 0xa03f: -case 0xa040: -case 0xa041: -case 0xa042: -case 0xa043: -case 0xa044: -case 0xa045: -case 0xa046: -case 0xa047: -case 0xa048: -case 0xa049: -case 0xa04a: -case 0xa04b: -case 0xa04c: -case 0xa04d: -case 0xa04e: -case 0xa04f: -case 0xa050: -case 0xa051: -case 0xa052: -case 0xa053: -case 0xa054: -case 0xa055: -case 0xa056: -case 0xa057: -case 0xa058: -case 0xa059: -case 0xa05a: -case 0xa05b: -case 0xa05c: -case 0xa05d: -case 0xa05e: -case 0xa05f: -case 0xa060: -case 0xa061: -case 0xa062: -case 0xa063: -case 0xa064: -case 0xa065: -case 0xa066: -case 0xa067: -case 0xa068: -case 0xa069: -case 0xa06a: -case 0xa06b: -case 0xa06c: -case 0xa06d: -case 0xa06e: -case 0xa06f: -case 0xa070: -case 0xa071: -case 0xa072: -case 0xa073: -case 0xa074: -case 0xa075: -case 0xa076: -case 0xa077: -case 0xa078: -case 0xa079: -case 0xa07a: -case 0xa07b: -case 0xa07c: -case 0xa07d: -case 0xa07e: -case 0xa07f: -case 0xa080: -case 0xa081: -case 0xa082: -case 0xa083: -case 0xa084: -case 0xa085: -case 0xa086: -case 0xa087: -case 0xa088: -case 0xa089: -case 0xa08a: -case 0xa08b: -case 0xa08c: -case 0xa08d: -case 0xa08e: -case 0xa08f: -case 0xa090: -case 0xa091: -case 0xa092: -case 0xa093: -case 0xa094: -case 0xa095: -case 0xa096: -case 0xa097: -case 0xa098: -case 0xa099: -case 0xa09a: -case 0xa09b: -case 0xa09c: -case 0xa09d: -case 0xa09e: -case 0xa09f: -case 0xa0a0: -case 0xa0a1: -case 0xa0a2: -case 0xa0a3: -case 0xa0a4: -case 0xa0a5: -case 0xa0a6: -case 0xa0a7: -case 0xa0a8: -case 0xa0a9: -case 0xa0aa: -case 0xa0ab: -case 0xa0ac: -case 0xa0ad: -case 0xa0ae: -case 0xa0af: -case 0xa0b0: -case 0xa0b1: -case 0xa0b2: -case 0xa0b3: -case 0xa0b4: -case 0xa0b5: -case 0xa0b6: -case 0xa0b7: -case 0xa0b8: -case 0xa0b9: -case 0xa0ba: -case 0xa0bb: -case 0xa0bc: -case 0xa0bd: -case 0xa0be: -case 0xa0bf: -case 0xa0c0: -case 0xa0c1: -case 0xa0c2: -case 0xa0c3: -case 0xa0c4: -case 0xa0c5: -case 0xa0c6: -case 0xa0c7: -case 0xa0c8: -case 0xa0c9: -case 0xa0ca: -case 0xa0cb: -case 0xa0cc: -case 0xa0cd: -case 0xa0ce: -case 0xa0cf: -case 0xa0d0: -case 0xa0d1: -case 0xa0d2: -case 0xa0d3: -case 0xa0d4: -case 0xa0d5: -case 0xa0d6: -case 0xa0d7: -case 0xa0d8: -case 0xa0d9: -case 0xa0da: -case 0xa0db: -case 0xa0dc: -case 0xa0dd: -case 0xa0de: -case 0xa0df: -case 0xa0e0: -case 0xa0e1: -case 0xa0e2: -case 0xa0e3: -case 0xa0e4: -case 0xa0e5: -case 0xa0e6: -case 0xa0e7: -case 0xa0e8: -case 0xa0e9: -case 0xa0ea: -case 0xa0eb: -case 0xa0ec: -case 0xa0ed: -case 0xa0ee: -case 0xa0ef: -case 0xa0f0: -case 0xa0f1: -case 0xa0f2: -case 0xa0f3: -case 0xa0f4: -case 0xa0f5: -case 0xa0f6: -case 0xa0f7: -case 0xa0f8: -case 0xa0f9: -case 0xa0fa: -case 0xa0fb: -case 0xa0fc: -case 0xa0fd: -case 0xa0fe: -case 0xa0ff: -case 0xa100: -case 0xa101: -case 0xa102: -case 0xa103: -case 0xa104: -case 0xa105: -case 0xa106: -case 0xa107: -case 0xa108: -case 0xa109: -case 0xa10a: -case 0xa10b: -case 0xa10c: -case 0xa10d: -case 0xa10e: -case 0xa10f: -case 0xa110: -case 0xa111: -case 0xa112: -case 0xa113: -case 0xa114: -case 0xa115: -case 0xa116: -case 0xa117: -case 0xa118: -case 0xa119: -case 0xa11a: -case 0xa11b: -case 0xa11c: -case 0xa11d: -case 0xa11e: -case 0xa11f: -case 0xa120: -case 0xa121: -case 0xa122: -case 0xa123: -case 0xa124: -case 0xa125: -case 0xa126: -case 0xa127: -case 0xa128: -case 0xa129: -case 0xa12a: -case 0xa12b: -case 0xa12c: -case 0xa12d: -case 0xa12e: -case 0xa12f: -case 0xa130: -case 0xa131: -case 0xa132: -case 0xa133: -case 0xa134: -case 0xa135: -case 0xa136: -case 0xa137: -case 0xa138: -case 0xa139: -case 0xa13a: -case 0xa13b: -case 0xa13c: -case 0xa13d: -case 0xa13e: -case 0xa13f: -case 0xa140: -case 0xa141: -case 0xa142: -case 0xa143: -case 0xa144: -case 0xa145: -case 0xa146: -case 0xa147: -case 0xa148: -case 0xa149: -case 0xa14a: -case 0xa14b: -case 0xa14c: -case 0xa14d: -case 0xa14e: -case 0xa14f: -case 0xa150: -case 0xa151: -case 0xa152: -case 0xa153: -case 0xa154: -case 0xa155: -case 0xa156: -case 0xa157: -case 0xa158: -case 0xa159: -case 0xa15a: -case 0xa15b: -case 0xa15c: -case 0xa15d: -case 0xa15e: -case 0xa15f: -case 0xa160: -case 0xa161: -case 0xa162: -case 0xa163: -case 0xa164: -case 0xa165: -case 0xa166: -case 0xa167: -case 0xa168: -case 0xa169: -case 0xa16a: -case 0xa16b: -case 0xa16c: -case 0xa16d: -case 0xa16e: -case 0xa16f: -case 0xa170: -case 0xa171: -case 0xa172: -case 0xa173: -case 0xa174: -case 0xa175: -case 0xa176: -case 0xa177: -case 0xa178: -case 0xa179: -case 0xa17a: -case 0xa17b: -case 0xa17c: -case 0xa17d: -case 0xa17e: -case 0xa17f: -case 0xa180: -case 0xa181: -case 0xa182: -case 0xa183: -case 0xa184: -case 0xa185: -case 0xa186: -case 0xa187: -case 0xa188: -case 0xa189: -case 0xa18a: -case 0xa18b: -case 0xa18c: -case 0xa18d: -case 0xa18e: -case 0xa18f: -case 0xa190: -case 0xa191: -case 0xa192: -case 0xa193: -case 0xa194: -case 0xa195: -case 0xa196: -case 0xa197: -case 0xa198: -case 0xa199: -case 0xa19a: -case 0xa19b: -case 0xa19c: -case 0xa19d: -case 0xa19e: -case 0xa19f: -case 0xa1a0: -case 0xa1a1: -case 0xa1a2: -case 0xa1a3: -case 0xa1a4: -case 0xa1a5: -case 0xa1a6: -case 0xa1a7: -case 0xa1a8: -case 0xa1a9: -case 0xa1aa: -case 0xa1ab: -case 0xa1ac: -case 0xa1ad: -case 0xa1ae: -case 0xa1af: -case 0xa1b0: -case 0xa1b1: -case 0xa1b2: -case 0xa1b3: -case 0xa1b4: -case 0xa1b5: -case 0xa1b6: -case 0xa1b7: -case 0xa1b8: -case 0xa1b9: -case 0xa1ba: -case 0xa1bb: -case 0xa1bc: -case 0xa1bd: -case 0xa1be: -case 0xa1bf: -case 0xa1c0: -case 0xa1c1: -case 0xa1c2: -case 0xa1c3: -case 0xa1c4: -case 0xa1c5: -case 0xa1c6: -case 0xa1c7: -case 0xa1c8: -case 0xa1c9: -case 0xa1ca: -case 0xa1cb: -case 0xa1cc: -case 0xa1cd: -case 0xa1ce: -case 0xa1cf: -case 0xa1d0: -case 0xa1d1: -case 0xa1d2: -case 0xa1d3: -case 0xa1d4: -case 0xa1d5: -case 0xa1d6: -case 0xa1d7: -case 0xa1d8: -case 0xa1d9: -case 0xa1da: -case 0xa1db: -case 0xa1dc: -case 0xa1dd: -case 0xa1de: -case 0xa1df: -case 0xa1e0: -case 0xa1e1: -case 0xa1e2: -case 0xa1e3: -case 0xa1e4: -case 0xa1e5: -case 0xa1e6: -case 0xa1e7: -case 0xa1e8: -case 0xa1e9: -case 0xa1ea: -case 0xa1eb: -case 0xa1ec: -case 0xa1ed: -case 0xa1ee: -case 0xa1ef: -case 0xa1f0: -case 0xa1f1: -case 0xa1f2: -case 0xa1f3: -case 0xa1f4: -case 0xa1f5: -case 0xa1f6: -case 0xa1f7: -case 0xa1f8: -case 0xa1f9: -case 0xa1fa: -case 0xa1fb: -case 0xa1fc: -case 0xa1fd: -case 0xa1fe: -case 0xa1ff: -case 0xa200: -case 0xa201: -case 0xa202: -case 0xa203: -case 0xa204: -case 0xa205: -case 0xa206: -case 0xa207: -case 0xa208: -case 0xa209: -case 0xa20a: -case 0xa20b: -case 0xa20c: -case 0xa20d: -case 0xa20e: -case 0xa20f: -case 0xa210: -case 0xa211: -case 0xa212: -case 0xa213: -case 0xa214: -case 0xa215: -case 0xa216: -case 0xa217: -case 0xa218: -case 0xa219: -case 0xa21a: -case 0xa21b: -case 0xa21c: -case 0xa21d: -case 0xa21e: -case 0xa21f: -case 0xa220: -case 0xa221: -case 0xa222: -case 0xa223: -case 0xa224: -case 0xa225: -case 0xa226: -case 0xa227: -case 0xa228: -case 0xa229: -case 0xa22a: -case 0xa22b: -case 0xa22c: -case 0xa22d: -case 0xa22e: -case 0xa22f: -case 0xa230: -case 0xa231: -case 0xa232: -case 0xa233: -case 0xa234: -case 0xa235: -case 0xa236: -case 0xa237: -case 0xa238: -case 0xa239: -case 0xa23a: -case 0xa23b: -case 0xa23c: -case 0xa23d: -case 0xa23e: -case 0xa23f: -case 0xa240: -case 0xa241: -case 0xa242: -case 0xa243: -case 0xa244: -case 0xa245: -case 0xa246: -case 0xa247: -case 0xa248: -case 0xa249: -case 0xa24a: -case 0xa24b: -case 0xa24c: -case 0xa24d: -case 0xa24e: -case 0xa24f: -case 0xa250: -case 0xa251: -case 0xa252: -case 0xa253: -case 0xa254: -case 0xa255: -case 0xa256: -case 0xa257: -case 0xa258: -case 0xa259: -case 0xa25a: -case 0xa25b: -case 0xa25c: -case 0xa25d: -case 0xa25e: -case 0xa25f: -case 0xa260: -case 0xa261: -case 0xa262: -case 0xa263: -case 0xa264: -case 0xa265: -case 0xa266: -case 0xa267: -case 0xa268: -case 0xa269: -case 0xa26a: -case 0xa26b: -case 0xa26c: -case 0xa26d: -case 0xa26e: -case 0xa26f: -case 0xa270: -case 0xa271: -case 0xa272: -case 0xa273: -case 0xa274: -case 0xa275: -case 0xa276: -case 0xa277: -case 0xa278: -case 0xa279: -case 0xa27a: -case 0xa27b: -case 0xa27c: -case 0xa27d: -case 0xa27e: -case 0xa27f: -case 0xa280: -case 0xa281: -case 0xa282: -case 0xa283: -case 0xa284: -case 0xa285: -case 0xa286: -case 0xa287: -case 0xa288: -case 0xa289: -case 0xa28a: -case 0xa28b: -case 0xa28c: -case 0xa28d: -case 0xa28e: -case 0xa28f: -case 0xa290: -case 0xa291: -case 0xa292: -case 0xa293: -case 0xa294: -case 0xa295: -case 0xa296: -case 0xa297: -case 0xa298: -case 0xa299: -case 0xa29a: -case 0xa29b: -case 0xa29c: -case 0xa29d: -case 0xa29e: -case 0xa29f: -case 0xa2a0: -case 0xa2a1: -case 0xa2a2: -case 0xa2a3: -case 0xa2a4: -case 0xa2a5: -case 0xa2a6: -case 0xa2a7: -case 0xa2a8: -case 0xa2a9: -case 0xa2aa: -case 0xa2ab: -case 0xa2ac: -case 0xa2ad: -case 0xa2ae: -case 0xa2af: -case 0xa2b0: -case 0xa2b1: -case 0xa2b2: -case 0xa2b3: -case 0xa2b4: -case 0xa2b5: -case 0xa2b6: -case 0xa2b7: -case 0xa2b8: -case 0xa2b9: -case 0xa2ba: -case 0xa2bb: -case 0xa2bc: -case 0xa2bd: -case 0xa2be: -case 0xa2bf: -case 0xa2c0: -case 0xa2c1: -case 0xa2c2: -case 0xa2c3: -case 0xa2c4: -case 0xa2c5: -case 0xa2c6: -case 0xa2c7: -case 0xa2c8: -case 0xa2c9: -case 0xa2ca: -case 0xa2cb: -case 0xa2cc: -case 0xa2cd: -case 0xa2ce: -case 0xa2cf: -case 0xa2d0: -case 0xa2d1: -case 0xa2d2: -case 0xa2d3: -case 0xa2d4: -case 0xa2d5: -case 0xa2d6: -case 0xa2d7: -case 0xa2d8: -case 0xa2d9: -case 0xa2da: -case 0xa2db: -case 0xa2dc: -case 0xa2dd: -case 0xa2de: -case 0xa2df: -case 0xa2e0: -case 0xa2e1: -case 0xa2e2: -case 0xa2e3: -case 0xa2e4: -case 0xa2e5: -case 0xa2e6: -case 0xa2e7: -case 0xa2e8: -case 0xa2e9: -case 0xa2ea: -case 0xa2eb: -case 0xa2ec: -case 0xa2ed: -case 0xa2ee: -case 0xa2ef: -case 0xa2f0: -case 0xa2f1: -case 0xa2f2: -case 0xa2f3: -case 0xa2f4: -case 0xa2f5: -case 0xa2f6: -case 0xa2f7: -case 0xa2f8: -case 0xa2f9: -case 0xa2fa: -case 0xa2fb: -case 0xa2fc: -case 0xa2fd: -case 0xa2fe: -case 0xa2ff: -case 0xa300: -case 0xa301: -case 0xa302: -case 0xa303: -case 0xa304: -case 0xa305: -case 0xa306: -case 0xa307: -case 0xa308: -case 0xa309: -case 0xa30a: -case 0xa30b: -case 0xa30c: -case 0xa30d: -case 0xa30e: -case 0xa30f: -case 0xa310: -case 0xa311: -case 0xa312: -case 0xa313: -case 0xa314: -case 0xa315: -case 0xa316: -case 0xa317: -case 0xa318: -case 0xa319: -case 0xa31a: -case 0xa31b: -case 0xa31c: -case 0xa31d: -case 0xa31e: -case 0xa31f: -case 0xa320: -case 0xa321: -case 0xa322: -case 0xa323: -case 0xa324: -case 0xa325: -case 0xa326: -case 0xa327: -case 0xa328: -case 0xa329: -case 0xa32a: -case 0xa32b: -case 0xa32c: -case 0xa32d: -case 0xa32e: -case 0xa32f: -case 0xa330: -case 0xa331: -case 0xa332: -case 0xa333: -case 0xa334: -case 0xa335: -case 0xa336: -case 0xa337: -case 0xa338: -case 0xa339: -case 0xa33a: -case 0xa33b: -case 0xa33c: -case 0xa33d: -case 0xa33e: -case 0xa33f: -case 0xa340: -case 0xa341: -case 0xa342: -case 0xa343: -case 0xa344: -case 0xa345: -case 0xa346: -case 0xa347: -case 0xa348: -case 0xa349: -case 0xa34a: -case 0xa34b: -case 0xa34c: -case 0xa34d: -case 0xa34e: -case 0xa34f: -case 0xa350: -case 0xa351: -case 0xa352: -case 0xa353: -case 0xa354: -case 0xa355: -case 0xa356: -case 0xa357: -case 0xa358: -case 0xa359: -case 0xa35a: -case 0xa35b: -case 0xa35c: -case 0xa35d: -case 0xa35e: -case 0xa35f: -case 0xa360: -case 0xa361: -case 0xa362: -case 0xa363: -case 0xa364: -case 0xa365: -case 0xa366: -case 0xa367: -case 0xa368: -case 0xa369: -case 0xa36a: -case 0xa36b: -case 0xa36c: -case 0xa36d: -case 0xa36e: -case 0xa36f: -case 0xa370: -case 0xa371: -case 0xa372: -case 0xa373: -case 0xa374: -case 0xa375: -case 0xa376: -case 0xa377: -case 0xa378: -case 0xa379: -case 0xa37a: -case 0xa37b: -case 0xa37c: -case 0xa37d: -case 0xa37e: -case 0xa37f: -case 0xa380: -case 0xa381: -case 0xa382: -case 0xa383: -case 0xa384: -case 0xa385: -case 0xa386: -case 0xa387: -case 0xa388: -case 0xa389: -case 0xa38a: -case 0xa38b: -case 0xa38c: -case 0xa38d: -case 0xa38e: -case 0xa38f: -case 0xa390: -case 0xa391: -case 0xa392: -case 0xa393: -case 0xa394: -case 0xa395: -case 0xa396: -case 0xa397: -case 0xa398: -case 0xa399: -case 0xa39a: -case 0xa39b: -case 0xa39c: -case 0xa39d: -case 0xa39e: -case 0xa39f: -case 0xa3a0: -case 0xa3a1: -case 0xa3a2: -case 0xa3a3: -case 0xa3a4: -case 0xa3a5: -case 0xa3a6: -case 0xa3a7: -case 0xa3a8: -case 0xa3a9: -case 0xa3aa: -case 0xa3ab: -case 0xa3ac: -case 0xa3ad: -case 0xa3ae: -case 0xa3af: -case 0xa3b0: -case 0xa3b1: -case 0xa3b2: -case 0xa3b3: -case 0xa3b4: -case 0xa3b5: -case 0xa3b6: -case 0xa3b7: -case 0xa3b8: -case 0xa3b9: -case 0xa3ba: -case 0xa3bb: -case 0xa3bc: -case 0xa3bd: -case 0xa3be: -case 0xa3bf: -case 0xa3c0: -case 0xa3c1: -case 0xa3c2: -case 0xa3c3: -case 0xa3c4: -case 0xa3c5: -case 0xa3c6: -case 0xa3c7: -case 0xa3c8: -case 0xa3c9: -case 0xa3ca: -case 0xa3cb: -case 0xa3cc: -case 0xa3cd: -case 0xa3ce: -case 0xa3cf: -case 0xa3d0: -case 0xa3d1: -case 0xa3d2: -case 0xa3d3: -case 0xa3d4: -case 0xa3d5: -case 0xa3d6: -case 0xa3d7: -case 0xa3d8: -case 0xa3d9: -case 0xa3da: -case 0xa3db: -case 0xa3dc: -case 0xa3dd: -case 0xa3de: -case 0xa3df: -case 0xa3e0: -case 0xa3e1: -case 0xa3e2: -case 0xa3e3: -case 0xa3e4: -case 0xa3e5: -case 0xa3e6: -case 0xa3e7: -case 0xa3e8: -case 0xa3e9: -case 0xa3ea: -case 0xa3eb: -case 0xa3ec: -case 0xa3ed: -case 0xa3ee: -case 0xa3ef: -case 0xa3f0: -case 0xa3f1: -case 0xa3f2: -case 0xa3f3: -case 0xa3f4: -case 0xa3f5: -case 0xa3f6: -case 0xa3f7: -case 0xa3f8: -case 0xa3f9: -case 0xa3fa: -case 0xa3fb: -case 0xa3fc: -case 0xa3fd: -case 0xa3fe: -case 0xa3ff: -case 0xa400: -case 0xa401: -case 0xa402: -case 0xa403: -case 0xa404: -case 0xa405: -case 0xa406: -case 0xa407: -case 0xa408: -case 0xa409: -case 0xa40a: -case 0xa40b: -case 0xa40c: -case 0xa40d: -case 0xa40e: -case 0xa40f: -case 0xa410: -case 0xa411: -case 0xa412: -case 0xa413: -case 0xa414: -case 0xa415: -case 0xa416: -case 0xa417: -case 0xa418: -case 0xa419: -case 0xa41a: -case 0xa41b: -case 0xa41c: -case 0xa41d: -case 0xa41e: -case 0xa41f: -case 0xa420: -case 0xa421: -case 0xa422: -case 0xa423: -case 0xa424: -case 0xa425: -case 0xa426: -case 0xa427: -case 0xa428: -case 0xa429: -case 0xa42a: -case 0xa42b: -case 0xa42c: -case 0xa42d: -case 0xa42e: -case 0xa42f: -case 0xa430: -case 0xa431: -case 0xa432: -case 0xa433: -case 0xa434: -case 0xa435: -case 0xa436: -case 0xa437: -case 0xa438: -case 0xa439: -case 0xa43a: -case 0xa43b: -case 0xa43c: -case 0xa43d: -case 0xa43e: -case 0xa43f: -case 0xa440: -case 0xa441: -case 0xa442: -case 0xa443: -case 0xa444: -case 0xa445: -case 0xa446: -case 0xa447: -case 0xa448: -case 0xa449: -case 0xa44a: -case 0xa44b: -case 0xa44c: -case 0xa44d: -case 0xa44e: -case 0xa44f: -case 0xa450: -case 0xa451: -case 0xa452: -case 0xa453: -case 0xa454: -case 0xa455: -case 0xa456: -case 0xa457: -case 0xa458: -case 0xa459: -case 0xa45a: -case 0xa45b: -case 0xa45c: -case 0xa45d: -case 0xa45e: -case 0xa45f: -case 0xa460: -case 0xa461: -case 0xa462: -case 0xa463: -case 0xa464: -case 0xa465: -case 0xa466: -case 0xa467: -case 0xa468: -case 0xa469: -case 0xa46a: -case 0xa46b: -case 0xa46c: -case 0xa46d: -case 0xa46e: -case 0xa46f: -case 0xa470: -case 0xa471: -case 0xa472: -case 0xa473: -case 0xa474: -case 0xa475: -case 0xa476: -case 0xa477: -case 0xa478: -case 0xa479: -case 0xa47a: -case 0xa47b: -case 0xa47c: -case 0xa47d: -case 0xa47e: -case 0xa47f: -case 0xa480: -case 0xa481: -case 0xa482: -case 0xa483: -case 0xa484: -case 0xa485: -case 0xa486: -case 0xa487: -case 0xa488: -case 0xa489: -case 0xa48a: -case 0xa48b: -case 0xa48c: -case 0xa48d: -case 0xa48e: -case 0xa48f: -case 0xa490: -case 0xa491: -case 0xa492: -case 0xa493: -case 0xa494: -case 0xa495: -case 0xa496: -case 0xa497: -case 0xa498: -case 0xa499: -case 0xa49a: -case 0xa49b: -case 0xa49c: -case 0xa49d: -case 0xa49e: -case 0xa49f: -case 0xa4a0: -case 0xa4a1: -case 0xa4a2: -case 0xa4a3: -case 0xa4a4: -case 0xa4a5: -case 0xa4a6: -case 0xa4a7: -case 0xa4a8: -case 0xa4a9: -case 0xa4aa: -case 0xa4ab: -case 0xa4ac: -case 0xa4ad: -case 0xa4ae: -case 0xa4af: -case 0xa4b0: -case 0xa4b1: -case 0xa4b2: -case 0xa4b3: -case 0xa4b4: -case 0xa4b5: -case 0xa4b6: -case 0xa4b7: -case 0xa4b8: -case 0xa4b9: -case 0xa4ba: -case 0xa4bb: -case 0xa4bc: -case 0xa4bd: -case 0xa4be: -case 0xa4bf: -case 0xa4c0: -case 0xa4c1: -case 0xa4c2: -case 0xa4c3: -case 0xa4c4: -case 0xa4c5: -case 0xa4c6: -case 0xa4c7: -case 0xa4c8: -case 0xa4c9: -case 0xa4ca: -case 0xa4cb: -case 0xa4cc: -case 0xa4cd: -case 0xa4ce: -case 0xa4cf: -case 0xa4d0: -case 0xa4d1: -case 0xa4d2: -case 0xa4d3: -case 0xa4d4: -case 0xa4d5: -case 0xa4d6: -case 0xa4d7: -case 0xa4d8: -case 0xa4d9: -case 0xa4da: -case 0xa4db: -case 0xa4dc: -case 0xa4dd: -case 0xa4de: -case 0xa4df: -case 0xa4e0: -case 0xa4e1: -case 0xa4e2: -case 0xa4e3: -case 0xa4e4: -case 0xa4e5: -case 0xa4e6: -case 0xa4e7: -case 0xa4e8: -case 0xa4e9: -case 0xa4ea: -case 0xa4eb: -case 0xa4ec: -case 0xa4ed: -case 0xa4ee: -case 0xa4ef: -case 0xa4f0: -case 0xa4f1: -case 0xa4f2: -case 0xa4f3: -case 0xa4f4: -case 0xa4f5: -case 0xa4f6: -case 0xa4f7: -case 0xa4f8: -case 0xa4f9: -case 0xa4fa: -case 0xa4fb: -case 0xa4fc: -case 0xa4fd: -case 0xa4fe: -case 0xa4ff: -case 0xa500: -case 0xa501: -case 0xa502: -case 0xa503: -case 0xa504: -case 0xa505: -case 0xa506: -case 0xa507: -case 0xa508: -case 0xa509: -case 0xa50a: -case 0xa50b: -case 0xa50c: -case 0xa50d: -case 0xa50e: -case 0xa50f: -case 0xa510: -case 0xa511: -case 0xa512: -case 0xa513: -case 0xa514: -case 0xa515: -case 0xa516: -case 0xa517: -case 0xa518: -case 0xa519: -case 0xa51a: -case 0xa51b: -case 0xa51c: -case 0xa51d: -case 0xa51e: -case 0xa51f: -case 0xa520: -case 0xa521: -case 0xa522: -case 0xa523: -case 0xa524: -case 0xa525: -case 0xa526: -case 0xa527: -case 0xa528: -case 0xa529: -case 0xa52a: -case 0xa52b: -case 0xa52c: -case 0xa52d: -case 0xa52e: -case 0xa52f: -case 0xa530: -case 0xa531: -case 0xa532: -case 0xa533: -case 0xa534: -case 0xa535: -case 0xa536: -case 0xa537: -case 0xa538: -case 0xa539: -case 0xa53a: -case 0xa53b: -case 0xa53c: -case 0xa53d: -case 0xa53e: -case 0xa53f: -case 0xa540: -case 0xa541: -case 0xa542: -case 0xa543: -case 0xa544: -case 0xa545: -case 0xa546: -case 0xa547: -case 0xa548: -case 0xa549: -case 0xa54a: -case 0xa54b: -case 0xa54c: -case 0xa54d: -case 0xa54e: -case 0xa54f: -case 0xa550: -case 0xa551: -case 0xa552: -case 0xa553: -case 0xa554: -case 0xa555: -case 0xa556: -case 0xa557: -case 0xa558: -case 0xa559: -case 0xa55a: -case 0xa55b: -case 0xa55c: -case 0xa55d: -case 0xa55e: -case 0xa55f: -case 0xa560: -case 0xa561: -case 0xa562: -case 0xa563: -case 0xa564: -case 0xa565: -case 0xa566: -case 0xa567: -case 0xa568: -case 0xa569: -case 0xa56a: -case 0xa56b: -case 0xa56c: -case 0xa56d: -case 0xa56e: -case 0xa56f: -case 0xa570: -case 0xa571: -case 0xa572: -case 0xa573: -case 0xa574: -case 0xa575: -case 0xa576: -case 0xa577: -case 0xa578: -case 0xa579: -case 0xa57a: -case 0xa57b: -case 0xa57c: -case 0xa57d: -case 0xa57e: -case 0xa57f: -case 0xa580: -case 0xa581: -case 0xa582: -case 0xa583: -case 0xa584: -case 0xa585: -case 0xa586: -case 0xa587: -case 0xa588: -case 0xa589: -case 0xa58a: -case 0xa58b: -case 0xa58c: -case 0xa58d: -case 0xa58e: -case 0xa58f: -case 0xa590: -case 0xa591: -case 0xa592: -case 0xa593: -case 0xa594: -case 0xa595: -case 0xa596: -case 0xa597: -case 0xa598: -case 0xa599: -case 0xa59a: -case 0xa59b: -case 0xa59c: -case 0xa59d: -case 0xa59e: -case 0xa59f: -case 0xa5a0: -case 0xa5a1: -case 0xa5a2: -case 0xa5a3: -case 0xa5a4: -case 0xa5a5: -case 0xa5a6: -case 0xa5a7: -case 0xa5a8: -case 0xa5a9: -case 0xa5aa: -case 0xa5ab: -case 0xa5ac: -case 0xa5ad: -case 0xa5ae: -case 0xa5af: -case 0xa5b0: -case 0xa5b1: -case 0xa5b2: -case 0xa5b3: -case 0xa5b4: -case 0xa5b5: -case 0xa5b6: -case 0xa5b7: -case 0xa5b8: -case 0xa5b9: -case 0xa5ba: -case 0xa5bb: -case 0xa5bc: -case 0xa5bd: -case 0xa5be: -case 0xa5bf: -case 0xa5c0: -case 0xa5c1: -case 0xa5c2: -case 0xa5c3: -case 0xa5c4: -case 0xa5c5: -case 0xa5c6: -case 0xa5c7: -case 0xa5c8: -case 0xa5c9: -case 0xa5ca: -case 0xa5cb: -case 0xa5cc: -case 0xa5cd: -case 0xa5ce: -case 0xa5cf: -case 0xa5d0: -case 0xa5d1: -case 0xa5d2: -case 0xa5d3: -case 0xa5d4: -case 0xa5d5: -case 0xa5d6: -case 0xa5d7: -case 0xa5d8: -case 0xa5d9: -case 0xa5da: -case 0xa5db: -case 0xa5dc: -case 0xa5dd: -case 0xa5de: -case 0xa5df: -case 0xa5e0: -case 0xa5e1: -case 0xa5e2: -case 0xa5e3: -case 0xa5e4: -case 0xa5e5: -case 0xa5e6: -case 0xa5e7: -case 0xa5e8: -case 0xa5e9: -case 0xa5ea: -case 0xa5eb: -case 0xa5ec: -case 0xa5ed: -case 0xa5ee: -case 0xa5ef: -case 0xa5f0: -case 0xa5f1: -case 0xa5f2: -case 0xa5f3: -case 0xa5f4: -case 0xa5f5: -case 0xa5f6: -case 0xa5f7: -case 0xa5f8: -case 0xa5f9: -case 0xa5fa: -case 0xa5fb: -case 0xa5fc: -case 0xa5fd: -case 0xa5fe: -case 0xa5ff: -case 0xa600: -case 0xa601: -case 0xa602: -case 0xa603: -case 0xa604: -case 0xa605: -case 0xa606: -case 0xa607: -case 0xa608: -case 0xa609: -case 0xa60a: -case 0xa60b: -case 0xa60c: -case 0xa60d: -case 0xa60e: -case 0xa60f: -case 0xa610: -case 0xa611: -case 0xa612: -case 0xa613: -case 0xa614: -case 0xa615: -case 0xa616: -case 0xa617: -case 0xa618: -case 0xa619: -case 0xa61a: -case 0xa61b: -case 0xa61c: -case 0xa61d: -case 0xa61e: -case 0xa61f: -case 0xa620: -case 0xa621: -case 0xa622: -case 0xa623: -case 0xa624: -case 0xa625: -case 0xa626: -case 0xa627: -case 0xa628: -case 0xa629: -case 0xa62a: -case 0xa62b: -case 0xa62c: -case 0xa62d: -case 0xa62e: -case 0xa62f: -case 0xa630: -case 0xa631: -case 0xa632: -case 0xa633: -case 0xa634: -case 0xa635: -case 0xa636: -case 0xa637: -case 0xa638: -case 0xa639: -case 0xa63a: -case 0xa63b: -case 0xa63c: -case 0xa63d: -case 0xa63e: -case 0xa63f: -case 0xa640: -case 0xa641: -case 0xa642: -case 0xa643: -case 0xa644: -case 0xa645: -case 0xa646: -case 0xa647: -case 0xa648: -case 0xa649: -case 0xa64a: -case 0xa64b: -case 0xa64c: -case 0xa64d: -case 0xa64e: -case 0xa64f: -case 0xa650: -case 0xa651: -case 0xa652: -case 0xa653: -case 0xa654: -case 0xa655: -case 0xa656: -case 0xa657: -case 0xa658: -case 0xa659: -case 0xa65a: -case 0xa65b: -case 0xa65c: -case 0xa65d: -case 0xa65e: -case 0xa65f: -case 0xa660: -case 0xa661: -case 0xa662: -case 0xa663: -case 0xa664: -case 0xa665: -case 0xa666: -case 0xa667: -case 0xa668: -case 0xa669: -case 0xa66a: -case 0xa66b: -case 0xa66c: -case 0xa66d: -case 0xa66e: -case 0xa66f: -case 0xa670: -case 0xa671: -case 0xa672: -case 0xa673: -case 0xa674: -case 0xa675: -case 0xa676: -case 0xa677: -case 0xa678: -case 0xa679: -case 0xa67a: -case 0xa67b: -case 0xa67c: -case 0xa67d: -case 0xa67e: -case 0xa67f: -case 0xa680: -case 0xa681: -case 0xa682: -case 0xa683: -case 0xa684: -case 0xa685: -case 0xa686: -case 0xa687: -case 0xa688: -case 0xa689: -case 0xa68a: -case 0xa68b: -case 0xa68c: -case 0xa68d: -case 0xa68e: -case 0xa68f: -case 0xa690: -case 0xa691: -case 0xa692: -case 0xa693: -case 0xa694: -case 0xa695: -case 0xa696: -case 0xa697: -case 0xa698: -case 0xa699: -case 0xa69a: -case 0xa69b: -case 0xa69c: -case 0xa69d: -case 0xa69e: -case 0xa69f: -case 0xa6a0: -case 0xa6a1: -case 0xa6a2: -case 0xa6a3: -case 0xa6a4: -case 0xa6a5: -case 0xa6a6: -case 0xa6a7: -case 0xa6a8: -case 0xa6a9: -case 0xa6aa: -case 0xa6ab: -case 0xa6ac: -case 0xa6ad: -case 0xa6ae: -case 0xa6af: -case 0xa6b0: -case 0xa6b1: -case 0xa6b2: -case 0xa6b3: -case 0xa6b4: -case 0xa6b5: -case 0xa6b6: -case 0xa6b7: -case 0xa6b8: -case 0xa6b9: -case 0xa6ba: -case 0xa6bb: -case 0xa6bc: -case 0xa6bd: -case 0xa6be: -case 0xa6bf: -case 0xa6c0: -case 0xa6c1: -case 0xa6c2: -case 0xa6c3: -case 0xa6c4: -case 0xa6c5: -case 0xa6c6: -case 0xa6c7: -case 0xa6c8: -case 0xa6c9: -case 0xa6ca: -case 0xa6cb: -case 0xa6cc: -case 0xa6cd: -case 0xa6ce: -case 0xa6cf: -case 0xa6d0: -case 0xa6d1: -case 0xa6d2: -case 0xa6d3: -case 0xa6d4: -case 0xa6d5: -case 0xa6d6: -case 0xa6d7: -case 0xa6d8: -case 0xa6d9: -case 0xa6da: -case 0xa6db: -case 0xa6dc: -case 0xa6dd: -case 0xa6de: -case 0xa6df: -case 0xa6e0: -case 0xa6e1: -case 0xa6e2: -case 0xa6e3: -case 0xa6e4: -case 0xa6e5: -case 0xa6e6: -case 0xa6e7: -case 0xa6e8: -case 0xa6e9: -case 0xa6ea: -case 0xa6eb: -case 0xa6ec: -case 0xa6ed: -case 0xa6ee: -case 0xa6ef: -case 0xa6f0: -case 0xa6f1: -case 0xa6f2: -case 0xa6f3: -case 0xa6f4: -case 0xa6f5: -case 0xa6f6: -case 0xa6f7: -case 0xa6f8: -case 0xa6f9: -case 0xa6fa: -case 0xa6fb: -case 0xa6fc: -case 0xa6fd: -case 0xa6fe: -case 0xa6ff: -case 0xa700: -case 0xa701: -case 0xa702: -case 0xa703: -case 0xa704: -case 0xa705: -case 0xa706: -case 0xa707: -case 0xa708: -case 0xa709: -case 0xa70a: -case 0xa70b: -case 0xa70c: -case 0xa70d: -case 0xa70e: -case 0xa70f: -case 0xa710: -case 0xa711: -case 0xa712: -case 0xa713: -case 0xa714: -case 0xa715: -case 0xa716: -case 0xa717: -case 0xa718: -case 0xa719: -case 0xa71a: -case 0xa71b: -case 0xa71c: -case 0xa71d: -case 0xa71e: -case 0xa71f: -case 0xa720: -case 0xa721: -case 0xa722: -case 0xa723: -case 0xa724: -case 0xa725: -case 0xa726: -case 0xa727: -case 0xa728: -case 0xa729: -case 0xa72a: -case 0xa72b: -case 0xa72c: -case 0xa72d: -case 0xa72e: -case 0xa72f: -case 0xa730: -case 0xa731: -case 0xa732: -case 0xa733: -case 0xa734: -case 0xa735: -case 0xa736: -case 0xa737: -case 0xa738: -case 0xa739: -case 0xa73a: -case 0xa73b: -case 0xa73c: -case 0xa73d: -case 0xa73e: -case 0xa73f: -case 0xa740: -case 0xa741: -case 0xa742: -case 0xa743: -case 0xa744: -case 0xa745: -case 0xa746: -case 0xa747: -case 0xa748: -case 0xa749: -case 0xa74a: -case 0xa74b: -case 0xa74c: -case 0xa74d: -case 0xa74e: -case 0xa74f: -case 0xa750: -case 0xa751: -case 0xa752: -case 0xa753: -case 0xa754: -case 0xa755: -case 0xa756: -case 0xa757: -case 0xa758: -case 0xa759: -case 0xa75a: -case 0xa75b: -case 0xa75c: -case 0xa75d: -case 0xa75e: -case 0xa75f: -case 0xa760: -case 0xa761: -case 0xa762: -case 0xa763: -case 0xa764: -case 0xa765: -case 0xa766: -case 0xa767: -case 0xa768: -case 0xa769: -case 0xa76a: -case 0xa76b: -case 0xa76c: -case 0xa76d: -case 0xa76e: -case 0xa76f: -case 0xa770: -case 0xa771: -case 0xa772: -case 0xa773: -case 0xa774: -case 0xa775: -case 0xa776: -case 0xa777: -case 0xa778: -case 0xa779: -case 0xa77a: -case 0xa77b: -case 0xa77c: -case 0xa77d: -case 0xa77e: -case 0xa77f: -case 0xa780: -case 0xa781: -case 0xa782: -case 0xa783: -case 0xa784: -case 0xa785: -case 0xa786: -case 0xa787: -case 0xa788: -case 0xa789: -case 0xa78a: -case 0xa78b: -case 0xa78c: -case 0xa78d: -case 0xa78e: -case 0xa78f: -case 0xa790: -case 0xa791: -case 0xa792: -case 0xa793: -case 0xa794: -case 0xa795: -case 0xa796: -case 0xa797: -case 0xa798: -case 0xa799: -case 0xa79a: -case 0xa79b: -case 0xa79c: -case 0xa79d: -case 0xa79e: -case 0xa79f: -case 0xa7a0: -case 0xa7a1: -case 0xa7a2: -case 0xa7a3: -case 0xa7a4: -case 0xa7a5: -case 0xa7a6: -case 0xa7a7: -case 0xa7a8: -case 0xa7a9: -case 0xa7aa: -case 0xa7ab: -case 0xa7ac: -case 0xa7ad: -case 0xa7ae: -case 0xa7af: -case 0xa7b0: -case 0xa7b1: -case 0xa7b2: -case 0xa7b3: -case 0xa7b4: -case 0xa7b5: -case 0xa7b6: -case 0xa7b7: -case 0xa7b8: -case 0xa7b9: -case 0xa7ba: -case 0xa7bb: -case 0xa7bc: -case 0xa7bd: -case 0xa7be: -case 0xa7bf: -case 0xa7c0: -case 0xa7c1: -case 0xa7c2: -case 0xa7c3: -case 0xa7c4: -case 0xa7c5: -case 0xa7c6: -case 0xa7c7: -case 0xa7c8: -case 0xa7c9: -case 0xa7ca: -case 0xa7cb: -case 0xa7cc: -case 0xa7cd: -case 0xa7ce: -case 0xa7cf: -case 0xa7d0: -case 0xa7d1: -case 0xa7d2: -case 0xa7d3: -case 0xa7d4: -case 0xa7d5: -case 0xa7d6: -case 0xa7d7: -case 0xa7d8: -case 0xa7d9: -case 0xa7da: -case 0xa7db: -case 0xa7dc: -case 0xa7dd: -case 0xa7de: -case 0xa7df: -case 0xa7e0: -case 0xa7e1: -case 0xa7e2: -case 0xa7e3: -case 0xa7e4: -case 0xa7e5: -case 0xa7e6: -case 0xa7e7: -case 0xa7e8: -case 0xa7e9: -case 0xa7ea: -case 0xa7eb: -case 0xa7ec: -case 0xa7ed: -case 0xa7ee: -case 0xa7ef: -case 0xa7f0: -case 0xa7f1: -case 0xa7f2: -case 0xa7f3: -case 0xa7f4: -case 0xa7f5: -case 0xa7f6: -case 0xa7f7: -case 0xa7f8: -case 0xa7f9: -case 0xa7fa: -case 0xa7fb: -case 0xa7fc: -case 0xa7fd: -case 0xa7fe: -case 0xa7ff: -case 0xa800: -case 0xa801: -case 0xa802: -case 0xa803: -case 0xa804: -case 0xa805: -case 0xa806: -case 0xa807: -case 0xa808: -case 0xa809: -case 0xa80a: -case 0xa80b: -case 0xa80c: -case 0xa80d: -case 0xa80e: -case 0xa80f: -case 0xa810: -case 0xa811: -case 0xa812: -case 0xa813: -case 0xa814: -case 0xa815: -case 0xa816: -case 0xa817: -case 0xa818: -case 0xa819: -case 0xa81a: -case 0xa81b: -case 0xa81c: -case 0xa81d: -case 0xa81e: -case 0xa81f: -case 0xa820: -case 0xa821: -case 0xa822: -case 0xa823: -case 0xa824: -case 0xa825: -case 0xa826: -case 0xa827: -case 0xa828: -case 0xa829: -case 0xa82a: -case 0xa82b: -case 0xa82c: -case 0xa82d: -case 0xa82e: -case 0xa82f: -case 0xa830: -case 0xa831: -case 0xa832: -case 0xa833: -case 0xa834: -case 0xa835: -case 0xa836: -case 0xa837: -case 0xa838: -case 0xa839: -case 0xa83a: -case 0xa83b: -case 0xa83c: -case 0xa83d: -case 0xa83e: -case 0xa83f: -case 0xa840: -case 0xa841: -case 0xa842: -case 0xa843: -case 0xa844: -case 0xa845: -case 0xa846: -case 0xa847: -case 0xa848: -case 0xa849: -case 0xa84a: -case 0xa84b: -case 0xa84c: -case 0xa84d: -case 0xa84e: -case 0xa84f: -case 0xa850: -case 0xa851: -case 0xa852: -case 0xa853: -case 0xa854: -case 0xa855: -case 0xa856: -case 0xa857: -case 0xa858: -case 0xa859: -case 0xa85a: -case 0xa85b: -case 0xa85c: -case 0xa85d: -case 0xa85e: -case 0xa85f: -case 0xa860: -case 0xa861: -case 0xa862: -case 0xa863: -case 0xa864: -case 0xa865: -case 0xa866: -case 0xa867: -case 0xa868: -case 0xa869: -case 0xa86a: -case 0xa86b: -case 0xa86c: -case 0xa86d: -case 0xa86e: -case 0xa86f: -case 0xa870: -case 0xa871: -case 0xa872: -case 0xa873: -case 0xa874: -case 0xa875: -case 0xa876: -case 0xa877: -case 0xa878: -case 0xa879: -case 0xa87a: -case 0xa87b: -case 0xa87c: -case 0xa87d: -case 0xa87e: -case 0xa87f: -case 0xa880: -case 0xa881: -case 0xa882: -case 0xa883: -case 0xa884: -case 0xa885: -case 0xa886: -case 0xa887: -case 0xa888: -case 0xa889: -case 0xa88a: -case 0xa88b: -case 0xa88c: -case 0xa88d: -case 0xa88e: -case 0xa88f: -case 0xa890: -case 0xa891: -case 0xa892: -case 0xa893: -case 0xa894: -case 0xa895: -case 0xa896: -case 0xa897: -case 0xa898: -case 0xa899: -case 0xa89a: -case 0xa89b: -case 0xa89c: -case 0xa89d: -case 0xa89e: -case 0xa89f: -case 0xa8a0: -case 0xa8a1: -case 0xa8a2: -case 0xa8a3: -case 0xa8a4: -case 0xa8a5: -case 0xa8a6: -case 0xa8a7: -case 0xa8a8: -case 0xa8a9: -case 0xa8aa: -case 0xa8ab: -case 0xa8ac: -case 0xa8ad: -case 0xa8ae: -case 0xa8af: -case 0xa8b0: -case 0xa8b1: -case 0xa8b2: -case 0xa8b3: -case 0xa8b4: -case 0xa8b5: -case 0xa8b6: -case 0xa8b7: -case 0xa8b8: -case 0xa8b9: -case 0xa8ba: -case 0xa8bb: -case 0xa8bc: -case 0xa8bd: -case 0xa8be: -case 0xa8bf: -case 0xa8c0: -case 0xa8c1: -case 0xa8c2: -case 0xa8c3: -case 0xa8c4: -case 0xa8c5: -case 0xa8c6: -case 0xa8c7: -case 0xa8c8: -case 0xa8c9: -case 0xa8ca: -case 0xa8cb: -case 0xa8cc: -case 0xa8cd: -case 0xa8ce: -case 0xa8cf: -case 0xa8d0: -case 0xa8d1: -case 0xa8d2: -case 0xa8d3: -case 0xa8d4: -case 0xa8d5: -case 0xa8d6: -case 0xa8d7: -case 0xa8d8: -case 0xa8d9: -case 0xa8da: -case 0xa8db: -case 0xa8dc: -case 0xa8dd: -case 0xa8de: -case 0xa8df: -case 0xa8e0: -case 0xa8e1: -case 0xa8e2: -case 0xa8e3: -case 0xa8e4: -case 0xa8e5: -case 0xa8e6: -case 0xa8e7: -case 0xa8e8: -case 0xa8e9: -case 0xa8ea: -case 0xa8eb: -case 0xa8ec: -case 0xa8ed: -case 0xa8ee: -case 0xa8ef: -case 0xa8f0: -case 0xa8f1: -case 0xa8f2: -case 0xa8f3: -case 0xa8f4: -case 0xa8f5: -case 0xa8f6: -case 0xa8f7: -case 0xa8f8: -case 0xa8f9: -case 0xa8fa: -case 0xa8fb: -case 0xa8fc: -case 0xa8fd: -case 0xa8fe: -case 0xa8ff: -case 0xa900: -case 0xa901: -case 0xa902: -case 0xa903: -case 0xa904: -case 0xa905: -case 0xa906: -case 0xa907: -case 0xa908: -case 0xa909: -case 0xa90a: -case 0xa90b: -case 0xa90c: -case 0xa90d: -case 0xa90e: -case 0xa90f: -case 0xa910: -case 0xa911: -case 0xa912: -case 0xa913: -case 0xa914: -case 0xa915: -case 0xa916: -case 0xa917: -case 0xa918: -case 0xa919: -case 0xa91a: -case 0xa91b: -case 0xa91c: -case 0xa91d: -case 0xa91e: -case 0xa91f: -case 0xa920: -case 0xa921: -case 0xa922: -case 0xa923: -case 0xa924: -case 0xa925: -case 0xa926: -case 0xa927: -case 0xa928: -case 0xa929: -case 0xa92a: -case 0xa92b: -case 0xa92c: -case 0xa92d: -case 0xa92e: -case 0xa92f: -case 0xa930: -case 0xa931: -case 0xa932: -case 0xa933: -case 0xa934: -case 0xa935: -case 0xa936: -case 0xa937: -case 0xa938: -case 0xa939: -case 0xa93a: -case 0xa93b: -case 0xa93c: -case 0xa93d: -case 0xa93e: -case 0xa93f: -case 0xa940: -case 0xa941: -case 0xa942: -case 0xa943: -case 0xa944: -case 0xa945: -case 0xa946: -case 0xa947: -case 0xa948: -case 0xa949: -case 0xa94a: -case 0xa94b: -case 0xa94c: -case 0xa94d: -case 0xa94e: -case 0xa94f: -case 0xa950: -case 0xa951: -case 0xa952: -case 0xa953: -case 0xa954: -case 0xa955: -case 0xa956: -case 0xa957: -case 0xa958: -case 0xa959: -case 0xa95a: -case 0xa95b: -case 0xa95c: -case 0xa95d: -case 0xa95e: -case 0xa95f: -case 0xa960: -case 0xa961: -case 0xa962: -case 0xa963: -case 0xa964: -case 0xa965: -case 0xa966: -case 0xa967: -case 0xa968: -case 0xa969: -case 0xa96a: -case 0xa96b: -case 0xa96c: -case 0xa96d: -case 0xa96e: -case 0xa96f: -case 0xa970: -case 0xa971: -case 0xa972: -case 0xa973: -case 0xa974: -case 0xa975: -case 0xa976: -case 0xa977: -case 0xa978: -case 0xa979: -case 0xa97a: -case 0xa97b: -case 0xa97c: -case 0xa97d: -case 0xa97e: -case 0xa97f: -case 0xa980: -case 0xa981: -case 0xa982: -case 0xa983: -case 0xa984: -case 0xa985: -case 0xa986: -case 0xa987: -case 0xa988: -case 0xa989: -case 0xa98a: -case 0xa98b: -case 0xa98c: -case 0xa98d: -case 0xa98e: -case 0xa98f: -case 0xa990: -case 0xa991: -case 0xa992: -case 0xa993: -case 0xa994: -case 0xa995: -case 0xa996: -case 0xa997: -case 0xa998: -case 0xa999: -case 0xa99a: -case 0xa99b: -case 0xa99c: -case 0xa99d: -case 0xa99e: -case 0xa99f: -case 0xa9a0: -case 0xa9a1: -case 0xa9a2: -case 0xa9a3: -case 0xa9a4: -case 0xa9a5: -case 0xa9a6: -case 0xa9a7: -case 0xa9a8: -case 0xa9a9: -case 0xa9aa: -case 0xa9ab: -case 0xa9ac: -case 0xa9ad: -case 0xa9ae: -case 0xa9af: -case 0xa9b0: -case 0xa9b1: -case 0xa9b2: -case 0xa9b3: -case 0xa9b4: -case 0xa9b5: -case 0xa9b6: -case 0xa9b7: -case 0xa9b8: -case 0xa9b9: -case 0xa9ba: -case 0xa9bb: -case 0xa9bc: -case 0xa9bd: -case 0xa9be: -case 0xa9bf: -case 0xa9c0: -case 0xa9c1: -case 0xa9c2: -case 0xa9c3: -case 0xa9c4: -case 0xa9c5: -case 0xa9c6: -case 0xa9c7: -case 0xa9c8: -case 0xa9c9: -case 0xa9ca: -case 0xa9cb: -case 0xa9cc: -case 0xa9cd: -case 0xa9ce: -case 0xa9cf: -case 0xa9d0: -case 0xa9d1: -case 0xa9d2: -case 0xa9d3: -case 0xa9d4: -case 0xa9d5: -case 0xa9d6: -case 0xa9d7: -case 0xa9d8: -case 0xa9d9: -case 0xa9da: -case 0xa9db: -case 0xa9dc: -case 0xa9dd: -case 0xa9de: -case 0xa9df: -case 0xa9e0: -case 0xa9e1: -case 0xa9e2: -case 0xa9e3: -case 0xa9e4: -case 0xa9e5: -case 0xa9e6: -case 0xa9e7: -case 0xa9e8: -case 0xa9e9: -case 0xa9ea: -case 0xa9eb: -case 0xa9ec: -case 0xa9ed: -case 0xa9ee: -case 0xa9ef: -case 0xa9f0: -case 0xa9f1: -case 0xa9f2: -case 0xa9f3: -case 0xa9f4: -case 0xa9f5: -case 0xa9f6: -case 0xa9f7: -case 0xa9f8: -case 0xa9f9: -case 0xa9fa: -case 0xa9fb: -case 0xa9fc: -case 0xa9fd: -case 0xa9fe: -case 0xa9ff: -case 0xaa00: -case 0xaa01: -case 0xaa02: -case 0xaa03: -case 0xaa04: -case 0xaa05: -case 0xaa06: -case 0xaa07: -case 0xaa08: -case 0xaa09: -case 0xaa0a: -case 0xaa0b: -case 0xaa0c: -case 0xaa0d: -case 0xaa0e: -case 0xaa0f: -case 0xaa10: -case 0xaa11: -case 0xaa12: -case 0xaa13: -case 0xaa14: -case 0xaa15: -case 0xaa16: -case 0xaa17: -case 0xaa18: -case 0xaa19: -case 0xaa1a: -case 0xaa1b: -case 0xaa1c: -case 0xaa1d: -case 0xaa1e: -case 0xaa1f: -case 0xaa20: -case 0xaa21: -case 0xaa22: -case 0xaa23: -case 0xaa24: -case 0xaa25: -case 0xaa26: -case 0xaa27: -case 0xaa28: -case 0xaa29: -case 0xaa2a: -case 0xaa2b: -case 0xaa2c: -case 0xaa2d: -case 0xaa2e: -case 0xaa2f: -case 0xaa30: -case 0xaa31: -case 0xaa32: -case 0xaa33: -case 0xaa34: -case 0xaa35: -case 0xaa36: -case 0xaa37: -case 0xaa38: -case 0xaa39: -case 0xaa3a: -case 0xaa3b: -case 0xaa3c: -case 0xaa3d: -case 0xaa3e: -case 0xaa3f: -case 0xaa40: -case 0xaa41: -case 0xaa42: -case 0xaa43: -case 0xaa44: -case 0xaa45: -case 0xaa46: -case 0xaa47: -case 0xaa48: -case 0xaa49: -case 0xaa4a: -case 0xaa4b: -case 0xaa4c: -case 0xaa4d: -case 0xaa4e: -case 0xaa4f: -case 0xaa50: -case 0xaa51: -case 0xaa52: -case 0xaa53: -case 0xaa54: -case 0xaa55: -case 0xaa56: -case 0xaa57: -case 0xaa58: -case 0xaa59: -case 0xaa5a: -case 0xaa5b: -case 0xaa5c: -case 0xaa5d: -case 0xaa5e: -case 0xaa5f: -case 0xaa60: -case 0xaa61: -case 0xaa62: -case 0xaa63: -case 0xaa64: -case 0xaa65: -case 0xaa66: -case 0xaa67: -case 0xaa68: -case 0xaa69: -case 0xaa6a: -case 0xaa6b: -case 0xaa6c: -case 0xaa6d: -case 0xaa6e: -case 0xaa6f: -case 0xaa70: -case 0xaa71: -case 0xaa72: -case 0xaa73: -case 0xaa74: -case 0xaa75: -case 0xaa76: -case 0xaa77: -case 0xaa78: -case 0xaa79: -case 0xaa7a: -case 0xaa7b: -case 0xaa7c: -case 0xaa7d: -case 0xaa7e: -case 0xaa7f: -case 0xaa80: -case 0xaa81: -case 0xaa82: -case 0xaa83: -case 0xaa84: -case 0xaa85: -case 0xaa86: -case 0xaa87: -case 0xaa88: -case 0xaa89: -case 0xaa8a: -case 0xaa8b: -case 0xaa8c: -case 0xaa8d: -case 0xaa8e: -case 0xaa8f: -case 0xaa90: -case 0xaa91: -case 0xaa92: -case 0xaa93: -case 0xaa94: -case 0xaa95: -case 0xaa96: -case 0xaa97: -case 0xaa98: -case 0xaa99: -case 0xaa9a: -case 0xaa9b: -case 0xaa9c: -case 0xaa9d: -case 0xaa9e: -case 0xaa9f: -case 0xaaa0: -case 0xaaa1: -case 0xaaa2: -case 0xaaa3: -case 0xaaa4: -case 0xaaa5: -case 0xaaa6: -case 0xaaa7: -case 0xaaa8: -case 0xaaa9: -case 0xaaaa: -case 0xaaab: -case 0xaaac: -case 0xaaad: -case 0xaaae: -case 0xaaaf: -case 0xaab0: -case 0xaab1: -case 0xaab2: -case 0xaab3: -case 0xaab4: -case 0xaab5: -case 0xaab6: -case 0xaab7: -case 0xaab8: -case 0xaab9: -case 0xaaba: -case 0xaabb: -case 0xaabc: -case 0xaabd: -case 0xaabe: -case 0xaabf: -case 0xaac0: -case 0xaac1: -case 0xaac2: -case 0xaac3: -case 0xaac4: -case 0xaac5: -case 0xaac6: -case 0xaac7: -case 0xaac8: -case 0xaac9: -case 0xaaca: -case 0xaacb: -case 0xaacc: -case 0xaacd: -case 0xaace: -case 0xaacf: -case 0xaad0: -case 0xaad1: -case 0xaad2: -case 0xaad3: -case 0xaad4: -case 0xaad5: -case 0xaad6: -case 0xaad7: -case 0xaad8: -case 0xaad9: -case 0xaada: -case 0xaadb: -case 0xaadc: -case 0xaadd: -case 0xaade: -case 0xaadf: -case 0xaae0: -case 0xaae1: -case 0xaae2: -case 0xaae3: -case 0xaae4: -case 0xaae5: -case 0xaae6: -case 0xaae7: -case 0xaae8: -case 0xaae9: -case 0xaaea: -case 0xaaeb: -case 0xaaec: -case 0xaaed: -case 0xaaee: -case 0xaaef: -case 0xaaf0: -case 0xaaf1: -case 0xaaf2: -case 0xaaf3: -case 0xaaf4: -case 0xaaf5: -case 0xaaf6: -case 0xaaf7: -case 0xaaf8: -case 0xaaf9: -case 0xaafa: -case 0xaafb: -case 0xaafc: -case 0xaafd: -case 0xaafe: -case 0xaaff: -case 0xab00: -case 0xab01: -case 0xab02: -case 0xab03: -case 0xab04: -case 0xab05: -case 0xab06: -case 0xab07: -case 0xab08: -case 0xab09: -case 0xab0a: -case 0xab0b: -case 0xab0c: -case 0xab0d: -case 0xab0e: -case 0xab0f: -case 0xab10: -case 0xab11: -case 0xab12: -case 0xab13: -case 0xab14: -case 0xab15: -case 0xab16: -case 0xab17: -case 0xab18: -case 0xab19: -case 0xab1a: -case 0xab1b: -case 0xab1c: -case 0xab1d: -case 0xab1e: -case 0xab1f: -case 0xab20: -case 0xab21: -case 0xab22: -case 0xab23: -case 0xab24: -case 0xab25: -case 0xab26: -case 0xab27: -case 0xab28: -case 0xab29: -case 0xab2a: -case 0xab2b: -case 0xab2c: -case 0xab2d: -case 0xab2e: -case 0xab2f: -case 0xab30: -case 0xab31: -case 0xab32: -case 0xab33: -case 0xab34: -case 0xab35: -case 0xab36: -case 0xab37: -case 0xab38: -case 0xab39: -case 0xab3a: -case 0xab3b: -case 0xab3c: -case 0xab3d: -case 0xab3e: -case 0xab3f: -case 0xab40: -case 0xab41: -case 0xab42: -case 0xab43: -case 0xab44: -case 0xab45: -case 0xab46: -case 0xab47: -case 0xab48: -case 0xab49: -case 0xab4a: -case 0xab4b: -case 0xab4c: -case 0xab4d: -case 0xab4e: -case 0xab4f: -case 0xab50: -case 0xab51: -case 0xab52: -case 0xab53: -case 0xab54: -case 0xab55: -case 0xab56: -case 0xab57: -case 0xab58: -case 0xab59: -case 0xab5a: -case 0xab5b: -case 0xab5c: -case 0xab5d: -case 0xab5e: -case 0xab5f: -case 0xab60: -case 0xab61: -case 0xab62: -case 0xab63: -case 0xab64: -case 0xab65: -case 0xab66: -case 0xab67: -case 0xab68: -case 0xab69: -case 0xab6a: -case 0xab6b: -case 0xab6c: -case 0xab6d: -case 0xab6e: -case 0xab6f: -case 0xab70: -case 0xab71: -case 0xab72: -case 0xab73: -case 0xab74: -case 0xab75: -case 0xab76: -case 0xab77: -case 0xab78: -case 0xab79: -case 0xab7a: -case 0xab7b: -case 0xab7c: -case 0xab7d: -case 0xab7e: -case 0xab7f: -case 0xab80: -case 0xab81: -case 0xab82: -case 0xab83: -case 0xab84: -case 0xab85: -case 0xab86: -case 0xab87: -case 0xab88: -case 0xab89: -case 0xab8a: -case 0xab8b: -case 0xab8c: -case 0xab8d: -case 0xab8e: -case 0xab8f: -case 0xab90: -case 0xab91: -case 0xab92: -case 0xab93: -case 0xab94: -case 0xab95: -case 0xab96: -case 0xab97: -case 0xab98: -case 0xab99: -case 0xab9a: -case 0xab9b: -case 0xab9c: -case 0xab9d: -case 0xab9e: -case 0xab9f: -case 0xaba0: -case 0xaba1: -case 0xaba2: -case 0xaba3: -case 0xaba4: -case 0xaba5: -case 0xaba6: -case 0xaba7: -case 0xaba8: -case 0xaba9: -case 0xabaa: -case 0xabab: -case 0xabac: -case 0xabad: -case 0xabae: -case 0xabaf: -case 0xabb0: -case 0xabb1: -case 0xabb2: -case 0xabb3: -case 0xabb4: -case 0xabb5: -case 0xabb6: -case 0xabb7: -case 0xabb8: -case 0xabb9: -case 0xabba: -case 0xabbb: -case 0xabbc: -case 0xabbd: -case 0xabbe: -case 0xabbf: -case 0xabc0: -case 0xabc1: -case 0xabc2: -case 0xabc3: -case 0xabc4: -case 0xabc5: -case 0xabc6: -case 0xabc7: -case 0xabc8: -case 0xabc9: -case 0xabca: -case 0xabcb: -case 0xabcc: -case 0xabcd: -case 0xabce: -case 0xabcf: -case 0xabd0: -case 0xabd1: -case 0xabd2: -case 0xabd3: -case 0xabd4: -case 0xabd5: -case 0xabd6: -case 0xabd7: -case 0xabd8: -case 0xabd9: -case 0xabda: -case 0xabdb: -case 0xabdc: -case 0xabdd: -case 0xabde: -case 0xabdf: -case 0xabe0: -case 0xabe1: -case 0xabe2: -case 0xabe3: -case 0xabe4: -case 0xabe5: -case 0xabe6: -case 0xabe7: -case 0xabe8: -case 0xabe9: -case 0xabea: -case 0xabeb: -case 0xabec: -case 0xabed: -case 0xabee: -case 0xabef: -case 0xabf0: -case 0xabf1: -case 0xabf2: -case 0xabf3: -case 0xabf4: -case 0xabf5: -case 0xabf6: -case 0xabf7: -case 0xabf8: -case 0xabf9: -case 0xabfa: -case 0xabfb: -case 0xabfc: -case 0xabfd: -case 0xabfe: -case 0xabff: -case 0xac00: -case 0xac01: -case 0xac02: -case 0xac03: -case 0xac04: -case 0xac05: -case 0xac06: -case 0xac07: -case 0xac08: -case 0xac09: -case 0xac0a: -case 0xac0b: -case 0xac0c: -case 0xac0d: -case 0xac0e: -case 0xac0f: -case 0xac10: -case 0xac11: -case 0xac12: -case 0xac13: -case 0xac14: -case 0xac15: -case 0xac16: -case 0xac17: -case 0xac18: -case 0xac19: -case 0xac1a: -case 0xac1b: -case 0xac1c: -case 0xac1d: -case 0xac1e: -case 0xac1f: -case 0xac20: -case 0xac21: -case 0xac22: -case 0xac23: -case 0xac24: -case 0xac25: -case 0xac26: -case 0xac27: -case 0xac28: -case 0xac29: -case 0xac2a: -case 0xac2b: -case 0xac2c: -case 0xac2d: -case 0xac2e: -case 0xac2f: -case 0xac30: -case 0xac31: -case 0xac32: -case 0xac33: -case 0xac34: -case 0xac35: -case 0xac36: -case 0xac37: -case 0xac38: -case 0xac39: -case 0xac3a: -case 0xac3b: -case 0xac3c: -case 0xac3d: -case 0xac3e: -case 0xac3f: -case 0xac40: -case 0xac41: -case 0xac42: -case 0xac43: -case 0xac44: -case 0xac45: -case 0xac46: -case 0xac47: -case 0xac48: -case 0xac49: -case 0xac4a: -case 0xac4b: -case 0xac4c: -case 0xac4d: -case 0xac4e: -case 0xac4f: -case 0xac50: -case 0xac51: -case 0xac52: -case 0xac53: -case 0xac54: -case 0xac55: -case 0xac56: -case 0xac57: -case 0xac58: -case 0xac59: -case 0xac5a: -case 0xac5b: -case 0xac5c: -case 0xac5d: -case 0xac5e: -case 0xac5f: -case 0xac60: -case 0xac61: -case 0xac62: -case 0xac63: -case 0xac64: -case 0xac65: -case 0xac66: -case 0xac67: -case 0xac68: -case 0xac69: -case 0xac6a: -case 0xac6b: -case 0xac6c: -case 0xac6d: -case 0xac6e: -case 0xac6f: -case 0xac70: -case 0xac71: -case 0xac72: -case 0xac73: -case 0xac74: -case 0xac75: -case 0xac76: -case 0xac77: -case 0xac78: -case 0xac79: -case 0xac7a: -case 0xac7b: -case 0xac7c: -case 0xac7d: -case 0xac7e: -case 0xac7f: -case 0xac80: -case 0xac81: -case 0xac82: -case 0xac83: -case 0xac84: -case 0xac85: -case 0xac86: -case 0xac87: -case 0xac88: -case 0xac89: -case 0xac8a: -case 0xac8b: -case 0xac8c: -case 0xac8d: -case 0xac8e: -case 0xac8f: -case 0xac90: -case 0xac91: -case 0xac92: -case 0xac93: -case 0xac94: -case 0xac95: -case 0xac96: -case 0xac97: -case 0xac98: -case 0xac99: -case 0xac9a: -case 0xac9b: -case 0xac9c: -case 0xac9d: -case 0xac9e: -case 0xac9f: -case 0xaca0: -case 0xaca1: -case 0xaca2: -case 0xaca3: -case 0xaca4: -case 0xaca5: -case 0xaca6: -case 0xaca7: -case 0xaca8: -case 0xaca9: -case 0xacaa: -case 0xacab: -case 0xacac: -case 0xacad: -case 0xacae: -case 0xacaf: -case 0xacb0: -case 0xacb1: -case 0xacb2: -case 0xacb3: -case 0xacb4: -case 0xacb5: -case 0xacb6: -case 0xacb7: -case 0xacb8: -case 0xacb9: -case 0xacba: -case 0xacbb: -case 0xacbc: -case 0xacbd: -case 0xacbe: -case 0xacbf: -case 0xacc0: -case 0xacc1: -case 0xacc2: -case 0xacc3: -case 0xacc4: -case 0xacc5: -case 0xacc6: -case 0xacc7: -case 0xacc8: -case 0xacc9: -case 0xacca: -case 0xaccb: -case 0xaccc: -case 0xaccd: -case 0xacce: -case 0xaccf: -case 0xacd0: -case 0xacd1: -case 0xacd2: -case 0xacd3: -case 0xacd4: -case 0xacd5: -case 0xacd6: -case 0xacd7: -case 0xacd8: -case 0xacd9: -case 0xacda: -case 0xacdb: -case 0xacdc: -case 0xacdd: -case 0xacde: -case 0xacdf: -case 0xace0: -case 0xace1: -case 0xace2: -case 0xace3: -case 0xace4: -case 0xace5: -case 0xace6: -case 0xace7: -case 0xace8: -case 0xace9: -case 0xacea: -case 0xaceb: -case 0xacec: -case 0xaced: -case 0xacee: -case 0xacef: -case 0xacf0: -case 0xacf1: -case 0xacf2: -case 0xacf3: -case 0xacf4: -case 0xacf5: -case 0xacf6: -case 0xacf7: -case 0xacf8: -case 0xacf9: -case 0xacfa: -case 0xacfb: -case 0xacfc: -case 0xacfd: -case 0xacfe: -case 0xacff: -case 0xad00: -case 0xad01: -case 0xad02: -case 0xad03: -case 0xad04: -case 0xad05: -case 0xad06: -case 0xad07: -case 0xad08: -case 0xad09: -case 0xad0a: -case 0xad0b: -case 0xad0c: -case 0xad0d: -case 0xad0e: -case 0xad0f: -case 0xad10: -case 0xad11: -case 0xad12: -case 0xad13: -case 0xad14: -case 0xad15: -case 0xad16: -case 0xad17: -case 0xad18: -case 0xad19: -case 0xad1a: -case 0xad1b: -case 0xad1c: -case 0xad1d: -case 0xad1e: -case 0xad1f: -case 0xad20: -case 0xad21: -case 0xad22: -case 0xad23: -case 0xad24: -case 0xad25: -case 0xad26: -case 0xad27: -case 0xad28: -case 0xad29: -case 0xad2a: -case 0xad2b: -case 0xad2c: -case 0xad2d: -case 0xad2e: -case 0xad2f: -case 0xad30: -case 0xad31: -case 0xad32: -case 0xad33: -case 0xad34: -case 0xad35: -case 0xad36: -case 0xad37: -case 0xad38: -case 0xad39: -case 0xad3a: -case 0xad3b: -case 0xad3c: -case 0xad3d: -case 0xad3e: -case 0xad3f: -case 0xad40: -case 0xad41: -case 0xad42: -case 0xad43: -case 0xad44: -case 0xad45: -case 0xad46: -case 0xad47: -case 0xad48: -case 0xad49: -case 0xad4a: -case 0xad4b: -case 0xad4c: -case 0xad4d: -case 0xad4e: -case 0xad4f: -case 0xad50: -case 0xad51: -case 0xad52: -case 0xad53: -case 0xad54: -case 0xad55: -case 0xad56: -case 0xad57: -case 0xad58: -case 0xad59: -case 0xad5a: -case 0xad5b: -case 0xad5c: -case 0xad5d: -case 0xad5e: -case 0xad5f: -case 0xad60: -case 0xad61: -case 0xad62: -case 0xad63: -case 0xad64: -case 0xad65: -case 0xad66: -case 0xad67: -case 0xad68: -case 0xad69: -case 0xad6a: -case 0xad6b: -case 0xad6c: -case 0xad6d: -case 0xad6e: -case 0xad6f: -case 0xad70: -case 0xad71: -case 0xad72: -case 0xad73: -case 0xad74: -case 0xad75: -case 0xad76: -case 0xad77: -case 0xad78: -case 0xad79: -case 0xad7a: -case 0xad7b: -case 0xad7c: -case 0xad7d: -case 0xad7e: -case 0xad7f: -case 0xad80: -case 0xad81: -case 0xad82: -case 0xad83: -case 0xad84: -case 0xad85: -case 0xad86: -case 0xad87: -case 0xad88: -case 0xad89: -case 0xad8a: -case 0xad8b: -case 0xad8c: -case 0xad8d: -case 0xad8e: -case 0xad8f: -case 0xad90: -case 0xad91: -case 0xad92: -case 0xad93: -case 0xad94: -case 0xad95: -case 0xad96: -case 0xad97: -case 0xad98: -case 0xad99: -case 0xad9a: -case 0xad9b: -case 0xad9c: -case 0xad9d: -case 0xad9e: -case 0xad9f: -case 0xada0: -case 0xada1: -case 0xada2: -case 0xada3: -case 0xada4: -case 0xada5: -case 0xada6: -case 0xada7: -case 0xada8: -case 0xada9: -case 0xadaa: -case 0xadab: -case 0xadac: -case 0xadad: -case 0xadae: -case 0xadaf: -case 0xadb0: -case 0xadb1: -case 0xadb2: -case 0xadb3: -case 0xadb4: -case 0xadb5: -case 0xadb6: -case 0xadb7: -case 0xadb8: -case 0xadb9: -case 0xadba: -case 0xadbb: -case 0xadbc: -case 0xadbd: -case 0xadbe: -case 0xadbf: -case 0xadc0: -case 0xadc1: -case 0xadc2: -case 0xadc3: -case 0xadc4: -case 0xadc5: -case 0xadc6: -case 0xadc7: -case 0xadc8: -case 0xadc9: -case 0xadca: -case 0xadcb: -case 0xadcc: -case 0xadcd: -case 0xadce: -case 0xadcf: -case 0xadd0: -case 0xadd1: -case 0xadd2: -case 0xadd3: -case 0xadd4: -case 0xadd5: -case 0xadd6: -case 0xadd7: -case 0xadd8: -case 0xadd9: -case 0xadda: -case 0xaddb: -case 0xaddc: -case 0xaddd: -case 0xadde: -case 0xaddf: -case 0xade0: -case 0xade1: -case 0xade2: -case 0xade3: -case 0xade4: -case 0xade5: -case 0xade6: -case 0xade7: -case 0xade8: -case 0xade9: -case 0xadea: -case 0xadeb: -case 0xadec: -case 0xaded: -case 0xadee: -case 0xadef: -case 0xadf0: -case 0xadf1: -case 0xadf2: -case 0xadf3: -case 0xadf4: -case 0xadf5: -case 0xadf6: -case 0xadf7: -case 0xadf8: -case 0xadf9: -case 0xadfa: -case 0xadfb: -case 0xadfc: -case 0xadfd: -case 0xadfe: -case 0xadff: -case 0xae00: -case 0xae01: -case 0xae02: -case 0xae03: -case 0xae04: -case 0xae05: -case 0xae06: -case 0xae07: -case 0xae08: -case 0xae09: -case 0xae0a: -case 0xae0b: -case 0xae0c: -case 0xae0d: -case 0xae0e: -case 0xae0f: -case 0xae10: -case 0xae11: -case 0xae12: -case 0xae13: -case 0xae14: -case 0xae15: -case 0xae16: -case 0xae17: -case 0xae18: -case 0xae19: -case 0xae1a: -case 0xae1b: -case 0xae1c: -case 0xae1d: -case 0xae1e: -case 0xae1f: -case 0xae20: -case 0xae21: -case 0xae22: -case 0xae23: -case 0xae24: -case 0xae25: -case 0xae26: -case 0xae27: -case 0xae28: -case 0xae29: -case 0xae2a: -case 0xae2b: -case 0xae2c: -case 0xae2d: -case 0xae2e: -case 0xae2f: -case 0xae30: -case 0xae31: -case 0xae32: -case 0xae33: -case 0xae34: -case 0xae35: -case 0xae36: -case 0xae37: -case 0xae38: -case 0xae39: -case 0xae3a: -case 0xae3b: -case 0xae3c: -case 0xae3d: -case 0xae3e: -case 0xae3f: -case 0xae40: -case 0xae41: -case 0xae42: -case 0xae43: -case 0xae44: -case 0xae45: -case 0xae46: -case 0xae47: -case 0xae48: -case 0xae49: -case 0xae4a: -case 0xae4b: -case 0xae4c: -case 0xae4d: -case 0xae4e: -case 0xae4f: -case 0xae50: -case 0xae51: -case 0xae52: -case 0xae53: -case 0xae54: -case 0xae55: -case 0xae56: -case 0xae57: -case 0xae58: -case 0xae59: -case 0xae5a: -case 0xae5b: -case 0xae5c: -case 0xae5d: -case 0xae5e: -case 0xae5f: -case 0xae60: -case 0xae61: -case 0xae62: -case 0xae63: -case 0xae64: -case 0xae65: -case 0xae66: -case 0xae67: -case 0xae68: -case 0xae69: -case 0xae6a: -case 0xae6b: -case 0xae6c: -case 0xae6d: -case 0xae6e: -case 0xae6f: -case 0xae70: -case 0xae71: -case 0xae72: -case 0xae73: -case 0xae74: -case 0xae75: -case 0xae76: -case 0xae77: -case 0xae78: -case 0xae79: -case 0xae7a: -case 0xae7b: -case 0xae7c: -case 0xae7d: -case 0xae7e: -case 0xae7f: -case 0xae80: -case 0xae81: -case 0xae82: -case 0xae83: -case 0xae84: -case 0xae85: -case 0xae86: -case 0xae87: -case 0xae88: -case 0xae89: -case 0xae8a: -case 0xae8b: -case 0xae8c: -case 0xae8d: -case 0xae8e: -case 0xae8f: -case 0xae90: -case 0xae91: -case 0xae92: -case 0xae93: -case 0xae94: -case 0xae95: -case 0xae96: -case 0xae97: -case 0xae98: -case 0xae99: -case 0xae9a: -case 0xae9b: -case 0xae9c: -case 0xae9d: -case 0xae9e: -case 0xae9f: -case 0xaea0: -case 0xaea1: -case 0xaea2: -case 0xaea3: -case 0xaea4: -case 0xaea5: -case 0xaea6: -case 0xaea7: -case 0xaea8: -case 0xaea9: -case 0xaeaa: -case 0xaeab: -case 0xaeac: -case 0xaead: -case 0xaeae: -case 0xaeaf: -case 0xaeb0: -case 0xaeb1: -case 0xaeb2: -case 0xaeb3: -case 0xaeb4: -case 0xaeb5: -case 0xaeb6: -case 0xaeb7: -case 0xaeb8: -case 0xaeb9: -case 0xaeba: -case 0xaebb: -case 0xaebc: -case 0xaebd: -case 0xaebe: -case 0xaebf: -case 0xaec0: -case 0xaec1: -case 0xaec2: -case 0xaec3: -case 0xaec4: -case 0xaec5: -case 0xaec6: -case 0xaec7: -case 0xaec8: -case 0xaec9: -case 0xaeca: -case 0xaecb: -case 0xaecc: -case 0xaecd: -case 0xaece: -case 0xaecf: -case 0xaed0: -case 0xaed1: -case 0xaed2: -case 0xaed3: -case 0xaed4: -case 0xaed5: -case 0xaed6: -case 0xaed7: -case 0xaed8: -case 0xaed9: -case 0xaeda: -case 0xaedb: -case 0xaedc: -case 0xaedd: -case 0xaede: -case 0xaedf: -case 0xaee0: -case 0xaee1: -case 0xaee2: -case 0xaee3: -case 0xaee4: -case 0xaee5: -case 0xaee6: -case 0xaee7: -case 0xaee8: -case 0xaee9: -case 0xaeea: -case 0xaeeb: -case 0xaeec: -case 0xaeed: -case 0xaeee: -case 0xaeef: -case 0xaef0: -case 0xaef1: -case 0xaef2: -case 0xaef3: -case 0xaef4: -case 0xaef5: -case 0xaef6: -case 0xaef7: -case 0xaef8: -case 0xaef9: -case 0xaefa: -case 0xaefb: -case 0xaefc: -case 0xaefd: -case 0xaefe: -case 0xaeff: -case 0xaf00: -case 0xaf01: -case 0xaf02: -case 0xaf03: -case 0xaf04: -case 0xaf05: -case 0xaf06: -case 0xaf07: -case 0xaf08: -case 0xaf09: -case 0xaf0a: -case 0xaf0b: -case 0xaf0c: -case 0xaf0d: -case 0xaf0e: -case 0xaf0f: -case 0xaf10: -case 0xaf11: -case 0xaf12: -case 0xaf13: -case 0xaf14: -case 0xaf15: -case 0xaf16: -case 0xaf17: -case 0xaf18: -case 0xaf19: -case 0xaf1a: -case 0xaf1b: -case 0xaf1c: -case 0xaf1d: -case 0xaf1e: -case 0xaf1f: -case 0xaf20: -case 0xaf21: -case 0xaf22: -case 0xaf23: -case 0xaf24: -case 0xaf25: -case 0xaf26: -case 0xaf27: -case 0xaf28: -case 0xaf29: -case 0xaf2a: -case 0xaf2b: -case 0xaf2c: -case 0xaf2d: -case 0xaf2e: -case 0xaf2f: -case 0xaf30: -case 0xaf31: -case 0xaf32: -case 0xaf33: -case 0xaf34: -case 0xaf35: -case 0xaf36: -case 0xaf37: -case 0xaf38: -case 0xaf39: -case 0xaf3a: -case 0xaf3b: -case 0xaf3c: -case 0xaf3d: -case 0xaf3e: -case 0xaf3f: -case 0xaf40: -case 0xaf41: -case 0xaf42: -case 0xaf43: -case 0xaf44: -case 0xaf45: -case 0xaf46: -case 0xaf47: -case 0xaf48: -case 0xaf49: -case 0xaf4a: -case 0xaf4b: -case 0xaf4c: -case 0xaf4d: -case 0xaf4e: -case 0xaf4f: -case 0xaf50: -case 0xaf51: -case 0xaf52: -case 0xaf53: -case 0xaf54: -case 0xaf55: -case 0xaf56: -case 0xaf57: -case 0xaf58: -case 0xaf59: -case 0xaf5a: -case 0xaf5b: -case 0xaf5c: -case 0xaf5d: -case 0xaf5e: -case 0xaf5f: -case 0xaf60: -case 0xaf61: -case 0xaf62: -case 0xaf63: -case 0xaf64: -case 0xaf65: -case 0xaf66: -case 0xaf67: -case 0xaf68: -case 0xaf69: -case 0xaf6a: -case 0xaf6b: -case 0xaf6c: -case 0xaf6d: -case 0xaf6e: -case 0xaf6f: -case 0xaf70: -case 0xaf71: -case 0xaf72: -case 0xaf73: -case 0xaf74: -case 0xaf75: -case 0xaf76: -case 0xaf77: -case 0xaf78: -case 0xaf79: -case 0xaf7a: -case 0xaf7b: -case 0xaf7c: -case 0xaf7d: -case 0xaf7e: -case 0xaf7f: -case 0xaf80: -case 0xaf81: -case 0xaf82: -case 0xaf83: -case 0xaf84: -case 0xaf85: -case 0xaf86: -case 0xaf87: -case 0xaf88: -case 0xaf89: -case 0xaf8a: -case 0xaf8b: -case 0xaf8c: -case 0xaf8d: -case 0xaf8e: -case 0xaf8f: -case 0xaf90: -case 0xaf91: -case 0xaf92: -case 0xaf93: -case 0xaf94: -case 0xaf95: -case 0xaf96: -case 0xaf97: -case 0xaf98: -case 0xaf99: -case 0xaf9a: -case 0xaf9b: -case 0xaf9c: -case 0xaf9d: -case 0xaf9e: -case 0xaf9f: -case 0xafa0: -case 0xafa1: -case 0xafa2: -case 0xafa3: -case 0xafa4: -case 0xafa5: -case 0xafa6: -case 0xafa7: -case 0xafa8: -case 0xafa9: -case 0xafaa: -case 0xafab: -case 0xafac: -case 0xafad: -case 0xafae: -case 0xafaf: -case 0xafb0: -case 0xafb1: -case 0xafb2: -case 0xafb3: -case 0xafb4: -case 0xafb5: -case 0xafb6: -case 0xafb7: -case 0xafb8: -case 0xafb9: -case 0xafba: -case 0xafbb: -case 0xafbc: -case 0xafbd: -case 0xafbe: -case 0xafbf: -case 0xafc0: -case 0xafc1: -case 0xafc2: -case 0xafc3: -case 0xafc4: -case 0xafc5: -case 0xafc6: -case 0xafc7: -case 0xafc8: -case 0xafc9: -case 0xafca: -case 0xafcb: -case 0xafcc: -case 0xafcd: -case 0xafce: -case 0xafcf: -case 0xafd0: -case 0xafd1: -case 0xafd2: -case 0xafd3: -case 0xafd4: -case 0xafd5: -case 0xafd6: -case 0xafd7: -case 0xafd8: -case 0xafd9: -case 0xafda: -case 0xafdb: -case 0xafdc: -case 0xafdd: -case 0xafde: -case 0xafdf: -case 0xafe0: -case 0xafe1: -case 0xafe2: -case 0xafe3: -case 0xafe4: -case 0xafe5: -case 0xafe6: -case 0xafe7: -case 0xafe8: -case 0xafe9: -case 0xafea: -case 0xafeb: -case 0xafec: -case 0xafed: -case 0xafee: -case 0xafef: -case 0xaff0: -case 0xaff1: -case 0xaff2: -case 0xaff3: -case 0xaff4: -case 0xaff5: -case 0xaff6: -case 0xaff7: -case 0xaff8: -case 0xaff9: -case 0xaffa: -case 0xaffb: -case 0xaffc: -case 0xaffd: -case 0xaffe: -case 0xafff: - { - LINEA(); - } - break; - -case 0xf000: -case 0xf001: -case 0xf002: -case 0xf003: -case 0xf004: -case 0xf005: -case 0xf006: -case 0xf007: -case 0xf008: -case 0xf009: -case 0xf00a: -case 0xf00b: -case 0xf00c: -case 0xf00d: -case 0xf00e: -case 0xf00f: -case 0xf010: -case 0xf011: -case 0xf012: -case 0xf013: -case 0xf014: -case 0xf015: -case 0xf016: -case 0xf017: -case 0xf018: -case 0xf019: -case 0xf01a: -case 0xf01b: -case 0xf01c: -case 0xf01d: -case 0xf01e: -case 0xf01f: -case 0xf020: -case 0xf021: -case 0xf022: -case 0xf023: -case 0xf024: -case 0xf025: -case 0xf026: -case 0xf027: -case 0xf028: -case 0xf029: -case 0xf02a: -case 0xf02b: -case 0xf02c: -case 0xf02d: -case 0xf02e: -case 0xf02f: -case 0xf030: -case 0xf031: -case 0xf032: -case 0xf033: -case 0xf034: -case 0xf035: -case 0xf036: -case 0xf037: -case 0xf038: -case 0xf039: -case 0xf03a: -case 0xf03b: -case 0xf03c: -case 0xf03d: -case 0xf03e: -case 0xf03f: -case 0xf040: -case 0xf041: -case 0xf042: -case 0xf043: -case 0xf044: -case 0xf045: -case 0xf046: -case 0xf047: -case 0xf048: -case 0xf049: -case 0xf04a: -case 0xf04b: -case 0xf04c: -case 0xf04d: -case 0xf04e: -case 0xf04f: -case 0xf050: -case 0xf051: -case 0xf052: -case 0xf053: -case 0xf054: -case 0xf055: -case 0xf056: -case 0xf057: -case 0xf058: -case 0xf059: -case 0xf05a: -case 0xf05b: -case 0xf05c: -case 0xf05d: -case 0xf05e: -case 0xf05f: -case 0xf060: -case 0xf061: -case 0xf062: -case 0xf063: -case 0xf064: -case 0xf065: -case 0xf066: -case 0xf067: -case 0xf068: -case 0xf069: -case 0xf06a: -case 0xf06b: -case 0xf06c: -case 0xf06d: -case 0xf06e: -case 0xf06f: -case 0xf070: -case 0xf071: -case 0xf072: -case 0xf073: -case 0xf074: -case 0xf075: -case 0xf076: -case 0xf077: -case 0xf078: -case 0xf079: -case 0xf07a: -case 0xf07b: -case 0xf07c: -case 0xf07d: -case 0xf07e: -case 0xf07f: -case 0xf080: -case 0xf081: -case 0xf082: -case 0xf083: -case 0xf084: -case 0xf085: -case 0xf086: -case 0xf087: -case 0xf088: -case 0xf089: -case 0xf08a: -case 0xf08b: -case 0xf08c: -case 0xf08d: -case 0xf08e: -case 0xf08f: -case 0xf090: -case 0xf091: -case 0xf092: -case 0xf093: -case 0xf094: -case 0xf095: -case 0xf096: -case 0xf097: -case 0xf098: -case 0xf099: -case 0xf09a: -case 0xf09b: -case 0xf09c: -case 0xf09d: -case 0xf09e: -case 0xf09f: -case 0xf0a0: -case 0xf0a1: -case 0xf0a2: -case 0xf0a3: -case 0xf0a4: -case 0xf0a5: -case 0xf0a6: -case 0xf0a7: -case 0xf0a8: -case 0xf0a9: -case 0xf0aa: -case 0xf0ab: -case 0xf0ac: -case 0xf0ad: -case 0xf0ae: -case 0xf0af: -case 0xf0b0: -case 0xf0b1: -case 0xf0b2: -case 0xf0b3: -case 0xf0b4: -case 0xf0b5: -case 0xf0b6: -case 0xf0b7: -case 0xf0b8: -case 0xf0b9: -case 0xf0ba: -case 0xf0bb: -case 0xf0bc: -case 0xf0bd: -case 0xf0be: -case 0xf0bf: -case 0xf0c0: -case 0xf0c1: -case 0xf0c2: -case 0xf0c3: -case 0xf0c4: -case 0xf0c5: -case 0xf0c6: -case 0xf0c7: -case 0xf0c8: -case 0xf0c9: -case 0xf0ca: -case 0xf0cb: -case 0xf0cc: -case 0xf0cd: -case 0xf0ce: -case 0xf0cf: -case 0xf0d0: -case 0xf0d1: -case 0xf0d2: -case 0xf0d3: -case 0xf0d4: -case 0xf0d5: -case 0xf0d6: -case 0xf0d7: -case 0xf0d8: -case 0xf0d9: -case 0xf0da: -case 0xf0db: -case 0xf0dc: -case 0xf0dd: -case 0xf0de: -case 0xf0df: -case 0xf0e0: -case 0xf0e1: -case 0xf0e2: -case 0xf0e3: -case 0xf0e4: -case 0xf0e5: -case 0xf0e6: -case 0xf0e7: -case 0xf0e8: -case 0xf0e9: -case 0xf0ea: -case 0xf0eb: -case 0xf0ec: -case 0xf0ed: -case 0xf0ee: -case 0xf0ef: -case 0xf0f0: -case 0xf0f1: -case 0xf0f2: -case 0xf0f3: -case 0xf0f4: -case 0xf0f5: -case 0xf0f6: -case 0xf0f7: -case 0xf0f8: -case 0xf0f9: -case 0xf0fa: -case 0xf0fb: -case 0xf0fc: -case 0xf0fd: -case 0xf0fe: -case 0xf0ff: -case 0xf100: -case 0xf101: -case 0xf102: -case 0xf103: -case 0xf104: -case 0xf105: -case 0xf106: -case 0xf107: -case 0xf108: -case 0xf109: -case 0xf10a: -case 0xf10b: -case 0xf10c: -case 0xf10d: -case 0xf10e: -case 0xf10f: -case 0xf110: -case 0xf111: -case 0xf112: -case 0xf113: -case 0xf114: -case 0xf115: -case 0xf116: -case 0xf117: -case 0xf118: -case 0xf119: -case 0xf11a: -case 0xf11b: -case 0xf11c: -case 0xf11d: -case 0xf11e: -case 0xf11f: -case 0xf120: -case 0xf121: -case 0xf122: -case 0xf123: -case 0xf124: -case 0xf125: -case 0xf126: -case 0xf127: -case 0xf128: -case 0xf129: -case 0xf12a: -case 0xf12b: -case 0xf12c: -case 0xf12d: -case 0xf12e: -case 0xf12f: -case 0xf130: -case 0xf131: -case 0xf132: -case 0xf133: -case 0xf134: -case 0xf135: -case 0xf136: -case 0xf137: -case 0xf138: -case 0xf139: -case 0xf13a: -case 0xf13b: -case 0xf13c: -case 0xf13d: -case 0xf13e: -case 0xf13f: -case 0xf140: -case 0xf141: -case 0xf142: -case 0xf143: -case 0xf144: -case 0xf145: -case 0xf146: -case 0xf147: -case 0xf148: -case 0xf149: -case 0xf14a: -case 0xf14b: -case 0xf14c: -case 0xf14d: -case 0xf14e: -case 0xf14f: -case 0xf150: -case 0xf151: -case 0xf152: -case 0xf153: -case 0xf154: -case 0xf155: -case 0xf156: -case 0xf157: -case 0xf158: -case 0xf159: -case 0xf15a: -case 0xf15b: -case 0xf15c: -case 0xf15d: -case 0xf15e: -case 0xf15f: -case 0xf160: -case 0xf161: -case 0xf162: -case 0xf163: -case 0xf164: -case 0xf165: -case 0xf166: -case 0xf167: -case 0xf168: -case 0xf169: -case 0xf16a: -case 0xf16b: -case 0xf16c: -case 0xf16d: -case 0xf16e: -case 0xf16f: -case 0xf170: -case 0xf171: -case 0xf172: -case 0xf173: -case 0xf174: -case 0xf175: -case 0xf176: -case 0xf177: -case 0xf178: -case 0xf179: -case 0xf17a: -case 0xf17b: -case 0xf17c: -case 0xf17d: -case 0xf17e: -case 0xf17f: -case 0xf180: -case 0xf181: -case 0xf182: -case 0xf183: -case 0xf184: -case 0xf185: -case 0xf186: -case 0xf187: -case 0xf188: -case 0xf189: -case 0xf18a: -case 0xf18b: -case 0xf18c: -case 0xf18d: -case 0xf18e: -case 0xf18f: -case 0xf190: -case 0xf191: -case 0xf192: -case 0xf193: -case 0xf194: -case 0xf195: -case 0xf196: -case 0xf197: -case 0xf198: -case 0xf199: -case 0xf19a: -case 0xf19b: -case 0xf19c: -case 0xf19d: -case 0xf19e: -case 0xf19f: -case 0xf1a0: -case 0xf1a1: -case 0xf1a2: -case 0xf1a3: -case 0xf1a4: -case 0xf1a5: -case 0xf1a6: -case 0xf1a7: -case 0xf1a8: -case 0xf1a9: -case 0xf1aa: -case 0xf1ab: -case 0xf1ac: -case 0xf1ad: -case 0xf1ae: -case 0xf1af: -case 0xf1b0: -case 0xf1b1: -case 0xf1b2: -case 0xf1b3: -case 0xf1b4: -case 0xf1b5: -case 0xf1b6: -case 0xf1b7: -case 0xf1b8: -case 0xf1b9: -case 0xf1ba: -case 0xf1bb: -case 0xf1bc: -case 0xf1bd: -case 0xf1be: -case 0xf1bf: -case 0xf1c0: -case 0xf1c1: -case 0xf1c2: -case 0xf1c3: -case 0xf1c4: -case 0xf1c5: -case 0xf1c6: -case 0xf1c7: -case 0xf1c8: -case 0xf1c9: -case 0xf1ca: -case 0xf1cb: -case 0xf1cc: -case 0xf1cd: -case 0xf1ce: -case 0xf1cf: -case 0xf1d0: -case 0xf1d1: -case 0xf1d2: -case 0xf1d3: -case 0xf1d4: -case 0xf1d5: -case 0xf1d6: -case 0xf1d7: -case 0xf1d8: -case 0xf1d9: -case 0xf1da: -case 0xf1db: -case 0xf1dc: -case 0xf1dd: -case 0xf1de: -case 0xf1df: -case 0xf1e0: -case 0xf1e1: -case 0xf1e2: -case 0xf1e3: -case 0xf1e4: -case 0xf1e5: -case 0xf1e6: -case 0xf1e7: -case 0xf1e8: -case 0xf1e9: -case 0xf1ea: -case 0xf1eb: -case 0xf1ec: -case 0xf1ed: -case 0xf1ee: -case 0xf1ef: -case 0xf1f0: -case 0xf1f1: -case 0xf1f2: -case 0xf1f3: -case 0xf1f4: -case 0xf1f5: -case 0xf1f6: -case 0xf1f7: -case 0xf1f8: -case 0xf1f9: -case 0xf1fa: -case 0xf1fb: -case 0xf1fc: -case 0xf1fd: -case 0xf1fe: -case 0xf1ff: -case 0xf200: -case 0xf201: -case 0xf202: -case 0xf203: -case 0xf204: -case 0xf205: -case 0xf206: -case 0xf207: -case 0xf208: -case 0xf209: -case 0xf20a: -case 0xf20b: -case 0xf20c: -case 0xf20d: -case 0xf20e: -case 0xf20f: -case 0xf210: -case 0xf211: -case 0xf212: -case 0xf213: -case 0xf214: -case 0xf215: -case 0xf216: -case 0xf217: -case 0xf218: -case 0xf219: -case 0xf21a: -case 0xf21b: -case 0xf21c: -case 0xf21d: -case 0xf21e: -case 0xf21f: -case 0xf220: -case 0xf221: -case 0xf222: -case 0xf223: -case 0xf224: -case 0xf225: -case 0xf226: -case 0xf227: -case 0xf228: -case 0xf229: -case 0xf22a: -case 0xf22b: -case 0xf22c: -case 0xf22d: -case 0xf22e: -case 0xf22f: -case 0xf230: -case 0xf231: -case 0xf232: -case 0xf233: -case 0xf234: -case 0xf235: -case 0xf236: -case 0xf237: -case 0xf238: -case 0xf239: -case 0xf23a: -case 0xf23b: -case 0xf23c: -case 0xf23d: -case 0xf23e: -case 0xf23f: -case 0xf240: -case 0xf241: -case 0xf242: -case 0xf243: -case 0xf244: -case 0xf245: -case 0xf246: -case 0xf247: -case 0xf248: -case 0xf249: -case 0xf24a: -case 0xf24b: -case 0xf24c: -case 0xf24d: -case 0xf24e: -case 0xf24f: -case 0xf250: -case 0xf251: -case 0xf252: -case 0xf253: -case 0xf254: -case 0xf255: -case 0xf256: -case 0xf257: -case 0xf258: -case 0xf259: -case 0xf25a: -case 0xf25b: -case 0xf25c: -case 0xf25d: -case 0xf25e: -case 0xf25f: -case 0xf260: -case 0xf261: -case 0xf262: -case 0xf263: -case 0xf264: -case 0xf265: -case 0xf266: -case 0xf267: -case 0xf268: -case 0xf269: -case 0xf26a: -case 0xf26b: -case 0xf26c: -case 0xf26d: -case 0xf26e: -case 0xf26f: -case 0xf270: -case 0xf271: -case 0xf272: -case 0xf273: -case 0xf274: -case 0xf275: -case 0xf276: -case 0xf277: -case 0xf278: -case 0xf279: -case 0xf27a: -case 0xf27b: -case 0xf27c: -case 0xf27d: -case 0xf27e: -case 0xf27f: -case 0xf280: -case 0xf281: -case 0xf282: -case 0xf283: -case 0xf284: -case 0xf285: -case 0xf286: -case 0xf287: -case 0xf288: -case 0xf289: -case 0xf28a: -case 0xf28b: -case 0xf28c: -case 0xf28d: -case 0xf28e: -case 0xf28f: -case 0xf290: -case 0xf291: -case 0xf292: -case 0xf293: -case 0xf294: -case 0xf295: -case 0xf296: -case 0xf297: -case 0xf298: -case 0xf299: -case 0xf29a: -case 0xf29b: -case 0xf29c: -case 0xf29d: -case 0xf29e: -case 0xf29f: -case 0xf2a0: -case 0xf2a1: -case 0xf2a2: -case 0xf2a3: -case 0xf2a4: -case 0xf2a5: -case 0xf2a6: -case 0xf2a7: -case 0xf2a8: -case 0xf2a9: -case 0xf2aa: -case 0xf2ab: -case 0xf2ac: -case 0xf2ad: -case 0xf2ae: -case 0xf2af: -case 0xf2b0: -case 0xf2b1: -case 0xf2b2: -case 0xf2b3: -case 0xf2b4: -case 0xf2b5: -case 0xf2b6: -case 0xf2b7: -case 0xf2b8: -case 0xf2b9: -case 0xf2ba: -case 0xf2bb: -case 0xf2bc: -case 0xf2bd: -case 0xf2be: -case 0xf2bf: -case 0xf2c0: -case 0xf2c1: -case 0xf2c2: -case 0xf2c3: -case 0xf2c4: -case 0xf2c5: -case 0xf2c6: -case 0xf2c7: -case 0xf2c8: -case 0xf2c9: -case 0xf2ca: -case 0xf2cb: -case 0xf2cc: -case 0xf2cd: -case 0xf2ce: -case 0xf2cf: -case 0xf2d0: -case 0xf2d1: -case 0xf2d2: -case 0xf2d3: -case 0xf2d4: -case 0xf2d5: -case 0xf2d6: -case 0xf2d7: -case 0xf2d8: -case 0xf2d9: -case 0xf2da: -case 0xf2db: -case 0xf2dc: -case 0xf2dd: -case 0xf2de: -case 0xf2df: -case 0xf2e0: -case 0xf2e1: -case 0xf2e2: -case 0xf2e3: -case 0xf2e4: -case 0xf2e5: -case 0xf2e6: -case 0xf2e7: -case 0xf2e8: -case 0xf2e9: -case 0xf2ea: -case 0xf2eb: -case 0xf2ec: -case 0xf2ed: -case 0xf2ee: -case 0xf2ef: -case 0xf2f0: -case 0xf2f1: -case 0xf2f2: -case 0xf2f3: -case 0xf2f4: -case 0xf2f5: -case 0xf2f6: -case 0xf2f7: -case 0xf2f8: -case 0xf2f9: -case 0xf2fa: -case 0xf2fb: -case 0xf2fc: -case 0xf2fd: -case 0xf2fe: -case 0xf2ff: -case 0xf300: -case 0xf301: -case 0xf302: -case 0xf303: -case 0xf304: -case 0xf305: -case 0xf306: -case 0xf307: -case 0xf308: -case 0xf309: -case 0xf30a: -case 0xf30b: -case 0xf30c: -case 0xf30d: -case 0xf30e: -case 0xf30f: -case 0xf310: -case 0xf311: -case 0xf312: -case 0xf313: -case 0xf314: -case 0xf315: -case 0xf316: -case 0xf317: -case 0xf318: -case 0xf319: -case 0xf31a: -case 0xf31b: -case 0xf31c: -case 0xf31d: -case 0xf31e: -case 0xf31f: -case 0xf320: -case 0xf321: -case 0xf322: -case 0xf323: -case 0xf324: -case 0xf325: -case 0xf326: -case 0xf327: -case 0xf328: -case 0xf329: -case 0xf32a: -case 0xf32b: -case 0xf32c: -case 0xf32d: -case 0xf32e: -case 0xf32f: -case 0xf330: -case 0xf331: -case 0xf332: -case 0xf333: -case 0xf334: -case 0xf335: -case 0xf336: -case 0xf337: -case 0xf338: -case 0xf339: -case 0xf33a: -case 0xf33b: -case 0xf33c: -case 0xf33d: -case 0xf33e: -case 0xf33f: -case 0xf340: -case 0xf341: -case 0xf342: -case 0xf343: -case 0xf344: -case 0xf345: -case 0xf346: -case 0xf347: -case 0xf348: -case 0xf349: -case 0xf34a: -case 0xf34b: -case 0xf34c: -case 0xf34d: -case 0xf34e: -case 0xf34f: -case 0xf350: -case 0xf351: -case 0xf352: -case 0xf353: -case 0xf354: -case 0xf355: -case 0xf356: -case 0xf357: -case 0xf358: -case 0xf359: -case 0xf35a: -case 0xf35b: -case 0xf35c: -case 0xf35d: -case 0xf35e: -case 0xf35f: -case 0xf360: -case 0xf361: -case 0xf362: -case 0xf363: -case 0xf364: -case 0xf365: -case 0xf366: -case 0xf367: -case 0xf368: -case 0xf369: -case 0xf36a: -case 0xf36b: -case 0xf36c: -case 0xf36d: -case 0xf36e: -case 0xf36f: -case 0xf370: -case 0xf371: -case 0xf372: -case 0xf373: -case 0xf374: -case 0xf375: -case 0xf376: -case 0xf377: -case 0xf378: -case 0xf379: -case 0xf37a: -case 0xf37b: -case 0xf37c: -case 0xf37d: -case 0xf37e: -case 0xf37f: -case 0xf380: -case 0xf381: -case 0xf382: -case 0xf383: -case 0xf384: -case 0xf385: -case 0xf386: -case 0xf387: -case 0xf388: -case 0xf389: -case 0xf38a: -case 0xf38b: -case 0xf38c: -case 0xf38d: -case 0xf38e: -case 0xf38f: -case 0xf390: -case 0xf391: -case 0xf392: -case 0xf393: -case 0xf394: -case 0xf395: -case 0xf396: -case 0xf397: -case 0xf398: -case 0xf399: -case 0xf39a: -case 0xf39b: -case 0xf39c: -case 0xf39d: -case 0xf39e: -case 0xf39f: -case 0xf3a0: -case 0xf3a1: -case 0xf3a2: -case 0xf3a3: -case 0xf3a4: -case 0xf3a5: -case 0xf3a6: -case 0xf3a7: -case 0xf3a8: -case 0xf3a9: -case 0xf3aa: -case 0xf3ab: -case 0xf3ac: -case 0xf3ad: -case 0xf3ae: -case 0xf3af: -case 0xf3b0: -case 0xf3b1: -case 0xf3b2: -case 0xf3b3: -case 0xf3b4: -case 0xf3b5: -case 0xf3b6: -case 0xf3b7: -case 0xf3b8: -case 0xf3b9: -case 0xf3ba: -case 0xf3bb: -case 0xf3bc: -case 0xf3bd: -case 0xf3be: -case 0xf3bf: -case 0xf3c0: -case 0xf3c1: -case 0xf3c2: -case 0xf3c3: -case 0xf3c4: -case 0xf3c5: -case 0xf3c6: -case 0xf3c7: -case 0xf3c8: -case 0xf3c9: -case 0xf3ca: -case 0xf3cb: -case 0xf3cc: -case 0xf3cd: -case 0xf3ce: -case 0xf3cf: -case 0xf3d0: -case 0xf3d1: -case 0xf3d2: -case 0xf3d3: -case 0xf3d4: -case 0xf3d5: -case 0xf3d6: -case 0xf3d7: -case 0xf3d8: -case 0xf3d9: -case 0xf3da: -case 0xf3db: -case 0xf3dc: -case 0xf3dd: -case 0xf3de: -case 0xf3df: -case 0xf3e0: -case 0xf3e1: -case 0xf3e2: -case 0xf3e3: -case 0xf3e4: -case 0xf3e5: -case 0xf3e6: -case 0xf3e7: -case 0xf3e8: -case 0xf3e9: -case 0xf3ea: -case 0xf3eb: -case 0xf3ec: -case 0xf3ed: -case 0xf3ee: -case 0xf3ef: -case 0xf3f0: -case 0xf3f1: -case 0xf3f2: -case 0xf3f3: -case 0xf3f4: -case 0xf3f5: -case 0xf3f6: -case 0xf3f7: -case 0xf3f8: -case 0xf3f9: -case 0xf3fa: -case 0xf3fb: -case 0xf3fc: -case 0xf3fd: -case 0xf3fe: -case 0xf3ff: -case 0xf400: -case 0xf401: -case 0xf402: -case 0xf403: -case 0xf404: -case 0xf405: -case 0xf406: -case 0xf407: -case 0xf408: -case 0xf409: -case 0xf40a: -case 0xf40b: -case 0xf40c: -case 0xf40d: -case 0xf40e: -case 0xf40f: -case 0xf410: -case 0xf411: -case 0xf412: -case 0xf413: -case 0xf414: -case 0xf415: -case 0xf416: -case 0xf417: -case 0xf418: -case 0xf419: -case 0xf41a: -case 0xf41b: -case 0xf41c: -case 0xf41d: -case 0xf41e: -case 0xf41f: -case 0xf420: -case 0xf421: -case 0xf422: -case 0xf423: -case 0xf424: -case 0xf425: -case 0xf426: -case 0xf427: -case 0xf428: -case 0xf429: -case 0xf42a: -case 0xf42b: -case 0xf42c: -case 0xf42d: -case 0xf42e: -case 0xf42f: -case 0xf430: -case 0xf431: -case 0xf432: -case 0xf433: -case 0xf434: -case 0xf435: -case 0xf436: -case 0xf437: -case 0xf438: -case 0xf439: -case 0xf43a: -case 0xf43b: -case 0xf43c: -case 0xf43d: -case 0xf43e: -case 0xf43f: -case 0xf440: -case 0xf441: -case 0xf442: -case 0xf443: -case 0xf444: -case 0xf445: -case 0xf446: -case 0xf447: -case 0xf448: -case 0xf449: -case 0xf44a: -case 0xf44b: -case 0xf44c: -case 0xf44d: -case 0xf44e: -case 0xf44f: -case 0xf450: -case 0xf451: -case 0xf452: -case 0xf453: -case 0xf454: -case 0xf455: -case 0xf456: -case 0xf457: -case 0xf458: -case 0xf459: -case 0xf45a: -case 0xf45b: -case 0xf45c: -case 0xf45d: -case 0xf45e: -case 0xf45f: -case 0xf460: -case 0xf461: -case 0xf462: -case 0xf463: -case 0xf464: -case 0xf465: -case 0xf466: -case 0xf467: -case 0xf468: -case 0xf469: -case 0xf46a: -case 0xf46b: -case 0xf46c: -case 0xf46d: -case 0xf46e: -case 0xf46f: -case 0xf470: -case 0xf471: -case 0xf472: -case 0xf473: -case 0xf474: -case 0xf475: -case 0xf476: -case 0xf477: -case 0xf478: -case 0xf479: -case 0xf47a: -case 0xf47b: -case 0xf47c: -case 0xf47d: -case 0xf47e: -case 0xf47f: -case 0xf480: -case 0xf481: -case 0xf482: -case 0xf483: -case 0xf484: -case 0xf485: -case 0xf486: -case 0xf487: -case 0xf488: -case 0xf489: -case 0xf48a: -case 0xf48b: -case 0xf48c: -case 0xf48d: -case 0xf48e: -case 0xf48f: -case 0xf490: -case 0xf491: -case 0xf492: -case 0xf493: -case 0xf494: -case 0xf495: -case 0xf496: -case 0xf497: -case 0xf498: -case 0xf499: -case 0xf49a: -case 0xf49b: -case 0xf49c: -case 0xf49d: -case 0xf49e: -case 0xf49f: -case 0xf4a0: -case 0xf4a1: -case 0xf4a2: -case 0xf4a3: -case 0xf4a4: -case 0xf4a5: -case 0xf4a6: -case 0xf4a7: -case 0xf4a8: -case 0xf4a9: -case 0xf4aa: -case 0xf4ab: -case 0xf4ac: -case 0xf4ad: -case 0xf4ae: -case 0xf4af: -case 0xf4b0: -case 0xf4b1: -case 0xf4b2: -case 0xf4b3: -case 0xf4b4: -case 0xf4b5: -case 0xf4b6: -case 0xf4b7: -case 0xf4b8: -case 0xf4b9: -case 0xf4ba: -case 0xf4bb: -case 0xf4bc: -case 0xf4bd: -case 0xf4be: -case 0xf4bf: -case 0xf4c0: -case 0xf4c1: -case 0xf4c2: -case 0xf4c3: -case 0xf4c4: -case 0xf4c5: -case 0xf4c6: -case 0xf4c7: -case 0xf4c8: -case 0xf4c9: -case 0xf4ca: -case 0xf4cb: -case 0xf4cc: -case 0xf4cd: -case 0xf4ce: -case 0xf4cf: -case 0xf4d0: -case 0xf4d1: -case 0xf4d2: -case 0xf4d3: -case 0xf4d4: -case 0xf4d5: -case 0xf4d6: -case 0xf4d7: -case 0xf4d8: -case 0xf4d9: -case 0xf4da: -case 0xf4db: -case 0xf4dc: -case 0xf4dd: -case 0xf4de: -case 0xf4df: -case 0xf4e0: -case 0xf4e1: -case 0xf4e2: -case 0xf4e3: -case 0xf4e4: -case 0xf4e5: -case 0xf4e6: -case 0xf4e7: -case 0xf4e8: -case 0xf4e9: -case 0xf4ea: -case 0xf4eb: -case 0xf4ec: -case 0xf4ed: -case 0xf4ee: -case 0xf4ef: -case 0xf4f0: -case 0xf4f1: -case 0xf4f2: -case 0xf4f3: -case 0xf4f4: -case 0xf4f5: -case 0xf4f6: -case 0xf4f7: -case 0xf4f8: -case 0xf4f9: -case 0xf4fa: -case 0xf4fb: -case 0xf4fc: -case 0xf4fd: -case 0xf4fe: -case 0xf4ff: -case 0xf500: -case 0xf501: -case 0xf502: -case 0xf503: -case 0xf504: -case 0xf505: -case 0xf506: -case 0xf507: -case 0xf508: -case 0xf509: -case 0xf50a: -case 0xf50b: -case 0xf50c: -case 0xf50d: -case 0xf50e: -case 0xf50f: -case 0xf510: -case 0xf511: -case 0xf512: -case 0xf513: -case 0xf514: -case 0xf515: -case 0xf516: -case 0xf517: -case 0xf518: -case 0xf519: -case 0xf51a: -case 0xf51b: -case 0xf51c: -case 0xf51d: -case 0xf51e: -case 0xf51f: -case 0xf520: -case 0xf521: -case 0xf522: -case 0xf523: -case 0xf524: -case 0xf525: -case 0xf526: -case 0xf527: -case 0xf528: -case 0xf529: -case 0xf52a: -case 0xf52b: -case 0xf52c: -case 0xf52d: -case 0xf52e: -case 0xf52f: -case 0xf530: -case 0xf531: -case 0xf532: -case 0xf533: -case 0xf534: -case 0xf535: -case 0xf536: -case 0xf537: -case 0xf538: -case 0xf539: -case 0xf53a: -case 0xf53b: -case 0xf53c: -case 0xf53d: -case 0xf53e: -case 0xf53f: -case 0xf540: -case 0xf541: -case 0xf542: -case 0xf543: -case 0xf544: -case 0xf545: -case 0xf546: -case 0xf547: -case 0xf548: -case 0xf549: -case 0xf54a: -case 0xf54b: -case 0xf54c: -case 0xf54d: -case 0xf54e: -case 0xf54f: -case 0xf550: -case 0xf551: -case 0xf552: -case 0xf553: -case 0xf554: -case 0xf555: -case 0xf556: -case 0xf557: -case 0xf558: -case 0xf559: -case 0xf55a: -case 0xf55b: -case 0xf55c: -case 0xf55d: -case 0xf55e: -case 0xf55f: -case 0xf560: -case 0xf561: -case 0xf562: -case 0xf563: -case 0xf564: -case 0xf565: -case 0xf566: -case 0xf567: -case 0xf568: -case 0xf569: -case 0xf56a: -case 0xf56b: -case 0xf56c: -case 0xf56d: -case 0xf56e: -case 0xf56f: -case 0xf570: -case 0xf571: -case 0xf572: -case 0xf573: -case 0xf574: -case 0xf575: -case 0xf576: -case 0xf577: -case 0xf578: -case 0xf579: -case 0xf57a: -case 0xf57b: -case 0xf57c: -case 0xf57d: -case 0xf57e: -case 0xf57f: -case 0xf580: -case 0xf581: -case 0xf582: -case 0xf583: -case 0xf584: -case 0xf585: -case 0xf586: -case 0xf587: -case 0xf588: -case 0xf589: -case 0xf58a: -case 0xf58b: -case 0xf58c: -case 0xf58d: -case 0xf58e: -case 0xf58f: -case 0xf590: -case 0xf591: -case 0xf592: -case 0xf593: -case 0xf594: -case 0xf595: -case 0xf596: -case 0xf597: -case 0xf598: -case 0xf599: -case 0xf59a: -case 0xf59b: -case 0xf59c: -case 0xf59d: -case 0xf59e: -case 0xf59f: -case 0xf5a0: -case 0xf5a1: -case 0xf5a2: -case 0xf5a3: -case 0xf5a4: -case 0xf5a5: -case 0xf5a6: -case 0xf5a7: -case 0xf5a8: -case 0xf5a9: -case 0xf5aa: -case 0xf5ab: -case 0xf5ac: -case 0xf5ad: -case 0xf5ae: -case 0xf5af: -case 0xf5b0: -case 0xf5b1: -case 0xf5b2: -case 0xf5b3: -case 0xf5b4: -case 0xf5b5: -case 0xf5b6: -case 0xf5b7: -case 0xf5b8: -case 0xf5b9: -case 0xf5ba: -case 0xf5bb: -case 0xf5bc: -case 0xf5bd: -case 0xf5be: -case 0xf5bf: -case 0xf5c0: -case 0xf5c1: -case 0xf5c2: -case 0xf5c3: -case 0xf5c4: -case 0xf5c5: -case 0xf5c6: -case 0xf5c7: -case 0xf5c8: -case 0xf5c9: -case 0xf5ca: -case 0xf5cb: -case 0xf5cc: -case 0xf5cd: -case 0xf5ce: -case 0xf5cf: -case 0xf5d0: -case 0xf5d1: -case 0xf5d2: -case 0xf5d3: -case 0xf5d4: -case 0xf5d5: -case 0xf5d6: -case 0xf5d7: -case 0xf5d8: -case 0xf5d9: -case 0xf5da: -case 0xf5db: -case 0xf5dc: -case 0xf5dd: -case 0xf5de: -case 0xf5df: -case 0xf5e0: -case 0xf5e1: -case 0xf5e2: -case 0xf5e3: -case 0xf5e4: -case 0xf5e5: -case 0xf5e6: -case 0xf5e7: -case 0xf5e8: -case 0xf5e9: -case 0xf5ea: -case 0xf5eb: -case 0xf5ec: -case 0xf5ed: -case 0xf5ee: -case 0xf5ef: -case 0xf5f0: -case 0xf5f1: -case 0xf5f2: -case 0xf5f3: -case 0xf5f4: -case 0xf5f5: -case 0xf5f6: -case 0xf5f7: -case 0xf5f8: -case 0xf5f9: -case 0xf5fa: -case 0xf5fb: -case 0xf5fc: -case 0xf5fd: -case 0xf5fe: -case 0xf5ff: -case 0xf600: -case 0xf601: -case 0xf602: -case 0xf603: -case 0xf604: -case 0xf605: -case 0xf606: -case 0xf607: -case 0xf608: -case 0xf609: -case 0xf60a: -case 0xf60b: -case 0xf60c: -case 0xf60d: -case 0xf60e: -case 0xf60f: -case 0xf610: -case 0xf611: -case 0xf612: -case 0xf613: -case 0xf614: -case 0xf615: -case 0xf616: -case 0xf617: -case 0xf618: -case 0xf619: -case 0xf61a: -case 0xf61b: -case 0xf61c: -case 0xf61d: -case 0xf61e: -case 0xf61f: -case 0xf620: -case 0xf621: -case 0xf622: -case 0xf623: -case 0xf624: -case 0xf625: -case 0xf626: -case 0xf627: -case 0xf628: -case 0xf629: -case 0xf62a: -case 0xf62b: -case 0xf62c: -case 0xf62d: -case 0xf62e: -case 0xf62f: -case 0xf630: -case 0xf631: -case 0xf632: -case 0xf633: -case 0xf634: -case 0xf635: -case 0xf636: -case 0xf637: -case 0xf638: -case 0xf639: -case 0xf63a: -case 0xf63b: -case 0xf63c: -case 0xf63d: -case 0xf63e: -case 0xf63f: -case 0xf640: -case 0xf641: -case 0xf642: -case 0xf643: -case 0xf644: -case 0xf645: -case 0xf646: -case 0xf647: -case 0xf648: -case 0xf649: -case 0xf64a: -case 0xf64b: -case 0xf64c: -case 0xf64d: -case 0xf64e: -case 0xf64f: -case 0xf650: -case 0xf651: -case 0xf652: -case 0xf653: -case 0xf654: -case 0xf655: -case 0xf656: -case 0xf657: -case 0xf658: -case 0xf659: -case 0xf65a: -case 0xf65b: -case 0xf65c: -case 0xf65d: -case 0xf65e: -case 0xf65f: -case 0xf660: -case 0xf661: -case 0xf662: -case 0xf663: -case 0xf664: -case 0xf665: -case 0xf666: -case 0xf667: -case 0xf668: -case 0xf669: -case 0xf66a: -case 0xf66b: -case 0xf66c: -case 0xf66d: -case 0xf66e: -case 0xf66f: -case 0xf670: -case 0xf671: -case 0xf672: -case 0xf673: -case 0xf674: -case 0xf675: -case 0xf676: -case 0xf677: -case 0xf678: -case 0xf679: -case 0xf67a: -case 0xf67b: -case 0xf67c: -case 0xf67d: -case 0xf67e: -case 0xf67f: -case 0xf680: -case 0xf681: -case 0xf682: -case 0xf683: -case 0xf684: -case 0xf685: -case 0xf686: -case 0xf687: -case 0xf688: -case 0xf689: -case 0xf68a: -case 0xf68b: -case 0xf68c: -case 0xf68d: -case 0xf68e: -case 0xf68f: -case 0xf690: -case 0xf691: -case 0xf692: -case 0xf693: -case 0xf694: -case 0xf695: -case 0xf696: -case 0xf697: -case 0xf698: -case 0xf699: -case 0xf69a: -case 0xf69b: -case 0xf69c: -case 0xf69d: -case 0xf69e: -case 0xf69f: -case 0xf6a0: -case 0xf6a1: -case 0xf6a2: -case 0xf6a3: -case 0xf6a4: -case 0xf6a5: -case 0xf6a6: -case 0xf6a7: -case 0xf6a8: -case 0xf6a9: -case 0xf6aa: -case 0xf6ab: -case 0xf6ac: -case 0xf6ad: -case 0xf6ae: -case 0xf6af: -case 0xf6b0: -case 0xf6b1: -case 0xf6b2: -case 0xf6b3: -case 0xf6b4: -case 0xf6b5: -case 0xf6b6: -case 0xf6b7: -case 0xf6b8: -case 0xf6b9: -case 0xf6ba: -case 0xf6bb: -case 0xf6bc: -case 0xf6bd: -case 0xf6be: -case 0xf6bf: -case 0xf6c0: -case 0xf6c1: -case 0xf6c2: -case 0xf6c3: -case 0xf6c4: -case 0xf6c5: -case 0xf6c6: -case 0xf6c7: -case 0xf6c8: -case 0xf6c9: -case 0xf6ca: -case 0xf6cb: -case 0xf6cc: -case 0xf6cd: -case 0xf6ce: -case 0xf6cf: -case 0xf6d0: -case 0xf6d1: -case 0xf6d2: -case 0xf6d3: -case 0xf6d4: -case 0xf6d5: -case 0xf6d6: -case 0xf6d7: -case 0xf6d8: -case 0xf6d9: -case 0xf6da: -case 0xf6db: -case 0xf6dc: -case 0xf6dd: -case 0xf6de: -case 0xf6df: -case 0xf6e0: -case 0xf6e1: -case 0xf6e2: -case 0xf6e3: -case 0xf6e4: -case 0xf6e5: -case 0xf6e6: -case 0xf6e7: -case 0xf6e8: -case 0xf6e9: -case 0xf6ea: -case 0xf6eb: -case 0xf6ec: -case 0xf6ed: -case 0xf6ee: -case 0xf6ef: -case 0xf6f0: -case 0xf6f1: -case 0xf6f2: -case 0xf6f3: -case 0xf6f4: -case 0xf6f5: -case 0xf6f6: -case 0xf6f7: -case 0xf6f8: -case 0xf6f9: -case 0xf6fa: -case 0xf6fb: -case 0xf6fc: -case 0xf6fd: -case 0xf6fe: -case 0xf6ff: -case 0xf700: -case 0xf701: -case 0xf702: -case 0xf703: -case 0xf704: -case 0xf705: -case 0xf706: -case 0xf707: -case 0xf708: -case 0xf709: -case 0xf70a: -case 0xf70b: -case 0xf70c: -case 0xf70d: -case 0xf70e: -case 0xf70f: -case 0xf710: -case 0xf711: -case 0xf712: -case 0xf713: -case 0xf714: -case 0xf715: -case 0xf716: -case 0xf717: -case 0xf718: -case 0xf719: -case 0xf71a: -case 0xf71b: -case 0xf71c: -case 0xf71d: -case 0xf71e: -case 0xf71f: -case 0xf720: -case 0xf721: -case 0xf722: -case 0xf723: -case 0xf724: -case 0xf725: -case 0xf726: -case 0xf727: -case 0xf728: -case 0xf729: -case 0xf72a: -case 0xf72b: -case 0xf72c: -case 0xf72d: -case 0xf72e: -case 0xf72f: -case 0xf730: -case 0xf731: -case 0xf732: -case 0xf733: -case 0xf734: -case 0xf735: -case 0xf736: -case 0xf737: -case 0xf738: -case 0xf739: -case 0xf73a: -case 0xf73b: -case 0xf73c: -case 0xf73d: -case 0xf73e: -case 0xf73f: -case 0xf740: -case 0xf741: -case 0xf742: -case 0xf743: -case 0xf744: -case 0xf745: -case 0xf746: -case 0xf747: -case 0xf748: -case 0xf749: -case 0xf74a: -case 0xf74b: -case 0xf74c: -case 0xf74d: -case 0xf74e: -case 0xf74f: -case 0xf750: -case 0xf751: -case 0xf752: -case 0xf753: -case 0xf754: -case 0xf755: -case 0xf756: -case 0xf757: -case 0xf758: -case 0xf759: -case 0xf75a: -case 0xf75b: -case 0xf75c: -case 0xf75d: -case 0xf75e: -case 0xf75f: -case 0xf760: -case 0xf761: -case 0xf762: -case 0xf763: -case 0xf764: -case 0xf765: -case 0xf766: -case 0xf767: -case 0xf768: -case 0xf769: -case 0xf76a: -case 0xf76b: -case 0xf76c: -case 0xf76d: -case 0xf76e: -case 0xf76f: -case 0xf770: -case 0xf771: -case 0xf772: -case 0xf773: -case 0xf774: -case 0xf775: -case 0xf776: -case 0xf777: -case 0xf778: -case 0xf779: -case 0xf77a: -case 0xf77b: -case 0xf77c: -case 0xf77d: -case 0xf77e: -case 0xf77f: -case 0xf780: -case 0xf781: -case 0xf782: -case 0xf783: -case 0xf784: -case 0xf785: -case 0xf786: -case 0xf787: -case 0xf788: -case 0xf789: -case 0xf78a: -case 0xf78b: -case 0xf78c: -case 0xf78d: -case 0xf78e: -case 0xf78f: -case 0xf790: -case 0xf791: -case 0xf792: -case 0xf793: -case 0xf794: -case 0xf795: -case 0xf796: -case 0xf797: -case 0xf798: -case 0xf799: -case 0xf79a: -case 0xf79b: -case 0xf79c: -case 0xf79d: -case 0xf79e: -case 0xf79f: -case 0xf7a0: -case 0xf7a1: -case 0xf7a2: -case 0xf7a3: -case 0xf7a4: -case 0xf7a5: -case 0xf7a6: -case 0xf7a7: -case 0xf7a8: -case 0xf7a9: -case 0xf7aa: -case 0xf7ab: -case 0xf7ac: -case 0xf7ad: -case 0xf7ae: -case 0xf7af: -case 0xf7b0: -case 0xf7b1: -case 0xf7b2: -case 0xf7b3: -case 0xf7b4: -case 0xf7b5: -case 0xf7b6: -case 0xf7b7: -case 0xf7b8: -case 0xf7b9: -case 0xf7ba: -case 0xf7bb: -case 0xf7bc: -case 0xf7bd: -case 0xf7be: -case 0xf7bf: -case 0xf7c0: -case 0xf7c1: -case 0xf7c2: -case 0xf7c3: -case 0xf7c4: -case 0xf7c5: -case 0xf7c6: -case 0xf7c7: -case 0xf7c8: -case 0xf7c9: -case 0xf7ca: -case 0xf7cb: -case 0xf7cc: -case 0xf7cd: -case 0xf7ce: -case 0xf7cf: -case 0xf7d0: -case 0xf7d1: -case 0xf7d2: -case 0xf7d3: -case 0xf7d4: -case 0xf7d5: -case 0xf7d6: -case 0xf7d7: -case 0xf7d8: -case 0xf7d9: -case 0xf7da: -case 0xf7db: -case 0xf7dc: -case 0xf7dd: -case 0xf7de: -case 0xf7df: -case 0xf7e0: -case 0xf7e1: -case 0xf7e2: -case 0xf7e3: -case 0xf7e4: -case 0xf7e5: -case 0xf7e6: -case 0xf7e7: -case 0xf7e8: -case 0xf7e9: -case 0xf7ea: -case 0xf7eb: -case 0xf7ec: -case 0xf7ed: -case 0xf7ee: -case 0xf7ef: -case 0xf7f0: -case 0xf7f1: -case 0xf7f2: -case 0xf7f3: -case 0xf7f4: -case 0xf7f5: -case 0xf7f6: -case 0xf7f7: -case 0xf7f8: -case 0xf7f9: -case 0xf7fa: -case 0xf7fb: -case 0xf7fc: -case 0xf7fd: -case 0xf7fe: -case 0xf7ff: -case 0xf800: -case 0xf801: -case 0xf802: -case 0xf803: -case 0xf804: -case 0xf805: -case 0xf806: -case 0xf807: -case 0xf808: -case 0xf809: -case 0xf80a: -case 0xf80b: -case 0xf80c: -case 0xf80d: -case 0xf80e: -case 0xf80f: -case 0xf810: -case 0xf811: -case 0xf812: -case 0xf813: -case 0xf814: -case 0xf815: -case 0xf816: -case 0xf817: -case 0xf818: -case 0xf819: -case 0xf81a: -case 0xf81b: -case 0xf81c: -case 0xf81d: -case 0xf81e: -case 0xf81f: -case 0xf820: -case 0xf821: -case 0xf822: -case 0xf823: -case 0xf824: -case 0xf825: -case 0xf826: -case 0xf827: -case 0xf828: -case 0xf829: -case 0xf82a: -case 0xf82b: -case 0xf82c: -case 0xf82d: -case 0xf82e: -case 0xf82f: -case 0xf830: -case 0xf831: -case 0xf832: -case 0xf833: -case 0xf834: -case 0xf835: -case 0xf836: -case 0xf837: -case 0xf838: -case 0xf839: -case 0xf83a: -case 0xf83b: -case 0xf83c: -case 0xf83d: -case 0xf83e: -case 0xf83f: -case 0xf840: -case 0xf841: -case 0xf842: -case 0xf843: -case 0xf844: -case 0xf845: -case 0xf846: -case 0xf847: -case 0xf848: -case 0xf849: -case 0xf84a: -case 0xf84b: -case 0xf84c: -case 0xf84d: -case 0xf84e: -case 0xf84f: -case 0xf850: -case 0xf851: -case 0xf852: -case 0xf853: -case 0xf854: -case 0xf855: -case 0xf856: -case 0xf857: -case 0xf858: -case 0xf859: -case 0xf85a: -case 0xf85b: -case 0xf85c: -case 0xf85d: -case 0xf85e: -case 0xf85f: -case 0xf860: -case 0xf861: -case 0xf862: -case 0xf863: -case 0xf864: -case 0xf865: -case 0xf866: -case 0xf867: -case 0xf868: -case 0xf869: -case 0xf86a: -case 0xf86b: -case 0xf86c: -case 0xf86d: -case 0xf86e: -case 0xf86f: -case 0xf870: -case 0xf871: -case 0xf872: -case 0xf873: -case 0xf874: -case 0xf875: -case 0xf876: -case 0xf877: -case 0xf878: -case 0xf879: -case 0xf87a: -case 0xf87b: -case 0xf87c: -case 0xf87d: -case 0xf87e: -case 0xf87f: -case 0xf880: -case 0xf881: -case 0xf882: -case 0xf883: -case 0xf884: -case 0xf885: -case 0xf886: -case 0xf887: -case 0xf888: -case 0xf889: -case 0xf88a: -case 0xf88b: -case 0xf88c: -case 0xf88d: -case 0xf88e: -case 0xf88f: -case 0xf890: -case 0xf891: -case 0xf892: -case 0xf893: -case 0xf894: -case 0xf895: -case 0xf896: -case 0xf897: -case 0xf898: -case 0xf899: -case 0xf89a: -case 0xf89b: -case 0xf89c: -case 0xf89d: -case 0xf89e: -case 0xf89f: -case 0xf8a0: -case 0xf8a1: -case 0xf8a2: -case 0xf8a3: -case 0xf8a4: -case 0xf8a5: -case 0xf8a6: -case 0xf8a7: -case 0xf8a8: -case 0xf8a9: -case 0xf8aa: -case 0xf8ab: -case 0xf8ac: -case 0xf8ad: -case 0xf8ae: -case 0xf8af: -case 0xf8b0: -case 0xf8b1: -case 0xf8b2: -case 0xf8b3: -case 0xf8b4: -case 0xf8b5: -case 0xf8b6: -case 0xf8b7: -case 0xf8b8: -case 0xf8b9: -case 0xf8ba: -case 0xf8bb: -case 0xf8bc: -case 0xf8bd: -case 0xf8be: -case 0xf8bf: -case 0xf8c0: -case 0xf8c1: -case 0xf8c2: -case 0xf8c3: -case 0xf8c4: -case 0xf8c5: -case 0xf8c6: -case 0xf8c7: -case 0xf8c8: -case 0xf8c9: -case 0xf8ca: -case 0xf8cb: -case 0xf8cc: -case 0xf8cd: -case 0xf8ce: -case 0xf8cf: -case 0xf8d0: -case 0xf8d1: -case 0xf8d2: -case 0xf8d3: -case 0xf8d4: -case 0xf8d5: -case 0xf8d6: -case 0xf8d7: -case 0xf8d8: -case 0xf8d9: -case 0xf8da: -case 0xf8db: -case 0xf8dc: -case 0xf8dd: -case 0xf8de: -case 0xf8df: -case 0xf8e0: -case 0xf8e1: -case 0xf8e2: -case 0xf8e3: -case 0xf8e4: -case 0xf8e5: -case 0xf8e6: -case 0xf8e7: -case 0xf8e8: -case 0xf8e9: -case 0xf8ea: -case 0xf8eb: -case 0xf8ec: -case 0xf8ed: -case 0xf8ee: -case 0xf8ef: -case 0xf8f0: -case 0xf8f1: -case 0xf8f2: -case 0xf8f3: -case 0xf8f4: -case 0xf8f5: -case 0xf8f6: -case 0xf8f7: -case 0xf8f8: -case 0xf8f9: -case 0xf8fa: -case 0xf8fb: -case 0xf8fc: -case 0xf8fd: -case 0xf8fe: -case 0xf8ff: -case 0xf900: -case 0xf901: -case 0xf902: -case 0xf903: -case 0xf904: -case 0xf905: -case 0xf906: -case 0xf907: -case 0xf908: -case 0xf909: -case 0xf90a: -case 0xf90b: -case 0xf90c: -case 0xf90d: -case 0xf90e: -case 0xf90f: -case 0xf910: -case 0xf911: -case 0xf912: -case 0xf913: -case 0xf914: -case 0xf915: -case 0xf916: -case 0xf917: -case 0xf918: -case 0xf919: -case 0xf91a: -case 0xf91b: -case 0xf91c: -case 0xf91d: -case 0xf91e: -case 0xf91f: -case 0xf920: -case 0xf921: -case 0xf922: -case 0xf923: -case 0xf924: -case 0xf925: -case 0xf926: -case 0xf927: -case 0xf928: -case 0xf929: -case 0xf92a: -case 0xf92b: -case 0xf92c: -case 0xf92d: -case 0xf92e: -case 0xf92f: -case 0xf930: -case 0xf931: -case 0xf932: -case 0xf933: -case 0xf934: -case 0xf935: -case 0xf936: -case 0xf937: -case 0xf938: -case 0xf939: -case 0xf93a: -case 0xf93b: -case 0xf93c: -case 0xf93d: -case 0xf93e: -case 0xf93f: -case 0xf940: -case 0xf941: -case 0xf942: -case 0xf943: -case 0xf944: -case 0xf945: -case 0xf946: -case 0xf947: -case 0xf948: -case 0xf949: -case 0xf94a: -case 0xf94b: -case 0xf94c: -case 0xf94d: -case 0xf94e: -case 0xf94f: -case 0xf950: -case 0xf951: -case 0xf952: -case 0xf953: -case 0xf954: -case 0xf955: -case 0xf956: -case 0xf957: -case 0xf958: -case 0xf959: -case 0xf95a: -case 0xf95b: -case 0xf95c: -case 0xf95d: -case 0xf95e: -case 0xf95f: -case 0xf960: -case 0xf961: -case 0xf962: -case 0xf963: -case 0xf964: -case 0xf965: -case 0xf966: -case 0xf967: -case 0xf968: -case 0xf969: -case 0xf96a: -case 0xf96b: -case 0xf96c: -case 0xf96d: -case 0xf96e: -case 0xf96f: -case 0xf970: -case 0xf971: -case 0xf972: -case 0xf973: -case 0xf974: -case 0xf975: -case 0xf976: -case 0xf977: -case 0xf978: -case 0xf979: -case 0xf97a: -case 0xf97b: -case 0xf97c: -case 0xf97d: -case 0xf97e: -case 0xf97f: -case 0xf980: -case 0xf981: -case 0xf982: -case 0xf983: -case 0xf984: -case 0xf985: -case 0xf986: -case 0xf987: -case 0xf988: -case 0xf989: -case 0xf98a: -case 0xf98b: -case 0xf98c: -case 0xf98d: -case 0xf98e: -case 0xf98f: -case 0xf990: -case 0xf991: -case 0xf992: -case 0xf993: -case 0xf994: -case 0xf995: -case 0xf996: -case 0xf997: -case 0xf998: -case 0xf999: -case 0xf99a: -case 0xf99b: -case 0xf99c: -case 0xf99d: -case 0xf99e: -case 0xf99f: -case 0xf9a0: -case 0xf9a1: -case 0xf9a2: -case 0xf9a3: -case 0xf9a4: -case 0xf9a5: -case 0xf9a6: -case 0xf9a7: -case 0xf9a8: -case 0xf9a9: -case 0xf9aa: -case 0xf9ab: -case 0xf9ac: -case 0xf9ad: -case 0xf9ae: -case 0xf9af: -case 0xf9b0: -case 0xf9b1: -case 0xf9b2: -case 0xf9b3: -case 0xf9b4: -case 0xf9b5: -case 0xf9b6: -case 0xf9b7: -case 0xf9b8: -case 0xf9b9: -case 0xf9ba: -case 0xf9bb: -case 0xf9bc: -case 0xf9bd: -case 0xf9be: -case 0xf9bf: -case 0xf9c0: -case 0xf9c1: -case 0xf9c2: -case 0xf9c3: -case 0xf9c4: -case 0xf9c5: -case 0xf9c6: -case 0xf9c7: -case 0xf9c8: -case 0xf9c9: -case 0xf9ca: -case 0xf9cb: -case 0xf9cc: -case 0xf9cd: -case 0xf9ce: -case 0xf9cf: -case 0xf9d0: -case 0xf9d1: -case 0xf9d2: -case 0xf9d3: -case 0xf9d4: -case 0xf9d5: -case 0xf9d6: -case 0xf9d7: -case 0xf9d8: -case 0xf9d9: -case 0xf9da: -case 0xf9db: -case 0xf9dc: -case 0xf9dd: -case 0xf9de: -case 0xf9df: -case 0xf9e0: -case 0xf9e1: -case 0xf9e2: -case 0xf9e3: -case 0xf9e4: -case 0xf9e5: -case 0xf9e6: -case 0xf9e7: -case 0xf9e8: -case 0xf9e9: -case 0xf9ea: -case 0xf9eb: -case 0xf9ec: -case 0xf9ed: -case 0xf9ee: -case 0xf9ef: -case 0xf9f0: -case 0xf9f1: -case 0xf9f2: -case 0xf9f3: -case 0xf9f4: -case 0xf9f5: -case 0xf9f6: -case 0xf9f7: -case 0xf9f8: -case 0xf9f9: -case 0xf9fa: -case 0xf9fb: -case 0xf9fc: -case 0xf9fd: -case 0xf9fe: -case 0xf9ff: -case 0xfa00: -case 0xfa01: -case 0xfa02: -case 0xfa03: -case 0xfa04: -case 0xfa05: -case 0xfa06: -case 0xfa07: -case 0xfa08: -case 0xfa09: -case 0xfa0a: -case 0xfa0b: -case 0xfa0c: -case 0xfa0d: -case 0xfa0e: -case 0xfa0f: -case 0xfa10: -case 0xfa11: -case 0xfa12: -case 0xfa13: -case 0xfa14: -case 0xfa15: -case 0xfa16: -case 0xfa17: -case 0xfa18: -case 0xfa19: -case 0xfa1a: -case 0xfa1b: -case 0xfa1c: -case 0xfa1d: -case 0xfa1e: -case 0xfa1f: -case 0xfa20: -case 0xfa21: -case 0xfa22: -case 0xfa23: -case 0xfa24: -case 0xfa25: -case 0xfa26: -case 0xfa27: -case 0xfa28: -case 0xfa29: -case 0xfa2a: -case 0xfa2b: -case 0xfa2c: -case 0xfa2d: -case 0xfa2e: -case 0xfa2f: -case 0xfa30: -case 0xfa31: -case 0xfa32: -case 0xfa33: -case 0xfa34: -case 0xfa35: -case 0xfa36: -case 0xfa37: -case 0xfa38: -case 0xfa39: -case 0xfa3a: -case 0xfa3b: -case 0xfa3c: -case 0xfa3d: -case 0xfa3e: -case 0xfa3f: -case 0xfa40: -case 0xfa41: -case 0xfa42: -case 0xfa43: -case 0xfa44: -case 0xfa45: -case 0xfa46: -case 0xfa47: -case 0xfa48: -case 0xfa49: -case 0xfa4a: -case 0xfa4b: -case 0xfa4c: -case 0xfa4d: -case 0xfa4e: -case 0xfa4f: -case 0xfa50: -case 0xfa51: -case 0xfa52: -case 0xfa53: -case 0xfa54: -case 0xfa55: -case 0xfa56: -case 0xfa57: -case 0xfa58: -case 0xfa59: -case 0xfa5a: -case 0xfa5b: -case 0xfa5c: -case 0xfa5d: -case 0xfa5e: -case 0xfa5f: -case 0xfa60: -case 0xfa61: -case 0xfa62: -case 0xfa63: -case 0xfa64: -case 0xfa65: -case 0xfa66: -case 0xfa67: -case 0xfa68: -case 0xfa69: -case 0xfa6a: -case 0xfa6b: -case 0xfa6c: -case 0xfa6d: -case 0xfa6e: -case 0xfa6f: -case 0xfa70: -case 0xfa71: -case 0xfa72: -case 0xfa73: -case 0xfa74: -case 0xfa75: -case 0xfa76: -case 0xfa77: -case 0xfa78: -case 0xfa79: -case 0xfa7a: -case 0xfa7b: -case 0xfa7c: -case 0xfa7d: -case 0xfa7e: -case 0xfa7f: -case 0xfa80: -case 0xfa81: -case 0xfa82: -case 0xfa83: -case 0xfa84: -case 0xfa85: -case 0xfa86: -case 0xfa87: -case 0xfa88: -case 0xfa89: -case 0xfa8a: -case 0xfa8b: -case 0xfa8c: -case 0xfa8d: -case 0xfa8e: -case 0xfa8f: -case 0xfa90: -case 0xfa91: -case 0xfa92: -case 0xfa93: -case 0xfa94: -case 0xfa95: -case 0xfa96: -case 0xfa97: -case 0xfa98: -case 0xfa99: -case 0xfa9a: -case 0xfa9b: -case 0xfa9c: -case 0xfa9d: -case 0xfa9e: -case 0xfa9f: -case 0xfaa0: -case 0xfaa1: -case 0xfaa2: -case 0xfaa3: -case 0xfaa4: -case 0xfaa5: -case 0xfaa6: -case 0xfaa7: -case 0xfaa8: -case 0xfaa9: -case 0xfaaa: -case 0xfaab: -case 0xfaac: -case 0xfaad: -case 0xfaae: -case 0xfaaf: -case 0xfab0: -case 0xfab1: -case 0xfab2: -case 0xfab3: -case 0xfab4: -case 0xfab5: -case 0xfab6: -case 0xfab7: -case 0xfab8: -case 0xfab9: -case 0xfaba: -case 0xfabb: -case 0xfabc: -case 0xfabd: -case 0xfabe: -case 0xfabf: -case 0xfac0: -case 0xfac1: -case 0xfac2: -case 0xfac3: -case 0xfac4: -case 0xfac5: -case 0xfac6: -case 0xfac7: -case 0xfac8: -case 0xfac9: -case 0xfaca: -case 0xfacb: -case 0xfacc: -case 0xfacd: -case 0xface: -case 0xfacf: -case 0xfad0: -case 0xfad1: -case 0xfad2: -case 0xfad3: -case 0xfad4: -case 0xfad5: -case 0xfad6: -case 0xfad7: -case 0xfad8: -case 0xfad9: -case 0xfada: -case 0xfadb: -case 0xfadc: -case 0xfadd: -case 0xfade: -case 0xfadf: -case 0xfae0: -case 0xfae1: -case 0xfae2: -case 0xfae3: -case 0xfae4: -case 0xfae5: -case 0xfae6: -case 0xfae7: -case 0xfae8: -case 0xfae9: -case 0xfaea: -case 0xfaeb: -case 0xfaec: -case 0xfaed: -case 0xfaee: -case 0xfaef: -case 0xfaf0: -case 0xfaf1: -case 0xfaf2: -case 0xfaf3: -case 0xfaf4: -case 0xfaf5: -case 0xfaf6: -case 0xfaf7: -case 0xfaf8: -case 0xfaf9: -case 0xfafa: -case 0xfafb: -case 0xfafc: -case 0xfafd: -case 0xfafe: -case 0xfaff: -case 0xfb00: -case 0xfb01: -case 0xfb02: -case 0xfb03: -case 0xfb04: -case 0xfb05: -case 0xfb06: -case 0xfb07: -case 0xfb08: -case 0xfb09: -case 0xfb0a: -case 0xfb0b: -case 0xfb0c: -case 0xfb0d: -case 0xfb0e: -case 0xfb0f: -case 0xfb10: -case 0xfb11: -case 0xfb12: -case 0xfb13: -case 0xfb14: -case 0xfb15: -case 0xfb16: -case 0xfb17: -case 0xfb18: -case 0xfb19: -case 0xfb1a: -case 0xfb1b: -case 0xfb1c: -case 0xfb1d: -case 0xfb1e: -case 0xfb1f: -case 0xfb20: -case 0xfb21: -case 0xfb22: -case 0xfb23: -case 0xfb24: -case 0xfb25: -case 0xfb26: -case 0xfb27: -case 0xfb28: -case 0xfb29: -case 0xfb2a: -case 0xfb2b: -case 0xfb2c: -case 0xfb2d: -case 0xfb2e: -case 0xfb2f: -case 0xfb30: -case 0xfb31: -case 0xfb32: -case 0xfb33: -case 0xfb34: -case 0xfb35: -case 0xfb36: -case 0xfb37: -case 0xfb38: -case 0xfb39: -case 0xfb3a: -case 0xfb3b: -case 0xfb3c: -case 0xfb3d: -case 0xfb3e: -case 0xfb3f: -case 0xfb40: -case 0xfb41: -case 0xfb42: -case 0xfb43: -case 0xfb44: -case 0xfb45: -case 0xfb46: -case 0xfb47: -case 0xfb48: -case 0xfb49: -case 0xfb4a: -case 0xfb4b: -case 0xfb4c: -case 0xfb4d: -case 0xfb4e: -case 0xfb4f: -case 0xfb50: -case 0xfb51: -case 0xfb52: -case 0xfb53: -case 0xfb54: -case 0xfb55: -case 0xfb56: -case 0xfb57: -case 0xfb58: -case 0xfb59: -case 0xfb5a: -case 0xfb5b: -case 0xfb5c: -case 0xfb5d: -case 0xfb5e: -case 0xfb5f: -case 0xfb60: -case 0xfb61: -case 0xfb62: -case 0xfb63: -case 0xfb64: -case 0xfb65: -case 0xfb66: -case 0xfb67: -case 0xfb68: -case 0xfb69: -case 0xfb6a: -case 0xfb6b: -case 0xfb6c: -case 0xfb6d: -case 0xfb6e: -case 0xfb6f: -case 0xfb70: -case 0xfb71: -case 0xfb72: -case 0xfb73: -case 0xfb74: -case 0xfb75: -case 0xfb76: -case 0xfb77: -case 0xfb78: -case 0xfb79: -case 0xfb7a: -case 0xfb7b: -case 0xfb7c: -case 0xfb7d: -case 0xfb7e: -case 0xfb7f: -case 0xfb80: -case 0xfb81: -case 0xfb82: -case 0xfb83: -case 0xfb84: -case 0xfb85: -case 0xfb86: -case 0xfb87: -case 0xfb88: -case 0xfb89: -case 0xfb8a: -case 0xfb8b: -case 0xfb8c: -case 0xfb8d: -case 0xfb8e: -case 0xfb8f: -case 0xfb90: -case 0xfb91: -case 0xfb92: -case 0xfb93: -case 0xfb94: -case 0xfb95: -case 0xfb96: -case 0xfb97: -case 0xfb98: -case 0xfb99: -case 0xfb9a: -case 0xfb9b: -case 0xfb9c: -case 0xfb9d: -case 0xfb9e: -case 0xfb9f: -case 0xfba0: -case 0xfba1: -case 0xfba2: -case 0xfba3: -case 0xfba4: -case 0xfba5: -case 0xfba6: -case 0xfba7: -case 0xfba8: -case 0xfba9: -case 0xfbaa: -case 0xfbab: -case 0xfbac: -case 0xfbad: -case 0xfbae: -case 0xfbaf: -case 0xfbb0: -case 0xfbb1: -case 0xfbb2: -case 0xfbb3: -case 0xfbb4: -case 0xfbb5: -case 0xfbb6: -case 0xfbb7: -case 0xfbb8: -case 0xfbb9: -case 0xfbba: -case 0xfbbb: -case 0xfbbc: -case 0xfbbd: -case 0xfbbe: -case 0xfbbf: -case 0xfbc0: -case 0xfbc1: -case 0xfbc2: -case 0xfbc3: -case 0xfbc4: -case 0xfbc5: -case 0xfbc6: -case 0xfbc7: -case 0xfbc8: -case 0xfbc9: -case 0xfbca: -case 0xfbcb: -case 0xfbcc: -case 0xfbcd: -case 0xfbce: -case 0xfbcf: -case 0xfbd0: -case 0xfbd1: -case 0xfbd2: -case 0xfbd3: -case 0xfbd4: -case 0xfbd5: -case 0xfbd6: -case 0xfbd7: -case 0xfbd8: -case 0xfbd9: -case 0xfbda: -case 0xfbdb: -case 0xfbdc: -case 0xfbdd: -case 0xfbde: -case 0xfbdf: -case 0xfbe0: -case 0xfbe1: -case 0xfbe2: -case 0xfbe3: -case 0xfbe4: -case 0xfbe5: -case 0xfbe6: -case 0xfbe7: -case 0xfbe8: -case 0xfbe9: -case 0xfbea: -case 0xfbeb: -case 0xfbec: -case 0xfbed: -case 0xfbee: -case 0xfbef: -case 0xfbf0: -case 0xfbf1: -case 0xfbf2: -case 0xfbf3: -case 0xfbf4: -case 0xfbf5: -case 0xfbf6: -case 0xfbf7: -case 0xfbf8: -case 0xfbf9: -case 0xfbfa: -case 0xfbfb: -case 0xfbfc: -case 0xfbfd: -case 0xfbfe: -case 0xfbff: -case 0xfc00: -case 0xfc01: -case 0xfc02: -case 0xfc03: -case 0xfc04: -case 0xfc05: -case 0xfc06: -case 0xfc07: -case 0xfc08: -case 0xfc09: -case 0xfc0a: -case 0xfc0b: -case 0xfc0c: -case 0xfc0d: -case 0xfc0e: -case 0xfc0f: -case 0xfc10: -case 0xfc11: -case 0xfc12: -case 0xfc13: -case 0xfc14: -case 0xfc15: -case 0xfc16: -case 0xfc17: -case 0xfc18: -case 0xfc19: -case 0xfc1a: -case 0xfc1b: -case 0xfc1c: -case 0xfc1d: -case 0xfc1e: -case 0xfc1f: -case 0xfc20: -case 0xfc21: -case 0xfc22: -case 0xfc23: -case 0xfc24: -case 0xfc25: -case 0xfc26: -case 0xfc27: -case 0xfc28: -case 0xfc29: -case 0xfc2a: -case 0xfc2b: -case 0xfc2c: -case 0xfc2d: -case 0xfc2e: -case 0xfc2f: -case 0xfc30: -case 0xfc31: -case 0xfc32: -case 0xfc33: -case 0xfc34: -case 0xfc35: -case 0xfc36: -case 0xfc37: -case 0xfc38: -case 0xfc39: -case 0xfc3a: -case 0xfc3b: -case 0xfc3c: -case 0xfc3d: -case 0xfc3e: -case 0xfc3f: -case 0xfc40: -case 0xfc41: -case 0xfc42: -case 0xfc43: -case 0xfc44: -case 0xfc45: -case 0xfc46: -case 0xfc47: -case 0xfc48: -case 0xfc49: -case 0xfc4a: -case 0xfc4b: -case 0xfc4c: -case 0xfc4d: -case 0xfc4e: -case 0xfc4f: -case 0xfc50: -case 0xfc51: -case 0xfc52: -case 0xfc53: -case 0xfc54: -case 0xfc55: -case 0xfc56: -case 0xfc57: -case 0xfc58: -case 0xfc59: -case 0xfc5a: -case 0xfc5b: -case 0xfc5c: -case 0xfc5d: -case 0xfc5e: -case 0xfc5f: -case 0xfc60: -case 0xfc61: -case 0xfc62: -case 0xfc63: -case 0xfc64: -case 0xfc65: -case 0xfc66: -case 0xfc67: -case 0xfc68: -case 0xfc69: -case 0xfc6a: -case 0xfc6b: -case 0xfc6c: -case 0xfc6d: -case 0xfc6e: -case 0xfc6f: -case 0xfc70: -case 0xfc71: -case 0xfc72: -case 0xfc73: -case 0xfc74: -case 0xfc75: -case 0xfc76: -case 0xfc77: -case 0xfc78: -case 0xfc79: -case 0xfc7a: -case 0xfc7b: -case 0xfc7c: -case 0xfc7d: -case 0xfc7e: -case 0xfc7f: -case 0xfc80: -case 0xfc81: -case 0xfc82: -case 0xfc83: -case 0xfc84: -case 0xfc85: -case 0xfc86: -case 0xfc87: -case 0xfc88: -case 0xfc89: -case 0xfc8a: -case 0xfc8b: -case 0xfc8c: -case 0xfc8d: -case 0xfc8e: -case 0xfc8f: -case 0xfc90: -case 0xfc91: -case 0xfc92: -case 0xfc93: -case 0xfc94: -case 0xfc95: -case 0xfc96: -case 0xfc97: -case 0xfc98: -case 0xfc99: -case 0xfc9a: -case 0xfc9b: -case 0xfc9c: -case 0xfc9d: -case 0xfc9e: -case 0xfc9f: -case 0xfca0: -case 0xfca1: -case 0xfca2: -case 0xfca3: -case 0xfca4: -case 0xfca5: -case 0xfca6: -case 0xfca7: -case 0xfca8: -case 0xfca9: -case 0xfcaa: -case 0xfcab: -case 0xfcac: -case 0xfcad: -case 0xfcae: -case 0xfcaf: -case 0xfcb0: -case 0xfcb1: -case 0xfcb2: -case 0xfcb3: -case 0xfcb4: -case 0xfcb5: -case 0xfcb6: -case 0xfcb7: -case 0xfcb8: -case 0xfcb9: -case 0xfcba: -case 0xfcbb: -case 0xfcbc: -case 0xfcbd: -case 0xfcbe: -case 0xfcbf: -case 0xfcc0: -case 0xfcc1: -case 0xfcc2: -case 0xfcc3: -case 0xfcc4: -case 0xfcc5: -case 0xfcc6: -case 0xfcc7: -case 0xfcc8: -case 0xfcc9: -case 0xfcca: -case 0xfccb: -case 0xfccc: -case 0xfccd: -case 0xfcce: -case 0xfccf: -case 0xfcd0: -case 0xfcd1: -case 0xfcd2: -case 0xfcd3: -case 0xfcd4: -case 0xfcd5: -case 0xfcd6: -case 0xfcd7: -case 0xfcd8: -case 0xfcd9: -case 0xfcda: -case 0xfcdb: -case 0xfcdc: -case 0xfcdd: -case 0xfcde: -case 0xfcdf: -case 0xfce0: -case 0xfce1: -case 0xfce2: -case 0xfce3: -case 0xfce4: -case 0xfce5: -case 0xfce6: -case 0xfce7: -case 0xfce8: -case 0xfce9: -case 0xfcea: -case 0xfceb: -case 0xfcec: -case 0xfced: -case 0xfcee: -case 0xfcef: -case 0xfcf0: -case 0xfcf1: -case 0xfcf2: -case 0xfcf3: -case 0xfcf4: -case 0xfcf5: -case 0xfcf6: -case 0xfcf7: -case 0xfcf8: -case 0xfcf9: -case 0xfcfa: -case 0xfcfb: -case 0xfcfc: -case 0xfcfd: -case 0xfcfe: -case 0xfcff: -case 0xfd00: -case 0xfd01: -case 0xfd02: -case 0xfd03: -case 0xfd04: -case 0xfd05: -case 0xfd06: -case 0xfd07: -case 0xfd08: -case 0xfd09: -case 0xfd0a: -case 0xfd0b: -case 0xfd0c: -case 0xfd0d: -case 0xfd0e: -case 0xfd0f: -case 0xfd10: -case 0xfd11: -case 0xfd12: -case 0xfd13: -case 0xfd14: -case 0xfd15: -case 0xfd16: -case 0xfd17: -case 0xfd18: -case 0xfd19: -case 0xfd1a: -case 0xfd1b: -case 0xfd1c: -case 0xfd1d: -case 0xfd1e: -case 0xfd1f: -case 0xfd20: -case 0xfd21: -case 0xfd22: -case 0xfd23: -case 0xfd24: -case 0xfd25: -case 0xfd26: -case 0xfd27: -case 0xfd28: -case 0xfd29: -case 0xfd2a: -case 0xfd2b: -case 0xfd2c: -case 0xfd2d: -case 0xfd2e: -case 0xfd2f: -case 0xfd30: -case 0xfd31: -case 0xfd32: -case 0xfd33: -case 0xfd34: -case 0xfd35: -case 0xfd36: -case 0xfd37: -case 0xfd38: -case 0xfd39: -case 0xfd3a: -case 0xfd3b: -case 0xfd3c: -case 0xfd3d: -case 0xfd3e: -case 0xfd3f: -case 0xfd40: -case 0xfd41: -case 0xfd42: -case 0xfd43: -case 0xfd44: -case 0xfd45: -case 0xfd46: -case 0xfd47: -case 0xfd48: -case 0xfd49: -case 0xfd4a: -case 0xfd4b: -case 0xfd4c: -case 0xfd4d: -case 0xfd4e: -case 0xfd4f: -case 0xfd50: -case 0xfd51: -case 0xfd52: -case 0xfd53: -case 0xfd54: -case 0xfd55: -case 0xfd56: -case 0xfd57: -case 0xfd58: -case 0xfd59: -case 0xfd5a: -case 0xfd5b: -case 0xfd5c: -case 0xfd5d: -case 0xfd5e: -case 0xfd5f: -case 0xfd60: -case 0xfd61: -case 0xfd62: -case 0xfd63: -case 0xfd64: -case 0xfd65: -case 0xfd66: -case 0xfd67: -case 0xfd68: -case 0xfd69: -case 0xfd6a: -case 0xfd6b: -case 0xfd6c: -case 0xfd6d: -case 0xfd6e: -case 0xfd6f: -case 0xfd70: -case 0xfd71: -case 0xfd72: -case 0xfd73: -case 0xfd74: -case 0xfd75: -case 0xfd76: -case 0xfd77: -case 0xfd78: -case 0xfd79: -case 0xfd7a: -case 0xfd7b: -case 0xfd7c: -case 0xfd7d: -case 0xfd7e: -case 0xfd7f: -case 0xfd80: -case 0xfd81: -case 0xfd82: -case 0xfd83: -case 0xfd84: -case 0xfd85: -case 0xfd86: -case 0xfd87: -case 0xfd88: -case 0xfd89: -case 0xfd8a: -case 0xfd8b: -case 0xfd8c: -case 0xfd8d: -case 0xfd8e: -case 0xfd8f: -case 0xfd90: -case 0xfd91: -case 0xfd92: -case 0xfd93: -case 0xfd94: -case 0xfd95: -case 0xfd96: -case 0xfd97: -case 0xfd98: -case 0xfd99: -case 0xfd9a: -case 0xfd9b: -case 0xfd9c: -case 0xfd9d: -case 0xfd9e: -case 0xfd9f: -case 0xfda0: -case 0xfda1: -case 0xfda2: -case 0xfda3: -case 0xfda4: -case 0xfda5: -case 0xfda6: -case 0xfda7: -case 0xfda8: -case 0xfda9: -case 0xfdaa: -case 0xfdab: -case 0xfdac: -case 0xfdad: -case 0xfdae: -case 0xfdaf: -case 0xfdb0: -case 0xfdb1: -case 0xfdb2: -case 0xfdb3: -case 0xfdb4: -case 0xfdb5: -case 0xfdb6: -case 0xfdb7: -case 0xfdb8: -case 0xfdb9: -case 0xfdba: -case 0xfdbb: -case 0xfdbc: -case 0xfdbd: -case 0xfdbe: -case 0xfdbf: -case 0xfdc0: -case 0xfdc1: -case 0xfdc2: -case 0xfdc3: -case 0xfdc4: -case 0xfdc5: -case 0xfdc6: -case 0xfdc7: -case 0xfdc8: -case 0xfdc9: -case 0xfdca: -case 0xfdcb: -case 0xfdcc: -case 0xfdcd: -case 0xfdce: -case 0xfdcf: -case 0xfdd0: -case 0xfdd1: -case 0xfdd2: -case 0xfdd3: -case 0xfdd4: -case 0xfdd5: -case 0xfdd6: -case 0xfdd7: -case 0xfdd8: -case 0xfdd9: -case 0xfdda: -case 0xfddb: -case 0xfddc: -case 0xfddd: -case 0xfdde: -case 0xfddf: -case 0xfde0: -case 0xfde1: -case 0xfde2: -case 0xfde3: -case 0xfde4: -case 0xfde5: -case 0xfde6: -case 0xfde7: -case 0xfde8: -case 0xfde9: -case 0xfdea: -case 0xfdeb: -case 0xfdec: -case 0xfded: -case 0xfdee: -case 0xfdef: -case 0xfdf0: -case 0xfdf1: -case 0xfdf2: -case 0xfdf3: -case 0xfdf4: -case 0xfdf5: -case 0xfdf6: -case 0xfdf7: -case 0xfdf8: -case 0xfdf9: -case 0xfdfa: -case 0xfdfb: -case 0xfdfc: -case 0xfdfd: -case 0xfdfe: -case 0xfdff: -case 0xfe00: -case 0xfe01: -case 0xfe02: -case 0xfe03: -case 0xfe04: -case 0xfe05: -case 0xfe06: -case 0xfe07: -case 0xfe08: -case 0xfe09: -case 0xfe0a: -case 0xfe0b: -case 0xfe0c: -case 0xfe0d: -case 0xfe0e: -case 0xfe0f: -case 0xfe10: -case 0xfe11: -case 0xfe12: -case 0xfe13: -case 0xfe14: -case 0xfe15: -case 0xfe16: -case 0xfe17: -case 0xfe18: -case 0xfe19: -case 0xfe1a: -case 0xfe1b: -case 0xfe1c: -case 0xfe1d: -case 0xfe1e: -case 0xfe1f: -case 0xfe20: -case 0xfe21: -case 0xfe22: -case 0xfe23: -case 0xfe24: -case 0xfe25: -case 0xfe26: -case 0xfe27: -case 0xfe28: -case 0xfe29: -case 0xfe2a: -case 0xfe2b: -case 0xfe2c: -case 0xfe2d: -case 0xfe2e: -case 0xfe2f: -case 0xfe30: -case 0xfe31: -case 0xfe32: -case 0xfe33: -case 0xfe34: -case 0xfe35: -case 0xfe36: -case 0xfe37: -case 0xfe38: -case 0xfe39: -case 0xfe3a: -case 0xfe3b: -case 0xfe3c: -case 0xfe3d: -case 0xfe3e: -case 0xfe3f: -case 0xfe40: -case 0xfe41: -case 0xfe42: -case 0xfe43: -case 0xfe44: -case 0xfe45: -case 0xfe46: -case 0xfe47: -case 0xfe48: -case 0xfe49: -case 0xfe4a: -case 0xfe4b: -case 0xfe4c: -case 0xfe4d: -case 0xfe4e: -case 0xfe4f: -case 0xfe50: -case 0xfe51: -case 0xfe52: -case 0xfe53: -case 0xfe54: -case 0xfe55: -case 0xfe56: -case 0xfe57: -case 0xfe58: -case 0xfe59: -case 0xfe5a: -case 0xfe5b: -case 0xfe5c: -case 0xfe5d: -case 0xfe5e: -case 0xfe5f: -case 0xfe60: -case 0xfe61: -case 0xfe62: -case 0xfe63: -case 0xfe64: -case 0xfe65: -case 0xfe66: -case 0xfe67: -case 0xfe68: -case 0xfe69: -case 0xfe6a: -case 0xfe6b: -case 0xfe6c: -case 0xfe6d: -case 0xfe6e: -case 0xfe6f: -case 0xfe70: -case 0xfe71: -case 0xfe72: -case 0xfe73: -case 0xfe74: -case 0xfe75: -case 0xfe76: -case 0xfe77: -case 0xfe78: -case 0xfe79: -case 0xfe7a: -case 0xfe7b: -case 0xfe7c: -case 0xfe7d: -case 0xfe7e: -case 0xfe7f: -case 0xfe80: -case 0xfe81: -case 0xfe82: -case 0xfe83: -case 0xfe84: -case 0xfe85: -case 0xfe86: -case 0xfe87: -case 0xfe88: -case 0xfe89: -case 0xfe8a: -case 0xfe8b: -case 0xfe8c: -case 0xfe8d: -case 0xfe8e: -case 0xfe8f: -case 0xfe90: -case 0xfe91: -case 0xfe92: -case 0xfe93: -case 0xfe94: -case 0xfe95: -case 0xfe96: -case 0xfe97: -case 0xfe98: -case 0xfe99: -case 0xfe9a: -case 0xfe9b: -case 0xfe9c: -case 0xfe9d: -case 0xfe9e: -case 0xfe9f: -case 0xfea0: -case 0xfea1: -case 0xfea2: -case 0xfea3: -case 0xfea4: -case 0xfea5: -case 0xfea6: -case 0xfea7: -case 0xfea8: -case 0xfea9: -case 0xfeaa: -case 0xfeab: -case 0xfeac: -case 0xfead: -case 0xfeae: -case 0xfeaf: -case 0xfeb0: -case 0xfeb1: -case 0xfeb2: -case 0xfeb3: -case 0xfeb4: -case 0xfeb5: -case 0xfeb6: -case 0xfeb7: -case 0xfeb8: -case 0xfeb9: -case 0xfeba: -case 0xfebb: -case 0xfebc: -case 0xfebd: -case 0xfebe: -case 0xfebf: -case 0xfec0: -case 0xfec1: -case 0xfec2: -case 0xfec3: -case 0xfec4: -case 0xfec5: -case 0xfec6: -case 0xfec7: -case 0xfec8: -case 0xfec9: -case 0xfeca: -case 0xfecb: -case 0xfecc: -case 0xfecd: -case 0xfece: -case 0xfecf: -case 0xfed0: -case 0xfed1: -case 0xfed2: -case 0xfed3: -case 0xfed4: -case 0xfed5: -case 0xfed6: -case 0xfed7: -case 0xfed8: -case 0xfed9: -case 0xfeda: -case 0xfedb: -case 0xfedc: -case 0xfedd: -case 0xfede: -case 0xfedf: -case 0xfee0: -case 0xfee1: -case 0xfee2: -case 0xfee3: -case 0xfee4: -case 0xfee5: -case 0xfee6: -case 0xfee7: -case 0xfee8: -case 0xfee9: -case 0xfeea: -case 0xfeeb: -case 0xfeec: -case 0xfeed: -case 0xfeee: -case 0xfeef: -case 0xfef0: -case 0xfef1: -case 0xfef2: -case 0xfef3: -case 0xfef4: -case 0xfef5: -case 0xfef6: -case 0xfef7: -case 0xfef8: -case 0xfef9: -case 0xfefa: -case 0xfefb: -case 0xfefc: -case 0xfefd: -case 0xfefe: -case 0xfeff: -case 0xff00: -case 0xff01: -case 0xff02: -case 0xff03: -case 0xff04: -case 0xff05: -case 0xff06: -case 0xff07: -case 0xff08: -case 0xff09: -case 0xff0a: -case 0xff0b: -case 0xff0c: -case 0xff0d: -case 0xff0e: -case 0xff0f: -case 0xff10: -case 0xff11: -case 0xff12: -case 0xff13: -case 0xff14: -case 0xff15: -case 0xff16: -case 0xff17: -case 0xff18: -case 0xff19: -case 0xff1a: -case 0xff1b: -case 0xff1c: -case 0xff1d: -case 0xff1e: -case 0xff1f: -case 0xff20: -case 0xff21: -case 0xff22: -case 0xff23: -case 0xff24: -case 0xff25: -case 0xff26: -case 0xff27: -case 0xff28: -case 0xff29: -case 0xff2a: -case 0xff2b: -case 0xff2c: -case 0xff2d: -case 0xff2e: -case 0xff2f: -case 0xff30: -case 0xff31: -case 0xff32: -case 0xff33: -case 0xff34: -case 0xff35: -case 0xff36: -case 0xff37: -case 0xff38: -case 0xff39: -case 0xff3a: -case 0xff3b: -case 0xff3c: -case 0xff3d: -case 0xff3e: -case 0xff3f: -case 0xff40: -case 0xff41: -case 0xff42: -case 0xff43: -case 0xff44: -case 0xff45: -case 0xff46: -case 0xff47: -case 0xff48: -case 0xff49: -case 0xff4a: -case 0xff4b: -case 0xff4c: -case 0xff4d: -case 0xff4e: -case 0xff4f: -case 0xff50: -case 0xff51: -case 0xff52: -case 0xff53: -case 0xff54: -case 0xff55: -case 0xff56: -case 0xff57: -case 0xff58: -case 0xff59: -case 0xff5a: -case 0xff5b: -case 0xff5c: -case 0xff5d: -case 0xff5e: -case 0xff5f: -case 0xff60: -case 0xff61: -case 0xff62: -case 0xff63: -case 0xff64: -case 0xff65: -case 0xff66: -case 0xff67: -case 0xff68: -case 0xff69: -case 0xff6a: -case 0xff6b: -case 0xff6c: -case 0xff6d: -case 0xff6e: -case 0xff6f: -case 0xff70: -case 0xff71: -case 0xff72: -case 0xff73: -case 0xff74: -case 0xff75: -case 0xff76: -case 0xff77: -case 0xff78: -case 0xff79: -case 0xff7a: -case 0xff7b: -case 0xff7c: -case 0xff7d: -case 0xff7e: -case 0xff7f: -case 0xff80: -case 0xff81: -case 0xff82: -case 0xff83: -case 0xff84: -case 0xff85: -case 0xff86: -case 0xff87: -case 0xff88: -case 0xff89: -case 0xff8a: -case 0xff8b: -case 0xff8c: -case 0xff8d: -case 0xff8e: -case 0xff8f: -case 0xff90: -case 0xff91: -case 0xff92: -case 0xff93: -case 0xff94: -case 0xff95: -case 0xff96: -case 0xff97: -case 0xff98: -case 0xff99: -case 0xff9a: -case 0xff9b: -case 0xff9c: -case 0xff9d: -case 0xff9e: -case 0xff9f: -case 0xffa0: -case 0xffa1: -case 0xffa2: -case 0xffa3: -case 0xffa4: -case 0xffa5: -case 0xffa6: -case 0xffa7: -case 0xffa8: -case 0xffa9: -case 0xffaa: -case 0xffab: -case 0xffac: -case 0xffad: -case 0xffae: -case 0xffaf: -case 0xffb0: -case 0xffb1: -case 0xffb2: -case 0xffb3: -case 0xffb4: -case 0xffb5: -case 0xffb6: -case 0xffb7: -case 0xffb8: -case 0xffb9: -case 0xffba: -case 0xffbb: -case 0xffbc: -case 0xffbd: -case 0xffbe: -case 0xffbf: -case 0xffc0: -case 0xffc1: -case 0xffc2: -case 0xffc3: -case 0xffc4: -case 0xffc5: -case 0xffc6: -case 0xffc7: -case 0xffc8: -case 0xffc9: -case 0xffca: -case 0xffcb: -case 0xffcc: -case 0xffcd: -case 0xffce: -case 0xffcf: -case 0xffd0: -case 0xffd1: -case 0xffd2: -case 0xffd3: -case 0xffd4: -case 0xffd5: -case 0xffd6: -case 0xffd7: -case 0xffd8: -case 0xffd9: -case 0xffda: -case 0xffdb: -case 0xffdc: -case 0xffdd: -case 0xffde: -case 0xffdf: -case 0xffe0: -case 0xffe1: -case 0xffe2: -case 0xffe3: -case 0xffe4: -case 0xffe5: -case 0xffe6: -case 0xffe7: -case 0xffe8: -case 0xffe9: -case 0xffea: -case 0xffeb: -case 0xffec: -case 0xffed: -case 0xffee: -case 0xffef: -case 0xfff0: -case 0xfff1: -case 0xfff2: -case 0xfff3: -case 0xfff4: -case 0xfff5: -case 0xfff6: -case 0xfff7: -case 0xfff8: -case 0xfff9: -case 0xfffa: -case 0xfffb: -case 0xfffc: -case 0xfffd: -case 0xfffe: -case 0xffff: - { - LINEF(); - } - break; - -case 0x4e50: -case 0x4e51: -case 0x4e52: -case 0x4e53: -case 0x4e54: -case 0x4e55: -case 0x4e56: -case 0x4e57: - { - LINK(instr_b2_b0); - } - break; - -case 0x0108: -case 0x0109: -case 0x010a: -case 0x010b: -case 0x010c: -case 0x010d: -case 0x010e: -case 0x010f: -case 0x0308: -case 0x0309: -case 0x030a: -case 0x030b: -case 0x030c: -case 0x030d: -case 0x030e: -case 0x030f: -case 0x0508: -case 0x0509: -case 0x050a: -case 0x050b: -case 0x050c: -case 0x050d: -case 0x050e: -case 0x050f: -case 0x0708: -case 0x0709: -case 0x070a: -case 0x070b: -case 0x070c: -case 0x070d: -case 0x070e: -case 0x070f: -case 0x0908: -case 0x0909: -case 0x090a: -case 0x090b: -case 0x090c: -case 0x090d: -case 0x090e: -case 0x090f: -case 0x0b08: -case 0x0b09: -case 0x0b0a: -case 0x0b0b: -case 0x0b0c: -case 0x0b0d: -case 0x0b0e: -case 0x0b0f: -case 0x0d08: -case 0x0d09: -case 0x0d0a: -case 0x0d0b: -case 0x0d0c: -case 0x0d0d: -case 0x0d0e: -case 0x0d0f: -case 0x0f08: -case 0x0f09: -case 0x0f0a: -case 0x0f0b: -case 0x0f0c: -case 0x0f0d: -case 0x0f0e: -case 0x0f0f: - { - MOVEP(instr_b2_b0, instr_b11_b9); - } - break; - -case 0x0188: -case 0x0189: -case 0x018a: -case 0x018b: -case 0x018c: -case 0x018d: -case 0x018e: -case 0x018f: -case 0x0388: -case 0x0389: -case 0x038a: -case 0x038b: -case 0x038c: -case 0x038d: -case 0x038e: -case 0x038f: -case 0x0588: -case 0x0589: -case 0x058a: -case 0x058b: -case 0x058c: -case 0x058d: -case 0x058e: -case 0x058f: -case 0x0788: -case 0x0789: -case 0x078a: -case 0x078b: -case 0x078c: -case 0x078d: -case 0x078e: -case 0x078f: -case 0x0988: -case 0x0989: -case 0x098a: -case 0x098b: -case 0x098c: -case 0x098d: -case 0x098e: -case 0x098f: -case 0x0b88: -case 0x0b89: -case 0x0b8a: -case 0x0b8b: -case 0x0b8c: -case 0x0b8d: -case 0x0b8e: -case 0x0b8f: -case 0x0d88: -case 0x0d89: -case 0x0d8a: -case 0x0d8b: -case 0x0d8c: -case 0x0d8d: -case 0x0d8e: -case 0x0d8f: -case 0x0f88: -case 0x0f89: -case 0x0f8a: -case 0x0f8b: -case 0x0f8c: -case 0x0f8d: -case 0x0f8e: -case 0x0f8f: - { - MOVEP(instr_b2_b0, instr_b11_b9); - } - break; - -case 0x0148: -case 0x0149: -case 0x014a: -case 0x014b: -case 0x014c: -case 0x014d: -case 0x014e: -case 0x014f: -case 0x0348: -case 0x0349: -case 0x034a: -case 0x034b: -case 0x034c: -case 0x034d: -case 0x034e: -case 0x034f: -case 0x0548: -case 0x0549: -case 0x054a: -case 0x054b: -case 0x054c: -case 0x054d: -case 0x054e: -case 0x054f: -case 0x0748: -case 0x0749: -case 0x074a: -case 0x074b: -case 0x074c: -case 0x074d: -case 0x074e: -case 0x074f: -case 0x0948: -case 0x0949: -case 0x094a: -case 0x094b: -case 0x094c: -case 0x094d: -case 0x094e: -case 0x094f: -case 0x0b48: -case 0x0b49: -case 0x0b4a: -case 0x0b4b: -case 0x0b4c: -case 0x0b4d: -case 0x0b4e: -case 0x0b4f: -case 0x0d48: -case 0x0d49: -case 0x0d4a: -case 0x0d4b: -case 0x0d4c: -case 0x0d4d: -case 0x0d4e: -case 0x0d4f: -case 0x0f48: -case 0x0f49: -case 0x0f4a: -case 0x0f4b: -case 0x0f4c: -case 0x0f4d: -case 0x0f4e: -case 0x0f4f: - { - MOVEP(instr_b2_b0, instr_b11_b9); - } - break; - -case 0x01c8: -case 0x01c9: -case 0x01ca: -case 0x01cb: -case 0x01cc: -case 0x01cd: -case 0x01ce: -case 0x01cf: -case 0x03c8: -case 0x03c9: -case 0x03ca: -case 0x03cb: -case 0x03cc: -case 0x03cd: -case 0x03ce: -case 0x03cf: -case 0x05c8: -case 0x05c9: -case 0x05ca: -case 0x05cb: -case 0x05cc: -case 0x05cd: -case 0x05ce: -case 0x05cf: -case 0x07c8: -case 0x07c9: -case 0x07ca: -case 0x07cb: -case 0x07cc: -case 0x07cd: -case 0x07ce: -case 0x07cf: -case 0x09c8: -case 0x09c9: -case 0x09ca: -case 0x09cb: -case 0x09cc: -case 0x09cd: -case 0x09ce: -case 0x09cf: -case 0x0bc8: -case 0x0bc9: -case 0x0bca: -case 0x0bcb: -case 0x0bcc: -case 0x0bcd: -case 0x0bce: -case 0x0bcf: -case 0x0dc8: -case 0x0dc9: -case 0x0dca: -case 0x0dcb: -case 0x0dcc: -case 0x0dcd: -case 0x0dce: -case 0x0dcf: -case 0x0fc8: -case 0x0fc9: -case 0x0fca: -case 0x0fcb: -case 0x0fcc: -case 0x0fcd: -case 0x0fce: -case 0x0fcf: - { - MOVEP(instr_b2_b0, instr_b11_b9); - } - break; - -case 0x4e71: - { - NOP(); - } - break; - -case 0x003c: - { - ORI_CCR(); - } - break; - -case 0x4e77: - { - RTR(); - } - break; - -case 0x4e75: - { - RTS(); - } - break; - -case 0x4840: -case 0x4841: -case 0x4842: -case 0x4843: -case 0x4844: -case 0x4845: -case 0x4846: -case 0x4847: - { - SWAP(instr_b2_b0); - } - break; - -case 0x4e40: -case 0x4e41: -case 0x4e42: -case 0x4e43: -case 0x4e44: -case 0x4e45: -case 0x4e46: -case 0x4e47: -case 0x4e48: -case 0x4e49: -case 0x4e4a: -case 0x4e4b: -case 0x4e4c: -case 0x4e4d: -case 0x4e4e: -case 0x4e4f: - { - TRAP(instr & 0xF); - } - break; - -case 0x4e76: - { - TRAPV(); - } - break; - -case 0x4e58: -case 0x4e59: -case 0x4e5a: -case 0x4e5b: -case 0x4e5c: -case 0x4e5d: -case 0x4e5e: -case 0x4e5f: - { - UNLK(instr_b2_b0); - } - break; - -case 0x48b9: - { - const uint16 reglist = ReadOp(); HAM dst(this); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4cb9: - { - const uint16 reglist = ReadOp(); HAM src(this); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x48b8: - { - const uint16 reglist = ReadOp(); HAM dst(this); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4cb8: - { - const uint16 reglist = ReadOp(); HAM src(this); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x4890: -case 0x4891: -case 0x4892: -case 0x4893: -case 0x4894: -case 0x4895: -case 0x4896: -case 0x4897: - { - const uint16 reglist = ReadOp(); HAM dst(this, instr_b2_b0); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x48a0: -case 0x48a1: -case 0x48a2: -case 0x48a3: -case 0x48a4: -case 0x48a5: -case 0x48a6: -case 0x48a7: - { - const uint16 reglist = ReadOp(); HAM dst(this, instr_b2_b0); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4c90: -case 0x4c91: -case 0x4c92: -case 0x4c93: -case 0x4c94: -case 0x4c95: -case 0x4c96: -case 0x4c97: - { - const uint16 reglist = ReadOp(); HAM src(this, instr_b2_b0); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x4c98: -case 0x4c99: -case 0x4c9a: -case 0x4c9b: -case 0x4c9c: -case 0x4c9d: -case 0x4c9e: -case 0x4c9f: - { - const uint16 reglist = ReadOp(); HAM src(this, instr_b2_b0); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x48a8: -case 0x48a9: -case 0x48aa: -case 0x48ab: -case 0x48ac: -case 0x48ad: -case 0x48ae: -case 0x48af: - { - const uint16 reglist = ReadOp(); HAM dst(this, instr_b2_b0); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4ca8: -case 0x4ca9: -case 0x4caa: -case 0x4cab: -case 0x4cac: -case 0x4cad: -case 0x4cae: -case 0x4caf: - { - const uint16 reglist = ReadOp(); HAM src(this, instr_b2_b0); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x48b0: -case 0x48b1: -case 0x48b2: -case 0x48b3: -case 0x48b4: -case 0x48b5: -case 0x48b6: -case 0x48b7: - { - const uint16 reglist = ReadOp(); HAM dst(this, instr_b2_b0); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4cb0: -case 0x4cb1: -case 0x4cb2: -case 0x4cb3: -case 0x4cb4: -case 0x4cb5: -case 0x4cb6: -case 0x4cb7: - { - const uint16 reglist = ReadOp(); HAM src(this, instr_b2_b0); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x4cba: - { - const uint16 reglist = ReadOp(); HAM src(this); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x4cbb: - { - const uint16 reglist = ReadOp(); HAM src(this); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x48f9: - { - const uint16 reglist = ReadOp(); HAM dst(this); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4cf9: - { - const uint16 reglist = ReadOp(); HAM src(this); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x48f8: - { - const uint16 reglist = ReadOp(); HAM dst(this); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4cf8: - { - const uint16 reglist = ReadOp(); HAM src(this); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x48d0: -case 0x48d1: -case 0x48d2: -case 0x48d3: -case 0x48d4: -case 0x48d5: -case 0x48d6: -case 0x48d7: - { - const uint16 reglist = ReadOp(); HAM dst(this, instr_b2_b0); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x48e0: -case 0x48e1: -case 0x48e2: -case 0x48e3: -case 0x48e4: -case 0x48e5: -case 0x48e6: -case 0x48e7: - { - const uint16 reglist = ReadOp(); HAM dst(this, instr_b2_b0); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4cd0: -case 0x4cd1: -case 0x4cd2: -case 0x4cd3: -case 0x4cd4: -case 0x4cd5: -case 0x4cd6: -case 0x4cd7: - { - const uint16 reglist = ReadOp(); HAM src(this, instr_b2_b0); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x4cd8: -case 0x4cd9: -case 0x4cda: -case 0x4cdb: -case 0x4cdc: -case 0x4cdd: -case 0x4cde: -case 0x4cdf: - { - const uint16 reglist = ReadOp(); HAM src(this, instr_b2_b0); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x48e8: -case 0x48e9: -case 0x48ea: -case 0x48eb: -case 0x48ec: -case 0x48ed: -case 0x48ee: -case 0x48ef: - { - const uint16 reglist = ReadOp(); HAM dst(this, instr_b2_b0); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4ce8: -case 0x4ce9: -case 0x4cea: -case 0x4ceb: -case 0x4cec: -case 0x4ced: -case 0x4cee: -case 0x4cef: - { - const uint16 reglist = ReadOp(); HAM src(this, instr_b2_b0); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x48f0: -case 0x48f1: -case 0x48f2: -case 0x48f3: -case 0x48f4: -case 0x48f5: -case 0x48f6: -case 0x48f7: - { - const uint16 reglist = ReadOp(); HAM dst(this, instr_b2_b0); MOVEM_to_MEM(reglist, dst); - } - break; - -case 0x4cf0: -case 0x4cf1: -case 0x4cf2: -case 0x4cf3: -case 0x4cf4: -case 0x4cf5: -case 0x4cf6: -case 0x4cf7: - { - const uint16 reglist = ReadOp(); HAM src(this, instr_b2_b0); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x4cfa: - { - const uint16 reglist = ReadOp(); HAM src(this); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x4cfb: - { - const uint16 reglist = ReadOp(); HAM src(this); MOVEM_to_REGS(src, reglist); - } - break; - -case 0x40f9: - { - if(!Revision_E || CheckPrivilege()) { HAM dst(this); MOVE_from_SR(dst); } - } - break; - -case 0x40f8: - { - if(!Revision_E || CheckPrivilege()) { HAM dst(this); MOVE_from_SR(dst); } - } - break; - -case 0x40d0: -case 0x40d1: -case 0x40d2: -case 0x40d3: -case 0x40d4: -case 0x40d5: -case 0x40d6: -case 0x40d7: - { - if(!Revision_E || CheckPrivilege()) { HAM dst(this, instr_b2_b0); MOVE_from_SR(dst); } - } - break; - -case 0x40e8: -case 0x40e9: -case 0x40ea: -case 0x40eb: -case 0x40ec: -case 0x40ed: -case 0x40ee: -case 0x40ef: - { - if(!Revision_E || CheckPrivilege()) { HAM dst(this, instr_b2_b0); MOVE_from_SR(dst); } - } - break; - -case 0x40f0: -case 0x40f1: -case 0x40f2: -case 0x40f3: -case 0x40f4: -case 0x40f5: -case 0x40f6: -case 0x40f7: - { - if(!Revision_E || CheckPrivilege()) { HAM dst(this, instr_b2_b0); MOVE_from_SR(dst); } - } - break; - -case 0x40d8: -case 0x40d9: -case 0x40da: -case 0x40db: -case 0x40dc: -case 0x40dd: -case 0x40de: -case 0x40df: - { - if(!Revision_E || CheckPrivilege()) { HAM dst(this, instr_b2_b0); MOVE_from_SR(dst); } - } - break; - -case 0x40e0: -case 0x40e1: -case 0x40e2: -case 0x40e3: -case 0x40e4: -case 0x40e5: -case 0x40e6: -case 0x40e7: - { - if(!Revision_E || CheckPrivilege()) { HAM dst(this, instr_b2_b0); MOVE_from_SR(dst); } - } - break; - -case 0x40c0: -case 0x40c1: -case 0x40c2: -case 0x40c3: -case 0x40c4: -case 0x40c5: -case 0x40c6: -case 0x40c7: - { - if(!Revision_E || CheckPrivilege()) { HAM dst(this, instr_b2_b0); MOVE_from_SR(dst); } - } - break; - -case 0x027c: - { - if(CheckPrivilege()) { ANDI_SR(); } - } - break; - -case 0x0a7c: - { - if(CheckPrivilege()) { EORI_SR(); } - } - break; - -case 0x46f9: - { - if(CheckPrivilege()) { HAM src(this); MOVE_to_SR(src); } - } - break; - -case 0x46f8: - { - if(CheckPrivilege()) { HAM src(this); MOVE_to_SR(src); } - } - break; - -case 0x46d0: -case 0x46d1: -case 0x46d2: -case 0x46d3: -case 0x46d4: -case 0x46d5: -case 0x46d6: -case 0x46d7: - { - if(CheckPrivilege()) { HAM src(this, instr_b2_b0); MOVE_to_SR(src); } - } - break; - -case 0x46e8: -case 0x46e9: -case 0x46ea: -case 0x46eb: -case 0x46ec: -case 0x46ed: -case 0x46ee: -case 0x46ef: - { - if(CheckPrivilege()) { HAM src(this, instr_b2_b0); MOVE_to_SR(src); } - } - break; - -case 0x46f0: -case 0x46f1: -case 0x46f2: -case 0x46f3: -case 0x46f4: -case 0x46f5: -case 0x46f6: -case 0x46f7: - { - if(CheckPrivilege()) { HAM src(this, instr_b2_b0); MOVE_to_SR(src); } - } - break; - -case 0x46d8: -case 0x46d9: -case 0x46da: -case 0x46db: -case 0x46dc: -case 0x46dd: -case 0x46de: -case 0x46df: - { - if(CheckPrivilege()) { HAM src(this, instr_b2_b0); MOVE_to_SR(src); } - } - break; - -case 0x46e0: -case 0x46e1: -case 0x46e2: -case 0x46e3: -case 0x46e4: -case 0x46e5: -case 0x46e6: -case 0x46e7: - { - if(CheckPrivilege()) { HAM src(this, instr_b2_b0); MOVE_to_SR(src); } - } - break; - -case 0x46c0: -case 0x46c1: -case 0x46c2: -case 0x46c3: -case 0x46c4: -case 0x46c5: -case 0x46c6: -case 0x46c7: - { - if(CheckPrivilege()) { HAM src(this, instr_b2_b0); MOVE_to_SR(src); } - } - break; - -case 0x46fc: - { - if(CheckPrivilege()) { HAM src(this); MOVE_to_SR(src); } - } - break; - -case 0x46fa: - { - if(CheckPrivilege()) { HAM src(this); MOVE_to_SR(src); } - } - break; - -case 0x46fb: - { - if(CheckPrivilege()) { HAM src(this); MOVE_to_SR(src); } - } - break; - -case 0x4e60: -case 0x4e61: -case 0x4e62: -case 0x4e63: -case 0x4e64: -case 0x4e65: -case 0x4e66: -case 0x4e67: - { - if(CheckPrivilege()) { MOVE_USP<0>(instr_b2_b0); } - } - break; - -case 0x4e68: -case 0x4e69: -case 0x4e6a: -case 0x4e6b: -case 0x4e6c: -case 0x4e6d: -case 0x4e6e: -case 0x4e6f: - { - if(CheckPrivilege()) { MOVE_USP<1>(instr_b2_b0); } - } - break; - -case 0x007c: - { - if(CheckPrivilege()) { ORI_SR(); } - } - break; - -case 0x4e70: - { - if(CheckPrivilege()) { RESET(); } - } - break; - -case 0x4e73: - { - if(CheckPrivilege()) { RTE(); } - } - break; - -case 0x4e72: - { - if(CheckPrivilege()) { STOP(); } - } - break; - -case 0x0840: -case 0x0841: -case 0x0842: -case 0x0843: -case 0x0844: -case 0x0845: -case 0x0846: -case 0x0847: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCHG(targ, wb); - } - break; - -case 0x0880: -case 0x0881: -case 0x0882: -case 0x0883: -case 0x0884: -case 0x0885: -case 0x0886: -case 0x0887: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCLR(targ, wb); - } - break; - -case 0x08c0: -case 0x08c1: -case 0x08c2: -case 0x08c3: -case 0x08c4: -case 0x08c5: -case 0x08c6: -case 0x08c7: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BSET(targ, wb); - } - break; - -case 0x0800: -case 0x0801: -case 0x0802: -case 0x0803: -case 0x0804: -case 0x0805: -case 0x0806: -case 0x0807: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BTST(targ, wb); - } - break; - -case 0x0879: - { - unsigned wb = ReadOp(); HAM targ(this); BCHG(targ, wb); - } - break; - -case 0x08b9: - { - unsigned wb = ReadOp(); HAM targ(this); BCLR(targ, wb); - } - break; - -case 0x08f9: - { - unsigned wb = ReadOp(); HAM targ(this); BSET(targ, wb); - } - break; - -case 0x0839: - { - unsigned wb = ReadOp(); HAM targ(this); BTST(targ, wb); - } - break; - -case 0x0878: - { - unsigned wb = ReadOp(); HAM targ(this); BCHG(targ, wb); - } - break; - -case 0x08b8: - { - unsigned wb = ReadOp(); HAM targ(this); BCLR(targ, wb); - } - break; - -case 0x08f8: - { - unsigned wb = ReadOp(); HAM targ(this); BSET(targ, wb); - } - break; - -case 0x0838: - { - unsigned wb = ReadOp(); HAM targ(this); BTST(targ, wb); - } - break; - -case 0x0850: -case 0x0851: -case 0x0852: -case 0x0853: -case 0x0854: -case 0x0855: -case 0x0856: -case 0x0857: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCHG(targ, wb); - } - break; - -case 0x0890: -case 0x0891: -case 0x0892: -case 0x0893: -case 0x0894: -case 0x0895: -case 0x0896: -case 0x0897: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCLR(targ, wb); - } - break; - -case 0x08d0: -case 0x08d1: -case 0x08d2: -case 0x08d3: -case 0x08d4: -case 0x08d5: -case 0x08d6: -case 0x08d7: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BSET(targ, wb); - } - break; - -case 0x0810: -case 0x0811: -case 0x0812: -case 0x0813: -case 0x0814: -case 0x0815: -case 0x0816: -case 0x0817: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BTST(targ, wb); - } - break; - -case 0x0868: -case 0x0869: -case 0x086a: -case 0x086b: -case 0x086c: -case 0x086d: -case 0x086e: -case 0x086f: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCHG(targ, wb); - } - break; - -case 0x08a8: -case 0x08a9: -case 0x08aa: -case 0x08ab: -case 0x08ac: -case 0x08ad: -case 0x08ae: -case 0x08af: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCLR(targ, wb); - } - break; - -case 0x08e8: -case 0x08e9: -case 0x08ea: -case 0x08eb: -case 0x08ec: -case 0x08ed: -case 0x08ee: -case 0x08ef: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BSET(targ, wb); - } - break; - -case 0x0828: -case 0x0829: -case 0x082a: -case 0x082b: -case 0x082c: -case 0x082d: -case 0x082e: -case 0x082f: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BTST(targ, wb); - } - break; - -case 0x0870: -case 0x0871: -case 0x0872: -case 0x0873: -case 0x0874: -case 0x0875: -case 0x0876: -case 0x0877: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCHG(targ, wb); - } - break; - -case 0x08b0: -case 0x08b1: -case 0x08b2: -case 0x08b3: -case 0x08b4: -case 0x08b5: -case 0x08b6: -case 0x08b7: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCLR(targ, wb); - } - break; - -case 0x08f0: -case 0x08f1: -case 0x08f2: -case 0x08f3: -case 0x08f4: -case 0x08f5: -case 0x08f6: -case 0x08f7: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BSET(targ, wb); - } - break; - -case 0x0830: -case 0x0831: -case 0x0832: -case 0x0833: -case 0x0834: -case 0x0835: -case 0x0836: -case 0x0837: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BTST(targ, wb); - } - break; - -case 0x0858: -case 0x0859: -case 0x085a: -case 0x085b: -case 0x085c: -case 0x085d: -case 0x085e: -case 0x085f: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCHG(targ, wb); - } - break; - -case 0x0898: -case 0x0899: -case 0x089a: -case 0x089b: -case 0x089c: -case 0x089d: -case 0x089e: -case 0x089f: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCLR(targ, wb); - } - break; - -case 0x08d8: -case 0x08d9: -case 0x08da: -case 0x08db: -case 0x08dc: -case 0x08dd: -case 0x08de: -case 0x08df: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BSET(targ, wb); - } - break; - -case 0x0818: -case 0x0819: -case 0x081a: -case 0x081b: -case 0x081c: -case 0x081d: -case 0x081e: -case 0x081f: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BTST(targ, wb); - } - break; - -case 0x0860: -case 0x0861: -case 0x0862: -case 0x0863: -case 0x0864: -case 0x0865: -case 0x0866: -case 0x0867: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCHG(targ, wb); - } - break; - -case 0x08a0: -case 0x08a1: -case 0x08a2: -case 0x08a3: -case 0x08a4: -case 0x08a5: -case 0x08a6: -case 0x08a7: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BCLR(targ, wb); - } - break; - -case 0x08e0: -case 0x08e1: -case 0x08e2: -case 0x08e3: -case 0x08e4: -case 0x08e5: -case 0x08e6: -case 0x08e7: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BSET(targ, wb); - } - break; - -case 0x0820: -case 0x0821: -case 0x0822: -case 0x0823: -case 0x0824: -case 0x0825: -case 0x0826: -case 0x0827: - { - unsigned wb = ReadOp(); HAM targ(this, instr_b2_b0); BTST(targ, wb); - } - break; - -case 0x083a: - { - unsigned wb = ReadOp(); HAM targ(this); BTST(targ, wb); - } - break; - -case 0x083b: - { - unsigned wb = ReadOp(); HAM targ(this); BTST(targ, wb); - } - break; - diff --git a/waterbox/ss/math_ops.h b/waterbox/ss/math_ops.h deleted file mode 100644 index 4154f2d49b..0000000000 --- a/waterbox/ss/math_ops.h +++ /dev/null @@ -1,278 +0,0 @@ -/******************************************************************************/ -/* Mednafen - Multi-system Emulator */ -/******************************************************************************/ -/* math_ops.h: -** Copyright (C) 2007-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* -** Some ideas from: -** blargg -** http://graphics.stanford.edu/~seander/bithacks.html -*/ - -#ifndef __MDFN_MATH_OPS_H -#define __MDFN_MATH_OPS_H - -#if defined(_MSC_VER) - #include -#endif - -static INLINE unsigned MDFN_lzcount16_0UD(uint16 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return 15 ^ 31 ^ __builtin_clz(v); - #elif defined(_MSC_VER) - unsigned long idx; - - _BitScanReverse(&idx, v); - - return 15 ^ idx; - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !(v & 0xFF00) << 3; v <<= tmp; ret += tmp; - tmp = !(v & 0xF000) << 2; v <<= tmp; ret += tmp; - tmp = !(v & 0xC000) << 1; v <<= tmp; ret += tmp; - tmp = !(v & 0x8000) << 0; ret += tmp; - - return(ret); - #endif -} - -static INLINE unsigned MDFN_lzcount32_0UD(uint32 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_clz(v); - #elif defined(_MSC_VER) - unsigned long idx; - - _BitScanReverse(&idx, v); - - return 31 ^ idx; - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !(v & 0xFFFF0000) << 4; v <<= tmp; ret += tmp; - tmp = !(v & 0xFF000000) << 3; v <<= tmp; ret += tmp; - tmp = !(v & 0xF0000000) << 2; v <<= tmp; ret += tmp; - tmp = !(v & 0xC0000000) << 1; v <<= tmp; ret += tmp; - tmp = !(v & 0x80000000) << 0; ret += tmp; - - return(ret); - #endif -} - -static INLINE unsigned MDFN_lzcount64_0UD(uint64 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_clzll(v); - #elif defined(_MSC_VER) - #if defined(_WIN64) - unsigned long idx; - _BitScanReverse64(&idx, v); - return 63 ^ idx; - #else - unsigned long idx0; - unsigned long idx1; - - _BitScanReverse(&idx1, v >> 0); - idx1 -= 32; - if(!_BitScanReverse(&idx0, v >> 32)) - idx0 = idx1; - - idx0 += 32; - - return 63 ^ idx0; - #endif - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !(v & 0xFFFFFFFF00000000ULL) << 5; v <<= tmp; ret += tmp; - tmp = !(v & 0xFFFF000000000000ULL) << 4; v <<= tmp; ret += tmp; - tmp = !(v & 0xFF00000000000000ULL) << 3; v <<= tmp; ret += tmp; - tmp = !(v & 0xF000000000000000ULL) << 2; v <<= tmp; ret += tmp; - tmp = !(v & 0xC000000000000000ULL) << 1; v <<= tmp; ret += tmp; - tmp = !(v & 0x8000000000000000ULL) << 0; ret += tmp; - - return(ret); - #endif -} - -static INLINE unsigned MDFN_tzcount16_0UD(uint16 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_ctz(v); - #elif defined(_MSC_VER) - unsigned long idx; - - _BitScanForward(&idx, v); - - return idx; - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !( (uint8)v) << 3; v >>= tmp; ret += tmp; - tmp = !(v & 0x000F) << 2; v >>= tmp; ret += tmp; - tmp = !(v & 0x0003) << 1; v >>= tmp; ret += tmp; - tmp = !(v & 0x0001) << 0; ret += tmp; - - return ret; - #endif -} - -static INLINE unsigned MDFN_tzcount32_0UD(uint32 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_ctz(v); - #elif defined(_MSC_VER) - unsigned long idx; - - _BitScanForward(&idx, v); - - return idx; - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !((uint16)v) << 4; v >>= tmp; ret += tmp; - tmp = !( (uint8)v) << 3; v >>= tmp; ret += tmp; - tmp = !(v & 0x000F) << 2; v >>= tmp; ret += tmp; - tmp = !(v & 0x0003) << 1; v >>= tmp; ret += tmp; - tmp = !(v & 0x0001) << 0; ret += tmp; - - return ret; - #endif -} - -static INLINE unsigned MDFN_tzcount64_0UD(uint64 v) -{ - #if defined(__GNUC__) || defined(__clang__) || defined(__ICC) || defined(__INTEL_COMPILER) - return __builtin_ctzll(v); - #elif defined(_MSC_VER) - #if defined(_WIN64) - unsigned long idx; - _BitScanForward64(&idx, v); - return idx; - #else - unsigned long idx0, idx1; - - _BitScanForward(&idx1, v >> 32); - idx1 += 32; - if(!_BitScanForward(&idx0, v)) - idx0 = idx1; - - return idx0; - #endif - #else - unsigned ret = 0; - unsigned tmp; - - tmp = !((uint32)v) << 5; v >>= tmp; ret += tmp; - tmp = !((uint16)v) << 4; v >>= tmp; ret += tmp; - tmp = !( (uint8)v) << 3; v >>= tmp; ret += tmp; - tmp = !(v & 0x000F) << 2; v >>= tmp; ret += tmp; - tmp = !(v & 0x0003) << 1; v >>= tmp; ret += tmp; - tmp = !(v & 0x0001) << 0; ret += tmp; - - return ret; - #endif -} - -// -// Result is defined for all possible inputs(including 0). -// -static INLINE unsigned MDFN_lzcount16(uint16 v) { return !v ? 16 : MDFN_lzcount16_0UD(v); } -static INLINE unsigned MDFN_lzcount32(uint32 v) { return !v ? 32 : MDFN_lzcount32_0UD(v); } -static INLINE unsigned MDFN_lzcount64(uint64 v) { return !v ? 64 : MDFN_lzcount64_0UD(v); } - -static INLINE unsigned MDFN_tzcount16(uint16 v) { return !v ? 16 : MDFN_tzcount16_0UD(v); } -static INLINE unsigned MDFN_tzcount32(uint32 v) { return !v ? 32 : MDFN_tzcount32_0UD(v); } -static INLINE unsigned MDFN_tzcount64(uint64 v) { return !v ? 64 : MDFN_tzcount64_0UD(v); } - -static INLINE unsigned MDFN_log2(uint32 v) { return 31 ^ MDFN_lzcount32_0UD(v | 1); } -static INLINE unsigned MDFN_log2(uint64 v) { return 63 ^ MDFN_lzcount64_0UD(v | 1); } - -static INLINE unsigned MDFN_log2(int32 v) { return MDFN_log2((uint32)v); } -static INLINE unsigned MDFN_log2(int64 v) { return MDFN_log2((uint64)v); } - -// Rounds up to the nearest power of 2(treats input as unsigned to a degree, but be aware of integer promotion rules). -// Returns 0 on overflow. -static INLINE uint64 round_up_pow2(uint32 v) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (tmp < v); } -static INLINE uint64 round_up_pow2(uint64 v) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (tmp < v); } - -static INLINE uint64 round_up_pow2(int32 v) { return round_up_pow2((uint32)v); } -static INLINE uint64 round_up_pow2(int64 v) { return round_up_pow2((uint64)v); } - -// Rounds to the nearest power of 2(treats input as unsigned to a degree, but be aware of integer promotion rules). -static INLINE uint64 round_nearest_pow2(uint32 v, bool round_half_up = true) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (v && (((v - tmp) << 1) >= (tmp + !round_half_up))); } -static INLINE uint64 round_nearest_pow2(uint64 v, bool round_half_up = true) { uint64 tmp = (uint64)1 << MDFN_log2(v); return tmp << (v && (((v - tmp) << 1) >= (tmp + !round_half_up))); } - -static INLINE uint64 round_nearest_pow2(int32 v, bool round_half_up = true) { return round_nearest_pow2((uint32)v, round_half_up); } -static INLINE uint64 round_nearest_pow2(int64 v, bool round_half_up = true) { return round_nearest_pow2((uint64)v, round_half_up); } - -// Some compilers' optimizers and some platforms might fubar the generated code from these macros, -// so some tests are run in...tests.cpp -#define sign_8_to_s16(_value) ((int16)(int8)(_value)) -#define sign_9_to_s16(_value) (((int16)((unsigned int)(_value) << 7)) >> 7) -#define sign_10_to_s16(_value) (((int16)((uint32)(_value) << 6)) >> 6) -#define sign_11_to_s16(_value) (((int16)((uint32)(_value) << 5)) >> 5) -#define sign_12_to_s16(_value) (((int16)((uint32)(_value) << 4)) >> 4) -#define sign_13_to_s16(_value) (((int16)((uint32)(_value) << 3)) >> 3) -#define sign_14_to_s16(_value) (((int16)((uint32)(_value) << 2)) >> 2) -#define sign_15_to_s16(_value) (((int16)((uint32)(_value) << 1)) >> 1) - -// This obviously won't convert higher-than-32 bit numbers to signed 32-bit ;) -// Also, this shouldn't be used for 8-bit and 16-bit signed numbers, since you can -// convert those faster with typecasts... -#define sign_x_to_s32(_bits, _value) (((int32)((uint32)(_value) << (32 - _bits))) >> (32 - _bits)) - -static INLINE int32 clamp_to_u8(int32 i) -{ - if(i & 0xFFFFFF00) - i = (((~i) >> 30) & 0xFF); - - return(i); -} - -static INLINE int32 clamp_to_u16(int32 i) -{ - if(i & 0xFFFF0000) - i = (((~i) >> 31) & 0xFFFF); - - return(i); -} - -template static INLINE void clamp(T *val, U minimum, V maximum) -{ - if(*val < minimum) - { - //printf("Warning: clamping to minimum(%d)\n", (int)minimum); - *val = minimum; - } - if(*val > maximum) - { - //printf("Warning: clamping to maximum(%d)\n", (int)maximum); - *val = maximum; - } -} - -#endif diff --git a/waterbox/ss/notes/REFERENCES b/waterbox/ss/notes/REFERENCES deleted file mode 100644 index 2d8d76fe4c..0000000000 --- a/waterbox/ss/notes/REFERENCES +++ /dev/null @@ -1,8 +0,0 @@ -M68000 Programmer's Reference Manual fifth edition (M68000UM/AD REV 4) (ISBN 0-13-541491-1) -M68000 User's Manual Eighth Edition (M68000UM/AD REV 7) (ISBN 0-13-541665-5) - -http://bitsavers.informatik.uni-stuttgart.de/pdf/hitachi/superH/ -http://ppcenter.webou.net/satcart/ -http://dreamjam.co.uk/emuviews/saturn.php -http://koti.kapsi.fi/~antime/sega/ -http://wiki.yabause.org/index.php5?title=CDBlock diff --git a/waterbox/ss/notes/games.txt b/waterbox/ss/notes/games.txt deleted file mode 100644 index 25f518b0fb..0000000000 --- a/waterbox/ss/notes/games.txt +++ /dev/null @@ -1,180 +0,0 @@ -GunBlaze-S: - Game does an excessively-large SCU DMA that runs off the end of VDP1 VRAM and into the VDP1 register area, causing the registers to be - overwritten with (what looks like) garbage. - -Pocket Fighter - Interrupt handler interrupting other interrupt handler in the middle of a read,modify,write sequence of instructions. Same sort of issue as - Street Fighter Alpha 2. - 16-bits var at 0x60443E2 - INT42-> - 0x600D7C4 - 0x600D7D0 - INT41-> - 0x600D738 (writes 0) - -Independence Day - -Batman Forever - Corrupt batmobile graphic during intro(timing issue maybe?). - -Ultimate Mortal Kombat 3 - Major issues and no sound after defeating first opponent. - -Panzer Dragon II - Quasi-illegal window settings. -Panzer Dragon Saga - Quasi-illegal window settings. - -All-Star Baseball 97 - VDP1 glitchy issues - -Space Jam - -Langrisser V - Really sensitive about SMPC timing during startup apparently... - -Street Fighter Alpha 2 - - Line counter @ 0x6050C2E - 0 written to 0x6050C2E in VB Out irq handler @ PC=0x600F374 - VB Out IRQ sometimes happens between PC 0x600F40E and 0x600F414... - - -Christmas Nights - Precision-related VDP1 bug, leading to horribly stretched something or another. - -Magical Drop III - Missing intro graphics. - -Golden Axe The Duel - Flickering title screen - Routine at PC=0x6093DA8, checks byte at 0x607D55C, and if != 0x1, skips writing... - @0x607423C = 0x8001 PC = 0x6093DC4 - @0x607411C = 0x0001 - - @0x607D55C written at PC=0x60910DC - -X-Men vs. Street Fighter - Sometimes locks up if skipping Capcom intro movie. - -Thunderhawk II - Hangs reading from 25D00010, waiting for bit1 to be 1 -Cyberbots - VDP1 timing issue. Hangs during startup. - -Lunar - FMV issues(timing-related; DMA is a bit too fast), @PC=0x60D7C24 - -Nissan Presents Over Drivin' GT-R - SMPC problems - -Break Point - Fails to boot. - -Time Bokan - Freezes a few minutes into gameplay. - [M68K] Exception 9(vec=26) @PC=0x00001ae0 SR=0x2008 ---> PC=0x0000177a, SR=0x2208 - [M68K] Exception 9(vec=26) @PC=0x00001ae4 SR=0x2000 ---> PC=0x0000177a, SR=0x2200 - [M68K] Exception 9(vec=26) @PC=0x00001ae4 SR=0x2000 ---> PC=0x0000177a, SR=0x2200 - [M68K] Exception 9(vec=26) @PC=0x00001af6 SR=0x2008 ---> PC=0x0000177a, SR=0x2208 - -Falcom Classics II - Ys 2 sometimes freezes during startup. - -Virtua Fighter Kids - Wonky FMV. - data @ 0x60435B8 0x60435C0 -- 0x6043318 - 0x060CAAA2 - 0x060CAAE4 - code @ 0x60CA1C6 - PC=0x60BA1D2 - - x inc 0x060FFD38 - (312,gbr) - - Writes to 0x25F80000: - PC=0x20000572 (clock change?) - PC=0x06030AB6 - - -Virtua Cop - Flickery 3D - -Image Fight - uses RBG0 and RBG1 simultaneously during gameplay - -Shienryu - VDP1 output rotation probably. - -Taito Chase HQ - Indexes - -Zero Divide: Bad DMAs? - ----------------------------------------------------------- - 0x060FFC13 (@19,GBR) - SynchCount? - 0x060FFCB0 (@176, GBR) - Resolution/screen mode? -Tilk Aoi Umi kara Kita Shoujo -Zero4 Champ -Yuukyuu Gensoukyoku (Japan) -Yuukyuu no Kobako Official Collection (Japan) -SD Gundam Century S - similar issue to Super Tempo? -Real Sound Kaze no Regret - similar issue to Super Tempo? -Super Tempo - mov.b @(19,gbr), r0 ... 0x060FFC13 - Function pointer of some sort @ 0x60FFFCC - - PC=0x0602C228: 0x0100 -> 0x060FFC12 - PC=0x06020D0A: 0x5 -> 0x060FFC13 - PC=0x06021CB8: 0x0 -> 0x060FFC13 (@0x060FFC12 - 1) - INT41: - PC=0x0602C174: 0x1 -> 0x060FFC13 (((@0x60FFCB0) & 0x10) >> 4) + 1) - PC=0x0602C184: 0x0 -> 0x060FFC13 (@0x060FFC13 - 1) - - Break out of cmp/pz loop manually: - PC=0x06021DAE: 0x1 -> 0x060FFC13 - - What we want...(maybe)...or maybe we need INT4A - PC=0x0602C132 (branch taken) - PC=0x0602C17C - - @0x06021CB8 mov.b r0,@(19,gbr) - Entry point: 0x6021CAC - - - Slave: - @PC=0x0602AB00: first read from 0xFFFFFE11 - FTI by master @PC=0x0602C6A4 - - FTI by master @PC=0x06020CF0 - FTI by master @PC=0x06021CDE - - @PC=0x0602BB7A: read from 0xFFFFFE11 - - - PC=0x06000600: slave entry - --------------------------------------------------------- - -Virtua Fighter spams SCU DMAs... - -TODO: check SCU write throughput for sparse writes. - -Resident Evil - Probably IM related. Fighting Vipers too ------------------------ -Alone in the Dark -Mr. Bones - PC= 25788C - other: 256D8C ... jumps to 0xC0000064? - -Sega Saturn Choice Cuts - hangs on skipping video, hangs on playing video later. -Marvel Super Heroes vs. Street Fighter - Goes back to CD screen after winning battle? -------------------- - -------------------------------------- - -Probably vblank signal issue for a lot of these... - -Arcade's Greatest Hits - Locks up near Digital Eclipse video. - -Baku Baku - 600091A, Timer0 triggers an IRQ when the software isn't ready? - -Father Christmas - icache or CPU timing related probably - -Doom - Sound effect positioning seems off. - -NBA Jam Extreme - [M68K] Exception 3 @PC=0x0000088e SR=0x2700 ---> PC=0x0000029e, SR=0x2700 - -Whizz - CDB? - -Tenchi Muyou! Ryououki Gokuraku - CDB issues? - -Layer Section - Gets confused and misprograms the CDB? - -Tomb Raider: -Pastel Muses - Tries illegal DMA transfer in indirect mode. -Resident Evil - Almost same: -[SCU] DMA level 1 reading indirect table entries @ 0x060c8000 -[SCU] Starting DMA level 1 transfer; ra=0x00000000 wa=0x05c00060 bc=0x0000001e - read_inc=1, write_inc=0x01 -- indirect=1 7 -[SCU] Attempted DMA from illegal address 0x00000000 - - ----------------------------------------------------------------------------------------------- -Funky Fantasy: -[SCU] DMA level 1 reading indirect table entries @ 0x060c0000 -[SCU] Starting DMA level 1 transfer; ra=0x00000000 wa=0x05c00060 bc=0x0000001e - read_inc=1, write_inc=0x01 -- indirect=1 7 -[SCU] Attempted DMA from illegal address 0x00000000 - diff --git a/waterbox/ss/notes/gen_dsp.cpp_ b/waterbox/ss/notes/gen_dsp.cpp_ deleted file mode 100644 index da208c04ed..0000000000 --- a/waterbox/ss/notes/gen_dsp.cpp_ +++ /dev/null @@ -1,106 +0,0 @@ -// g++ -Wall -O2 -o gen_dsp gen_dsp.cpp && ./gen_dsp -#include -#include - -int main(int argc, char* argv[]) -{ - FILE* gen = fopen("../scu_dsp_gentab.inc", "wb"); - FILE* misc = fopen("../scu_dsp_misctab.inc", "wb"); - FILE* mvi = fopen("../scu_dsp_mvitab.inc", "wb"); - FILE* dma = fopen("../scu_dsp_dmatab.inc", "wb"); - FILE* jmp = fopen("../scu_dsp_jmptab.inc", "wb"); - - for(int looped = 0; looped < 2; looped++) - { - // - // General - // - fprintf(gen, "{ /* looped=%u */\n", looped); - for(int alu_op = 0; alu_op < 16; alu_op++) - { - fprintf(gen, " { /* alu_op=0x%02x */\n", alu_op); - for(int x_op = 0; x_op < 8; x_op++) - { - fprintf(gen, " { /* x_op=0x%02x */\n", x_op); - for(int y_op = 0; y_op < 8; y_op++) - { - fprintf(gen, " { /* y_op=0x%02x */\n ", y_op); - for(int d1_op_s = 0; d1_op_s < (4/* + 15*/); d1_op_s++) - { - static const unsigned alu_map[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x00, 0x08, 0x09, 0x0A, 0x0B, 0x00, 0x00, 0x00, 0x0F }; - static const unsigned x_map[8] = { 0x00, 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 }; - static const unsigned d1s_map[16] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x00, 0x09, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00 }; - const int d1_op = std::min(3, d1_op_s); - const int d1_s = std::max(0, d1_op_s - 3); - //char label_name[256]; - //snprintf(label_name, sizeof(label_name), "gen_%01x%01x%01x%01x%01x", looped, alu_op, x_op, y_op, d1_op); - //printf("GENSIN(%s, %s, 0x%01x, 0x%01x, 0x%01x, 0x%01x)\n", label_name, looped ? "true" : "false", alu_op, x_op, y_op, d1_op); - //fprintf(stderr, "&&%s, ", label_name); - //fprintf(stderr, "GeneralInstr<%s, 0x%01x,0x%01x,0x%01x,0x%01x,0x%01x>, ", looped ? "true" : "false", alu_map[alu_op], x_map[x_op], y_op, d1_op, d1s_map[d1_s]); - fprintf(gen, "GeneralInstr<%s, 0x%01x,0x%01x,0x%01x,0x%01x>, ", looped ? "true" : "false", alu_map[alu_op], x_map[x_op], y_op, d1_op); - } - fprintf(gen, "\n },\n\n"); - } - fprintf(gen, " },\n"); - } - fprintf(gen, " },\n"); - } - fprintf(gen, "},\n"); - // - // MVI - // - fprintf(mvi, "{ /* looped=%u */\n", looped); - for(unsigned dest = 0; dest < 16; dest++) - { - fprintf(mvi, " {\n "); - for(unsigned cond = 0; cond < 128; cond++) - { - fprintf(mvi, "MVIInstr<%s, 0x%01x, 0x%02x>, ", looped ? "true" : "false", dest, (cond < 0x40) ? 0x00 : cond ); - } - fprintf(mvi, "\n },\n"); - } - fprintf(mvi, " },\n"); - - // - // DMA - // - fprintf(dma, "{ /* looped=%u */\n", looped); - for(unsigned hfd = 0; hfd < 8; hfd++) - { - fprintf(dma, " {\n "); - for(unsigned ram = 0; ram < 8; ram++) - { - fprintf(dma, "DMAInstr<%s, 0x%01x, 0x%01x, 0x%01x, 0x%02x>, ", looped ? "true" : "false", (hfd >> 2) & 0x1, (hfd >> 1) & 0x1, (hfd >> 0) & 0x1, ram); - } - fprintf(dma, "\n },\n"); - } - fprintf(dma, " },\n"); - - // - // JMP - // - fprintf(jmp, "{ /* looped=%u */\n", looped); - for(unsigned cond = 0; cond < 128; cond++) - { - fprintf(jmp, "JMPInstr<%s, 0x%02x>, ", looped ? "true" : "false", (cond < 0x40) ? 0x00 : cond ); - } - fprintf(jmp, " },\n"); - - // - // Misc - // - fprintf(misc, "{ /* looped=%u */ ", looped); - for(unsigned op = 0; op < 4; op++) - { - fprintf(misc, "MiscInstr<%s, %u>, ", looped ? "true" : "false", op); - } - fprintf(misc, " },\n"); - } - - fclose(jmp); - fclose(dma); - fclose(mvi); - fclose(misc); - fclose(gen); - return 0; -} diff --git a/waterbox/ss/scsp.h b/waterbox/ss/scsp.h deleted file mode 100644 index 0e40c6ca10..0000000000 --- a/waterbox/ss/scsp.h +++ /dev/null @@ -1,319 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* scsp.h: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -class SS_SCSP -{ - public: - - SS_SCSP() MDFN_COLD; - ~SS_SCSP() MDFN_COLD; - - void Reset(bool powering_up) MDFN_COLD; - void RunSample(int16* outlr); - - template - void RW(uint32 A, T& V); //, void (*time_sucker)(); - - INLINE uint16* GetEXTSPtr(void) - { - return EXTS; - } - - INLINE uint16* GetRAMPtr(void) - { - return RAM; - } - - enum - { - GSREG_MVOL = 0, - GSREG_DAC18B, - GSREG_MEM4MB, - GSREG_RBP, - GSREG_RBL, - GSREG_MSLC, - }; - - uint32 GetRegister(const unsigned id, char* const special, const uint32 special_len) MDFN_COLD; - void SetRegister(const unsigned id, const uint32 value) MDFN_COLD; - - private: - - void RecalcSoundInt(void); - void RecalcMainInt(void); - - enum - { - ENV_PHASE_ATTACK = 0, - ENV_PHASE_DECAY1 = 1, - ENV_PHASE_DECAY2 = 2, - ENV_PHASE_RELEASE = 3 - }; - - uint16 SlotRegs[0x20][0x10]; - - struct Slot - { - bool KeyBit; - - uint32 StartAddr; // 20 bits, memory address. - uint16 LoopStart; // 16 bits, in samples. - uint16 LoopEnd; // 16 bits, in samples. - - bool WF8Bit; - uint8 LoopMode; - enum - { - LOOP_DISABLED = 0, - LOOP_NORMAL = 1, - LOOP_REVERSE = 2, - LOOP_ALTERNATING = 3 - }; - - uint8 SourceControl; - enum - { - SOURCE_MEMORY = 0, - SOURCE_NOISE = 1, - SOURCE_ZERO = 2, - SOURCE_UNDEFINED = 3 - }; - - uint8 SBControl; - - union - { - struct - { - uint8 AttackRate; - uint8 Decay1Rate; - uint8 Decay2Rate; - uint8 ReleaseRate; - }; - uint8 EnvRates[4]; - }; - - bool AttackHold; - bool AttackLoopLink; - uint8 DecayLevel; - - uint8 KRS; - uint8 TotalLevel; - bool SoundDirect; // When true, bypass EG, TL, ALFO volume control - - bool StackWriteInhibit; - - uint8 ModLevel; - uint8 ModInputX; - uint8 ModInputY; - - uint8 Octave; - uint16 FreqNum; - - uint8 ALFOModLevel; - uint8 ALFOWaveform; - - uint8 PLFOModLevel; - uint8 PLFOWaveform; - - uint8 LFOFreq; - - bool LFOReset; - - // DSP mix stack - uint8 ToDSPSelect; - uint8 ToDSPLevel; - - int16 DirectVolume[2]; // 1.14 fixed point, derived from DISDL and DIPAN - int16 EffectVolume[2]; // 1.14 fixed point, derived from EFSDL and EFPAN - // - // - uint32 PhaseWhacker; - uint16 CurrentAddr; - bool InLoop; - bool LoopSub; - bool WFAllowAccess; - uint32 EnvLevel; // 0 ... 0x3FF - uint8 EnvPhase; // ENV_PHASE_ATTACK ... ENV_PHASE_RELEASE (0...3) - bool EnvGCBTPrev; - - uint8 LFOCounter; - int16 LFOTimeCounter; - } Slots[32]; - - uint16 EXTS[2]; - - void RunEG(Slot* s, const unsigned key_eg_scale); - - uint8 GetALFO(Slot* s); - int GetPLFO(Slot* s); - void RunLFO(Slot* s); - - uint16 SoundStack[0x40]; - uint16 SoundStackDelayer[4]; - - uint16 MasterVolume; // 1.8 fixed point, derived from MVOL - uint8 MVOL; - bool DAC18bit; - bool Mem4Mb; - - uint32 SlotMonitorWhich; - uint16 SlotMonitorData; - - bool KeyExecute; - uint32 LFSR; - uint32 GlobalCounter; - - // - // - enum - { - MIDIF_INPUT_EMPTY = 0x01, - MIDIF_INPUT_FULL = 0x02, - MIDIF_INPUT_OFLOW = 0x04, - MIDIF_OUTPUT_EMPTY= 0x08, - MIDIF_OUTPUT_FULL = 0x10 - }; - struct - { - uint8 InputFIFO[4]; - uint8 InputRP, InputWP, InputCount; - - uint8 OutputFIFO[4]; - uint8 OutputRP, OutputWP, OutputCount; - - uint8 Flags; - - // - INLINE uint8 ReadInput(void) - { - uint8 ret = InputFIFO[InputRP]; // May not be correct for InputCount == 0; test. - - if(InputCount) - { - InputRP = (InputRP + 1) & 0x3; - InputCount--; - Flags &= ~MIDIF_INPUT_FULL; - if(!InputCount) - Flags |= MIDIF_INPUT_EMPTY; - } - - return ret; - } - - INLINE void WriteOutput(uint8 V) - { - if(OutputCount == 4) // May not be correct; test. - return; - - OutputFIFO[OutputWP] = V; - OutputWP = (OutputWP + 1) & 0x3; - OutputCount++; - - Flags &= ~MIDIF_OUTPUT_EMPTY; - if(OutputCount == 4) - Flags |= MIDIF_OUTPUT_FULL; - } - - void Reset(void) - { - memset(InputFIFO, 0, sizeof(InputFIFO)); - memset(OutputFIFO, 0, sizeof(OutputFIFO)); - - InputRP = InputWP = InputCount = 0; - OutputRP = OutputWP = OutputCount = 0; - - Flags = MIDIF_INPUT_EMPTY | MIDIF_OUTPUT_EMPTY; - } - } MIDI; - // - // - uint16 SCIEB; - uint16 SCIPD; - - uint16 MCIEB; - uint16 MCIPD; - - uint8 SCILV[3]; - // - // - struct - { - uint8 Control; - uint8 Counter; - bool PrevClockIn; - int32 Reload; - } Timers[3]; - // - // - // DMEA, DRGA, and DTLG are apparently not altered by executing DMA. - // - uint32 DMEA; - uint16 DRGA; - uint16 DTLG; - - bool DMA_Execute; - bool DMA_Direction; - bool DMA_Gate; - - void RunDMA(void); - // - // - uint8 RBP; - uint8 RBL; - void RunDSP(void); - - struct DSPS - { - uint64 MPROG[0x80]; - uint32 TEMP[0x80]; // 24 bit - uint32 MEMS[0x20]; // 24 bit - uint16 COEF[64]; // 13 bit - uint16 MADRS[32]; // 16 bit - - uint32 MIXS[0x10]; // 20 bit - uint16 EFREG[0x10]; - - uint32 INPUTS; // 24 bit - - uint32 Product; // 26 bit - uint32 SFT_REG; // 26 bit - uint16 FRC_REG; // 13 bit - uint32 Y_REG; // 24 bit, latches INPUTS - uint16 ADRS_REG; // 12 bit, latches output of A_SEL(which selects between shifter output and upper 8 bits of INPUTS - - uint16 MDEC_CT; - - uint32 RWAddr; - - bool WritePending; - uint16 WriteValue; - - uint8 ReadPending; // = 1 (NOFL=0), =2 (NOFL=1) at time or MRT - uint32 ReadValue; - } DSP; - - // - // - - uint16 RAM[262144 * 2]; // *2 for dummy so we don't have to have so many conditionals in the playback code. -}; - diff --git a/waterbox/ss/scsp.inc b/waterbox/ss/scsp.inc deleted file mode 100644 index 10602a6934..0000000000 --- a/waterbox/ss/scsp.inc +++ /dev/null @@ -1,1550 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* scsp.inc - SCSP Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* - TODO: - Open bus emulation and cycle timing granularity instead of sample(someday?); be careful with DSP input/output buffering - with respect to dry/direct output path delay, and the mapping of the buffers to the address space. - - Finish MIDI interface emulation. - - Proper reset/power-on state. - - Mem4Mb -*/ - -SS_SCSP::SS_SCSP() -{ - memset(&RAM[0x40000], 0x00, 0x80000); // Zero out dummy part. - - Reset(true); -} - -SS_SCSP::~SS_SCSP() -{ - - -} - -void SS_SCSP::RecalcSoundInt(void) // Sound CPU interrupts -{ - unsigned mask_test; - unsigned lvmasked[3]; - unsigned out_level = 0; - - mask_test = SCIPD & SCIEB; - if(mask_test &~ 0xFF) - mask_test = (mask_test & 0xFF) | 0x80; - - lvmasked[0] = (SCILV[0] & mask_test) << 0; - lvmasked[1] = (SCILV[1] & mask_test) << 1; - lvmasked[2] = (SCILV[2] & mask_test) << 2; - - for(unsigned i = 0; i < 8; i++) - { - unsigned l = (lvmasked[0] & 0x1) | (lvmasked[1] & 0x2) | (lvmasked[2] & 0x4); - - if(l > out_level) - out_level = l; - - lvmasked[0] >>= 1; - lvmasked[1] >>= 1; - lvmasked[2] >>= 1; - } - - SCSP_SoundIntChanged(out_level); -#if 0 - if(mask_test) - { - const unsigned shift = std::min(7, MDFN_tzcount32(mask_test)); - unsigned level; - - level = (((SCILV[0] >> which) & 0x1) << 0) | - (((SCILV[1] >> which) & 0x1) << 1) | - (((SCILV[2] >> which) & 0x1) << 2); - } -#endif -} - -void SS_SCSP::RecalcMainInt(void) // Main CPU interrupts -{ - SCSP_MainIntChanged((bool)(MCIPD & MCIEB)); -} - -void SS_SCSP::Reset(bool powering_up) -{ - // - // May need to add a DecodeSlotReg() function or something similar if we implement - // more aggressive slot register value optimizations on writes in the future. - // - memset(SlotRegs, 0, sizeof(SlotRegs)); - memset(Slots, 0, sizeof(Slots)); - - // Some SSFs require this; TODO: test to see if this is correct for a reset, - // and if not, move it into special SSF loading code. - for(unsigned i = 0; i < 32; i++) - { - Slots[i].EnvLevel = 0x3FF; - Slots[i].EnvPhase = ENV_PHASE_RELEASE; - } - - memset(SoundStack, 0, sizeof(SoundStack)); - memset(SoundStackDelayer, 0, sizeof(SoundStackDelayer)); - - if(powering_up) - { - memset(RAM, 0x00, 0x80000); // or something else? - } - - // - // - MVOL = 0; - MasterVolume = 0; - - SlotMonitorWhich = 0; - SlotMonitorData = 0; - - DAC18bit = false; - Mem4Mb = false; - - KeyExecute = false; - LFSR = 1; - GlobalCounter = 0; - - MIDI.Reset(); - // - // - DMEA = 0; - DRGA = 0; - DTLG = 0; - - DMA_Execute = false; - DMA_Direction = false; - DMA_Gate = false; - // - // - for(unsigned i = 0; i < 3; i++) - { - Timers[i].Control = 0; - Timers[i].Counter = 0; - Timers[i].PrevClockIn = false; - } - - // - // - RBP = 0; - RBL = 0; - - memset(&DSP, 0, sizeof(DSP)); - DSP.MDEC_CT = 0; - // - // - SCIEB = 0; - SCIPD = 0; - - MCIEB = 0; - MCIPD = 0; - - for(unsigned i = 0; i < 3; i++) - SCILV[i] = 0; - - RecalcSoundInt(); - RecalcMainInt(); -} - -static INLINE void SDL_PAN_ToVolume(int16* outvol, const unsigned level, const unsigned pan) -{ - const bool pan_which = (bool)(pan & 0x10); - unsigned basev; - unsigned panv; - - basev = (0x80 << level); - - if(!level) - basev = 0; - - panv = basev >> ((pan & 0x0F) >> 1); - if(pan & 0x01) - panv -= (panv >> 2); - - if((pan & 0x0F) == 0x0F) - panv = 0; - - outvol[ pan_which] = panv; - outvol[!pan_which] = basev; -} - -template -INLINE void SS_SCSP::RW(uint32 A, T& DBV) -{ - if(A < 0x100000) - { - if(MDFN_UNLIKELY(A >= 0x80000)) - { - if(IsWrite) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] %zu-byte write of value 0x%08x to unmapped SCSP RAM address 0x%06x\n", sizeof(T), DBV, A); - else - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] %zu-byte read from unmapped SCSP RAM address 0x%06x\n", sizeof(T), A); - DBV = 0; - } - } - else - { - ne16_rwbo_be(RAM, A, &DBV); - } - return; - } - - if(A < 0x100400) - { - //if(IsWrite) - // SS_DBG(SS_DBG_SCSP_REGW, "[SCSP] %zu-byte write to slot 0x%02x register offset 0x%02x: 0x%0*x\n", sizeof(T), (A >> 5) & 0x1F, A & 0x1F, (int)(2 * sizeof(T)), DBV); - // - // Slot regs - // - const unsigned slotnum = (A >> 5) & 0x1F; - - ne16_rwbo_be(SlotRegs[slotnum], A & 0x1F, &DBV); - - if(IsWrite) - { - auto* s = &Slots[slotnum]; - uint16& SRV = SlotRegs[slotnum][(A >> 1) & 0xF]; - - switch((A >> 1) & 0xF) - { - case 0x00: - KeyExecute |= (bool)(SRV & 0x1000); - SRV &= 0x0FFF; - - s->KeyBit = (SRV >> 11) & 0x1; - s->SBControl = (SRV >> 9) & 0x3; - s->SourceControl = (SRV >> 7) & 0x3; - s->LoopMode = (SRV >> 5) & 0x3; - s->WF8Bit = (SRV >> 4) & 0x1; - s->StartAddr = (s->StartAddr & 0xFFFF) | ((SRV & 0xF) << 16); - break; - - case 0x01: - s->StartAddr = (s->StartAddr &~ 0xFFFF) | SRV; - break; - - case 0x02: - s->LoopStart = SRV; - break; - - case 0x03: - s->LoopEnd = SRV; - break; - - case 0x04: - s->AttackRate = SRV & 0x1F; - s->AttackHold = (SRV >> 5) & 0x1; - s->Decay1Rate = (SRV >> 6) & 0x1F; - s->Decay2Rate = (SRV >> 11) & 0x1F; - break; - - case 0x05: - if(SRV & 0x8000) - { - //SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] Unknown bits non-zero in slot %u, register %u\n", slotnum, (A >> 1) & 0xF); - } - - s->ReleaseRate = SRV & 0x1F; - s->DecayLevel = (SRV >> 5) & 0x1F; - s->KRS = (SRV >> 10) & 0xF; - s->AttackLoopLink = (SRV >> 14) & 0x1; - break; - - case 0x06: - SRV &= 0x0FFF; - if(SRV & 0x0C00) - { - //SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] Unknown bits non-zero in slot %u, register %u\n", slotnum, (A >> 1) & 0xF); - } - - s->TotalLevel = SRV & 0xFF; - s->SoundDirect = (SRV >> 8) & 0x1; - s->StackWriteInhibit = (SRV >> 9) & 0x1; - break; - - case 0x07: - s->ModInputY = SRV & 0x3F; - s->ModInputX = (SRV >> 6) & 0x3F; - s->ModLevel = (SRV >> 12) & 0xF; - break; - - case 0x08: - if(SRV & 0x8400) - { - //SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] Unknown bits non-zero in slot %u, register %u\n", slotnum, (A >> 1) & 0xF); - } - - s->FreqNum = SRV & 0x7FF; - s->Octave = (SRV >> 11) & 0xF; - break; - - case 0x09: - s->ALFOModLevel = SRV & 0x7; - s->ALFOWaveform = (SRV >> 3) & 0x3; - s->PLFOModLevel = (SRV >> 5) & 0x7; - s->PLFOWaveform = (SRV >> 8) & 0x3; - s->LFOFreq = (SRV >> 10) & 0x1F; - s->LFOReset = (SRV >> 15) & 0x1; - break; - - case 0x0A: - SRV &= 0x00FF; - if(SRV & 0x0080) - { - //SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] Unknown bits non-zero in slot %u, register %u\n", slotnum, (A >> 1) & 0xF); - } - s->ToDSPLevel = SRV & 0x7; - s->ToDSPSelect = (SRV >> 3) & 0xF; - break; - - case 0x0B: - SDL_PAN_ToVolume(s->DirectVolume, (SRV >> 13) & 0x7, (SRV >> 8) & 0x1F); - SDL_PAN_ToVolume(s->EffectVolume, (SRV >> 5) & 0x7, (SRV >> 0) & 0x1F); - break; - - case 0x0C: case 0x0D: case 0x0E: case 0x0F: - SRV = 0; - break; - } - } - - return; - } - - if(A < 0x100430) - { - // OldReg = (OldReg &~ mask) | ((DBV << shift) & mask & whatever); - unsigned mask = 0xFFFF; - unsigned shift = 0; - - if(sizeof(T) == 1) - { - shift = ((A & 1) ^ 1) << 3; - mask = 0xFF << shift; - } - - // - // Common regs - // - switch((A >> 1) & 0x1F) - { - case 0x00: // MVOL (W), DB (W), M4 (W) - if(IsWrite) - { - uint16 tmp = MVOL | (DAC18bit << 8) | (Mem4Mb << 9); - - tmp = (tmp &~ mask) | ((DBV << shift) & mask); - - MVOL = (tmp & 0xF); - DAC18bit = (tmp >> 8) & 1; - Mem4Mb = (tmp >> 9) & 1; - - // - { - unsigned mv; - - mv = 0x2 << (MVOL >> 1); - if(!(MVOL & 1)) - mv -= (mv >> 2); - - if(!MVOL) - mv = 0; - - MasterVolume = mv; - } - } - else - DBV = 0; - break; - - case 0x01: // RBP (W), RBL (W) - if(IsWrite) - { - uint16 tmp = RBP | (RBL << 7); - tmp = (tmp &~ mask) | ((DBV << shift) & mask); - RBP = tmp & 0x7F; - RBL = (tmp >> 7) & 0x3; - } - else - DBV = 0; - break; - - case 0x02: // MIDI input buffer, Input Empty, Input Full, Input Overflow, Output Empty, Output Full (all R) - if(!IsWrite) - { - if(!shift) - { - // TODO: Test correct order of flags latching returning versus input fetching/latching(also maybe take into consideration - // 16-bit access from SCU being split into 2x 8-bit accesses on the real thing...). - unsigned tmp = MIDI.Flags << 8; - tmp |= MIDI.ReadInput(); - DBV = tmp & mask; - } - else - DBV = MIDI.Flags; - } - break; - - case 0x03: // MOBUF (W) - if(IsWrite) - { - - } - else - DBV = 0; - break; - - case 0x04: // CA/SGC/EG (R), MSLC (W) - if(IsWrite) - { - uint16 tmp = (SlotMonitorWhich << 11); - tmp = (tmp &~ mask) | ((DBV << shift) & mask); - SlotMonitorWhich = (tmp >> 11) & 0x1F; - } - else - { - DBV = (SlotMonitorData & mask) >> shift; - } - break; - - case 0x05: - case 0x06: - case 0x07: - case 0x08: - if(!IsWrite) - DBV = 0; - break; - - case 0x09: // DMEA(low) (W) - if(IsWrite) - { - uint16 tmp = DMEA << 1; - tmp = (tmp &~ mask) | ((DBV << shift) & mask); - DMEA = tmp >> 1; - } - else - DBV = 0; - break; - - case 0x0A: // DRGA (W), DMEA(high) (W) - if(IsWrite) - { - uint16 tmp = ((DMEA >> 3) & 0xF000) | (DRGA << 1); - tmp = (tmp &~ mask) | ((DBV << shift) & mask); - DMEA = (DMEA & 0x7FFF) | ((tmp & 0xF000) << 3); - DRGA = (tmp >> 1) & 0x7FF; - } - else - DBV = 0; - break; - - case 0x0B: // DTLG(W), EX(R/W), DI(R/W), GA(R/W) - if(IsWrite) - { - //const bool prev_execute = DMA_Execute; - uint16 tmp = (DTLG << 1) | (DMA_Execute << 12) | (DMA_Direction << 13) | (DMA_Gate << 14); - - tmp = (tmp &~ mask) | ((DBV << shift) & mask); - - DTLG = (tmp >> 1) & 0x7FF; - DMA_Execute |= (tmp >> 12) & 0x1; - DMA_Direction = (tmp >> 13) & 0x1; - DMA_Gate = (tmp >> 14) & 0x1; - -#if 0 - if(!prev_execute && DMA_Execute) - { - printf("[SCSP] DMA Started; Memory Address: 0x%06x, Register Address: 0x%03x, Length: 0x%03x Direction: %u, Gate: %u\n", - DMEA << 1, DRGA << 1, DTLG << 1, DMA_Direction, DMA_Gate); - } -#endif - RunDMA(); - } - else - { - uint16 tmp = (DMA_Execute << 12) | (DMA_Direction << 13) | (DMA_Gate << 14); - - DBV = (tmp & mask) >> shift; - } - break; - - case 0x0C: // TIMA(W), TACTL(W) - case 0x0D: // TIMB(W), TBCTL(W) - case 0x0E: // TIMC(W), TCCTL(W) - if(IsWrite) - { - auto* t = &Timers[((A >> 1) & 0x1F) - 0x0C]; - uint16 tmp = (t->Control << 8); - tmp = (tmp &~ mask) | ((DBV << shift) & mask); - t->Control = (tmp >> 8) & 0x7; - - if(!shift) - t->Reload = DBV & 0xFF; - - //printf("Timer(%zu-byte) %u: %04x\n", sizeof(T), ((A >> 1) & 0x1F) - 0x0C, DBV); - } - else - DBV = 0; - break; - - case 0x0F: // SCIEB (R/W) - if(IsWrite) - { - SCIEB = (SCIEB &~ mask) | ((DBV << shift) & mask & 0x7FF); - RecalcSoundInt(); - } - else - DBV = (SCIEB & mask) >> shift; - break; - - case 0x10: // SCIPD (R) (b5 can be written, like MCIPD) - if(IsWrite) - { - SCIPD |= ((DBV << shift) & mask & 0x020); - RecalcSoundInt(); - } - else - DBV = (SCIPD & mask) >> shift; - break; - - case 0x11: // SCIRE (W) - if(IsWrite) - { - SCIPD &= ~((DBV << shift) & mask); - RecalcSoundInt(); - } - else - DBV = 0; - break; - - case 0x12: // SCILV0 (W) - case 0x13: // SCILV1 (W) - case 0x14: // SCILV2 (W) - if(IsWrite) - { - const unsigned index = ((A >> 1) & 0x1F) - 0x12; - - SCILV[index] = (SCILV[index] &~ mask) | ((DBV << shift) & mask & 0x00FF); - RecalcSoundInt(); - } - else - DBV = 0; - break; - - case 0x15: // MCIEB (W) - if(IsWrite) - { - MCIEB = (MCIEB &~ mask) | ((DBV << shift) & mask & 0x7FF); - RecalcMainInt(); - } - else - DBV = 0; - break; - - case 0x16: // MCIPD (R) (when b5=1 is written, set corresponding bit to 1; writing 0 has no apparent effect) - if(IsWrite) - { - MCIPD |= ((DBV << shift) & mask & 0x020); - RecalcMainInt(); - } - else - DBV = (MCIPD & mask) >> shift; - break; - - case 0x17: // MCIRE (W) - if(IsWrite) - { - MCIPD &= ~((DBV << shift) & mask); - RecalcMainInt(); - } - else - DBV = 0; - break; - - case 0x18: - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - case 0x1D: - case 0x1E: - case 0x1F: - if(IsWrite) - { - } - else - DBV = 0; - break; - } - - return; - } - - if(A >= 0x100600 && A <= 0x10067F) - { - // - // Sound stack data - // - if(IsWrite) - *(T*)((uint8*)SoundStack + ((A & 0x7F &~(sizeof(T) - 1)) ^ (2 - sizeof(T)))) = DBV; - else - DBV = *(T*)((uint8*)SoundStack + ((A & 0x7F & ~(sizeof(T) - 1)) ^ (2 - sizeof(T)))); - - return; - } - - if(A >= 0x100700 && A <= 0x10077F) - { - // - // DSP coefficients - // - const unsigned index = (A & 0x7F) >> 1; - unsigned mask = 0xFFFF; - unsigned shift = 0; - - if(sizeof(T) == 1) - { - shift = ((A & 1) ^ 1) << 3; - mask = 0xFF << shift; - } - - if(IsWrite) - DSP.COEF[index] = (((DSP.COEF[index] << 3) &~ mask) | ((DBV << shift) & mask)) >> 3; - else - DBV = ((DSP.COEF[index] << 3) & mask) >> shift; - - return; - } - - if(A >= 0x100780 && A <= 0x1007BF) - { - // - // DSP memory addresses - // - ne16_rwbo_be(DSP.MADRS, A & 0x3F, &DBV); - - return; - } - - if(A >= 0x100800 && A <= 0x100BFF) - { - // - // DSP microprogram - // - ne64_rwbo_be(DSP.MPROG, A & 0x3FF, &DBV); - - return; - } - - // - // DSP work buffer - // - if(A >= 0x100C00 && A <= 0x100DFF) - { - const unsigned index = (A & 0x1FF) >> 2; - unsigned mask; - unsigned shift = (A & 2) ? 8 : 0; - - if(sizeof(T) == 1) - { - shift += ((A & 1) ^ 1) << 3; - mask = 0xFF << shift; - } - else - mask = 0xFFFF << shift; - - if(!(A & 2)) - mask &= 0xFF; - - if(IsWrite) - DSP.TEMP[index] = (DSP.TEMP[index] &~ mask) | ((DBV << shift) & mask & 0xFFFFFF); - else - DBV = (DSP.TEMP[index] & mask) >> shift; - - return; - } - - // - // DSP memory read stack - // - if(A >= 0x100E00 && A <= 0x100E7F) - { - const unsigned index = (A & 0x7F) >> 2; - unsigned mask; - unsigned shift = (A & 2) ? 8 : 0; - - if(sizeof(T) == 1) - { - shift += ((A & 1) ^ 1) << 3; - mask = 0xFF << shift; - } - else - mask = 0xFFFF << shift; - - if(!(A & 2)) - mask &= 0xFF; - - if(IsWrite) - DSP.MEMS[index] = (DSP.MEMS[index] &~ mask) | ((DBV << shift) & mask & 0xFFFFFF); - else - DBV = (DSP.MEMS[index] & mask) >> shift; - - return; - } - - // - // DSP mix stack - // - if(A >= 0x100E80 && A <= 0x100EBF) - { - const unsigned index = (A & 0x3F) >> 2; - unsigned mask; - unsigned shift = (A & 2) ? 4 : 0; - - if(sizeof(T) == 1) - { - shift += ((A & 1) ^ 1) << 3; - mask = 0xFF << shift; - } - else - mask = 0xFFFF << shift; - - if(!(A & 2)) - mask &= 0x0F; - - if(IsWrite) - DSP.MIXS[index] = (DSP.MIXS[index] &~ mask) | ((DBV << shift) & mask & 0xFFFFFF); - else - DBV = (DSP.MIXS[index] & mask) >> shift; - - return; - } - - // - // - // - if(A >= 0x100EC0 && A <= 0x100EDF) - { - ne16_rwbo_be(DSP.EFREG, A & 0x1F, &DBV); - - return; - } - - if(A >= 0x100EE0 && A <= 0x100EE3) - { - if(!IsWrite) - DBV = ne16_rbo_be(EXTS, A & 0x3); - - return; - } - - if(IsWrite) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] Unknown %zu-byte write of value 0x%08x to address 0x%08x\n", sizeof(T), DBV, A); - else - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] Unknown %zu-byte read from address 0x%08x\n", sizeof(T), A); - DBV = 0; - } -} - - -// -// Gate bit only forces the value to 0, the read still seems to occur(or at the very least timing side effects occur for the case of reg->mem). -// -void NO_INLINE SS_SCSP::RunDMA(void) -{ - if(!DMA_Execute) - return; - - uint32 length = DTLG; - uint32 mem_addr = DMEA; - uint32 reg_addr = DRGA; - bool dir = DMA_Direction; - bool gate = DMA_Gate; - - while(length) - { - if(dir) - { - uint16 tmp; - - RW(0x100000 | (reg_addr << 1), tmp); - - if(gate) - tmp = 0; - - if(MDFN_LIKELY(mem_addr < 0x40000)) - RAM[mem_addr] = tmp; - } - else - { - uint16 tmp = RAM[mem_addr]; - - if(gate) - tmp = 0; - - RW(0x100000 | (reg_addr << 1), tmp); - } - - reg_addr = (reg_addr + 1) & 0x000007FF; - mem_addr = (mem_addr + 1) & 0x0007FFFF; - length = length - 1; - } - - DMA_Execute = false; - SCIPD |= 0x10; - MCIPD |= 0x10; - RecalcSoundInt(); - RecalcMainInt(); -} - - -INLINE void SS_SCSP::RunEG(Slot* s, const unsigned key_eg_scale) -{ - if(s->EnvPhase == ENV_PHASE_DECAY1 && (s->EnvLevel >> 5) == s->DecayLevel) - s->EnvPhase = ENV_PHASE_DECAY2; - - // - // - // - bool ClockEG; - const unsigned ERateNoScale = s->EnvRates[s->EnvPhase]; - const unsigned ERate = std::min(0x1F, key_eg_scale + ERateNoScale); - const unsigned ERateWBT = (0x22 - std::min(0x18, ERate)) >> 1; - const bool EGCBT = (GlobalCounter >> ERateWBT) & 1; - - ClockEG = !s->EnvGCBTPrev && EGCBT; - - if((ERate < 0x18) && (ERate & 1)) - ClockEG &= (bool)((GlobalCounter >> (ERateWBT + 1)) & 0x3); - - ClockEG &= (bool)ERateNoScale; - - s->EnvGCBTPrev = EGCBT; - - if(ClockEG) - { - const int32 inc_base = (s->EnvPhase == ENV_PHASE_ATTACK) ? ~s->EnvLevel : 16; - const unsigned ermaxo = std::max(0x18, std::min(0x1E, ERate)); - const uint32 srac = ((0x20 - ermaxo) >> 1) + (ermaxo & 1 & (GlobalCounter >> (ERateWBT + 1))); - - //if(s == &Slots[0] && s->EnvLevel) - // printf("EP: %u, EL: 0x%04x, AR: 0x%02x, %d, %u --- %02x\n", s->EnvPhase, s->EnvLevel, s->AttackRate, inc_base, srac, ERate); - - s->EnvLevel += inc_base >> srac; - - if((int32)s->EnvLevel >= 0x3FF) - { - s->WFAllowAccess = false; - s->EnvLevel = 0x3FF; - } - - if((int32)s->EnvLevel < 0) - s->EnvLevel = 0; - } - // - // - // - - if(s->EnvPhase == ENV_PHASE_ATTACK) - { - if((s->AttackLoopLink && s->InLoop) || (!s->AttackLoopLink && s->EnvLevel == 0)) - s->EnvPhase = ENV_PHASE_DECAY1; - } -} - -// -// Take care in handling LFSR, or else the volume of noise-ALFO-modulated noise will -// be quite off, or have a DC bias. -// -INLINE uint8 SS_SCSP::GetALFO(Slot* s) -{ - uint8 ret; - - switch(s->ALFOWaveform) - { - default: - case 0: // Saw - ret = s->LFOCounter &~ 1; - break; - - case 1: // Square - ret = ((int8)s->LFOCounter >> 7) &~ 1; - break; - - case 2: // Triangle - ret = (unsigned)(s->LFOCounter ^ ((int8)s->LFOCounter >> 7)) << 1; - break; - - case 3: // Noise - ret = LFSR &~ 1; - break; - } - - ret >>= (7 - s->ALFOModLevel); - - if(!s->ALFOModLevel) - ret = 0; - - return ret; -} - -INLINE int SS_SCSP::GetPLFO(Slot* s) -{ - int ret; - - switch(s->PLFOWaveform) - { - default: - case 0: // Saw - ret = (int8)(s->LFOCounter &~ 1); - break; - - case 1: // Square - ret = (int8)((s->LFOCounter & 0x80) ? 0x80 : 0x7E); - break; - - case 2: // Triangle - ret = (int8)(((s->LFOCounter & 0x3F) ^ ((s->LFOCounter & 0x40) ? 0x3F : 0x00) ^ ((s->LFOCounter & 0x80) ? 0x7F : 0x00)) << 1); - break; - - case 3: // Noise - ret = (int8)(LFSR &~ 1); - break; - } - - ret >>= (7 - s->PLFOModLevel); - - if(!s->PLFOModLevel) - ret = 0; - - ret = ((0x40 ^ (s->FreqNum >> 4)) * ret) >> 6; - - return ret; -} - -INLINE void SS_SCSP::RunLFO(Slot* s) -{ - s->LFOTimeCounter--; - if(s->LFOTimeCounter <= 0) - { - s->LFOCounter++; - s->LFOTimeCounter = (((8 - (s->LFOFreq & 0x3)) << 7) >> (s->LFOFreq >> 2)) - 4; - } - - if(s->LFOReset) - s->LFOCounter = 0; -} - -// -// -// -static INLINE uint32 dspfloat_to_int(const uint16 inv) -{ - const uint32 sign_xor = (int32)((inv & 0x8000) << 16) >> 1; - const uint32 exp = (inv >> 11) & 0xF; - uint32 ret; - - ret = inv & 0x7FF; - if(exp < 12) - ret |= 0x800; - ret <<= 11 + 8; - ret ^= sign_xor; - ret = (int32)ret >> (8 + std::min(11, exp)); - - return ret & 0xFFFFFF; -} - -static INLINE uint32 int_to_dspfloat(const uint32 inv) -{ - const uint32 invsl8 = inv << 8; - const uint32 sign_xor = (int)invsl8 >> 31; - uint32 exp, shift; - uint32 ret; - - exp = MDFN_lzcount32(((invsl8 ^ sign_xor) << 1) | (1 << 19)); - shift = exp - (bool)(exp == 12); //std::min(11, exp); - - ret = (int32)invsl8 >> (19 - shift); - ret &= 0x87FF; - ret |= exp << 11; - - return ret; -} - -static const uint16 SB_XOR_Table[4] = { 0x0000, 0x7FFF, 0x8000, 0xFFFF }; - -INLINE void SS_SCSP::RunDSP(void) -{ - // - // - // Instruction field order/width RE'ing notes: - // - // Bit 0: NXADDR - // Bit 1: ADRGB - // Bit 2-6: MASA - // Bit 8: NOFL (disables floating-point conversion when =1, instead just shifting by 8); has effect with MRT=1 or MWT=1 - // Bit 9-14: CRA (Coefficient read address, input into Y_SEL) - // Bit 16: BSEL - // Bit 17: ZERO - // Bit 18: NEGB (apparently no effect when ZERO=1) - // Bit 19: YRL - // Bit 20: SHFT0 - // Bit 21: SHFT1 - // Bit 22: FRCL - // Bit 23: ADRL (latches A_SEL output into ADRS_REG) - // Bit 24-27: EWA(EFREG write address) - // Bit 28: EWT(EFREG write enable) - // Bit 29: MRT (Memory read trigger; to read: [MWR=1] [whatever instruction] [IWT=1] - // Bit 30: MWT (Memory write trigger) - // Bit 31: TABLE - // Bit 32-36: IWA (MEMS write address) - // Bit 37: IWT (MEMS write trigger) - // Bit 38-43: IRA (0x00-0x1F MEMS, 0x20-0x2F MIXS) - // Bit 45-46: YSEL - // Bit 47: XSEL - // Bit 48-54: TWA(temp write address) Seems to be an offset added to a counter changed each sample. - // Bit 55: TWT(temp write trigger) WARNING: Setting this to 1 for all 128 steps apparently can cause a CPU to freeze up if it tries to read/write TEMP afterward. - // Bit 56-62: TRA(temp read address) - for(unsigned step = 0; step < 128; step++) - { - const uint64 instr = DSP.MPROG[step]; - -/* - assert(!(instr & (1ULL << 7))); - assert(!(instr & (1ULL << 15))); - assert(!(instr & (1ULL << 44))); - assert(!(instr & (1ULL << 63))); -*/ - - const bool NXADDR = (instr >> 0) & 1; - const bool ADRGB = (instr >> 1) & 1; - const unsigned MASA = (instr >> 2) & 0x1F; - const bool NOFL = (instr >> 8) & 1; - const unsigned CRA = (instr >> 9) & 0x3F; - const bool BSEL = (instr >> 16) & 1; - const bool ZERO = (instr >> 17) & 1; - const bool NEGB = (instr >> 18) & 1; - const bool YRL = (instr >> 19) & 1; - const bool SHFT0 = (instr >> 20) & 1; - const bool SHFT1 = (instr >> 21) & 1; - const bool FRCL = (instr >> 22) & 1; - const bool ADRL = (instr >> 23) & 1; - const unsigned EWA = (instr >> 24) & 0x0F; - const bool EWT = (instr >> 28) & 1; - const bool MRT = (instr >> 29) & 1; - const bool MWT = (instr >> 30) & 1; - const bool TABLE = (instr >> 31) & 1; - const unsigned IWA = (instr >> 32) & 0x1F; - const bool IWT = (instr >> 37) & 1; - const unsigned IRA = (instr >> 38) & 0x3F; - const unsigned YSEL = (instr >> 45) & 0x03; - const bool XSEL = (instr >> 47) & 1; - const unsigned TEMPWriteAddr = ((instr >> 48) + DSP.MDEC_CT) & 0x7F; - const bool TWT = (instr >> 55) & 1; - const unsigned TEMPReadAddr = ((instr >> 56) + DSP.MDEC_CT) & 0x7F; - -#if 0 - if(!(step & 1) && (MWT || MRT)) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] Memory access requested at even DSP step %u; 0x%016llx\n", step, instr); - - if(MWT & MRT) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCSP, "[SCSP] MWT and MRT both 1 at DSP step %u; 0x%016llx\n", step, instr); -#endif - // - // - if(IRA & 0x20) - { - if(IRA & 0x10) - { - if(!(IRA & 0xE)) - DSP.INPUTS = EXTS[IRA & 0x1] << 8; - } - else - { - DSP.INPUTS = DSP.MIXS[IRA & 0xF] << 4; - } - } - else - { - DSP.INPUTS = DSP.MEMS[IRA & 0x1F]; - } - - const int32 INPUTS = sign_x_to_s32(24, DSP.INPUTS); - const int32 TEMP = sign_x_to_s32(24, DSP.TEMP[TEMPReadAddr]); - const int32 X_SEL_Inputs[2] = { TEMP, INPUTS }; - const uint16 Y_SEL_Inputs[4] = { DSP.FRC_REG, DSP.COEF[CRA], (uint16)((DSP.Y_REG >> 11) & 0x1FFF), (uint16)((DSP.Y_REG >> 4) & 0x0FFF) }; - const uint32 SGA_Inputs[2] = { (uint32)TEMP, DSP.SFT_REG }; - // - // - // - if(YRL) - { - DSP.Y_REG = INPUTS & 0xFFFFFF; - } - // - // - // - int32 ShifterOutput; - - ShifterOutput = (uint32)sign_x_to_s32(26, DSP.SFT_REG) << (SHFT0 ^ SHFT1); - - if(!SHFT1) - { - if(ShifterOutput > 0x7FFFFF) - ShifterOutput = 0x7FFFFF; - else if(ShifterOutput < -0x800000) - ShifterOutput = 0x800000; - } - ShifterOutput &= 0xFFFFFF; - - if(EWT) - DSP.EFREG[EWA] = (ShifterOutput >> 8); - - if(TWT) - DSP.TEMP[TEMPWriteAddr] = ShifterOutput; - - // - // - if(FRCL) - { - const unsigned F_SEL_Inputs[2] = { (unsigned)(ShifterOutput >> 11), (unsigned)(ShifterOutput & 0xFFF) }; - - DSP.FRC_REG = F_SEL_Inputs[SHFT0 & SHFT1]; - //printf("FRCL: 0x%08x\n", DSP.FRC_REG); - } - // - // - DSP.Product = ((int64)sign_x_to_s32(13, Y_SEL_Inputs[YSEL]) * X_SEL_Inputs[XSEL]) >> 12; - // if(step < 4) - // printf("%u %08x %08x product=0x%08x\n", step, Y_SEL_Inputs[YSEL], X_SEL_Inputs[XSEL], DSP.Product); - // - // - //if((step == 3 || step == 7) && CRA) - // printf("Step %u: %08x %08x %08x --- ysel=%u cra=0x%02x[0x%04x] temp=0x%08x\n", step, SGA_Inputs[BSEL], Y_SEL_Inputs[YSEL], X_SEL_Inputs[XSEL], YSEL, CRA, DSP.COEF[CRA], TEMP); - - uint32 SGAOutput; - - SGAOutput = SGA_Inputs[BSEL]; - - if(NEGB) - SGAOutput = -SGAOutput; - - if(ZERO) - SGAOutput = 0; - - DSP.SFT_REG = (DSP.Product + SGAOutput) & 0x3FFFFFF; - // - // - if(IWT) - { - DSP.MEMS[IWA] = DSP.ReadValue; - } - // - // - if(DSP.ReadPending) - { - uint16 tmp = RAM[DSP.RWAddr]; - DSP.ReadValue = (DSP.ReadPending == 2) ? (tmp << 8) : dspfloat_to_int(tmp); - DSP.ReadPending = false; - } - else if(DSP.WritePending) - { - if(!(DSP.RWAddr & 0x40000)) - RAM[DSP.RWAddr] = DSP.WriteValue; - - DSP.WritePending = false; - } - - { - uint16 addr; - - addr = DSP.MADRS[MASA]; - addr += NXADDR; - - if(ADRGB) - { - addr += sign_x_to_s32(12, DSP.ADRS_REG); - } - - if(!TABLE) - { - addr += DSP.MDEC_CT; - addr &= (0x2000 << RBL) - 1; - } - - DSP.RWAddr = (addr + (RBP << 12)) & 0x7FFFF; - - if(MRT) - { - DSP.ReadPending = 1 + NOFL; - } - if(MWT) - { - DSP.WritePending = true; - DSP.WriteValue = NOFL ? (ShifterOutput >> 8) : int_to_dspfloat(ShifterOutput); - } - } - // - // - if(ADRL) - { - const uint16 A_SEL_Inputs[2] = { /*INPUTS is sign-extended above */ (uint16)((INPUTS >> 16) & 0xFFF), (uint16)(ShifterOutput >> 12) }; - - DSP.ADRS_REG = A_SEL_Inputs[SHFT0 & SHFT1]; - } - } - - if(!DSP.MDEC_CT) - DSP.MDEC_CT = (0x2000 << RBL); - DSP.MDEC_CT--; -} -// -// -// -INLINE void SS_SCSP::RunSample(int16* outlr) -{ - int32 out_accum[2] = { 0, 0 }; - - for(unsigned i = 0; i < 3; i++) - { - auto* t = &Timers[i]; - bool CCB = (GlobalCounter >> (4 + t->Control)) & 1; - bool DoClock = (t->Control == 0) || (!t->PrevClockIn && CCB); - t->PrevClockIn = CCB; - - - if(DoClock) - { - if(t->Reload >= 0) - { - t->Counter = t->Reload; - t->Reload = -1; - } - else - t->Counter++; - - if(t->Counter == 0xFF) - { - SCIPD |= 0x40 << i; - MCIPD |= 0x40 << i; - } - } - } - - SCIPD |= 0x400; - MCIPD |= 0x400; - RecalcSoundInt(); - RecalcMainInt(); - - // - // - // - RunDSP(); - - for(unsigned i = 0; i < 0x10; i++) - DSP.MIXS[i] = 0; - // - // - // - for(unsigned slot = 0; slot < 32; slot++) - { - uint32 mdata = 0; - auto* s = &Slots[slot]; - unsigned key_eg_scale; - - if(s->KRS == 0xF) - key_eg_scale = 0x00; - else - key_eg_scale = std::max(0x00, std::min(0x0F, s->KRS + (s->Octave ^ 0x8) - 0x8)); - - RunEG(s, key_eg_scale); - - if(KeyExecute && (s->EnvPhase == ENV_PHASE_RELEASE) == s->KeyBit) - { - if(s->KeyBit) - { - s->PhaseWhacker = 0; - s->CurrentAddr = 0; - s->InLoop = false; - s->LoopSub = false; - s->WFAllowAccess = true; - s->EnvPhase = ENV_PHASE_ATTACK; - - if((s->AttackRate + key_eg_scale) >= 0x20) - s->EnvLevel = 0x000; - else - s->EnvLevel = 0x280; - } - else - s->EnvPhase = ENV_PHASE_RELEASE; - } - - // - // - uint16 sample = 0; - - if(s->SourceControl == 1) - sample = LFSR << 8; - - sample ^= SB_XOR_Table[s->SBControl]; // For zero and noise case only; waveform playback needs it to occur before linear interpolation. - - if(1) //s->WFAllowAccess) - { - if(!s->InLoop) - { - if((uint16)(s->CurrentAddr + 1) > s->LoopStart) - { - if(s->LoopMode == 2) - s->LoopSub = true; - - s->InLoop = true; - } - } - else - { - const bool cres = s->LoopSub ? ((uint16)(s->LoopEnd - s->CurrentAddr + s->LoopStart) <= s->LoopStart) : ((uint16)(s->CurrentAddr + 1) > s->LoopEnd); - - if(cres) - { - if(s->LoopMode == 0) - s->WFAllowAccess = false; - - if(s->LoopMode == 3) - s->LoopSub = !s->LoopSub; - - s->CurrentAddr += s->LoopStart - s->LoopEnd; - } - } - } - - if(s->WFAllowAccess) - { - uint32 modalizer; - uint32 tmppw = s->PhaseWhacker; - uint16 tmpa = s->CurrentAddr; - int16 s0, s1; - - // - // - modalizer = (int16)SoundStack[(GlobalCounter + s->ModInputX) & 0x3F]; - modalizer += (int16)SoundStack[(GlobalCounter + s->ModInputY) & 0x3F]; - modalizer >>= 0x10 - s->ModLevel; - - if(s->ModLevel <= 0x04) - modalizer = 0; - - modalizer = sign_x_to_s32(11, modalizer); - // - // - - if(s->LoopSub) - { - tmppw = ~tmppw; - tmpa = s->LoopStart + s->LoopEnd + ~tmpa; - } - - mdata |= ((tmpa >> 12) << 7); - - if(s->WF8Bit) - { - const uint32 addr0 = (s->StartAddr + modalizer + (uint16)(tmpa + 0)) & 0xFFFFF; - const uint32 addr1 = (s->StartAddr + modalizer + (uint16)(tmpa + 1)) & 0xFFFFF; - - s0 = ne16_rbo_be(RAM, addr0) << 8; - s1 = ne16_rbo_be(RAM, addr1) << 8; - } - else - { - s0 = RAM[((s->StartAddr >> 1) + modalizer + (uint16)(tmpa + 0)) & 0x7FFFF]; - s1 = RAM[((s->StartAddr >> 1) + modalizer + (uint16)(tmpa + 1)) & 0x7FFFF]; - } - - s0 ^= SB_XOR_Table[s->SBControl]; - s1 ^= SB_XOR_Table[s->SBControl]; - - if(s->SourceControl == 0) - { - const unsigned sia = (tmppw >> (14 - 6)) & 0x3F; - sample = ((s0 * (0x40 - sia)) + (s1 * sia)) >> 6; - } - - s->PhaseWhacker += (((0x400 ^ s->FreqNum) + GetPLFO(s)) << (s->Octave ^ 0x8)) >> 4; - s->CurrentAddr += s->PhaseWhacker >> 14; - s->PhaseWhacker &= (1U << 14) - 1; - } - // - // - - RunLFO(s); // Run between PLFO fetching and ALFO fetching. - - // Do LFSR clocking between sample fetching and ALFO fetching. - LFSR = (LFSR >> 1) | (((LFSR >> 5) ^ LFSR) & 1) << 16; - - - { - int32 vlevel; - - vlevel = (s->EnvPhase == ENV_PHASE_ATTACK && s->AttackHold) ? 0 : s->EnvLevel; - // - mdata |= (s->EnvPhase << 5) | (vlevel >> 5); - // - if(!s->SoundDirect) - { - vlevel += s->TotalLevel << 2; - vlevel += GetALFO(s); - - if(vlevel > 0x3FF) - vlevel = 0x3FF; - - sample = ((int16)sample * ((vlevel & 0x3F) ^ 0x7F)) >> ((vlevel >> 6) + 7); - } - } - - if(!Slots[(GlobalCounter - 4) & 0x1F].StackWriteInhibit) - { - SoundStack[(GlobalCounter - 4) & 0x3F] = SoundStackDelayer[3]; - } - - SoundStackDelayer[3] = SoundStackDelayer[2]; - SoundStackDelayer[2] = SoundStackDelayer[1]; - SoundStackDelayer[1] = SoundStackDelayer[0]; - SoundStackDelayer[0] = sample; - // - // - if(SlotMonitorWhich == slot) - SlotMonitorData = mdata; - // - // - if(s->ToDSPLevel) - DSP.MIXS[s->ToDSPSelect] = (DSP.MIXS[s->ToDSPSelect] + (((uint32)(int16)sample << 4) >> (7 - s->ToDSPLevel))) & 0xFFFFF; - // - // - out_accum[0] += ((int16)sample * s->DirectVolume[0]) >> 14; - out_accum[1] += ((int16)sample * s->DirectVolume[1]) >> 14; - - { - const uint16 eff_sample = (slot & 0x10) ? ((slot & 0xE) ? 0 : EXTS[slot & 0x1]) : DSP.EFREG[slot]; - - out_accum[0] += ((int16)eff_sample * s->EffectVolume[0]) >> 14; - out_accum[1] += ((int16)eff_sample * s->EffectVolume[1]) >> 14; - } - // - // - GlobalCounter++; - } - - KeyExecute = false; - - // - // - // - out_accum[0] = (out_accum[0] * MasterVolume) >> 8; - out_accum[1] = (out_accum[1] * MasterVolume) >> 8; - - out_accum[0] = std::min(32767, std::max(-32768, out_accum[0])); - out_accum[1] = std::min(32767, std::max(-32768, out_accum[1])); - - if(DAC18bit) - { - // Doesn't seem to improve precision. Remember - // to extend the outlr[] types if this SCSP emulator is used - // in a system that actually has an 18-bit DAC. - out_accum[0] = (uint32)out_accum[0] << 2; - out_accum[1] = (uint32)out_accum[1] << 2; - } - - outlr[0] = out_accum[0]; - outlr[1] = out_accum[1]; -} - -// -// -// -uint32 SS_SCSP::GetRegister(const unsigned id, char* const special, const uint32 special_len) -{ - uint32 ret = 0xDEADBEEF; - - switch(id) - { - case GSREG_MVOL: - ret = MVOL; - break; - - case GSREG_DAC18B: - ret = DAC18bit; - break; - - case GSREG_MEM4MB: - ret = Mem4Mb; - break; - - case GSREG_RBP: - ret = RBP; - break; - - case GSREG_RBL: - ret = RBL; - break; - - case GSREG_MSLC: - ret = SlotMonitorWhich; - break; - } - - return ret; -} - -void SS_SCSP::SetRegister(const unsigned id, const uint32 value) -{ - switch(id) - { - //case GSREG_MVOL: MVOL = value & 0xF; // TODO cache - - case GSREG_DAC18B: - DAC18bit = value & 1; - break; - - case GSREG_MEM4MB: - Mem4Mb = value & 1; - break; - - case GSREG_RBP: - RBP = value & 0x7F; - break; - - case GSREG_RBL: - RBL = value & 0x3; - break; - - case GSREG_MSLC: - SlotMonitorWhich = value & 0x1F; - break; - } -} - diff --git a/waterbox/ss/scu.h b/waterbox/ss/scu.h deleted file mode 100644 index 4e38880110..0000000000 --- a/waterbox/ss/scu.h +++ /dev/null @@ -1,95 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* scu.h: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_SCU_H -#define __MDFN_SS_SCU_H - -namespace MDFN_IEN_SS -{ - -enum -{ - SCU_INT_VBIN = 0x00, - SCU_INT_VBOUT, - SCU_INT_HBIN, - SCU_INT_TIMER0, - SCU_INT_TIMER1, - SCU_INT_DSP, - SCU_INT_SCSP, - SCU_INT_SMPC, - SCU_INT_PAD, - - SCU_INT_L2DMA, - SCU_INT_L1DMA, - SCU_INT_L0DMA, - - SCU_INT_DMA_ILL, - - SCU_INT_VDP1, - - SCU_INT_EXT0 = 0x10, - SCU_INT_EXTF = 0x1F, -}; - -void SCU_Reset(bool powering_up) MDFN_COLD; - -void SCU_SetInt(unsigned which, bool active); -int32 SCU_SetHBVB(int32 pclocks, bool hblank_in, bool vblank_in); - -bool SCU_CheckVDP1HaltKludge(void); - -sscpu_timestamp_t SCU_UpdateDMA(sscpu_timestamp_t timestamp); -sscpu_timestamp_t SCU_UpdateDSP(sscpu_timestamp_t timestamp); - -enum -{ - SCU_GSREG_ILEVEL = 0, - SCU_GSREG_IVEC, - SCU_GSREG_ICLEARMASK, - - SCU_GSREG_IASSERTED, - SCU_GSREG_IPENDING, - SCU_GSREG_IMASK, - - SCU_GSREG_T0CNT, - SCU_GSREG_T0CMP, - SCU_GSREG_T0MET, - - SCU_GSREG_T1RLV, - SCU_GSREG_T1CNT, - SCU_GSREG_T1MOD, - SCU_GSREG_T1MET, - - SCU_GSREG_TENBL, - // - // - // - SCU_GSREG_DSP_EXEC, - SCU_GSREG_DSP_PAUSE, - SCU_GSREG_DSP_PC, - SCU_GSREG_DSP_END, -}; - -uint32 SCU_GetRegister(const unsigned id, char* const special, const uint32 special_len) MDFN_COLD; -void SCU_SetRegister(const unsigned id, const uint32 value) MDFN_COLD; -} - -#endif diff --git a/waterbox/ss/scu.inc b/waterbox/ss/scu.inc deleted file mode 100644 index 6123f55d46..0000000000 --- a/waterbox/ss/scu.inc +++ /dev/null @@ -1,2003 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* scu.inc - SCU Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// TODO: Investigate different instruction dispatch mechanisms for DSP to take advantage of modern branch -// prediction, to improve performance and reduce instruction cache footprint. -// TODO: Test slave SH-2 IRQ handling. -// TODO: Open bus, and correct propagation of open bus from one bus to another. -// TODO: Consider logging DMA status register reads. -// TODO: Test indirect DMA table alignment requirements. -// TODO: Indirect same-bus DMA has kind of weird effects that might actually be useful(and hence used), so test! - -/* - Notes(assuming NTSC, HRES=0, VRES=0, LSMD=0): - Timer0 notes: - Counter is effectively forced to 0 while timer enable bit is 0, but it won't generate an IRQ if T0C is also 0(unless timer enable bit is set - to 1 again)... - - Hrm...T0C of 0-263 causes interrupts. In interlace mode though, 263 causes an interrupt at half the rate... - Timer1 notes: - T1S of 1-426(HRES=0x00) causes interrupt for each line, 0 and 427+ causes it every other line? - - - The effect of writes to MCIEB on the interrupt output signal(as examined indirectly via IST) from the SCSP appears to be delayed somewhat; - is the SCU buffering writes, or is the SCSP, or is it something else entirely? - - Reads from A-bus and B-bus are treated by the SCU as always 32-bit, regardless of the actual size(writes are handled properly, though). - - SCU DMA read from VRAM is reportedly unreliable? - - DMA speed for accesses to A-/B-bus, with the exceptions of A-bus CS2, should be best-case in this code - (writes often take longer on the Saturn if the DMA write address doesn't increment). -*/ - -#include "scu_dsp_common.inc" - -static void DSP_Reset(bool powering_up); - -enum { DMA_UpdateTimingGran = 127 }; - -enum { DSP_UpdateTimingGran = 64 }; // Probably should keep it a multiple of 2. - -struct DMAWriteTabS -{ - int16 write_addr_delta; - uint8 write_size; - uint8 compare; -}; - -static const DMAWriteTabS dma_write_tab[2/*bus*/][8/*add setting*/][4/*write align*/][12/*count*/][5] = -{ - { - #include "scu_actab.inc" - }, - { - #include "scu_btab.inc" - } -}; - -static const DMAWriteTabS dma_write_tab_aciv1[4][24][8] = -{ - #include "scu_aciv1tab.inc" -}; - -static struct DMALevelS -{ - uint32 StartReadAddr; - uint32 StartWriteAddr; - uint32 StartByteCount; - - bool ReadAdd; - uint8 WriteAdd; - - bool Enable; - int8 Active; // -1, 0, 1 - bool GoGoGadget; - - bool Indirect; - bool ReadUpdate; - bool WriteUpdate; - uint8 SF; - - sscpu_timestamp_t FinishTime; - - // - // - // - uint32 (*ReadFunc)(uint32 offset); - uint32 WriteBus; - // - uint32 CurReadBase; - uint32 CurReadSub; - - uint32 CurWriteAddr; - uint32 CurByteCount; - - uint64 Buffer; - // - const DMAWriteTabS* WATable; - // - uint32 (*TableReadFunc)(uint32 offset); // Also serves as a kind of "CurIndirect" cache of "Indirect" variable. - uint32 CurTableAddr; - bool FinalTransfer; -} DMALevel[3]; - -static sscpu_timestamp_t SCU_DMA_TimeCounter; -static sscpu_timestamp_t SCU_DMA_RunUntil; -static int32 SCU_DMA_ReadOverhead; // range -whatever to 0. - -static uint32 SCU_DMA_VDP1WriteIgnoreKludge; - -static void RecalcDMAHalt(void); -static void CheckDMAStart(DMALevelS* d); -static void CheckDMASFByInt(unsigned int_which); -static INLINE void CheckForceDMAFinish(void); - -static uint32 IAsserted; -static uint32 IPending; -static uint32 IMask; - -static uint32 ABusIProhibit; -static bool RSEL; - -static uint8 ILevel, IVec; - -static INLINE void RecalcMasterIntOut(void) -{ - if(ILevel == 0) - { - static const uint8 internal_tab[16 + 1] = - { - 0xF, 0xE, 0xD, 0xC, 0xB, 0xA, 0x9, 0x8, - 0x8, 0x6, 0x6, 0x5, 0x3, 0x2, 0x0, 0x0, - 0x0 - }; - - static const uint8 external_tab[16 + 1] - { - 0x7, 0x7, 0x7, 0x7, 0x4, 0x4, 0x4, 0x4, - 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, - 0x0 - }; - const uint32 ipmd = IPending &~ (int16)IMask; - unsigned wi = MDFN_tzcount16(ipmd & 0xFFFF); - unsigned we = MDFN_tzcount16(ipmd >> 16); - unsigned olev, ovec, bpos; - - olev = internal_tab[wi]; - ovec = 0x40 + wi; - bpos = wi; - - if(external_tab[we] > internal_tab[wi]) - { - olev = external_tab[we]; - ovec = 0x50 + we; - bpos = 16 + we; - } - - if(olev != 0) - { - ILevel = olev; - IVec = ovec; - IPending &= ~(1U << bpos); - //SS_DBGTI(SS_DBG_ERROR, "[SCU] Interrupt level=0x%02x, vector=0x%02x --- IPending=0x%04x", ILevel, IVec, IPending); - } - } - - CPU[0].SetIRL(ILevel); -} - -static int32 Timer0_Counter; -static int32 Timer0_Compare; -static bool Timer0_Met; - -static int32 Timer1_Reload; -static int32 Timer1_Counter; -static bool Timer1_Mode; -static bool Timer1_Met; - -static bool Timer_Enable; - -static bool HB_FromVDP2, VB_FromVDP2; - -static uint8 SCU_MSH2VectorFetch(void) -{ - uint8 ret = IVec; - - //SS_DBGTI(SS_DBG_ERROR, "[SCU] Interrupt cleared."); - - if(MDFN_UNLIKELY(ILevel == 0)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] [MSH2] [BUG] SCU_MSH2VectorFetch() called when ILevel == 0\n"); - } - -// if(MDFN_UNLIKELY(IVec == 0x40 /* || IVec == 0x41 */)) // VB In, apply cheats. -// MDFNMP_ApplyPeriodicCheats(); - - IMask = 0xBFFF; - - ILevel = 0; - RecalcMasterIntOut(); - - return ret; -} - -static uint8 SCU_SSH2VectorFetch(void) -{ - if(VB_FromVDP2) - return 0x43; - - return 0x41; -// return 0xFF; // FIXME? -} - -static INLINE void ABusIRQCheck(void) -{ - const uint32 tt = (ABusIProhibit ^ IAsserted) & (IAsserted & ~0xFFFF); - - IPending |= tt; - ABusIProhibit |= IAsserted & ~0xFFFF; - - if(tt) - RecalcMasterIntOut(); -} - -static INLINE void SetInt(unsigned which, bool active) -{ - const uint32 old_IAsserted = IAsserted; - - IAsserted &= ~(1U << which); - IAsserted |= (unsigned)active << which; - - if(which >= 16) - ABusIRQCheck(); - else - { - if((old_IAsserted ^ IAsserted) & IAsserted) - { - IPending |= 1U << which; - CheckDMASFByInt(which); - RecalcMasterIntOut(); - } - } -} - -void SCU_SetInt(unsigned which, bool active) -{ - SetInt(which, active); -} - -static INLINE void Timer0_Check(void) -{ - if(Timer_Enable) - { - Timer0_Met = (Timer0_Counter == Timer0_Compare); - SetInt(SCU_INT_TIMER0, Timer0_Met); - } -} - -static INLINE void Timer1_Check(void) -{ - if(Timer_Enable) - { - Timer1_Met |= (Timer1_Counter == 0 && (!Timer1_Mode || Timer0_Met)); - SetInt(SCU_INT_TIMER1, Timer1_Met); - } -} - -int32 SCU_SetHBVB(int32 pclocks, bool new_HB_FromVDP2, bool new_VB_FromVDP2) -{ - const bool HB_Start = (HB_FromVDP2 ^ new_HB_FromVDP2) & new_HB_FromVDP2; - const bool VB_End = (VB_FromVDP2 ^ new_VB_FromVDP2) & VB_FromVDP2; - - if(Timer_Enable) - { - if(VB_End) - Timer0_Counter = 0; - - if(HB_Start) - Timer0_Counter = (Timer0_Counter + 1) & 0x1FF; - - Timer0_Check(); - - if(pclocks > 0) - { - Timer1_Counter = (Timer1_Counter - pclocks) & 0x1FF; - Timer1_Check(); - } - - if(Timer1_Met && HB_Start) - { - Timer1_Met = false; - Timer1_Counter = Timer1_Reload; - - SetInt(SCU_INT_TIMER1, Timer1_Met); - } - } - - SetInt(SCU_INT_HBIN, new_HB_FromVDP2); - SetInt(SCU_INT_VBIN, new_VB_FromVDP2); - SetInt(SCU_INT_VBOUT, !new_VB_FromVDP2); - - // - // - CPU[1].SetIRL(((new_VB_FromVDP2 | new_HB_FromVDP2) << 1) | (new_VB_FromVDP2 << 2)); - // - // - // - HB_FromVDP2 = new_HB_FromVDP2; - VB_FromVDP2 = new_VB_FromVDP2; - - return Timer1_Counter ? Timer1_Counter : 0x200; -} - -static void SCU_Init(void) -{ - SCU_DMA_TimeCounter = 0; - SCU_DMA_RunUntil = 0; - IAsserted = 0; - HB_FromVDP2 = false; - VB_FromVDP2 = false; - - DSP_Init(); -} - -void SCU_Reset(bool powering_up) -{ - ILevel = IVec = 0; - IMask = 0xBFFF; - IPending = 0; - ABusIProhibit = 0; - RSEL = 0; - - if(powering_up) - memset(DMALevel, 0x00, sizeof(DMALevel)); - - for(auto& d : DMALevel) - { - d.ReadAdd = true; - d.WriteAdd = 0x1; - - d.Enable = false; - d.GoGoGadget = false; - d.Active = false; - - d.Indirect = false; - d.ReadUpdate = false; - d.WriteUpdate = false; - d.SF = 0; - } - //SCU_DMA_CycleCounter = 0; - SCU_DMA_ReadOverhead = 0; - - SCU_DMA_VDP1WriteIgnoreKludge = 0; - - RecalcDMAHalt(); - - DSP_Reset(powering_up); - - RecalcMasterIntOut(); -} - -static void SCU_AdjustTS(const int32 delta) -{ - SCU_DMA_TimeCounter += delta; - SCU_DMA_RunUntil += delta; - for(auto& d : DMALevel) - { - if(d.Active < 0) - d.FinishTime += delta; - } - - // - // - // - if(DSP.T0_Until > 0x10000000) - DSP.T0_Until = 0x10000000; - - DSP.LastTS += delta; - if(DSP.LastTS < 0) - { - // TODO: Fix properly. - //printf("%d\n", DSP.LastTS); - DSP.LastTS = 0; - } -} - -// -// TODO: Test to see if the entire data bus or only parts are asserted for uint8 and uint16 reads -// -template -static INLINE void SCU_RegRW_DB(uint32 A, uint32* DB) -{ - unsigned mask; - - switch(sizeof(T)) - { - case 1: mask = 0xFF << (((A & 3) ^ 3) << 3); break; - case 2: mask = 0xFFFF << (((A & 2) ^ 2) << 3); break; - case 4: mask = 0xFFFFFFFF; break; - } - - if(IsWrite) - { - SS_DBGTI(SS_DBG_SCU_REGW, "[SCU] %zu-byte write to 0x%02x, DB=0x%08x", sizeof(T), A & 0xFC, *DB); - - switch(A & 0xFC) - { - default: - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Unknown %zu-byte write to 0x%08x(DB=0x%08x).\n", sizeof(T), A, *DB); - break; - - case 0x90: // Timer 0 Compare - { - VDP2::Update(SH7095_mem_timestamp); - Timer0_Compare = (Timer0_Compare &~ mask) | (*DB & mask & 0x3FF); - SS_SetEventNT(&events[SS_EVENT_VDP2], VDP2::Update(SH7095_mem_timestamp)); - } - break; - - case 0x94: // Timer 1 Reload Value - { - VDP2::Update(SH7095_mem_timestamp); - Timer1_Reload = (Timer1_Reload &~ mask) | (*DB & mask & 0x1FF); - SS_SetEventNT(&events[SS_EVENT_VDP2], VDP2::Update(SH7095_mem_timestamp)); - } - break; - - case 0x98: // Timer Control - { - VDP2::Update(SH7095_mem_timestamp); - uint32 tmp = (Timer1_Mode << 8) | (Timer_Enable << 0); - tmp = (tmp &~ mask) | (*DB & mask); - Timer1_Mode = (tmp >> 8) & 1; - Timer_Enable = (tmp >> 0) & 1; - - if(!Timer_Enable) - { - Timer0_Counter = 0; - } - - SS_SetEventNT(&events[SS_EVENT_VDP2], VDP2::Update(SH7095_mem_timestamp)); - } - break; - - case 0xA0: - IMask = (IMask &~ mask) | (*DB & mask & 0xBFFF); - RecalcMasterIntOut(); - break; - - case 0xA4: - IPending &= *DB | ~mask; - RecalcMasterIntOut(); - break; - - case 0xA8: - if(*DB & mask & 0x0001) - { - ABusIProhibit = 0; //&= ~IAsserted; - ABusIRQCheck(); - } - break; - - case 0xC4: - RSEL = (RSEL &~ mask) | (*DB & mask & 0x1); - if(MDFN_UNLIKELY(!RSEL)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Write to RSEL, RSEL=0\n"); - } - break; - - case 0x00: - case 0x20: - case 0x40: - { - auto& d = DMALevel[(A >> 5) & 0x3]; - - d.StartReadAddr = (d.StartReadAddr &~ mask) | (*DB & mask & 0x07FFFFFF); - } - break; - - case 0x04: - case 0x24: - case 0x44: - { - auto& d = DMALevel[(A >> 5) & 0x3]; - - d.StartWriteAddr = (d.StartWriteAddr &~ mask) | (*DB & mask & 0x07FFFFFF); - } - break; - - case 0x08: - case 0x28: - case 0x48: - { - const unsigned level = (A >> 5) & 0x3; - auto& d = DMALevel[level]; - - d.StartByteCount = (d.StartByteCount &~ mask) | (*DB & mask & (level ? 0x00000FFF : 0x000FFFFF)); - } - break; - - case 0x0C: - case 0x2C: - case 0x4C: - { - auto& d = DMALevel[(A >> 5) & 0x3]; - uint32 tmp = (d.ReadAdd << 8) | (d.WriteAdd << 0); - - tmp = (tmp &~ mask) | (*DB & mask); - - d.ReadAdd = (tmp >> 8) & 0x1; - d.WriteAdd = (tmp >> 0) & 0x7; - } - break; - - case 0x10: - case 0x30: - case 0x50: - { - const unsigned level = (A >> 5) & 0x3; - auto& d = DMALevel[level]; - uint32 tmp = (d.Enable << 8); - - tmp = (tmp &~ mask) | (*DB & mask); - d.Enable = (tmp >> 8) & 0x1; - - if((tmp & 0x1) && d.Enable && d.SF == 0x7) - { - SCU_UpdateDMA(SH7095_mem_timestamp); - - d.GoGoGadget = true; - CheckDMAStart(&d); - - SS_SetEventNT(&events[SS_EVENT_SCU_DMA], SCU_UpdateDMA(SH7095_mem_timestamp)); - } - } - break; - - case 0x14: - case 0x34: - case 0x54: - { - auto& d = DMALevel[(A >> 5) & 0x3]; - uint32 tmp = (d.Indirect << 24) | (d.ReadUpdate << 16) | (d.WriteUpdate << 8) | (d.SF << 0); - - tmp = (tmp &~ mask) | (*DB & mask); - - d.Indirect = (tmp >> 24) & 0x1; - d.ReadUpdate = (tmp >> 16) & 0x1; - d.WriteUpdate = (tmp >> 8) & 0x1; - d.SF = (tmp >> 0) & 0x7; - } - break; - - case 0x60: - // TODO: Test - if(*DB & mask & 0x1) - { - SCU_DMA_ReadOverhead = 0; - for(unsigned level = 0; level < 3; level++) - { - auto& d = DMALevel[level]; - - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Forced stop of DMA level %u\n", level); - - d.Active = false; - d.GoGoGadget = false; - } - RecalcDMAHalt(); - } - break; - - case 0x80: - SCU_UpdateDSP(SH7095_mem_timestamp); - - if(*DB & (1U << 25)) // Pause start - DSP.State |= DSPS::STATE_MASK_PAUSE; - else if(*DB & (1U << 26)) // Pause stop - DSP.State &= ~DSPS::STATE_MASK_PAUSE; - else - { - if(*DB & (1U << 16)) // Execute - DSP.State |= DSPS::STATE_MASK_EXECUTE; - else if(!(*DB & (1U << 16))) // Execute stop - { - if(DSP.State & DSPS::STATE_MASK_EXECUTE) - { - DSP.NextInstr = DSP_DecodeInstruction(0); - DSP.State &= ~DSPS::STATE_MASK_EXECUTE; - - if(DSP.CycleCounter < 0) - DSP.CycleCounter = 0; - - if(DSP.T0_Until < 0) - DSP.T0_Until = 0; - } - } - - if(MDFN_UNLIKELY(*DB & (1U << 17))) // Step - { - if(DSP.State == 0) - { - ((void (*)(void))(DSP_INSTR_BASE_UIPT + (uintptr_t)(DSP_INSTR_RECOVER_TCAST)DSP.NextInstr))(); - if(DSP.CycleCounter < -(DSP_EndCCSubVal / 2)) // Ugh - DSP.CycleCounter += DSP_EndCCSubVal; - } - } - } - - if(*DB & (1U << 15)) // PC load - DSP.PC = *DB; - - SS_SetEventNT(&events[SS_EVENT_SCU_DSP], (DSP.IsRunning() ? SH7095_mem_timestamp + (DSP_UpdateTimingGran / 2) : SS_EVENT_DISABLED_TS)); - break; - - case 0x84: - if(!DSP.IsRunning()) - DSP.ProgRAM[DSP.PC++] = DSP_DecodeInstruction(*DB); - break; - - case 0x88: - DSP.RA = *DB; - break; - - case 0x8C: - if(!DSP.IsRunning()) - (&DSP.DataRAM[0][0])[DSP.RA++] = *DB; - break; - } - } - else - { - switch(A & 0xFC) - { - default: - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Unknown %zu-byte read from 0x%08x.\n", sizeof(T), A); - *DB = 0; - break; - - case 0xA4: - *DB = IPending; - break; - - case 0xA8: - *DB = 0; //ABusIAck; - break; - - case 0xC4: - *DB = RSEL; - break; - - case 0xC8: - *DB = 0x4; - break; - // - // - // - case 0x00: - case 0x20: - case 0x40: - { - auto const& d = DMALevel[(A >> 5) & 0x3]; - - *DB = d.StartReadAddr; - } - break; - - case 0x04: - case 0x24: - case 0x44: - { - auto const& d = DMALevel[(A >> 5) & 0x3]; - - *DB = d.StartWriteAddr; - } - break; - - case 0x7C: - { - uint32 tmp = 0; - - for(unsigned level = 0; level < 3; level++) - { - auto& d = DMALevel[level]; - - if(d.Active) - { - tmp |= 0x10 << (level << 2); - } - } - - if(DMALevel[0].Active && (DMALevel[1].Active || DMALevel[2].Active)) - tmp |= 1U << 16; - - if(DMALevel[1].Active && DMALevel[2].Active) - tmp |= 1U << 17; - - *DB = tmp; - } - break; - - case 0x80: - SS_SetEventNT(&events[SS_EVENT_SCU_DSP], SCU_UpdateDSP(SH7095_mem_timestamp)); // TODO: Remove? - { - uint32 tmp; - - tmp = DSP.PC; - tmp |= (DSP.T0_Until < DSP.CycleCounter) << 23; - tmp |= DSP.FlagS << 22; - tmp |= DSP.FlagZ << 21; - tmp |= DSP.FlagC << 20; - tmp |= DSP.FlagV << 19; - tmp |= DSP.FlagEnd << 18; - tmp |= DSP.IsRunning() << 16; - *DB = tmp; - // - DSP.FlagV = false; - DSP.FlagEnd = false; - SCU_SetInt(SCU_INT_DSP, false); - } - break; - - case 0x8C: - if(!DSP.IsRunning()) - *DB = (&DSP.DataRAM[0][0])[DSP.RA++]; - else - *DB = 0xFFFFFFFF; - break; - } - } -} - - -template -static INLINE void BBusRW_DB(uint32 A, uint16* DB, int32* time_thing, int32* dma_time_thing = NULL, int32* sh2_dma_time_thing = NULL) // add to time_thing, subtract from dma_time_thing -{ - static_assert(IsWrite || sizeof(T) == 2, "Wrong type."); - - // - // VDP1 - // - if(A >= 0x05C00000 && A <= 0x05D7FFFF) - { - if(sh2_dma_time_thing != NULL) - *sh2_dma_time_thing -= IsWrite ? (SH32 ? 0 : 6) : 10; - - if(dma_time_thing != NULL) - { - *dma_time_thing -= 1; - - if(IsWrite) - { - if(MDFN_UNLIKELY(A >= 0x05D00000)) - { - const bool ignore_write = (A >= 0x5D00004 && SCU_DMA_VDP1WriteIgnoreKludge > 0) | (SCU_DMA_VDP1WriteIgnoreKludge & 0x1); - - SCU_DMA_VDP1WriteIgnoreKludge++; - if(ignore_write) - return; - //printf("%08x %04x\n", A, *DB); - } - else - SCU_DMA_VDP1WriteIgnoreKludge = 0; - } - } - - if(time_thing != NULL) - { - if(IsWrite) - *time_thing += SH32 ? 0 : 11; - else - *time_thing += 14; - - CheckEventsByMemTS(); - } - - if(IsWrite) - { - if(sizeof(T) == 1) - VDP1::Write8_DB(A, *DB); - else - VDP1::Write16_DB(A, *DB); - } - else - { - *DB = VDP1::Read16_DB(A); - } - - return; - } - - // - // VDP2 - // - if(A >= 0x05E00000 && A <= 0x05FBFFFF) - { - if(sh2_dma_time_thing != NULL) - *sh2_dma_time_thing -= IsWrite ? (SH32 ? 0 : 5) : 10; - - if(dma_time_thing != NULL) - { - *dma_time_thing -= 1; - } - - if(time_thing != NULL) - { - if(IsWrite) - *time_thing += SH32 ? 0 : 5; - else - *time_thing += 20; - - CheckEventsByMemTS(); - } - - if(IsWrite) - { - uint32 expenalty; - - if(sizeof(T) == 1) - expenalty = VDP2::Write8_DB(A, *DB); - else - expenalty = VDP2::Write16_DB(A, *DB); - - if(dma_time_thing != NULL) - { - //if(expenalty) - // printf("%u\n", expenalty); - - *dma_time_thing -= expenalty; - } - } - else - { - *DB = VDP2::Read16_DB(A); - } - - return; - } - - // - // SCSP - // - if(A >= 0x05A00000 && A <= 0x05BFFFFF) - { - if(sh2_dma_time_thing != NULL) - *sh2_dma_time_thing -= 13; - - if(dma_time_thing != NULL) - { - *dma_time_thing -= 13; - } - - if(time_thing != NULL) - { - if(IsWrite) - *time_thing += SH32 ? 13 : 19; - else - *time_thing += 24; - } - - if(IsWrite) - { - if(sizeof(T) == 1) - SOUND_Write8(A & 0x1FFFFF, *DB >> (((A & 1) ^ 1) << 3)); - else - SOUND_Write16(A & 0x1FFFFF, *DB); - } - else - *DB = SOUND_Read16(A & 0x1FFFFF); - - return; - } - // - // - // - if(sh2_dma_time_thing != NULL) - *sh2_dma_time_thing -= 1; - - if(dma_time_thing != NULL) - *dma_time_thing -= 1; - - if(IsWrite) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[B-Bus] Unknown %zu-byte write of 0x%08x(DB=0x%04x)\n", sizeof(T), A, *DB); - else - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[B-Bus] Unknown %zu-byte read from 0x%08x\n", sizeof(T), A); - - *DB = 0; - } -} - -template -static INLINE void ABusRW_DB(uint32 A, uint16* DB, int32* time_thing, int32* dma_time_thing = NULL, int32* sh2_dma_time_thing = NULL) // add to time_thing, subtract from dma_time_thing -{ - // - // A-Bus CS0 and CS1 - // - if(A >= 0x02000000 && A <= 0x04FFFFFF) - { - // [(bool)(A & 0x04000000)] - - if(sh2_dma_time_thing != NULL) - *sh2_dma_time_thing -= 1; // TODO - - if(dma_time_thing != NULL) - *dma_time_thing -= 1; // TODO - - if(IsWrite) - { - if(sizeof(T) == 1) - CART_CS01_Write8_DB(A, DB); - else - CART_CS01_Write16_DB(A, DB); - } - else - CART_CS01_Read16_DB(A, DB); - - return; - } - - // - // A-bus Dummy - // - if(MDFN_UNLIKELY(A >= 0x05000000 && A <= 0x057FFFFF)) - { - if(sh2_dma_time_thing != NULL) - *sh2_dma_time_thing -= 16; - - if(dma_time_thing != NULL) - { - *dma_time_thing -= 16; - } - - if(IsWrite) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[A-Bus CSD] Unknown %zu-byte write to 0x%08x(DB=0x%04x)\n", sizeof(T), A, *DB); - else - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[A-Bus CSD] Unknown %zu-byte read from 0x%08x\n", sizeof(T), A); - - return; - } - - - // - // A-Bus CS2 - // - if(A >= 0x05800000 && A <= 0x058FFFFF) - { - if(sh2_dma_time_thing != NULL) - *sh2_dma_time_thing -= 8; - - if(dma_time_thing != NULL) - { - *dma_time_thing -= 8; - } - - if(time_thing) - { - if(IsWrite) - *time_thing += 8; - else - *time_thing += 8; - } - - if((A & 0x7FFF) < 0x1000) - { - const uint32 offset = (A & 0x3F) >> 2; - const uint32 mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF << (((A & 1) ^ 1) << 3)); - - if(IsWrite) - { - CDB_Write_DBM(offset, *DB, mask); - } - else - { - if(!SH32 || !(A & 0x80000)) // CD block seems to effectively ignore second read access in 32-bit reads somehow, tested to occur HIRQ and the FIFO at least... - *DB = CDB_Read(offset); - } - return; - } - - if(IsWrite) - { - if(sizeof(T) == 1) - CART_CS2_Write8_DB(A, DB); - else - CART_CS2_Write16_DB(A, DB); - } - else - CART_CS2_Read16_DB(A, DB); - - return; - } - - if(sh2_dma_time_thing != NULL) - *sh2_dma_time_thing -= 1; - - if(dma_time_thing != NULL) - *dma_time_thing -= 1; - - if(IsWrite) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[A-Bus] Unknown %zu-byte write to 0x%08x(DB=0x%04x)\n", sizeof(T), A, *DB); - else - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[A-Bus] Unknown %zu-byte read from 0x%08x\n", sizeof(T), A); -} - -template -static INLINE void ABus_Write_DB32(uint32 A, uint32 DB32, int32* time_thing, int32* dma_time_thing = NULL, int32* sh2_dma_time_thing = NULL) -{ - if(sizeof(T) == 4) - { - uint16 tmp; - - tmp = DB32 >> 16; - ABusRW_DB(A, &tmp, time_thing, dma_time_thing, sh2_dma_time_thing); - - tmp = DB32 >> 0; - ABusRW_DB(A | 2, &tmp, time_thing, dma_time_thing, sh2_dma_time_thing); - } - else - { - uint16 tmp = DB32 >> (((A & 2) ^ 2) << 3); - - ABusRW_DB(A, &tmp, time_thing, dma_time_thing, sh2_dma_time_thing); - } -} - -// Lower 2 bits of A should be 0 -static INLINE uint32 ABus_Read(uint32 A, int32* time_thing, int32* dma_time_thing = NULL, int32* sh2_dma_time_thing = NULL) -{ - uint32 ret; - uint16 tmp = 0xFFFF; - - ABusRW_DB(A, &tmp, time_thing, dma_time_thing, sh2_dma_time_thing); - ret = tmp << 16; - - ABusRW_DB(A | 2, &tmp, time_thing, dma_time_thing, sh2_dma_time_thing); - ret |= tmp << 0; - - return ret; -} - -template -static INLINE void SCU_FromSH2_BusRW_DB(uint32 A, uint32* DB, int32* SH2DMAHax) -{ - // - // A bus - // - if(A >= 0x02000000 && A <= 0x058FFFFF) - { - CheckForceDMAFinish(); - - if(IsWrite) - ABus_Write_DB32(A, *DB, SH2DMAHax ? NULL : &SH7095_mem_timestamp, NULL, SH2DMAHax); - else // A-bus reads are always 32-bit(divided into two 16-bit accesses internally) - *DB = ABus_Read(A &~ 0x3, SH2DMAHax ? NULL : &SH7095_mem_timestamp, NULL, SH2DMAHax); - - return; - } - - - // - // B bus - // - if(A >= 0x05A00000 && A <= 0x05FBFFFF) - { - CheckForceDMAFinish(); - - if(IsWrite) - { - if(sizeof(T) == 4) - { - uint16 tmp; - - tmp = *DB >> 16; - BBusRW_DB(A, &tmp, SH2DMAHax ? NULL : &SH7095_mem_timestamp, NULL, SH2DMAHax); - - tmp = *DB >> 0; - BBusRW_DB(A | 2, &tmp, SH2DMAHax ? NULL : &SH7095_mem_timestamp, NULL, SH2DMAHax); - } - else - { - uint16 tmp = *DB >> (((A & 2) ^ 2) << 3); - - BBusRW_DB(A, &tmp, SH2DMAHax ? NULL : &SH7095_mem_timestamp, NULL, SH2DMAHax); - } - } - else // B-bus reads are always 32-bit(divided into two 16-bit accesses internally) - { - uint16 tmp = 0; - - BBusRW_DB(A, &tmp, SH2DMAHax ? NULL : &SH7095_mem_timestamp, NULL, SH2DMAHax); - *DB = tmp << 16; - - BBusRW_DB(A | 2, &tmp, SH2DMAHax ? NULL : &SH7095_mem_timestamp, NULL, SH2DMAHax); - *DB |= tmp << 0; - } - return; - } - - - // - // SCU registers - // - if(A >= 0x05FE0000 && A <= 0x05FEFFFF) - { - if(!SH2DMAHax) - { - SH7095_mem_timestamp += IsWrite ? 4 : 8; - CheckEventsByMemTS(); - } - else - *SH2DMAHax -= IsWrite ? 4 : 8; - - SCU_RegRW_DB(A, DB); - return; - } - - // TODO: (investigate 0x5A80000-0x5AFFFFF open bus region) - // - //if(A >= 0x05A00000 && A <= 0x05BFFFFF) - //{ - // return 0; - //} - - if(IsWrite) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SH2->SCU BUS] Unknown %zu-byte write to 0x%08x(DB=0x%08x)\n", sizeof(T), A, *DB); - else - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SH2->SCU BUS] Unknown %zu-byte read from 0x%08x\n", sizeof(T), A); - - if(!SH2DMAHax) - SH7095_mem_timestamp += IsWrite ? 4 : 7; - else - *SH2DMAHax -= IsWrite ? 4 : 7; -} - - - - - -// -// Offset should have lower 2 bits as 0. -// -static uint32 DMA_ReadABus(uint32 offset) -{ - return ABus_Read(offset, NULL, &SCU_DMA_ReadOverhead); -} - -static uint32 DMA_ReadBBus(uint32 offset) -{ - uint32 ret; - uint16 tmp = 0; - - BBusRW_DB(offset | 0, &tmp, NULL, &SCU_DMA_ReadOverhead); - ret = tmp << 16; - - BBusRW_DB(offset | 2, &tmp, NULL, &SCU_DMA_ReadOverhead); - ret |= tmp << 0; - - return ret; -} - -static uint32 DMA_ReadCBus(uint32 offset) -{ - return ne16_rbo_be(WorkRAMH, offset & 0xFFFFC); -} - -static INLINE int AddressToBus(uint32 A) -{ - int ret = -1; - - if(A >= 0x02000000 && A <= 0x058FFFFF) - ret = 0; - else if(A >= 0x05A00000 && A <= 0x05FBFFFF) - ret = 1; - else if(A >= 0x06000000) - ret = 2; - - return ret; -} - -static uint32 (*const rftab[3])(uint32) = { DMA_ReadABus, DMA_ReadBBus, DMA_ReadCBus }; - -static bool StartDMATransfer(DMALevelS* d, const uint32 ra, const uint32 wa, const uint32 bc) -{ - int rb, wb; - - SCU_DMA_VDP1WriteIgnoreKludge = 0; - - rb = AddressToBus(ra); - wb = AddressToBus(wa); - - SS_DBGTI(SS_DBG_SCU, "[SCU] Starting DMA level %d transfer; ra=0x%08x wa=0x%08x bc=0x%08x - read_inc=%d write_inc=0x%01x - indirect=%d %d", (int)(d - DMALevel), ra, wa, bc, d->ReadAdd, d->WriteAdd, d->Indirect, d->SF); - - if(MDFN_UNLIKELY(rb == -1)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Attempted DMA from illegal address 0x%08x\n", ra); - return false; - } - - if(MDFN_UNLIKELY(wb == -1)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Attempted DMA to illegal address 0x%08x\n", wa); - return false; - } - - if(MDFN_UNLIKELY(rb == wb)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Attempted illegal same-bus DMA from 0x%08x to 0x%08x\n", ra, wa); - return false; - } - - // - // - // - if((wa & 0x1) && wb == 1 && d->WriteAdd != 0x1) - { - // - // This sort of DMA is buggy on real hardware in weird ways(like the bus state controller is getting seriously confused), which we don't emulate. - // - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Sketchy DMA of 0x%08x bytes from 0x%08x to unaligned B-bus address 0x%08x with write add value 0x%02x\n", bc, ra, wa, d->WriteAdd); - } - - if(wb == 0) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Possibly sketchy DMA of 0x%08x bytes from 0x%08x to A-bus address 0x%08x\n", bc, ra, wa); - } - - d->CurReadBase = ra &~ 0x3; - d->CurReadSub = ra & 0x3; - - d->CurWriteAddr = wa; - - d->CurByteCount = bc; - - d->ReadFunc = rftab[rb]; - d->WriteBus = wb; - - d->Buffer = d->ReadFunc(d->CurReadBase); - - if(wb != 0x1 && d->WriteAdd == 0x1) - d->WATable = &dma_write_tab_aciv1[wa & 0x3][(bc < 16) ? bc : (16 | (bc & 0x7))][0]; - else - d->WATable = &dma_write_tab[wb == 1][d->WriteAdd][wa & 0x3][(bc < 12) ? bc : (8 | (bc & 0x3))][0]; - - return true; -} - -static bool NextIndirect(DMALevelS* d) -{ - // count, dest, src - uint32 tmp[3]; - - SS_DBG(SS_DBG_SCU, "[SCU] DMA level %d reading indirect table entries @ 0x%08x\n", (int)(d - DMALevel), d->CurTableAddr); - - for(unsigned i = 0; i < 3; i++) - { - tmp[i] = d->TableReadFunc(d->CurTableAddr); - d->CurTableAddr += (d->ReadAdd ? 4 : 0); - } - - d->FinalTransfer = (bool)(tmp[2] & 0x80000000); - - tmp[0] &= 0xFFFFF; - - if(!tmp[0]) - tmp[0] = 0x100000; - - return StartDMATransfer(d, tmp[2] & 0x07FFFFFF, tmp[1] & 0x07FFFFFF, tmp[0]); -} - -bool SCU_CheckVDP1HaltKludge(void) -{ - bool ret = false; - - for(int level = 2; level >= 0; level--) - { - DMALevelS* d = &DMALevel[level]; - - if(d->Active > 0) - { - if(d->WriteBus == 1 && d->ReadFunc == DMA_ReadCBus && d->CurWriteAddr >= 0x5C00000 && d->CurWriteAddr <= 0x5DFFFFF) - ret = true; - //else if(d->WriteBus == 2 && d->ReadFunc == DMA_ReadBBus && d->CurReadBase >= 0x5C00000 && d->CurReadBase <= 0x5C7FFFF) - // ret = true; - - break; - } - } - - return ret; -} - -static void RecalcDMAHalt(void) -{ - bool Halted = false; - - for(int level = 2; level >= 0; level--) - { - DMALevelS* d = &DMALevel[level]; - - if(d->Active > 0) - { - if(d->WriteBus == 2 || d->ReadFunc == DMA_ReadCBus) - Halted = true; -#if 1 - // - // TODO: See how halting works when a higher-priority DMA A-bus<->B-bus is running at the same time as a lower priority A/B-bus<->C-bus DMA. - // For now, just print a warning message if such a situation occurs. - else - { - for(int sl = level - 1; sl >= 0; sl--) - { - DMALevelS* sld = &DMALevel[sl]; - if(sld->Active && (sld->WriteBus == 2 || sld->ReadFunc == DMA_ReadCBus)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Higher priority A-bus<->B-bus DMA(level %d) running while lower-priority A-/B-bus<->C-bus DMA(level %d) is pending.\n", level, sl); - } - } - } -#endif - break; - } - } - - //fprintf(stderr, "SCU: %d --- %d %d %d\n", Halted, DMALevel[0].Active, DMALevel[1].Active, DMALevel[2].Active); - - CPU[0].SetExtHalt(Halted); - CPU[1].SetExtHalt(Halted); -} - -// TODO: Alter write tables to use -1, 0, 1 for 1, 2, 4 - -static void CheckDMAStart(DMALevelS* d) -{ - if(!d->Active && d->GoGoGadget) - { - d->GoGoGadget = false; - d->FinalTransfer = true; - d->TableReadFunc = NULL; - - if(d->Indirect) - { - int tb; - - d->CurTableAddr = d->StartWriteAddr & 0x07FFFFFC; // Tested, lower 2 bits are 0 on DMA end when write address update enabled. - tb = AddressToBus(d->CurTableAddr); - - if(tb < 0) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Invalid DMA indirect mode table address 0x%08x\n", d->CurTableAddr); - else - { - d->TableReadFunc = rftab[tb]; - - if(NextIndirect(d)) - { - d->Active = true; - RecalcDMAHalt(); - } - } - } - else - { - if(!StartDMATransfer(d, d->StartReadAddr, d->StartWriteAddr, (!d->StartByteCount) ? ((d - DMALevel) ? 0x1000 : 0x100000) : d->StartByteCount)) - { - SCU_SetInt(SCU_INT_DMA_ILL, true); - SCU_SetInt(SCU_INT_DMA_ILL, false); - } - else - { - d->Active = true; - RecalcDMAHalt(); - } - } - } -} - -static void CheckDMASFByInt(unsigned int_which) -{ - static const uint8 sf_to_int_tab[7] = - { - SCU_INT_VBIN, SCU_INT_VBOUT, SCU_INT_HBIN, SCU_INT_TIMER0, - SCU_INT_TIMER1, SCU_INT_SCSP, SCU_INT_VDP1 - }; - - for(unsigned level = 0; level < 3; level++) - { - auto& d = DMALevel[level]; - - if(d.Enable && d.SF < 0x7 && sf_to_int_tab[d.SF] == int_which) - { - d.GoGoGadget = true; - CheckDMAStart(&d); - } - } -} - -template -static INLINE uint32 DMA_Read(DMALevelS* d) -{ - int shift = ((0x3 ^ (d->CurReadSub & 0x3)) - (0x3 ^ (d->CurWriteAddr & 0x3 & (4 - count)))) * 8; - - //printf("Read: CurReadSub=0x%02x, CurWriteAddr=0x%08x, count=%zu --- ", d->CurReadSub, d->CurWriteAddr, count); - - d->CurReadSub += count; - if(d->CurReadSub > 4) - { - if((d->CurReadSub - count) < 4) - shift += 32; - - d->CurReadSub -= 4; //&= 0x3; - d->CurReadBase += (d->ReadAdd ? 4 : 0); - // - SCU_DMA_TimeCounter -= SCU_DMA_ReadOverhead; - SCU_DMA_ReadOverhead = 0; - uint32 tmp = d->ReadFunc(d->CurReadBase); - d->Buffer <<= 32; - d->Buffer |= tmp; - } - - //printf("buffer=%016llx, shift=%d\n", (uint64)d->Buffer, shift); - - if(shift > 0) - return d->Buffer >> shift; - else - return d->Buffer << -shift; -} - -template -static INLINE void DMA_Write(DMALevelS* d, uint32 DB) -{ - const uint32 A = d->CurWriteAddr &~ (sizeof(T) - 1); - int32 WriteOverhead = 0; - - //printf("Write: %zu %08x %08x\n", sizeof(T), A, DB); - if(WriteBus == 0) - { - ABus_Write_DB32(A, DB, NULL, &WriteOverhead); - } - else if(WriteBus == 1) - { - uint16 DB16; - - DB16 = DB >> (((A & 0x2) ^ 0x2) * 8); - BBusRW_DB(A, &DB16, NULL, &WriteOverhead); - } - else - { - ne16_wbo_be(WorkRAMH, A & 0xFFFFF, DB >> (((A & 3) ^ (4 - sizeof(T))) << 3)); - } - - SCU_DMA_TimeCounter -= WriteOverhead; - SCU_DMA_ReadOverhead = std::min(0, SCU_DMA_ReadOverhead - WriteOverhead); - d->CurByteCount -= sizeof(T); -} - -template -static bool NO_INLINE DMA_Loop(DMALevelS* d) -{ - while(MDFN_LIKELY(d->Active > 0 && SCU_DMA_TimeCounter < SCU_DMA_RunUntil)) - { - switch(d->WATable->write_size) - { - case 0x1: DMA_Write (d, DMA_Read<1>(d)); break; - case 0x2: DMA_Write(d, DMA_Read<2>(d)); break; - case 0x4: DMA_Write(d, DMA_Read<4>(d)); break; - } - d->CurWriteAddr += d->WATable->write_addr_delta; - - if(d->CurByteCount <= (uint32)(int8)d->WATable->compare) - d->WATable++; - - if(MDFN_UNLIKELY(!d->CurByteCount)) - { - SCU_DMA_TimeCounter -= SCU_DMA_ReadOverhead; - SCU_DMA_ReadOverhead = 0; - return true; - } - } - - return false; -} - -// -// TODO: Check start read/write address updating when wrapping to next bus or beyond end of SDRAM. -// -static INLINE void UpdateDMAInner(DMALevelS* d) -{ - static bool (*const LoopFuncs[3])(DMALevelS*) = { DMA_Loop<0>, DMA_Loop<1>, DMA_Loop<2> }; - - if(MDFN_UNLIKELY(LoopFuncs[d->WriteBus](d))) - { - if(d->TableReadFunc && !d->FinalTransfer) - { - NextIndirect(d); - } - else - { - if(d->ReadUpdate && !d->TableReadFunc) - d->StartReadAddr = (d->CurReadBase + d->CurReadSub) & 0x07FFFFFF; - - if(d->WriteUpdate) - { - if(d->TableReadFunc) - d->StartWriteAddr = d->CurTableAddr & 0x07FFFFFF; - else - d->StartWriteAddr = d->CurWriteAddr & 0x07FFFFFF; - } - - d->FinishTime = SCU_DMA_TimeCounter; - d->Active = -1; - } - } -} - -static void SCU_DoDMAEnd(const unsigned level) -{ - static const unsigned itab[3] = { SCU_INT_L0DMA, SCU_INT_L1DMA, SCU_INT_L2DMA }; - //printf("FIN: %08x %08x %u\n", d->CurReadBase, d->CurReadSub, d->ReadUpdate); - DMALevel[level].Active = false; - RecalcDMAHalt(); - SCU_SetInt(itab[level], true); - SCU_SetInt(itab[level], false); - CheckDMAStart(&DMALevel[level]); -} - -sscpu_timestamp_t SCU_UpdateDMA(sscpu_timestamp_t timestamp) -{ - if(timestamp < SH7095_mem_timestamp) - return SH7095_mem_timestamp; - // - // - // - SCU_DMA_TimeCounter = std::max(std::min(SCU_DMA_RunUntil, timestamp), SCU_DMA_TimeCounter); - SCU_DMA_RunUntil = timestamp + DMA_UpdateTimingGran; - - for(int level = 2; level >= 0; level--) - { - DMALevelS* d = &DMALevel[level]; - - while(d->Active && SCU_DMA_TimeCounter < SCU_DMA_RunUntil) - { - UpdateDMAInner(d); - - if(MDFN_UNLIKELY(d->Active < 0)) - { - if(MDFN_UNLIKELY(timestamp >= d->FinishTime)) - SCU_DoDMAEnd(level); - else - return d->FinishTime; - } - } - } - - return SCU_DMA_RunUntil; -} - -// -// Check to see if DMA is active, and if so, force the highest-priority DMA -// to finish early(kind of hacky). -// -static NO_INLINE void ForceDMAFinish(void) -{ - for(int level = 2; level >= 0; level--) - { - if(!DMALevel[level].Active) - continue; - - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Forcing hacky early DMA level %d completion.\n", level); - - if(DMALevel[level].Active > 0) - { - const sscpu_timestamp_t rus = SCU_DMA_RunUntil; - // - SCU_DMA_RunUntil = 0x7FFFFFFF; - UpdateDMAInner(&DMALevel[level]); - // - SCU_DMA_RunUntil = rus; - } - - if(DMALevel[level].Active < 0) - SCU_DoDMAEnd(level); - - break; - } - - SCU_DMA_TimeCounter = SCU_DMA_RunUntil; -} - -static INLINE void CheckForceDMAFinish(void) -{ - if(MDFN_LIKELY(!(DMALevel[0].Active | DMALevel[1].Active | DMALevel[2].Active))) - return; - - ForceDMAFinish(); -} - -// -// -// -DSPS DSP; - -sscpu_timestamp_t SCU_UpdateDSP(sscpu_timestamp_t timestamp) -{ - int32 cycles = timestamp - DSP.LastTS; - DSP.LastTS = timestamp; - // - // - // - DSP.T0_Until += cycles; // Overflow prevented in SCU_ResetTS - DSP.CycleCounter += cycles; - if(DSP.CycleCounter > DSP_UpdateTimingGran) - DSP.CycleCounter = DSP_UpdateTimingGran; - - if(MDFN_UNLIKELY(!DSP.IsRunning())) - return SS_EVENT_DISABLED_TS; - - while(MDFN_LIKELY(DSP.CycleCounter > 0)) - { - //printf("%02x %16llx\n", DSP.PC, DSP.NextInstr); - ((void (*)(void))(DSP_INSTR_BASE_UIPT + (uintptr_t)(DSP_INSTR_RECOVER_TCAST)DSP.NextInstr))(); - DSP.CycleCounter -= 2; - } - - if(MDFN_UNLIKELY(!DSP.IsRunning())) - { - DSP.CycleCounter += DSP_EndCCSubVal; - return SS_EVENT_DISABLED_TS; - } - - return timestamp + DSP_UpdateTimingGran; -} - -static void DSP_Reset(bool powering_up) -{ - DSP.State = 0; - DSP.T0_Until = 0x10000000; - DSP.CycleCounter = 0; - - if(powering_up) - { - for(unsigned i = 0; i < 256; i++) - DSP.ProgRAM[i] = DSP_DecodeInstruction(0); - - for(unsigned i = 0; i < 256; i++) - (&DSP.DataRAM[0][0])[i] = 0; - } - - DSP.PC = 0; - DSP.RA = 0; - DSP.FlagZ = false; - DSP.FlagS = false; - DSP.FlagV = false; - DSP.FlagC = false; - DSP.FlagEnd = false; - SCU_SetInt(SCU_INT_DSP, false); - - DSP.NextInstr = DSP_DecodeInstruction(0); - - DSP.TOP = 0; - DSP.LOP = 0; - - DSP.AC.T = 0; - DSP.P.T = 0; - - for(unsigned i = 0; i < 4; i++) - DSP.CT[i] = 0; - - DSP.RX = 0; - DSP.RY = 0; - - DSP.RAO = 0; - DSP.WAO = 0; -} - -void DSP_Init(void) -{ - DSP.LastTS = 0; - - for(auto* f : DSP_GenFuncTable) - assert((uintptr_t)f == DSP_INSTR_BASE_UIPT + ((uintptr_t)(DSP_INSTR_RECOVER_TCAST)(uint32)((uintptr_t)f - DSP_INSTR_BASE_UIPT))); - - for(auto* f : DSP_DMAFuncTable) - assert((uintptr_t)f == DSP_INSTR_BASE_UIPT + ((uintptr_t)(DSP_INSTR_RECOVER_TCAST)(uint32)((uintptr_t)f - DSP_INSTR_BASE_UIPT))); - - for(auto* f : DSP_MVIFuncTable) - assert((uintptr_t)f == DSP_INSTR_BASE_UIPT + ((uintptr_t)(DSP_INSTR_RECOVER_TCAST)(uint32)((uintptr_t)f - DSP_INSTR_BASE_UIPT))); - - for(auto* f : DSP_JMPFuncTable) - assert((uintptr_t)f == DSP_INSTR_BASE_UIPT + ((uintptr_t)(DSP_INSTR_RECOVER_TCAST)(uint32)((uintptr_t)f - DSP_INSTR_BASE_UIPT))); - - for(auto* f : DSP_MiscFuncTable) - assert((uintptr_t)f == DSP_INSTR_BASE_UIPT + ((uintptr_t)(DSP_INSTR_RECOVER_TCAST)(uint32)((uintptr_t)f - DSP_INSTR_BASE_UIPT))); -} - -template -static NO_INLINE NO_CLONE void DMAInstr(void) -{ - const uint32 instr = DSP_InstrPre(); - const unsigned add_mode = (instr >> 15) & 0x7; - uint8 count; // 0 = 256 - - if(DSP.T0_Until < DSP.CycleCounter) - DSP.CycleCounter = DSP.T0_Until &~ 1; - - DSP.T0_Until = DSP.CycleCounter; - - if(format) - { - const unsigned crw = instr & 0x3; - const bool ctinc = instr & 0x4; - - count = DSP.DataRAM[crw][DSP.CT[crw]] & 0xFF; - DSP.CT[crw] = (DSP.CT[crw] + ctinc) & 0x3F; - } - else - count = instr & 0xFF; - - //printf("%02x %08x Count: %u\n", DSP.PC, instr, count); - //SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] DSP DMA; looped=%u, add_mode=0x%01x, hold=%u, format=%u, dir=%u, drw=0x%02x -- count=%u, RAO=0x%08x, WAO=0x%08x\n", looped, add_mode, hold, format, dir, drw, count, DSP.RAO, DSP.WAO); - - if(dir) - { - const uint32 addr_add_amount = (1 << add_mode) &~ 1; - uint32 addr = (DSP.WAO << 2) & 0x07FFFFFF; - const int WriteBus = AddressToBus(addr); - - if(MDFN_UNLIKELY(WriteBus == -1)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Bad DSP DMA to 0x%08x --- Instr=0x%08x, Next_Instr=0x%08x, PC=0x%02x\n", addr, instr, (unsigned)(DSP.NextInstr >> 32), DSP.PC); - return; - } - - // Read from data RAM, write to external bus - do - { - uint32 DB; - - if(drw & 0x4) - DB = 0xFFFFFFFF; - else - { - DB = DSP.DataRAM[drw][DSP.CT[drw]]; - DSP.CT[drw] = (DSP.CT[drw] + 1) & 0x3F; - } - - if(WriteBus == 2) - { - ne16_wbo_be(WorkRAMH, addr & 0xFFFFC, DB); - addr += addr_add_amount; - DSP.T0_Until -= 2; - } - else if(WriteBus == 1) - { - uint16 DB16; - - DB16 = DB >> 16; - BBusRW_DB(addr, &DB16, NULL, &DSP.T0_Until); - - addr += addr_add_amount; - - DB16 = DB; - BBusRW_DB(addr, &DB16, NULL, &DSP.T0_Until); - - addr += addr_add_amount; - } - else if(WriteBus == 0) - { - ABus_Write_DB32(addr, DB, NULL, &DSP.T0_Until); - - addr += addr_add_amount; - } - } while(--count); - - if(!hold) - DSP.WAO = (addr + 2) >> 2; - } - else - { - const uint32 addr_add_amount = (1 << (add_mode & 0x2)) &~ 1; - uint32 addr = (DSP.RAO << 2) & 0x07FFFFFF; - const int ReadBus = AddressToBus(addr); - - if(MDFN_UNLIKELY(ReadBus == -1)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] Bad DSP DMA from 0x%08x --- Instr=0x%08x, Next_Instr=0x%08x, PC=0x%02x\n", addr, instr, (unsigned)(DSP.NextInstr >> 32), DSP.PC); - return; - } - - if(drw & 0x4) - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] DSP DMA from 0x%08x to %s --- Instr=0x%08x, Next_Instr=0x%08x, PC=0x%02x\n", addr, ((drw == 0x4) ? "program RAM" : "unknown"), instr, (unsigned)(DSP.NextInstr >> 32), DSP.PC); - - // Read from external bus, write to data RAM or program RAM - do - { - uint32 DB = 0; - - if(ReadBus == 2) - { - DB = ne16_rbo_be(WorkRAMH, addr & 0xFFFFF); - DSP.T0_Until -= 2; - } - else if(ReadBus == 1) - { - uint16 tmp = 0; - - BBusRW_DB(addr | 0, &tmp, NULL, &DSP.T0_Until); - DB = tmp << 16; - - BBusRW_DB(addr | 2, &tmp, NULL, &DSP.T0_Until); - DB |= tmp << 0; - } - else if(ReadBus == 0) - DB = ABus_Read(addr, NULL, &DSP.T0_Until); - - addr += addr_add_amount; - - if(drw & 0x4) - { - if(!(drw & 0x3)) - { - DSP.ProgRAM[DSP.PC++] = DSP_DecodeInstruction(DB); - } - } - else - { - DSP.DataRAM[drw][DSP.CT[drw]] = DB; - DSP.CT[drw] = (DSP.CT[drw] + 1) & 0x3F; - } - } while(--count); - - if(!hold) - DSP.RAO = addr >> 2; - } -} - -extern void (*const DSP_DMAFuncTable[2][8][8])(void) = -{ - #include "scu_dsp_dmatab.inc" -}; - -// -// -// -// -// -// -uint32 SCU_DSP_PeekProgRAM(uint8 A) -{ - return DSP.ProgRAM[A] >> 32; -} - -uint32 SCU_GetRegister(const unsigned id, char* const special, const uint32 special_len) -{ - uint32 ret = 0xDEADBEEF; - - switch(id) - { - case SCU_GSREG_ILEVEL: - ret = ILevel; - break; - - case SCU_GSREG_IVEC: - ret = IVec; - break; - - case SCU_GSREG_IASSERTED: - ret = IAsserted; - break; - - case SCU_GSREG_IPENDING: - ret = IPending; - break; - - case SCU_GSREG_IMASK: - ret = IMask; - break; - - case SCU_GSREG_T0CNT: - ret = Timer0_Counter; - break; - - case SCU_GSREG_T0CMP: - ret = Timer0_Compare; - break; - - case SCU_GSREG_T0MET: - ret = Timer0_Met; - break; - - case SCU_GSREG_T1RLV: - ret = Timer1_Reload; - break; - - case SCU_GSREG_T1CNT: - ret = Timer1_Counter; - break; - - case SCU_GSREG_T1MOD: - ret = Timer1_Mode; - break; - - case SCU_GSREG_T1MET: - ret = Timer1_Met; - break; - - case SCU_GSREG_TENBL: - ret = Timer_Enable; - break; - - case SCU_GSREG_DSP_EXEC: - ret = (bool)(DSP.State & DSPS::STATE_MASK_EXECUTE); - break; - - case SCU_GSREG_DSP_PAUSE: - ret = (bool)(DSP.State & DSPS::STATE_MASK_PAUSE); - break; - - case SCU_GSREG_DSP_PC: - ret = DSP.PC; - break; - - case SCU_GSREG_DSP_END: - ret = DSP.FlagEnd; - break; - } - return ret; -} - -void SCU_SetRegister(const unsigned id, const uint32 value) -{ - switch(id) - { - case SCU_GSREG_IPENDING: - IPending = value & 0xFFFF3FFF; - break; - - case SCU_GSREG_IMASK: - IMask = value & 0xBFFF; - break; - // - case SCU_GSREG_T0CNT: - //Timer0_Counter = value & 0x1FF; - break; - - case SCU_GSREG_T0CMP: - Timer0_Compare = value & 0x3FF; - break; - - case SCU_GSREG_T0MET: - //Timer0_Met = value & 0x1; - break; - - case SCU_GSREG_T1RLV: - Timer1_Reload = value & 0x1FF; - break; - - case SCU_GSREG_T1CNT: - //Timer1_Counter = value & 0x1FF; - break; - - case SCU_GSREG_T1MOD: - Timer1_Mode = value & 0x1; - break; - - case SCU_GSREG_T1MET: - //Timer1_Met = value & 0x1; - break; - - case SCU_GSREG_TENBL: - Timer_Enable = value & 0x1; - break; - // - - } - - // Not quite right: -#if 0 - Timer0_Check(); - Timer1_Check(); - SCU_SetHBVB(0, HB_FromVDP2, VB_FromVDP2); -#endif - - RecalcMasterIntOut(); -} - diff --git a/waterbox/ss/scu_aciv1tab.inc b/waterbox/ss/scu_aciv1tab.inc deleted file mode 100644 index 5a49cd445e..0000000000 --- a/waterbox/ss/scu_aciv1tab.inc +++ /dev/null @@ -1,112 +0,0 @@ - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x4, 0x00 }, }, - /* 5 */ { { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 2, 0x4, 0x00 }, }, - /* 9 */ { { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 2, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 12 */ { { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 13 */ { { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 14 */ { { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 15 */ { { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 16 */ { { 2, 0x4, 0x00 }, }, - /* 17 */ { { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 18 */ { { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 19 */ { { 2, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 20 */ { { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 21 */ { { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 22 */ { { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 23 */ { { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 12 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 13 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 14 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 15 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x08 }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 16 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 17 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 18 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 19 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 20 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 21 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 22 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 23 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0xff }, { 2, 0x4, 0x08 }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 2, 0x2, 0x00 }, }, - /* 5 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 7 */ { { 2, 0x2, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 2, 0x2, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 9 */ { { 2, 0x2, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x00 }, }, - /* 11 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 12 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 13 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 14 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 15 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 16 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 17 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 18 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x00 }, }, - /* 19 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 20 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 21 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 22 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 23 */ { { 2, 0x2, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 12 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x07 }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 13 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 14 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 15 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 16 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x07 }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 17 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x00 }, }, - /* 18 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 19 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 20 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x07 }, { 2, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 21 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 22 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x05 }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 23 */ { { 1, 0x1, 0xff }, { 2, 0x4, 0x06 }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - }, - diff --git a/waterbox/ss/scu_actab.inc b/waterbox/ss/scu_actab.inc deleted file mode 100644 index b72a347562..0000000000 --- a/waterbox/ss/scu_actab.inc +++ /dev/null @@ -1,479 +0,0 @@ -/*dest_raw_inc=0x00 */ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x4, 0x00 }, }, - /* 5 */ { { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 9 */ { { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 0, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1 */ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - }, - - /*dest_align=2 */ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { -2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { -2, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 5 */ { { -2, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { -2, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 7 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 9 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 11 */ { { -2, 0x2, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=3 */ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { -3, 0x1, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 3 */ { { -3, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { -3, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { -3, 0x1, 0xff }, { 4, 0x4, 0x00 }, }, - /* 6 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 10 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { -3, 0x1, 0xff }, { 0, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x01 (handled in scu_aciv1tab.inc) */ -{ -}, - -/*dest_raw_inc=0x02*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x4, 0x00 }, }, - /* 5 */ { { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 4, 0x4, 0x00 }, }, - /* 9 */ { { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 4, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 2, 0x2, 0x00 }, }, - /* 5 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 7 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 9 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 11 */ { { 2, 0x2, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 4, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x03*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x4, 0x00 }, }, - /* 5 */ { { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 8, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 8, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 9 */ { { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 8, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 6, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 6, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 5 */ { { 6, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 6, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 7 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 9 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 11 */ { { 6, 0x2, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 5, 0x1, 0xff }, { 1, 0x1, 0x00 }, }, - /* 3 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 5, 0x1, 0xff }, { 4, 0x4, 0x00 }, }, - /* 6 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 10 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 5, 0x1, 0xff }, { 8, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x04*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x4, 0x00 }, }, - /* 5 */ { { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 16, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 16, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 9 */ { { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 16, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 14, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 14, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 5 */ { { 14, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 14, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 7 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 9 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 11 */ { { 14, 0x2, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 13, 0x1, 0xff }, { 1, 0x1, 0x00 }, }, - /* 3 */ { { 13, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 13, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 13, 0x1, 0xff }, { 4, 0x4, 0x00 }, }, - /* 6 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 10 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 13, 0x1, 0xff }, { 16, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x05*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x4, 0x00 }, }, - /* 5 */ { { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 32, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 32, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 9 */ { { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 32, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 30, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 30, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 5 */ { { 30, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 30, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 7 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 9 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 11 */ { { 30, 0x2, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 29, 0x1, 0xff }, { 1, 0x1, 0x00 }, }, - /* 3 */ { { 29, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 29, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 29, 0x1, 0xff }, { 4, 0x4, 0x00 }, }, - /* 6 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 10 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 29, 0x1, 0xff }, { 32, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x06*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x4, 0x00 }, }, - /* 5 */ { { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 64, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 64, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 9 */ { { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 64, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 62, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 62, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 5 */ { { 62, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 62, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 7 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 9 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 11 */ { { 62, 0x2, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 61, 0x1, 0xff }, { 1, 0x1, 0x00 }, }, - /* 3 */ { { 61, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 61, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 61, 0x1, 0xff }, { 4, 0x4, 0x00 }, }, - /* 6 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 10 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 61, 0x1, 0xff }, { 64, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x07*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x4, 0x00 }, }, - /* 5 */ { { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 128, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 128, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 9 */ { { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 128, 0x4, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 126, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 126, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 5 */ { { 126, 0x2, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 126, 0x2, 0xff }, { 4, 0x4, 0x00 }, }, - /* 7 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 9 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 11 */ { { 126, 0x2, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 125, 0x1, 0xff }, { 1, 0x1, 0x00 }, }, - /* 3 */ { { 125, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 125, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 125, 0x1, 0xff }, { 4, 0x4, 0x00 }, }, - /* 6 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x03 }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x04 }, { 4, 0x4, 0x00 }, }, - /* 10 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 125, 0x1, 0xff }, { 128, 0x4, 0x02 }, { 2, 0x2, 0x00 }, }, - }, -}, diff --git a/waterbox/ss/scu_btab.inc b/waterbox/ss/scu_btab.inc deleted file mode 100644 index c6825f39d2..0000000000 --- a/waterbox/ss/scu_btab.inc +++ /dev/null @@ -1,542 +0,0 @@ -/*dest_raw_inc=0x00 */ -{ - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 0, 0x2, 0x02 }, { 4, 0x2, 0x02 }, }, - /* 5 */ { { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 0, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 0, 0x2, 0x02 }, { 4, 0x2, 0x02 }, }, - /* 9 */ { { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 0, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x02 }, { 4, 0x2, 0x02 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x03 }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { -2, 0x2, 0xff }, { 0, 0x2, 0x02 }, { 4, 0x2, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 0, 0x2, 0xff }, { -1, 0x1, 0x00 }, }, - /* 4 */ { { 0, 0x2, 0x00 }, }, - /* 5 */ { { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 0, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 8 */ { { 0, 0x2, 0x00 }, }, - /* 9 */ { { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 0, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { -1, 0x1, 0xff }, { -1, 0x1, 0x00 }, }, - /* 3 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x00 }, }, - /* 4 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 7 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x00 }, }, - /* 8 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 11 */ { { -1, 0x1, 0xff }, { 0, 0x2, 0x00 }, }, - }, -}, - - -/*dest_raw_inc=0x01*/ -{ - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 2, 0x2, 0x00 }, }, - /* 5 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 2, 0x2, 0x00 }, }, - /* 7 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 2, 0x2, 0x00 }, }, - /* 9 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 2, 0x2, 0x00 }, }, - /* 11 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 4 */ { { 2, 0x2, 0x00 }, }, - /* 5 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 2, 0x2, 0x00 }, }, - /* 7 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 8 */ { { 2, 0x2, 0x00 }, }, - /* 9 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 2, 0x2, 0x00 }, }, - /* 11 */ { { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 1, 0x1, 0x00 }, }, - /* 3 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 4 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 7 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 8 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 11 */ { { 1, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x02*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 6, 0x2, 0xff }, { -3, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x2, 0xff }, { 0, 0x2, 0x00 }, }, - /* 5 */ { { 4, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 4, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 4, 0x2, 0x03 }, { 6, 0x2, 0x01 }, { -3, 0x1, 0x00 }, }, - /* 8 */ { { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 9 */ { { 4, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 4, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 4, 0x2, 0x03 }, { 6, 0x2, 0x01 }, { -3, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 5, 0x1, 0xff }, { -3, 0x1, 0x00 }, }, - /* 3 */ { { 5, 0x1, 0xff }, { -2, 0x2, 0x00 }, }, - /* 4 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 6, 0x2, 0xff }, { -3, 0x1, 0x00 }, }, - /* 7 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0xff }, { 0, 0x2, 0x00 }, }, - /* 8 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0x03 }, { 6, 0x2, 0x01 }, { -3, 0x1, 0x00 }, }, - /* 11 */ { { 5, 0x1, 0xff }, { 2, 0x2, 0xff }, { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 4, 0x2, 0xff }, { -1, 0x1, 0x00 }, }, - /* 4 */ { { 4, 0x2, 0xff }, { 0, 0x2, 0x00 }, }, - /* 5 */ { { 4, 0x2, 0x01 }, { -3, 0x1, 0x00 }, }, - /* 6 */ { { 4, 0x2, 0x02 }, { -2, 0x2, 0x00 }, }, - /* 7 */ { { 4, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 8 */ { { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 9 */ { { 4, 0x2, 0x01 }, { -3, 0x1, 0x00 }, }, - /* 10 */ { { 4, 0x2, 0x02 }, { -2, 0x2, 0x00 }, }, - /* 11 */ { { 4, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 7, 0x1, 0xff }, { -1, 0x1, 0x00 }, }, - /* 3 */ { { 7, 0x1, 0xff }, { 0, 0x2, 0x00 }, }, - /* 4 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0xff }, { -3, 0x1, 0x00 }, }, - /* 5 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0xff }, { -2, 0x2, 0x00 }, }, - /* 6 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 7 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 8 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x01 }, { -3, 0x1, 0x00 }, }, - /* 9 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x02 }, { -2, 0x2, 0x00 }, }, - /* 10 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 11 */ { { 7, 0x1, 0xff }, { 4, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x03*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 10, 0x2, 0xff }, { -7, 0x1, 0x00 }, }, - /* 4 */ { { 8, 0x2, 0xff }, { -4, 0x2, 0x00 }, }, - /* 5 */ { { 8, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 8, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 8, 0x2, 0x03 }, { 10, 0x2, 0x01 }, { -7, 0x1, 0x00 }, }, - /* 8 */ { { 8, 0x2, 0x02 }, { -4, 0x2, 0x00 }, }, - /* 9 */ { { 8, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 8, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 8, 0x2, 0x03 }, { 10, 0x2, 0x01 }, { -7, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 9, 0x1, 0xff }, { -7, 0x1, 0x00 }, }, - /* 3 */ { { 9, 0x1, 0xff }, { -6, 0x2, 0x00 }, }, - /* 4 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 10, 0x2, 0xff }, { -7, 0x1, 0x00 }, }, - /* 7 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0xff }, { -4, 0x2, 0x00 }, }, - /* 8 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0x03 }, { 10, 0x2, 0x01 }, { -7, 0x1, 0x00 }, }, - /* 11 */ { { 9, 0x1, 0xff }, { 6, 0x2, 0xff }, { 8, 0x2, 0x02 }, { -4, 0x2, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 8, 0x2, 0xff }, { -1, 0x1, 0x00 }, }, - /* 4 */ { { 8, 0x2, 0xff }, { 0, 0x2, 0x00 }, }, - /* 5 */ { { 8, 0x2, 0x01 }, { -7, 0x1, 0x00 }, }, - /* 6 */ { { 8, 0x2, 0x02 }, { -6, 0x2, 0x00 }, }, - /* 7 */ { { 8, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 8 */ { { 8, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 9 */ { { 8, 0x2, 0x01 }, { -7, 0x1, 0x00 }, }, - /* 10 */ { { 8, 0x2, 0x02 }, { -6, 0x2, 0x00 }, }, - /* 11 */ { { 8, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 15, 0x1, 0xff }, { -1, 0x1, 0x00 }, }, - /* 3 */ { { 15, 0x1, 0xff }, { 0, 0x2, 0x00 }, }, - /* 4 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0xff }, { -7, 0x1, 0x00 }, }, - /* 5 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0xff }, { -6, 0x2, 0x00 }, }, - /* 6 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 7 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 8 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x01 }, { -7, 0x1, 0x00 }, }, - /* 9 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x02 }, { -6, 0x2, 0x00 }, }, - /* 10 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 11 */ { { 15, 0x1, 0xff }, { 8, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x04*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 18, 0x2, 0xff }, { -15, 0x1, 0x00 }, }, - /* 4 */ { { 16, 0x2, 0xff }, { -12, 0x2, 0x00 }, }, - /* 5 */ { { 16, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 16, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 16, 0x2, 0x03 }, { 18, 0x2, 0x01 }, { -15, 0x1, 0x00 }, }, - /* 8 */ { { 16, 0x2, 0x02 }, { -12, 0x2, 0x00 }, }, - /* 9 */ { { 16, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 16, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 16, 0x2, 0x03 }, { 18, 0x2, 0x01 }, { -15, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 17, 0x1, 0xff }, { -15, 0x1, 0x00 }, }, - /* 3 */ { { 17, 0x1, 0xff }, { -14, 0x2, 0x00 }, }, - /* 4 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 18, 0x2, 0xff }, { -15, 0x1, 0x00 }, }, - /* 7 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0xff }, { -12, 0x2, 0x00 }, }, - /* 8 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0x03 }, { 18, 0x2, 0x01 }, { -15, 0x1, 0x00 }, }, - /* 11 */ { { 17, 0x1, 0xff }, { 14, 0x2, 0xff }, { 16, 0x2, 0x02 }, { -12, 0x2, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 16, 0x2, 0xff }, { -1, 0x1, 0x00 }, }, - /* 4 */ { { 16, 0x2, 0xff }, { 0, 0x2, 0x00 }, }, - /* 5 */ { { 16, 0x2, 0x01 }, { -15, 0x1, 0x00 }, }, - /* 6 */ { { 16, 0x2, 0x02 }, { -14, 0x2, 0x00 }, }, - /* 7 */ { { 16, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 8 */ { { 16, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 9 */ { { 16, 0x2, 0x01 }, { -15, 0x1, 0x00 }, }, - /* 10 */ { { 16, 0x2, 0x02 }, { -14, 0x2, 0x00 }, }, - /* 11 */ { { 16, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 31, 0x1, 0xff }, { -1, 0x1, 0x00 }, }, - /* 3 */ { { 31, 0x1, 0xff }, { 0, 0x2, 0x00 }, }, - /* 4 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0xff }, { -15, 0x1, 0x00 }, }, - /* 5 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0xff }, { -14, 0x2, 0x00 }, }, - /* 6 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 7 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 8 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x01 }, { -15, 0x1, 0x00 }, }, - /* 9 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x02 }, { -14, 0x2, 0x00 }, }, - /* 10 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 11 */ { { 31, 0x1, 0xff }, { 16, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x05*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 34, 0x2, 0xff }, { -31, 0x1, 0x00 }, }, - /* 4 */ { { 32, 0x2, 0xff }, { -28, 0x2, 0x00 }, }, - /* 5 */ { { 32, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 32, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 32, 0x2, 0x03 }, { 34, 0x2, 0x01 }, { -31, 0x1, 0x00 }, }, - /* 8 */ { { 32, 0x2, 0x02 }, { -28, 0x2, 0x00 }, }, - /* 9 */ { { 32, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 32, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 32, 0x2, 0x03 }, { 34, 0x2, 0x01 }, { -31, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 33, 0x1, 0xff }, { -31, 0x1, 0x00 }, }, - /* 3 */ { { 33, 0x1, 0xff }, { -30, 0x2, 0x00 }, }, - /* 4 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 34, 0x2, 0xff }, { -31, 0x1, 0x00 }, }, - /* 7 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0xff }, { -28, 0x2, 0x00 }, }, - /* 8 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0x03 }, { 34, 0x2, 0x01 }, { -31, 0x1, 0x00 }, }, - /* 11 */ { { 33, 0x1, 0xff }, { 30, 0x2, 0xff }, { 32, 0x2, 0x02 }, { -28, 0x2, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 32, 0x2, 0xff }, { -1, 0x1, 0x00 }, }, - /* 4 */ { { 32, 0x2, 0xff }, { 0, 0x2, 0x00 }, }, - /* 5 */ { { 32, 0x2, 0x01 }, { -31, 0x1, 0x00 }, }, - /* 6 */ { { 32, 0x2, 0x02 }, { -30, 0x2, 0x00 }, }, - /* 7 */ { { 32, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 8 */ { { 32, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 9 */ { { 32, 0x2, 0x01 }, { -31, 0x1, 0x00 }, }, - /* 10 */ { { 32, 0x2, 0x02 }, { -30, 0x2, 0x00 }, }, - /* 11 */ { { 32, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 63, 0x1, 0xff }, { -1, 0x1, 0x00 }, }, - /* 3 */ { { 63, 0x1, 0xff }, { 0, 0x2, 0x00 }, }, - /* 4 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0xff }, { -31, 0x1, 0x00 }, }, - /* 5 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0xff }, { -30, 0x2, 0x00 }, }, - /* 6 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 7 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 8 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x01 }, { -31, 0x1, 0x00 }, }, - /* 9 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x02 }, { -30, 0x2, 0x00 }, }, - /* 10 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 11 */ { { 63, 0x1, 0xff }, { 32, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x06*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 66, 0x2, 0xff }, { -63, 0x1, 0x00 }, }, - /* 4 */ { { 64, 0x2, 0xff }, { -60, 0x2, 0x00 }, }, - /* 5 */ { { 64, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 64, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 64, 0x2, 0x03 }, { 66, 0x2, 0x01 }, { -63, 0x1, 0x00 }, }, - /* 8 */ { { 64, 0x2, 0x02 }, { -60, 0x2, 0x00 }, }, - /* 9 */ { { 64, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 64, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 64, 0x2, 0x03 }, { 66, 0x2, 0x01 }, { -63, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 65, 0x1, 0xff }, { -63, 0x1, 0x00 }, }, - /* 3 */ { { 65, 0x1, 0xff }, { -62, 0x2, 0x00 }, }, - /* 4 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 66, 0x2, 0xff }, { -63, 0x1, 0x00 }, }, - /* 7 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0xff }, { -60, 0x2, 0x00 }, }, - /* 8 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0x03 }, { 66, 0x2, 0x01 }, { -63, 0x1, 0x00 }, }, - /* 11 */ { { 65, 0x1, 0xff }, { 62, 0x2, 0xff }, { 64, 0x2, 0x02 }, { -60, 0x2, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 64, 0x2, 0xff }, { -1, 0x1, 0x00 }, }, - /* 4 */ { { 64, 0x2, 0xff }, { 0, 0x2, 0x00 }, }, - /* 5 */ { { 64, 0x2, 0x01 }, { -63, 0x1, 0x00 }, }, - /* 6 */ { { 64, 0x2, 0x02 }, { -62, 0x2, 0x00 }, }, - /* 7 */ { { 64, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 8 */ { { 64, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 9 */ { { 64, 0x2, 0x01 }, { -63, 0x1, 0x00 }, }, - /* 10 */ { { 64, 0x2, 0x02 }, { -62, 0x2, 0x00 }, }, - /* 11 */ { { 64, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 127, 0x1, 0xff }, { -1, 0x1, 0x00 }, }, - /* 3 */ { { 127, 0x1, 0xff }, { 0, 0x2, 0x00 }, }, - /* 4 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0xff }, { -63, 0x1, 0x00 }, }, - /* 5 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0xff }, { -62, 0x2, 0x00 }, }, - /* 6 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 7 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 8 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x01 }, { -63, 0x1, 0x00 }, }, - /* 9 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x02 }, { -62, 0x2, 0x00 }, }, - /* 10 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 11 */ { { 127, 0x1, 0xff }, { 64, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - }, -}, - -/*dest_raw_inc=0x07*/ -{ - - /*dest_align=0*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 130, 0x2, 0xff }, { -127, 0x1, 0x00 }, }, - /* 4 */ { { 128, 0x2, 0xff }, { -124, 0x2, 0x00 }, }, - /* 5 */ { { 128, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 6 */ { { 128, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 7 */ { { 128, 0x2, 0x03 }, { 130, 0x2, 0x01 }, { -127, 0x1, 0x00 }, }, - /* 8 */ { { 128, 0x2, 0x02 }, { -124, 0x2, 0x00 }, }, - /* 9 */ { { 128, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 10 */ { { 128, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 11 */ { { 128, 0x2, 0x03 }, { 130, 0x2, 0x01 }, { -127, 0x1, 0x00 }, }, - }, - - /*dest_align=1*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 129, 0x1, 0xff }, { -127, 0x1, 0x00 }, }, - /* 3 */ { { 129, 0x1, 0xff }, { -126, 0x2, 0x00 }, }, - /* 4 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 1, 0x1, 0x00 }, }, - /* 5 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 2, 0x2, 0x00 }, }, - /* 6 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 130, 0x2, 0xff }, { -127, 0x1, 0x00 }, }, - /* 7 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0xff }, { -124, 0x2, 0x00 }, }, - /* 8 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0x01 }, { 1, 0x1, 0x00 }, }, - /* 9 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0x02 }, { 2, 0x2, 0x00 }, }, - /* 10 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0x03 }, { 130, 0x2, 0x01 }, { -127, 0x1, 0x00 }, }, - /* 11 */ { { 129, 0x1, 0xff }, { 126, 0x2, 0xff }, { 128, 0x2, 0x02 }, { -124, 0x2, 0x00 }, }, - }, - - /*dest_align=2*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 2, 0x2, 0x00 }, }, - /* 3 */ { { 128, 0x2, 0xff }, { -1, 0x1, 0x00 }, }, - /* 4 */ { { 128, 0x2, 0xff }, { 0, 0x2, 0x00 }, }, - /* 5 */ { { 128, 0x2, 0x01 }, { -127, 0x1, 0x00 }, }, - /* 6 */ { { 128, 0x2, 0x02 }, { -126, 0x2, 0x00 }, }, - /* 7 */ { { 128, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 8 */ { { 128, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 9 */ { { 128, 0x2, 0x01 }, { -127, 0x1, 0x00 }, }, - /* 10 */ { { 128, 0x2, 0x02 }, { -126, 0x2, 0x00 }, }, - /* 11 */ { { 128, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - }, - - /*dest_align=3*/ - { - /* 0 */ { }, - /* 1 */ { { 1, 0x1, 0x00 }, }, - /* 2 */ { { 255, 0x1, 0xff }, { -1, 0x1, 0x00 }, }, - /* 3 */ { { 255, 0x1, 0xff }, { 0, 0x2, 0x00 }, }, - /* 4 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0xff }, { -127, 0x1, 0x00 }, }, - /* 5 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0xff }, { -126, 0x2, 0x00 }, }, - /* 6 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 7 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - /* 8 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x01 }, { -127, 0x1, 0x00 }, }, - /* 9 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x02 }, { -126, 0x2, 0x00 }, }, - /* 10 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x01 }, { -1, 0x1, 0x00 }, }, - /* 11 */ { { 255, 0x1, 0xff }, { 128, 0x2, 0x02 }, { 0, 0x2, 0x00 }, }, - }, -}, diff --git a/waterbox/ss/scu_dsp_common.inc b/waterbox/ss/scu_dsp_common.inc deleted file mode 100644 index de5facc0a8..0000000000 --- a/waterbox/ss/scu_dsp_common.inc +++ /dev/null @@ -1,236 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* scu_dsp_common.inc: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// base ptr must match the waterbox base load location! -// TODO: Since we're not relocating, can't we use DSP_Init? -#if (defined(__x86_64__) && defined(__code_model_small__) && !defined(__PIC__) && !defined(__pic__)) || SIZEOF_VOID_P <= 4 - #define DSP_INSTR_BASE_UIPT 0x36f00000000ul - #define DSP_INSTR_RECOVER_TCAST uint32 -#else - #define DSP_INSTR_BASE_UIPT ((uintptr_t)DSP_Init) - #define DSP_INSTR_RECOVER_TCAST int32 -#endif - -// See loop in "SCU_UpdateDSP()" in scu.inc, and END/ENDI handling in scu_dsp_misc.cpp -enum { DSP_EndCCSubVal = 1000000 }; - -void DSP_Init(void); - -struct DSP_ITS; - -union DSPR48 -{ -#ifdef MSB_FIRST - struct - { - uint16 dummy; - uint16 H; - uint32 L; - }; -#else - struct - { - uint32 L; - uint16 H; - uint16 dummy; - }; -#endif - uint64 T; // Upper 16 bits may be non-zero "garbage", so don't assume they're zero in code that reads from this variable. -}; - -struct DSPS -{ - sscpu_timestamp_t LastTS; - int32 CycleCounter; - int32 T0_Until; - // - enum - { - // No execute = 0x00000000 <= 0 - // Paused + No execute = 0x80000000 <= 0 - // Paused + Execute = 0x80000001 <= 0 - // Execute = 0x00000001 > 0 - STATE_MASK_PAUSE = 0x80000000, - STATE_MASK_EXECUTE = 0x00000001, - }; - int32 State; - - INLINE bool IsRunning(void) // returns true if not stopped and not paused. - { - return State > 0; - } - - uint64 NextInstr; - - uint8 PC; - uint8 RA; - - bool FlagZ; - bool FlagS; - bool FlagV; - bool FlagC; - - bool FlagEnd; - - uint8 TOP; - uint16 LOP; // 12 bits - - DSPR48 AC; - DSPR48 P; - - union - { - uint8 CT[4]; // 6 bits(each) - uint32 CT32; - }; - - uint32 RX; - uint32 RY; - - uint32 RAO; - uint32 WAO; - - uint32 DataRAM[4][64]; - - uint64 ProgRAM[256]; // Upper 32 bits = actual raw instruction, lower 32 bits = horrible emulator handler pointer madness -}; - - -// ALU Op: bits 26-29 - *16 -// X Op: bits 23-25 - * 8 -// Y Op: bits 17-19 - * 8 -// D1 Op: bits 12-13 - * 4 -extern void (*const DSP_GenFuncTable[2][16][8][8][4])(void); - -// Hold/Format/Direction: bits 12-14 -// Hold: bit 14 -// Format: bit 13 -// Direction: bit 12 -// RAM: bits 8-10 -// -extern void (*const DSP_DMAFuncTable[2][8][8])(void); - -// -// Dest: bits 26-29 -// Condition: bits 19-25 -// -extern void (*const DSP_MVIFuncTable[2][16][128])(void); - -// -// Condition: bits 19-25 -// -extern void (*const DSP_JMPFuncTable[2][128])(void); - - -// -// LPS, BTM, END, ENDI(bits 29-31 = 0x7) -// bits 27-28 -// -extern void (*const DSP_MiscFuncTable[2][4])(void); - -extern DSPS DSP; - -template -static INLINE uint64 DSP_DecodeInstruction(const uint32 instr) -{ - void (*aal)(void); - - switch((instr >> 28) & 0xF) - { - default: - aal = DSP_GenFuncTable[looped][0][0][0][0]; - break; - - case 0x0: - case 0x1: - case 0x2: - case 0x3: - aal = DSP_GenFuncTable[looped][(instr >> 26) & 0xF][(instr >> 23) & 0x7][(instr >> 17) & 0x7][(instr >> 12) & 0x3]; - break; - - case 0x8: - case 0x9: - case 0xA: - case 0xB: - aal = DSP_MVIFuncTable[looped][(instr >> 26) & 0xF][(instr >> 19) & 0x7F]; - break; - - case 0xC: - aal = DSP_DMAFuncTable[looped][(instr >> 12) & 0x7][(instr >> 8) & 0x7]; - break; - - case 0xD: - aal = DSP_JMPFuncTable[looped][(instr >> 19) & 0x7F]; - break; - - case 0xE: - case 0xF: - aal = DSP_MiscFuncTable[looped][(instr >> 27) & 0x3]; - break; - } - - return ((uint64)instr << 32) | (uint32)((uintptr_t)aal - DSP_INSTR_BASE_UIPT); -} - -template -static INLINE uint32 DSP_InstrPre(void) -{ - const uint32 instr = DSP.NextInstr >> 32; - - if(!looped || !DSP.LOP) - { - DSP.NextInstr = DSP.ProgRAM[DSP.PC]; - DSP.PC++; - } - - if(looped) - DSP.LOP -= (bool)DSP.LOP; - - return instr; -} - -template -static INLINE bool DSP_TestCond(void) -{ - if(!(cond & 0x40)) - return true; - // - // - // - bool ret = false; - - if(cond & 0x1) - ret |= DSP.FlagZ; - - if(cond & 0x2) - ret |= DSP.FlagS; - - if(cond & 0x4) - ret |= DSP.FlagC; - - if(cond & 0x8) - ret |= (DSP.T0_Until < DSP.CycleCounter); - - //if(cond & 0x10) // ? - - return ret == (bool)(cond & 0x20); -} - diff --git a/waterbox/ss/scu_dsp_dmatab.inc b/waterbox/ss/scu_dsp_dmatab.inc deleted file mode 100644 index 84b975aceb..0000000000 --- a/waterbox/ss/scu_dsp_dmatab.inc +++ /dev/null @@ -1,52 +0,0 @@ -{ /* looped=0 */ - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - }, -{ /* looped=1 */ - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - { - DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, DMAInstr, - }, - }, diff --git a/waterbox/ss/scu_dsp_gen.cpp b/waterbox/ss/scu_dsp_gen.cpp deleted file mode 100644 index 0e96907088..0000000000 --- a/waterbox/ss/scu_dsp_gen.cpp +++ /dev/null @@ -1,343 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* scu_dsp_gen.cpp - SCU DSP General Instructions Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "ss.h" -#include "scu.h" - -#include "endian.h" - -#pragma GCC optimize("Os") - // Is first DSP instruction cached on PC load, or when execution starts? - - // MOV [s],[d] s=0x8 = 0xFFFFFFFF? - - // MOV [s],[d] when moving from/to the same data RAM bank seems to be treated like a NOP... - -namespace MDFN_IEN_SS -{ -#include "scu_dsp_common.inc" - -static INLINE void SetC(bool value) -{ - DSP.FlagC = value; -} - -static INLINE void CalcZS32(uint32 val) -{ - DSP.FlagS = (int32)val < 0; - DSP.FlagZ = !val; -} - -static INLINE void CalcZS48(uint64 val) -{ - val <<= 16; - - DSP.FlagS = (int64)val < 0; - DSP.FlagZ = !val; -} - - -template -static NO_INLINE NO_CLONE void GeneralInstr(void) -{ - const uint32 instr = DSP_InstrPre(); - // - DSPR48 ALU = DSP.AC; - unsigned dr_read = 0; - unsigned ct_inc = 0; - - switch(alu_op) - { - // - // NOP - // - default: - { - - } - break; - - // - // AND - // - case 0x01: - { - ALU.L &= DSP.P.L; - SetC(false); - CalcZS32(ALU.L); - } - break; - - // - // OR - // - case 0x02: - { - ALU.L |= DSP.P.L; - SetC(false); - CalcZS32(ALU.L); - } - break; - - // - // XOR - // - case 0x03: - { - ALU.L ^= DSP.P.L; - SetC(false); - CalcZS32(ALU.L); - } - break; - - // - // ADD - // - case 0x04: - { - const uint64 tmp = (uint64)ALU.L + DSP.P.L; - - DSP.FlagV |= (((~(ALU.L ^ DSP.P.L)) & (ALU.L ^ tmp)) >> 31) & 1; - SetC((tmp >> 32) & 0x1); - CalcZS32(tmp); - ALU.L = tmp; - } - break; - - // - // SUB - // - case 0x05: - { - const uint64 tmp = (uint64)ALU.L - DSP.P.L; - - DSP.FlagV |= ((((ALU.L ^ DSP.P.L)) & (ALU.L ^ tmp)) >> 31) & 1; - SetC((tmp >> 32) & 0x1); - CalcZS32(tmp); - ALU.L = tmp; - } - break; - - // - // AD2 - // - case 0x06: - { - const uint64 tmp = (ALU.T & 0xFFFFFFFFFFFFULL) + (DSP.P.T & 0xFFFFFFFFFFFFULL); - - DSP.FlagV |= (((~(ALU.T ^ DSP.P.T)) & (ALU.T ^ tmp)) >> 47) & 1; - SetC((tmp >> 48) & 0x1); - CalcZS48(tmp); - ALU.T = tmp; - } - break; - - // - // SR - // - case 0x08: - { - const bool new_C = ALU.L & 0x1; - - SetC(new_C); - ALU.L = (int32)ALU.L >> 1; - CalcZS32(ALU.L); - } - break; - - // - // RR - // - case 0x09: - { - const bool new_C = ALU.L & 0x1; - - SetC(new_C); - ALU.L = (ALU.L >> 1) | (new_C << 31); - CalcZS32(ALU.L); - } - break; - - // - // SL - // - case 0x0A: - { - const bool new_C = ALU.L >> 31; - - SetC(new_C); - ALU.L <<= 1; - CalcZS32(ALU.L); - } - break; - - // - // RL - // - case 0x0B: - { - const bool new_C = ALU.L >> 31; - - SetC(new_C); - ALU.L = (ALU.L << 1) | new_C; - CalcZS32(ALU.L); - } - break; - - // - // RL8 - // - case 0x0F: - { - const bool new_C = (ALU.L >> 24) & 1; - - SetC(new_C); - ALU.L = (ALU.L << 8) | (ALU.L >> 24); - CalcZS32(ALU.L); - } - break; - } - - // - // X Op - // - if((x_op & 0x3) == 0x2) - DSP.P.T = (int64)(int32)DSP.RX * (int32)DSP.RY; - - if(x_op >= 0x3) - { - const unsigned s = (instr >> 20) & 0x7; - const size_t drw = s & 0x3; - uint32 src_data; - - src_data = DSP.DataRAM[drw][DSP.CT[drw]]; - dr_read |= 1U << drw; - ct_inc |= (bool)(s & 0x4) << (drw << 3); - - if((x_op & 0x3) == 0x3) - DSP.P.T = (int32)src_data; - - if(x_op & 0x4) - DSP.RX = src_data; - } - - // - // Y Op - // - if((y_op & 0x3) == 0x1) - DSP.AC.T = 0; - else if((y_op & 0x3) == 0x2) - DSP.AC.T = ALU.T; - - if(y_op >= 0x3) - { - const unsigned s = (instr >> 14) & 0x7; - const size_t drw = s & 0x3; - uint32 src_data; - - src_data = DSP.DataRAM[drw][DSP.CT[drw]]; - dr_read |= 1U << drw; - ct_inc |= (bool)(s & 0x4) << (drw << 3); - - if((y_op & 0x3) == 0x3) - DSP.AC.T = (int32)src_data; - - if(y_op & 0x4) - DSP.RY = src_data; - } - - // - // D1 Op (TODO: Test illegal bit patterns) - // - if(d1_op & 0x1) - { - const unsigned d = (instr >> 8) & 0xF; - uint32 src_data = (int8)instr; - - if(d1_op & 0x2) - { - switch(instr & 0xF) - { - case 0x8: - case 0xB: - case 0xC: - case 0xD: - case 0xE: - case 0xF: src_data = 0xFFFFFFFF; break; - - case 0x0: src_data = DSP.DataRAM[0][DSP.CT[0]]; dr_read |= 0x01; break; - case 0x1: src_data = DSP.DataRAM[1][DSP.CT[1]]; dr_read |= 0x02; break; - case 0x2: src_data = DSP.DataRAM[2][DSP.CT[2]]; dr_read |= 0x04; break; - case 0x3: src_data = DSP.DataRAM[3][DSP.CT[3]]; dr_read |= 0x08; break; - - case 0x4: src_data = DSP.DataRAM[0][DSP.CT[0]]; if(d != 0) { ct_inc |= 1 << 0; } dr_read |= 0x01; break; - case 0x5: src_data = DSP.DataRAM[1][DSP.CT[1]]; if(d != 1) { ct_inc |= 1 << 8; } dr_read |= 0x02; break; - case 0x6: src_data = DSP.DataRAM[2][DSP.CT[2]]; if(d != 2) { ct_inc |= 1 << 16; } dr_read |= 0x04; break; - case 0x7: src_data = DSP.DataRAM[3][DSP.CT[3]]; if(d != 3) { ct_inc |= 1 << 24; } dr_read |= 0x08; break; - - case 0x9: src_data = ALU.T; break; - case 0xA: src_data = ALU.T >> 16; break; - } - } - - switch(d) - { - case 0x0: if(!(dr_read & 0x01)) { DSP.DataRAM[0][DSP.CT[0]] = src_data; ct_inc |= 1 << 0; } break; - case 0x1: if(!(dr_read & 0x02)) { DSP.DataRAM[1][DSP.CT[1]] = src_data; ct_inc |= 1 << 8; } break; - case 0x2: if(!(dr_read & 0x04)) { DSP.DataRAM[2][DSP.CT[2]] = src_data; ct_inc |= 1 << 16; } break; - case 0x3: if(!(dr_read & 0x08)) { DSP.DataRAM[3][DSP.CT[3]] = src_data; ct_inc |= 1 << 24; } break; - case 0x4: DSP.RX = src_data; break; - case 0x5: DSP.P.T = (int32)src_data; break; - case 0x6: DSP.RAO = src_data; break; - case 0x7: DSP.WAO = src_data; break; - case 0x8: - case 0x9: break; - case 0xA: DSP.LOP = src_data & 0x0FFF; break; - case 0xB: DSP.TOP = src_data & 0xFF; break; - - // - // Don't bother masking with 0x3F here, since the & 0x3F3F3F3F mask down below will cover it(and no chance of overflowing into an adjacent byte - // since we're masking out the corresponding byte in ct_inc, too). - // - case 0xC: DSP.CT[0] = src_data; ct_inc &= ~0x000000FF; break; - case 0xD: DSP.CT[1] = src_data; ct_inc &= ~0x0000FF00; break; - case 0xE: DSP.CT[2] = src_data; ct_inc &= ~0x00FF0000; break; - case 0xF: DSP.CT[3] = src_data; ct_inc &= ~0xFF000000; break; - } - } - - // - // - // - #ifdef MSB_FIRST - ct_inc = MDFN_bswap32(ct_inc); - #endif - - if(x_op >= 0x3 || y_op >= 0x3 || (d1_op & 0x1)) - DSP.CT32 = (DSP.CT32 + ct_inc) & 0x3F3F3F3F; -} - -extern void (*const DSP_GenFuncTable[2][16][8][8][4])(void) = -{ - #include "scu_dsp_gentab.inc" -}; - -} diff --git a/waterbox/ss/scu_dsp_gentab.inc b/waterbox/ss/scu_dsp_gentab.inc deleted file mode 100644 index 60d308a2ae..0000000000 --- a/waterbox/ss/scu_dsp_gentab.inc +++ /dev/null @@ -1,8772 +0,0 @@ -{ /* looped=0 */ - { /* alu_op=0x00 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x01 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x02 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x03 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x04 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x05 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x06 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x07 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x08 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x09 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0a */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0b */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0c */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0d */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0e */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0f */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, -}, -{ /* looped=1 */ - { /* alu_op=0x00 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x01 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x02 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x03 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x04 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x05 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x06 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x07 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x08 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x09 */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0a */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0b */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0c */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0d */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0e */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, - { /* alu_op=0x0f */ - { /* x_op=0x00 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x01 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x02 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x03 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x04 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x05 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x06 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - { /* x_op=0x07 */ - { /* y_op=0x00 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x01 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x02 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x03 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x04 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x05 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x06 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - { /* y_op=0x07 */ - GeneralInstr, GeneralInstr, GeneralInstr, GeneralInstr, - }, - - }, - }, -}, diff --git a/waterbox/ss/scu_dsp_jmp.cpp b/waterbox/ss/scu_dsp_jmp.cpp deleted file mode 100644 index 0271dfe3d2..0000000000 --- a/waterbox/ss/scu_dsp_jmp.cpp +++ /dev/null @@ -1,45 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* scu_dsp_jmp.cpp - SCU DSP JMP Instructions Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "ss.h" -#include "scu.h" - -#pragma GCC optimize("Os") - -namespace MDFN_IEN_SS -{ -#include "scu_dsp_common.inc" - -template -static NO_INLINE NO_CLONE void JMPInstr(void) -{ - const uint32 instr = DSP_InstrPre(); - - if(DSP_TestCond()) - DSP.PC = (uint8)instr; -} - -extern void (*const DSP_JMPFuncTable[2][128])(void) = -{ - #include "scu_dsp_jmptab.inc" -}; - -} diff --git a/waterbox/ss/scu_dsp_jmptab.inc b/waterbox/ss/scu_dsp_jmptab.inc deleted file mode 100644 index d4a68c9100..0000000000 --- a/waterbox/ss/scu_dsp_jmptab.inc +++ /dev/null @@ -1,4 +0,0 @@ -{ /* looped=0 */ -JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, }, -{ /* looped=1 */ -JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, JMPInstr, }, diff --git a/waterbox/ss/scu_dsp_misc.cpp b/waterbox/ss/scu_dsp_misc.cpp deleted file mode 100644 index 8a7867ab45..0000000000 --- a/waterbox/ss/scu_dsp_misc.cpp +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* scu_dsp_misc.cpp - SCU DSP Miscellaneous Instructions Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "ss.h" -#include "scu.h" - -#pragma GCC optimize("Os") - -namespace MDFN_IEN_SS -{ -#include "scu_dsp_common.inc" - -template -static NO_INLINE NO_CLONE void MiscInstr(void) -{ - DSP_InstrPre(); - - // - // END/ENDI - // - if(op == 2 || op == 3) - { - if(op & 0x1) - { - DSP.FlagEnd = true; - SCU_SetInt(SCU_INT_DSP, true); - } - DSP.NextInstr = DSP_DecodeInstruction(0); - DSP.State &= ~DSPS::STATE_MASK_EXECUTE; - DSP.CycleCounter -= DSP_EndCCSubVal; // Break out of execution loop(also remember to handle this case for manual stepping via port writes). - } - else if(op == 0) // BTM - { - if(DSP.LOP) - { - DSP.LOP--; - DSP.PC = DSP.TOP; - } - } - else if(op == 1) // LPS - { - DSP.NextInstr = DSP_DecodeInstruction(DSP.NextInstr >> 32); - } -} - -extern void (*const DSP_MiscFuncTable[2][4])(void) = -{ - #include "scu_dsp_misctab.inc" -}; - -} diff --git a/waterbox/ss/scu_dsp_misctab.inc b/waterbox/ss/scu_dsp_misctab.inc deleted file mode 100644 index 9ea38bb818..0000000000 --- a/waterbox/ss/scu_dsp_misctab.inc +++ /dev/null @@ -1,2 +0,0 @@ -{ /* looped=0 */ MiscInstr, MiscInstr, MiscInstr, MiscInstr, }, -{ /* looped=1 */ MiscInstr, MiscInstr, MiscInstr, MiscInstr, }, diff --git a/waterbox/ss/scu_dsp_mvi.cpp b/waterbox/ss/scu_dsp_mvi.cpp deleted file mode 100644 index 98e0a4e1fa..0000000000 --- a/waterbox/ss/scu_dsp_mvi.cpp +++ /dev/null @@ -1,76 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* scu_dsp_mvi.cpp - SCU DSP MVI Instructions Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "ss.h" -#include "scu.h" - -#pragma GCC optimize("Os") - -namespace MDFN_IEN_SS -{ -#include "scu_dsp_common.inc" - -template -static NO_INLINE NO_CLONE void MVIInstr(void) -{ - const uint32 instr = DSP_InstrPre(); - uint32 imm; - - if(cond & 0x40) - imm = sign_x_to_s32(19, instr); - else - imm = sign_x_to_s32(25, instr); - - if(DSP_TestCond()) - { - switch(dest) - { - default: - SS_DBG(SS_DBG_WARNING | SS_DBG_SCU, "[SCU] MVI unknown dest 0x%01x --- Instr=0x%08x, Next_Instr=0x%08x, PC=0x%02x\n", dest, instr, (unsigned)(DSP.NextInstr >> 32), DSP.PC); - break; - - case 0x0: - case 0x1: - case 0x2: - case 0x3: - DSP.DataRAM[dest][DSP.CT[dest]] = imm; - DSP.CT[dest] = (DSP.CT[dest] + 1) & 0x3F; - break; - - case 0x4: DSP.RX = imm; break; - case 0x5: DSP.P.T = (int32)imm; break; - case 0x6: DSP.RAO = imm; break; - case 0x7: DSP.WAO = imm; break; - - case 0xA: DSP.LOP = imm & 0x0FFF; break; - case 0xC: DSP.TOP = DSP.PC - 1; DSP.PC = imm & 0xFF; break; - } - } -} - - -extern void (*const DSP_MVIFuncTable[2][16][128])(void) = -{ - #include "scu_dsp_mvitab.inc" -}; - -} - diff --git a/waterbox/ss/scu_dsp_mvitab.inc b/waterbox/ss/scu_dsp_mvitab.inc deleted file mode 100644 index 1614f7e694..0000000000 --- a/waterbox/ss/scu_dsp_mvitab.inc +++ /dev/null @@ -1,100 +0,0 @@ -{ /* looped=0 */ - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - }, -{ /* looped=1 */ - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - { - MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, MVIInstr, - }, - }, diff --git a/waterbox/ss/sh7095.h b/waterbox/ss/sh7095.h deleted file mode 100644 index da73ec03b9..0000000000 --- a/waterbox/ss/sh7095.h +++ /dev/null @@ -1,534 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* sh7095.h: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SH7095_H -#define __MDFN_SH7095_H - -class SH7095 final -{ - public: - - SH7095(const char* const name_arg, const unsigned dma_event_id_arg, uint8 (*exivecfn_arg)(void)) MDFN_COLD; - ~SH7095() MDFN_COLD; - - void Init(void) MDFN_COLD; - - void ForceInternalEventUpdates(void); - void AdjustTS(int32 delta, bool force_set = false); - - void TruePowerOn(void) MDFN_COLD; - void Reset(bool power_on_reset, bool from_internal_wdt = false) MDFN_COLD; - void SetNMI(bool level); - void SetIRL(unsigned level); - void SetMD5(bool level); - - void SetFTI(bool state); - void SetFTCI(bool state); - - INLINE void SetExtHalt(bool state) - { - ExtHalt = state; - - if(ExtHalt) - SetPEX(PEX_PSEUDO_EXTHALT); // Only SetPEX() here, ClearPEX() is called in the pseudo exception handling code as necessary. - } - - template - void Step(void); - - - //private: - uint32 R[16]; - uint32 PC; - - // Control registers - union - { - struct - { - uint32 SR; - uint32 GBR; - uint32 VBR; - }; - uint32 CtrlRegs[3]; - }; - - sscpu_timestamp_t timestamp; - sscpu_timestamp_t MA_until; - sscpu_timestamp_t MM_until; - sscpu_timestamp_t write_finish_timestamp; -#if 0 - sscpu_timestamp_t WB_until[16]; -#endif - - INLINE void SetT(bool new_value) { SR &= ~1; SR |= new_value; } - INLINE bool GetT(void) { return SR & 1; } - - INLINE bool GetS(void) { return (bool)(SR & 0x002); } - INLINE bool GetQ(void) { return (bool)(SR & 0x100); } - INLINE bool GetM(void) { return (bool)(SR & 0x200); } - INLINE void SetQ(bool new_q) { SR = (SR &~ 0x100) | (new_q << 8); } - INLINE void SetM(bool new_m) { SR = (SR &~ 0x200) | (new_m << 9); } - - // System registers - union - { - struct - { - uint32 MACH; - uint32 MACL; - uint32 PR; - }; - uint32 SysRegs[3]; - }; - - INLINE uint64 GetMAC64(void) { return MACL | ((uint64)MACH << 32); } - INLINE void SetMAC64(uint64 nv) { MACL = nv; MACH = nv >> 32; } - - enum // must be in range of 0 ... 7 - { - PEX_POWERON = 0, - PEX_RESET = 1, - PEX_CPUADDR = 2, - PEX_DMAADDR = 3, - PEX_INT = 4, - PEX_NMI = 5, - PEX_PSEUDO_DMABURST = 6, - PEX_PSEUDO_EXTHALT = 7 - }; - enum { EPENDING_PEXBITS_SHIFT = 16 }; - enum { EPENDING_OP_OR = 0xFF000000 }; - - uint32 EPending; - - INLINE void SetPEX(const unsigned which) - { - EPending |= (1U << (which + EPENDING_PEXBITS_SHIFT)); - EPending |= EPENDING_OP_OR; - } - - INLINE void ClearPEX(const unsigned which) - { - EPending &= ~(1U << (which + EPENDING_PEXBITS_SHIFT)); - - if(!(EPending & (0xFF << EPENDING_PEXBITS_SHIFT))) - EPending = 0; - } - - uint32 Pipe_ID; - uint32 Pipe_IF; - - enum - { - EXCEPTION_POWERON = 0,// Power-on - EXCEPTION_RESET, // "Manual" reset - EXCEPTION_ILLINSTR, // General illegal instruction - EXCEPTION_ILLSLOT, // Slot illegal instruction - EXCEPTION_CPUADDR, // CPU address error - EXCEPTION_DMAADDR, // DMA Address error - EXCEPTION_NMI, // NMI - EXCEPTION_BREAK, // User break - EXCEPTION_TRAP, // Trap instruction - EXCEPTION_INT, // Interrupt - }; - - enum - { - VECNUM_POWERON = 0, // Power-on - VECNUM_RESET = 2, // "Manual" reset - VECNUM_ILLINSTR = 4, // General illegal instruction - VECNUM_ILLSLOT = 6, // Slot illegal instruction - VECNUM_CPUADDR = 9, // CPU address error - VECNUM_DMAADDR = 10, // DMA Address error - VECNUM_NMI = 11, // NMI - VECNUM_BREAK = 12, // User break - - VECNUM_TRAP_BASE = 32, // Trap instruction - VECNUM_INT_BASE = 64, // Interrupt - }; - - enum - { - EPENDING_IVECNUM_SHIFT = 8, // 8 bits - EPENDING_E_SHIFT = 16, // 8 bits - EPENDING_IPRIOLEV_SHIFT = 28 // 4 bits - }; - - template - uint32 Exception(const unsigned exnum, const unsigned vecnum); - - // - // - // - uint32 IBuffer; - - uint32 (MDFN_FASTCALL *MRFPI[8])(uint32 A); - - uint8 (MDFN_FASTCALL *MRFP8[8])(uint32 A); - uint16 (MDFN_FASTCALL *MRFP16[8])(uint32 A); - uint32 (MDFN_FASTCALL *MRFP32[8])(uint32 A); - - void (MDFN_FASTCALL *MWFP8[8])(uint32 A, uint8); - void (MDFN_FASTCALL *MWFP16[8])(uint32 A, uint16); - void (MDFN_FASTCALL *MWFP32[8])(uint32 A, uint32); - - // - // - // Cache: - // - // - struct - { - // Rather than have separate validity bits, we're putting an INvalidity bit(invalid when =1) - // in the upper bit of the Tag variables. - uint32 Tag[4]; - uint8 LRU; - alignas(4) uint8 Data[4][16]; - } Cache[64]; - - uint8 CCR; - - void SetCCR(uint8 V); - enum { CCR_CE = 0x01 }; // Cache Enable - enum { CCR_ID = 0x02 }; // Instruction Replacement Disable - enum { CCR_OD = 0x04 }; // Data Replacement Disable - enum { CCR_TW = 0x08 }; // Two-Way Mode - enum { CCR_CP = 0x10 }; // Cache Purge - enum { CCR_W0 = 0x40 }; // - enum { CCR_W1 = 0x80 }; // - void AssocPurge(const uint32 A); - - template - void Write_UpdateCache(uint32 A, T V); - // - // End cache stuff - // - - // - // - // Interrupt controller registers and related state - // - // - void INTC_Reset(void) MDFN_COLD; - - bool NMILevel; - uint8 IRL; - - uint16 IPRA; - uint16 IPRB; - uint16 VCRWDT; - uint16 VCRA; - uint16 VCRB; - uint16 VCRC; - uint16 VCRD; - uint16 ICR; - - // - // - // - uint16 BCR1, BCR1M; - - // - // - // - uint8 SBYCR; - bool Standby; - - // - // - // Free-running timer registers and related state - // - // - struct - { - sscpu_timestamp_t lastts; // Internal timestamp related. - - bool FTI; - bool FTCI; - - uint16 FRC; - uint16 OCR[2]; - uint16 FICR; - uint8 TIER; - uint8 FTCSR; - uint8 FTCSRM; // Bits set to 1 like FTCSR, but unconditionally reset all bits to 0 on FTCSR read. - uint8 TCR; - uint8 TOCR; - uint8 RW_Temp; - } FRT; - - void FRT_Reset(void) MDFN_COLD; - - void FRT_CheckOCR(void); - void FRT_ClockFRC(void); - - void FRT_WDT_Update(void); - void FRT_WDT_Recalc_NET(void); - uint32 FRT_WDT_ClockDivider; - sscpu_timestamp_t FRT_WDT_NextTS; - - // - // - // Watchdog timer registers and related state. - // - // - struct - { - uint8 WTCSR; // We don't let a CPU program set bit3 to 1, but we do set bit3 to 1 as part of the standby NMI recovery process(for internal use). - uint8 WTCSRM; - uint8 WTCNT; - uint8 RSTCSR; - uint8 RSTCSRM; - } WDT; - - void WDT_Reset(bool from_internal_wdt) MDFN_COLD; // Reset-reset only, NOT standby reset! - void WDT_StandbyReset(void) MDFN_COLD; - - // - // DMA unit registers and related state - // - bool DMA_RunCond(unsigned ch); - bool DMA_InBurst(void); - void DMA_CheckEnterBurstHack(void); - void DMA_DoTransfer(unsigned ch); - sscpu_timestamp_t DMA_Update(sscpu_timestamp_t); // Takes/return external timestamp - void DMA_StartSG(void); - - const unsigned event_id_dma; - sscpu_timestamp_t dma_lastts; // External SH7095_mem_timestamp related. - - int32 DMA_ClockCounter; - int32 DMA_SGCounter; // When negative, smaller granularity scheduling for DMA_Update() - bool DMA_RoundRobinRockinBoppin; - - struct - { - uint32 SAR; - uint32 DAR; - uint32 TCR; // 24-bit, value of 0 = 2^24 tranfers - uint16 CHCR; - uint16 CHCRM; - uint8 VCR; - uint8 DRCR; - } DMACH[2]; - - uint8 DMAOR; - uint8 DMAORM; - - - // - // - // Division unit registers and related state - // - // - void DIVU_S32_S32(void); - void DIVU_S64_S32(void); - - sscpu_timestamp_t divide_finish_timestamp; - uint32 DVSR; - uint32 DVDNT; - uint32 DVDNTH; - uint32 DVDNTL; - uint32 DVDNTH_Shadow; - uint32 DVDNTL_Shadow; - uint16 VCRDIV; - uint8 DVCR; - -#if 0 - struct - { - uint8 SMR; // Mode - uint8 BRR; // Bit rate - uint8 SCR; // Control - uint8 TDR; // Transmit data - uint8 SSR; // Status - uint8 RDR; // Receive data - - uint8 RSR; // Receive shift register - uint8 TSR; // Transmit shift register - } SCI; -#endif - - const char* const cpu_name; - - // - // - // - bool ExtHalt; - - uint8 (*const ExIVecFetch)(void); - uint8 GetPendingInt(uint8*); - void RecalcPendingIntPEX(void); - - template - INLINE void FetchIF(bool ForceIBufferFill); - - template - void DoIDIF_Real(void); - - template - T ExtBusRead(uint32 A); - - template - void ExtBusWrite(uint32 A, T V); - - template - void OnChipRegWrite(uint32 A, uint32 V); - - template - T OnChipRegRead(uint32 A); - - template - T MemReadRT(uint32 A); - - template - T MemRead(uint32 A); - - template - void MemWriteRT(uint32 A, T V); - - template - void MemWrite(uint32 A, T V); - - - template - INLINE void Branch(uint32 target); - - template - INLINE void CondRelBranch(bool cond, uint32 disp); - - - template - INLINE void UCDelayBranch(uint32 target); - - template - INLINE void UCRelDelayBranch(uint32 disp); - - - // - // - // - // - // - // - public: - - enum - { - // GSREG_PC_ID and GSREG_PC_IF are only valid when Step() was called most recently(but they may be invalid - // for a while after , too...). - GSREG_PC_ID = 0, - GSREG_PC_IF, - - GSREG_PID, - GSREG_PIF, - - GSREG_EP, - - GSREG_RPC, - - GSREG_R0, GSREG_R1, GSREG_R2, GSREG_R3, GSREG_R4, GSREG_R5, GSREG_R6, GSREG_R7, - GSREG_R8, GSREG_R9, GSREG_R10, GSREG_R11, GSREG_R12, GSREG_R13, GSREG_R14, GSREG_R15, - - GSREG_SR, - GSREG_GBR, - GSREG_VBR, - - GSREG_MACH, - GSREG_MACL, - GSREG_PR, - // - // - // - GSREG_NMIL, - GSREG_IRL, - GSREG_IPRA, - GSREG_IPRB, - GSREG_VCRWDT, - GSREG_VCRA, - GSREG_VCRB, - GSREG_VCRC, - GSREG_VCRD, - GSREG_ICR, - // - // - // - GSREG_DVSR, - GSREG_DVDNT, - GSREG_DVDNTH, - GSREG_DVDNTL, - GSREG_DVDNTHS, - GSREG_DVDNTLS, - GSREG_VCRDIV, - GSREG_DVCR, - - // - // - // - GSREG_WTCSR, - GSREG_WTCSRM, - GSREG_WTCNT, - GSREG_RSTCSR, - GSREG_RSTCSRM, - // - // - // - GSREG_DMAOR, - GSREG_DMAORM, - - GSREG_DMA0_SAR, - GSREG_DMA0_DAR, - GSREG_DMA0_TCR, - GSREG_DMA0_CHCR, - GSREG_DMA0_CHCRM, - GSREG_DMA0_VCR, - GSREG_DMA0_DRCR, - - GSREG_DMA1_SAR, - GSREG_DMA1_DAR, - GSREG_DMA1_TCR, - GSREG_DMA1_CHCR, - GSREG_DMA1_CHCRM, - GSREG_DMA1_VCR, - GSREG_DMA1_DRCR, - - GSREG_FRC, - GSREG_OCR0, - GSREG_OCR1, - GSREG_FICR, - GSREG_TIER, - GSREG_FTCSR, - GSREG_FTCSRM, - GSREG_TCR, - GSREG_TOCR, - GSREG_RWT, - }; - - uint32 GetRegister(const unsigned id, char* const special, const uint32 special_len); - void SetRegister(const unsigned id, const uint32 value) MDFN_COLD; - - void CheckRWBreakpoints(void (*MRead)(unsigned len, uint32 addr), void (*MWrite)(unsigned len, uint32 addr)) const; - static void Disassemble(const uint16 instr, const uint32 PC, char* buffer, uint16 (*DisPeek16)(uint32), uint32 (*DisPeek32)(uint32)); - private: - uint32 PC_IF, PC_ID; // Debug-related variables. -}; - -#endif diff --git a/waterbox/ss/sh7095.inc b/waterbox/ss/sh7095.inc deleted file mode 100644 index 53ac2f5a78..0000000000 --- a/waterbox/ss/sh7095.inc +++ /dev/null @@ -1,6736 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* sh7095.inc - Hitachi SH7095 Emulation -** Copyright (C) 2015-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* - Emulation implementation notes/deficiencies: - Overall timing is extremely approximate. - - DMA timing is very rough. DMA burst mode probably isn't handled totally correctly, especially in - relation to the other CPU and the SCU(is DMA burst mode even legal on the Saturn?). - - Misaligned memory accesses(that cause address errors) aren't emulated correctly(for - future reference, there's a difference between how cache versus external bus is accessed - for misaligned addresses, and perhaps a difference between 32-bit and 16-bit spaces as - defined by the BSC too; and then there's misaligned OPM register access semantics...). - - Address errors occur one instruction too soon. - - SLEEP instruction, standby mode, and DMA burst stalls are handled by thoroughly (ab)using the - IF/ID pipeline emulation and opcode dispatch mechanism. - - Individual module clocking disabling functionality of SBYCR isn't handled. - - Interrupts are typically delayed by one instruction, but when the interrupt is handled, - the current interrupt state is used instead of the previous interrupt state. - This can result in the exception-handling pseudo-op code being called when there's - no "current" exception to process, which is a quasi-error condition; there's code to log - this condition and recover from it. An SH-2 code sequence that can cause this condition - if there's currently a pending/unacked interrupt: - - - This cooouuuld turn out to be a problem, and if it does, it can be fixed by having two interrupt-pending variables, - with one being copied to the other in DoIDIF(). - - Instruction fetches don't go through the cache emulation, for performance reasons(getting the instruction fetches timed right - versus the instruction data read/write would be critical, to avoid causing inaccurate cache miss patterns which could cause code - to run slower than on the real thing, which is arguably worse than having it run faster). - - SCI, UBC, and BSC are mostly unemulated. -*/ - -// Address error exception order, sleep versus exceptions. - -/* - TODO: PC-relative addressing, uses instruction or data fetches? -*/ - -/* - TODO: Make sure RecalcPendingIntPEX() is called in all places it needs to be called(which is arguably too many...). -*/ - -/* - TODO: Penalize slave CPU external bus access if we ever figure out a solution to the timestamp vs mem_timestamp problem that doesn't murder - performance. -*/ - -// Shouldn't enable instruction cache emulation until we resolve timestamp vs mem_timestamp issues -// in regards to bus contention and time sharing, or else emulated dual-CPU programs will run slower -// than they should and probably glitch out(and also until 5GHz desktop CPUs are the norm ;)). -//#define SH7095_EMULATE_ICACHE - -#ifdef MSB_FIRST - #define NE32ASU8_IDX_ADJ(T, idx) (idx) -#else - #define NE32ASU8_IDX_ADJ(T, idx) ( ((idx) & ~(sizeof(T) - 1)) ^ (4 - (sizeof(T))) ) -#endif - -SH7095::SH7095(const char* const name_arg, const unsigned event_id_dma_arg, uint8 (*exivecfn_arg)(void)) : event_id_dma(event_id_dma_arg), cpu_name(name_arg), ExIVecFetch(exivecfn_arg) -{ - Init(); -} - -template -static NO_INLINE MDFN_FASTCALL T C_MemReadRT(uint32 A); - -template -static NO_INLINE MDFN_FASTCALL void C_MemWriteRT(uint32 A, T V); - -void SH7095::Init(void) -{ - #define MAHL_P(w, region) { \ - MRFP8[region] = C_MemReadRT; \ - MRFP16[region] = C_MemReadRT; \ - MRFP32[region] = C_MemReadRT; \ - MRFPI[region] = C_MemReadRT; \ - MWFP8[region] = C_MemWriteRT; \ - MWFP16[region] = C_MemWriteRT; \ - MWFP32[region] = C_MemWriteRT; \ - } - - #define MAHL(region) \ - if(this == &CPU[0]) \ - { MAHL_P(0, region) } \ - else \ - { MAHL_P(1, region) } - - MAHL(1) - MAHL(2) - MAHL(3) - MAHL(4) - MAHL(5) - MAHL(6) - MAHL(7) - - #undef MAHL - #undef MAHL_P - // - // - // - - // - // Initialize variables that won't be initialized elsewhere since they reflect the overall emulator timing state, or are cache variables - // for signal inputs. - // - timestamp = 0; - write_finish_timestamp = 0; - divide_finish_timestamp = 0; - FRT.lastts = 0; - dma_lastts = 0; - - FRT.FTI = false; - FRT.FTCI = false; - IRL = 0; - NMILevel = false; - BCR1 &= 0x7FFF; //MD5Level = false; - ExtHalt = false; - - TruePowerOn(); -} - -SH7095::~SH7095() -{ - -} - -void SH7095::AdjustTS(int32 delta, bool force_set) -{ - if(force_set) - { - timestamp = delta; - - MA_until = delta; - MM_until = delta; - -#if 0 - for(unsigned i = 0; i < 16; i++) - WB_until[i] = delta; -#endif - - write_finish_timestamp = delta; - divide_finish_timestamp = delta; - - FRT.lastts = delta; - dma_lastts = delta; - } - else - { - if(!(timestamp & 0x40000000)) - timestamp += delta; - - if(!(MA_until & 0x40000000)) - MA_until += delta; - - if(!(MM_until & 0x40000000)) - MM_until += delta; - -#if 0 - for(unsigned i = 0; i < 16; i++) - { - if(!(WB_until[i] & 0x40000000)) - WB_until[i] += delta; - } -#endif - - if(!(write_finish_timestamp & 0x40000000)) - write_finish_timestamp += delta; - - if(!(divide_finish_timestamp & 0x40000000)) - divide_finish_timestamp += delta; - - FRT.lastts += delta; - dma_lastts += delta; - } - - FRT_WDT_ClockDivider &= 0x00FFFFFF; - FRT_WDT_Recalc_NET(); -} - -// -// Initialize everything for determinism, especially state left "undefined" by reset/power exception handling. -// -void SH7095::TruePowerOn(void) -{ - for(unsigned i = 0; i < 16; i++) - R[i] = 0; - -#if 0 - for(unsigned i = 0; i < 16; i++) - WB_until[i] = 0; -#endif - - PC = 0; - - SR = 0; - GBR = 0; - VBR = 0; - - MACH = 0; - MACL = 0; - PR = 0; - - EPending = 0; - Pipe_ID = 0; - Pipe_IF = 0; - - PC_IF = PC_ID = 0; - - memset(Cache, 0, sizeof(Cache)); - CCR = 0; - - MA_until = 0; - MM_until = 0; - // - // - // - IPRA = 0; - IPRB = 0; - VCRWDT = 0; - VCRA = 0; - VCRB = 0; - VCRC = 0; - VCRD = 0; - ICR = 0; - - // - // - // - FRT.FRC = 0; - FRT.OCR[0] = FRT.OCR[1] = 0; - FRT.FICR = 0; - FRT.TIER = 0; - FRT.FTCSR = 0; - FRT.FTCSRM = 0; - FRT.TCR = 0; - FRT.TOCR = 0; - FRT.RW_Temp = 0; - - FRT_WDT_ClockDivider = 0; - - WDT.WTCSR = 0; - WDT.WTCSRM = 0; - WDT.WTCNT = 0; - WDT.RSTCSR = 0; - WDT.RSTCSRM = 0; - - FRT_WDT_Recalc_NET(); - // - // - // - DMA_ClockCounter = 0; - DMA_SGCounter = 0; - DMA_RoundRobinRockinBoppin = 0; - memset(DMACH, 0, sizeof(DMACH)); - DMAOR = 0; - DMAORM = 0; - // - // - // - DVSR = 0; - DVDNT = 0; - DVDNTH = 0; - DVDNTL = 0; - DVDNTH_Shadow = 0; - DVDNTL_Shadow = 0; - VCRDIV = 0; - DVCR = 0; - // - // - // -} - - - - - -// de=1, dme=1, te=0, nmif=0, ae=0 -INLINE bool SH7095::DMA_RunCond(unsigned ch) -{ - return ((DMAOR & 0x07) == 0x01) && ((DMACH[ch].CHCR & 0x03) == 0x01); -} - -bool SH7095::DMA_InBurst(void) -{ - if((DMAOR & 0x08) && DMA_RunCond(0) && DMA_RunCond(1)) - return ((DMACH[0].CHCR | DMACH[1].CHCR) & 0x10); - - if(DMA_RunCond(0)) - return (DMACH[0].CHCR & 0x10); - else if(DMA_RunCond(1)) - return (DMACH[1].CHCR & 0x10); - - return false; -} - -void SH7095::DMA_CheckEnterBurstHack(void) -{ - if(DMA_InBurst()) - SetPEX(PEX_PSEUDO_DMABURST); -} - - -// RecalcPendingIntPEX() will be called higher up, at the end of DMA_Update() -// -// Call SH7095_Bus* directly instead of through ExtBusRead, at least until we can work -// out all this disparate timestamp nonsense properly(maybe around the time we add proper bus controller emulation? ;)). -// -INLINE void SH7095::DMA_DoTransfer(unsigned ch) -{ - static const int8 ainc[3][4] = - { - { 0, 1, -1, -1 }, - { 0, 2, -2, -2 }, - { 0, 4, -4, -4 }, - }; - const unsigned ts = (DMACH[ch].CHCR >> 10) & 3; - const unsigned sm = (DMACH[ch].CHCR >> 12) & 3; - const unsigned dm = (DMACH[ch].CHCR >> 14) & 3; - uint32 sar = DMACH[ch].SAR; - uint32 dar = DMACH[ch].DAR; - uint32 tcr = DMACH[ch].TCR; - - switch(ts) - { - case 0x00: // 8-bit - { - uint8 buffer; - - buffer = SH7095_BusRead(sar & 0x07FFFFFF, false, &DMA_ClockCounter); - SH7095_BusWrite(dar & 0x07FFFFFF, buffer, false, &DMA_ClockCounter); - - sar += ainc[0][sm]; - dar += ainc[0][dm]; - tcr = (tcr - 1) & 0xFFFFFF; - } - break; - - case 0x01: // 16-bit - { - uint16 buffer; - - buffer = SH7095_BusRead(sar & 0x07FFFFFE, false, &DMA_ClockCounter); - SH7095_BusWrite(dar & 0x07FFFFFE, buffer, false, &DMA_ClockCounter); - - if(MDFN_UNLIKELY((sar | dar) & 0x1)) - { - DMAOR |= 4; - DMAORM |= 4; - SetPEX(PEX_DMAADDR); - } - - sar += ainc[1][sm]; - dar += ainc[1][dm]; - tcr = (tcr - 1) & 0xFFFFFF; - } - break; - - case 0x02: // 32-bit - { - uint32 buffer; - - buffer = SH7095_BusRead(sar & 0x07FFFFFC, false, &DMA_ClockCounter); - SH7095_BusWrite(dar & 0x07FFFFFC, buffer, false, &DMA_ClockCounter); - - if(MDFN_UNLIKELY((sar | dar) & 0x3)) - { - DMAOR |= 4; - DMAORM |= 4; - SetPEX(PEX_DMAADDR); - } - - sar += ainc[2][sm]; - dar += ainc[2][dm]; - tcr = (tcr - 1) & 0xFFFFFF; - } - break; - - case 0x03: // 4 * 32-bit, a mess... - { - uint32 buffer[4]; - - if(MDFN_UNLIKELY((sar | dar) & 0x3)) - { - DMAOR |= 4; - DMAORM |= 4; - SetPEX(PEX_DMAADDR); - } - - for(unsigned i = 0; i < 4; i++) - { - buffer[i] = SH7095_BusRead((sar + (i << 2)) & 0x07FFFFFC, (bool)i, &DMA_ClockCounter); - } - - sar += 0x10; - - for(unsigned i = 0; i < 4; i++) - { - SH7095_BusWrite(dar & 0x07FFFFFC, buffer[i], false, &DMA_ClockCounter); - dar += ainc[2][dm]; - tcr = (tcr - 1) & 0xFFFFFF; - if(MDFN_UNLIKELY(!tcr)) - break; - } - } - break; - } - - if(!tcr) - { - SS_DBGTI(SS_DBG_SH2, "[%s] DMA %d finished.", cpu_name, ch); - - DMACH[ch].CHCR |= 2; - DMACH[ch].CHCRM |= 2; - } - - DMACH[ch].SAR = sar; - DMACH[ch].DAR = dar; - DMACH[ch].TCR = tcr; -} - -sscpu_timestamp_t SH7095::DMA_Update(sscpu_timestamp_t et) -{ - if(MDFN_UNLIKELY(et < dma_lastts)) - { - // et < dma_lastts may happen...look into it. - if(et < dma_lastts) - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] DMA_Update called with et(%u) < dma_lastts(%u).\n", cpu_name, et, dma_lastts); - } - else if(MDFN_UNLIKELY(ExtHalt)) - { - dma_lastts = et; - return dma_lastts + 128; - } - else - { - uint32 clocks = et - dma_lastts; - dma_lastts = et; - - // - // - // - bool rr = DMA_RoundRobinRockinBoppin; - - DMA_ClockCounter += clocks; - DMA_SGCounter += clocks; - - if(DMAOR & 0x08) // Round robin - { - while(DMA_RunCond(0) || DMA_RunCond(1)) - { - if(DMA_RunCond(rr)) - { - if(DMA_ClockCounter <= 0) - goto TimeOver; - - DMA_DoTransfer(rr); - } - rr = !rr; - } - } - else // ch 0 > ch1 - { - while(DMA_RunCond(0)) - { - if(DMA_ClockCounter <= 0) - goto TimeOver; - - DMA_DoTransfer(0); - } - - while(DMA_RunCond(1)) - { - if(DMA_ClockCounter <= 0) - goto TimeOver; - - DMA_DoTransfer(1); - } - } - // - // - // - TimeOver:; - - DMA_RoundRobinRockinBoppin = rr; - DMA_ClockCounter = std::min(DMA_ClockCounter, 128); - DMA_SGCounter = std::min(DMA_SGCounter, 0); - - DMA_CheckEnterBurstHack(); - RecalcPendingIntPEX(); // TODO: conditionalize(or make RecalcPendingIntPEX() less expensive). - } - - return dma_lastts + ((DMA_SGCounter < 0) ? 32 : 128); -} - -// DMA_StartSG() must be paired with a DMA_Update(SH7095_mem_timestamp) somewhere before. -void SH7095::DMA_StartSG(void) -{ - DMA_SGCounter = DMA_ClockCounter - 128; - SS_SetEventNT(&events[event_id_dma], SH7095_mem_timestamp + 32); // fixed + 32, don't evaluate DMA_SGCounter here. - - DMA_CheckEnterBurstHack(); -} - - -// -// -// -void NO_INLINE SH7095::FRT_Reset(void) -{ - FRT.FRC = 0x00; - FRT.OCR[0] = FRT.OCR[1] = 0x00; - FRT.FICR = 0x00; - FRT.TIER = 0x00; - FRT.FTCSR = 0x00; - FRT.FTCSRM = 0x00; - FRT.TCR = 0x00; - FRT.TOCR = 0x00; - FRT.RW_Temp = 0x00; // Reset or not? - - FRT_WDT_Recalc_NET(); - RecalcPendingIntPEX(); -} - -INLINE void SH7095::FRT_CheckOCR(void) -{ - if(FRT.FRC == FRT.OCR[0]) // OCRA - { - if(FRT.FTCSR & 0x0001) - FRT.FRC = 0; - - if(!(FRT.FTCSR & 0x08)) - { - FRT.FTCSR |= 0x08; - FRT.FTCSRM |= 0x08; - RecalcPendingIntPEX(); - } - } - - if(FRT.FRC == FRT.OCR[1]) // OCRB - { - if(!(FRT.FTCSR & 0x04)) - { - FRT.FTCSR |= 0x04; - FRT.FTCSRM |= 0x04; - RecalcPendingIntPEX(); - } - } -} - -INLINE void SH7095::FRT_ClockFRC(void) -{ - FRT.FRC++; - if(!FRT.FRC) - { - if(!(FRT.FTCSR & 0x02)) - { - FRT.FTCSR |= 0x02; // OVF - FRT.FTCSRM |= 0x02; - RecalcPendingIntPEX(); - } - } - // - // - // - FRT_CheckOCR(); -} - - -static const uint8 wdt_cstab[8] = { 1, /**/ 6, 7, 8, 9, 10, /**/ 12, 13 }; - -// -// Call after: -// WDT.WTCSR, WDT.WTCNT, FRT.TCR, FRT.OCR[0], FRT.OCR[1] changes due to register write or similar. -// timestamp >= FRT_WDT_NextTS (after call to FRT_WDT_Update()) -// -void SH7095::FRT_WDT_Recalc_NET(void) -{ - int32 rt = 1000; - - if((FRT.TCR & 0x3) != 0x3) // when == 3, count on rising edge of external clock(not handled here). - { - const uint32 frt_clockshift = 3 + ((FRT.TCR & 0x3) << 1); // /8, /32, /128, count at falling edge - int32 next_frc = 0x10000; - - if(FRT.OCR[0] > FRT.FRC) - next_frc = FRT.OCR[0]; - - if(FRT.OCR[1] > FRT.FRC) - next_frc = FRT.OCR[1]; - - rt = ((next_frc - FRT.FRC) << frt_clockshift) - (FRT_WDT_ClockDivider & ((1 << frt_clockshift) - 1)); - } - - if(WDT.WTCSR & 0x28) // TME(0x20) and internal use standby NMI recover bit(0x08) - { - const unsigned wdt_clockshift = wdt_cstab[WDT.WTCSR & 0x7]; - int32 wdt_rt; - - wdt_rt = ((0x100 - WDT.WTCNT) << wdt_clockshift) - (FRT_WDT_ClockDivider & ((1 << wdt_clockshift) - 1)); - rt = std::min(rt, wdt_rt); - } - - assert(rt > 0); - - FRT_WDT_NextTS = timestamp + rt; -} - -void SH7095::FRT_WDT_Update(void) -{ - assert(timestamp >= FRT.lastts); - - uint32 clocks = timestamp - FRT.lastts; - - //if(clocks >= 1000) - // printf("%u, %d %d\n", clocks, timestamp, FRT.lastts); - //assert(clocks < 1000); - - FRT.lastts = timestamp; - - // - // - // - const uint32 PreAddCD = FRT_WDT_ClockDivider; - FRT_WDT_ClockDivider += clocks; - - if((FRT.TCR & 0x3) != 0x3) // when == 3, count on rising edge of external clock(not handled here). - { - const uint32 frt_clockshift = 3 + ((FRT.TCR & 0x3) << 1); // /8, /32, /128, count at falling edge - uint32 divided_clocks = (FRT_WDT_ClockDivider >> frt_clockshift) - (PreAddCD >> frt_clockshift); - - while(divided_clocks-- > 0) - { - FRT_ClockFRC(); - } - } - - // WDT: - if(WDT.WTCSR & 0x28) // TME(0x20) and internal use standby NMI recover bit(0x08) - { - const unsigned wdt_clockshift = wdt_cstab[WDT.WTCSR & 0x7]; - uint32 divided_clocks = (FRT_WDT_ClockDivider >> wdt_clockshift) - (PreAddCD >> wdt_clockshift); - uint32 tmp_counter = WDT.WTCNT; - - tmp_counter += divided_clocks; - WDT.WTCNT = tmp_counter; - // - // - if(MDFN_UNLIKELY(tmp_counter >= 0x100)) - { - if(MDFN_UNLIKELY(WDT.WTCSR & 0x08)) - { - Standby = false; - WDT.WTCNT = 0x00; - WDT.WTCSR &= ~0x08; - } - else if(MDFN_UNLIKELY(WDT.WTCSR & 0x40)) // Watchdog timer mode - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] WDT overflow in WDT mode!\n", cpu_name); - WDT.RSTCSR |= 0x80; - - WDT.WTCNT = 0; - WDT.WTCSR = 0; - - if(WDT.RSTCSR & 0x40) // RSTE - Reset(!(WDT.RSTCSR & 0x20), true); - } - else - { - if(!(WDT.WTCSR & 0x80)) - { - WDT.WTCSR |= 0x80; - WDT.WTCSRM |= 0x80; - RecalcPendingIntPEX(); - } - } - } - } -} - -void SH7095::SetFTI(bool state) -{ - FRT_WDT_Update(); - // - // - bool prev = FRT.FTI; - FRT.FTI = state; - - if((prev ^ state) & (prev ^ (FRT.TCR >> 7))) - { - SS_DBGTI(SS_DBG_SH2, "[%s] FTI input capture triggered.", cpu_name); - if((FRT.FTCSR & 0x80) || (FRT.FTCSRM & 0x80)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] FTI Input capture interrupt while software not ready? FTCSR=0x%02x, FTCSRM=0x%02x\n", cpu_name, FRT.FTCSR, FRT.FTCSRM); - } - - FRT.FICR = FRT.FRC; - if(!(FRT.FTCSR & 0x80)) - { - FRT.FTCSR |= 0x80; - FRT.FTCSRM |= 0x80; - } - RecalcPendingIntPEX(); - } -} - -void SH7095::SetFTCI(bool state) -{ - bool prev = FRT.FTCI; - FRT.FTCI = state; - - if((FRT.TCR & 0x3) == 0x3) - { - if(!prev && state) - FRT_ClockFRC(); - } -} - -void NO_INLINE SH7095::WDT_Reset(bool from_internal_wdt) -{ - WDT.WTCSR = 0x00; - WDT.WTCSRM = 0x00; - - WDT.WTCNT = 0x00; - - if(!from_internal_wdt) - { - WDT.RSTCSR = 0x00; - WDT.RSTCSRM = 0x00; - } - - FRT_WDT_Recalc_NET(); - RecalcPendingIntPEX(); -} - -void NO_INLINE SH7095::WDT_StandbyReset(void) -{ - WDT.WTCSR &= 0x1F; - WDT.WTCSRM &= 0x1F; - - WDT.RSTCSR = 0x00; - WDT.RSTCSRM = 0x00; - - FRT_WDT_Recalc_NET(); - RecalcPendingIntPEX(); -} - -// -// -// -// -// - -static INLINE uint64 DIVU64_Partial(uint64 dividend, uint32 divisor) -{ - bool M, Q; - - Q = dividend >> 63; - M = divisor >> 31; - - for(unsigned x = 0; x < 3; x++) - { - if(!(Q ^ M)) - dividend -= (uint64)divisor << 32; - else - dividend += (uint64)divisor << 32; - - Q = dividend >> 63; - dividend <<= 1; - dividend |= Q ^ 1 ^ M; - } - - return dividend; -} - -INLINE void SH7095::DIVU_S32_S32(void) -{ - if(!DVSR) - { - divide_finish_timestamp = MA_until + 2 + 6; - - DVCR |= 1; - RecalcPendingIntPEX(); - - DVDNTH = (int32)DVDNT >> 29; - - if(!(DVCR & 2)) - DVDNT = DVDNTL = 0x7FFFFFFF + ((int32)DVDNT < 0); - else - DVDNT = DVDNTL = (DVDNT << 3) | (((int32)~DVDNT >> 31) & 7); - } - else - { - divide_finish_timestamp = MA_until + 1 + 39; - - if(DVSR == 0xFFFFFFFF && DVDNTL == 0x80000000) - { - DVDNT = DVDNTL = 0x80000000; - DVDNTH = 0; - } - else - { - DVDNTH = (int32)DVDNTL % (int32)DVSR; - DVDNT = DVDNTL = (int32)DVDNTL / (int32)DVSR; - } - } - DVDNTH_Shadow = DVDNTH; - DVDNTL_Shadow = DVDNTL; -} - -INLINE void SH7095::DIVU_S64_S32(void) -{ - const int32 divisor = DVSR; - const int64 dividend = ((int64)DVDNTH << 32) | DVDNTL; - int64 quotient; - - if(!divisor) - goto Overflow; - - if((uint64)dividend == (1ULL << 63) && (uint32)divisor == ~(uint32)0) - goto Overflow; - - quotient = dividend / divisor; - - //printf("Divisor=%08x, Dividend=%016llx, Quotient=%016llx\n", divisor, dividend, quotient); - - if(quotient == 2147483648LL && divisor < 0 && (dividend % divisor) == 0) // Ugh, maybe we should just implement it properly the long way... - goto SkipOVCheck; - - if(quotient < -2147483647LL || quotient > 2147483647LL) - { - Overflow: - divide_finish_timestamp = timestamp + 6; - DVCR |= 1; - RecalcPendingIntPEX(); - // - uint64 tmp = DIVU64_Partial(dividend, divisor); - DVDNTH = tmp >> 32; - - if(DVCR & 2) - DVDNT = DVDNTL = tmp; - else - DVDNT = DVDNTL = 0x7FFFFFFF + ((int32)((dividend >> 32) ^ divisor) < 0); - } - else - { - SkipOVCheck: - divide_finish_timestamp = timestamp + 39; - DVDNTH = dividend % divisor; - DVDNT = DVDNTL = quotient; - } - DVDNTH_Shadow = DVDNTH; - DVDNTL_Shadow = DVDNTL; -} - -// -// Misaligned/wrong-sized accesses aren't handled correctly, it's a mess, but probably doesn't matter. -// -template -NO_INLINE void SH7095::OnChipRegWrite(uint32 A, uint32 V) -{ - //SS_DBG(SS_DBG_SH2_REGW, "[%s] %zu-byte write to on-chip register area; address=0x%08x value=0x%08x\n", cpu_name, sizeof(T), A, V); - - if(A & 0x100) - { - if(sizeof(T) == 2) - A &= 0xFE; - else - A &= 0xFC; - - if(sizeof(T) == 1) - { - SetPEX(PEX_CPUADDR); - V |= (uint8)V << 8; - } - - switch(A) - { - default: - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Unhandled %zu-byte write to on-chip high register area; address=0x%08x value=0x%08x\n", cpu_name, sizeof(T), A, V); - break; - - // - // Division Unit registers - // - case 0x20: - case 0x00: - DVSR = V; - break; - - case 0x24: - case 0x04: - DVDNT = V; - DVDNTL = V; - DVDNTH = (int32)V >> 31; - DIVU_S32_S32(); - break; - - case 0x28: - case 0x08: - DVCR = V & 0x3; - break; - - case 0x2C: - case 0x0C: - VCRDIV = V; - break; - - case 0x30: - case 0x10: - DVDNTH = V; - break; - - case 0x34: - case 0x14: - DVDNTL = V; - DIVU_S64_S32(); - break; - - // ? - case 0x38: - case 0x18: - DVDNTH_Shadow = V; - break; - - case 0x3C: - case 0x1C: - DVDNTL_Shadow = V; - break; - // - // - // - - // - // DMA registers - // - case 0x80: - case 0x90: - DMACH[(A >> 4) & 1].SAR = V; - break; - - case 0x84: - case 0x94: - DMACH[(A >> 4) & 1].DAR = V; - break; - - case 0x88: - case 0x98: - DMACH[(A >> 4) & 1].TCR = V & 0xFFFFFF; - break; - - case 0x8C: - case 0x9C: - DMA_Update(SH7095_mem_timestamp); - { - const unsigned ch = (A >> 4) & 1; - - DMACH[ch].CHCR = (V & ~2) | (DMACH[ch].CHCR & (V | DMACH[ch].CHCRM) & 2); - SS_DBGTI(SS_DBG_SH2, "[%s] DMA %d CHCR Write: CHCR=0x%04x SAR=0x%08x DAR=0x%08x TCR=0x%04x", cpu_name, ch, DMACH[ch].CHCR, DMACH[ch].SAR, DMACH[ch].DAR, DMACH[ch].TCR); - - if((DMACH[ch].CHCR & 0x1) && (DMACH[ch].CHCR & 0x3E8) != 0x200) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Unhandled CHCR on DMA channel %u: 0x%08x\n", cpu_name, ch, DMACH[ch].CHCR); - } - } - DMA_StartSG(); - RecalcPendingIntPEX(); - break; - - case 0xA0: - case 0xA8: - DMACH[(A >> 3) & 1].VCR = V; - break; - - case 0xB0: - DMA_Update(SH7095_mem_timestamp); - DMAOR = (V & 0x9) | (DMAOR & (V | DMAORM) & 0x6); - DMA_StartSG(); - break; - - // - // BSC registers - // - case 0xE0: // BCR1 - case 0xE2: - BCR1 = (BCR1 &~ BCR1M) | (V & BCR1M); // Not sure if this is right, TODO: test somehow. - BCR1M = 0; - break; - } - } - else - { - unsigned mask = 0xFFFF; - unsigned shift = 0; - - if(sizeof(T) != 2) - { - shift = ((A & 1) ^ 1) << 3; - mask = 0xFF << shift; - - if(sizeof(T) == 4) - shift ^= 8; - } - - if(sizeof(T) == 4) - SetPEX(PEX_CPUADDR); - - switch(A & 0xFF) - { - default: - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Unhandled %zu-byte write to on-chip low register area; address=0x%08x value=0x%08x\n", cpu_name, sizeof(T), A, V); - break; - - // - // Free-running timer registers. - // - // - // TIER - case 0x10: - FRT_WDT_Update(); - // - FRT.TIER = V; - RecalcPendingIntPEX(); - break; - - // FTCSR - case 0x11: - FRT_WDT_Update(); - // - FRT.FTCSR = (FRT.FTCSR & (FRT.FTCSRM | V) & 0x8E) | (V & 0x01); - RecalcPendingIntPEX(); - FRT_CheckOCR(); - break; - - // FRCH - case 0x12: - FRT.RW_Temp = V; - break; - - // FRCL - case 0x13: - FRT_WDT_Update(); - // - FRT.FRC = (FRT.RW_Temp << 8) | (V & 0xFF); - FRT_CheckOCR(); - FRT_WDT_Recalc_NET(); - break; - - // OCRA/B H - case 0x14: - FRT.RW_Temp = V; - break; - - // OCRA/B L - case 0x15: - FRT_WDT_Update(); - // - FRT.OCR[(FRT.TOCR >> 4) & 1] = (FRT.RW_Temp << 8) | V; - FRT_CheckOCR(); - FRT_WDT_Recalc_NET(); - break; - - // TCR - case 0x16: - { - FRT_WDT_Update(); - // - //const uint8 old_TCR = FRT.TCR; - FRT.TCR = V; -#if 0 - // - // Maybe not worth emulating?: - // - if((old_TCR ^ FRT.TCR) & 3) - { - bool old_cs; - bool clock; - - if((old_TCR & 0x3) == 3) - old_cs = FRT.FTCI; - else - old_cs = (FRT_WDT_.ClockDivider >> (3 - 1 + ((old_TCR & 0x3) << 1))) & 1; - - if((V & 0x3) == 3) - clock = (!old_cs && FRT.FTCI); - else - { - bool new_cs = (FRT_WDT_ClockDivider >> (3 - 1 + ((FRT.TCR & 0x3) << 1))) & 1; - - clock = (old_cs && !new_cs); - } - - if(clock) - FRT_ClockFRC(); - } -#endif - // - // - // - FRT_WDT_Recalc_NET(); - } - break; - - // TOCR - case 0x17: - FRT.TOCR = V & 0x1F; - break; - - // - // - // - case 0x71: - case 0x72: - DMACH[(A & 1) ^ 1].DRCR = V & 0x3; - break; - - - // - // WDT registers - // - case 0x80: - case 0x88: - FRT_WDT_Update(); - if(sizeof(T) == 2) - { - if((V & 0xFF00) == 0x5A00) - { - if(WDT.WTCSR & 0x20) - WDT.WTCNT = V; - } - else if((V & 0xFF00) == 0xA500) - { - WDT.WTCSR = (WDT.WTCSR & (WDT.WTCSRM | V) & 0x80) | (V & 0x67); - - if(WDT.WTCSR & 0x20) - SBYCR &= 0x7F; - else - { - WDT.WTCSR &= ~0x80; // Seemingly undocumented... - WDT.WTCNT = 0; - } - } - } - WDT.RSTCSRM = 0; - FRT_WDT_Recalc_NET(); - RecalcPendingIntPEX(); - break; - - case 0x82: - case 0x8A: - FRT_WDT_Update(); - if(sizeof(T) == 2) - { - if(V == 0xA500) - { - // Clear OVF bit - WDT.RSTCSR &= ~WDT.RSTCSRM; - } - else if((V & 0xFF00) == 0x5A00) - { - // Write RSTE and RSTS bits - WDT.RSTCSR = (WDT.RSTCSR & 0x80) | (V & 0x60); - } - } - WDT.RSTCSRM = 0; - break; - - case 0x81: - case 0x83: - case 0x84: - case 0x85: - case 0x86: - case 0x87: - case 0x89: - case 0x8B: - case 0x8C: - case 0x8D: - case 0x8E: - case 0x8F: - WDT.RSTCSRM = 0; - break; - - // - // - // - case 0x91: - SBYCR = V; - - if(WDT.WTCSR & 0x20) - SBYCR &= 0x7F; - - if(SBYCR != 0) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] SBYCR set to non-zero value: 0x%02x\n", cpu_name, V); - } - break; - - case 0x92: case 0x93: case 0x94: case 0x95: - case 0x96: case 0x97: case 0x98: case 0x99: - case 0x9A: case 0x9B: case 0x9C: case 0x9D: - case 0x9E: - SetCCR(V); - break; - - - // - // - // - case 0x60: - case 0x61: - IPRB = (IPRB &~ mask) | ((V << shift) & mask & 0xFF00); - RecalcPendingIntPEX(); - break; - - case 0x62: - case 0x63: - VCRA = (VCRA &~ mask) | ((V << shift) & mask & 0x7F7F); - break; - - case 0x64: - case 0x65: - VCRB = (VCRB &~ mask) | ((V << shift) & mask & 0x7F7F); - break; - - case 0x66: - case 0x67: - VCRC = (VCRC &~ mask) | ((V << shift) & mask & 0x7F7F); - break; - - case 0x68: - case 0x69: - VCRD = (VCRD &~ mask) | ((V << shift) & mask & 0x7F00); - break; - - case 0xE0: - case 0xE1: - ICR = (ICR &~ mask) | ((V << shift) & mask & 0x0101); - if(ICR & 0x0100) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] NMIE=1\n", cpu_name); - } - RecalcPendingIntPEX(); - break; - - case 0xE2: - case 0xE3: - IPRA = (IPRA &~ mask) | ((V << shift) & mask & 0xFFF0); - RecalcPendingIntPEX(); - break; - - case 0xE4: - case 0xE5: - VCRWDT = (VCRWDT &~ mask) | ((V << shift) & mask & 0x7F7F); - break; - } - } -} - -template -INLINE T SH7095::OnChipRegRead(uint32 A) -{ - if(A & 0x100) - { - uint32 ret = 0; - - MA_until++; - - if(sizeof(T) == 2) - A &= 0xFE; - else - A &= 0xFC; - - if(sizeof(T) == 1) - SetPEX(PEX_CPUADDR); - - switch(A) - { - default: - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Unhandled %zu-byte read from on-chip high register area; address=0x%08x\n", cpu_name, sizeof(T), A); - break; - - // - // Division Unit registers - // - case 0x20: - case 0x22: - case 0x00: - case 0x02: - MA_until = std::max(MA_until, divide_finish_timestamp); - ret = DVSR; - break; - - case 0x24: - case 0x26: - case 0x04: - case 0x06: - MA_until = std::max(MA_until, divide_finish_timestamp); - ret = DVDNT; - break; - - case 0x28: - case 0x2A: - case 0x08: - case 0x0A: - MA_until = std::max(MA_until, divide_finish_timestamp); - ret = DVCR; - break; - - case 0x2C: - case 0x2E: - case 0x0C: - case 0x0E: - MA_until = std::max(MA_until, divide_finish_timestamp); - ret = VCRDIV; - break; - - case 0x30: - case 0x32: - case 0x10: - case 0x12: - MA_until = std::max(MA_until, divide_finish_timestamp); - ret = DVDNTH; - break; - - case 0x34: - case 0x36: - case 0x14: - case 0x16: - MA_until = std::max(MA_until, divide_finish_timestamp); - ret = DVDNTL; - break; - - // ? - case 0x38: - case 0x3A: - case 0x18: - case 0x1A: - MA_until = std::max(MA_until, divide_finish_timestamp); - ret = DVDNTH_Shadow; - break; - - case 0x3C: - case 0x3E: - case 0x1C: - case 0x1E: - MA_until = std::max(MA_until, divide_finish_timestamp); - ret = DVDNTL_Shadow; - break; - // - // - // - - // - // DMA registers - // - case 0x80: - case 0x90: - ret = DMACH[(A >> 4) & 1].SAR; - break; - - case 0x84: - case 0x94: - ret = DMACH[(A >> 4) & 1].DAR; - break; - - case 0x88: - case 0x98: - ret = DMACH[(A >> 4) & 1].TCR; - break; - - case 0x8C: - case 0x9C: - { - const unsigned ch = (A >> 4) & 1; - - ret = DMACH[ch].CHCR; - DMACH[ch].CHCRM = 0; - } - break; - - case 0xA0: - case 0xA8: - ret = DMACH[(A >> 3) & 1].VCR; - break; - - case 0xB0: - ret = DMAOR; - DMAORM = 0; - break; - - // - // BSC registers - // - case 0xE0: // BCR1 - case 0xE2: - ret = BCR1; - break; - } - - if(sizeof(T) == 1) - ret >>= ((A & 1) ^ 1) << 3; - - return ret; - } - else - { - const unsigned Am = (uint8)A; - const unsigned shift = ((sizeof(T) != 2) ? (((A & 1) ^ 1) << 3) : 0); - uint16 ret = 0; - - if(Am < 0x20) - MA_until = (MA_until + 11) &~ 1; // FIXME: not quite right. //3; - else if((Am >= 0x60 && Am < 0xA0) || Am >= 0xE0) - MA_until += 3; - else - MA_until += 1; - - if(sizeof(T) == 4) - SetPEX(PEX_CPUADDR); - - else switch(Am) - { - default: - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Unhandled %zu-byte read from on-chip low register area; address=0x%08x\n", cpu_name, sizeof(T), A); - break; - - // - // FRT registers. Some weirdness with 16-bit reads duplicating the lower 8 bits in the upper 8-bits, but the upper 8-bits are masked - // with the last data written to the FRT area or something...not emulated here. - // - case 0x10: - ret = FRT.TIER | 1; - break; - - case 0x11: - FRT_WDT_Update(); - // - ret = FRT.FTCSR; - FRT.FTCSRM = 0x00; - break; - - case 0x12: - FRT_WDT_Update(); - // - FRT.RW_Temp = FRT.FRC; - ret = FRT.FRC >> 8; - break; - - case 0x13: - ret = FRT.RW_Temp; - break; - - case 0x14: - ret = FRT.OCR[(FRT.TOCR >> 4) & 1] >> 8; - break; - - case 0x15: - ret = FRT.OCR[(FRT.TOCR >> 4) & 1] & 0xFF; - break; - - case 0x16: - ret = FRT.TCR; - break; - - case 0x17: - ret = FRT.TOCR | 0xE0; - break; - - case 0x18: - FRT.RW_Temp = FRT.FICR; - ret = FRT.FICR >> 8; - break; - - case 0x19: - ret = FRT.RW_Temp; - break; - - // - // - // - case 0x71: - case 0x72: - ret = DMACH[(A & 1) ^ 1].DRCR; - break; - - - // - // WDT registers - // - case 0x80: - case 0x88: - FRT_WDT_Update(); - ret = WDT.WTCSR | 0x18; - WDT.WTCSRM = 0x00; - break; - - case 0x81: - case 0x89: - FRT_WDT_Update(); - ret = WDT.WTCNT; - break; - - case 0x82: - case 0x85: - case 0x86: - case 0x87: - case 0x8A: - case 0x8D: - case 0x8E: - case 0x8F: - ret = 0xFF; - break; - - case 0x83: - case 0x8B: - FRT_WDT_Update(); - ret = WDT.RSTCSR | 0x1F; - WDT.RSTCSRM = (WDT.RSTCSR & 0x80); - break; - - // FIXME: WDT open bus of a sort. - // case 0x84: - // case 0x8C: - - // - // - // - - case 0x91: - ret = SBYCR; - break; - - case 0x92: case 0x93: case 0x94: case 0x95: - case 0x96: case 0x97: case 0x98: case 0x99: - case 0x9A: case 0x9B: case 0x9C: case 0x9D: - case 0x9E: - ret = CCR | (CCR << 8); - break; - // - // - // - case 0x60: - case 0x61: - ret = IPRB >> shift; - break; - - case 0x62: - case 0x63: - ret = VCRA >> shift; - break; - - case 0x64: - case 0x65: - ret = VCRB >> shift; - break; - - case 0x66: - case 0x67: - ret = VCRC >> shift; - break; - - case 0x68: - case 0x69: - ret = VCRD >> shift; - break; - - case 0x6A: case 0x6B: case 0x6C: case 0x6D: case 0x6E: case 0x6F: - ret = 0xFFFF >> shift; - break; - - case 0xE0: - case 0xE1: - ret = (ICR | (NMILevel << 15)) >> shift; - break; - - case 0xE2: - case 0xE3: - ret = IPRA >> shift; - break; - - case 0xE4: - case 0xE5: - ret = VCRWDT >> shift; - break; - - case 0xE6: case 0xE7: - case 0xE8: case 0xE9: case 0xEA: case 0xEB: case 0xEC: case 0xED: case 0xEE: case 0xEF: - case 0xF0: case 0xF1: case 0xF2: case 0xF3: case 0xF4: case 0xF5: case 0xF6: case 0xF7: - case 0xF8: case 0xF9: case 0xFA: case 0xFB: case 0xFC: case 0xFD: case 0xFE: case 0xFF: - ret = 0xFFFF >> shift; - break; - } - - return ret; - } -} - -template -INLINE T SH7095::ExtBusRead(uint32 A) -{ - T ret; - - A &= (1U << 27) - 1; - - if(timestamp > SH7095_mem_timestamp) - SH7095_mem_timestamp = timestamp; - - ret = SH7095_BusRead(A, BurstHax, NULL); - - return ret; -} - -template -INLINE void SH7095::ExtBusWrite(uint32 A, T V) -{ - A &= (1U << 27) - 1; - - if(timestamp > SH7095_mem_timestamp) - SH7095_mem_timestamp = timestamp; - - SH7095_BusWrite(A, V, false, NULL); - - write_finish_timestamp = SH7095_mem_timestamp; -} - - -// -// -// -static const struct -{ - uint8 AND; - uint8 OR; -} LRU_Update_Tab[4] = -{ - { (1 << 2) | (1 << 1) | (1 << 0), /**/ (0 << 5) | (0 << 4) | (0 << 3) }, // Way 0 - { (1 << 4) | (1 << 3) | (1 << 0), /**/ (1 << 5) | (0 << 2) | (0 << 1) }, // Way 1 - { (1 << 5) | (1 << 3) | (1 << 1), /**/ (1 << 4) | (1 << 2) | (0 << 0) }, // Way 2 - { (1 << 5) | (1 << 4) | (1 << 2), /**/ (1 << 3) | (1 << 1) | (1 << 0) }, // Way 3 -}; - -static const int8 LRU_Replace_Tab[0x40] = -{ - /* 0x00 */ 0x03, 0x02, -1, 0x02, 0x03, -1, 0x01, 0x01, -1, 0x02, -1, 0x02, -1, -1, 0x01, 0x01, - /* 0x10 */ 0x03, -1, -1, -1, 0x03, -1, 0x01, 0x01, -1, -1, -1, -1, -1, -1, 0x01, 0x01, - /* 0x20 */ 0x03, 0x02, -1, 0x02, 0x03, -1, -1, -1, -1, 0x02, -1, 0x02, -1, -1, -1, -1, - /* 0x30 */ 0x03, -1, -1, -1, 0x03, -1, -1, -1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 -}; - -static INLINE uint32 cmov_eq_thing(const uint32 reg_compval, const uint32 mem_compval, uint32 var, const uint32 repl_var) -{ - #ifdef ARCH_X86 - asm( "cmpl %1, %2\n\t" - "cmove %3,%0\n\t" - : "+r"(var) - : "r"(reg_compval), "g"(mem_compval), "r"(repl_var) - : "cc"); - #else - #ifdef __GNUC__ - #warning "Conditional move inline assembly not being used." - #endif - var = ((reg_compval == mem_compval) ? repl_var : var); - #endif - - return var; -} - -INLINE void SH7095::AssocPurge(const uint32 A) -{ - const uint32 ATM = A & (0x7FFFF << 10); - auto* cent = &Cache[(A >> 4) & 0x3F]; - - // Ignore two-way-mode bit in CCR here. - if(ATM == cent->Tag[0]) cent->Tag[0] |= 1U << 31; // Set invalid bit to 1. - if(ATM == cent->Tag[1]) cent->Tag[1] |= 1U << 31; - if(ATM == cent->Tag[2]) cent->Tag[2] |= 1U << 31; - if(ATM == cent->Tag[3]) cent->Tag[3] |= 1U << 31; -} - -template -INLINE T SH7095::MemReadRT(uint32 A) -{ - static_assert(region < 0x8, "Wrong region argument."); - const uint32 unmasked_A = A; - - if(!IsInstr) - { - if(MDFN_UNLIKELY(A & (sizeof(T) - 1))) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Misaligned %zu-byte read from 0x%08x\n", cpu_name, sizeof(T), A); - A &= ~(sizeof(T) - 1); - SetPEX(PEX_CPUADDR); - } - } - - if(!IsInstr) - MA_until = std::max(MA_until, timestamp + 1); - else - timestamp = std::max(MA_until, timestamp); - - // - // WARNING: Template arguments CacheEnabled and TwoWayMode are only valid for region==0. In addition, TwoWayMode is only valid for CacheEnabled==true. - // - switch(region) // A >> 29 - { - case 0: - if(CacheEnabled) - { - const uint32 ATM = A & (0x7FFFF << 10); - auto* cent = &Cache[(A >> 4) & 0x3F]; - int way_match = -1; - - way_match = cmov_eq_thing(ATM, cent->Tag[0], way_match, 0); - way_match = cmov_eq_thing(ATM, cent->Tag[1], way_match, 1); - way_match = cmov_eq_thing(ATM, cent->Tag[2], way_match, 2); - way_match = cmov_eq_thing(ATM, cent->Tag[3], way_match, 3); - - if(MDFN_UNLIKELY(way_match < 0)) // Cache miss! - { - if(IsInstr) - { - if(MDFN_UNLIKELY(CCR & CCR_ID)) - goto EBRCase; - } - else - { - if(MDFN_UNLIKELY(CCR & CCR_OD)) - goto EBRCase; - } - - if(TwoWayMode) - way_match = 3 ^ (cent->LRU & 0x1); - else - way_match = LRU_Replace_Tab[cent->LRU]; - - if(MDFN_UNLIKELY(way_match < 0)) - goto EBRCase; - - // - // Load cache line. - // - //printf("Cache load line: %08x\n", A); - cent->Tag[way_match] = ATM; - - { - unsigned di = (A + 4 + 0) & 0xC; MDFN_ennsb(¢->Data[way_match][di], ExtBusRead((A &~ 0xF) + di)); - } - for(unsigned i = 4; i < 16; i += 4) - { - unsigned di = (A + 4 + i) & 0xC; MDFN_ennsb(¢->Data[way_match][di], ExtBusRead((A &~ 0xF) + di)); - } - if(!IsInstr) - MA_until = std::max(MA_until, SH7095_mem_timestamp + 1); - else - timestamp = SH7095_mem_timestamp; - } - cent->LRU = (cent->LRU & LRU_Update_Tab[way_match].AND) | LRU_Update_Tab[way_match].OR; - return MDFN_densb(¢->Data[way_match][NE32ASU8_IDX_ADJ(T, A & 0x0F)]); - } - // Fall-through, no break here - case 1: - EBRCase: - { - T ret = ExtBusRead(A); - - if(!IsInstr) - MA_until = std::max(MA_until, SH7095_mem_timestamp + 1); - else - timestamp = SH7095_mem_timestamp; - - return ret; - } - - case 2: - case 5: - // - // Associative purge(apparently returns open bus of some sort) - // - //SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] %zu-byte read from associative purge area; address=0x%08x\n", cpu_name, sizeof(T), A); - AssocPurge(A); - return ~0; - - case 3: - // - // Direct cache address/tag access - // - // Note: bits 0, 1, 3, 29, 30, 31 are some sort of open-bus(unemulated). - // - // SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] %zu-byte read from cache address array area; address=0x%08x\n", cpu_name, sizeof(T), A); - { - const unsigned way = (CCR >> 6) & 0x3; - const unsigned ena = (A >> 4) & 0x3F; - - return (Cache[ena].Tag[way] & (0x7FFFF << 10)) | (((int32)~Cache[ena].Tag[way] >> 31) & 0x4) | (Cache[ena].LRU << 4); - } - - case 4: - case 6: - // - // Direct cache data access - // - //SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] %zu-byte read from cache data array area; address=0x%08x\n", cpu_name, sizeof(T), A); - { - const unsigned way = (A >> 10) & 0x3; - const unsigned ena = (A >> 4) & 0x3F; - - return MDFN_densb(&Cache[ena].Data[way][NE32ASU8_IDX_ADJ(T, A & 0x0F)]); - } - - case 7: - return OnChipRegRead(unmasked_A); - } -} - -template -INLINE T SH7095::MemRead(uint32 A) -{ - if(sizeof(T) == 1) - return MRFP8[A >> 29](A); - else if(sizeof(T) == 2) - return MRFP16[A >> 29](A); - else - return MRFP32[A >> 29](A); -} - -template -INLINE void SH7095::Write_UpdateCache(uint32 A, T V) -{ - const uint32 ATM = A & (0x7FFFF << 10); - auto* cent = &Cache[(A >> 4) & 0x3F]; - int way_match = -1; - - way_match = cmov_eq_thing(ATM, cent->Tag[0], way_match, 0); - way_match = cmov_eq_thing(ATM, cent->Tag[1], way_match, 1); - way_match = cmov_eq_thing(ATM, cent->Tag[2], way_match, 2); - way_match = cmov_eq_thing(ATM, cent->Tag[3], way_match, 3); - - if(MDFN_LIKELY(way_match >= 0)) // Cache hit! - { - cent->LRU = (cent->LRU & LRU_Update_Tab[way_match].AND) | LRU_Update_Tab[way_match].OR; - MDFN_ennsb(¢->Data[way_match][NE32ASU8_IDX_ADJ(T, A & 0x0F)], V); // Ignore CCR OD bit here. - } -} - -template -INLINE void SH7095::MemWriteRT(uint32 A, T V) -{ - static_assert(region < 0x8, "Wrong region argument."); - const uint32 unmasked_A = A; - - if(MDFN_UNLIKELY(A & (sizeof(T) - 1))) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Misaligned %zu-byte write of 0x%08x to 0x%08x\n", cpu_name, sizeof(T), V, A); - A &= ~(sizeof(T) - 1); - SetPEX(PEX_CPUADDR); - } - - MA_until = std::max(MA_until, timestamp + 1); - - // - // WARNING: Template argument CacheEnabled is only valid for region==0. - // - switch(region) // A >> 29 - { - case 0: - if(CacheEnabled) - Write_UpdateCache(A, V); - // Fall-through, no break - case 1: - MA_until = std::max(MA_until, write_finish_timestamp + 1); - - ExtBusWrite(A, V); - return; - - case 2: - case 5: - // - // Associative purge. - // - //SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] %zu-byte write to associative purge area; address=0x%08x value=0x%x\n", cpu_name, sizeof(T), A, V); - AssocPurge(A); - return; - - case 3: - // - // Direct cache address/tag access - // - // TODO: Check non-32 bit access - //SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] %zu-byte write to cache address array area; address=0x%08x value=0x%x\n", cpu_name, sizeof(T), A, V); - timestamp++; - MA_until = std::max(MA_until, timestamp + 1); - { - const unsigned way = (CCR >> 6) & 0x3; - const unsigned ena = (A >> 4) & 0x3F; - - Cache[ena].Tag[way] = (A & (0x7FFFF << 10)) | ((!(A & 0x4)) << 31); - Cache[ena].LRU = (V >> 4) & 0x3F; - } - return; - - case 4: - case 6: - // - // Direct cache data access - // - //SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] %zu-byte write to cache data array area; address=0x%08x value=0x%x\n", cpu_name, sizeof(T), A, V); - { - const unsigned way = (A >> 10) & 0x3; - const unsigned ena = (A >> 4) & 0x3F; - - MDFN_ennsb(&Cache[ena].Data[way][NE32ASU8_IDX_ADJ(T, A & 0x0F)], V); - } - return; - - case 7: - OnChipRegWrite(unmasked_A, V); - return; - } -} - -template -INLINE void SH7095::MemWrite(uint32 A, T V) -{ - if(sizeof(T) == 1) - MWFP8[A >> 29](A, V); - else if(sizeof(T) == 2) - MWFP16[A >> 29](A, V); - else - MWFP32[A >> 29](A, V); -} - - -template -static NO_INLINE MDFN_FASTCALL T C_MemReadRT(uint32 A) -{ - return CPU[which].MemReadRT(A); -} - -template -static NO_INLINE MDFN_FASTCALL void C_MemWriteRT(uint32 A, T V) -{ - CPU[which].MemWriteRT(A, V); -} - - -INLINE void SH7095::SetCCR(uint8 V) -{ - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Write to CCR: 0x%02x\n", cpu_name, V); - - if(V & CCR_CP) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Cache purge.\n", cpu_name); - - for(unsigned entry = 0; entry < 64; entry++) - { - Cache[entry].LRU = 0; - for(unsigned way = 0; way < 4; way++) - Cache[entry].Tag[way] |= 1U << 31; // Set invalid bit to 1. - } - V &= ~CCR_CP; - } - - CCR = V; - - #define MAHL(bs,w) \ - if(CCR & CCR_CE) \ - { \ - if(CCR & CCR_TW) \ - { \ - MRFP##bs[0] = C_MemReadRT ; \ - MRFPI[0] = C_MemReadRT ; \ - } \ - else \ - { \ - MRFP##bs[0] = C_MemReadRT ; \ - MRFPI[0] = C_MemReadRT ; \ - } \ - MWFP##bs[0] = C_MemWriteRT; \ - } \ - else \ - { \ - MRFP##bs[0] = C_MemReadRT ; \ - MRFPI[0] = C_MemReadRT ; \ - MWFP##bs[0] = C_MemWriteRT; \ - } - if(this == &CPU[0]) - { - MAHL( 8, 0) - MAHL(16, 0) - MAHL(32, 0) - } - else - { - MAHL( 8, 1) - MAHL(16, 1) - MAHL(32, 1) - } - #undef MAHL -} - - - - -/* - - -*/ -void NO_INLINE SH7095::Reset(bool power_on_reset, bool from_internal_wdt) -{ - VBR = 0; - SR |= 0xF << 4; - SetCCR(0); - // - if(power_on_reset) - { - BCR1 = (BCR1 & 0x8000) | 0x03F0; - BCR1M = 0x1FF7; - } - // - for(unsigned ch = 0; ch < 2; ch++) - { - DMACH[ch].CHCR = 0x00; - DMACH[ch].CHCRM = 0x00; - DMACH[ch].DRCR = 0x00; - } - DMAOR = 0x00; - RecalcPendingIntPEX(); - // - INTC_Reset(); - // - DVCR = 0; - RecalcPendingIntPEX(); - // - FRT_Reset(); - WDT_Reset(from_internal_wdt); - // - SBYCR = 0; - Standby = false; - // - // - // - EPending = 0; - SetPEX(power_on_reset ? PEX_POWERON : PEX_RESET); - Pipe_ID = EPending; -} - -void NO_INLINE SH7095::INTC_Reset(void) -{ - IPRA = 0; - IPRB = 0; - VCRA = 0; - VCRB = 0; - VCRC = 0; - VCRD = 0; - VCRWDT = 0; - ICR = 0; - - RecalcPendingIntPEX(); -} - -void SH7095::SetNMI(bool level) -{ - //printf("NMI: %d, %d %d\n", NMILevel, level, (bool)(ICR & 0x100)); - if(NMILevel != level && level == (bool)(ICR & 0x100)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] NMI - Standby=%u\n", cpu_name, Standby); - - SetPEX(PEX_NMI); - - if(Standby) - { - WDT.WTCSR |= 0x08; - FRT_WDT_Recalc_NET(); - } - else - DMAOR |= 0x02; // TODO: NMIF; set always, or only when DMA was active? - } - NMILevel = level; -} - -void SH7095::SetMD5(bool level) -{ - BCR1 = (BCR1 & 0x7FFF) | (level << 15); -} - -void SH7095::SetIRL(unsigned level) -{ - assert(level < 16); - - IRL = level; - RecalcPendingIntPEX(); -} - -void SH7095::ForceInternalEventUpdates(void) -{ - FRT_WDT_Update(); - FRT_WDT_Recalc_NET(); -} - -// -// Default priority(for same ipr value), highest to lowest: -// NMI -// User break -// IRL15 -// [...] -// IRL1 -// DIVU -// DMAC0 -// DMAC1 -// WDT -// REF -// SCI-ERI -// SCI-RXI -// SCI-TXI -// SCI-TEI -// FRT-ICI -// FRT-OCI -// FRT-OVI -// -// -uint8 INLINE SH7095::GetPendingInt(uint8* vecnum_out) -{ - unsigned ipr; - unsigned vecnum; - unsigned tmp_ipr; - - ipr = IRL; - vecnum = (IRL >> 1) + VECNUM_INT_BASE; - - if(vecnum_out && (ICR & 0x1) && IRL > 0) // External vec fetch has side effects, make sure to only do it if vecnum_out is non-NULL and ICR & 0x1, and if this is the interrupt being serviced. - vecnum = ~0U; - - // - // - // - - if((DVCR & 0x3) == 0x3 && (tmp_ipr = ((IPRA >> 12) & 0xF)) > ipr) - { - ipr = tmp_ipr; - vecnum = (VCRDIV & 0x7F); - } - - for(unsigned ch = 0; ch < 2; ch++) - { - if((DMACH[ch].CHCR & 0x6) == 0x6 && (tmp_ipr = ((IPRA >> 8) & 0xF)) > ipr) - { - ipr = tmp_ipr; - vecnum = (DMACH[ch].VCR & 0x7F); - } - } - - if((WDT.WTCSR & 0x80) && (tmp_ipr = ((IPRA >> 4) & 0xF)) > ipr) - { - ipr = tmp_ipr; - vecnum = (VCRWDT >> 8) & 0x7F; - } - -#if 0 - if(OPMIPending) - { - static const uint32 sci_any_mask = (1U << OPMI_SCI_TEI) | (1U << OPMI_SCI_TXI) | (1U << OPMI_SCI_RXI) | (1U << OPMI_SCI_ERI); - static const uint32 dmac_any_mask = (1U << OPMI_DMAC1) | (1U << OPMI_DMAC0); - uint32 new_ipr; - - if((OPMIPending & sci_any_mask) && (new_ipr = ((IPRB >> 12) & 0xF)) > ipr) - { - - } - } -#endif - // - // - // - const uint32 frt_ip_tmp = (FRT.FTCSR & FRT.TIER & 0x8E); - if(frt_ip_tmp && (tmp_ipr = ((IPRB >> 8) & 0xF)) > ipr) - { - ipr = tmp_ipr; - - if(frt_ip_tmp & 0x80) // ICI - vecnum = (VCRC >> 8) & 0x7F; - else if(frt_ip_tmp & 0x0C) // OCIA+OCIB - vecnum = (VCRC >> 0) & 0x7F; - else // OVI - vecnum = (VCRD >> 8) & 0x7F; - } - - if(vecnum_out) - { - if(vecnum == ~0U) - vecnum = ExIVecFetch(); - - *vecnum_out = vecnum; - } - - return ipr; -} - -// -// Call after changes to: -// IRL -// SR -// -// IPRA -// IPRB -// -// DMACH[*].CHCR -// -// DVCR -// -// FRT.FTCSR -// FRT.TIER -// -void NO_INLINE SH7095::RecalcPendingIntPEX(void) -{ - if(GetPendingInt(NULL) > ((SR >> 4) & 0xF)) - SetPEX(PEX_INT); - else - ClearPEX(PEX_INT); -} - -static const uint8 InstrDecodeTab[65536] = -{ - #include "sh7095_idecodetab.inc" -}; - -template -INLINE void SH7095::FetchIF(bool ForceIBufferFill) -{ - if(DebugMode) - PC_IF = PC; - -#ifdef SH7095_EMULATE_ICACHE - if(ForceIBufferFill) - { - IBuffer = MRFPI[PC >> 29](PC &~ 2); - Pipe_IF = (uint16)(IBuffer >> (((PC & 2) ^ 2) << 3)); - } - else - { - Pipe_IF = (uint16)IBuffer; - if(!(PC & 0x2)) - { - IBuffer = MRFPI[PC >> 29](PC); - Pipe_IF = IBuffer >> 16; - } - } -#else - if(timestamp < (MA_until - (ForceIBufferFill ? 0 : ((int32)(PC & 0x2) << 28)))) - timestamp = MA_until; - - if(MDFN_UNLIKELY((int32)PC < 0)) // Mr. Boooones - { - Pipe_IF = MRFP16[PC >> 29](PC); - timestamp++; - return; - } - - Pipe_IF = *(uint16*)(SH7095_FastMap[PC >> SH7095_EXT_MAP_GRAN_BITS] + PC); -#endif - timestamp++; -} - -// -// TODO: Stop reading from memory when an exception is pending? -// -template -INLINE void SH7095::DoIDIF_Real(void) -{ - if(DelaySlot) - { - // - // Redecode the opcode from the 16-bit instruction to makes sure exceptions won't be taken in the delay slot(due - // to op field being forced to 0xFF in the previous call to DoIDIF()), and forces usage of the second half of the opcode - // table so we can generate illegal slot instruction exceptions as appropriate. - // - // Oh, and this effectively discards the previously-fetched instruction in Pipe_IF. Poor, poor instruction. - // - Pipe_ID = (uint16)Pipe_ID; - Pipe_ID |= (InstrDecodeTab[Pipe_ID] | 0x80) << 24; - } - else - { - uint32 op = InstrDecodeTab[Pipe_IF]; - uint32 epo = EPending; - - if(IntPreventNext) - { - epo &= ~(1U << (PEX_INT + EPENDING_PEXBITS_SHIFT)); - if(!(epo & (0xFF << EPENDING_PEXBITS_SHIFT))) - epo = 0; - } - - if(DebugMode) - PC_ID = PC_IF; - - Pipe_ID = Pipe_IF | (op << 24) | epo; - } - - if(!SkipFetchIF) - FetchIF(false); -} - -template -static NO_INLINE void DoIDIF(void) -{ - CPU[which].DoIDIF_Real(); -} - -template -INLINE void SH7095::Branch(uint32 target) -{ - if(DebugMode > 0) - DBG_AddBranchTrace(which, target, -1); - - PC = target; - - // - // Not totally correct, but simplifies things...probably :p - // - if(delayed) - { - if(MDFN_UNLIKELY(PC & 1)) - { - DoIDIF(); - SetPEX(PEX_CPUADDR); // Pending for the instruction after the delay slot instruction. - } - else - { -#ifdef SH7095_EMULATE_ICACHE - if(PC & 0x2) - IBuffer = MRFPI[PC >> 29](PC &~ 2); -#endif - - DoIDIF(); - } - } - else - { - if(MDFN_UNLIKELY(PC & 1)) - { - SetPEX(PEX_CPUADDR); - DoIDIF(); - } - else - { -#ifdef SH7095_EMULATE_ICACHE - if(PC & 0x2) - IBuffer = MRFPI[PC >> 29](PC &~ 2); -#endif - - DoIDIF(); - PC += 2; - DoIDIF(); - } - } -} - -// Remember to use BEGIN_OP_DLYIDIF instead of BEGIN_OP -template -INLINE void SH7095::UCDelayBranch(uint32 target) -{ - if(DebugMode > 0) - DBG_AddBranchTrace(which, target, -1); - - PC = target; - - if(DebugMode) - PC_ID = PC_IF; - - Pipe_ID = Pipe_IF | ((InstrDecodeTab[Pipe_IF] | 0x80) << 24); - - timestamp++; - - if(MDFN_UNLIKELY(PC & 1)) - { - DoIDIF(); - SetPEX(PEX_CPUADDR); // Pending for the instruction after the delay slot instruction. - } - else - { - FetchIF(true); - } -} - -template -INLINE void SH7095::UCRelDelayBranch(uint32 disp) -{ - UCDelayBranch(PC + disp); -} - - -template -INLINE void SH7095::CondRelBranch(bool cond, uint32 disp) -{ - if(cond) - Branch(PC + disp); -} - -template -uint32 NO_INLINE SH7095::Exception(const unsigned exnum, const unsigned vecnum) -{ - uint32 new_PC; - - timestamp += 2; - - if(exnum == EXCEPTION_RESET || exnum == EXCEPTION_POWERON) - { - new_PC = MemRead((vecnum + 0) << 2); - R[15] = MemRead((vecnum + 1) << 2); - } - else - { - // Save SR to stack - // Save PC to stack - // Read exception vector table - R[15] -= 4; - MemWrite(R[15], SR); - timestamp++; - R[15] -= 4; - MemWrite(R[15], PC); - timestamp++; - timestamp++; - new_PC = MemRead(VBR + (vecnum << 2)); - timestamp++; - } - - if(DebugMode) - DBG_AddBranchTrace(this - CPU, new_PC, exnum, vecnum); - - //SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Exception %u, vecnum=%u, saved PC=0x%08x --- New PC=0x%08x\n", cpu_name, exnum, vecnum, PC, new_PC); - - return new_PC; -} - - -/* - PC == 0 - instr = [?] - ID = [?] - IF = [0] - - PC == 2 - instr = [?] - ID = [0] - IF = [2] - - PC == 4 - instr = [0] - ID = [2] - IF = [4] - -*/ - -template -INLINE void SH7095::Step(void) -{ - // - // Ideally, we would place SPEPRecover: after the FRT event check, but doing - // so causes gcc(multiple versions) to produce inconceivably awful code under certain conditions - // (such as disabling all the SS_DBG stuff at compile-time) because it thinks it's an important loop - // or something?(even with all our branch hinting!) - // - SPEPRecover:; - - if(MDFN_UNLIKELY(timestamp >= FRT_WDT_NextTS)) - { - FRT_WDT_Update(); - FRT_WDT_Recalc_NET(); - } - - const uint32 instr = (uint16)Pipe_ID; - const unsigned instr_nyb1 = (instr >> 4) & 0xF; - const unsigned instr_nyb2 = (instr >> 8) & 0xF; -// asm volatile("":: "a"(instr_nyb1), "d"(instr_nyb2)); - switch(Pipe_ID >> 24) - { - #include "sh7095_opdefs.inc" - - #define PART_OP_NORMIDIF DoIDIF(); - - #define BEGIN_OP(x) OP_##x { PART_OP_NORMIDIF - #define BEGIN_OP_DLYIDIF(x) OP_##x { - - // "Interrupt-disabled" instruction(blocks interrupt from being taken for next instruction). - // Use with BEGIN_OP_DLYIDIF() - #define PART_OP_INTDIS DoIDIF(); - - #define END_OP } break; - -#if 0 - #define WB_EX_CHECK(r) { if(timestamp < WB_until[(r)]) timestamp = WB_until[(r)]; } - - #define WB_WRITE(r, v) { R[(r)] = (v); WB_until[(r)] = MA_until + 1; } -#else - #define WB_EX_CHECK(r) { } - #define WB_WRITE(r, v) { R[(r)] = (v); } -#endif - // - // - // - // - // MOV #imm,Rn - // - BEGIN_OP(MOV_IMM_REG) - const unsigned n = instr_nyb2; - const uint32 imm = (int8)instr; - - WB_EX_CHECK(n) - - R[n] = imm; - END_OP - - - // - // MOV.W @(disp,PC),Rn - // - BEGIN_OP(MOV_W_PCREL_REG) - const unsigned n = instr_nyb2; - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = PC + (d << 1); - - WB_WRITE(n, (int16)MemRead(ea)); - END_OP - - - // - // MOV.L @(disp,PC),Rn - // - BEGIN_OP(MOV_L_PCREL_REG) - const unsigned n = instr_nyb2; - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = (PC &~ 0x3) + (d << 2); - - WB_WRITE(n, MemRead(ea)); - END_OP - - - // - // MOV Rm,Rn - // - BEGIN_OP(MOV_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = R[m]; - END_OP - - - // - // MOV.B Rm,@Rn - // - BEGIN_OP(MOV_B_REG_REGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 val = R[m]; - const uint32 ea = R[n]; - - MemWrite(ea, val); - END_OP - - - // - // MOV.W Rm,@Rn - // - BEGIN_OP(MOV_W_REG_REGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 val = R[m]; - const uint32 ea = R[n]; - - MemWrite(ea, val); - END_OP - - - // - // MOV.L Rm,@Rn - // - BEGIN_OP(MOV_L_REG_REGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 val = R[m]; - const uint32 ea = R[n]; - - MemWrite(ea, val); - END_OP - - - // - // MOV.B @Rm,Rn - // - BEGIN_OP(MOV_B_REGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 ea = R[m]; - - WB_WRITE(n, (int8)MemRead(ea)); - END_OP - - - // - // MOV.W @Rm,Rn - // - BEGIN_OP(MOV_W_REGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 ea = R[m]; - - WB_WRITE(n, (int16)MemRead(ea)); - END_OP - - - // - // MOV.L @Rm,Rn - // - BEGIN_OP(MOV_L_REGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 ea = R[m]; - - WB_WRITE(n, MemRead(ea)); - END_OP - - - // - // MOV.B Rm,@-Rn - // - BEGIN_OP(MOV_B_REG_REGINDIRPD) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 val = R[m]; - uint32 ea; - - R[n] -= 1; - ea = R[n]; - - MemWrite(ea, val); - END_OP - - - // - // MOV.W Rm,@-Rn - // - BEGIN_OP(MOV_W_REG_REGINDIRPD) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 val = R[m]; - uint32 ea; - - R[n] -= 2; - ea = R[n]; - - MemWrite(ea, val); - END_OP - - - // - // MOV.L Rm,@-Rn - // - BEGIN_OP(MOV_L_REG_REGINDIRPD) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 val = R[m]; - uint32 ea; - - R[n] -= 4; - ea = R[n]; - - MemWrite(ea, val); - END_OP - - - // - // MOV.B @Rm+,Rn - // - BEGIN_OP(MOV_B_REGINDIRPI_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - uint32 ea; - - ea = R[m]; - R[m] += 1; - - WB_WRITE(n, (int8)MemRead(ea)); - END_OP - - - // - // MOV.W @Rm+,Rn - // - BEGIN_OP(MOV_W_REGINDIRPI_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - uint32 ea; - - ea = R[m]; - R[m] += 2; - - WB_WRITE(n, (int16)MemRead(ea)); - END_OP - - - // - // MOV.L @Rm+,Rn - // - BEGIN_OP(MOV_L_REGINDIRPI_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - uint32 ea; - - ea = R[m]; - R[m] += 4; - - WB_WRITE(n, MemRead(ea)); - END_OP - - - // - // MOV.B R0,@(disp,Rn) - // - BEGIN_OP(MOV_B_REG0_REGINDIRDISP) - const unsigned n = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[n] + (d << 0); - - MemWrite(ea, R[0]); - END_OP - - - // - // MOV.W R0,@(disp,Rn) - // - BEGIN_OP(MOV_W_REG0_REGINDIRDISP) - const unsigned n = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[n] + (d << 1); - - MemWrite(ea, R[0]); - END_OP - - - // - // MOV.L Rm,@(disp,Rn) - // - BEGIN_OP(MOV_L_REG_REGINDIRDISP) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[n] + (d << 2); - - MemWrite(ea, R[m]); - END_OP - - - // - // MOV.B @(disp,Rm),R0 - // - BEGIN_OP(MOV_B_REGINDIRDISP_REG0) - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[m] + (d << 0); - - WB_WRITE(0, (int8)MemRead(ea)); - END_OP - - - // - // MOV.W @(disp,Rm),R0 - // - BEGIN_OP(MOV_W_REGINDIRDISP_REG0) - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[m] + (d << 1); - - WB_WRITE(0, (int16)MemRead(ea)); - END_OP - - - // - // MOV.L @(disp,Rm),Rn - // - BEGIN_OP(MOV_L_REGINDIRDISP_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[m] + (d << 2); - - WB_WRITE(n, MemRead(ea)); - END_OP - - - // - // MOV.B Rm,@(R0,Rn) - // - BEGIN_OP(MOV_B_REG_IDXREGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 ea = R[0] + R[n]; - - MemWrite(ea, R[m]); - END_OP - - - // - // MOV.W Rm,@(R0,Rn) - // - BEGIN_OP(MOV_W_REG_IDXREGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 ea = R[0] + R[n]; - - MemWrite(ea, R[m]); - END_OP - - - // - // MOV.L Rm,@(R0,Rn) - // - BEGIN_OP(MOV_L_REG_IDXREGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 ea = R[0] + R[n]; - - MemWrite(ea, R[m]); - END_OP - - - // - // MOV.B @(R0,Rm),Rn - // - BEGIN_OP(MOV_B_IDXREGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 ea = R[0] + R[m]; - - WB_WRITE(n, (int8)MemRead(ea)); - END_OP - - - // - // MOV.W @(R0,Rm),Rn - // - BEGIN_OP(MOV_W_IDXREGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 ea = R[0] + R[m]; - - WB_WRITE(n, (int16)MemRead(ea)); - END_OP - - - // - // MOV.L @(R0,Rm),Rn - // - BEGIN_OP(MOV_L_IDXREGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 ea = R[0] + R[m]; - - WB_WRITE(n, MemRead(ea)); - END_OP - - - // - // MOV.B R0,@(disp,GBR) - // - BEGIN_OP(MOV_B_REG0_GBRINDIRDISP) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 0); - - MemWrite(ea, R[0]); - END_OP - - - // - // MOV.W R0,@(disp,GBR) - // - BEGIN_OP(MOV_W_REG0_GBRINDIRDISP) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 1); - - MemWrite(ea, R[0]); - END_OP - - - // - // MOV.L R0,@(disp,GBR) - // - BEGIN_OP(MOV_L_REG0_GBRINDIRDISP) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 2); - - MemWrite(ea, R[0]); - END_OP - - - // - // MOV.B @(disp,GBR),R0 - // - BEGIN_OP(MOV_B_GBRINDIRDISP_REG0) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 0); - - WB_WRITE(0, (int8)MemRead(ea)); - END_OP - - - // - // MOV.W @(disp,GBR),R0 - // - BEGIN_OP(MOV_W_GBRINDIRDISP_REG0) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 1); - - WB_WRITE(0, (int16)MemRead(ea)); - END_OP - - - // - // MOV.L @(disp,GBR),R0 - // - BEGIN_OP(MOV_L_GBRINDIRDISP_REG0) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 2); - - WB_WRITE(0, MemRead(ea)); - END_OP - - - // - // MOVA @(disp,PC),R0 - // - BEGIN_OP(MOVA_PCREL_REG0) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = (PC &~ 0x3) + (d << 2); - - WB_EX_CHECK(0) - - R[0] = ea; - END_OP - - - // - // MOVT Rn - // - BEGIN_OP(MOVT_REG) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - R[n] = GetT(); - END_OP - - - // - // SWAP.B Rm,Rn - // - BEGIN_OP(SWAP_B_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = (R[m] & 0xFFFF0000) | ((R[m] << 8) & 0xFF00) | ((R[m] >> 8) & 0x00FF); - END_OP - - - // - // SWAP.W Rm,Rn - // - BEGIN_OP(SWAP_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = (R[m] << 16) | (R[m] >> 16); - END_OP - - - // - // XTRCT Rm,Rn - // - BEGIN_OP(XTRCT_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = (R[n] >> 16) | (R[m] << 16); - END_OP - - - // - // ADD Rm,Rn - // - BEGIN_OP(ADD_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = R[n] + R[m]; - END_OP - - - // - // ADD #imm,Rn - // - BEGIN_OP(ADD_IMM_REG) - const unsigned n = instr_nyb2; - const uint32 imm = (int8)instr; - - WB_EX_CHECK(n) - - R[n] = R[n] + imm; - END_OP - - - // - // ADDC Rm,Rn - // - BEGIN_OP(ADDC_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint64 result = (uint64)R[n] + R[m] + GetT(); - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = result; - SetT((result >> 32) & 1); - END_OP - - - // - // ADDV Rm,Rn - // - BEGIN_OP(ADDV_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 result = R[n] + R[m]; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - SetT(((~(R[n] ^ R[m])) & (R[n] ^ result)) >> 31); - R[n] = result; - END_OP - - - // - // CMP/EQ #imm,R0 - // - BEGIN_OP(CMP_EQ_IMM_REG0) - const uint32 imm = (int8)instr; - - WB_EX_CHECK(0) - - SetT(imm == R[0]); - END_OP - - - // - // CMP/EQ Rm,Rn - // - BEGIN_OP(CMP_EQ_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - SetT(R[n] == R[m]); - END_OP - - - // - // CMP/HS Rm,Rn - // - BEGIN_OP(CMP_HS_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - SetT(R[n] >= R[m]); - END_OP - - - // - // CMP/GE Rm,Rn - // - BEGIN_OP(CMP_GE_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - SetT((int32)R[n] >= (int32)R[m]); - END_OP - - - // - // CMP/HI Rm,Rn - // - BEGIN_OP(CMP_HI_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - SetT(R[n] > R[m]); - END_OP - - - // - // CMP/GT Rm,Rn - // - BEGIN_OP(CMP_GT_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - SetT((int32)R[n] > (int32)R[m]); - END_OP - - - // - // CMP/PZ Rn - // - BEGIN_OP(CMP_PZ_REG) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - SetT((int32)R[n] >= 0); - END_OP - - - // - // CMP/PL Rn - // - BEGIN_OP(CMP_PL_REG) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - SetT((int32)R[n] > 0); - END_OP - - - // - // CMP/STR Rm,Rn - // - BEGIN_OP(CMP_STR_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 tmp = R[n] ^ R[m]; - unsigned new_T = 0; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - if(!(tmp & 0x000000FF)) new_T = 1; - if(!(tmp & 0x0000FF00)) new_T = 1; - if(!(tmp & 0x00FF0000)) new_T = 1; - if(!(tmp & 0xFF000000)) new_T = 1; - - SetT(new_T); - END_OP - - - // - // DIV1 Rm,Rn - // - BEGIN_OP(DIV1_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - uint32 tmp; - bool new_Q; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - new_Q = R[n] >> 31; - R[n] <<= 1; - R[n] |= GetT(); - - tmp = R[n]; - new_Q ^= GetM(); - - if(!(GetQ() ^ GetM())) - { - R[n] -= R[m]; - new_Q ^= (R[n] > tmp); - } - else - { - R[n] += R[m]; - new_Q ^= (R[n] < tmp); - } - - SetQ(new_Q); - SetT(new_Q == GetM()); - END_OP - - - // - // DIV0S Rm,Rn - // - BEGIN_OP(DIV0S_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const unsigned new_Q = R[n] >> 31; - const unsigned new_M = R[m] >> 31; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - SetQ(new_Q); - SetM(new_M); - SetT(new_Q != new_M); - END_OP - - - // - // DIV0U - // - BEGIN_OP(DIV0U) - SetQ(false); - SetM(false); - SetT(false); - END_OP - - - // - // DT - // - BEGIN_OP(DT) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - R[n]--; - SetT(!R[n]); - END_OP - - - // - // EXTS.B Rm,Rn - // - BEGIN_OP(EXTS_B_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = (int8)R[m]; - END_OP - - - // - // EXTS.W Rm,Rn - // - BEGIN_OP(EXTS_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = (int16)R[m]; - END_OP - - - // - // EXTU.B Rm,Rn - // - BEGIN_OP(EXTU_B_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = (uint8)R[m]; - END_OP - - - // - // EXTU.W Rm,Rn - // - BEGIN_OP(EXTU_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = (uint16)R[m]; - END_OP - - - // - // MAC.L @Rm+,@Rn+ - // - // Pipeline: page 188(not implemented right here) - BEGIN_OP(MAC_L) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - uint64 a, b, sum; - int32 m0, m1; - - // Order confirmed. - m0 = (int32)MemRead(R[m]); - R[m] += 4; - m1 = (int32)MemRead(R[n]); - R[n] += 4; - - a = GetMAC64(); - b = (int64)m0 * m1; - sum = a + b; - - if(GetS() && sum > 0x00007FFFFFFFFFFFULL && sum < 0xFFFF800000000000ULL) - { - if((int64)b < 0) - sum = 0xFFFF800000000000ULL; - else - sum = 0x00007FFFFFFFFFFFULL; - } - - SetMAC64(sum); - - timestamp++; - END_OP - - - // - // MAC.W @Rm+,@Rn+ - // - // Pipeline: page 180(not implemented right here) - BEGIN_OP(MAC_W) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - int16 m0, m1; - - // Order confirmed. - m0 = (int16)MemRead(R[m]); - R[m] += 2; - m1 = (int16)MemRead(R[n]); - R[n] += 2; - - if(GetS()) - { - int32 b = (int32)m0 * m1; - uint64 sum = (int64)(int32)MACL + b; - - if(sum > 0x000000007FFFFFFFULL && sum < 0xFFFFFFFF80000000ULL) - { - MACH |= 1; - - if(b < 0) - sum = 0x80000000ULL; - else - sum = 0x7FFFFFFFULL; - } - - MACL = sum; - } - else - SetMAC64(GetMAC64() + (int64)m0 * m1); - - timestamp++; - END_OP - - - // - // DMULS.L Rm,Rn - // - // Pipeline: page 215 (not implemented here totally correctly) - BEGIN_OP_DLYIDIF(DMULS_L_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint64 result = (int64)(int32)R[n] * (int32)R[m]; - - timestamp++; - - MA_until = std::max(std::max(MA_until, MM_until), timestamp + 1); - MM_until = MA_until + 4; - PART_OP_NORMIDIF - - MACL = result >> 0; - MACH = result >> 32; - END_OP - - - // - // DMULU.L Rm,Rn - // - // Pipeline: page 215 (not implemented here totally correctly) - BEGIN_OP_DLYIDIF(DMULU_L_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint64 result = (uint64)R[n] * R[m]; - - timestamp++; - - MA_until = std::max(std::max(MA_until, MM_until), timestamp + 1); - MM_until = MA_until + 4; - PART_OP_NORMIDIF - - MACL = result >> 0; - MACH = result >> 32; - END_OP - - - // - // MUL.L Rm,Rn - // - // Pipeline: page 215 (not implemented here totally correctly) - BEGIN_OP_DLYIDIF(MUL_L_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - timestamp++; - - MA_until = std::max(std::max(MA_until, MM_until), timestamp + 1); - MM_until = MA_until + 4; - PART_OP_NORMIDIF - - MACL = R[n] * R[m]; - END_OP - - - // - // MULS.W Rm,Rn - // - // Pipeline: page 207 - BEGIN_OP(MULS_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - MA_until = std::max(std::max(MA_until, MM_until), timestamp + 1); - MM_until = MA_until + 2; - - MACL = (int16)R[n] * (int16)R[m]; - END_OP - - - // - // MULU.W Rm,Rn - // - // Pipeline: page 207 - BEGIN_OP(MULU_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - MA_until = std::max(std::max(MA_until, MM_until), timestamp + 1); - MM_until = MA_until + 2; - - MACL = (uint32)(uint16)R[n] * (uint32)(uint16)R[m]; - END_OP - - - // - // NEG Rm,Rn - // - BEGIN_OP(NEG_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = -R[m]; - END_OP - - - // - // NEGC Rm,Rn - // - BEGIN_OP(NEGC_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint64 result = (uint64)0 - R[m] - GetT(); - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = result; - SetT((result >> 32) & 1); - END_OP - - - // - // SUB Rm,Rn - // - BEGIN_OP(SUB_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = R[n] - R[m]; - END_OP - - - // - // SUBC Rm,Rn - // - BEGIN_OP(SUBC_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint64 result = (uint64)R[n] - R[m] - GetT(); - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = result; - SetT((result >> 32) & 1); - END_OP - - - // - // SUBV Rm,Rn - // - BEGIN_OP(SUBV_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const uint32 result = R[n] - R[m]; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - SetT((((R[n] ^ R[m])) & (R[n] ^ result)) >> 31); - R[n] = result; - END_OP - - - // - // AND Rm,Rn - // - BEGIN_OP(AND_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = R[n] & R[m]; - END_OP - - - // - // AND #imm,R0 - // - BEGIN_OP(AND_IMM_REG0) - const unsigned imm = (uint8)instr; - - WB_EX_CHECK(0) - - R[0] = R[0] & imm; - END_OP - - - // - // AND.B #imm,@(R0,GBR) - // - BEGIN_OP(AND_B_IMM_IDXGBRINDIR) - const unsigned imm = (uint8)instr; - const uint32 ea = R[0] + GBR; - uint32 tmp; - - tmp = MemRead(ea); - timestamp++; - tmp &= imm; - MemWrite(ea, tmp); - timestamp++; - END_OP - - - // - // NOT Rm,Rn - // - BEGIN_OP(NOT_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = ~R[m]; - END_OP - - - // - // OR Rm,Rn - // - BEGIN_OP(OR_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] |= R[m]; - END_OP - - - // - // OR #imm,R0 - // - BEGIN_OP(OR_IMM_REG0) - const unsigned imm = (uint8)instr; - - WB_EX_CHECK(0) - - R[0] |= imm; - END_OP - - - // - // OR.B #imm,@(R0,GBR) - // - BEGIN_OP(OR_B_IMM_IDXGBRINDIR) - const unsigned imm = (uint8)instr; - const uint32 ea = R[0] + GBR; - uint32 tmp; - - tmp = MemRead(ea); - timestamp++; - tmp |= imm; - MemWrite(ea, tmp); - timestamp++; - END_OP - - - // - // TAS.B @Rn - // - BEGIN_OP(TAS_B_REGINDIR) - const unsigned n = instr_nyb2; - const uint32 ea = R[n]; - uint8 tmp; - - SH7095_BusLock++; - tmp = ExtBusRead(ea); // FIXME: Address error on invalid address(>= 0x40000000 ?). - timestamp = SH7095_mem_timestamp; - - SetT(!tmp); - - tmp |= 0x80; - - MemWrite(ea, tmp); - SH7095_BusLock--; - - timestamp += 3; - END_OP - - - // - // TST Rm,Rn - // - BEGIN_OP(TST_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - SetT(!(R[n] & R[m])); - END_OP - - - // - // TST #imm,R0 - // - BEGIN_OP(TST_IMM_REG0) - const unsigned imm = (uint8)instr; - - WB_EX_CHECK(0) - - SetT(!(R[0] & imm)); - END_OP - - - // - // TST.B #imm,@(R0,GBR) - // - BEGIN_OP(TST_B_IMM_IDXGBRINDIR) - const unsigned imm = (uint8)instr; - const uint32 ea = R[0] + GBR; - uint32 tmp; - - tmp = MemRead(ea); - timestamp++; - SetT(!(tmp & imm)); - timestamp++; - END_OP - - - // - // XOR Rm,Rn - // - BEGIN_OP(XOR_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - WB_EX_CHECK(n) - WB_EX_CHECK(m) - - R[n] = R[n] ^ R[m]; - END_OP - - - // - // XOR #imm,R0 - // - BEGIN_OP(XOR_IMM_REG0) - const unsigned imm = (uint8)instr; - - WB_EX_CHECK(0) - - R[0] = R[0] ^ imm; - END_OP - - - // - // XOR.B #imm,@(R0,GBR) - // - BEGIN_OP(XOR_B_IMM_IDXGBRINDIR) - const unsigned imm = (uint8)instr; - const uint32 ea = R[0] + GBR; - uint32 tmp; - - tmp = MemRead(ea); - timestamp++; - tmp ^= imm; - MemWrite(ea, tmp); - timestamp++; - END_OP - - - // - // ROTL Rn - // - BEGIN_OP(ROTL_REG) - const unsigned n = instr_nyb2; - const unsigned rotbit = R[n] >> 31; - - WB_EX_CHECK(n) - - R[n] = (R[n] << 1) | rotbit; - SetT(rotbit); - END_OP - - - // - // ROTR Rn - // - BEGIN_OP(ROTR_REG) - const unsigned n = instr_nyb2; - const unsigned rotbit = R[n] & 1; - - WB_EX_CHECK(n) - - R[n] = (R[n] >> 1) | (rotbit << 31); - SetT(rotbit); - END_OP - - - // - // ROTCL Rn - // - BEGIN_OP(ROTCL_REG) - const unsigned n = instr_nyb2; - const unsigned rotbit = R[n] >> 31; - - WB_EX_CHECK(n) - - R[n] = (R[n] << 1) | GetT(); - SetT(rotbit); - END_OP - - - // - // ROTCR Rn - // - BEGIN_OP(ROTCR_REG) - const unsigned n = instr_nyb2; - const unsigned rotbit = R[n] & 1; - - WB_EX_CHECK(n) - - R[n] = (R[n] >> 1) | (GetT() << 31); - SetT(rotbit); - END_OP - - - // - // SHAR Rn - // - BEGIN_OP(SHAR_REG) - const unsigned n = instr_nyb2; - const unsigned shbit = R[n] & 1; - - WB_EX_CHECK(n) - - R[n] = (int32)R[n] >> 1; - SetT(shbit); - END_OP - - - // - // SHLL Rn - // - BEGIN_OP(SHLL_REG) - const unsigned n = instr_nyb2; - const unsigned shbit = R[n] >> 31; - - WB_EX_CHECK(n) - - R[n] <<= 1; - SetT(shbit); - END_OP - - - // - // SHLR Rn - // - BEGIN_OP(SHLR_REG) - const unsigned n = instr_nyb2; - const unsigned shbit = R[n] & 1; - - WB_EX_CHECK(n) - - R[n] >>= 1; - SetT(shbit); - END_OP - - - // - // SHLL2 Rn - // - BEGIN_OP(SHLL2_REG) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - R[n] <<= 2; - END_OP - - - // - // SHLR2 Rn - // - BEGIN_OP(SHLR2_REG) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - R[n] >>= 2; - END_OP - - - // - // SHLL8 Rn - // - BEGIN_OP(SHLL8_REG) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - R[n] <<= 8; - END_OP - - - // - // SHLR8 Rn - // - BEGIN_OP(SHLR8_REG) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - R[n] >>= 8; - END_OP - - - // - // SHLL16 Rn - // - BEGIN_OP(SHLL16_REG) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - R[n] <<= 16; - END_OP - - - // - // SHLR16 Rn - // - BEGIN_OP(SHLR16_REG) - const unsigned n = instr_nyb2; - - WB_EX_CHECK(n) - - R[n] >>= 16; - END_OP - - - // - // BF - // - BEGIN_OP(BF) - CondRelBranch(!GetT(), (uint32)(int8)instr << 1); - END_OP - - - // - // BF/S - // - BEGIN_OP(BF_S) - CondRelBranch(!GetT(), (uint32)(int8)instr << 1); - END_OP - - - // - // BT - // - BEGIN_OP(BT) - CondRelBranch(GetT(), (uint32)(int8)instr << 1); - END_OP - - - // - // BT/S - // - BEGIN_OP(BT_S) - CondRelBranch(GetT(), (uint32)(int8)instr << 1); - END_OP - - - // - // BRA - // - BEGIN_OP_DLYIDIF(BRA) - UCRelDelayBranch((uint32)sign_x_to_s32(12, instr) << 1); - END_OP - - - // - // BRAF Rm - // - BEGIN_OP_DLYIDIF(BRAF_REG) - const unsigned m = instr_nyb2; - - UCRelDelayBranch(R[m]); - END_OP - - - // - // BSR - // - BEGIN_OP_DLYIDIF(BSR) - PR = PC; - - UCRelDelayBranch((uint32)sign_x_to_s32(12, instr) << 1); - END_OP - - - // - // BSRF Rm - // - BEGIN_OP_DLYIDIF(BSRF_REG) - const unsigned m = instr_nyb2; - - PR = PC; - - UCRelDelayBranch(R[m]); - END_OP - - - // - // JMP @Rm - // - BEGIN_OP_DLYIDIF(JMP_REGINDIR) - const unsigned m = instr_nyb2; - - UCDelayBranch(R[m]); - END_OP - - - // - // JSR @Rm - // - BEGIN_OP_DLYIDIF(JSR_REGINDIR) - const unsigned m = instr_nyb2; - - PR = PC; - - UCDelayBranch(R[m]); - END_OP - - - // - // RTS - // - BEGIN_OP_DLYIDIF(RTS) - UCDelayBranch(PR); - END_OP - - - // - // CLRT - // - BEGIN_OP(CLRT) - SetT(false); - END_OP - - - // - // CLRMAC - // - BEGIN_OP(CLRMAC) - MACH = 0; - MACL = 0; - END_OP - - - // - // LDC - // - BEGIN_OP_DLYIDIF(LDC) - const unsigned m = instr_nyb2; - const unsigned cri = (instr >> 4) & 0x3; - - CtrlRegs[cri] = R[m]; - if(cri == 0) - { - SR &= 0x3F3; - RecalcPendingIntPEX(); - } - PART_OP_INTDIS - END_OP - - // - // LDC.L - // - // Pipeline: page 233 - // - BEGIN_OP_DLYIDIF(LDC_L) - const unsigned m = instr_nyb2; - const unsigned cri = (instr >> 4) & 0x3; - uint32 ea; - - ea = R[m]; - R[m] += 4; - - timestamp++; - CtrlRegs[cri] = MemRead(ea); - if(cri == 0) - { - SR &= 0x3F3; - RecalcPendingIntPEX(); - } - - timestamp++; - PART_OP_INTDIS - END_OP - - - // - // LDS - // - BEGIN_OP_DLYIDIF(LDS) - const unsigned m = instr_nyb2; - const unsigned sri = (instr >> 4) & 0x3; - - SysRegs[sri] = R[m]; - PART_OP_INTDIS - END_OP - - - // - // LDS.L - // - BEGIN_OP_DLYIDIF(LDS_L) // Pipeline same as ordinary load instruction - const unsigned m = instr_nyb2; - const unsigned sri = (instr >> 4) & 0x3; - uint32 ea; - - ea = R[m]; - R[m] += 4; - - PART_OP_INTDIS - - SysRegs[sri] = MemRead(ea); - //printf(" LDS.L: (0x%08x)->0x%08x\n", ea, SysRegs[sri]); - END_OP - - - // - // NOP - // - BEGIN_OP(NOP) - END_OP - - - // - // RTE - // - // Pipeline: page 241 - // - BEGIN_OP(RTE) - uint32 new_PC; - - new_PC = MemRead(R[15]); - R[15] += 4; - - SR = MemRead(R[15]); - RecalcPendingIntPEX(); - R[15] += 4; - - timestamp++; - - Branch(new_PC); - END_OP - - - // - // SETT - // - BEGIN_OP(SETT) - SetT(true); - END_OP - - - // - // SLEEP - // - BEGIN_OP_DLYIDIF(SLEEP) - // - // Standby mode time yay? - // - if(MDFN_UNLIKELY(SBYCR & 0x80)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Entering standby mode.\n", cpu_name); - - for(unsigned ch = 0; ch < 2; ch++) - { - DMACH[ch].CHCR = 0x00; - DMACH[ch].CHCRM = 0x00; - } - DMAOR = 0x00; - RecalcPendingIntPEX(); - // - // - FRT_Reset(); - // - // - WDT_StandbyReset(); - // - // - - timestamp++; - Pipe_ID = (Pipe_ID & 0x00FFFFFF) | (0x7E << 24); - - Standby = true; - - return; - } - - if(MDFN_LIKELY(!EPending)) - { - timestamp += 3; - return; - } - else - { - DoIDIF(); - } - END_OP - - BEGIN_OP_DLYIDIF(PSEUDO_STANDBY) - if(MDFN_LIKELY(Standby)) - { - timestamp += 7; - return; - } - else - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Exiting standby mode.\n", cpu_name); - - FRT_Reset(); // Reset again(for the counter) because we didn't stop clocking it. - - DoIDIF(); - } - END_OP - - // - // STC - // - BEGIN_OP_DLYIDIF(STC) - const unsigned n = instr_nyb2; - const unsigned cri = (instr >> 4) & 0x3; - - R[n] = CtrlRegs[cri]; - PART_OP_INTDIS - END_OP - - - // - // STC.L - // - // pipeline: page 234 - BEGIN_OP_DLYIDIF(STC_L) - const unsigned n = instr_nyb2; - const unsigned cri = (instr >> 4) & 0x3; - uint32 ea; - - R[n] -= 4; - ea = R[n]; - - MemWrite(ea, CtrlRegs[cri]); - timestamp++; - PART_OP_INTDIS - END_OP - - - // - // STS - // - BEGIN_OP_DLYIDIF(STS) - const unsigned n = instr_nyb2; - const unsigned sri = (instr >> 4) & 0x3; - - R[n] = SysRegs[sri]; - PART_OP_INTDIS - END_OP - - - // - // STS.L - // - BEGIN_OP_DLYIDIF(STS_L) // Pipeline same as ordinary store instruction - const unsigned n = instr_nyb2; - const unsigned sri = (instr >> 4) & 0x3; - uint32 ea; - - R[n] -= 4; - ea = R[n]; - - //printf(" STS.L: 0x%08x->(0x%08x)\n", SysRegs[sri], ea); - - MemWrite(ea, SysRegs[sri]); - - PART_OP_INTDIS - END_OP - - - // - // TRAPA #imm - // - // Saved PC is the address of the instruction after the TRAPA instruction - // - BEGIN_OP_DLYIDIF(TRAPA) - const unsigned imm = (uint8)instr; - - PC -= 2; - Branch(Exception(EXCEPTION_TRAP, imm)); - END_OP - - - /* - ** - ** - */ - // - // Illegal Instruction - // - // Saved PC is the address of the illegal instruction. - // - BEGIN_OP_DLYIDIF(ILLEGAL) - PC -= 4; - Branch(Exception(EXCEPTION_ILLINSTR, VECNUM_ILLINSTR)); - END_OP - - // - // Illegal Slot Instruction - // - // Saved PC is the effective target address of the jump. - // - BEGIN_OP_DLYIDIF(SLOT_ILLEGAL) - PC -= 2; - Branch(Exception(EXCEPTION_ILLSLOT, VECNUM_ILLSLOT)); - END_OP - - // - // Pending exception(address error/interrupt) - // - BEGIN_OP_DLYIDIF(PSEUDO_EPENDING) - uint32 new_PC = 0; - - // - // Priority here(listed highest to lowest): - // External halt - // Power - // Reset - // Pseudo DMA burst(hacky abusey thing to stall the CPU, should be above everything but reset/power and ext halt otherwise kaboom!). - // CPU address error - // DMA address error - // NMI - // Interrupt (final else, may be called quasi-spuriously) - // - #define TPP(x) (Pipe_ID & (1U << ((x) + EPENDING_PEXBITS_SHIFT))) - // - // Test against Pipe_ID, reset bits in EPending(if appropriate). - // - if(MDFN_UNLIKELY(TPP(PEX_PSEUDO_EXTHALT))) - { - //SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Ext halt begin: Pipe_ID=0x%08x PC=0x%08x\n", cpu_name, Pipe_ID, PC); - Pipe_ID = (Pipe_ID & 0x00FFFFFF) | (0xFE << 24); - return; - } - else if(MDFN_UNLIKELY(TPP(PEX_POWERON) || TPP(PEX_RESET))) - { - if(TPP(PEX_POWERON)) - { - EPending = 0; - new_PC = Exception(EXCEPTION_POWERON, VECNUM_POWERON); - } - else - { - EPending = 0; - new_PC = Exception(EXCEPTION_RESET, VECNUM_RESET); - } - } - else if(MDFN_UNLIKELY(TPP(PEX_PSEUDO_DMABURST))) - { - //SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Burst begin: Pipe_ID=0x%08x PC=0x%08x\n", cpu_name, Pipe_ID, PC); - Pipe_ID = (Pipe_ID & 0x00FFFFFF) | (0xFE << 24); - return; - } - else if(MDFN_UNLIKELY(TPP(PEX_CPUADDR))) - { - PC -= 4; - ClearPEX(PEX_CPUADDR); - new_PC = Exception(EXCEPTION_CPUADDR, VECNUM_CPUADDR); - ClearPEX(PEX_CPUADDR); // Infinite recursive address errors are not good(stack wraparound could clobber backup memory). - } - else if(MDFN_UNLIKELY(TPP(PEX_DMAADDR))) - { - PC -= 4; - ClearPEX(PEX_DMAADDR); - new_PC = Exception(EXCEPTION_DMAADDR, VECNUM_DMAADDR); - } - else if(TPP(PEX_NMI)) - { - PC -= 4; - ClearPEX(PEX_NMI); - new_PC = Exception(EXCEPTION_NMI, VECNUM_NMI); - // - // - // - SR |= 0xF << 4; - RecalcPendingIntPEX(); - } - else // Int - { - uint8 ipr; - - ipr = GetPendingInt(NULL); - - if(MDFN_LIKELY(ipr > ((SR >> 4) & 0xF))) - { - uint8 vecnum; - - // Note: GetPendingInt() may call ExIVecFetch(), which may call SetIRL with a new value, so be - // careful to use the "old" value here. - GetPendingInt(&vecnum); - - PC -= 4; - new_PC = Exception(EXCEPTION_INT, vecnum); - // - // - // - SR &= ~(0xF << 4); - SR |= ipr << 4; - RecalcPendingIntPEX(); - } - else - { - // - // Can happen like so(note for future testing): - // - // (WDT interval timer IRQ pending here) - // - // WTCSR_R; - // asm volatile( - // "ldc %0,SR\n\t" - // "mov.w %2, @%1\n\t" - // : - // :"r"(0), "r"(0xFFFFFE88), "r"(0xA500 | 0x00) - // : "memory"); - // - SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Spurious EPENDING. IPR=0x%02x SR=0x%04x EPending=0x%08x Pipe_ID=0x%08x PC=0x%08x\n", cpu_name, ipr, SR, EPending, Pipe_ID, PC); - - Pipe_ID = (uint16)Pipe_ID; - Pipe_ID |= InstrDecodeTab[Pipe_ID] << 24; - goto SPEPRecover; - } - } - // - // - // - Branch(new_PC); - END_OP - - BEGIN_OP_DLYIDIF(PSEUDO_DMABURST) - if(MDFN_LIKELY(DMA_InBurst() || ExtHalt)) - { - timestamp += 7; - return; - } - else - { - ClearPEX(PEX_PSEUDO_DMABURST); - ClearPEX(PEX_PSEUDO_EXTHALT); - - // - // Recover Pipe_ID opcode field; only use Pipe_ID for this, not EPending, otherwise - // we may accidentally allow an interrupt to occur immediately after an interrupt-disabled instruction. - // - Pipe_ID &= 0x00FFFFFF; - Pipe_ID &= ~(1U << (PEX_PSEUDO_DMABURST + EPENDING_PEXBITS_SHIFT)); - Pipe_ID &= ~(1U << (PEX_PSEUDO_EXTHALT + EPENDING_PEXBITS_SHIFT)); - Pipe_ID |= InstrDecodeTab[(uint16)Pipe_ID] << 24; - if(Pipe_ID & (0xFF << EPENDING_PEXBITS_SHIFT)) - Pipe_ID |= EPENDING_OP_OR; - - //SS_DBG(SS_DBG_WARNING | SS_DBG_SH2, "[%s] Burst/External halt end: Pipe_ID=0x%08x PC=0x%08x\n", cpu_name, Pipe_ID, PC); - return; - } - END_OP - - - #undef BEGIN_OP - #undef BEGIN_OP_DLYIDIF - #undef END_OP - } - - PC += 2; -} - -// -// -// -// -// -// -// -// - -INLINE uint32 SH7095::GetRegister(const unsigned id, char* const special, const uint32 special_len) -{ - uint32 ret = 0xDEADBEEF; - - switch(id) - { - case GSREG_PC_ID: - ret = PC_ID; - break; - - case GSREG_PC_IF: - ret = PC_IF; - break; - - case GSREG_PID: - ret = Pipe_ID; - break; - - case GSREG_PIF: - ret = Pipe_IF; - break; - - case GSREG_EP: - ret = EPending; - break; - - case GSREG_RPC: - ret = PC; - break; - - case GSREG_R0: case GSREG_R1: case GSREG_R2: case GSREG_R3: case GSREG_R4: case GSREG_R5: case GSREG_R6: case GSREG_R7: - case GSREG_R8: case GSREG_R9: case GSREG_R10: case GSREG_R11: case GSREG_R12: case GSREG_R13: case GSREG_R14: case GSREG_R15: - ret = R[id - GSREG_R0]; - break; - - case GSREG_SR: - ret = SR; - break; - - case GSREG_GBR: - ret = GBR; - break; - - case GSREG_VBR: - ret = VBR; - break; - - case GSREG_MACH: - ret = MACH; - break; - - case GSREG_MACL: - ret = MACL; - break; - - case GSREG_PR: - ret = PR; - break; - - // - // - // - case GSREG_NMIL: - ret = NMILevel; - break; - - case GSREG_IRL: - ret = IRL; - break; - - case GSREG_IPRA: - ret = IPRA; - break; - - case GSREG_IPRB: - ret = IPRB; - break; - - case GSREG_VCRWDT: - ret = VCRWDT; - break; - - case GSREG_VCRA: - ret = VCRA; - break; - - case GSREG_VCRB: - ret = VCRB; - break; - - case GSREG_VCRC: - ret = VCRC; - if(special) - { - trio_snprintf(special, special_len, "FIC: 0x%02x, FOC: 0x%02x", (ret >> 8) & 0x7F, ret & 0x7F); - } - break; - - case GSREG_VCRD: - ret = VCRD; - break; - - case GSREG_ICR: - ret = ICR; - break; - // - // - // - case GSREG_DVSR: - ret = DVSR; - break; - - case GSREG_DVDNT: - ret = DVDNT; - break; - - case GSREG_DVDNTH: - ret = DVDNTH; - break; - - case GSREG_DVDNTL: - ret = DVDNTL; - break; - - case GSREG_DVDNTHS: - ret = DVDNTH_Shadow; - break; - - case GSREG_DVDNTLS: - ret = DVDNTL_Shadow; - break; - - case GSREG_VCRDIV: - ret = VCRDIV; - break; - - case GSREG_DVCR: - ret = DVCR; - break; - // - // - // - case GSREG_WTCSR: - ret = WDT.WTCSR; - break; - - case GSREG_WTCSRM: - ret = WDT.WTCSRM; - break; - - case GSREG_WTCNT: - ret = WDT.WTCNT; - break; - - case GSREG_RSTCSR: - ret = WDT.RSTCSR; - break; - - case GSREG_RSTCSRM: - ret = WDT.RSTCSRM; - break; - // - // - // - case GSREG_DMAOR: - ret = DMAOR; - break; - - case GSREG_DMAORM: - ret = DMAORM; - break; - - case GSREG_DMA0_SAR: - case GSREG_DMA1_SAR: - ret = DMACH[id == GSREG_DMA1_SAR].SAR; - break; - - case GSREG_DMA0_DAR: - case GSREG_DMA1_DAR: - ret = DMACH[id == GSREG_DMA1_DAR].DAR; - break; - - case GSREG_DMA0_TCR: - case GSREG_DMA1_TCR: - ret = DMACH[id == GSREG_DMA1_TCR].TCR; - break; - - case GSREG_DMA0_CHCR: - case GSREG_DMA1_CHCR: - ret = DMACH[id == GSREG_DMA1_CHCR].CHCR; - break; - - case GSREG_DMA0_CHCRM: - case GSREG_DMA1_CHCRM: - ret = DMACH[id == GSREG_DMA1_CHCRM].CHCRM; - break; - - case GSREG_DMA0_VCR: - case GSREG_DMA1_VCR: - ret = DMACH[id == GSREG_DMA1_VCR].VCR; - break; - - case GSREG_DMA0_DRCR: - case GSREG_DMA1_DRCR: - ret = DMACH[id == GSREG_DMA1_DRCR].DRCR; - break; - // - // - // - case GSREG_FRC: - ret = FRT.FRC; - break; - - case GSREG_OCR0: - ret = FRT.OCR[0]; - break; - - case GSREG_OCR1: - ret = FRT.OCR[1]; - break; - - case GSREG_FICR: - ret = FRT.FICR; - break; - - case GSREG_TIER: - ret = FRT.TIER; - break; - - case GSREG_FTCSR: - ret = FRT.FTCSR; - break; - - case GSREG_FTCSRM: - ret = FRT.FTCSRM; - break; - - case GSREG_TCR: - ret = FRT.TCR; - break; - - case GSREG_TOCR: - ret = FRT.TOCR; - break; - - case GSREG_RWT: - ret = FRT.RW_Temp; - break; - } - - return ret; -} - -void SH7095::SetRegister(const unsigned id, const uint32 value) -{ - switch(id) - { - //case GSREG_PC: break; - - case GSREG_PID: - Pipe_ID = value; - break; - - case GSREG_PIF: - Pipe_IF = value; - break; - - //case GSREG_EP: - // EPending = value; - // break; - - case GSREG_RPC: - PC = value; - break; - - case GSREG_R0: case GSREG_R1: case GSREG_R2: case GSREG_R3: case GSREG_R4: case GSREG_R5: case GSREG_R6: case GSREG_R7: - case GSREG_R8: case GSREG_R9: case GSREG_R10: case GSREG_R11: case GSREG_R12: case GSREG_R13: case GSREG_R14: case GSREG_R15: - R[id - GSREG_R0] = value; - break; - - case GSREG_SR: - SR = value & 0x3F3; - RecalcPendingIntPEX(); - break; - - case GSREG_GBR: - GBR = value; - break; - - case GSREG_VBR: - VBR = value; - break; - - case GSREG_MACH: - MACH = value; - break; - - case GSREG_MACL: - MACL = value; - break; - - case GSREG_PR: - PR = value; - break; - - // - // - // - case GSREG_FTCSR: - FRT.FTCSR = value & 0x8F; - RecalcPendingIntPEX(); - FRT_CheckOCR(); - break; - - case GSREG_FTCSRM: - FRT.FTCSRM = value & 0x8F; - break; - } -} - -// -// -// -// -// -// -// -void MDFN_COLD SH7095::Disassemble(const uint16 instr, const uint32 PC, char* buffer, uint16 (*DisPeek16)(uint32), uint32 (*DisPeek32)(uint32)) -{ - static const char* CR_Names[3] = { "SR", "GBR", "VBR" }; - static const char* SR_Names[3] = { "MACH", "MACL", "PR" }; - const unsigned instr_nyb1 = (instr >> 4) & 0xF; - const unsigned instr_nyb2 = (instr >> 8) & 0xF; - - switch(InstrDecodeTab[instr]) - { - #define BEGIN_DIS_OP(x) OP_##x { - #define END_DIS_OP } break; - - default: - trio_sprintf(buffer, ".word 0x%04x", instr); - break; - - // - // MOV #imm,Rn - // - BEGIN_DIS_OP(MOV_IMM_REG) - const unsigned n = instr_nyb2; - const int32 imm = (int8)instr; - - trio_sprintf(buffer, "MOV #%d,R%u", imm, n); - END_DIS_OP - - - // - // MOV.W @(disp,PC),Rn - // - BEGIN_DIS_OP(MOV_W_PCREL_REG) - const unsigned n = instr_nyb2; - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = PC + (d << 1); - - trio_sprintf(buffer, "MOV.W @(0x%03x,PC),R%u ! 0x%04x", (d << 1), n, DisPeek16(ea)); - END_DIS_OP - - - // - // MOV.L @(disp,PC),Rn - // - BEGIN_DIS_OP(MOV_L_PCREL_REG) - const unsigned n = instr_nyb2; - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = (PC &~ 0x3) + (d << 2); - - trio_sprintf(buffer, "MOV.L @(0x%03x,PC),R%u ! 0x%08x", (d << 2), n, DisPeek32(ea)); - END_DIS_OP - - - // - // MOV Rm,Rn - // - BEGIN_DIS_OP(MOV_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV R%u,R%u", m, n); - END_DIS_OP - - - // - // MOV.B Rm,@Rn - // - BEGIN_DIS_OP(MOV_B_REG_REGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.B R%u,@R%u", m, n); - END_DIS_OP - - - // - // MOV.W Rm,@Rn - // - BEGIN_DIS_OP(MOV_W_REG_REGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.W R%u,@R%u", m, n); - END_DIS_OP - - - // - // MOV.L Rm,@Rn - // - BEGIN_DIS_OP(MOV_L_REG_REGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.L R%u,@R%u", m, n); - END_DIS_OP - - - // - // MOV.B @Rm,Rn - // - BEGIN_DIS_OP(MOV_B_REGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.B @R%u,R%u", m, n); - END_DIS_OP - - - // - // MOV.W @Rm,Rn - // - BEGIN_DIS_OP(MOV_W_REGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.W @R%u,R%u", m, n); - END_DIS_OP - - - // - // MOV.L @Rm,Rn - // - BEGIN_DIS_OP(MOV_L_REGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.L @R%u,R%u", m, n); - END_DIS_OP - - - // - // MOV.B Rm,@-Rn - // - BEGIN_DIS_OP(MOV_B_REG_REGINDIRPD) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.B R%u,@-R%u", m, n); - END_DIS_OP - - - // - // MOV.W Rm,@-Rn - // - BEGIN_DIS_OP(MOV_W_REG_REGINDIRPD) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.W R%u,@-R%u", m, n); - END_DIS_OP - - - // - // MOV.L Rm,@-Rn - // - BEGIN_DIS_OP(MOV_L_REG_REGINDIRPD) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.L R%u,@-R%u", m, n); - END_DIS_OP - - - // - // MOV.B @Rm+,Rn - // - BEGIN_DIS_OP(MOV_B_REGINDIRPI_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.B @R%u+,R%u", m, n); - END_DIS_OP - - - // - // MOV.W @Rm+,Rn - // - BEGIN_DIS_OP(MOV_W_REGINDIRPI_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.W @R%u+,R%u", m, n); - END_DIS_OP - - - // - // MOV.L @Rm+,Rn - // - BEGIN_DIS_OP(MOV_L_REGINDIRPI_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.L @R%u+,R%u", m, n); - END_DIS_OP - - - // - // MOV.B R0,@(disp,Rn) - // - BEGIN_DIS_OP(MOV_B_REG0_REGINDIRDISP) - const unsigned n = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - - trio_sprintf(buffer, "MOV.B R0,@(%u,R%u)", (d << 0), n); - END_DIS_OP - - - // - // MOV.W R0,@(disp,Rn) - // - BEGIN_DIS_OP(MOV_W_REG0_REGINDIRDISP) - const unsigned n = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - - trio_sprintf(buffer, "MOV.W R0,@(%u,R%u)", (d << 1), n); - END_DIS_OP - - - // - // MOV.L Rm,@(disp,Rn) - // - BEGIN_DIS_OP(MOV_L_REG_REGINDIRDISP) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - - trio_sprintf(buffer, "MOV.L R%u,@(%u,R%u)", m, (d << 2), n); - END_DIS_OP - - - // - // MOV.B @(disp,Rm),R0 - // - BEGIN_DIS_OP(MOV_B_REGINDIRDISP_REG0) - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - - trio_sprintf(buffer, "MOV.B @(%u,R%u),R0", (d << 0), m); - END_DIS_OP - - - // - // MOV.W @(disp,Rm),R0 - // - BEGIN_DIS_OP(MOV_W_REGINDIRDISP_REG0) - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - - trio_sprintf(buffer, "MOV.W @(%u,R%u),R0", (d << 1), m); - END_DIS_OP - - - // - // MOV.L @(disp,Rm),Rn - // - BEGIN_DIS_OP(MOV_L_REGINDIRDISP_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - - trio_sprintf(buffer, "MOV.L @(%u,R%u),R%u", (d << 2), m, n); - END_DIS_OP - - - // - // MOV.B Rm,@(R0,Rn) - // - BEGIN_DIS_OP(MOV_B_REG_IDXREGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.B R%u,@(R0,R%u)", m, n); - END_DIS_OP - - - // - // MOV.W Rm,@(R0,Rn) - // - BEGIN_DIS_OP(MOV_W_REG_IDXREGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.W R%u,@(R0,R%u)", m, n); - END_DIS_OP - - - // - // MOV.L Rm,@(R0,Rn) - // - BEGIN_DIS_OP(MOV_L_REG_IDXREGINDIR) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.L R%u,@(R0,R%u)", m, n); - END_DIS_OP - - - // - // MOV.B @(R0,Rm),Rn - // - BEGIN_DIS_OP(MOV_B_IDXREGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.B @(R0,R%u),R%u", m, n); - END_DIS_OP - - - // - // MOV.W @(R0,Rm),Rn - // - BEGIN_DIS_OP(MOV_W_IDXREGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.W @(R0,R%u),R%u", m, n); - END_DIS_OP - - - // - // MOV.L @(R0,Rm),Rn - // - BEGIN_DIS_OP(MOV_L_IDXREGINDIR_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MOV.L @(R0,R%u),R%u", m, n); - END_DIS_OP - - - // - // MOV.B R0,@(disp,GBR) - // - BEGIN_DIS_OP(MOV_B_REG0_GBRINDIRDISP) - const unsigned d = (instr >> 0) & 0xff; - - trio_sprintf(buffer, "MOV.B R0,@(%u,GBR)", (d << 0)); - END_DIS_OP - - - // - // MOV.W R0,@(disp,GBR) - // - BEGIN_DIS_OP(MOV_W_REG0_GBRINDIRDISP) - const unsigned d = (instr >> 0) & 0xff; - - trio_sprintf(buffer, "MOV.W R0,@(%u,GBR)", (d << 1)); - END_DIS_OP - - - // - // MOV.L R0,@(disp,GBR) - // - BEGIN_DIS_OP(MOV_L_REG0_GBRINDIRDISP) - const unsigned d = (instr >> 0) & 0xff; - - trio_sprintf(buffer, "MOV.L R0,@(%u,GBR)", (d << 2)); - END_DIS_OP - - - // - // MOV.B @(disp,GBR),R0 - // - BEGIN_DIS_OP(MOV_B_GBRINDIRDISP_REG0) - const unsigned d = (instr >> 0) & 0xff; - - trio_sprintf(buffer, "MOV.B @(%u,GBR),R0", (d << 0)); - END_DIS_OP - - - // - // MOV.W @(disp,GBR),R0 - // - BEGIN_DIS_OP(MOV_W_GBRINDIRDISP_REG0) - const unsigned d = (instr >> 0) & 0xff; - - trio_sprintf(buffer, "MOV.W @(%u,GBR),R0", (d << 1)); - END_DIS_OP - - - // - // MOV.L @(disp,GBR),R0 - // - BEGIN_DIS_OP(MOV_L_GBRINDIRDISP_REG0) - const unsigned d = (instr >> 0) & 0xff; - - trio_sprintf(buffer, "MOV.L @(%u,GBR),R0", (d << 2)); - END_DIS_OP - - - // - // MOVA @(disp,PC),R0 - // - BEGIN_DIS_OP(MOVA_PCREL_REG0) - const unsigned d = (instr >> 0) & 0xff; - - trio_sprintf(buffer, "MOVA @(%u,PC),R0", (d << 2)); - END_DIS_OP - - - // - // MOVT Rn - // - BEGIN_DIS_OP(MOVT_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "MOVT R%u", n); - END_DIS_OP - - - // - // SWAP.B Rm,Rn - // - BEGIN_DIS_OP(SWAP_B_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "SWAP.B R%u,R%u", m, n); - END_DIS_OP - - - // - // SWAP.W Rm,Rn - // - BEGIN_DIS_OP(SWAP_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "SWAP.W R%u,R%u", m, n); - END_DIS_OP - - - // - // XTRCT Rm,Rn - // - BEGIN_DIS_OP(XTRCT_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "XTRCT R%u,R%u", m, n); - END_DIS_OP - - - // - // ADD Rm,Rn - // - BEGIN_DIS_OP(ADD_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "ADD R%u,R%u", m, n); - END_DIS_OP - - - // - // ADD #imm,Rn - // - BEGIN_DIS_OP(ADD_IMM_REG) - const unsigned n = instr_nyb2; - const int32 imm = (int8)instr; - - trio_sprintf(buffer, "ADD #%d,R%u", imm, n); - END_DIS_OP - - - // - // ADDC Rm,Rn - // - BEGIN_DIS_OP(ADDC_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "ADDC R%u,R%u", m, n); - END_DIS_OP - - - // - // ADDV Rm,Rn - // - BEGIN_DIS_OP(ADDV_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "ADDV R%u,R%u", m, n); - END_DIS_OP - - - // - // CMP/EQ #imm,R0 - // - BEGIN_DIS_OP(CMP_EQ_IMM_REG0) - const int32 imm = (int8)instr; - - trio_sprintf(buffer, "CMP/EQ #%d,R0", imm); - END_DIS_OP - - - // - // CMP/EQ Rm,Rn - // - BEGIN_DIS_OP(CMP_EQ_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "CMP/EQ R%u,R%u", m, n); - END_DIS_OP - - - // - // CMP/HS Rm,Rn - // - BEGIN_DIS_OP(CMP_HS_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "CMP/HS R%u,R%u", m, n); - END_DIS_OP - - - // - // CMP/GE Rm,Rn - // - BEGIN_DIS_OP(CMP_GE_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "CMP/GE R%u,R%u", m, n); - END_DIS_OP - - - // - // CMP/HI Rm,Rn - // - BEGIN_DIS_OP(CMP_HI_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "CMP/HI R%u,R%u", m, n); - END_DIS_OP - - - // - // CMP/GT Rm,Rn - // - BEGIN_DIS_OP(CMP_GT_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "CMP/GT R%u,R%u", m, n); - END_DIS_OP - - - // - // CMP/PZ Rn - // - BEGIN_DIS_OP(CMP_PZ_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "CMP/PZ R%u", n); - END_DIS_OP - - - // - // CMP/PL Rn - // - BEGIN_DIS_OP(CMP_PL_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "CMP/PL R%u", n); - END_DIS_OP - - - // - // CMP/STR Rm,Rn - // - BEGIN_DIS_OP(CMP_STR_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "CMP/STR R%u,R%u", m, n); - END_DIS_OP - - - // - // DIV1 Rm,Rn - // - BEGIN_DIS_OP(DIV1_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "DIV1 R%u,R%u", m, n); - END_DIS_OP - - - // - // DIV0S Rm,Rn - // - BEGIN_DIS_OP(DIV0S_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "DIV0S R%u,R%u", m, n); - END_DIS_OP - - - // - // DIV0U - // - BEGIN_DIS_OP(DIV0U) - trio_sprintf(buffer, "DIV0U"); - END_DIS_OP - - - // - // DMULS.L Rm,Rn - // - BEGIN_DIS_OP(DMULS_L_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "DMULS.L R%u,R%u", m, n); - END_DIS_OP - - - // - // DMULU.L Rm,Rn - // - BEGIN_DIS_OP(DMULU_L_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "DMULU.L R%u,R%u", m, n); - END_DIS_OP - - - // - // DT Rn - // - BEGIN_DIS_OP(DT) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "DT R%u", n); - END_DIS_OP - - - // - // EXTS.B Rm,Rn - // - BEGIN_DIS_OP(EXTS_B_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "EXTS.B R%u,R%u", m, n); - END_DIS_OP - - - // - // EXTS.W Rm,Rn - // - BEGIN_DIS_OP(EXTS_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "EXTS.W R%u,R%u", m, n); - END_DIS_OP - - - // - // EXTU.B Rm,Rn - // - BEGIN_DIS_OP(EXTU_B_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "EXTU.B R%u,R%u", m, n); - END_DIS_OP - - - // - // EXTU.W Rm,Rn - // - BEGIN_DIS_OP(EXTU_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "EXTU.W R%u,R%u", m, n); - END_DIS_OP - - - // - // MAC.L @Rm+,@Rn+ - // - BEGIN_DIS_OP(MAC_L) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MAC.L @R%u+,@R%u+", m, n); - END_DIS_OP - - - // - // MAC.W @Rm+,@Rn+ - // - BEGIN_DIS_OP(MAC_W) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MAC.W @R%u+,@R%u+", m, n); - END_DIS_OP - - - // - // MUL.L Rm,Rn - // - BEGIN_DIS_OP(MUL_L_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MUL.L R%u,R%u", m, n); - END_DIS_OP - - - // - // MULS.W Rm,Rn - // - BEGIN_DIS_OP(MULS_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MULS.W R%u,R%u", m, n); - END_DIS_OP - - - // - // MULU.W Rm,Rn - // - BEGIN_DIS_OP(MULU_W_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "MULU.W R%u,R%u", m, n); - END_DIS_OP - - - // - // NEG Rm,Rn - // - BEGIN_DIS_OP(NEG_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "NEG R%u,R%u", m, n); - END_DIS_OP - - - // - // NEGC Rm,Rn - // - BEGIN_DIS_OP(NEGC_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "NEGC R%u,R%u", m, n); - END_DIS_OP - - - // - // SUB Rm,Rn - // - BEGIN_DIS_OP(SUB_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "SUB R%u,R%u", m, n); - END_DIS_OP - - - // - // SUBC Rm,Rn - // - BEGIN_DIS_OP(SUBC_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "SUBC R%u,R%u", m, n); - END_DIS_OP - - - // - // SUBV Rm,Rn - // - BEGIN_DIS_OP(SUBV_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "SUBV R%u,R%u", m, n); - END_DIS_OP - - - // - // AND Rm,Rn - // - BEGIN_DIS_OP(AND_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "AND R%u,R%u", m, n); - END_DIS_OP - - - // - // AND #imm,R0 - // - BEGIN_DIS_OP(AND_IMM_REG0) - const unsigned imm = (uint8)instr; - - trio_sprintf(buffer, "AND #%u,R0", imm); - END_DIS_OP - - - // - // AND.B #imm,@(R0,GBR) - // - BEGIN_DIS_OP(AND_B_IMM_IDXGBRINDIR) - const unsigned imm = (uint8)instr; - - trio_sprintf(buffer, "AND.B #%u,@(R0,GBR)", imm); - END_DIS_OP - - - // - // NOT Rm,Rn - // - BEGIN_DIS_OP(NOT_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "NOT R%u,R%u", m, n); - END_DIS_OP - - - // - // OR Rm,Rn - // - BEGIN_DIS_OP(OR_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "OR R%u,R%u", m, n); - END_DIS_OP - - - // - // OR #imm,R0 - // - BEGIN_DIS_OP(OR_IMM_REG0) - const unsigned imm = (uint8)instr; - - trio_sprintf(buffer, "OR #%u,R0", imm); - END_DIS_OP - - - // - // OR.B #imm,@(R0,GBR) - // - BEGIN_DIS_OP(OR_B_IMM_IDXGBRINDIR) - const unsigned imm = (uint8)instr; - - trio_sprintf(buffer, "OR.B #%u,@(R0,GBR)", imm); - END_DIS_OP - - - // - // TAS.B @Rn - // - BEGIN_DIS_OP(TAS_B_REGINDIR) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "TAS.B @R%u", n); - END_DIS_OP - - - // - // TST Rm,Rn - // - BEGIN_DIS_OP(TST_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "TST R%u,R%u", m, n); - END_DIS_OP - - - // - // TST #imm,R0 - // - BEGIN_DIS_OP(TST_IMM_REG0) - const unsigned imm = (uint8)instr; - - trio_sprintf(buffer, "TST #%u,R0", imm); - END_DIS_OP - - - // - // TST.B #imm,@(R0,GBR) - // - BEGIN_DIS_OP(TST_B_IMM_IDXGBRINDIR) - const unsigned imm = (uint8)instr; - - trio_sprintf(buffer, "TST.B #%u,@(R0,GBR)", imm); - END_DIS_OP - - - // - // XOR Rm,Rn - // - BEGIN_DIS_OP(XOR_REG_REG) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - trio_sprintf(buffer, "XOR R%u,R%u", m, n); - END_DIS_OP - - - // - // XOR #imm,R0 - // - BEGIN_DIS_OP(XOR_IMM_REG0) - const unsigned imm = (uint8)instr; - - trio_sprintf(buffer, "XOR #%u,R0", imm); - END_DIS_OP - - - // - // XOR.B #imm,@(R0,GBR) - // - BEGIN_DIS_OP(XOR_B_IMM_IDXGBRINDIR) - const unsigned imm = (uint8)instr; - - trio_sprintf(buffer, "XOR.B #%u,@(R0,GBR)", imm); - END_DIS_OP - - - // - // ROTL Rn - // - BEGIN_DIS_OP(ROTL_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "ROTL R%u", n); - END_DIS_OP - - - // - // ROTR Rn - // - BEGIN_DIS_OP(ROTR_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "ROTR R%u", n); - END_DIS_OP - - - // - // ROTCL Rn - // - BEGIN_DIS_OP(ROTCL_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "ROTCL R%u", n); - END_DIS_OP - - - // - // ROTCR Rn - // - BEGIN_DIS_OP(ROTCR_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "ROTCR R%u", n); - END_DIS_OP - - - // - // SHAR Rn - // - BEGIN_DIS_OP(SHAR_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "SHAR R%u", n); - END_DIS_OP - - - // - // SHLL Rn - // - BEGIN_DIS_OP(SHLL_REG) - const unsigned n = instr_nyb2; - - if(instr & 0x20) - trio_sprintf(buffer, "SHAL R%u", n); - else - trio_sprintf(buffer, "SHLL R%u", n); - END_DIS_OP - - - // - // SHLR Rn - // - BEGIN_DIS_OP(SHLR_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "SHLR R%u", n); - END_DIS_OP - - - // - // SHLL2 Rn - // - BEGIN_DIS_OP(SHLL2_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "SHLL2 R%u", n); - END_DIS_OP - - - // - // SHLR2 Rn - // - BEGIN_DIS_OP(SHLR2_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "SHLR2 R%u", n); - END_DIS_OP - - - // - // SHLL8 Rn - // - BEGIN_DIS_OP(SHLL8_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "SHLL8 R%u", n); - END_DIS_OP - - - // - // SHLR8 Rn - // - BEGIN_DIS_OP(SHLR8_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "SHLR8 R%u", n); - END_DIS_OP - - - // - // SHLL16 Rn - // - BEGIN_DIS_OP(SHLL16_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "SHLL16 R%u", n); - END_DIS_OP - - - // - // SHLR16 Rn - // - BEGIN_DIS_OP(SHLR16_REG) - const unsigned n = instr_nyb2; - - trio_sprintf(buffer, "SHLR16 R%u", n); - END_DIS_OP - - - // - // BF - // - BEGIN_DIS_OP(BF) - trio_sprintf(buffer, "BF 0x%08x", (uint32)(PC + ((uint32)(int8)instr << 1))); - END_DIS_OP - - - // - // BF/S - // - BEGIN_DIS_OP(BF_S) - trio_sprintf(buffer, "BF/S 0x%08x", (uint32)(PC + ((uint32)(int8)instr << 1))); - END_DIS_OP - - - // - // BT - // - BEGIN_DIS_OP(BT) - trio_sprintf(buffer, "BT 0x%08x", (uint32)(PC + ((uint32)(int8)instr << 1))); - END_DIS_OP - - - // - // BT/S - // - BEGIN_DIS_OP(BT_S) - trio_sprintf(buffer, "BT/S 0x%08x", (uint32)(PC + ((uint32)(int8)instr << 1))); - END_DIS_OP - - - // - // BRA - // - BEGIN_DIS_OP(BRA) - trio_sprintf(buffer, "BRA 0x%08x", (uint32)(PC + ((uint32)sign_x_to_s32(12, instr) << 1))); - END_DIS_OP - - - // - // BRAF Rm - // - BEGIN_DIS_OP(BRAF_REG) - const unsigned m = instr_nyb2; - - trio_sprintf(buffer, "BRAF R%u", m); - END_DIS_OP - - - // - // BSR - // - BEGIN_DIS_OP(BSR) - trio_sprintf(buffer, "BSR 0x%08x", (uint32)(PC + ((uint32)sign_x_to_s32(12, instr) << 1))); - END_DIS_OP - - - // - // BSRF Rm - // - BEGIN_DIS_OP(BSRF_REG) - const unsigned m = instr_nyb2; - - trio_sprintf(buffer, "BSRF R%u", m); - END_DIS_OP - - - // - // JMP @Rm - // - BEGIN_DIS_OP(JMP_REGINDIR) - const unsigned m = instr_nyb2; - - trio_sprintf(buffer, "JMP @R%u", m); - END_DIS_OP - - - // - // JSR @Rm - // - BEGIN_DIS_OP(JSR_REGINDIR) - const unsigned m = instr_nyb2; - - trio_sprintf(buffer, "JSR @R%u", m); - END_DIS_OP - - - // - // RTS - // - BEGIN_DIS_OP(RTS) - trio_sprintf(buffer, "RTS"); - END_DIS_OP - - - // - // CLRT - // - BEGIN_DIS_OP(CLRT) - trio_sprintf(buffer, "CLRT"); - END_DIS_OP - - - // - // CLRMAC - // - BEGIN_DIS_OP(CLRMAC) - trio_sprintf(buffer, "CLRMAC"); - END_DIS_OP - - - // - // LDC - // - BEGIN_DIS_OP(LDC) - const unsigned m = instr_nyb2; - const unsigned cri = (instr >> 4) & 0x3; - - trio_sprintf(buffer, "LDC R%u, %s", m, CR_Names[cri]); - END_DIS_OP - - // - // LDC.L - // - BEGIN_DIS_OP(LDC_L) - const unsigned m = instr_nyb2; - const unsigned cri = (instr >> 4) & 0x3; - - trio_sprintf(buffer, "LDC.L @R%u+, %s", m, CR_Names[cri]); - END_DIS_OP - - - // - // LDS - // - BEGIN_DIS_OP(LDS) - const unsigned m = instr_nyb2; - const unsigned sri = (instr >> 4) & 0x3; - - trio_sprintf(buffer, "LDS R%u, %s", m, SR_Names[sri]); - END_DIS_OP - - - // - // LDS.L - // - BEGIN_DIS_OP(LDS_L) - const unsigned m = instr_nyb2; - const unsigned sri = (instr >> 4) & 0x3; - - trio_sprintf(buffer, "LDS.L @R%u+, %s", m, SR_Names[sri]); - END_DIS_OP - - - // - // NOP - // - BEGIN_DIS_OP(NOP) - trio_sprintf(buffer, "NOP"); - END_DIS_OP - - - // - // RTE - // - BEGIN_DIS_OP(RTE) - trio_sprintf(buffer, "RTE"); - END_DIS_OP - - - // - // SETT - // - BEGIN_DIS_OP(SETT) - trio_sprintf(buffer, "SETT"); - END_DIS_OP - - - // - // SLEEP - // - BEGIN_DIS_OP(SLEEP) - trio_sprintf(buffer, "SLEEP"); - END_DIS_OP - - // - // STC - // - BEGIN_DIS_OP(STC) - const unsigned n = instr_nyb2; - const unsigned cri = (instr >> 4) & 0x3; - - trio_sprintf(buffer, "STS %s, R%u", CR_Names[cri], n); - END_DIS_OP - - - // - // STC.L - // - BEGIN_DIS_OP(STC_L) - const unsigned n = instr_nyb2; - const unsigned cri = (instr >> 4) & 0x3; - - trio_sprintf(buffer, "STC.L %s, @-R%u", CR_Names[cri], n); - END_DIS_OP - - - // - // STS - // - BEGIN_DIS_OP(STS) - const unsigned n = instr_nyb2; - const unsigned sri = (instr >> 4) & 0x3; - - trio_sprintf(buffer, "STS %s, R%u", SR_Names[sri], n); - END_DIS_OP - - - // - // STS.L - // - BEGIN_DIS_OP(STS_L) - const unsigned n = instr_nyb2; - const unsigned sri = (instr >> 4) & 0x3; - - trio_sprintf(buffer, "STS.L %s, @-R%u", SR_Names[sri], n); - END_DIS_OP - - - // - // TRAPA #imm - // - BEGIN_DIS_OP(TRAPA) - const unsigned imm = (uint8)instr; - - trio_sprintf(buffer, "TRAPA #%u", imm); - END_DIS_OP - - #undef BEGIN_DIS_OP - #undef END_DIS_OP - } -} - -// -// -// -// -INLINE void SH7095::CheckRWBreakpoints(void (*MRead)(unsigned len, uint32 addr), void (*MWrite)(unsigned len, uint32 addr)) const -{ - uint32 lpid = Pipe_ID; - // - // - // - //SPEPRecover:; - const uint32 instr = (uint16)lpid; - const unsigned instr_nyb1 = (instr >> 4) & 0xF; - const unsigned instr_nyb2 = (instr >> 8) & 0xF; - - switch(lpid >> 24) - { - #include "sh7095_opdefs.inc" - #define BEGIN_BP_OP(x) OP_##x { - #define END_BP_OP } break; - - // - // MOV.W @(disp,PC),Rn - // - BEGIN_BP_OP(MOV_W_PCREL_REG) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = PC + (d << 1); - - MRead(2, ea); - END_BP_OP - - - // - // MOV.L @(disp,PC),Rn - // - BEGIN_BP_OP(MOV_L_PCREL_REG) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = (PC &~ 0x3) + (d << 2); - - MRead(4, ea); - END_BP_OP - - - // - // MOV.B Rm,@Rn - // - BEGIN_BP_OP(MOV_B_REG_REGINDIR) - const unsigned n = instr_nyb2; - const uint32 ea = R[n]; - - MWrite(1, ea); - END_BP_OP - - - // - // MOV.W Rm,@Rn - // - BEGIN_BP_OP(MOV_W_REG_REGINDIR) - const unsigned n = instr_nyb2; - const uint32 ea = R[n]; - - MWrite(2, ea); - END_BP_OP - - - // - // MOV.L Rm,@Rn - // - BEGIN_BP_OP(MOV_L_REG_REGINDIR) - const unsigned n = instr_nyb2; - const uint32 ea = R[n]; - - MWrite(4, ea); - END_BP_OP - - - // - // MOV.B @Rm,Rn - // - BEGIN_BP_OP(MOV_B_REGINDIR_REG) - const unsigned m = instr_nyb1; - const uint32 ea = R[m]; - - MRead(1, ea); - END_BP_OP - - - // - // MOV.W @Rm,Rn - // - BEGIN_BP_OP(MOV_W_REGINDIR_REG) - const unsigned m = instr_nyb1; - const uint32 ea = R[m]; - - MRead(2, ea); - END_BP_OP - - - // - // MOV.L @Rm,Rn - // - BEGIN_BP_OP(MOV_L_REGINDIR_REG) - const unsigned m = instr_nyb1; - const uint32 ea = R[m]; - - MRead(4, ea); - END_BP_OP - - - // - // MOV.B Rm,@-Rn - // - BEGIN_BP_OP(MOV_B_REG_REGINDIRPD) - const unsigned n = instr_nyb2; - const uint32 ea = R[n] - 1; - - MWrite(1, ea); - END_BP_OP - - - // - // MOV.W Rm,@-Rn - // - BEGIN_BP_OP(MOV_W_REG_REGINDIRPD) - const unsigned n = instr_nyb2; - const uint32 ea = R[n] - 2; - - MWrite(2, ea); - END_BP_OP - - - // - // MOV.L Rm,@-Rn - // - BEGIN_BP_OP(MOV_L_REG_REGINDIRPD) - const unsigned n = instr_nyb2; - const uint32 ea = R[n] - 4; - - MWrite(4, ea); - END_BP_OP - - - // - // MOV.B @Rm+,Rn - // - BEGIN_BP_OP(MOV_B_REGINDIRPI_REG) - const unsigned m = instr_nyb1; - const uint32 ea = R[m]; - - MRead(1, ea); - END_BP_OP - - - // - // MOV.W @Rm+,Rn - // - BEGIN_BP_OP(MOV_W_REGINDIRPI_REG) - const unsigned m = instr_nyb1; - const uint32 ea = R[m]; - - MRead(2, ea); - END_BP_OP - - - // - // MOV.L @Rm+,Rn - // - BEGIN_BP_OP(MOV_L_REGINDIRPI_REG) - const unsigned m = instr_nyb1; - const uint32 ea = R[m]; - - MRead(4, ea); - END_BP_OP - - - // - // MOV.B R0,@(disp,Rn) - // - BEGIN_BP_OP(MOV_B_REG0_REGINDIRDISP) - const unsigned n = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[n] + (d << 0); - - MWrite(1, ea); - END_BP_OP - - - // - // MOV.W R0,@(disp,Rn) - // - BEGIN_BP_OP(MOV_W_REG0_REGINDIRDISP) - const unsigned n = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[n] + (d << 1); - - MWrite(2, ea); - END_BP_OP - - - // - // MOV.L Rm,@(disp,Rn) - // - BEGIN_BP_OP(MOV_L_REG_REGINDIRDISP) - const unsigned n = instr_nyb2; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[n] + (d << 2); - - MWrite(4, ea); - END_BP_OP - - - // - // MOV.B @(disp,Rm),R0 - // - BEGIN_BP_OP(MOV_B_REGINDIRDISP_REG0) - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[m] + (d << 0); - - MRead(1, ea); - END_BP_OP - - - // - // MOV.W @(disp,Rm),R0 - // - BEGIN_BP_OP(MOV_W_REGINDIRDISP_REG0) - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[m] + (d << 1); - - MRead(2, ea); - END_BP_OP - - - // - // MOV.L @(disp,Rm),Rn - // - BEGIN_BP_OP(MOV_L_REGINDIRDISP_REG) - const unsigned m = instr_nyb1; - const unsigned d = (instr >> 0) & 0xf; - const uint32 ea = R[m] + (d << 2); - - MRead(4, ea); - END_BP_OP - - - // - // MOV.B Rm,@(R0,Rn) - // - BEGIN_BP_OP(MOV_B_REG_IDXREGINDIR) - const unsigned n = instr_nyb2; - const uint32 ea = R[0] + R[n]; - - MWrite(1, ea); - END_BP_OP - - - // - // MOV.W Rm,@(R0,Rn) - // - BEGIN_BP_OP(MOV_W_REG_IDXREGINDIR) - const unsigned n = instr_nyb2; - const uint32 ea = R[0] + R[n]; - - MWrite(2, ea); - END_BP_OP - - - // - // MOV.L Rm,@(R0,Rn) - // - BEGIN_BP_OP(MOV_L_REG_IDXREGINDIR) - const unsigned n = instr_nyb2; - const uint32 ea = R[0] + R[n]; - - MWrite(4, ea); - END_BP_OP - - - // - // MOV.B @(R0,Rm),Rn - // - BEGIN_BP_OP(MOV_B_IDXREGINDIR_REG) - const unsigned m = instr_nyb1; - const uint32 ea = R[0] + R[m]; - - MRead(1, ea); - END_BP_OP - - - // - // MOV.W @(R0,Rm),Rn - // - BEGIN_BP_OP(MOV_W_IDXREGINDIR_REG) - const unsigned m = instr_nyb1; - const uint32 ea = R[0] + R[m]; - - MRead(2, ea); - END_BP_OP - - - // - // MOV.L @(R0,Rm),Rn - // - BEGIN_BP_OP(MOV_L_IDXREGINDIR_REG) - const unsigned m = instr_nyb1; - const uint32 ea = R[0] + R[m]; - - MRead(4, ea); - END_BP_OP - - - // - // MOV.B R0,@(disp,GBR) - // - BEGIN_BP_OP(MOV_B_REG0_GBRINDIRDISP) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 0); - - MWrite(1, ea); - END_BP_OP - - - // - // MOV.W R0,@(disp,GBR) - // - BEGIN_BP_OP(MOV_W_REG0_GBRINDIRDISP) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 1); - - MWrite(2, ea); - END_BP_OP - - - // - // MOV.L R0,@(disp,GBR) - // - BEGIN_BP_OP(MOV_L_REG0_GBRINDIRDISP) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 2); - - MWrite(4, ea); - END_BP_OP - - - // - // MOV.B @(disp,GBR),R0 - // - BEGIN_BP_OP(MOV_B_GBRINDIRDISP_REG0) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 0); - - MRead(1, ea); - END_BP_OP - - - // - // MOV.W @(disp,GBR),R0 - // - BEGIN_BP_OP(MOV_W_GBRINDIRDISP_REG0) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 1); - - MRead(2, ea); - END_BP_OP - - - // - // MOV.L @(disp,GBR),R0 - // - BEGIN_BP_OP(MOV_L_GBRINDIRDISP_REG0) - const unsigned d = (instr >> 0) & 0xff; - const uint32 ea = GBR + (d << 2); - - MRead(4, ea); - END_BP_OP - - - // - // MAC.L @Rm+,@Rn+ - // - BEGIN_BP_OP(MAC_L) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - MRead(4, R[m]); - MRead(4, R[n] + ((m == n) << 2)); - END_BP_OP - - - // - // MAC.W @Rm+,@Rn+ - // - BEGIN_BP_OP(MAC_W) - const unsigned n = instr_nyb2; - const unsigned m = instr_nyb1; - - MRead(2, R[m]); - MRead(2, R[n] + ((m == n) << 1)); - END_BP_OP - - - // - // AND.B #imm,@(R0,GBR) - // - BEGIN_BP_OP(AND_B_IMM_IDXGBRINDIR) - const uint32 ea = R[0] + GBR; - - MRead(1, ea); - MWrite(1, ea); - END_BP_OP - - // - // OR.B #imm,@(R0,GBR) - // - BEGIN_BP_OP(OR_B_IMM_IDXGBRINDIR) - const uint32 ea = R[0] + GBR; - - MRead(1, ea); - MWrite(1, ea); - END_BP_OP - - - // - // TAS.B @Rn - // - BEGIN_BP_OP(TAS_B_REGINDIR) - const unsigned n = instr_nyb2; - const uint32 ea = R[n]; - - MRead(1, ea); - MWrite(1, ea); - END_BP_OP - - - // - // TST.B #imm,@(R0,GBR) - // - BEGIN_BP_OP(TST_B_IMM_IDXGBRINDIR) - const uint32 ea = R[0] + GBR; - - MRead(1, ea); - END_BP_OP - - - // - // XOR.B #imm,@(R0,GBR) - // - BEGIN_BP_OP(XOR_B_IMM_IDXGBRINDIR) - const uint32 ea = R[0] + GBR; - - MRead(1, ea); - MWrite(1, ea); - END_BP_OP - - - // - // LDC.L - // - BEGIN_BP_OP(LDC_L) - const unsigned m = instr_nyb2; - const uint32 ea = R[m]; - - MRead(4, ea); - END_BP_OP - - - // - // LDS.L - // - BEGIN_BP_OP(LDS_L) - const unsigned m = instr_nyb2; - const uint32 ea = R[m]; - - MRead(4, ea); - END_BP_OP - - - // - // RTE - // - BEGIN_BP_OP(RTE) - MRead(4, R[15]); - MRead(4, 4 + R[15]); - END_BP_OP - - // - // STC.L - // - BEGIN_BP_OP(STC_L) - const unsigned n = instr_nyb2; - const uint32 ea = R[n] - 4; - - MWrite(4, ea); - END_BP_OP - - // - // STS.L - // - BEGIN_BP_OP(STS_L) // Pipeline same as ordinary store instruction - const unsigned n = instr_nyb2; - const uint32 ea = R[n] - 4; - - MWrite(4, ea); - END_BP_OP - - -#if 0 - // - // TRAPA #imm - // - // Saved PC is the address of the instruction after the TRAPA instruction - // - BEGIN_BP_OP_DLYIDIF(TRAPA) - const unsigned imm = (uint8)instr; - - BP_EXCEPT(EXCEPTION_TRAP, imm); - END_BP_OP - - - // - // Illegal Instruction - // - BEGIN_BP_OP_DLYIDIF(ILLEGAL) - BP_EXCEPT(EXCEPTION_ILLINSTR, VECNUM_ILLINSTR); - END_BP_OP - - // - // Illegal Slot Instruction - // - BEGIN_BP_OP_DLYIDIF(SLOT_ILLEGAL) - BP_EXCEPT(EXCEPTION_ILLSLOT, VECNUM_ILLSLOT); - END_BP_OP - - // - // Pending exception(address error/interrupt) - // - BEGIN_BP_OP_DLYIDIF(PSEUDO_EPENDING) - #define TPP(x) (Pipe_ID & (1U << ((x) + EPENDING_PEXBITS_SHIFT))) - - if(MDFN_UNLIKELY(TPP(PEX_PSEUDO_EXTHALT))) - return; - else if(MDFN_UNLIKELY(TPP(PEX_POWERON) || TPP(PEX_RESET))) - { - if(TPP(PEX_POWERON)) - BP_EXCEPT(EXCEPTION_POWERON, VECNUM_POWERON); - else - BP_EXCEPT(EXCEPTION_RESET, VECNUM_RESET); - } - else if(MDFN_UNLIKELY(TPP(PEX_PSEUDO_DMABURST))) - return; - else if(MDFN_UNLIKELY(TPP(PEX_CPUADDR))) - BP_EXCEPT(EXCEPTION_CPUADDR, VECNUM_CPUADDR); - else if(MDFN_UNLIKELY(TPP(PEX_DMAADDR))) - BP_EXCEPT(EXCEPTION_DMAADDR, VECNUM_DMAADDR); - else if(TPP(PEX_NMI)) - BP_EXCEPT(EXCEPTION_NMI, VECNUM_NMI); - else // Int - { - uint8 ipr = GetPendingInt(NULL); - - if(MDFN_LIKELY(ipr > ((SR >> 4) & 0xF))) - { - uint8 vecnum; - - // Note: GetPendingInt() may call ExIVecFetch(), which may call SetIRL with a new value, so be - // careful to use the "old" value here. - GetPendingInt(&vecnum); - BP_EXCEPT(EXCEPTION_INT, vecnum); - } - else - { - lpid = (uint16)lpid; - lpid |= InstrDecodeTab[lpid] << 24; - goto SPEPRecover; - } - } -END_BP_OP -#endif - - #undef BEGIN_BP_OP - #undef END_BP_OP - } -} diff --git a/waterbox/ss/sh7095_idecodetab.inc b/waterbox/ss/sh7095_idecodetab.inc deleted file mode 100644 index e5ac21b44c..0000000000 --- a/waterbox/ss/sh7095_idecodetab.inc +++ /dev/null @@ -1,256 +0,0 @@ - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x6f, 0x75, 0x7b, 0x6e, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x77, 0x37, 0x7b, 0x78, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x70, 0x24, 0x7b, 0x76, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x00, 0x00, 0x79, 0x6b, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x79, 0x69, 0x17, 0x18, 0x19, 0x41, 0x00, 0x24, 0x7b, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x17, 0x18, 0x19, 0x41, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1b, 0x1c, 0x3f, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, 0x05, 0x06, 0x07, 0x00, 0x0b, 0x0c, 0x0d, 0x36, 0x51, 0x49, 0x54, 0x4d, 0x34, 0x27, 0x43, 0x42, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, 0x2d, 0x00, 0x2e, 0x2f, 0x35, 0x39, 0x30, 0x31, 0x46, 0x00, 0x47, 0x48, 0x28, 0x38, 0x2a, 0x2b, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x5c, 0x5d, 0x7c, 0x7a, 0x57, 0x58, 0x74, 0x72, 0x5e, 0x5f, 0x73, 0x6d, 0x00, 0x00, 0x71, 0x40, 0x3a, 0x32, 0x7c, 0x7a, 0x00, 0x33, 0x74, 0x72, 0x60, 0x61, 0x73, 0x50, 0x00, 0x00, 0x71, 0x40, 0x5c, 0x5b, 0x7c, 0x7a, 0x59, 0x5a, 0x74, 0x72, 0x62, 0x63, 0x73, 0x6c, 0x00, 0x00, 0x71, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, 0x16, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, 0x08, 0x09, 0x0a, 0x04, 0x0e, 0x0f, 0x10, 0x4c, 0x25, 0x26, 0x45, 0x44, 0x3d, 0x3e, 0x3b, 0x3c, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, 0x29, - 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, - 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, 0x12, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, - 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, 0x15, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, 0x2c, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, 0x64, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, 0x67, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, 0x65, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, 0x68, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, 0x6a, - 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, - 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, - 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, - 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, - 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, 0x23, - 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, 0x52, - 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, 0x4a, - 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, - 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, - 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, 0x53, - 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, 0x4b, - 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, 0x56, - 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, 0x4f, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, diff --git a/waterbox/ss/sh7095_opdefs.inc b/waterbox/ss/sh7095_opdefs.inc deleted file mode 100644 index 4ef78c1db4..0000000000 --- a/waterbox/ss/sh7095_opdefs.inc +++ /dev/null @@ -1,157 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* sh7095_opdefs.inc: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#define OP_ILLEGAL case 0x00: /* (slot illegal) */ -#define OP_MOV_IMM_REG case 0x01:case 0x81: -#define OP_MOV_W_PCREL_REG case 0x02:case 0x82: -#define OP_MOV_L_PCREL_REG case 0x03:case 0x83: -#define OP_MOV_REG_REG case 0x04:case 0x84: -#define OP_MOV_B_REG_REGINDIR case 0x05:case 0x85: -#define OP_MOV_W_REG_REGINDIR case 0x06:case 0x86: -#define OP_MOV_L_REG_REGINDIR case 0x07:case 0x87: -#define OP_MOV_B_REGINDIR_REG case 0x08:case 0x88: -#define OP_MOV_W_REGINDIR_REG case 0x09:case 0x89: -#define OP_MOV_L_REGINDIR_REG case 0x0a:case 0x8a: -#define OP_MOV_B_REG_REGINDIRPD case 0x0b:case 0x8b: -#define OP_MOV_W_REG_REGINDIRPD case 0x0c:case 0x8c: -#define OP_MOV_L_REG_REGINDIRPD case 0x0d:case 0x8d: -#define OP_MOV_B_REGINDIRPI_REG case 0x0e:case 0x8e: -#define OP_MOV_W_REGINDIRPI_REG case 0x0f:case 0x8f: -#define OP_MOV_L_REGINDIRPI_REG case 0x10:case 0x90: -#define OP_MOV_B_REG0_REGINDIRDISP case 0x11:case 0x91: -#define OP_MOV_W_REG0_REGINDIRDISP case 0x12:case 0x92: -#define OP_MOV_L_REG_REGINDIRDISP case 0x13:case 0x93: -#define OP_MOV_B_REGINDIRDISP_REG0 case 0x14:case 0x94: -#define OP_MOV_W_REGINDIRDISP_REG0 case 0x15:case 0x95: -#define OP_MOV_L_REGINDIRDISP_REG case 0x16:case 0x96: -#define OP_MOV_B_REG_IDXREGINDIR case 0x17:case 0x97: -#define OP_MOV_W_REG_IDXREGINDIR case 0x18:case 0x98: -#define OP_MOV_L_REG_IDXREGINDIR case 0x19:case 0x99: -#define OP_MOV_B_IDXREGINDIR_REG case 0x1a:case 0x9a: -#define OP_MOV_W_IDXREGINDIR_REG case 0x1b:case 0x9b: -#define OP_MOV_L_IDXREGINDIR_REG case 0x1c:case 0x9c: -#define OP_MOV_B_REG0_GBRINDIRDISP case 0x1d:case 0x9d: -#define OP_MOV_W_REG0_GBRINDIRDISP case 0x1e:case 0x9e: -#define OP_MOV_L_REG0_GBRINDIRDISP case 0x1f:case 0x9f: -#define OP_MOV_B_GBRINDIRDISP_REG0 case 0x20:case 0xa0: -#define OP_MOV_W_GBRINDIRDISP_REG0 case 0x21:case 0xa1: -#define OP_MOV_L_GBRINDIRDISP_REG0 case 0x22:case 0xa2: -#define OP_MOVA_PCREL_REG0 case 0x23:case 0xa3: -#define OP_MOVT_REG case 0x24:case 0xa4: -#define OP_SWAP_B_REG_REG case 0x25:case 0xa5: -#define OP_SWAP_W_REG_REG case 0x26:case 0xa6: -#define OP_XTRCT_REG_REG case 0x27:case 0xa7: -#define OP_ADD_REG_REG case 0x28:case 0xa8: -#define OP_ADD_IMM_REG case 0x29:case 0xa9: -#define OP_ADDC_REG_REG case 0x2a:case 0xaa: -#define OP_ADDV_REG_REG case 0x2b:case 0xab: -#define OP_CMP_EQ_IMM_REG0 case 0x2c:case 0xac: -#define OP_CMP_EQ_REG_REG case 0x2d:case 0xad: -#define OP_CMP_HS_REG_REG case 0x2e:case 0xae: -#define OP_CMP_GE_REG_REG case 0x2f:case 0xaf: -#define OP_CMP_HI_REG_REG case 0x30:case 0xb0: -#define OP_CMP_GT_REG_REG case 0x31:case 0xb1: -#define OP_CMP_PZ_REG case 0x32:case 0xb2: -#define OP_CMP_PL_REG case 0x33:case 0xb3: -#define OP_CMP_STR_REG_REG case 0x34:case 0xb4: -#define OP_DIV1_REG_REG case 0x35:case 0xb5: -#define OP_DIV0S_REG_REG case 0x36:case 0xb6: -#define OP_DIV0U case 0x37:case 0xb7: -#define OP_DMULS_L_REG_REG case 0x38:case 0xb8: -#define OP_DMULU_L_REG_REG case 0x39:case 0xb9: -#define OP_DT case 0x3a:case 0xba: -#define OP_EXTS_B_REG_REG case 0x3b:case 0xbb: -#define OP_EXTS_W_REG_REG case 0x3c:case 0xbc: -#define OP_EXTU_B_REG_REG case 0x3d:case 0xbd: -#define OP_EXTU_W_REG_REG case 0x3e:case 0xbe: -#define OP_MAC_L case 0x3f:case 0xbf: -#define OP_MAC_W case 0x40:case 0xc0: -#define OP_MUL_L_REG_REG case 0x41:case 0xc1: -#define OP_MULS_W_REG_REG case 0x42:case 0xc2: -#define OP_MULU_W_REG_REG case 0x43:case 0xc3: -#define OP_NEG_REG_REG case 0x44:case 0xc4: -#define OP_NEGC_REG_REG case 0x45:case 0xc5: -#define OP_SUB_REG_REG case 0x46:case 0xc6: -#define OP_SUBC_REG_REG case 0x47:case 0xc7: -#define OP_SUBV_REG_REG case 0x48:case 0xc8: -#define OP_AND_REG_REG case 0x49:case 0xc9: -#define OP_AND_IMM_REG0 case 0x4a:case 0xca: -#define OP_AND_B_IMM_IDXGBRINDIR case 0x4b:case 0xcb: -#define OP_NOT_REG_REG case 0x4c:case 0xcc: -#define OP_OR_REG_REG case 0x4d:case 0xcd: -#define OP_OR_IMM_REG0 case 0x4e:case 0xce: -#define OP_OR_B_IMM_IDXGBRINDIR case 0x4f:case 0xcf: -#define OP_TAS_B_REGINDIR case 0x50:case 0xd0: -#define OP_TST_REG_REG case 0x51:case 0xd1: -#define OP_TST_IMM_REG0 case 0x52:case 0xd2: -#define OP_TST_B_IMM_IDXGBRINDIR case 0x53:case 0xd3: -#define OP_XOR_REG_REG case 0x54:case 0xd4: -#define OP_XOR_IMM_REG0 case 0x55:case 0xd5: -#define OP_XOR_B_IMM_IDXGBRINDIR case 0x56:case 0xd6: -#define OP_ROTL_REG case 0x57:case 0xd7: -#define OP_ROTR_REG case 0x58:case 0xd8: -#define OP_ROTCL_REG case 0x59:case 0xd9: -#define OP_ROTCR_REG case 0x5a:case 0xda: -#define OP_SHAR_REG case 0x5b:case 0xdb: -#define OP_SHLL_REG case 0x5c:case 0xdc: -#define OP_SHLR_REG case 0x5d:case 0xdd: -#define OP_SHLL2_REG case 0x5e:case 0xde: -#define OP_SHLR2_REG case 0x5f:case 0xdf: -#define OP_SHLL8_REG case 0x60:case 0xe0: -#define OP_SHLR8_REG case 0x61:case 0xe1: -#define OP_SHLL16_REG case 0x62:case 0xe2: -#define OP_SHLR16_REG case 0x63:case 0xe3: -#define OP_BF case 0x64: /* (slot illegal) */ -#define OP_BF_S case 0x65: /* (slot illegal) */ -#define OP_BT case 0x66: /* (slot illegal) */ -#define OP_BT_S case 0x67: /* (slot illegal) */ -#define OP_BRA case 0x68: /* (slot illegal) */ -#define OP_BRAF_REG case 0x69: /* (slot illegal) */ -#define OP_BSR case 0x6a: /* (slot illegal) */ -#define OP_BSRF_REG case 0x6b: /* (slot illegal) */ -#define OP_JMP_REGINDIR case 0x6c: /* (slot illegal) */ -#define OP_JSR_REGINDIR case 0x6d: /* (slot illegal) */ -#define OP_RTS case 0x6e: /* (slot illegal) */ -#define OP_CLRT case 0x6f:case 0xef: -#define OP_CLRMAC case 0x70:case 0xf0: -#define OP_LDC case 0x71:case 0xf1: -#define OP_LDC_L case 0x72:case 0xf2: -#define OP_LDS case 0x73:case 0xf3: -#define OP_LDS_L case 0x74:case 0xf4: -#define OP_NOP case 0x75:case 0xf5: -#define OP_RTE case 0x76: /* (slot illegal) */ -#define OP_SETT case 0x77:case 0xf7: -#define OP_SLEEP case 0x78:case 0xf8: -#define OP_STC case 0x79:case 0xf9: -#define OP_STC_L case 0x7a:case 0xfa: -#define OP_STS case 0x7b:case 0xfb: -#define OP_STS_L case 0x7c:case 0xfc: -#define OP_TRAPA case 0x7d: /* (slot illegal) */ - -#define OP_SLOT_ILLEGAL case 0x80:case 0xe4:case 0xe5:case 0xe6:case 0xe7:case 0xe8:case 0xe9:case 0xea:case 0xeb:case 0xec:case 0xed:case 0xee:case 0xf6:case 0xfd: - -// -// Pseudo-instructions: -// -#define OP_PSEUDO_STANDBY case 0x7e: -#define OP_PSEUDO_DMABURST case 0xfe: -#define OP_PSEUDO_EPENDING case 0x7f: case 0xff: - diff --git a/waterbox/ss/smpc.cpp b/waterbox/ss/smpc.cpp deleted file mode 100644 index e61922eb8c..0000000000 --- a/waterbox/ss/smpc.cpp +++ /dev/null @@ -1,1441 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* smpc.cpp - SMPC Emulation -** Copyright (C) 2015-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -/* - TODO: - CD On/Off -*/ - -#include "ss.h" -#include "cdrom/CDUtility.h" -using namespace CDUtility; - -#include "smpc.h" -#include "sound.h" -#include "vdp1.h" -#include "vdp2.h" -#include "cdb.h" -#include "scu.h" - -#include "input/gamepad.h" -#include "input/3dpad.h" -#include "input/mouse.h" -#include "input/wheel.h" -#include "input/mission.h" -#include "input/keyboard.h" -//#include "input/jpkeyboard.h" - -#include "input/multitap.h" - -namespace MDFN_IEN_SS -{ -#include "sh7095.h" - -enum -{ - CLOCK_DIVISOR_26M = 65, - CLOCK_DIVISOR_28M = 61 -}; - -enum -{ - CMD_MSHON = 0x00, - CMD_SSHON = 0x02, - CMD_SSHOFF = 0x03, - - CMD_SNDON = 0x06, - CMD_SNDOFF = 0x07, - - CMD_CDON = 0x08, - CMD_CDOFF = 0x09, - - // A, B, C do something... - - CMD_SYSRES = 0x0D, - - CMD_CKCHG352 = 0x0E, - CMD_CKCHG320 = 0x0F, - - CMD_INTBACK = 0x10, - CMD_SETTIME = 0x16, - CMD_SETSMEM = 0x17, - - CMD_NMIREQ = 0x18, - CMD_RESENAB = 0x19, - CMD_RESDISA = 0x1A -}; - -static uint8 AreaCode; -static int32 MasterClock; - -static struct -{ - uint64 ClockAccum; - - bool Valid; - - union - { - uint8 raw[7]; - struct - { - uint8 year[2]; // BCD; [0] = xx00, [1] = 00xx - uint8 wday_mon; // 0x0-0x6(upper; 6=Saturday), 0x1-0xC(lower) - uint8 mday; // BCD; 0x01-0x31 - uint8 hour; // BCD; 0x00-0x23 - uint8 minute; // BCD; 0x00-0x59 - uint8 second; // BCD; 0x00-0x59 - }; - }; -} RTC; - -static uint8 SaveMem[4]; - -static uint8 IREG[7]; -static uint8 OREG[0x20]; -static uint8 SR; -static bool SF; - -enum -{ - PMODE_15BYTE = 0, - PMODE_255BYTE = 1, - PMODE_ILL = 2, - PMODE_0BYTE = 3 -}; - -enum -{ - SR_RESB = 0x10, - SR_NPE = 0x20, - SR_PDL = 0x40, -}; - -static bool ResetNMIEnable; - -static bool ResetButtonPhysStatus; -static int32 ResetButtonCount; -static bool ResetPending; -static int32 PendingCommand; -static int32 ExecutingCommand; -static int32 PendingClockDivisor; -static int32 CurrentClockDivisor; - -static bool PendingVB; - -static int32 SubPhase; -static int64 ClockCounter; -static uint32 SMPC_ClockRatio; - -static bool SoundCPUOn; -static bool SlaveSH2On; -static bool CDOn; - -static uint8 BusBuffer; -// -// -static struct -{ - int64 TimeCounter; - int32 StartTime; - int32 OptWaitUntilTime; - int32 OptEatTime; - - int32 OptReadTime; - - uint8 Mode[2]; - bool TimeOptEn; - bool NextContBit; - - uint8 CurPort; - uint8 ID1; - uint8 ID2; - uint8 IDTap; - - uint8 CommMode; - - uint8 OWP; - - uint8 work[8]; - // - // - uint8 TapCounter; - uint8 TapCount; - uint8 ReadCounter; - uint8 ReadCount; - uint8 ReadBuffer[255]; //16]; - uint8 WriteCounter; - uint8 PDCounter; -} JRS; -// -// -static uint8 DataOut[2][2]; -static uint8 DataDir[2][2]; -static bool DirectModeEn[2]; -static bool ExLatchEn[2]; - -static uint8 IOBusState[2]; -static IODevice* IOPorts[2]; - -static struct PossibleDevice -{ - IODevice none; - IODevice_Gamepad gamepad; - IODevice_3DPad threedpad; - IODevice_Mouse mouse; - IODevice_Wheel wheel; - IODevice_Mission mission;//{false}; - IODevice_Mission dualmission;//{true}; - IODevice_Keyboard keyboard; -// IODevice_Keyboard jpkeyboard; - PossibleDevice() - :mission(false), dualmission(true) - { - } -} PossibleDevices[12]; - -static IODevice_Multitap PossibleMultitaps[2]; - -static IODevice_Multitap* SPorts[2]; -static IODevice* VirtualPorts[12]; -static uint8* VirtualPortsDPtr[12]; -static uint8* MiscInputPtr; - -IODevice::IODevice() { } -IODevice::~IODevice() { } -void IODevice::Power(void) { } -void IODevice::UpdateInput(const uint8* data, const int32 time_elapsed) { } -void IODevice::UpdateOutput(uint8* data) { } -uint8 IODevice::UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted) { return smpc_out; } - -// -// - -static bool vb; -static sscpu_timestamp_t lastts; - -static void UpdateIOBus(unsigned port) -{ - IOBusState[port] = IOPorts[port]->UpdateBus((DataOut[port][DirectModeEn[port]] | ~DataDir[port][DirectModeEn[port]]) & 0x7F, DataDir[port][DirectModeEn[port]]); - assert(!(IOBusState[port] & 0x80)); -} - -static void MapPorts(void) -{ - for(unsigned sp = 0, vp = 0; sp < 2; sp++) - { - IODevice* nd; - - if(SPorts[sp]) - { - for(unsigned i = 0; i < 6; i++) - { - IODevice* const tsd = VirtualPorts[vp++]; - - if(SPorts[sp]->GetSubDevice(i) != tsd) - tsd->Power(); - - SPorts[sp]->SetSubDevice(i, tsd); - } - - nd = SPorts[sp]; - } - else - nd = VirtualPorts[vp++]; - - if(IOPorts[sp] != nd) - nd->Power(); - - IOPorts[sp] = nd; - } -} - -void SMPC_SetMultitap(unsigned sport, bool enabled) -{ - assert(sport < 2); - - SPorts[sport] = (enabled ? &PossibleMultitaps[sport] : nullptr); - MapPorts(); -} - -void SMPC_SetInput(unsigned port, const char* type, uint8* ptr) -{ - assert(port < 13); - - if(port == 12) - { - MiscInputPtr = ptr; - return; - } - // - // - // - IODevice* nd = nullptr; - - if(!strcmp(type, "none")) - nd = &PossibleDevices[port].none; - else if(!strcmp(type, "gamepad")) - nd = &PossibleDevices[port].gamepad; - else if(!strcmp(type, "3dpad")) - nd = &PossibleDevices[port].threedpad; - else if(!strcmp(type, "mouse")) - nd = &PossibleDevices[port].mouse; - else if(!strcmp(type, "wheel")) - nd = &PossibleDevices[port].wheel; - else if(!strcmp(type, "mission") || !strcmp(type, "missionwoa")) - nd = &PossibleDevices[port].mission; - else if(!strcmp(type, "dmission") || !strcmp(type, "dmissionwoa")) - nd = &PossibleDevices[port].dualmission; - else if(!strcmp(type, "keyboard")) - nd = &PossibleDevices[port].keyboard; -// else if(!strcmp(type, "jpkeyboard")) -// nd = &PossibleDevices[port].jpkeyboard; - else - abort(); - - VirtualPorts[port] = nd; - VirtualPortsDPtr[port] = ptr; - - MapPorts(); -} - -#if 0 -static void RTC_Reset(void) -{ - - -} -#endif - -/*void SMPC_LoadNV(Stream* s) -{ - RTC.Valid = s->get_u8(); - s->read(RTC.raw, sizeof(RTC.raw)); - s->read(SaveMem, sizeof(SaveMem)); -} - -void SMPC_SaveNV(Stream* s) -{ - s->put_u8(RTC.Valid); - s->write(RTC.raw, sizeof(RTC.raw)); - s->write(SaveMem, sizeof(SaveMem)); -}*/ - -void SMPC_SetRTC(const struct tm* ht, const uint8 lang) -{ - if(!ht) - { - RTC.Valid = false; - RTC.year[0] = 0x19; - RTC.year[1] = 0x93; - RTC.wday_mon = 0x5C; - RTC.mday = 0x31; - RTC.hour = 0x23; - RTC.minute = 0x59; - RTC.second = 0x59; - - for(unsigned i = 0; i < 4; i++) - SaveMem[i] = 0x00; - } - else - { - int year_adj = ht->tm_year; - //if(year_adj >= 100) - // year_adj = 100 + ((year_adj - 100) % 28); - - RTC.Valid = true; //false; - RTC.year[0] = U8_to_BCD(19 + year_adj / 100); - RTC.year[1] = U8_to_BCD(year_adj % 100); - RTC.wday_mon = (std::min(6, ht->tm_wday) << 4) | ((std::min(11, ht->tm_mon) + 1) << 0); - RTC.mday = U8_to_BCD(std::min(31, ht->tm_mday)); - RTC.hour = U8_to_BCD(std::min(23, ht->tm_hour)); - RTC.minute = U8_to_BCD(std::min(59, ht->tm_min)); - RTC.second = U8_to_BCD(std::min(59, ht->tm_sec)); - - //if((SaveMem[3] & 0x0F) <= 0x05 || (SaveMem[3] & 0x0F) == 0xF) - SaveMem[3] = (SaveMem[3] & 0xF0) | lang; - } -} - -void SMPC_Init(const uint8 area_code_arg, const int32 master_clock_arg) -{ - AreaCode = area_code_arg; - MasterClock = master_clock_arg; - - ResetPending = false; - vb = false; - lastts = 0; - - for(unsigned sp = 0; sp < 2; sp++) - SPorts[sp] = nullptr; - - for(unsigned i = 0; i < 12; i++) - { - VirtualPorts[i] = nullptr; - SMPC_SetInput(i, "none", NULL); - } - - SMPC_SetRTC(NULL, 0); -} - -bool SMPC_IsSlaveOn(void) -{ - return SlaveSH2On; -} - -static void SlaveOn(void) -{ - SlaveSH2On = true; - CPU[1].AdjustTS(SH7095_mem_timestamp, true); - CPU[1].Reset(true); - SS_SetEventNT(&events[SS_EVENT_SH2_S_DMA], SH7095_mem_timestamp + 1); -} - -static void SlaveOff(void) -{ - SlaveSH2On = false; - CPU[1].Reset(true); - CPU[1].AdjustTS(0x7FFFFFFF, true); - SS_SetEventNT(&events[SS_EVENT_SH2_S_DMA], SS_EVENT_DISABLED_TS); -} - -static void TurnSoundCPUOn(void) -{ - SOUND_Reset68K(); - SoundCPUOn = true; - SOUND_Set68KActive(true); -} - -static void TurnSoundCPUOff(void) -{ - SOUND_Reset68K(); - SoundCPUOn = false; - SOUND_Set68KActive(false); -} - -void SMPC_Reset(bool powering_up) -{ - SlaveOff(); - TurnSoundCPUOff(); - CDOn = true; // ? false; - - ResetButtonCount = 0; - ResetNMIEnable = false; // or only on powering_up? - - CPU[0].SetNMI(true); - - memset(IREG, 0, sizeof(IREG)); - memset(OREG, 0, sizeof(OREG)); - PendingCommand = -1; - ExecutingCommand = -1; - SF = 0; - - BusBuffer = 0x00; - - for(unsigned port = 0; port < 2; port++) - { - for(unsigned sel = 0; sel < 2; sel++) - { - DataOut[port][sel] = 0; - DataDir[port][sel] = 0; - } - DirectModeEn[port] = false; - ExLatchEn[port] = false; - UpdateIOBus(port); - } - - ResetPending = false; - - PendingClockDivisor = 0; - CurrentClockDivisor = CLOCK_DIVISOR_26M; - - SubPhase = 0; - PendingVB = false; - ClockCounter = 0; - // - memset(&JRS, 0, sizeof(JRS)); -} - -int32 SMPC_StartFrame(EmulateSpecStruct* espec) -{ - if(ResetPending) - SS_Reset(false); - - if(PendingClockDivisor > 0) - { - CurrentClockDivisor = PendingClockDivisor; - PendingClockDivisor = 0; - } - - if(!SlaveSH2On) - CPU[1].AdjustTS(0x7FFFFFFF, true); - - SMPC_ClockRatio = (1ULL << 32) * 4000000 * CurrentClockDivisor / MasterClock; - SOUND_SetClockRatio((1ULL << 32) * 11289600 * CurrentClockDivisor / MasterClock); - CDB_SetClockRatio((1ULL << 32) * 11289600 * CurrentClockDivisor / MasterClock); - - return CurrentClockDivisor; -} - -void SMPC_UpdateOutput(void) -{ - for(unsigned vp = 0; vp < 12; vp++) - { - VirtualPorts[vp]->UpdateOutput(VirtualPortsDPtr[vp]); - } -} - -void SMPC_UpdateInput(const int32 time_elapsed) -{ - //printf("%8d\n", time_elapsed); - - ResetButtonPhysStatus = (bool)(*MiscInputPtr & 0x1); - for(unsigned vp = 0; vp < 12; vp++) - { - VirtualPorts[vp]->UpdateInput(VirtualPortsDPtr[vp], time_elapsed); - } -} - - -void SMPC_Write(const sscpu_timestamp_t timestamp, uint8 A, uint8 V) -{ - BusBuffer = V; - A &= 0x3F; - - SS_DBGTI(SS_DBG_SMPC_REGW, "[SMPC] Write to 0x%02x:0x%02x", A, V); - - // - // Call VDP2::Update() to prevent out-of-temporal-order calls to SMPC_Update() from here and the event system. - // - SS_SetEventNT(&events[SS_EVENT_VDP2], VDP2::Update(timestamp)); // TODO: conditionalize so we don't consume so much CPU time if a game writes continuously to SMPC ports - sscpu_timestamp_t nt = SMPC_Update(timestamp); - switch(A) - { - case 0x00: - case 0x01: - case 0x02: - case 0x03: - case 0x04: - case 0x05: - case 0x06: - if(MDFN_UNLIKELY(ExecutingCommand >= 0)) - { - SS_DBGTI(SS_DBG_WARNING | SS_DBG_SMPC, "[SMPC] Input register %u port written with 0x%02x while command 0x%02x is executing.", A, V, ExecutingCommand); - } - - IREG[A] = V; - break; - - case 0x0F: - if(MDFN_UNLIKELY(ExecutingCommand >= 0)) - { - SS_DBGTI(SS_DBG_WARNING | SS_DBG_SMPC, "[SMPC] Command port written with 0x%02x while command 0x%02x is still executing.", V, ExecutingCommand); - } - - if(MDFN_UNLIKELY(PendingCommand >= 0)) - { - SS_DBGTI(SS_DBG_WARNING | SS_DBG_SMPC, "[SMPC] Command port written with 0x%02x while command 0x%02x is still pending.", V, PendingCommand); - } - - PendingCommand = V; - break; - - case 0x31: - if(MDFN_UNLIKELY(SF)) - { - SS_DBGTI(SS_DBG_WARNING | SS_DBG_SMPC, "[SMPC] SF port written while SF is 1."); - } - - SF = true; - break; - - // - // - // - case 0x3A: - DataOut[0][1] = V & 0x7F; - UpdateIOBus(0); - break; - - case 0x3B: - DataOut[1][1] = V & 0x7F; - UpdateIOBus(1); - break; - - case 0x3C: - DataDir[0][1] = V & 0x7F; - UpdateIOBus(0); - break; - - case 0x3D: - DataDir[1][1] = V & 0x7F; - UpdateIOBus(1); - break; - - case 0x3E: - DirectModeEn[0] = (bool)(V & 0x1); - UpdateIOBus(0); - - DirectModeEn[1] = (bool)(V & 0x2); - UpdateIOBus(1); - break; - - case 0x3F: - ExLatchEn[0] = (bool)(V & 0x1); - ExLatchEn[1] = (bool)(V & 0x2); - break; - - default: - SS_DBG(SS_DBG_WARNING | SS_DBG_SMPC, "[SMPC] Unknown write of 0x%02x to 0x%02x\n", V, A); - break; - - } - - if(PendingCommand >= 0) - nt = timestamp + 1; - - SS_SetEventNT(&events[SS_EVENT_SMPC], nt); -} - -uint8 SMPC_Read(const sscpu_timestamp_t timestamp, uint8 A) -{ - uint8 ret = BusBuffer; - - A &= 0x3F; - - switch(A) - { - default: - SS_DBG(SS_DBG_WARNING | SS_DBG_SMPC, "[SMPC] Unknown read from 0x%02x\n", A); - break; - - case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17: - case 0x18: case 0x19: case 0x1A: case 0x1B: case 0x1C: case 0x1D: case 0x1E: case 0x1F: - case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27: - case 0x28: case 0x29: case 0x2A: case 0x2B: case 0x2C: case 0x2D: case 0x2E: case 0x2F: - if(MDFN_UNLIKELY(ExecutingCommand >= 0)) - { - //SS_DBG(SS_DBG_WARNING | SS_DBG_SMPC, "[SMPC] Output register %u port read while command 0x%02x is executing.\n", A - 0x10, ExecutingCommand); - } - - ret = (OREG - 0x10)[A]; - break; - - case 0x30: - if(MDFN_UNLIKELY(ExecutingCommand >= 0)) - { - //SS_DBG(SS_DBG_WARNING | SS_DBG_SMPC, "[SMPC] SR port read while command 0x%02x is executing.\n", ExecutingCommand); - } - - ret = SR; - break; - - case 0x31: - ret &= ~0x01; - ret |= SF; - break; - - case 0x3A: - ret = (ret & 0x80) | IOBusState[0]; - break; - - case 0x3B: - ret = (ret & 0x80) | IOBusState[1]; - break; - - } - - return ret; -} - -void SMPC_ResetTS(void) -{ - lastts = 0; -} - -#define SMPC_WAIT_UNTIL_COND(cond) { \ - case __COUNTER__: \ - ClockCounter = 0; /* before if(), not after, otherwise the variable will overflow eventually. */ \ - if(!(cond)) \ - { \ - SubPhase = __COUNTER__ - SubPhaseBias - 1; \ - return timestamp + 1000; \ - } \ - } - -#define SMPC_WAIT_UNTIL_COND_TIMEOUT(cond, n) \ - { \ - ClockCounter -= (int64)(n) << 32; \ - case __COUNTER__: \ - if(!(cond) && ClockCounter < 0) \ - { \ - SubPhase = __COUNTER__ - SubPhaseBias - 1; \ - return timestamp + (-ClockCounter + SMPC_ClockRatio - 1) / SMPC_ClockRatio; \ - } \ - ClockCounter = 0; \ - } - -#define SMPC_EAT_CLOCKS(n) \ - { \ - ClockCounter -= (int64)(n) << 32; \ - case __COUNTER__: \ - if(ClockCounter < 0) \ - { \ - SubPhase = __COUNTER__ - SubPhaseBias - 1; \ - return timestamp + (-ClockCounter + SMPC_ClockRatio - 1) / SMPC_ClockRatio; \ - } \ - /*printf("%f\n", (double)ClockCounter / (1LL << 32));*/ \ - } \ - - -static unsigned RTC_BCDInc(uint8 v) -{ - unsigned tmp = v & 0xF; - - tmp++; - - if(tmp >= 0xA) - tmp += 0x06; - - tmp += v & 0xF0; - - if(tmp >= 0xA0) - tmp += 0x60; - - return tmp; -} - -static void RTC_IncTime(void) -{ - // Seconds - if(RTC.second == 0x59) - { - RTC.second = 0x00; - - // Minutes - if(RTC.minute == 0x59) - { - RTC.minute = 0x00; - - // Hours - if(RTC.hour == 0x23) - { - RTC.hour = 0x00; - - // Day of week - if(RTC.wday_mon >= 0x60) - RTC.wday_mon &= 0x0F; - else - RTC.wday_mon += 0x10; - - // - static const uint8 mdtab[0x10] = { - // Jan, Feb, Mar, Apr, May, June, July, Aug, Sept, Oct, Nov, Dec - 0x10, 0x31, 0x28, 0x31, 0x30, 0x31, 0x30, 0x31, 0x31, 0x30, 0x31, 0x30, 0x31, 0xC1, 0xF5, 0xFF - }; - const uint8 day_compare = mdtab[RTC.wday_mon & 0x0F] + ((RTC.wday_mon & 0x0F) == 0x02 && ((RTC.year[1] & 0x1F) < 0x1A) && !((RTC.year[1] + ((RTC.year[1] & 0x10) >> 3)) & 0x3)); - - // Day of month - if(RTC.mday >= day_compare) - { - RTC.mday = 0x01; - - // Month of year - if((RTC.wday_mon & 0x0F) == 0x0C) - { - RTC.wday_mon &= 0xF0; - RTC.wday_mon |= 0x01; - - // Year - unsigned tmp = RTC_BCDInc(RTC.year[1]); - RTC.year[1] = tmp; - - if(tmp >= 0x100) - RTC.year[0] = RTC_BCDInc(RTC.year[0]); - } - else - RTC.wday_mon++; - } - else - RTC.mday = RTC_BCDInc(RTC.mday); - } - else - RTC.hour = RTC_BCDInc(RTC.hour); - } - else - RTC.minute = RTC_BCDInc(RTC.minute); - } - else - RTC.second = RTC_BCDInc(RTC.second); -} - -enum { SubPhaseBias = __COUNTER__ + 1 }; -sscpu_timestamp_t SMPC_Update(sscpu_timestamp_t timestamp) -{ - int64 clocks; - - if(MDFN_UNLIKELY(timestamp < lastts)) - { - SS_DBG(SS_DBG_WARNING | SS_DBG_SMPC, "[SMPC] [BUG] timestamp(%d) < lastts(%d)\n", timestamp, lastts); - clocks = 0; - } - else - { - clocks = (int64)(timestamp - lastts) * SMPC_ClockRatio; - lastts = timestamp; - } - - ClockCounter += clocks; - RTC.ClockAccum += clocks; - JRS.TimeCounter += clocks; - - switch(SubPhase + SubPhaseBias) - { - for(;;) - { - default: - case __COUNTER__: - - SMPC_WAIT_UNTIL_COND(PendingCommand >= 0 || PendingVB); - - if(PendingVB && PendingCommand < 0) - { - PendingVB = false; - - if(JRS.OptReadTime) - JRS.OptWaitUntilTime = std::max(0, (JRS.TimeCounter >> 32) - JRS.OptReadTime - 5000); - else - JRS.OptWaitUntilTime = 0; - JRS.TimeCounter = 0; - SMPC_EAT_CLOCKS(234); - - SR &= ~SR_RESB; - if(ResetButtonPhysStatus) // FIXME: Semantics may not be right in regards to CMD_RESENAB timing. - { - SR |= SR_RESB; - if(ResetButtonCount >= 0) - { - ResetButtonCount++; - - if(ResetButtonCount >= 3) - { - ResetButtonCount = 3; - - if(ResetNMIEnable) - { - CPU[0].SetNMI(false); - CPU[0].SetNMI(true); - - ResetButtonCount = -1; - } - } - } - } - else - ResetButtonCount = 0; - - // - // Do RTC increment here - // - while(MDFN_UNLIKELY(RTC.ClockAccum >= (4000000ULL << 32))) - { - RTC_IncTime(); - RTC.ClockAccum -= (4000000ULL << 32); - } - - continue; - } - - ExecutingCommand = PendingCommand; - PendingCommand = -1; - - SMPC_EAT_CLOCKS(92); - if(ExecutingCommand < 0x20) - { - OREG[0x1F] = ExecutingCommand; - - SS_DBGTI(SS_DBG_SMPC, "[SMPC] Command 0x%02x --- 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", ExecutingCommand, IREG[0], IREG[1], IREG[2], IREG[3], IREG[4], IREG[5], IREG[6]); - - if(ExecutingCommand == CMD_MSHON) - { - - } - else if(ExecutingCommand == CMD_SSHON) - { - if(!SlaveSH2On) - SlaveOn(); - } - else if(ExecutingCommand == CMD_SSHOFF) - { - if(SlaveSH2On) - SlaveOff(); - } - else if(ExecutingCommand == CMD_SNDON) - { - if(!SoundCPUOn) - TurnSoundCPUOn(); - } - else if(ExecutingCommand == CMD_SNDOFF) - { - if(SoundCPUOn) - TurnSoundCPUOff(); - } - else if(ExecutingCommand == CMD_CDON) - { - CDOn = true; - } - else if(ExecutingCommand == CMD_CDOFF) - { - CDOn = false; - } - else if(ExecutingCommand == CMD_SYSRES) - { - ResetPending = true; - SMPC_WAIT_UNTIL_COND(!ResetPending); - - // TODO/FIXME(unreachable currently?): - } - else if(ExecutingCommand == CMD_CKCHG352 || ExecutingCommand == CMD_CKCHG320) - { - // Devour some time - - if(SlaveSH2On) - SlaveOff(); - - if(SoundCPUOn) - TurnSoundCPUOff(); - - SOUND_Reset(false); - VDP1::Reset(false); - VDP2::Reset(false); - SCU_Reset(false); - - // Change clock - PendingClockDivisor = (ExecutingCommand == CMD_CKCHG352) ? CLOCK_DIVISOR_28M : CLOCK_DIVISOR_26M; - - // Wait for a few vblanks - SMPC_WAIT_UNTIL_COND(!vb); - SMPC_WAIT_UNTIL_COND(vb); - SMPC_WAIT_UNTIL_COND(!vb); - SMPC_WAIT_UNTIL_COND(vb); - SMPC_WAIT_UNTIL_COND(!vb); - SMPC_WAIT_UNTIL_COND(vb); - - - // - SMPC_WAIT_UNTIL_COND(!PendingClockDivisor); - - // Send NMI to master SH-2 - CPU[0].SetNMI(false); - CPU[0].SetNMI(true); - } - else if(ExecutingCommand == CMD_INTBACK) - { - //SS_DBGTI(SS_DBG_SMPC, "[SMPC] INTBACK IREG0=0x%02x, IREG1=0x%02x, IREG2=0x%02x, %d", IREG[0], IREG[1], IREG[2], vb); - - SR &= ~SR_NPE; - if(IREG[0] & 0xF) - { - SMPC_EAT_CLOCKS(952); - - OREG[0] = (RTC.Valid << 7) | (!ResetNMIEnable << 6); - - for(unsigned i = 0; i < 7; i++) - OREG[1 + i] = RTC.raw[i]; - - OREG[0x8] = 0; // TODO FIXME: Cartridge code? - OREG[0x9] = AreaCode; - OREG[0xA] = 0x24 | - ((CurrentClockDivisor == CLOCK_DIVISOR_28M) << 6) | - (SlaveSH2On << 4) | - (true << 3) | // TODO?: Master NMI - (true << 1) | // TODO?: sysres - (SoundCPUOn << 0); // sndres - - OREG[0xB] = (CDOn << 6) | (1 << 1); // cdres, TODO?: bit1 - - for(unsigned i = 0; i < 4; i++) - OREG[0xC + i] = SaveMem[i]; - - if(IREG[1] & 0x8) - SR |= SR_NPE; - - SR &= ~0x80; - SR |= 0x0F; - - SCU_SetInt(SCU_INT_SMPC, true); - SCU_SetInt(SCU_INT_SMPC, false); - } - - // Wait for !vb, wait until (IREG[0] & 0x80), time-optimization wait. - - if(IREG[1] & 0x8) - { - InputLagged = false; - if (InputCallback) - InputCallback(); - - - #define JR_WAIT(cond) { SMPC_WAIT_UNTIL_COND((cond) || PendingVB); if(PendingVB) { SS_DBGTI(SS_DBG_SMPC, "[SMPC] abortjr wait"); goto AbortJR; } } - #define JR_EAT(n) { SMPC_EAT_CLOCKS(n); if(PendingVB) { SS_DBGTI(SS_DBG_SMPC, "[SMPC] abortjr eat"); goto AbortJR; } } - #define JR_WRNYB(val) \ - { \ - if(!JRS.OWP) \ - { \ - if(JRS.PDCounter > 0) \ - { \ - SR = (SR & ~SR_PDL) | ((JRS.PDCounter < 0x2) ? SR_PDL : 0); \ - SR = (SR & ~0xF) | (JRS.Mode[0] << 0) | (JRS.Mode[1] << 2); \ - SR |= SR_NPE; \ - SR |= 0x80; \ - SCU_SetInt(SCU_INT_SMPC, true); \ - SCU_SetInt(SCU_INT_SMPC, false); \ - JR_WAIT((bool)(IREG[0] & 0x80) == JRS.NextContBit || (IREG[0] & 0x40)); \ - if(IREG[0] & 0x40) \ - { \ - SS_DBGTI(SS_DBG_SMPC, "[SMPC] Big Read Break"); \ - goto AbortJR; \ - } \ - JRS.NextContBit = !JRS.NextContBit; \ - } \ - if(JRS.PDCounter < 0xFF) \ - JRS.PDCounter++; \ - } \ - \ - OREG[(JRS.OWP >> 1)] &= 0x0F << ((JRS.OWP & 1) << 2); \ - OREG[(JRS.OWP >> 1)] |= ((val) & 0xF) << (((JRS.OWP & 1) ^ 1) << 2); \ - JRS.OWP = (JRS.OWP + 1) & 0x3F; \ - } - - #define JR_BS IOBusState[JRS.CurPort] - - #define JR_TH_TR(th, tr) \ - { \ - DataDir[JRS.CurPort][0] = ((th >= 0) << 6) | ((tr >= 0) << 5); \ - DataOut[JRS.CurPort][0] = (DataOut[JRS.CurPort][0] & 0x1F) | (((th) > 0) << 6) | (((tr) > 0) << 5); \ - UpdateIOBus(JRS.CurPort); \ - } - - JR_WAIT(!vb); - JRS.NextContBit = true; - if(SR & SR_NPE) - { - JR_WAIT((bool)(IREG[0] & 0x80) == JRS.NextContBit || (IREG[0] & 0x40)); - if(IREG[0] & 0x40) - { - SS_DBGTI(SS_DBG_SMPC, "[SMPC] Break"); - goto AbortJR; - } - JRS.NextContBit = !JRS.NextContBit; - } - - JRS.PDCounter = 0; - JRS.TimeOptEn = !(IREG[1] & 0x2); - JRS.Mode[0] = (IREG[1] >> 4) & 0x3; - JRS.Mode[1] = (IREG[1] >> 6) & 0x3; - - JRS.OptReadTime = 0; - JRS.OptEatTime = std::max(0, (JRS.OptWaitUntilTime - (JRS.TimeCounter >> 32))); - JRS.OptWaitUntilTime = 0; - - if(JRS.TimeOptEn) - { - SMPC_WAIT_UNTIL_COND_TIMEOUT(PendingVB, JRS.OptEatTime); - if(PendingVB) - { - SS_DBGTI(SS_DBG_SMPC, "[SMPC] abortjr timeopt"); - goto AbortJR; - } - SS_SetEventNT(&events[SS_EVENT_MIDSYNC], timestamp + 1); - } - - JRS.StartTime = JRS.TimeCounter >> 32; - JR_EAT(120); - JRS.OWP = 0; - for(JRS.CurPort = 0; JRS.CurPort < 2; JRS.CurPort++) - { - JR_EAT(380); - - if(JRS.Mode[JRS.CurPort] & 0x2) - continue; - - // TODO: 255-byte read size mode. - - JRS.ID1 = 0; - JR_TH_TR(1, 1); - JR_EAT(50); - JRS.work[0] = JR_BS; - JRS.ID1 |= ((((JRS.work[0] >> 3) | (JRS.work[0] >> 2)) & 1) << 3) | ((((JRS.work[0] >> 1) | (JRS.work[0] >> 0)) & 1) << 2); - - JR_TH_TR(0, 1); - JR_EAT(50); - JRS.work[1] = JR_BS; - JRS.ID1 |= ((((JRS.work[1] >> 3) | (JRS.work[1] >> 2)) & 1) << 1) | ((((JRS.work[1] >> 1) | (JRS.work[1] >> 0)) & 1) << 0); - - //printf("%02x, %02x\n", JRS.work[0], JRS.work[1]); - - if(JRS.ID1 == 0xB) - { - // Saturn digital pad. - JR_TH_TR(1, 0) - JR_EAT(50); - JRS.work[2] = JR_BS; - - JR_TH_TR(0, 0) - JR_EAT(50); - JRS.work[3] = JR_BS; - - JR_EAT(30); - - JR_WRNYB(0xF); // Multitap ID - JR_EAT(21); - - JR_WRNYB(0x1); // Number of connected devices behind multitap - JR_EAT(21); - - JR_WRNYB(0x0); // Peripheral ID-2. - JR_EAT(21); - - JR_WRNYB(0x2); // Data size. - JR_EAT(21); - - JR_WRNYB(JRS.work[1] & 0xF); - JR_EAT(21); - - JR_WRNYB(JRS.work[2] & 0xF); - JR_EAT(21); - - JR_WRNYB(JRS.work[3] & 0xF); - JR_EAT(21); - - JR_WRNYB((JRS.work[0] & 0xF) | 0x7); - JR_EAT(21); - - //JR_EAT(); - - // - // - // - } - else if(JRS.ID1 == 0x3 || JRS.ID1 == 0x5) - { - JR_TH_TR(0, 0) - JR_EAT(50); - JR_WAIT(!(JR_BS & 0x10)); - JRS.ID2 = ((JR_BS & 0xF) << 4); - - JR_TH_TR(0, 1) - JR_EAT(50); - JR_WAIT(JR_BS & 0x10); - JRS.ID2 |= ((JR_BS & 0xF) << 0); - - //printf("%d, %02x %02x\n", JRS.CurPort, JRS.ID1, JRS.ID2); - - if(JRS.ID1 == 0x3) - JRS.ID2 = 0xE3; - - if((JRS.ID2 & 0xF0) == 0x40) // Multitap - { - JR_TH_TR(0, 0) - JR_EAT(50); - JR_WAIT(!(JR_BS & 0x10)); - JRS.IDTap = ((JRS.ID2 & 0xF) << 4) | (JR_BS & 0xF); - - JR_TH_TR(0, 1) - JR_EAT(50); - JR_WAIT(JR_BS & 0x10); - } - else - JRS.IDTap = 0xF1; - - JRS.TapCounter = 0; - JRS.TapCount = (JRS.IDTap & 0xF); - while(JRS.TapCounter < JRS.TapCount) - { - if(JRS.TapCount > 1) - { - JR_TH_TR(0, 0) - JR_EAT(50); - JR_WAIT(!(JR_BS & 0x10)); - JRS.ID2 = ((JR_BS & 0xF) << 4); - - JR_TH_TR(0, 1) - JR_EAT(50); - JR_WAIT(JR_BS & 0x10); - JRS.ID2 |= ((JR_BS & 0xF) << 0); - } - JRS.ReadCounter = 0; - JRS.ReadCount = ((JRS.ID2 & 0xF0) == 0xF0) ? 0 : (JRS.ID2 & 0xF); - while(JRS.ReadCounter < JRS.ReadCount) - { - JR_TH_TR(0, 0) - JR_EAT(50); - JR_WAIT(!(JR_BS & 0x10)); - JRS.ReadBuffer[JRS.ReadCounter] = ((JR_BS & 0xF) << 4); - - JR_TH_TR(0, 1) - JR_EAT(50); - JR_WAIT(JR_BS & 0x10); - JRS.ReadBuffer[JRS.ReadCounter] |= ((JR_BS & 0xF) << 0); - JRS.ReadCounter++; - } - - if(!JRS.TapCounter) - { - JR_WRNYB(JRS.IDTap >> 4); - JR_EAT(21); - - JR_WRNYB(JRS.IDTap >> 0); - JR_EAT(21); - } - - //printf("What: %d, %02x\n", JRS.TapCounter, JRS.ID2); - - JR_WRNYB(JRS.ID2 >> 4); - JR_EAT(21); - - JR_WRNYB(JRS.ID2 >> 0); - JR_EAT(21); - - JRS.WriteCounter = 0; - while(JRS.WriteCounter < JRS.ReadCounter) - { - JR_WRNYB(JRS.ReadBuffer[JRS.WriteCounter] >> 4); - JR_EAT(21); - - JR_WRNYB(JRS.ReadBuffer[JRS.WriteCounter] >> 0); - JR_EAT(21); - - JRS.WriteCounter++; - } - JRS.TapCounter++; - } - // Saturn analog joystick, keyboard, multitap - // OREG[0x0] = 0xF1; // Upper nybble, multitap ID. Lower nybble, number of connected devices behind multitap. - // OREG[0x1] = 0x02; // Upper nybble, peripheral ID 2. Lower nybble, data size. - } - else - { - JR_WRNYB(0xF); - JR_WRNYB(0x0); - } - JR_EAT(26); - JR_TH_TR(-1, -1); - } - - SR = (SR & ~SR_NPE); - SR = (SR & ~0xF) | (JRS.Mode[0] << 0) | (JRS.Mode[1] << 2); - SR = (SR & ~SR_PDL) | ((JRS.PDCounter < 0x2) ? SR_PDL : 0); - SR |= 0x80; - SCU_SetInt(SCU_INT_SMPC, true); - SCU_SetInt(SCU_INT_SMPC, false); - - if(JRS.TimeOptEn) - JRS.OptReadTime = std::max(0, (JRS.TimeCounter >> 32) - JRS.StartTime); - } - AbortJR:; - // TODO: Set TH TR to inputs on abort. - } - else if(ExecutingCommand == CMD_SETTIME) // Warning: Execute RTC setting atomically(all values or none) in regards to emulator exit/power toggle. - { - SMPC_EAT_CLOCKS(380); - - RTC.ClockAccum = 0; // settime resets sub-second count. - RTC.Valid = true; - - for(unsigned i = 0; i < 7; i++) - RTC.raw[i] = IREG[i]; - } - else if(ExecutingCommand == CMD_SETSMEM) // Warning: Execute save mem setting(all values or none) atomically in regards to emulator exit/power toggle. - { - SMPC_EAT_CLOCKS(234); - - for(unsigned i = 0; i < 4; i++) - SaveMem[i] = IREG[i]; - } - else if(ExecutingCommand == CMD_NMIREQ) - { - CPU[0].SetNMI(false); - CPU[0].SetNMI(true); - } - else if(ExecutingCommand == CMD_RESENAB) - { - ResetNMIEnable = true; - } - else if(ExecutingCommand == CMD_RESDISA) - { - ResetNMIEnable = false; - } - } - - ExecutingCommand = -1; - SF = false; - continue; - } - } -} - -void SMPC_SetVB(sscpu_timestamp_t event_timestamp, bool vb_status) -{ - if(vb ^ vb_status) - { - if(vb_status) // Going into vblank - PendingVB = true; - - SS_SetEventNT(&events[SS_EVENT_SMPC], event_timestamp + 1); - } - - vb = vb_status; -} - -/*static const std::vector InputDeviceInfoSSVPort = -{ - // None - { - "none", - "none", - NULL, - IDII_Empty - }, - - // Digital Gamepad - { - "gamepad", - "Digital Gamepad", - "Standard Saturn digital gamepad.", - IODevice_Gamepad_IDII - }, - - // 3D Gamepad - { - "3dpad", - "3D Control Pad", - "3D Control Pad", - IODevice_3DPad_IDII - }, - - // Mouse - { - "mouse", - "Mouse", - "Mouse", - IODevice_Mouse_IDII - }, - - // Steering Wheel - { - "wheel", - "Steering Wheel", - "Arcade Racer/Racing Controller", - IODevice_Wheel_IDII - }, - - // Mission Stick - { - "mission", - "Mission Stick", - "Mission Stick", - IODevice_Mission_IDII - }, -#if 0 - // Mission Stick (No Autofire) - { - "missionwoa", - "Mission (No AF)", - "Mission Stick, without autofire functionality(for less things to map).", - IODevice_MissionNoAF_IDII - }, -#endif - // Dual Mission Stick - { - "dmission", - "Dual Mission", - "Dual Mission Sticks, useful for \"Panzer Dragoon Zwei\". With 30 inputs to map, don't get distracted by..LOOK A LOBSTER!", - IODevice_DualMission_IDII - }, - -#if 0 - // Dual Mission Stick (No Autofire) - { - "dmissionwoa", - "Dual Mission (No AF)", - "Dual Mission Sticks (No Autofire)", - IODevice_DualMissionNoAF_IDII - }, -#endif - - // Keyboard (101-key US) - { - "keyboard", - "Keyboard (US)", - "101-key US keyboard.", - IODevice_Keyboard_US101_IDII, - InputDeviceInfoStruct::FLAG_KEYBOARD - }, - -#if 0 - // Keyboard (Japanese) - { - "jpkeyboard", - "Keyboard (JP)", - "89-key Japanese keyboard.", - IODevice_JPKeyboard_IDII, - InputDeviceInfoStruct::FLAG_KEYBOARD - }, -#endif -}; - -static IDIISG IDII_Builtin = -{ - { "reset", "Reset", -1, IDIT_RESET_BUTTON }, - { "smpc_reset", "SMPC Reset", -1, IDIT_BUTTON }, -}; - -static const std::vector InputDeviceInfoBuiltin = -{ - { - "builtin", - "builtin", - NULL, - IDII_Builtin - } -}; - -const std::vector SMPC_PortInfo = -{ - { "port1", "Virtual Port 1", InputDeviceInfoSSVPort, "gamepad" }, - { "port2", "Virtual Port 2", InputDeviceInfoSSVPort, "gamepad" }, - { "port3", "Virtual Port 3", InputDeviceInfoSSVPort, "gamepad" }, - { "port4", "Virtual Port 4", InputDeviceInfoSSVPort, "gamepad" }, - { "port5", "Virtual Port 5", InputDeviceInfoSSVPort, "gamepad" }, - { "port6", "Virtual Port 6", InputDeviceInfoSSVPort, "gamepad" }, - { "port7", "Virtual Port 7", InputDeviceInfoSSVPort, "gamepad" }, - { "port8", "Virtual Port 8", InputDeviceInfoSSVPort, "gamepad" }, - { "port9", "Virtual Port 9", InputDeviceInfoSSVPort, "gamepad" }, - { "port10", "Virtual Port 10", InputDeviceInfoSSVPort, "gamepad" }, - { "port11", "Virtual Port 11", InputDeviceInfoSSVPort, "gamepad" }, - { "port12", "Virtual Port 12", InputDeviceInfoSSVPort, "gamepad" }, - - { "builtin", "Builtin", InputDeviceInfoBuiltin, "builtin" }, -};*/ - - -} diff --git a/waterbox/ss/smpc.h b/waterbox/ss/smpc.h deleted file mode 100644 index 2076890baa..0000000000 --- a/waterbox/ss/smpc.h +++ /dev/null @@ -1,100 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* smpc.h: -** Copyright (C) 2015-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_SMPC_H -#define __MDFN_SS_SMPC_H - -#include - -namespace MDFN_IEN_SS -{ - -enum -{ - SMPC_AREA_JP = 0x1, - SMPC_AREA_ASIA_NTSC = 0x2, - SMPC_AREA_NA = 0x4, - SMPC_AREA_CSA_NTSC = 0x5, - SMPC_AREA_KR = 0x6, - - SMPC_AREA_ASIA_PAL = 0xA, - SMPC_AREA_EU_PAL = 0xC, - SMPC_AREA_CSA_PAL = 0xD, - // - // - // - SMPC_AREA__PAL_MASK = 0x8 -}; - -enum -{ - SMPC_RTC_LANG_ENGLISH = 0, - SMPC_RTC_LANG_GERMAN = 1, - SMPC_RTC_LANG_FRENCH = 2, - SMPC_RTC_LANG_SPANISH = 3, - SMPC_RTC_LANG_ITALIAN = 4, - SMPC_RTC_LANG_JAPANESE = 5, -}; - -void SMPC_Init(const uint8 area_code, const int32 master_clock) MDFN_COLD; -bool SMPC_IsSlaveOn(void); -void SMPC_Reset(bool powering_up) MDFN_COLD; -//void SMPC_LoadNV(Stream* s) MDFN_COLD; -//void SMPC_SaveNV(Stream* s) MDFN_COLD; - -void SMPC_SetRTC(const struct tm* ht, const uint8 lang) MDFN_COLD; - -void SMPC_Write(const sscpu_timestamp_t timestamp, uint8 A, uint8 V) MDFN_HOT; -uint8 SMPC_Read(const sscpu_timestamp_t timestamp, uint8 A) MDFN_HOT; - -sscpu_timestamp_t SMPC_Update(sscpu_timestamp_t timestamp); -void SMPC_ResetTS(void); - -int32 SMPC_StartFrame(EmulateSpecStruct* espec); -void SMPC_UpdateInput(const int32 time_elapsed); -void SMPC_UpdateOutput(void); -void SMPC_SetInput(unsigned port, const char* type, uint8* ptr) MDFN_COLD; -void SMPC_SetMultitap(unsigned sport, bool enabled) MDFN_COLD; - -void SMPC_SetVB(sscpu_timestamp_t event_timestamp, bool vb_status); - -class IODevice -{ - public: - - IODevice() MDFN_COLD; - virtual ~IODevice() MDFN_COLD; - - virtual void Power(void) MDFN_COLD; - - // - // time_elapsed is emulated time elapsed since last call to UpdateInput(), in microseconds; - // it's mostly for keyboard emulation, to keep the implementation from becoming unnecessarily complex. - // - virtual void UpdateInput(const uint8* data, const int32 time_elapsed); - virtual void UpdateOutput(uint8* data); - virtual uint8 UpdateBus(const uint8 smpc_out, const uint8 smpc_out_asserted); -}; - -//extern const std::vector SMPC_PortInfo; - -} -#endif diff --git a/waterbox/ss/sound.cpp b/waterbox/ss/sound.cpp deleted file mode 100644 index f4a1f9c76d..0000000000 --- a/waterbox/ss/sound.cpp +++ /dev/null @@ -1,358 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* sound.cpp - Sound Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// TODO: Bus between SCU and SCSP looks to be 8-bit, maybe implement that, but -// first test to see how the bus access cycle(s) work with respect to reading from -// registers whose values may change between the individual byte reads. -// (May not be worth emulating if it could possibly trigger problems in games) - -#include "ss.h" -#include "sound.h" -#include "scu.h" -#include "cdb.h" - -#include "m68k/m68k.h" - -namespace MDFN_IEN_SS -{ - -#include "scsp.h" - -static SS_SCSP SCSP; - -static M68K SoundCPU(true); -static int64 run_until_time; // 32.32 -static int32 next_scsp_time; - -static uint32 clock_ratio; -static sscpu_timestamp_t lastts; - -static int16 IBuffer[1024][2]; -static uint32 IBufferCount; -static int last_rate; -static uint32 last_quality; - -static INLINE void SCSP_SoundIntChanged(unsigned level) -{ - SoundCPU.SetIPL(level); -} - -static INLINE void SCSP_MainIntChanged(bool state) -{ -#ifndef MDFN_SSFPLAY_COMPILE - SCU_SetInt(SCU_INT_SCSP, state); -#endif -} - -#include "scsp.inc" - -// -// -template -static MDFN_FASTCALL T SoundCPU_BusRead(uint32 A); - -static MDFN_FASTCALL uint16 SoundCPU_BusReadInstr(uint32 A); - -template -static MDFN_FASTCALL void SoundCPU_BusWrite(uint32 A, T V); - -static MDFN_FASTCALL void SoundCPU_BusRMW(uint32 A, uint8(MDFN_FASTCALL *cb)(M68K *, uint8)); -static MDFN_FASTCALL unsigned SoundCPU_BusIntAck(uint8 level); -static MDFN_FASTCALL void SoundCPU_BusRESET(bool state); -// -// - -void SOUND_Init(void) -{ - memset(IBuffer, 0, sizeof(IBuffer)); - IBufferCount = 0; - - last_rate = -1; - last_quality = ~0U; - - run_until_time = 0; - next_scsp_time = 0; - lastts = 0; - - SoundCPU.BusRead8 = SoundCPU_BusRead; - SoundCPU.BusRead16 = SoundCPU_BusRead; - - SoundCPU.BusWrite8 = SoundCPU_BusWrite; - SoundCPU.BusWrite16 = SoundCPU_BusWrite; - - SoundCPU.BusReadInstr = SoundCPU_BusReadInstr; - - SoundCPU.BusRMW = SoundCPU_BusRMW; - - SoundCPU.BusIntAck = SoundCPU_BusIntAck; - SoundCPU.BusRESET = SoundCPU_BusRESET; - -#ifndef MDFN_SSFPLAY_COMPILE - SoundCPU.DBG_Warning = SS_DBG_Wrap; - SoundCPU.DBG_Verbose = SS_DBG_Wrap; -#endif - - SS_SetPhysMemMap(0x05A00000, 0x05A7FFFF, SCSP.GetRAMPtr(), 0x80000, true); - // TODO: MEM4B: SS_SetPhysMemMap(0x05A00000, 0x05AFFFFF, SCSP.GetRAMPtr(), 0x40000, true); - AddMemoryDomain("Sound Ram", SCSP.GetRAMPtr(), 0x100000, MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); -} - -uint8 SOUND_PeekRAM(uint32 A) -{ - return ne16_rbo_be(SCSP.GetRAMPtr(), A & 0x7FFFF); -} - -void SOUND_PokeRAM(uint32 A, uint8 V) -{ - ne16_wbo_be(SCSP.GetRAMPtr(), A & 0x7FFFF, V); -} - -void SOUND_ResetTS(void) -{ - next_scsp_time -= SoundCPU.timestamp; - run_until_time -= (int64)SoundCPU.timestamp << 32; - SoundCPU.timestamp = 0; - - lastts = 0; -} - -void SOUND_Reset(bool powering_up) -{ - SCSP.Reset(powering_up); - SoundCPU.Reset(powering_up); -} - -void SOUND_Reset68K(void) -{ - SoundCPU.Reset(false); -} - -void SOUND_Set68KActive(bool active) -{ - SoundCPU.SetExtHalted(!active); -} - -uint16 SOUND_Read16(uint32 A) -{ - uint16 ret; - - SCSP.RW(A, ret); - - return ret; -} - -void SOUND_Write8(uint32 A, uint8 V) -{ - SCSP.RW(A, V); -} - -void SOUND_Write16(uint32 A, uint16 V) -{ - SCSP.RW(A, V); -} - -static NO_INLINE void RunSCSP(void) -{ - CDB_GetCDDA(SCSP.GetEXTSPtr()); - // - // - int16 *const bp = IBuffer[IBufferCount]; - SCSP.RunSample(bp); - //bp[0] = rand(); - //bp[1] = rand(); - bp[0] = (bp[0] * 27 + 16) >> 5; - bp[1] = (bp[1] * 27 + 16) >> 5; - - IBufferCount = (IBufferCount + 1) & 1023; - next_scsp_time += 256; -} - -// Ratio between SH-2 clock and 68K clock (sound clock / 2) -void SOUND_SetClockRatio(uint32 ratio) -{ - clock_ratio = ratio; -} - -sscpu_timestamp_t SOUND_Update(sscpu_timestamp_t timestamp) -{ - run_until_time += ((uint64)(timestamp - lastts) * clock_ratio); - lastts = timestamp; - // - // - if (MDFN_LIKELY(SoundCPU.timestamp < (run_until_time >> 32))) - { - do - { - int32 next_time = std::min(next_scsp_time, run_until_time >> 32); - - SoundCPU.Run(next_time); - - if (SoundCPU.timestamp >= next_scsp_time) - RunSCSP(); - } while (MDFN_LIKELY(SoundCPU.timestamp < (run_until_time >> 32))); - } - else - { - while (next_scsp_time < (run_until_time >> 32)) - RunSCSP(); - } - - return timestamp + 128; // FIXME -} - -void SOUND_StartFrame(double rate, uint32 quality) -{ - if ((int)rate != last_rate || quality != last_quality) - { - int err = 0; - last_rate = (int)rate; - last_quality = quality; - } -} - -int32 SOUND_FlushOutput(int16 *SoundBuf, const int32 SoundBufMaxSize, const bool reverse) -{ - if (SoundBuf && reverse) - { - for (unsigned lr = 0; lr < 2; lr++) - { - int16 *p0 = &IBuffer[0][lr]; - int16 *p1 = &IBuffer[IBufferCount - 1][lr]; - unsigned count = IBufferCount >> 1; - - while (MDFN_LIKELY(count--)) - { - std::swap(*p0, *p1); - - p0 += 2; - p1 -= 2; - } - } - } - - if (last_rate == 44100) - { - int32 ret = IBufferCount; - - memcpy(SoundBuf, IBuffer, IBufferCount * 2 * sizeof(int16)); - IBufferCount = 0; - - return (ret); - } - else - { - IBufferCount = 0; - return 0; - } -} - -// -// -// TODO: test masks. -// -template -static MDFN_FASTCALL T SoundCPU_BusRead(uint32 A) -{ - T ret; - - SoundCPU.timestamp += 4; - - if (MDFN_UNLIKELY(SoundCPU.timestamp >= next_scsp_time)) - RunSCSP(); - - SCSP.RW(A & 0x1FFFFF, ret); - - SoundCPU.timestamp += 2; - - return ret; -} - -static MDFN_FASTCALL uint16 SoundCPU_BusReadInstr(uint32 A) -{ - uint16 ret; - - SoundCPU.timestamp += 4; - - //if(MDFN_UNLIKELY(SoundCPU.timestamp >= next_scsp_time)) - // RunSCSP(); - - SCSP.RW(A & 0x1FFFFF, ret); - - SoundCPU.timestamp += 2; - - return ret; -} - -template -static MDFN_FASTCALL void SoundCPU_BusWrite(uint32 A, T V) -{ - if (MDFN_UNLIKELY(SoundCPU.timestamp >= next_scsp_time)) - RunSCSP(); - - SoundCPU.timestamp += 2; - SCSP.RW(A & 0x1FFFFF, V); - SoundCPU.timestamp += 2; -} - -static MDFN_FASTCALL void SoundCPU_BusRMW(uint32 A, uint8(MDFN_FASTCALL *cb)(M68K *, uint8)) -{ - uint8 tmp; - - SoundCPU.timestamp += 4; - - if (MDFN_UNLIKELY(SoundCPU.timestamp >= next_scsp_time)) - RunSCSP(); - - SCSP.RW(A & 0x1FFFFF, tmp); - - tmp = cb(&SoundCPU, tmp); - - SoundCPU.timestamp += 6; - - SCSP.RW(A & 0x1FFFFF, tmp); - - SoundCPU.timestamp += 2; -} - -static MDFN_FASTCALL unsigned SoundCPU_BusIntAck(uint8 level) -{ - return M68K::BUS_INT_ACK_AUTO; -} - -static MDFN_FASTCALL void SoundCPU_BusRESET(bool state) -{ - //SS_DBG(SS_DBG_WARNING, "[M68K] RESET: %d @ time %d\n", state, SoundCPU.timestamp); - if (state) - { - SoundCPU.Reset(false); - } -} - -uint32 SOUND_GetSCSPRegister(const unsigned id, char *const special, const uint32 special_len) -{ - return SCSP.GetRegister(id, special, special_len); -} - -void SOUND_SetSCSPRegister(const unsigned id, const uint32 value) -{ - SCSP.SetRegister(id, value); -} -} diff --git a/waterbox/ss/sound.h b/waterbox/ss/sound.h deleted file mode 100644 index 4d0a08b54f..0000000000 --- a/waterbox/ss/sound.h +++ /dev/null @@ -1,52 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* sound.h: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_SOUND_H -#define __MDFN_SS_SOUND_H - -namespace MDFN_IEN_SS -{ - -void SOUND_Init(void) MDFN_COLD; -void SOUND_Reset(bool powering_up) MDFN_COLD; - -void SOUND_Set68KActive(bool active); -void SOUND_Reset68K(void); - -void SOUND_SetClockRatio(uint32 ratio); // Ratio between SH-2 clock and 68K clock (sound clock / 2) -sscpu_timestamp_t SOUND_Update(sscpu_timestamp_t timestamp); -void SOUND_ResetTS(void); -void SOUND_StartFrame(double rate, uint32 quality); -int32 SOUND_FlushOutput(int16* SoundBuf, const int32 SoundBufMaxSize, const bool reverse); - -uint16 SOUND_Read16(uint32 A); -void SOUND_Write8(uint32 A, uint8 V); -void SOUND_Write16(uint32 A, uint16 V); - -uint8 SOUND_PeekRAM(uint32 A); -void SOUND_PokeRAM(uint32 A, uint8 V); - -uint32 SOUND_GetSCSPRegister(const unsigned id, char* const special, const uint32 special_len) MDFN_COLD; -void SOUND_SetSCSPRegister(const unsigned id, const uint32 value) MDFN_COLD; - -} - -#endif diff --git a/waterbox/ss/ss.cpp b/waterbox/ss/ss.cpp deleted file mode 100644 index 762dffffac..0000000000 --- a/waterbox/ss/ss.cpp +++ /dev/null @@ -1,1287 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* ss.cpp - Saturn Core Emulation and Support Functions -** Copyright (C) 2015-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// WARNING: Be careful with 32-bit access to 16-bit space, bus locking, etc. in respect to DMA and event updates(and where they can occur). - -#include - -#include - -#include "ss.h" -#include "cdrom/cdromif.h" -#include "sound.h" -#include "scsp.h" // For debug.inc -#include "smpc.h" -#include "cdb.h" -#include "vdp1.h" -#include "vdp2.h" -#include "scu.h" -#include "cart.h" -#include "db.h" - -namespace MDFN_IEN_SS -{ - -static sscpu_timestamp_t MidSync(const sscpu_timestamp_t timestamp); - -#ifdef MDFN_SS_DEV_BUILD -uint32 ss_dbg_mask; -#endif -static const uint8 BRAM_Init_Data[0x10] = {0x42, 0x61, 0x63, 0x6b, 0x55, 0x70, 0x52, 0x61, 0x6d, 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74}; - -static void SaveBackupRAM(void); -static void LoadBackupRAM(void); -static void SaveCartNV(void); -static void LoadCartNV(void); -static void SaveRTC(void); -static void LoadRTC(void); - -static MDFN_COLD void BackupBackupRAM(void); -static MDFN_COLD void BackupCartNV(void); - -#include "sh7095.h" - -static uint8 SCU_MSH2VectorFetch(void); -static uint8 SCU_SSH2VectorFetch(void); - -static void INLINE MDFN_HOT CheckEventsByMemTS(void); - -SH7095 CPU[2]{{"SH2-M", SS_EVENT_SH2_M_DMA, SCU_MSH2VectorFetch}, {"SH2-S", SS_EVENT_SH2_S_DMA, SCU_SSH2VectorFetch}}; -static uint16 *BIOSROM; -static uint16 WorkRAML[1024 * 1024 / sizeof(uint16)]; -static uint16 WorkRAMH[1024 * 1024 / sizeof(uint16)]; // Effectively 32-bit in reality, but 16-bit here because of CPU interpreter design(regarding fastmap). -static uint8 BackupRAM[32768]; -static bool BackupRAM_Dirty; - -static int64 EmulatedSS_MasterClock; - -#define SH7095_EXT_MAP_GRAN_BITS 16 -static uintptr_t SH7095_FastMap[1U << (32 - SH7095_EXT_MAP_GRAN_BITS)]; - -int32 SH7095_mem_timestamp; -uint32 SH7095_BusLock; -#include "scu.inc" - -#include "debug.inc" - -//static sha256_digest BIOS_SHA256; // SHA-256 hash of the currently-loaded BIOS; used for save state sanity checks. -static std::vector *cdifs = NULL; -static std::bitset<1U << (27 - SH7095_EXT_MAP_GRAN_BITS)> FMIsWriteable; - -template -static void INLINE SH7095_BusWrite(uint32 A, T V, const bool BurstHax, int32 *SH2DMAHax); - -template -static T INLINE SH7095_BusRead(uint32 A, const bool BurstHax, int32 *SH2DMAHax); - -static int32 ExtBusCounter[2]; -static size_t ExtBusWhich; - -// SH-2 region -// 0: 0x00000000-0x01FFFFFF -// 1: 0x02000000-0x03FFFFFF -// 2: 0x04000000-0x05FFFFFF -// 3: 0x06000000-0x07FFFFFF -// -// Never add anything to SH7095_mem_timestamp when DMAHax is true. -// -// When BurstHax is true and we're accessing high work RAM, don't add anything. -// -template -static INLINE void BusRW(uint32 A, T &V, const bool BurstHax, int32 *SH2DMAHax) -{ - if (!BurstHax && !SH2DMAHax) - ExtBusCounter[ExtBusWhich]++; - - // - // High work RAM - // - if (A >= 0x06000000 && A <= 0x07FFFFFF) - { - ne16_rwbo_be(WorkRAMH, A & 0xFFFFF, &V); - - if (!BurstHax) - { - if (!SH2DMAHax) - { - if (IsWrite) - { - SH7095_mem_timestamp = (SH7095_mem_timestamp + 4) & ~3; - } - else - { - SH7095_mem_timestamp += 7; - } - } - else - *SH2DMAHax -= IsWrite ? 3 : 6; - } - - return; - } - - // - // - // SH-2 region 0 - // - // Note: 0x00400000 - 0x01FFFFFF: Open bus for accesses to 0x00000000-0x01FFFFFF(SH-2 area 0) - // - if (A < 0x02000000) - { - if (sizeof(T) == 4) - { - if (IsWrite) - { - uint16 tmp; - - tmp = V >> 16; - BusRW(A, tmp, BurstHax, SH2DMAHax); - - tmp = V >> 0; - BusRW(A | 2, tmp, BurstHax, SH2DMAHax); - } - else - { - uint16 tmp = 0; - - BusRW(A | 2, tmp, BurstHax, SH2DMAHax); - V = tmp << 0; - - BusRW(A, tmp, BurstHax, SH2DMAHax); - V |= tmp << 16; - } - - return; - } - - // - // Low(and kinda slow) work RAM - // - if (A >= 0x00200000 && A <= 0x003FFFFF) - { - ne16_rwbo_be(WorkRAML, A & 0xFFFFF, &V); - - if (!SH2DMAHax) - SH7095_mem_timestamp += 7; - else - *SH2DMAHax -= 7; - - return; - } - - // - // BIOS ROM - // - if (A >= 0x00000000 && A <= 0x000FFFFF) - { - if (!SH2DMAHax) - SH7095_mem_timestamp += 8; - else - *SH2DMAHax -= 8; - - if (!IsWrite) - V = ne16_rbo_be(BIOSROM, A & 0x7FFFF); - - return; - } - - // - // SMPC - // - if (A >= 0x00100000 && A <= 0x0017FFFF) - { - const uint32 SMPC_A = (A & 0x7F) >> 1; - - if (!SH2DMAHax) - { - // SH7095_mem_timestamp += 2; - CheckEventsByMemTS(); - } - - if (IsWrite) - { - if (sizeof(T) == 2 || (A & 1)) - SMPC_Write(SH7095_mem_timestamp, SMPC_A, V); - } - else - { - if (sizeof(T) == 2) - V = 0xFF00 | SMPC_Read(SH7095_mem_timestamp, SMPC_A); - else if (sizeof(T) == 1 && (A & 1)) - V = SMPC_Read(SH7095_mem_timestamp, SMPC_A); - else - V = 0xFF; - } - - return; - } - - // - // Backup RAM - // - if (A >= 0x00180000 && A <= 0x001FFFFF) - { - if (!SH2DMAHax) - SH7095_mem_timestamp += 8; - else - *SH2DMAHax -= 8; - - if (IsWrite) - { - if (sizeof(T) != 1 || (A & 1)) - { - BackupRAM[(A >> 1) & 0x7FFF] = V; - BackupRAM_Dirty = true; - } - } - else - V = ((BackupRAM[(A >> 1) & 0x7FFF] << 0) | (0xFF << 8)) >> (((A & 1) ^ (sizeof(T) & 1)) << 3); - - return; - } - - // - // FRT trigger region - // - if (A >= 0x01000000 && A <= 0x01FFFFFF) - { - if (!SH2DMAHax) - SH7095_mem_timestamp += 8; - else - *SH2DMAHax -= 8; - - //printf("FT FRT%08x %zu %08x %04x %d %d\n", A, sizeof(T), A, V, SMPC_IsSlaveOn(), SH7095_mem_timestamp); - - if (IsWrite) - { - if (sizeof(T) != 1) - { - const unsigned c = ((A >> 23) & 1) ^ 1; - - if (!c || SMPC_IsSlaveOn()) - { - CPU[c].SetFTI(true); - CPU[c].SetFTI(false); - } - } - } - return; - } - - // - // - // - if (!SH2DMAHax) - SH7095_mem_timestamp += 4; - else - *SH2DMAHax -= 4; - - if (IsWrite) - SS_DBG(SS_DBG_WARNING, "[SH2 BUS] Unknown %zu-byte write of 0x%08x to 0x%08x\n", sizeof(T), V, A); - else - { - SS_DBG(SS_DBG_WARNING, "[SH2 BUS] Unknown %zu-byte read from 0x%08x\n", sizeof(T), A); - - V = 0; - } - - return; - } - - // - // SCU - // - { - uint32 DB; - - if (IsWrite) - DB = V << (((A & 3) ^ (4 - sizeof(T))) << 3); - else - DB = 0; - - SCU_FromSH2_BusRW_DB(A, &DB, SH2DMAHax); - - if (!IsWrite) - V = DB >> (((A & 3) ^ (4 - sizeof(T))) << 3); - } -} - -template -static void INLINE SH7095_BusWrite(uint32 A, T V, const bool BurstHax, int32 *SH2DMAHax) -{ - BusRW(A, V, BurstHax, SH2DMAHax); -} - -template -static T INLINE SH7095_BusRead(uint32 A, const bool BurstHax, int32 *SH2DMAHax) -{ - T ret = 0; - - BusRW(A, ret, BurstHax, SH2DMAHax); - - return ret; -} - -// -// -// -static MDFN_COLD uint8 CheatMemRead(uint32 A) -{ - A &= (1U << 27) - 1; - -#ifdef MSB_FIRST - return *(uint8 *)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + (A ^ 0)); -#else - return *(uint8 *)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + (A ^ 1)); -#endif -} - -static MDFN_COLD void CheatMemWrite(uint32 A, uint8 V) -{ - A &= (1U << 27) - 1; - - if (FMIsWriteable[A >> SH7095_EXT_MAP_GRAN_BITS]) - { -#ifdef MSB_FIRST - *(uint8 *)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + (A ^ 0)) = V; -#else - *(uint8 *)(SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] + (A ^ 1)) = V; -#endif - - for (unsigned c = 0; c < 2; c++) - { - if (CPU[c].CCR & SH7095::CCR_CE) - { - for (uint32 Abase = 0x00000000; Abase < 0x20000000; Abase += 0x08000000) - { - CPU[c].Write_UpdateCache(Abase + A, V); - } - } - } - } -} -// -// -// -static void SetFastMemMap(uint32 Astart, uint32 Aend, uint16 *ptr, uint32 length, bool is_writeable) -{ - const uint64 Abound = (uint64)Aend + 1; - assert((Astart & ((1U << SH7095_EXT_MAP_GRAN_BITS) - 1)) == 0); - assert((Abound & ((1U << SH7095_EXT_MAP_GRAN_BITS) - 1)) == 0); - assert((length & ((1U << SH7095_EXT_MAP_GRAN_BITS) - 1)) == 0); - assert(length > 0); - assert(length <= (Abound - Astart)); - - for (uint64 A = Astart; A < Abound; A += (1U << SH7095_EXT_MAP_GRAN_BITS)) - { - uintptr_t tmp = (uintptr_t)ptr + ((A - Astart) % length); - - if (A < (1U << 27)) - FMIsWriteable[A >> SH7095_EXT_MAP_GRAN_BITS] = is_writeable; - - SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] = tmp - A; - } -} - -static uint16 fmap_dummy[(1U << SH7095_EXT_MAP_GRAN_BITS) / sizeof(uint16)]; - -static MDFN_COLD void InitFastMemMap(void) -{ - for (unsigned i = 0; i < sizeof(fmap_dummy) / sizeof(fmap_dummy[0]); i++) - { - fmap_dummy[i] = 0; - } - - FMIsWriteable.reset(); - //MDFNMP_Init(1ULL << SH7095_EXT_MAP_GRAN_BITS, (1ULL << 27) / (1ULL << SH7095_EXT_MAP_GRAN_BITS)); - - for (uint64 A = 0; A < 1ULL << 32; A += (1U << SH7095_EXT_MAP_GRAN_BITS)) - { - SH7095_FastMap[A >> SH7095_EXT_MAP_GRAN_BITS] = (uintptr_t)fmap_dummy - A; - } -} - -void SS_SetPhysMemMap(uint32 Astart, uint32 Aend, uint16 *ptr, uint32 length, bool is_writeable) -{ - assert(Astart < 0x20000000); - assert(Aend < 0x20000000); - - if (!ptr) - { - ptr = fmap_dummy; - length = sizeof(fmap_dummy); - } - - for (uint32 Abase = 0; Abase < 0x40000000; Abase += 0x20000000) - SetFastMemMap(Astart + Abase, Aend + Abase, ptr, length, is_writeable); -} - -#include "sh7095.inc" - -static bool Running; -event_list_entry events[SS_EVENT__COUNT]; -static sscpu_timestamp_t next_event_ts; - -template -static sscpu_timestamp_t SH_DMA_EventHandler(sscpu_timestamp_t et) -{ - if (et < SH7095_mem_timestamp) - { - //printf("SH-2 DMA %d reschedule %d->%d\n", c, et, SH7095_mem_timestamp); - return SH7095_mem_timestamp; - } - - // Must come after the (et < SH7095_mem_timestamp) check. - if (MDFN_UNLIKELY(SH7095_BusLock)) - return et + 1; - - return CPU[c].DMA_Update(et); -} - -// -// -// - -static MDFN_COLD void InitEvents(void) -{ - for (unsigned i = 0; i < SS_EVENT__COUNT; i++) - { - if (i == SS_EVENT__SYNFIRST) - events[i].event_time = 0; - else if (i == SS_EVENT__SYNLAST) - events[i].event_time = 0x7FFFFFFF; - else - events[i].event_time = 0; //SS_EVENT_DISABLED_TS; - - events[i].prev = (i > 0) ? &events[i - 1] : NULL; - events[i].next = (i < (SS_EVENT__COUNT - 1)) ? &events[i + 1] : NULL; - } - - events[SS_EVENT_SH2_M_DMA].event_handler = &SH_DMA_EventHandler<0>; - events[SS_EVENT_SH2_S_DMA].event_handler = &SH_DMA_EventHandler<1>; - - events[SS_EVENT_SCU_DMA].event_handler = SCU_UpdateDMA; - events[SS_EVENT_SCU_DSP].event_handler = SCU_UpdateDSP; - - events[SS_EVENT_SMPC].event_handler = SMPC_Update; - - events[SS_EVENT_VDP1].event_handler = VDP1::Update; - events[SS_EVENT_VDP2].event_handler = VDP2::Update; - - events[SS_EVENT_CDB].event_handler = CDB_Update; - - events[SS_EVENT_SOUND].event_handler = SOUND_Update; - - events[SS_EVENT_CART].event_handler = CART_GetEventHandler(); - - events[SS_EVENT_MIDSYNC].event_handler = MidSync; - events[SS_EVENT_MIDSYNC].event_time = SS_EVENT_DISABLED_TS; -} - -static void RebaseTS(const sscpu_timestamp_t timestamp) -{ - for (unsigned i = 0; i < SS_EVENT__COUNT; i++) - { - if (i == SS_EVENT__SYNFIRST || i == SS_EVENT__SYNLAST) - continue; - - assert(events[i].event_time > timestamp); - - if (events[i].event_time != SS_EVENT_DISABLED_TS) - events[i].event_time -= timestamp; - } - - next_event_ts = events[SS_EVENT__SYNFIRST].next->event_time; -} - -void SS_SetEventNT(event_list_entry *e, const sscpu_timestamp_t next_timestamp) -{ - if (next_timestamp < e->event_time) - { - event_list_entry *fe = e; - - do - { - fe = fe->prev; - } while (next_timestamp < fe->event_time); - - // Remove this event from the list, temporarily of course. - e->prev->next = e->next; - e->next->prev = e->prev; - - // Insert into the list, just after "fe". - e->prev = fe; - e->next = fe->next; - fe->next->prev = e; - fe->next = e; - - e->event_time = next_timestamp; - } - else if (next_timestamp > e->event_time) - { - event_list_entry *fe = e; - - do - { - fe = fe->next; - } while (next_timestamp > fe->event_time); - - // Remove this event from the list, temporarily of course - e->prev->next = e->next; - e->next->prev = e->prev; - - // Insert into the list, just BEFORE "fe". - e->prev = fe->prev; - e->next = fe; - fe->prev->next = e; - fe->prev = e; - - e->event_time = next_timestamp; - } - - next_event_ts = (Running ? events[SS_EVENT__SYNFIRST].next->event_time : 0); -} - -// Called from debug.cpp too. -void ForceEventUpdates(const sscpu_timestamp_t timestamp) -{ - CPU[0].ForceInternalEventUpdates(); - - if (SMPC_IsSlaveOn()) - CPU[1].ForceInternalEventUpdates(); - - for (unsigned evnum = SS_EVENT__SYNFIRST + 1; evnum < SS_EVENT__SYNLAST; evnum++) - { - if (events[evnum].event_time != SS_EVENT_DISABLED_TS) - SS_SetEventNT(&events[evnum], events[evnum].event_handler(timestamp)); - } - - next_event_ts = (Running ? events[SS_EVENT__SYNFIRST].next->event_time : 0); -} - -static INLINE bool EventHandler(const sscpu_timestamp_t timestamp) -{ - event_list_entry *e; - - while (timestamp >= (e = events[SS_EVENT__SYNFIRST].next)->event_time) // If Running = 0, EventHandler() may be called even if there isn't an event per-se, so while() instead of do { ... } while - { -#ifdef MDFN_SS_DEV_BUILD - const sscpu_timestamp_t etime = e->event_time; -#endif - sscpu_timestamp_t nt; - - nt = e->event_handler(e->event_time); - -#ifdef MDFN_SS_DEV_BUILD - if (MDFN_UNLIKELY(nt <= etime)) - { - fprintf(stderr, "which=%d event_time=%d nt=%d timestamp=%d\n", (int)(e - events), etime, nt, timestamp); - assert(nt > etime); - } -#endif - - SS_SetEventNT(e, nt); - } - - return (Running); -} - -static void NO_INLINE MDFN_HOT CheckEventsByMemTS_Sub(void) -{ - EventHandler(SH7095_mem_timestamp); -} - -static void INLINE CheckEventsByMemTS(void) -{ - if (MDFN_UNLIKELY(SH7095_mem_timestamp >= next_event_ts)) - { - //puts("Woot"); - CheckEventsByMemTS_Sub(); - } -} - -void SS_RequestMLExit(void) -{ - Running = 0; - next_event_ts = 0; -} - -#pragma GCC push_options -#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ < 5 -// gcc 5.3.0 and 6.1.0 produce some braindead code for the big switch() statement at -Os. -#pragma GCC optimize("Os,no-unroll-loops,no-peel-loops,no-crossjumping") -#else -#pragma GCC optimize("O2,no-unroll-loops,no-peel-loops,no-crossjumping") -#endif -template -static int32 NO_INLINE MDFN_HOT RunLoop(EmulateSpecStruct *espec) -{ - sscpu_timestamp_t eff_ts = 0; - - //printf("%d %d\n", SH7095_mem_timestamp, CPU[0].timestamp); - - do - { - do - { - ExtBusCounter[0] = ExtBusCounter[1] = 0; - ExtBusWhich = 0; - - if (DebugMode) - DBG_CPUHandler<0>(eff_ts); - - CPU[0].Step<0, DebugMode>(); - - if (CPU[0].DMA_RunCond(0) || CPU[0].DMA_RunCond(1)) - CPU[0].timestamp += ExtBusCounter[0] * 16; - - ExtBusWhich = 1; - while (MDFN_LIKELY(CPU[0].timestamp > CPU[1].timestamp)) - { - if (DebugMode) - DBG_CPUHandler<1>(eff_ts); - - CPU[1].Step<1, DebugMode>(); - } - - eff_ts = CPU[0].timestamp; - if (SH7095_mem_timestamp > eff_ts) - eff_ts = SH7095_mem_timestamp; - else - SH7095_mem_timestamp = eff_ts; - } while (MDFN_LIKELY(eff_ts < next_event_ts)); - } while (MDFN_LIKELY(EventHandler(eff_ts))); - - //printf(" End: %d %d -- %d\n", SH7095_mem_timestamp, CPU[0].timestamp, eff_ts); - return eff_ts; -} -#pragma GCC pop_options - -// Must not be called within an event or read/write handler. -void SS_Reset(bool powering_up) -{ - SH7095_BusLock = 0; - - if (powering_up) - { - memset(WorkRAML, 0x00, sizeof(WorkRAML)); // TODO: Check - memset(WorkRAMH, 0x00, sizeof(WorkRAMH)); // TODO: Check - } - - if (powering_up) - { - CPU[0].TruePowerOn(); - CPU[1].TruePowerOn(); - } - - SCU_Reset(powering_up); - CPU[0].Reset(powering_up); - - SMPC_Reset(powering_up); - - VDP1::Reset(powering_up); - VDP2::Reset(powering_up); - - CDB_Reset(powering_up); - - SOUND_Reset(powering_up); - - CART_Reset(powering_up); -} - -static EmulateSpecStruct *espec; -static int32 cur_clock_div; - -static int64 UpdateInputLastBigTS; -static INLINE void UpdateSMPCInput(const sscpu_timestamp_t timestamp) -{ - int32 elapsed_time = (((int64)timestamp * cur_clock_div * 1000 * 1000) - UpdateInputLastBigTS) / (EmulatedSS_MasterClock / MDFN_MASTERCLOCK_FIXED(1)); - - UpdateInputLastBigTS += (int64)elapsed_time * (EmulatedSS_MasterClock / MDFN_MASTERCLOCK_FIXED(1)); - - SMPC_UpdateInput(elapsed_time); -} - -static sscpu_timestamp_t MidSync(const sscpu_timestamp_t timestamp) -{ - return SS_EVENT_DISABLED_TS; -} - -void Emulate(EmulateSpecStruct *espec_arg) -{ - int32 end_ts; - - espec = espec_arg; - - cur_clock_div = SMPC_StartFrame(espec); - UpdateSMPCInput(0); - VDP2::StartFrame(espec, cur_clock_div == 61); - SOUND_StartFrame(44100, 5); - CART_SetCPUClock(EmulatedSS_MasterClock / MDFN_MASTERCLOCK_FIXED(1), cur_clock_div); - espec->SoundBufSize = 0; - espec->MasterCycles = 0; - // - // - // - Running = true; // Set before ForceEventUpdates() - ForceEventUpdates(0); - -#ifdef WANT_DEBUGGER - if (DBG_NeedCPUHooks()) - end_ts = RunLoop(espec); - else -#endif - end_ts = RunLoop(espec); - - ForceEventUpdates(end_ts); - // - // - // - RebaseTS(end_ts); - - CDB_ResetTS(); - SOUND_ResetTS(); - VDP1::AdjustTS(-end_ts); - VDP2::AdjustTS(-end_ts); - SMPC_ResetTS(); - SCU_AdjustTS(-end_ts); - CART_AdjustTS(-end_ts); - - UpdateInputLastBigTS -= (int64)end_ts * cur_clock_div * 1000 * 1000; - - if (!(SH7095_mem_timestamp & 0x40000000)) // or maybe >= 0 instead? - SH7095_mem_timestamp -= end_ts; - - CPU[0].AdjustTS(-end_ts); - - if (SMPC_IsSlaveOn()) - CPU[1].AdjustTS(-end_ts); - // - // - // - espec->MasterCycles = end_ts * cur_clock_div; - espec->SoundBufSize += SOUND_FlushOutput(espec->SoundBuf + (espec->SoundBufSize * 2), espec->SoundBufMaxSize - espec->SoundBufSize, false); - // - // - // - SMPC_UpdateOutput(); -} - -static INLINE void CalcGameID(uint8 *fd_id_out16, char *sgid) -{ - std::unique_ptr buf(new uint8[2048]); - - for (size_t x = 0; x < cdifs->size(); x++) - { - auto *c = (*cdifs)[x]; - CDUtility::TOC toc; - - c->ReadTOC(&toc); - - for (unsigned i = 0; i < 512; i++) - { - if (c->ReadSector(&buf[0], i, 1, true) >= 0x1) - { - if (i == 0) - { - char *tmp; - memcpy(sgid, &buf[0x20], 16); - sgid[16] = 0; - if ((tmp = strrchr(sgid, 'V'))) - { - do - { - *tmp = 0; - } while (tmp-- != sgid && (signed char)*tmp <= 0x20); - } - } - } - } - } -} - -// -// Remember to rebuild region database in db.cpp if changing the order of entries in this table(and be careful about game id collisions, e.g. with some Korean games). -// -static const struct -{ - const char c; - const char *str; // Community-defined region string that may appear in filename. - unsigned region; -} region_strings[] = - { - // Listed in order of preference for multi-region games. - {'U', "USA", SMPC_AREA_NA}, - {'J', "Japan", SMPC_AREA_JP}, - {'K', "Korea", SMPC_AREA_KR}, - - {'E', "Europe", SMPC_AREA_EU_PAL}, - {'E', "Germany", SMPC_AREA_EU_PAL}, - {'E', "France", SMPC_AREA_EU_PAL}, - {'E', "Spain", SMPC_AREA_EU_PAL}, - - {'B', "Brazil", SMPC_AREA_CSA_NTSC}, - - {'T', nullptr, SMPC_AREA_ASIA_NTSC}, - {'A', nullptr, SMPC_AREA_ASIA_PAL}, - {'L', nullptr, SMPC_AREA_CSA_PAL}, -}; - -static INLINE bool DetectRegion(unsigned *const region) -{ - std::unique_ptr buf(new uint8[2048 * 16]); - uint64 possible_regions = 0; - - for (auto &c : *cdifs) - { - if (c->ReadSector(&buf[0], 0, 16, true) != 0x1) - continue; - - for (unsigned i = 0; i < 16; i++) - { - for (auto const &rs : region_strings) - { - if (rs.c == buf[0x40 + i]) - { - possible_regions |= (uint64)1 << rs.region; - break; - } - } - } - break; - } - - for (auto const &rs : region_strings) - { - if (possible_regions & ((uint64)1 << rs.region)) - { - *region = rs.region; - return true; - } - } - - return false; -} - -extern bool CorrectAspect; -extern bool ShowHOverscan; -extern bool DoHBlend; -extern int LineVisFirst; -extern int LineVisLast; -static bool MDFN_COLD InitCommon(const unsigned cart_type, const unsigned smpc_area) -{ -#ifdef MDFN_SS_DEV_BUILD - ss_dbg_mask = MDFN_GetSettingUI("ss.dbg_mask"); -#endif - // - /*{ - MDFN_printf(_("Region: 0x%01x\n"), smpc_area); - const struct - { - const unsigned type; - const char *name; - } CartNames[] = - { - {CART_NONE, _("None")}, - {CART_BACKUP_MEM, _("Backup Memory")}, - {CART_EXTRAM_1M, _("1MiB Extended RAM")}, - {CART_EXTRAM_4M, _("4MiB Extended RAM")}, - {CART_KOF95, _("King of Fighters '95 ROM")}, - {CART_ULTRAMAN, _("Ultraman ROM")}, - {CART_CS1RAM_16M, _("16MiB CS1 RAM")}, - {CART_NLMODEM, _("Netlink Modem")}, - {CART_MDFN_DEBUG, _("Mednafen Debug")}, - }; - const char *cn = _("Unknown"); - - for (auto const &cne : CartNames) - { - if (cne.type == cart_type) - { - cn = cne.name; - break; - } - } - MDFN_printf(_("Cart: %s\n"), cn); - }*/ - // - - for (unsigned c = 0; c < 2; c++) - { - CPU[c].Init(); - CPU[c].SetMD5((bool)c); - } - - // - // Initialize backup memory. - // - memset(BackupRAM, 0x00, sizeof(BackupRAM)); - for (unsigned i = 0; i < 0x40; i++) - BackupRAM[i] = BRAM_Init_Data[i & 0x0F]; - AddMemoryDomain("Backup Ram", BackupRAM, sizeof(BackupRAM), MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_SAVERAMMABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); - - // Call InitFastMemMap() before functions like SOUND_Init() - InitFastMemMap(); - BIOSROM = (uint16 *)alloc_sealed(524288); - AddMemoryDomain("Boot Rom", BIOSROM, 524288, MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); - SS_SetPhysMemMap(0x00000000, 0x000FFFFF, BIOSROM, 524288); - SS_SetPhysMemMap(0x00200000, 0x003FFFFF, WorkRAML, sizeof(WorkRAML), true); - SS_SetPhysMemMap(0x06000000, 0x07FFFFFF, WorkRAMH, sizeof(WorkRAMH), true); - AddMemoryDomain("Work Ram Low", WorkRAML, sizeof(WorkRAML), MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); - AddMemoryDomain("Work Ram High", WorkRAMH, sizeof(WorkRAMH), MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2 | MEMORYAREA_FLAGS_PRIMARY); - - CART_Init(cart_type); - // - // - // - const bool PAL = (smpc_area & SMPC_AREA__PAL_MASK); - const int32 MasterClock = PAL ? 1734687500 : 1746818182; // NTSC: 1746818181.8181818181, PAL: 1734687500-ish - const char *biospath; - int sls = PAL ? setting_ss_slstartp : setting_ss_slstart; - int sle = PAL ? setting_ss_slendp : setting_ss_slend; - - if (PAL) - { - sls += 16; - sle += 16; - } - - if (sls > sle) - std::swap(sls, sle); - - if (smpc_area == SMPC_AREA_JP) - biospath = "BIOS_J"; - else if (smpc_area == SMPC_AREA_ASIA_NTSC) - biospath = "BIOS_A"; - else if (PAL) - biospath = "BIOS_E"; - else - biospath = "BIOS_U"; - - if (FirmwareSizeCallback(biospath) != 524288) - { - printf("BIOS file is of an incorrect size.\n"); - return false; - } - - FirmwareDataCallback(biospath, (uint8 *)&BIOSROM[0]); - for (unsigned i = 0; i < 262144; i++) - BIOSROM[i] = MDFN_de16msb(&BIOSROM[i]); - - EmulatedSS_MasterClock = MDFN_MASTERCLOCK_FIXED(MasterClock); - - SCU_Init(); - SMPC_Init(smpc_area, MasterClock); - VDP1::Init(); - VDP2::Init(PAL); - CDB_Init(); - SOUND_Init(); - - InitEvents(); - UpdateInputLastBigTS = 0; - - DBG_Init(); - // - // - // - MDFN_printf("\n"); - { - CorrectAspect = setting_ss_correct_aspect; - ShowHOverscan = setting_ss_h_overscan; - DoHBlend = setting_ss_h_blend; - LineVisFirst = sls; - LineVisLast = sle; - - MDFN_printf(_("Displayed scanlines: [%u,%u]\n"), sls, sle); - MDFN_printf(_("Correct Aspect Ratio: %s\n"), correct_aspect ? _("Enabled") : _("Disabled")); - MDFN_printf(_("Show H Overscan: %s\n"), h_overscan ? _("Enabled") : _("Disabled")); - MDFN_printf(_("H Blend: %s\n"), h_blend ? _("Enabled") : _("Disabled")); - - // VDP2::SetGetVideoParams(&EmulatedSS, correct_aspect, sls, sle, h_overscan, h_blend); - } - - MDFN_printf("\n"); - for (unsigned sp = 0; sp < 2; sp++) - { - SMPC_SetMultitap(sp, false); - - MDFN_printf(_("Multitap on Saturn Port %u: %s\n"), sp + 1, sv ? _("Enabled") : _("Disabled")); - } - // - // - // - /*try - { - LoadRTC(); - } - catch (MDFN_Error &e) - { - if (e.GetErrno() != ENOENT) - throw; - } - try - { - LoadBackupRAM(); - } - catch (MDFN_Error &e) - { - if (e.GetErrno() != ENOENT) - throw; - } - try - { - LoadCartNV(); - } - catch (MDFN_Error &e) - { - if (e.GetErrno() != ENOENT) - throw; - }*/ - - BackupRAM_Dirty = false; - - CART_GetClearNVDirty(); - - /* - if (MDFN_GetSettingB("ss.smpc.autortc")) - { - struct tm ht = Time::LocalTime(); - - SMPC_SetRTC(&ht, MDFN_GetSettingUI("ss.smpc.autortc.lang")); - } - */ - SS_Reset(true); - return true; -} - -MDFN_COLD bool LoadCD(std::vector *CDInterfaces) -{ - const unsigned region_default = setting_ss_region_default; - unsigned region = region_default; - int cart_type; - uint8 fd_id[16]; - char sgid[16 + 1]; - cdifs = CDInterfaces; - CalcGameID(fd_id, sgid); - - if (setting_ss_region_autodetect) - if (!DB_LookupRegionDB(fd_id, ®ion)) - DetectRegion(®ion); - // - // - if ((cart_type = setting_ss_cart) == CART__RESERVED) - { - cart_type = CART_BACKUP_MEM; - DB_LookupCartDB(sgid, fd_id, &cart_type); - } - - // TODO: auth ID calc - - if (!InitCommon(cart_type, region)) - return false; - - return true; -} - -/*static const FileExtensionSpecStruct KnownExtensions[] = -{ - { ".elf", gettext_noop("SS Homebrew ELF Executable") }, - - { NULL, NULL } -};*/ - -/*static const MDFNSetting_EnumList Region_List[] = -{ - { "jp", SMPC_AREA_JP, gettext_noop("Japan") }, - { "na", SMPC_AREA_NA, gettext_noop("North America") }, - { "eu", SMPC_AREA_EU_PAL, gettext_noop("Europe") }, - { "kr", SMPC_AREA_KR, gettext_noop("South Korea") }, - - { "tw", SMPC_AREA_ASIA_NTSC, gettext_noop("Taiwan") }, // Taiwan, Philippines - { "as", SMPC_AREA_ASIA_PAL, gettext_noop("China") }, // China, Middle East - - { "br", SMPC_AREA_CSA_NTSC, gettext_noop("Brazil") }, - { "la", SMPC_AREA_CSA_PAL, gettext_noop("Latin America") }, - - { NULL, 0 }, -}; - -static const MDFNSetting_EnumList RTCLang_List[] = -{ - { "english", SMPC_RTC_LANG_ENGLISH, gettext_noop("English") }, - { "german", SMPC_RTC_LANG_GERMAN, gettext_noop("Deutsch") }, - { "french", SMPC_RTC_LANG_FRENCH, gettext_noop("Français") }, - { "spanish", SMPC_RTC_LANG_SPANISH, gettext_noop("Español") }, - { "italian", SMPC_RTC_LANG_ITALIAN, gettext_noop("Italiano") }, - { "japanese", SMPC_RTC_LANG_JAPANESE, gettext_noop("日本語") }, - - { "deutsch", SMPC_RTC_LANG_GERMAN, NULL }, - { "français", SMPC_RTC_LANG_FRENCH, NULL }, - { "español", SMPC_RTC_LANG_SPANISH, NULL }, - { "italiano", SMPC_RTC_LANG_ITALIAN, NULL }, - { "日本語", SMPC_RTC_LANG_JAPANESE, NULL}, - - { NULL, 0 }, -}; - -static const MDFNSetting_EnumList Cart_List[] = -{ - { "auto", CART__RESERVED, gettext_noop("Automatic") }, - { "none", CART_NONE, gettext_noop("None") }, - { "backup", CART_BACKUP_MEM, gettext_noop("Backup Memory(512KiB)") }, - { "extram1", CART_EXTRAM_1M, gettext_noop("1MiB Extended RAM") }, - { "extram4", CART_EXTRAM_4M, gettext_noop("4MiB Extended RAM") }, - { "cs1ram16", CART_CS1RAM_16M, gettext_noop("16MiB RAM mapped in A-bus CS1") }, -// { "nlmodem", CART_NLMODEM, gettext_noop("NetLink Modem") }, - - { NULL, 0 }, -}; - -static const MDFNSetting SSSettings[] = -{ - { "ss.bios_jp", MDFNSF_EMU_STATE, gettext_noop("Path to the Japan ROM BIOS"), NULL, MDFNST_STRING, "sega_101.bin" }, - { "ss.bios_na_eu", MDFNSF_EMU_STATE, gettext_noop("Path to the North America and Europe ROM BIOS"), NULL, MDFNST_STRING, "mpr-17933.bin" }, - - { "ss.scsp.resamp_quality", MDFNSF_NOFLAGS, gettext_noop("SCSP output resampler quality."), - gettext_noop("0 is lowest quality and CPU usage, 10 is highest quality and CPU usage. The resampler that this setting refers to is used for converting from 44.1KHz to the sampling rate of the host audio device Mednafen is using. Changing Mednafen's output rate, via the \"sound.rate\" setting, to \"44100\" may bypass the resampler, which can decrease CPU usage by Mednafen, and can increase or decrease audio quality, depending on various operating system and hardware factors."), MDFNST_UINT, "4", "0", "10" }, - - { "ss.region_autodetect", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Attempt to auto-detect region of game."), NULL, MDFNST_BOOL, "1" }, - { "ss.region_default", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Default region to use."), gettext_noop("Used if region autodetection fails or is disabled."), MDFNST_ENUM, "jp", NULL, NULL, NULL, NULL, Region_List }, - - { "ss.input.mouse_sensitivity", MDFNSF_NOFLAGS, gettext_noop("Emulated mouse sensitivity."), NULL, MDFNST_FLOAT, "0.50", NULL, NULL }, - { "ss.input.sport1.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap on Saturn port 1."), NULL, MDFNST_BOOL, "0", NULL, NULL }, - { "ss.input.sport2.multitap", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Enable multitap on Saturn port 2."), NULL, MDFNST_BOOL, "0", NULL, NULL }, - - { "ss.smpc.autortc", MDFNSF_NOFLAGS, gettext_noop("Automatically set RTC on game load."), gettext_noop("Automatically set the SMPC's emulated Real-Time Clock to the host system's current time and date upon game load."), MDFNST_BOOL, "1" }, - { "ss.smpc.autortc.lang", MDFNSF_NOFLAGS, gettext_noop("BIOS language."), gettext_noop("Also affects language used in some games(e.g. the European release of \"Panzer Dragoon\")."), MDFNST_ENUM, "english", NULL, NULL, NULL, NULL, RTCLang_List }, - - { "ss.cart", MDFNSF_EMU_STATE | MDFNSF_UNTRUSTED_SAFE, gettext_noop("Expansion cart."), NULL, MDFNST_ENUM, "auto", NULL, NULL, NULL, NULL, Cart_List }, - { "ss.cart.kof95_path", MDFNSF_EMU_STATE, gettext_noop("Path to KoF 95 ROM image."), NULL, MDFNST_STRING, "mpr-18811-mx.ic1" }, - { "ss.cart.ultraman_path", MDFNSF_EMU_STATE, gettext_noop("Path to Ultraman ROM image."), NULL, MDFNST_STRING, "mpr-19367-mx.ic1" }, - - { "ss.bios_sanity", MDFNSF_NOFLAGS, gettext_noop("Enable BIOS ROM image sanity checks."), NULL, MDFNST_BOOL, "1" }, - - { "ss.cd_sanity", MDFNSF_NOFLAGS, gettext_noop("Enable CD (image) sanity checks."), NULL, MDFNST_BOOL, "1" }, - - { "ss.slstart", MDFNSF_NOFLAGS, gettext_noop("First displayed scanline in NTSC mode."), NULL, MDFNST_INT, "0", "0", "239" }, - { "ss.slend", MDFNSF_NOFLAGS, gettext_noop("Last displayed scanline in NTSC mode."), NULL, MDFNST_INT, "239", "0", "239" }, - - { "ss.h_overscan", MDFNSF_NOFLAGS, gettext_noop("Show horizontal overscan area."), NULL, MDFNST_BOOL, "1" }, - - { "ss.h_blend", MDFNSF_NOFLAGS, gettext_noop("Enable horizontal blend(blur) filter."), gettext_noop("Intended for use in combination with the \"goat\" OpenGL shader, or with bilinear interpolation or linear interpolation on the X axis enabled. Has a more noticeable effect with the Saturn's higher horizontal resolution modes(640/704)."), MDFNST_BOOL, "0" }, - - { "ss.correct_aspect", MDFNSF_NOFLAGS, gettext_noop("Correct aspect ratio."), gettext_noop("Disabling aspect ratio correction with this setting should be considered a hack.\n\nIf disabling it to allow for sharper pixels by also separately disabling interpolation(though using Mednafen's \"autoipsharper\" OpenGL shader is usually a better option), remember to use scale factors that are multiples of 2, or else games that use high-resolution and interlaced modes will have distorted pixels.\n\nDisabling aspect ratio correction with this setting will allow for the QuickTime movie recording feature to produce much smaller files using much less CPU time."), MDFNST_BOOL, "1" }, - - { "ss.slstartp", MDFNSF_NOFLAGS, gettext_noop("First displayed scanline in PAL mode."), NULL, MDFNST_INT, "0", "-16", "271" }, - { "ss.slendp", MDFNSF_NOFLAGS, gettext_noop("Last displayed scanline in PAL mode."), NULL, MDFNST_INT, "255", "-16", "271" }, - - { "ss.midsync", MDFNSF_NOFLAGS, gettext_noop("Enable mid-frame synchronization."), gettext_noop("Mid-frame synchronization can reduce input latency, but it will increase CPU requirements."), MDFNST_BOOL, "0" }, - -#ifdef MDFN_SS_DEV_BUILD - { "ss.dbg_mask", MDFNSF_SUPPRESS_DOC, gettext_noop("Debug printf mask."), NULL, MDFNST_UINT, "0x00001", "0x00000", "0xFFFFF" }, - { "ss.dbg_exe_cdpath", MDFNSF_SUPPRESS_DOC, gettext_noop("CD image to use with homebrew executable loading."), NULL, MDFNST_STRING, "" }, -#endif - - { NULL }, -}; - -static const CheatInfoStruct CheatInfo = -{ - NULL, - NULL, - - CheatMemRead, - CheatMemWrite, - - CheatFormatInfo_Empty, - - true -};*/ -} - -using namespace MDFN_IEN_SS; - -/*MDFNGI EmulatedSS = -{ - "ss", - "Sega Saturn", - KnownExtensions, - MODPRIO_INTERNAL_HIGH, - #ifdef WANT_DEBUGGER - &DBGInfo, - #else - NULL, - #endif - SMPC_PortInfo, -#ifdef MDFN_SS_DEV_BUILD - Load, - TestMagic, -#else - NULL, - NULL, -#endif - LoadCD, - TestMagicCD, - CloseGame, - - VDP2::SetLayerEnableMask, - "NBG0\0NBG1\0NBG2\0NBG3\0RBG0\0RBG1\0Sprite\0", - - NULL, - NULL, - - NULL, - 0, - - CheatInfo, - - false, - NULL, //StateAction, - Emulate, - NULL, - SMPC_SetInput, - SetMedia, - DoSimpleCommand, - NULL, - SSSettings, - 0, - 0, - - true, // Multires possible? - - // - // Note: Following video settings will be overwritten during game load. - // - 320, // lcm_width - 240, // lcm_height - NULL, // Dummy - - 302, // Nominal width - 240, // Nominal height - - 0, // Framebuffer width - 0, // Framebuffer height - // - // - // - - 2, // Number of output sound channels -};*/ diff --git a/waterbox/ss/ss.h b/waterbox/ss/ss.h deleted file mode 100644 index a76aac0848..0000000000 --- a/waterbox/ss/ss.h +++ /dev/null @@ -1,146 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* ss.h: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_SS_H -#define __MDFN_SS_SS_H - -#include "defs.h" -#include -#include - -namespace MDFN_IEN_SS -{ - enum - { - SS_DBG_ERROR = 0x00001, - SS_DBG_WARNING = 0x00002, - - SS_DBG_M68K = 0x00004, - - SS_DBG_SH2 = 0x00010, - SS_DBG_SH2_REGW = 0x00020, - - SS_DBG_SCU = 0x00040, - SS_DBG_SCU_REGW = 0x00080, - - SS_DBG_SMPC = 0x00100, - SS_DBG_SMPC_REGW = 0x00200, - - SS_DBG_CDB = 0x00400, - SS_DBG_CDB_REGW = 0x00800, - - SS_DBG_VDP1 = 0x01000, - SS_DBG_VDP1_REGW = 0x02000, - - SS_DBG_VDP2 = 0x04000, - SS_DBG_VDP2_REGW = 0x08000, - - SS_DBG_SCSP = 0x10000, - SS_DBG_SCSP_REGW = 0x20000, - }; -#ifdef MDFN_SS_DEV_BUILD - extern uint32 ss_dbg_mask; -#else - enum { ss_dbg_mask = 0 }; -#endif - - static INLINE void SS_DBG_Dummy(const char* format, ...) { } - #define SS_DBG(which, format, ...) ((MDFN_UNLIKELY(ss_dbg_mask & (which))) ? (void)trio_printf(format, ## __VA_ARGS__) : SS_DBG_Dummy(format, ## __VA_ARGS__)) - #define SS_DBGTI(which, format, ...) SS_DBG(which, format " @Line=0x%03x, HPos=0x%03x, memts=%d\n", ## __VA_ARGS__, VDP2::PeekLine(), VDP2::PeekHPos(), SH7095_mem_timestamp) - - template - static void SS_DBG_Wrap(const char* format, ...) noexcept - { - if(ss_dbg_mask & which) - { - va_list ap; - - va_start(ap, format); - - trio_vprintf(format, ap); - - va_end(ap); - } - } - - typedef int32 sscpu_timestamp_t; - - class SH7095; - - extern SH7095 CPU[2]; // for smpc.cpp - - extern int32 SH7095_mem_timestamp; - - void SS_RequestMLExit(void); - void ForceEventUpdates(const sscpu_timestamp_t timestamp); - - enum - { - SS_EVENT__SYNFIRST = 0, - - SS_EVENT_SH2_M_DMA, - SS_EVENT_SH2_S_DMA, - - SS_EVENT_SCU_DMA, - SS_EVENT_SCU_DSP, - - SS_EVENT_SMPC, - - SS_EVENT_VDP1, - SS_EVENT_VDP2, - - SS_EVENT_CDB, - - SS_EVENT_SOUND, - - SS_EVENT_CART, - - SS_EVENT_MIDSYNC, - - SS_EVENT__SYNLAST, - SS_EVENT__COUNT, - }; - - typedef sscpu_timestamp_t (*ss_event_handler)(const sscpu_timestamp_t timestamp); - - struct event_list_entry - { - sscpu_timestamp_t event_time; - event_list_entry *prev; - event_list_entry *next; - ss_event_handler event_handler; - }; - - extern event_list_entry events[SS_EVENT__COUNT]; - - #define SS_EVENT_DISABLED_TS 0x40000000 - void SS_SetEventNT(event_list_entry* e, const sscpu_timestamp_t next_timestamp); - - // Call from init code, or power/reset code, as appropriate. - // (length is in units of bytes, not 16-bit units) - // - // is_writeable is mostly for cheat stuff. - void SS_SetPhysMemMap(uint32 Astart, uint32 Aend, uint16* ptr, uint32 length, bool is_writeable = false); - - void SS_Reset(bool powering_up) MDFN_COLD; -} - -#endif diff --git a/waterbox/ss/vdp1.cpp b/waterbox/ss/vdp1.cpp deleted file mode 100644 index 38b4a63967..0000000000 --- a/waterbox/ss/vdp1.cpp +++ /dev/null @@ -1,889 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp1.cpp - VDP1 Emulation -** Copyright (C) 2015-2017 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// TODO: Check to see what registers are reset on reset. - -// TODO: Fix preclipping when raw system clipping values have bit12==1(sign bit?). - -// TODO: SS_SetPhysMemMap(0x05C80000, 0x05CFFFFF, FB[FBDrawWhich], sizeof(FB[0])); -// (...but goes weird in 8bpp rotated mode...) - -// TODO: Test 1x1 line, polyline, sprite, and polygon. - -// TODO: Framebuffer swap/auto drawing start happens a bit too early, should happen near -// end of hblank instead of the beginning. - -#include "ss.h" -#include "scu.h" -#include "vdp1.h" -#include "vdp2.h" -#include "vdp1_common.h" - -enum { VDP1_UpdateTimingGran = 263 }; -enum { VDP1_IdleTimingGran = 1019 }; - -namespace MDFN_IEN_SS -{ -namespace VDP1 -{ - -uint8 spr_w_shift_tab[8]; -line_data LineSetup; -uint8 gouraud_lut[0x40]; - -uint16 VRAM[0x40000]; -uint16 FB[2][0x20000]; -bool FBDrawWhich; - -static bool FBManualPending; - -static bool FBVBErasePending; -static bool FBVBEraseActive; -static sscpu_timestamp_t FBVBEraseLastTS; - -int32 SysClipX, SysClipY; -int32 UserClipX0, UserClipY0, UserClipX1, UserClipY1; -int32 LocalX, LocalY; - -static uint32 CurCommandAddr; -static int32 RetCommandAddr; -static bool DrawingActive; - -static uint16 LOPR; - -static uint16 EWDR; // Erase/Write Data -static uint16 EWLR; // Erase/Write Upper Left Coordinate -static uint16 EWRR; // Erase/Write Lower Right Coordinate - -static struct -{ - bool rot8; - uint32 fb_x_mask; - - uint32 y_start; - uint32 x_start; - - uint32 y_end; - uint32 x_bound; - - uint16 fill_data; -} EraseParams; - -static uint32 EraseYCounter; - -uint8 TVMR; -uint8 FBCR; -uint8 PTMR; -static uint8 EDSR; - -static bool vb_status, hb_status; -static sscpu_timestamp_t lastts; -static int32 CycleCounter; - -static bool vbcdpending; - -void Init(void) -{ - vbcdpending = false; - - for(int i = 0; i < 0x40; i++) - { - gouraud_lut[i] = std::min(31, std::max(0, i - 16)); - } - - for(int i = 0; i < 8; i++) - { - spr_w_shift_tab[i] = (7 - i) / 3; - } - - - // - // - SS_SetPhysMemMap(0x05C00000, 0x05C7FFFF, VRAM, sizeof(VRAM), true); - AddMemoryDomain("VDP1 Ram", VRAM, sizeof(VRAM), MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); - AddMemoryDomain("VDP1 Framebuffer", FB, sizeof(FB), MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); - //SS_SetPhysMemMap(0x05C80000, 0x05CFFFFF, FB[FBDrawWhich], sizeof(FB[0]), true); - - vb_status = false; - hb_status = false; - lastts = 0; - FBVBEraseLastTS = 0; -} - -void Reset(bool powering_up) -{ - if(powering_up) - { - for(unsigned i = 0; i < 0x40000; i++) - { - uint16 val; - - if((i & 0xF) == 0) - val = 0x8000; - else if(i & 0x1) - val = 0x5555; - else - val = 0xAAAA; - - VRAM[i] = val; - } - - for(unsigned fb = 0; fb < 2; fb++) - for(unsigned i = 0; i < 0x20000; i++) - FB[fb][i] = 0xFFFF; - - memset(&LineSetup, 0, sizeof(LineSetup)); - - // - // - // - EWDR = 0; - EWLR = 0; - EWRR = 0; - - TVMR = 0; - FBCR = 0; - } - - UserClipX0 = 0; - UserClipY0 = 0; - UserClipX1 = 0; - UserClipY1 = 0; - - SysClipX = 0; - SysClipY = 0; - - LocalX = 0; - LocalY = 0; - - FBDrawWhich = 0; - //SS_SetPhysMemMap(0x05C80000, 0x05CFFFFF, FB[FBDrawWhich], sizeof(FB[0]), true); - - FBManualPending = false; - FBVBErasePending = false; - FBVBEraseActive = false; - - LOPR = 0; - CurCommandAddr = 0; - RetCommandAddr = -1; - DrawingActive = false; - - PTMR = 0; - EDSR = 0; - - memset(&EraseParams, 0, sizeof(EraseParams)); - EraseYCounter = ~0U; - - CycleCounter = 0; -} - -static int32 CMD_SetUserClip(const uint16* cmd_data) -{ - UserClipX0 = cmd_data[0x6] & 0x3FF; - UserClipY0 = cmd_data[0x7] & 0x1FF; - - UserClipX1 = cmd_data[0xA] & 0x3FF; - UserClipY1 = cmd_data[0xB] & 0x1FF; - - return 0; -} - -int32 CMD_SetSystemClip(const uint16* cmd_data) -{ - SysClipX = cmd_data[0xA] & 0x3FF; - SysClipY = cmd_data[0xB] & 0x1FF; - - return 0; -} - -int32 CMD_SetLocalCoord(const uint16* cmd_data) -{ - LocalX = sign_x_to_s32(11, cmd_data[0x6] & 0x7FF); - LocalY = sign_x_to_s32(11, cmd_data[0x7] & 0x7FF); - - return 0; -} - -template -static uint32 MDFN_FASTCALL TexFetch(uint32 x) -{ - const uint32 base = LineSetup.tex_base; - const bool ECD = ECDSPDMode & 0x10; - const bool SPD = ECDSPDMode & 0x08; - const unsigned ColorMode = ECDSPDMode & 0x07; - - uint32 rtd; - uint32 ret_or = 0; - - switch(ColorMode) - { - case 0: // 16 colors, color bank - rtd = (VRAM[(base + (x >> 2)) & 0x3FFFF] >> (((x & 0x3) ^ 0x3) << 2)) & 0xF; - - if(!ECD && rtd == 0xF) - { - LineSetup.ec_count--; - return -1; - } - ret_or = LineSetup.cb_or; - - if(!SPD) ret_or |= (int32)(rtd - 1) >> 31; - - return rtd | ret_or; - - case 1: // 16 colors, LUT - rtd = (VRAM[(base + (x >> 2)) & 0x3FFFF] >> (((x & 0x3) ^ 0x3) << 2)) & 0xF; - - if(!ECD && rtd == 0xF) - { - LineSetup.ec_count--; - return -1; - } - - if(!SPD) ret_or |= (int32)(rtd - 1) >> 31; - - return LineSetup.CLUT[rtd] | ret_or; - - case 2: // 64 colors, color bank - rtd = (VRAM[(base + (x >> 1)) & 0x3FFFF] >> (((x & 0x1) ^ 0x1) << 3)) & 0xFF; - - if(!ECD && rtd == 0xFF) - { - LineSetup.ec_count--; - return -1; - } - - ret_or = LineSetup.cb_or; - - if(!SPD) ret_or |= (int32)(rtd - 1) >> 31; - - return (rtd & 0x3F) | ret_or; - - case 3: // 128 colors, color bank - rtd = (VRAM[(base + (x >> 1)) & 0x3FFFF] >> (((x & 0x1) ^ 0x1) << 3)) & 0xFF; - - if(!ECD && rtd == 0xFF) - { - LineSetup.ec_count--; - return -1; - } - - ret_or = LineSetup.cb_or; - - if(!SPD) ret_or |= (int32)(rtd - 1) >> 31; - - return (rtd & 0x7F) | ret_or; - - case 4: // 256 colors, color bank - rtd = (VRAM[(base + (x >> 1)) & 0x3FFFF] >> (((x & 0x1) ^ 0x1) << 3)) & 0xFF; - - if(!ECD && rtd == 0xFF) - { - LineSetup.ec_count--; - return -1; - } - - ret_or = LineSetup.cb_or; - - if(!SPD) ret_or |= (int32)(rtd - 1) >> 31; - - return rtd | ret_or; - - case 5: // 32K colors, RGB - case 6: - case 7: - if(ColorMode >= 6) - rtd = VRAM[0]; - else - rtd = VRAM[(base + x) & 0x3FFFF]; - - if(!ECD && (rtd & 0xC000) == 0x4000) - { - LineSetup.ec_count--; - return -1; - } - - if(!SPD) ret_or |= (int32)(rtd - 0x4000) >> 31; - - return rtd | ret_or; - } -} - - -extern uint32 (MDFN_FASTCALL *const TexFetchTab[0x20])(uint32 x) = -{ - #define TF(a) (TexFetch) - - TF(0x00), TF(0x01), TF(0x02), TF(0x03), - TF(0x04), TF(0x05), TF(0x06), TF(0x07), - - TF(0x08), TF(0x09), TF(0x0A), TF(0x0B), - TF(0x0C), TF(0x0D), TF(0x0E), TF(0x0F), - - TF(0x10), TF(0x11), TF(0x12), TF(0x13), - TF(0x14), TF(0x15), TF(0x16), TF(0x17), - - TF(0x18), TF(0x19), TF(0x1A), TF(0x1B), - TF(0x1C), TF(0x1D), TF(0x1E), TF(0x1F), - - #undef TF -}; - - - -/* - Notes: - When vblank starts: Abort command processing, and if VBE=1, erase framebuffer just displayed according to set values. - - When vblank ends: Abort framebuffer erase, swap framebuffer, and if (PTMR&2) start command processing. - - See if EDSR and LOPR are modified or not when PTMR=0 and an auto framebuffer swap occurs. - - FB erase params are latched at framebuffer swap time probably. - - VBE=1 is persistent. -*/ - -sscpu_timestamp_t Update(sscpu_timestamp_t timestamp) -{ - if(MDFN_UNLIKELY(timestamp < lastts)) - { - // Don't else { } normal execution, since this bug condition miiight occur in the call from SetHBVB(), - // and we need drawing to start ASAP before silly games overwrite the beginning of the command table. - // - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] [BUG] timestamp(%d) < lastts(%d)", timestamp, lastts); - timestamp = lastts; - } - // - // - // - int32 cycles = timestamp - lastts; - lastts = timestamp; - - CycleCounter += cycles; - if(CycleCounter > VDP1_UpdateTimingGran) - CycleCounter = VDP1_UpdateTimingGran; - - if(CycleCounter > 0 && SCU_CheckVDP1HaltKludge()) - { - //puts("Kludge"); - CycleCounter = 0; - } - else if(DrawingActive) - { - while(CycleCounter > 0) - { - uint16 cmd_data[0x10]; - - // Fetch command data - memcpy(cmd_data, &VRAM[CurCommandAddr], sizeof(cmd_data)); - CycleCounter -= 16; - - //SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Command @ 0x%06x: 0x%04x\n", CurCommandAddr, cmd_data[0]); - - if(MDFN_LIKELY(!(cmd_data[0] & 0xC000))) - { - const unsigned cc = cmd_data[0] & 0xF; - - if(MDFN_UNLIKELY(cc >= 0xC)) - { - DrawingActive = false; - break; - } - else - { - static int32 (*const command_table[0xC])(const uint16* cmd_data) = - { - /* 0x0 */ /* 0x1 */ /* 0x2 */ /* 0x3 */ - CMD_NormalSprite, CMD_ScaledSprite, CMD_DistortedSprite, CMD_DistortedSprite, - - /* 0x4 */ /* 0x5 */ /* 0x6 */ /* 0x7 */ - CMD_Polygon, CMD_Polyline, CMD_Line, CMD_Polyline, - - /* 0x8*/ /* 0x9 */ /* 0xA */ /* 0xB */ - CMD_SetUserClip, CMD_SetSystemClip, CMD_SetLocalCoord, CMD_SetUserClip - }; - - CycleCounter -= command_table[cc](cmd_data); - } - } - else if(MDFN_UNLIKELY(cmd_data[0] & 0x8000)) - { - SS_DBGTI(SS_DBG_VDP1, "[VDP1] Drawing finished at 0x%05x", CurCommandAddr); - DrawingActive = false; - - EDSR |= 0x2; // TODO: Does EDSR reflect IRQ out status? - - SCU_SetInt(SCU_INT_VDP1, true); - SCU_SetInt(SCU_INT_VDP1, false); - break; - } - - CurCommandAddr = (CurCommandAddr + 0x10) & 0x3FFFF; - switch((cmd_data[0] >> 12) & 0x3) - { - case 0: - break; - - case 1: - CurCommandAddr = (cmd_data[1] << 2) &~ 0xF; - break; - - case 2: - if(RetCommandAddr < 0) - RetCommandAddr = CurCommandAddr; - - CurCommandAddr = (cmd_data[1] << 2) &~ 0xF; - break; - - case 3: - if(RetCommandAddr >= 0) - { - CurCommandAddr = RetCommandAddr; - RetCommandAddr = -1; - } - break; - } - } - } - - return timestamp + (DrawingActive ? std::max(VDP1_UpdateTimingGran, 0 - CycleCounter) : VDP1_IdleTimingGran); -} - -// Draw-clear minimum x amount is 2(16-bit units) for normal and 8bpp, and 8 for rotate...actually, seems like -// rotate being enabled forces vblank erase mode somehow. - -static void StartDrawing(void) -{ - if(DrawingActive) - { - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Drawing interrupted by new drawing start request."); - } - - SS_DBGTI(SS_DBG_VDP1, "[VDP1] Started drawing to framebuffer %d.", FBDrawWhich); - - // On draw start, clear CEF. - EDSR &= ~0x2; - - CurCommandAddr = 0; - RetCommandAddr = -1; - DrawingActive = true; - CycleCounter = VDP1_UpdateTimingGran; -} - -void SetHBVB(const sscpu_timestamp_t event_timestamp, const bool new_hb_status, const bool new_vb_status) -{ - const bool old_hb_status = hb_status; - const bool old_vb_status = vb_status; - - hb_status = new_hb_status; - vb_status = new_vb_status; - - if(MDFN_UNLIKELY(vbcdpending & hb_status & (old_hb_status ^ hb_status))) - { - vbcdpending = false; - - if(vb_status) // Going into v-blank - { - // - // v-blank erase - // - if((TVMR & TVMR_VBE) || FBVBErasePending) - { - SS_DBGTI(SS_DBG_VDP1, "[VDP1] VB erase start of framebuffer %d.", !FBDrawWhich); - - FBVBErasePending = false; - FBVBEraseActive = true; - FBVBEraseLastTS = event_timestamp; - } - } - else // Leaving v-blank - { - // Run vblank erase at end of vblank all at once(not strictly accurate, but should only have visible side effects wrt the debugger and reset). - if(FBVBEraseActive) - { - int32 count = event_timestamp - FBVBEraseLastTS; - //printf("%d %d, %d\n", event_timestamp, FBVBEraseLastTS, count); - // - // - // - uint32 y = EraseParams.y_start; - - do - { - uint16* fbyptr; - uint32 x = EraseParams.x_start; - - fbyptr = &FB[!FBDrawWhich][(y & 0xFF) << 9]; - if(EraseParams.rot8) - fbyptr += (y & 0x100); - - count -= 8; - do - { - for(unsigned sub = 0; sub < 8; sub++) - { - //printf("%d %d:%d %04x\n", FBDrawWhich, x, y, fill_data); - //printf("%lld\n", &fbyptr[x & fb_x_mask] - FB[!FBDrawWhich]); - fbyptr[x & EraseParams.fb_x_mask] = EraseParams.fill_data; - x++; - } - count -= 8; - if(MDFN_UNLIKELY(count <= 0)) - { - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] VB erase of framebuffer %d ran out of time.", !FBDrawWhich); - goto AbortVBErase; - } - } while(x < EraseParams.x_bound); - } while(++y <= EraseParams.y_end); - - AbortVBErase:; - // - FBVBEraseActive = false; - } - // - // - // - // - if(!(FBCR & FBCR_FCM) || (FBManualPending && (FBCR & FBCR_FCT))) // Swap framebuffers - { - if(DrawingActive) - { - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Drawing aborted by framebuffer swap."); - DrawingActive = false; - } - - FBDrawWhich = !FBDrawWhich; - - SS_DBGTI(SS_DBG_VDP1, "[VDP1] Displayed framebuffer changed to %d.", !FBDrawWhich); - - // On fb swap, copy CEF to BEF, clear CEF, and copy COPR to LOPR. - EDSR = EDSR >> 1; - LOPR = CurCommandAddr >> 2; - - // - EraseParams.rot8 = (TVMR & (TVMR_8BPP | TVMR_ROTATE)) == (TVMR_8BPP | TVMR_ROTATE); - EraseParams.fb_x_mask = EraseParams.rot8 ? 0xFF : 0x1FF; - - EraseParams.y_start = EWLR & 0x1FF; - EraseParams.x_start = ((EWLR >> 9) & 0x3F) << 3; - - EraseParams.y_end = EWRR & 0x1FF; - EraseParams.x_bound = ((EWRR >> 9) & 0x7F) << 3; - - EraseParams.fill_data = EWDR; - // - - if(PTMR & 0x2) // Start drawing(but only if we swapped the frame) - { - StartDrawing(); - SS_SetEventNT(&events[SS_EVENT_VDP1], Update(event_timestamp)); - } - } - - if(!(FBCR & FBCR_FCM) || (FBManualPending && !(FBCR & FBCR_FCT))) - { - if(TVMR & TVMR_ROTATE) - { - EraseYCounter = ~0U; - FBVBErasePending = true; - } - else - { - EraseYCounter = EraseParams.y_start; - } - } - - FBManualPending = false; - } - } - vbcdpending |= old_vb_status ^ vb_status; -} - -bool GetLine(const int line, uint16* buf, unsigned w, uint32 rot_x, uint32 rot_y, uint32 rot_xinc, uint32 rot_yinc) -{ - bool ret = false; - // - // - // - if(TVMR & TVMR_ROTATE) - { - const uint16* fbptr = FB[!FBDrawWhich]; - - if(TVMR & TVMR_8BPP) - { - for(unsigned i = 0; MDFN_LIKELY(i < w); i++) - { - const uint32 fb_x = rot_x >> 9; - const uint32 fb_y = rot_y >> 9; - - if((fb_x | fb_y) &~ 0x1FF) - buf[i] = 0; // Not 0xFF00 - else - { - const uint16* fbyptr = fbptr + ((fb_y & 0xFF) << 9); - uint8 tmp = ne16_rbo_be(fbyptr, (fb_x & 0x1FF) | ((fb_y & 0x100) << 1)); - - buf[i] = 0xFF00 | tmp; - } - - rot_x += rot_xinc; - rot_y += rot_yinc; - } - } - else - { - for(unsigned i = 0; MDFN_LIKELY(i < w); i++) - { - const uint32 fb_x = rot_x >> 9; - const uint32 fb_y = rot_y >> 9; - - if((fb_x &~ 0x1FF) | (fb_y &~ 0xFF)) - buf[i] = 0; - else - buf[i] = fbptr[(fb_y << 9) + fb_x]; - - rot_x += rot_xinc; - rot_y += rot_yinc; - } - } - } - else - { - const uint16* fbyptr = &FB[!FBDrawWhich][(line & 0xFF) << 9]; - - if(TVMR & TVMR_8BPP) - ret = true; - - for(unsigned i = 0; MDFN_LIKELY(i < w); i++) - buf[i] = fbyptr[i]; - } - - // - // - // - if(EraseYCounter <= EraseParams.y_end) - { - uint16* fbyptr; - uint32 x = EraseParams.x_start; - - fbyptr = &FB[!FBDrawWhich][(EraseYCounter & 0xFF) << 9]; - if(EraseParams.rot8) - fbyptr += (EraseYCounter & 0x100); - - do - { - for(unsigned sub = 0; sub < 2; sub++) - { - //printf("%d %d:%d %04x\n", FBDrawWhich, x, y, fill_data); - //printf("%lld\n", &fbyptr[x & fb_x_mask] - FB[!FBDrawWhich]); - fbyptr[x & EraseParams.fb_x_mask] = EraseParams.fill_data; - x++; - } - } while(x < EraseParams.x_bound); - - EraseYCounter++; - } - - return ret; -} - -void AdjustTS(const int32 delta) -{ - lastts += delta; - if(FBVBEraseActive) - FBVBEraseLastTS += delta; -} - -static INLINE void WriteReg(const unsigned which, const uint16 value) -{ - SS_SetEventNT(&events[SS_EVENT_VDP2], VDP2::Update(SH7095_mem_timestamp)); - sscpu_timestamp_t nt = Update(SH7095_mem_timestamp); - - SS_DBGTI(SS_DBG_VDP1_REGW, "[VDP1] Register write: 0x%02x: 0x%04x", which << 1, value); - - switch(which) - { - default: - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Unknown write of value 0x%04x to register 0x%02x", value, which << 1); - break; - - case 0x0: // TVMR - TVMR = value & 0xF; - break; - - case 0x1: // FBCR - FBCR = value & 0x1F; - FBManualPending |= value & 0x2; - break; - - case 0x2: // PTMR - PTMR = (value & 0x3); - if(value & 0x1) - { - StartDrawing(); - nt = SH7095_mem_timestamp + 1; - } - break; - - case 0x3: // EWDR - EWDR = value; - break; - - case 0x4: // EWLR - EWLR = value & 0x7FFF; - break; - - case 0x5: // EWRR - EWRR = value; - break; - - case 0x6: // ENDR - if(DrawingActive) - { - DrawingActive = false; - if(CycleCounter < 0) - CycleCounter = 0; - nt = SH7095_mem_timestamp + VDP1_IdleTimingGran; - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Program forced termination of VDP1 drawing."); - } - break; - - } - - SS_SetEventNT(&events[SS_EVENT_VDP1], nt); -} - -static INLINE uint16 ReadReg(const unsigned which) -{ - switch(which) - { - default: - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] Unknown read from register 0x%02x", which); - return 0; - - case 0x8: // EDSR - return EDSR; - - case 0x9: // LOPR - return LOPR; - - case 0xA: // COPR - return CurCommandAddr >> 2; - - case 0xB: // MODR - return (0x1 << 12) | ((PTMR & 0x2) << 7) | ((FBCR & 0x1E) << 3) | (TVMR << 0); - } -} - -void Write8_DB(uint32 A, uint16 DB) -{ - A &= 0x1FFFFF; - - if(A < 0x80000) - { - ne16_wbo_be(VRAM, A, DB >> (((A & 1) ^ 1) << 3) ); - return; - } - - if(A < 0x100000) - { - uint32 FBA = A; - - if((TVMR & (TVMR_8BPP | TVMR_ROTATE)) == (TVMR_8BPP | TVMR_ROTATE)) - FBA = (FBA & 0x1FF) | ((FBA << 1) & 0x3FC00) | ((FBA >> 8) & 0x200); - - ne16_wbo_be(FB[FBDrawWhich], FBA & 0x3FFFF, DB >> (((A & 1) ^ 1) << 3) ); - return; - } - - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP1, "[VDP1] 8-bit write to 0x%08x(DB=0x%04x)", A, DB); - WriteReg((A - 0x100000) >> 1, DB); -} - -void Write16_DB(uint32 A, uint16 DB) -{ - A &= 0x1FFFFE; - - if(A < 0x80000) - { - VRAM[A >> 1] = DB; - return; - } - - if(A < 0x100000) - { - uint32 FBA = A; - - if((TVMR & (TVMR_8BPP | TVMR_ROTATE)) == (TVMR_8BPP | TVMR_ROTATE)) - FBA = (FBA & 0x1FF) | ((FBA << 1) & 0x3FC00) | ((FBA >> 8) & 0x200); - - FB[FBDrawWhich][(FBA >> 1) & 0x1FFFF] = DB; - return; - } - - WriteReg((A - 0x100000) >> 1, DB); -} - -uint16 Read16_DB(uint32 A) -{ - A &= 0x1FFFFE; - - if(A < 0x080000) - return VRAM[A >> 1]; - - if(A < 0x100000) - { - uint32 FBA = A; - - if((TVMR & (TVMR_8BPP | TVMR_ROTATE)) == (TVMR_8BPP | TVMR_ROTATE)) - FBA = (FBA & 0x1FF) | ((FBA << 1) & 0x3FC00) | ((FBA >> 8) & 0x200); - - return FB[FBDrawWhich][(FBA >> 1) & 0x1FFFF]; - } - - return ReadReg((A - 0x100000) >> 1); -} - - -uint8 PeekVRAM(const uint32 addr) -{ - return ne16_rbo_be(VRAM, addr & 0x7FFFF); -} - -void PokeVRAM(const uint32 addr, const uint8 val) -{ - ne16_wbo_be(VRAM, addr & 0x7FFFF, val); -} - -/*void MakeDump(const std::string& path) -{ - FileStream fp(path, FileStream::MODE_WRITE); - - for(unsigned i = 0; i < 0x40000; i++) - fp.print_format("0x%04x, ", VRAM[i]); - - fp.close(); -}*/ - -} - -} diff --git a/waterbox/ss/vdp1.h b/waterbox/ss/vdp1.h deleted file mode 100644 index 2595edd0ee..0000000000 --- a/waterbox/ss/vdp1.h +++ /dev/null @@ -1,59 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp1.h: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_VDP1_H -#define __MDFN_SS_VDP1_H - -namespace MDFN_IEN_SS -{ - -namespace VDP1 -{ - -void Init(void) MDFN_COLD; - -void Reset(bool powering_up) MDFN_COLD; - -sscpu_timestamp_t Update(sscpu_timestamp_t timestamp); -void AdjustTS(const int32 delta); - -void Write8_DB(uint32 A, uint16 DB) MDFN_HOT; -void Write16_DB(uint32 A, uint16 DB) MDFN_HOT; -uint16 Read16_DB(uint32 A) MDFN_HOT; - -void SetHBVB(const sscpu_timestamp_t event_timestamp, const bool new_hb_status, const bool new_vb_status); - -bool GetLine(const int line, uint16* buf, unsigned w, uint32 rot_x, uint32 rot_y, uint32 rot_xinc, uint32 rot_yinc); - -// __restrict__ in vdp2 -//const uint16* VPD1_FetchLine(void); -// vb start, vb end, field num... - -uint8 PeekVRAM(const uint32 addr); -void PokeVRAM(const uint32 addr, const uint8 val); - -void MakeDump(const std::string& path) MDFN_COLD; -} - -} - - -#endif diff --git a/waterbox/ss/vdp1_common.h b/waterbox/ss/vdp1_common.h deleted file mode 100644 index ba960a77b1..0000000000 --- a/waterbox/ss/vdp1_common.h +++ /dev/null @@ -1,670 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp1_common.h: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_VDP1_COMMON_H -#define __MDFN_SS_VDP1_COMMON_H - -#include "endian.h" - -namespace MDFN_IEN_SS -{ - -namespace VDP1 -{ - -int32 CMD_NormalSprite(const uint16*); -int32 CMD_ScaledSprite(const uint16*); -int32 CMD_DistortedSprite(const uint16*); - -int32 CMD_Polygon(const uint16*); -int32 CMD_Polyline(const uint16*); -int32 CMD_Line(const uint16*); - -extern uint16 VRAM[0x40000]; -extern uint16 FB[2][0x20000]; -extern bool FBDrawWhich; - -extern int32 SysClipX, SysClipY; -extern int32 UserClipX0, UserClipY0, UserClipX1, UserClipY1; -extern int32 LocalX, LocalY; - -extern uint32 (MDFN_FASTCALL *const TexFetchTab[0x20])(uint32 x); - -enum { TVMR_8BPP = 0x1 }; -enum { TVMR_ROTATE = 0x2 }; -enum { TVMR_HDTV = 0x4 }; -enum { TVMR_VBE = 0x8 }; -extern uint8 TVMR; - -enum { FBCR_FCT = 0x01 }; // Frame buffer change trigger -enum { FBCR_FCM = 0x02 }; // Frame buffer change mode -enum { FBCR_DIL = 0x04 }; // Double interlace draw line(0=even, 1=odd) (does it affect drawing to FB RAM or reading from FB RAM to VDP2?) -enum { FBCR_DIE = 0x08 }; // Double interlace enable -enum { FBCR_EOS = 0x10 }; // Even/Odd coordinate select(0=even, 1=odd, used with HSS) -extern uint8 FBCR; - -extern uint8 spr_w_shift_tab[8]; -extern uint8 gouraud_lut[0x40]; - -struct GourauderTheTerrible -{ - void Setup(const unsigned length, const uint16 gstart, const uint16 gend) - { - g = gstart & 0x7FFF; - intinc = 0; - - for(unsigned cc = 0; cc < 3; cc++) - { - const int dg = ((gend >> (cc * 5)) & 0x1F) - ((gstart >> (cc * 5)) & 0x1F); - const unsigned abs_dg = abs(dg); - - ginc[cc] = (uint32)((dg >= 0) ? 1 : -1) << (cc * 5); - - if(length <= abs_dg) - { - error_inc[cc] = (abs_dg + 1) * 2; - error_adj[cc] = (length * 2); - error[cc] = abs_dg + 1 - (length * 2 + ((dg < 0) ? 1 : 0)); - - while(error[cc] >= 0) { g += ginc[cc]; error[cc] -= error_adj[cc]; } - while(error_inc[cc] >= error_adj[cc]) { intinc += ginc[cc]; error_inc[cc] -= error_adj[cc]; } - } - else - { - error_inc[cc] = abs_dg * 2; - error_adj[cc] = ((length - 1) * 2); - error[cc] = length - (length * 2 - ((dg < 0) ? 1 : 0)); - if(error[cc] >= 0) { g += ginc[cc]; error[cc] -= error_adj[cc]; } - if(error_inc[cc] >= error_adj[cc]) { intinc += ginc[cc]; error_inc[cc] -= error_adj[cc]; } - } - error[cc] = ~error[cc]; - } - } - - inline uint32 Current(void) - { - return g; - } - - inline uint16 Apply(uint16 pix) const - { - uint16 ret = pix & 0x8000; - - ret |= gouraud_lut[((pix & (0x1F << 0)) + (g & (0x1F << 0))) >> 0] << 0; - ret |= gouraud_lut[((pix & (0x1F << 5)) + (g & (0x1F << 5))) >> 5] << 5; - ret |= gouraud_lut[((pix & (0x1F << 10)) + (g & (0x1F << 10))) >> 10] << 10; - - return ret; - } - - inline void Step(void) - { - g += intinc; - - for(unsigned cc = 0; cc < 3; cc++) - { - error[cc] -= error_inc[cc]; - { - const uint32 mask = (int32)error[cc] >> 31; - g += ginc[cc] & mask; - error[cc] += error_adj[cc] & mask; - } - } - } - - uint32 g; - uint32 intinc; - int32 ginc[3]; - int32 error[3]; - int32 error_inc[3]; - int32 error_adj[3]; -}; - -struct VileTex -{ - INLINE bool Setup(const unsigned length, const int32 tstart, const int32 tend, const int32 sf = 1, const int32 tfudge = 0) - { - int dt = tend - tstart; - unsigned abs_dt = abs(dt); - - t = (tstart * sf) | tfudge; - - tinc = (dt >= 0) ? sf : -sf; - - if(length <= abs_dt) - { - error_inc = (abs_dt + 1) * 2; - error_adj = (length * 2); - error = abs_dt + 1 - (length * 2 + ((dt < 0) ? 1 : 0)); - } - else - { - error_inc = abs_dt * 2; - error_adj = ((length - 1) * 2); - error = length - (length * 2 - ((dt < 0) ? 1 : 0)); - } - - return false; - } - - // - // - // - INLINE bool IncPending(void) { return error >= 0; } - INLINE int32 DoPendingInc(void) { t += tinc; error -= error_adj; return t; } - INLINE void AddError(void) { error += error_inc; } - // - // - // - - INLINE int32 PreStep(void) - { - while(error >= 0) - { - t += tinc; - error -= error_adj; - } - error += error_inc; - - return t; - } - - INLINE int32 Current(void) - { - return t; - } - - int32 t; - int32 tinc; - int32 error; - int32 error_inc; - int32 error_adj; -}; - -// -// -// -template -static INLINE int32 PlotPixel(int32 x, int32 y, uint16 pix, bool transparent, GourauderTheTerrible* g) -{ - static_assert(!MSBOn || (!HalfFGEn && !HalfBGEn), "Table error; sub-optimal template arguments."); - int32 ret = 0; - uint16* fbyptr; - - if(die) - { - fbyptr = &FB[FBDrawWhich][((y >> 1) & 0xFF) << 9]; - transparent |= ((y & 1) != (bool)(FBCR & FBCR_DIL)); - } - else - { - fbyptr = &FB[FBDrawWhich][(y & 0xFF) << 9]; - } - - if(MeshEn) - transparent |= (x ^ y) & 1; - - if(bpp8) - { - if(MSBOn) - { - pix = (fbyptr[((x >> 1) & 0x1FF)] | 0x8000) >> (((x & 1) ^ 1) << 3); - ret += 5; - } - else if(HalfBGEn) - ret += 5; - - if(!transparent) - { - if(bpp8 == 2) // BPP8 + rotated - ne16_wbo_be(fbyptr, (x & 0x1FF) | ((y & 0x100) << 1), pix); - else - ne16_wbo_be(fbyptr, x & 0x3FF, pix); - } - ret++; - } - else - { - uint16* const p = &fbyptr[x & 0x1FF]; - - if(MSBOn) - { - pix = *p | 0x8000; - ret += 5; - } - else - { - if(HalfBGEn) - { - uint16 bg_pix = *p; - ret += 5; - - if(bg_pix & 0x8000) - { - if(HalfFGEn) - { - if(g) - pix = g->Apply(pix); - - pix = ((pix + bg_pix) - ((pix ^ bg_pix) & 0x8421)) >> 1; - } - else - { - if(g) - pix = 0; - else - pix = ((bg_pix & 0x7BDE) >> 1) | (bg_pix & 0x8000); - } - } - else - { - if(HalfFGEn) - { - if(g) - pix = g->Apply(pix); - else - pix = pix; - } - else - { - if(g) - pix = 0; - else - pix = bg_pix; - } - } - } - else - { - if(g) - pix = g->Apply(pix); - - if(HalfFGEn) - pix = ((pix & 0x7BDE) >> 1) | (pix & 0x8000); - } - } - - if(!transparent) - *p = pix; - - ret++; - } - - return ret; -} - - -static INLINE void CheckUndefClipping(void) -{ - if(SysClipX < UserClipX1 || SysClipY < UserClipY1 || UserClipX0 > UserClipX1 || UserClipY0 > UserClipY1) - { - //SS_DBG(SS_DBG_WARNING, "[VDP1] Illegal clipping windows; Sys=%u:%u -- User=%u:%u - %u:%u\n", SysClipX, SysClipY, UserClipX0, UserClipY0, UserClipX1, UserClipY1); - } -} - - -// -// -struct line_vertex -{ - int32 x, y; - uint16 g; - int32 t; -}; - -struct line_data -{ - line_vertex p[2]; - bool PCD; - bool HSS; - uint16 color; - int32 ec_count; - uint32 (MDFN_FASTCALL *tffn)(uint32); - uint16 CLUT[0x10]; - uint32 cb_or; - uint32 tex_base; -}; - -extern line_data LineSetup; - -template -static int32 DrawLine(void) -{ - const uint16 color = LineSetup.color; - line_vertex p0 = LineSetup.p[0]; - line_vertex p1 = LineSetup.p[1]; - int32 ret = 0; - - if(!LineSetup.PCD) - { - // TODO: - // Plain clipping treats system clip X as an unsigned 10-bit quantity... - // Pre-clipping treats system clip X as a signed 13-bit quantity... - // - bool clipped = false; - bool swapped = false; - - ret += 4; - - if(UserClipEn) - { - if(UserClipMode) - { - // not correct: clipped |= (p0.x >= UserClipX0) & (p1.x <= UserClipX1) & (p0.y >= UserClipY0) & (p1.y <= UserClipY1); - clipped |= (p0.x < 0) & (p1.x < 0); - clipped |= (p0.x > SysClipX) & (p1.x > SysClipX); - clipped |= (p0.y < 0) & (p1.y < 0); - clipped |= (p0.y > SysClipY) & (p1.y > SysClipY); - - swapped = (p0.y == p1.y) & ((p0.x < 0) | (p0.x > SysClipX)); - } - else - { - // Ignore system clipping WRT pre-clip for UserClipEn == 1 && UserClipMode == 0 - clipped |= (p0.x < UserClipX0) & (p1.x < UserClipX0); - clipped |= (p0.x > UserClipX1) & (p1.x > UserClipX1); - clipped |= (p0.y < UserClipY0) & (p1.y < UserClipY0); - clipped |= (p0.y > UserClipY1) & (p1.y > UserClipY1); - - swapped = (p0.y == p1.y) & ((p0.x < UserClipX0) | (p0.x > UserClipX1)); - } - } - else - { - clipped |= (p0.x < 0) & (p1.x < 0); - clipped |= (p0.x > SysClipX) & (p1.x > SysClipX); - clipped |= (p0.y < 0) & (p1.y < 0); - clipped |= (p0.y > SysClipY) & (p1.y > SysClipY); - - swapped = (p0.y == p1.y) & ((p0.x < 0) | (p0.x > SysClipX)); - } - - if(clipped) - return ret; - - if(swapped) - std::swap(p0, p1); - } - - ret += 8; - - // - // - const int32 dx = p1.x - p0.x; - const int32 dy = p1.y - p0.y; - const int32 abs_dx = abs(dx); - const int32 abs_dy = abs(dy); - const int32 max_adx_ady = std::max(abs_dx, abs_dy); - int32 x_inc = (dx >= 0) ? 1 : -1; - int32 y_inc = (dy >= 0) ? 1 : -1; - int32 x = p0.x; - int32 y = p0.y; - bool drawn_ac = true; // Drawn all-clipped - uint32 texel; - GourauderTheTerrible g; - VileTex t; - - if(GouraudEn) - g.Setup(max_adx_ady + 1, p0.g, p1.g); - - if(Textured) - { - LineSetup.ec_count = 2; // Call before tffn() - - if(MDFN_UNLIKELY(max_adx_ady < abs(p1.t - p0.t) && LineSetup.HSS)) - { - LineSetup.ec_count = 0x7FFFFFFF; - t.Setup(max_adx_ady + 1, p0.t >> 1, p1.t >> 1, 2, (bool)(FBCR & FBCR_EOS)); - } - else - t.Setup(max_adx_ady + 1, p0.t, p1.t); - - texel = LineSetup.tffn(t.Current()); - } - - #define PSTART \ - bool transparent; \ - uint16 pix; \ - \ - if(Textured) \ - { \ - /*ret++;*/ \ - while(t.IncPending()) \ - { \ - int32 tx = t.DoPendingInc(); \ - \ - /*ret += (bool)t.IncPending();*/ \ - \ - texel = LineSetup.tffn(tx); \ - \ - if(!ECD && MDFN_UNLIKELY(LineSetup.ec_count <= 0)) \ - return ret; \ - } \ - t.AddError(); \ - \ - transparent = (SPD && ECD) ? false : (texel >> 31); \ - pix = texel; \ - } \ - else \ - { \ - pix = color; \ - transparent = !SPD; \ - } - - /* hmm, possible problem with AA and drawn_ac...*/ - #define PBODY(px, py) \ - { \ - bool clipped = ((uint32)px > (uint32)SysClipX) | ((uint32)py > (uint32)SysClipY); \ - \ - if(UserClipEn && !UserClipMode) \ - clipped |= (px < UserClipX0) | (px > UserClipX1) | (py < UserClipY0) | (py > UserClipY1); \ - \ - if(MDFN_UNLIKELY((clipped ^ drawn_ac) & clipped)) \ - return ret; \ - \ - drawn_ac &= clipped; \ - \ - if(UserClipEn && UserClipMode) \ - clipped |= (px >= UserClipX0) & (px <= UserClipX1) & (py >= UserClipY0) & (py <= UserClipY1); \ - \ - ret += PlotPixel(px, py, pix, transparent | clipped, (GouraudEn ? &g : NULL)); \ - } - - #define PEND \ - { \ - if(GouraudEn) \ - g.Step(); \ - } - - - if(abs_dy > abs_dx) - { - int32 error_inc = 2 * abs_dx; - int32 error_adj = -(2 * abs_dy); - int32 error = abs_dy - (2 * abs_dy + (dy >= 0 || AA)); - - y -= y_inc; - - do - { - PSTART; - - y += y_inc; - if(error >= 0) - { - if(AA) - { - int32 aa_x = x, aa_y = y; - - if(y_inc < 0) - { - aa_x += (x_inc >> 31); - aa_y -= (x_inc >> 31); - } - else - { - aa_x -= (~x_inc >> 31); - aa_y += (~x_inc >> 31); - } - - PBODY(aa_x, aa_y); - } - - error += error_adj; - x += x_inc; - } - error += error_inc; - - PBODY(x, y); - - PEND; - } while(MDFN_LIKELY(y != p1.y)); - } - else - { - int32 error_inc = 2 * abs_dy; - int32 error_adj = -(2 * abs_dx); - int32 error = abs_dx - (2 * abs_dx + (dx >= 0 || AA)); - - x -= x_inc; - - do - { - PSTART; - - x += x_inc; - if(error >= 0) - { - if(AA) - { - int32 aa_x = x, aa_y = y; - - if(x_inc < 0) - { - aa_x -= (~y_inc >> 31); - aa_y -= (~y_inc >> 31); - } - else - { - aa_x += (y_inc >> 31); - aa_y += (y_inc >> 31); - } - - PBODY(aa_x, aa_y); - } - - error += error_adj; - y += y_inc; - } - error += error_inc; - - PBODY(x, y); - - PEND; - } while(MDFN_LIKELY(x != p1.x)); - } - - return ret; -} - -template -struct EdgeStepper -{ - INLINE void Setup(const line_vertex& p0, const line_vertex& p1, const int32 dmax) - { - int32 dx = p1.x - p0.x; - int32 dy = p1.y - p0.y; - int32 abs_dx = abs(dx); - int32 abs_dy = abs(dy); - int32 max_adxdy = std::max(abs_dx, abs_dy); - - x = p0.x; - x_inc = (dx >= 0) ? 1 : -1; - x_error = ~(max_adxdy - (2 * max_adxdy + (dy >= 0))); - x_error_inc = 2 * abs_dx; - x_error_adj = 2 * max_adxdy; - - y = p0.y; - y_inc = (dy >= 0) ? 1 : -1; - y_error = ~(max_adxdy - (2 * max_adxdy + (dx >= 0))); - y_error_inc = 2 * abs_dy; - y_error_adj = 2 * max_adxdy; - - d_error = -dmax; - d_error_inc = 2 *max_adxdy; - d_error_adj = 2 * dmax; - - if(gourauden) - g.Setup(max_adxdy + 1, p0.g, p1.g); - } - - INLINE void GetVertex(line_vertex* p) - { - p->x = x; - p->y = y; - - if(gourauden) - p->g = g.Current(); - } - - INLINE void Step(void) - { - uint32 mask; - - d_error += d_error_inc; - if(d_error >= 0) - { - d_error -= d_error_adj; - - x_error -= x_error_inc; - mask = (int32)x_error >> 31; - x += x_inc & mask; - x_error += x_error_adj & mask; - - y_error -= y_error_inc; - mask = (int32)y_error >> 31; - y += y_inc & mask; - y_error += y_error_adj & mask; - - if(gourauden) - g.Step(); - } - } - - int32 d_error, d_error_inc, d_error_adj; - - int32 x, x_inc; - int32 x_error, x_error_inc, x_error_adj; - - int32 y, y_inc; - int32 y_error, y_error_inc, y_error_adj; - - GourauderTheTerrible g; -}; - -// -// -} - -} - - -#endif diff --git a/waterbox/ss/vdp1_line.cpp b/waterbox/ss/vdp1_line.cpp deleted file mode 100644 index 7a3eaa3920..0000000000 --- a/waterbox/ss/vdp1_line.cpp +++ /dev/null @@ -1,130 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp1_line.cpp - VDP1 Line Drawing Commands Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "ss.h" -#include "vdp1.h" -#include "vdp1_common.h" - -namespace MDFN_IEN_SS -{ - -namespace VDP1 -{ - -static int32 (*LineFuncTab[2][3][0x20][8 + 1])(void) = -{ - #define LINEFN_BC(die, bpp8, b, c) \ - DrawLine - - #define LINEFN_B(die, bpp8, b) \ - { \ - LINEFN_BC(die, bpp8, b, 0x0), LINEFN_BC(die, bpp8, b, 0x1), LINEFN_BC(die, bpp8, b, 0x2), LINEFN_BC(die, bpp8, b, 0x3), \ - LINEFN_BC(die, bpp8, b, 0x4), LINEFN_BC(die, bpp8, b, 0x5), LINEFN_BC(die, bpp8, b, 0x6), LINEFN_BC(die, bpp8, b, 0x7), \ - LINEFN_BC(die, bpp8, b, 0x8), /* msb on */ \ - } - - #define LINEFN_BPP8(die, bpp8) \ - { \ - LINEFN_B(die, bpp8, 0x00), LINEFN_B(die, bpp8, 0x01), LINEFN_B(die, bpp8, 0x02), LINEFN_B(die, bpp8, 0x03), \ - LINEFN_B(die, bpp8, 0x04), LINEFN_B(die, bpp8, 0x05), LINEFN_B(die, bpp8, 0x06), LINEFN_B(die, bpp8, 0x07), \ - LINEFN_B(die, bpp8, 0x08), LINEFN_B(die, bpp8, 0x09), LINEFN_B(die, bpp8, 0x0A), LINEFN_B(die, bpp8, 0x0B), \ - LINEFN_B(die, bpp8, 0x0C), LINEFN_B(die, bpp8, 0x0D), LINEFN_B(die, bpp8, 0x0E), LINEFN_B(die, bpp8, 0x0F), \ - \ - LINEFN_B(die, bpp8, 0x10), LINEFN_B(die, bpp8, 0x11), LINEFN_B(die, bpp8, 0x12), LINEFN_B(die, bpp8, 0x13), \ - LINEFN_B(die, bpp8, 0x14), LINEFN_B(die, bpp8, 0x15), LINEFN_B(die, bpp8, 0x16), LINEFN_B(die, bpp8, 0x17), \ - LINEFN_B(die, bpp8, 0x18), LINEFN_B(die, bpp8, 0x19), LINEFN_B(die, bpp8, 0x1A), LINEFN_B(die, bpp8, 0x1B), \ - LINEFN_B(die, bpp8, 0x1C), LINEFN_B(die, bpp8, 0x1D), LINEFN_B(die, bpp8, 0x1E), LINEFN_B(die, bpp8, 0x1F), \ - } - - { - LINEFN_BPP8(false, 0), - LINEFN_BPP8(false, 1), - LINEFN_BPP8(false, 2), - }, - { - LINEFN_BPP8(true, 0), - LINEFN_BPP8(true, 1), - LINEFN_BPP8(true, 2), - } - - - #undef LINEFN_BPP8 - #undef LINEFN_B - #undef LINEFN_BC -}; - -template -static INLINE int32 CMD_Line_Polyline_T(const uint16* cmd_data) -{ - const uint16 mode = cmd_data[0x2]; - int32 ret = 0; - // - // - bool SPD_Opaque = true; // Abusing the SPD bit passed to the line draw function to denote non-transparency when == 1, transparent when == 0. - - LineSetup.tex_base = 0; - LineSetup.color = cmd_data[0x3]; - LineSetup.PCD = mode & 0x800; - - if(((mode >> 3) & 0x7) < 0x6) - SPD_Opaque = (int32)(TexFetchTab[(mode >> 3) & 0x1F](0xFFFFFFFF)) >= 0; - // - // - // - auto* fnptr = LineFuncTab[(bool)(FBCR & FBCR_DIE)][(TVMR & TVMR_8BPP) ? ((TVMR & TVMR_ROTATE) ? 2 : 1) : 0][((mode >> 6) & 0x1E) | SPD_Opaque /*(mode >> 6) & 0x1F*/][(mode & 0x8000) ? 8 : (mode & 0x7)]; - - CheckUndefClipping(); - - for(unsigned n = 0; n < num_lines; n++) - { - LineSetup.p[0].x = sign_x_to_s32(13, cmd_data[0x6 + (((n << 1) + 0) & 0x7)] & 0x1FFF) + LocalX; - LineSetup.p[0].y = sign_x_to_s32(13, cmd_data[0x7 + (((n << 1) + 0) & 0x7)] & 0x1FFF) + LocalY; - LineSetup.p[1].x = sign_x_to_s32(13, cmd_data[0x6 + (((n << 1) + 2) & 0x7)] & 0x1FFF) + LocalX; - LineSetup.p[1].y = sign_x_to_s32(13, cmd_data[0x7 + (((n << 1) + 2) & 0x7)] & 0x1FFF) + LocalY; - - if(mode & 0x4) // Gouraud - { - const uint16* gtb = &VRAM[cmd_data[0xE] << 2]; - - ret += 2; - LineSetup.p[0].g = gtb[(n + 0) & 0x3]; - LineSetup.p[1].g = gtb[(n + 1) & 0x3]; - } - - ret += fnptr(); - } - - return ret; -} - -int32 CMD_Polyline(const uint16* cmd_data) -{ - return CMD_Line_Polyline_T<4>(cmd_data); -} - -int32 CMD_Line(const uint16* cmd_data) -{ - return CMD_Line_Polyline_T<1>(cmd_data); -} - -} - -} diff --git a/waterbox/ss/vdp1_poly.cpp b/waterbox/ss/vdp1_poly.cpp deleted file mode 100644 index bfe5cb6dd6..0000000000 --- a/waterbox/ss/vdp1_poly.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp1_poly.cpp - VDP1 Polygon Drawing Commands Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "ss.h" -#include "vdp1.h" -#include "vdp1_common.h" - -namespace MDFN_IEN_SS -{ - -namespace VDP1 -{ - -static int32 (*LineFuncTab[2][3][0x20][8 + 1])(void) = -{ - #define LINEFN_BC(die, bpp8, b, c) \ - DrawLine - - #define LINEFN_B(die, bpp8, b) \ - { \ - LINEFN_BC(die, bpp8, b, 0x0), LINEFN_BC(die, bpp8, b, 0x1), LINEFN_BC(die, bpp8, b, 0x2), LINEFN_BC(die, bpp8, b, 0x3), \ - LINEFN_BC(die, bpp8, b, 0x4), LINEFN_BC(die, bpp8, b, 0x5), LINEFN_BC(die, bpp8, b, 0x6), LINEFN_BC(die, bpp8, b, 0x7), \ - LINEFN_BC(die, bpp8, b, 0x8), /* msb on */ \ - } - - #define LINEFN_BPP8(die, bpp8) \ - { \ - LINEFN_B(die, bpp8, 0x00), LINEFN_B(die, bpp8, 0x01), LINEFN_B(die, bpp8, 0x02), LINEFN_B(die, bpp8, 0x03), \ - LINEFN_B(die, bpp8, 0x04), LINEFN_B(die, bpp8, 0x05), LINEFN_B(die, bpp8, 0x06), LINEFN_B(die, bpp8, 0x07), \ - LINEFN_B(die, bpp8, 0x08), LINEFN_B(die, bpp8, 0x09), LINEFN_B(die, bpp8, 0x0A), LINEFN_B(die, bpp8, 0x0B), \ - LINEFN_B(die, bpp8, 0x0C), LINEFN_B(die, bpp8, 0x0D), LINEFN_B(die, bpp8, 0x0E), LINEFN_B(die, bpp8, 0x0F), \ - \ - LINEFN_B(die, bpp8, 0x10), LINEFN_B(die, bpp8, 0x11), LINEFN_B(die, bpp8, 0x12), LINEFN_B(die, bpp8, 0x13), \ - LINEFN_B(die, bpp8, 0x14), LINEFN_B(die, bpp8, 0x15), LINEFN_B(die, bpp8, 0x16), LINEFN_B(die, bpp8, 0x17), \ - LINEFN_B(die, bpp8, 0x18), LINEFN_B(die, bpp8, 0x19), LINEFN_B(die, bpp8, 0x1A), LINEFN_B(die, bpp8, 0x1B), \ - LINEFN_B(die, bpp8, 0x1C), LINEFN_B(die, bpp8, 0x1D), LINEFN_B(die, bpp8, 0x1E), LINEFN_B(die, bpp8, 0x1F), \ - } - - { - LINEFN_BPP8(false, 0), - LINEFN_BPP8(false, 1), - LINEFN_BPP8(false, 2), - }, - { - LINEFN_BPP8(true, 0), - LINEFN_BPP8(true, 1), - LINEFN_BPP8(true, 2), - } - - - #undef LINEFN_BPP8 - #undef LINEFN_B - #undef LINEFN_BC -}; - -template -static INLINE int32 CMD_PolygonG_T(const uint16* cmd_data) -{ - const uint16 mode = cmd_data[0x2]; - line_vertex p[4]; - int32 ret = 0; - // - // - bool SPD_Opaque = true; // Abusing the SPD bit passed to the line draw function to denote non-transparency when == 1, transparent when == 0. - - LineSetup.tex_base = 0; - LineSetup.color = cmd_data[0x3]; - LineSetup.PCD = mode & 0x800; - - if(((mode >> 3) & 0x7) < 0x6) - SPD_Opaque = (int32)(TexFetchTab[(mode >> 3) & 0x1F](0xFFFFFFFF)) >= 0; - // - // - // - auto* fnptr = LineFuncTab[(bool)(FBCR & FBCR_DIE)][(TVMR & TVMR_8BPP) ? ((TVMR & TVMR_ROTATE) ? 2 : 1) : 0][((mode >> 6) & 0x1E) | SPD_Opaque /*(mode >> 6) & 0x1F*/][(mode & 0x8000) ? 8 : (mode & 0x7)]; - - CheckUndefClipping(); - - for(unsigned i = 0; i < 4; i++) - { - p[i].x = sign_x_to_s32(13, cmd_data[0x6 + (i << 1)]) + LocalX; - p[i].y = sign_x_to_s32(13, cmd_data[0x7 + (i << 1)]) + LocalY; - } - - if(gourauden) - { - const uint16* gtb = &VRAM[cmd_data[0xE] << 2]; - - ret += 4; - for(unsigned i = 0; i < 4; i++) - p[i].g = gtb[i]; - } - // - // - // - const int32 dmax = std::max(std::max(abs(p[3].x - p[0].x), abs(p[3].y - p[0].y)), - std::max(abs(p[2].x - p[1].x), abs(p[2].y - p[1].y))); - EdgeStepper e[2]; - - e[0].Setup(p[0], p[3], dmax); - e[1].Setup(p[1], p[2], dmax); - - for(int32 i = 0; i <= dmax; i++) - { - e[0].GetVertex(&LineSetup.p[0]); - e[1].GetVertex(&LineSetup.p[1]); - // - //printf("%d:%d -> %d:%d\n", lp[0].x, lp[0].y, lp[1].x, lp[1].y); - ret += fnptr(); - // - e[0].Step(); - e[1].Step(); - } - - return ret; -} - -int32 CMD_Polygon(const uint16* cmd_data) -{ - if(cmd_data[0x2] & 0x4) // gouraud - return CMD_PolygonG_T(cmd_data); - else - return CMD_PolygonG_T(cmd_data); -} - - -} -} diff --git a/waterbox/ss/vdp1_sprite.cpp b/waterbox/ss/vdp1_sprite.cpp deleted file mode 100644 index bb30547aae..0000000000 --- a/waterbox/ss/vdp1_sprite.cpp +++ /dev/null @@ -1,319 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp1_sprite.cpp - VDP1 Sprite Drawing Commands Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#include "ss.h" -#include "vdp1.h" -#include "vdp1_common.h" - -//#pragma GCC optimize("Os,no-crossjumping") - -namespace MDFN_IEN_SS -{ - -namespace VDP1 -{ - -static int32 (*LineFuncTab[2][3][0x20][8 + 1])(void) = -{ - #define LINEFN_BC(die, bpp8, b, c) \ - DrawLine - - #define LINEFN_B(die, bpp8, b) \ - { \ - LINEFN_BC(die, bpp8, b, 0x0), LINEFN_BC(die, bpp8, b, 0x1), LINEFN_BC(die, bpp8, b, 0x2), LINEFN_BC(die, bpp8, b, 0x3), \ - LINEFN_BC(die, bpp8, b, 0x4), LINEFN_BC(die, bpp8, b, 0x5), LINEFN_BC(die, bpp8, b, 0x6), LINEFN_BC(die, bpp8, b, 0x7), \ - LINEFN_BC(die, bpp8, b, 0x8), /* msb on */ \ - } - - #define LINEFN_BPP8(die, bpp8) \ - { \ - LINEFN_B(die, bpp8, 0x00), LINEFN_B(die, bpp8, 0x01), LINEFN_B(die, bpp8, 0x02), LINEFN_B(die, bpp8, 0x03), \ - LINEFN_B(die, bpp8, 0x04), LINEFN_B(die, bpp8, 0x05), LINEFN_B(die, bpp8, 0x06), LINEFN_B(die, bpp8, 0x07), \ - LINEFN_B(die, bpp8, 0x08), LINEFN_B(die, bpp8, 0x09), LINEFN_B(die, bpp8, 0x0A), LINEFN_B(die, bpp8, 0x0B), \ - LINEFN_B(die, bpp8, 0x0C), LINEFN_B(die, bpp8, 0x0D), LINEFN_B(die, bpp8, 0x0E), LINEFN_B(die, bpp8, 0x0F), \ - \ - LINEFN_B(die, bpp8, 0x10), LINEFN_B(die, bpp8, 0x11), LINEFN_B(die, bpp8, 0x12), LINEFN_B(die, bpp8, 0x13), \ - LINEFN_B(die, bpp8, 0x14), LINEFN_B(die, bpp8, 0x15), LINEFN_B(die, bpp8, 0x16), LINEFN_B(die, bpp8, 0x17), \ - LINEFN_B(die, bpp8, 0x18), LINEFN_B(die, bpp8, 0x19), LINEFN_B(die, bpp8, 0x1A), LINEFN_B(die, bpp8, 0x1B), \ - LINEFN_B(die, bpp8, 0x1C), LINEFN_B(die, bpp8, 0x1D), LINEFN_B(die, bpp8, 0x1E), LINEFN_B(die, bpp8, 0x1F), \ - } - - { - LINEFN_BPP8(false, 0), - LINEFN_BPP8(false, 1), - LINEFN_BPP8(false, 2), - }, - { - LINEFN_BPP8(true, 0), - LINEFN_BPP8(true, 1), - LINEFN_BPP8(true, 2), - } - - - #undef LINEFN_BPP8 - #undef LINEFN_B - #undef LINEFN_BC -}; - -/* - Timing notes: - Timing is somewhat complex, and looks like the drawing of the lines of distorted sprites may be terminated - early in some conditions relating to clipping. - - Drawing a 256x1 texture with a 255x1 rectangular distorted sprite takes about twice as much time(even with blending enabled, which is weird...) as drawing - it with a 256x1 or 257x1 rectangular distorted sprite. -*/ -enum -{ - FORMAT_NORMAL, - FORMAT_SCALED, - FORMAT_DISTORTED -}; - -template -static INLINE int32 SpriteBase(const uint16* cmd_data) -{ - const unsigned dir = (cmd_data[0] >> 4) & 0x3; - const uint16 mode = cmd_data[0x2]; - const unsigned cm = (mode >> 3) & 0x7; - const uint16 color = cmd_data[0x3]; - const uint32 w = ((cmd_data[0x5] >> 8) & 0x3F) << 3; - const uint32 h = cmd_data[0x5] & 0xFF; - line_vertex p[4]; - int32 ret = 0; - auto* fnptr = LineFuncTab[(bool)(FBCR & FBCR_DIE)][(TVMR & TVMR_8BPP) ? ((TVMR & TVMR_ROTATE) ? 2 : 1) : 0][(mode >> 6) & 0x1F][(mode & 0x8000) ? 8 : (mode & 0x7)]; - - LineSetup.color = cmd_data[0x3]; - LineSetup.PCD = mode & 0x0800; - LineSetup.HSS = mode & 0x1000; - - CheckUndefClipping(); - - // FIXME: precision is probably not totally right. - if(format == FORMAT_DISTORTED) - { - for(unsigned i = 0; i < 4; i++) - { - p[i].x = sign_x_to_s32(13, cmd_data[0x6 + (i << 1)]) + LocalX; - p[i].y = sign_x_to_s32(13, cmd_data[0x7 + (i << 1)]) + LocalY; - } - //printf("Hrm: %d:%d %d:%d %d:%d %d:%d\n", p[0].x, p[0].y, p[1].x, p[1].y, p[2].x, p[2].y, p[3].x, p[3].y); - } - else if(format == FORMAT_NORMAL) - { - p[0].x = sign_x_to_s32(13, cmd_data[0x6]) + LocalX; - p[0].y = sign_x_to_s32(13, cmd_data[0x7]) + LocalY; - - p[1].x = p[0].x + (std::max(w, 1) - 1); - p[1].y = p[0].y; - - p[2].x = p[1].x; - p[2].y = p[0].y + (std::max(h, 1) - 1); - - p[3].x = p[0].x; - p[3].y = p[2].y; - } - else if(format == FORMAT_SCALED) - { - const unsigned zp = (cmd_data[0] >> 8) & 0xF; - { - int32 zp_x = sign_x_to_s32(13, cmd_data[0x6]); - int32 zp_y = sign_x_to_s32(13, cmd_data[0x7]); - int32 disp_w = sign_x_to_s32(13, cmd_data[0x8]); - int32 disp_h = sign_x_to_s32(13, cmd_data[0x9]); - int32 alt_x = sign_x_to_s32(13, cmd_data[0xA]); - int32 alt_y = sign_x_to_s32(13, cmd_data[0xB]); - - for(unsigned i = 0; i < 4; i++) - { - p[i].x = zp_x; - p[i].y = zp_y; - } - - switch(zp >> 2) - { - case 0x0: - p[2].y = alt_y; - p[3].y = alt_y; - break; - - case 0x1: - p[2].y += disp_h; - p[3].y += disp_h; - break; - - case 0x2: - p[0].y -= disp_h >> 1; - p[1].y -= disp_h >> 1; - p[2].y += (disp_h + 1) >> 1; - p[3].y += (disp_h + 1) >> 1; - break; - - case 0x3: - p[0].y -= disp_h; - p[1].y -= disp_h; - break; - } - - switch(zp & 0x3) - { - case 0x0: - p[1].x = alt_x; - p[2].x = alt_x; - break; - - case 0x1: - p[1].x += disp_w; - p[2].x += disp_w; - break; - - case 0x2: - p[0].x -= disp_w >> 1; - p[1].x += (disp_w + 1) >> 1; - p[2].x += (disp_w + 1) >> 1; - p[3].x -= disp_w >> 1; - break; - - case 0x3: - p[0].x -= disp_w; - p[3].x -= disp_w; - break; - } - - for(unsigned i = 0; i < 4; i++) - { - p[i].x += LocalX; - p[i].y += LocalY; - } - } - } - - if(gourauden) - { - const uint16* gtb = &VRAM[cmd_data[0xE] << 2]; - - ret += 4; - for(unsigned i = 0; i < 4; i++) - p[i].g = gtb[i]; - } - // - // - // - VileTex big_t; - int32 tex_base; - - LineSetup.tffn = TexFetchTab[(mode >> 3) & 0x1F]; - - { - const bool h_inv = dir & 1; - - LineSetup.p[0 ^ h_inv].t = 0; - LineSetup.p[1 ^ h_inv].t = w ? (w - 1) : 0; - } - - switch(cm) - { - case 0: LineSetup.cb_or = color &~ 0xF; - break; - - case 1: - for(unsigned i = 0; i < 16; i++) - LineSetup.CLUT[i] = VRAM[((color &~ 0x3) << 2) | i]; - - ret += 16; - break; - - case 2: LineSetup.cb_or = color &~ 0x3F; break; - case 3: LineSetup.cb_or = color &~ 0x7F; break; - case 4: LineSetup.cb_or = color &~ 0xFF; break; - case 5: break; - case 6: break; - case 7: break; - } - // - // - // - const int32 dmax = std::max(std::max(abs(p[3].x - p[0].x), abs(p[3].y - p[0].y)), - std::max(abs(p[2].x - p[1].x), abs(p[2].y - p[1].y))); - EdgeStepper e[2]; - - e[0].Setup(p[0], p[3], dmax); - e[1].Setup(p[1], p[2], dmax); - - tex_base = cmd_data[0x4] << 2; - if(cm == 5) // RGB - tex_base &= ~0x7; - - { - const bool v_inv = dir & 2; - int32 tv[2]; - - tv[0 ^ v_inv] = 0; - tv[1 ^ v_inv] = h ? (h - 1) : 0; - - big_t.Setup(dmax + 1, tv[0], tv[1], w >> spr_w_shift_tab[cm]); - } - - for(int32 i = 0; i <= dmax; i++) - { - e[0].GetVertex(&LineSetup.p[0]); - e[1].GetVertex(&LineSetup.p[1]); - - LineSetup.tex_base = tex_base + big_t.PreStep(); - // - //printf("%d:%d -> %d:%d\n", lp[0].x, lp[0].y, lp[1].x, lp[1].y); - ret += fnptr(); - // - e[0].Step(); - e[1].Step(); - } - - return ret; -} - -int32 CMD_DistortedSprite(const uint16* cmd_data) -{ - if(cmd_data[0x2] & 0x4) // gouraud - return SpriteBase(cmd_data); - else - return SpriteBase(cmd_data); -} - - -int32 CMD_NormalSprite(const uint16* cmd_data) -{ - if(cmd_data[0x2] & 0x4) // gouraud - return SpriteBase(cmd_data); - else - return SpriteBase(cmd_data); -} - -int32 CMD_ScaledSprite(const uint16* cmd_data) -{ - if(cmd_data[0x2] & 0x4) // gouraud - return SpriteBase(cmd_data); - else - return SpriteBase(cmd_data); -} - - -} -} diff --git a/waterbox/ss/vdp2.cpp b/waterbox/ss/vdp2.cpp deleted file mode 100644 index 298f1bae1e..0000000000 --- a/waterbox/ss/vdp2.cpp +++ /dev/null @@ -1,930 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp2.cpp - VDP2 Emulation -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// TODO: Emulate brokenness(missing vblank) that occurs when switching from 240-height mode to 224-height mode around lines 224-239. - -// TODO: Update output signals on Reset()? Might have to call VDP2::Reset() before other _Reset() then...and take special care in the -// SMPC clock change code. - -#include "ss.h" -#include "vdp1.h" -#include "vdp2.h" -#include "scu.h" -#include "smpc.h" - -#include "vdp2_common.h" -#include "vdp2_render.h" - -namespace MDFN_IEN_SS -{ - -namespace VDP2 -{ - -static bool PAL; -static sscpu_timestamp_t lastts; -// -// -// -static uint16 RawRegs[0x100]; // For debugging - -static bool DisplayOn; -static bool BorderMode; -static bool ExLatchEnable; -static bool ExSyncEnable; -static bool ExBGEnable; -static bool DispAreaSelect; - -static bool VRAMSize; - -static uint8 HRes, VRes; -static uint8 InterlaceMode; -enum { IM_NONE, IM_ILLEGAL, IM_SINGLE, IM_DOUBLE }; - -static uint16 RAMCTL_Raw; -static uint8 CRAM_Mode; -enum -{ - CRAM_MODE_RGB555_1024 = 0, - CRAM_MODE_RGB555_2048 = 1, - CRAM_MODE_RGB888_1024 = 2, - CRAM_MODE_ILLEGAL = 3 -}; - -static uint16 BGON; -static uint8 VCPRegs[4][8]; -static uint32 VRAMPenalty[4]; - -static uint32 RPTA; -static uint8 RPRCTL[2]; -static uint8 KTAOF[2]; - -static uint16 VRAM[262144]; - -static uint16 CRAM[2048]; - -static struct -{ - // Signed values are stored sign-extended to the full 32 bits. - int32 Xst, Yst, Zst; // 1.12.10 - int32 DXst, DYst; // 1. 2.10 - int32 DX, DY; // 1. 2.10 - int32 RotMatrix[6]; // 1. 3.10 - int32 Px, Py, Pz; // 1.13. 0 - int32 Cx, Cy, Cz; // 1.13. 0 - int32 Mx, My; // 1.13.10 - int32 kx, ky; // 1. 7.16 - - uint32 KAst; // 0.16.10 - uint32 DKAst; // 1. 9.10 - uint32 DKAx; // 1. 9.10 - // - // - // - uint32 XstAccum, YstAccum; // 1.12.10 (sorta) - uint32 KAstAccum; // .10 -} RotParams[2]; - -static void FetchRotParams(const bool field) -{ - uint32 a = RPTA & 0x7FFBE; - - for(unsigned i = 0; i < 2; i++) - { - auto& rp = RotParams[i]; - - rp.Xst = sign_x_to_s32(23, ne16_rbo_be(VRAM, ((a + 0x00) & 0x3FFFF) << 1) >> 6); - rp.Yst = sign_x_to_s32(23, ne16_rbo_be(VRAM, ((a + 0x02) & 0x3FFFF) << 1) >> 6); - rp.Zst = sign_x_to_s32(23, ne16_rbo_be(VRAM, ((a + 0x04) & 0x3FFFF) << 1) >> 6); - - rp.DXst = sign_x_to_s32(13, ne16_rbo_be(VRAM, ((a + 0x06) & 0x3FFFF) << 1) >> 6); - rp.DYst = sign_x_to_s32(13, ne16_rbo_be(VRAM, ((a + 0x08) & 0x3FFFF) << 1) >> 6); - - rp.DX = sign_x_to_s32(13, ne16_rbo_be(VRAM, ((a + 0x0A) & 0x3FFFF) << 1) >> 6); - rp.DY = sign_x_to_s32(13, ne16_rbo_be(VRAM, ((a + 0x0C) & 0x3FFFF) << 1) >> 6); - - for(unsigned m = 0; m < 6; m++) - { - rp.RotMatrix[m] = sign_x_to_s32(14, ne16_rbo_be(VRAM, ((a + 0x0E + (m << 1)) & 0x3FFFF) << 1) >> 6); - } - - rp.Px = sign_x_to_s32(14, VRAM[(a + 0x1A) & 0x3FFFF]); - rp.Py = sign_x_to_s32(14, VRAM[(a + 0x1B) & 0x3FFFF]); - rp.Pz = sign_x_to_s32(14, VRAM[(a + 0x1C) & 0x3FFFF]); - - rp.Cx = sign_x_to_s32(14, VRAM[(a + 0x1E) & 0x3FFFF]); - rp.Cy = sign_x_to_s32(14, VRAM[(a + 0x1F) & 0x3FFFF]); - rp.Cz = sign_x_to_s32(14, VRAM[(a + 0x20) & 0x3FFFF]); - - rp.Mx = sign_x_to_s32(24, ne16_rbo_be(VRAM, ((a + 0x22) & 0x3FFFF) << 1) >> 6); - rp.My = sign_x_to_s32(24, ne16_rbo_be(VRAM, ((a + 0x24) & 0x3FFFF) << 1) >> 6); - - rp.kx = sign_x_to_s32(24, ne16_rbo_be(VRAM, ((a + 0x26) & 0x3FFFF) << 1)); - rp.ky = sign_x_to_s32(24, ne16_rbo_be(VRAM, ((a + 0x28) & 0x3FFFF) << 1)); - - rp.KAst = ne16_rbo_be(VRAM, ((a + 0x2A) & 0x3FFFF) << 1) >> 6; - rp.DKAst = sign_x_to_s32(20, ne16_rbo_be(VRAM, ((a + 0x2C) & 0x3FFFF) << 1) >> 6); - rp.DKAx = sign_x_to_s32(20, ne16_rbo_be(VRAM, ((a + 0x2E) & 0x3FFFF) << 1) >> 6); - - a += 0x40; - // - // Interlace mode doesn't seem to affect operation? - // - // const bool imft = (InterlaceMode == IM_DOUBLE && field); - - if(RPRCTL[i] & 0x01) - rp.XstAccum = rp.Xst; // + rp.DXst * imft; - else - rp.XstAccum += rp.DXst; // << (InterlaceMode == IM_DOUBLE); - - if(RPRCTL[i] & 0x02) - rp.YstAccum = rp.Yst; // + rp.DYst * imft; - else - rp.YstAccum += rp.DYst; // << (InterlaceMode == IM_DOUBLE); - - if(RPRCTL[i] & 0x04) - rp.KAstAccum = (KTAOF[i] << 26) + rp.KAst; // + rp.DKAst * imft; - else - rp.KAstAccum += rp.DKAst; // << (InterlaceMode == IM_DOUBLE); - } -} - -enum -{ - VPHASE_ACTIVE = 0, - - VPHASE_BOTTOM_BORDER, - VPHASE_BOTTOM_BLANKING, - - VPHASE_VSYNC, - - VPHASE_TOP_BLANKING, - VPHASE_TOP_BORDER, - - VPHASE__COUNT -}; - -static const int32 VTimings[2][4][VPHASE__COUNT] = // End lines -{ - { // NTSC: - { 0x0E0, 0xE8, 0xED, 0xF0, 0x0FF, 0x107 }, - { 0x0F0, 0xF0, 0xF5, 0xF8, 0x107, 0x107 }, - { 0x0E0, 0xE8, 0xED, 0xF0, 0x0FF, 0x107 }, - { 0x0F0, 0xF0, 0xF5, 0xF8, 0x107, 0x107 }, - }, - { // PAL: - // btm brdr begin, btm blnk begin, vsync begin, /***/ top blnk begin, top brdr begin, total - { 0x0E0, 0x100, 0x103, /***/ 0x103 + 3/*?*/, 0x119, 0x139 }, - { 0x0F0, 0x108, 0x10B, /***/ 0x10B + 3/*?*/, 0x121, 0x139 }, - { 0x100, 0x110, 0x113, /***/ 0x113 + 3/*?*/, 0x129, 0x139 }, - { 0x100, 0x110, 0x113, /***/ 0x113 + 3/*?*/, 0x129, 0x139 }, - }, -}; - -static bool Out_VB; // VB output signal - -static uint32 VPhase; -/*static*/ int32 VCounter; -static bool InternalVB; -static bool Odd; -// -static int SurfInterlaceField; -// -// -// - - -// (No 0) 8 accesses, No split: 0 added cycles -// (No 4) 4 accesses, No split: 1 added cycles -// (No 6) 2 accesses, No split: 2 added cycles -// (No 7) 1 accesses, No split: 3, Split: 3.51? added cycles -// (No 8) 0 accesses, No split: 4, Split: 5.34? added cycles -static INLINE void RecalcVRAMPenalty(void) -{ - if(InternalVB) - VRAMPenalty[0] = VRAMPenalty[1] = VRAMPenalty[2] = VRAMPenalty[3] = 0; - else - { - const unsigned VRAM_Mode = (RAMCTL_Raw >> 8) & 0x3; - const unsigned RDBS_Mode = (RAMCTL_Raw & 0xFF); - const size_t sh = ((HRes & 0x6) ? 0 : 4); - uint8 vcp_type_penalty[0x10]; - - for(unsigned vcp_type = 0; vcp_type < 0x10; vcp_type++) - { - bool penalty; - - if((vcp_type < 0x8) || vcp_type == 0xC || vcp_type == 0xD) - penalty = (bool)(BGON & (1U << (vcp_type & 0x3))); - else - penalty = false; - - vcp_type_penalty[vcp_type] = penalty; - } - - for(unsigned bank = 0; bank < 4; bank++) - { - const unsigned esb = bank & (2 | ((VRAM_Mode >> (bank >> 1)) & 1)); - const uint8 rdbs = (RDBS_Mode >> (esb << 1)) & 0x3; - uint32 tmp = 0; - - if(BGON & 0x20) - { - if(bank >= 2 || ((BGON & 0x10) && rdbs != RDBS_UNUSED)) - tmp = 8; - } - else - { - if((BGON & 0x10) && rdbs != RDBS_UNUSED) - tmp = 8; - else if(BGON & 0x0F) - { - tmp += vcp_type_penalty[VCPRegs[esb][0]]; - tmp += vcp_type_penalty[VCPRegs[esb][1]]; - tmp += vcp_type_penalty[VCPRegs[esb][2]]; - tmp += vcp_type_penalty[VCPRegs[esb][3]]; - - tmp += vcp_type_penalty[VCPRegs[esb][sh + 0]]; - tmp += vcp_type_penalty[VCPRegs[esb][sh + 1]]; - tmp += vcp_type_penalty[VCPRegs[esb][sh + 2]]; - tmp += vcp_type_penalty[VCPRegs[esb][sh + 3]]; - } - } - - static const uint8 tab[9] = { 0, 0, 0, 0, 1, 1, 2, 3, 4 }; - VRAMPenalty[bank] = tab[tmp]; - //printf("%d, %d\n", bank, tmp); - } - } -} - -enum -{ - HPHASE_ACTIVE = 0, - - HPHASE_RIGHT_BORDER, - HPHASE_HSYNC, - - // ... ? ? ? - - HPHASE__COUNT -}; - -static const int32 HTimings[2][HPHASE__COUNT] = -{ - { 0x140, 0x15B, 0x1AB }, - { 0x160, 0x177, 0x1C7 }, -}; - -static uint32 HPhase; -/*static*/ int32 HCounter; - -static uint16 Latched_VCNT, Latched_HCNT; -static bool HVIsExLatched; - -static void LatchHV(void) -{ - { - unsigned vtmp; - - if(VPhase >= VPHASE_VSYNC) - vtmp = VCounter + (0x200 - VTimings[PAL][VRes][VPHASE__COUNT - 1]); - else - vtmp = VCounter; - - if(InterlaceMode == IM_DOUBLE) - vtmp = (vtmp << 1) | !Odd; - - Latched_VCNT = vtmp; - } - - if(HPhase >= HPHASE_HSYNC) - Latched_HCNT = (HCounter + (0x200 - HTimings[HRes & 1][HPHASE__COUNT - 1])) << 1; - else - Latched_HCNT = HCounter << 1; - - //HVIsLatched = true; // Only on external signal-induced latching? -} -// -// -void StartFrame(EmulateSpecStruct* espec, const bool clock28m) -{ - //printf("StartFrame: %d\n", SurfInterlaceField); - VDP2REND_StartFrame(espec, clock28m, SurfInterlaceField); -} - -// -// -static INLINE void IncVCounter(const sscpu_timestamp_t event_timestamp) -{ - VCounter = (VCounter + 1) & 0x1FF; - - if(VCounter == (VTimings[PAL][VRes][VPHASE__COUNT - 1] - 1)) - Out_VB = false; - - // - 1, so the CPU loop will have plenty of time to exit before we reach non-hblank top border area - // (exit granularity could be large if program is executing from SCSP RAM space, for example). - if(VCounter == (VTimings[PAL][VRes][VPHASE_TOP_BLANKING] - 1)) - { -#if 0 - for(unsigned bank = 0; bank < 4; bank++) - { - printf("Bank %d: ", bank); - for(unsigned vc = 0; vc < 8; vc++) - printf("%01x ", VCPRegs[bank][vc]); - printf("\n"); - } -#endif - - SS_RequestMLExit(); - VDP2REND_EndFrame(); - //printf("Meow: %d\n", VCounter); - } - - while(VCounter >= VTimings[PAL][VRes][VPhase] - ((VPhase == VPHASE_VSYNC - 1) && InterlaceMode)) - { - VPhase++; - - if(VPhase == VPHASE__COUNT) - { - VPhase = 0; - VCounter -= VTimings[PAL][VRes][VPHASE__COUNT - 1]; - } - - if(VPhase == VPHASE_ACTIVE) - InternalVB = !DisplayOn; - else if(VPhase == VPHASE_BOTTOM_BORDER) - { - SS_SetEventNT(&events[SS_EVENT_MIDSYNC], event_timestamp + 1); - InternalVB = true; - Out_VB = true; - } - else if(VPhase == VPHASE_VSYNC) - { - if(InterlaceMode) - { - Odd = !Odd; - VCounter += Odd; - SurfInterlaceField = !Odd; - } - else - { - SurfInterlaceField = -1; - Odd = true; - } - } - } - - RecalcVRAMPenalty(); - - SMPC_SetVB(event_timestamp, Out_VB); -} - -static INLINE int32 AddHCounter(const sscpu_timestamp_t event_timestamp, int32 count) -{ - HCounter += count; - - //if(HCounter > HTimings[HRes & 1][HPhase]) - // printf("VDP2 oops: %d %d\n", HCounter, HTimings[HRes & 1][HPhase]); - - while(HCounter >= HTimings[HRes & 1][HPhase]) - { - HPhase++; - - if(HPhase == HPHASE__COUNT) - { - HPhase = 0; - HCounter -= HTimings[HRes & 1][HPHASE__COUNT - 1]; - } - // - // - // - if(HPhase == HPHASE_ACTIVE) - { - if(VPhase == VPHASE_ACTIVE) - { - VDP2Rend_LIB* lib = VDP2REND_GetLIB(VCounter); - - if(!InternalVB) - { - if(BGON & 0x30) - { - if(VCounter == 0) - RPRCTL[0] = RPRCTL[1] = 0x07; - FetchRotParams(false/*field*/); - RPRCTL[0] = RPRCTL[1] = 0; - } - - for(unsigned i = 0; i < 2; i++) - { - auto const& rp = RotParams[i]; - auto& r = lib->rv[i]; - - r.Xsp = ((int64)rp.RotMatrix[0] * ((int32)rp.XstAccum - (rp.Px * 1024)) + - (int64)rp.RotMatrix[1] * ((int32)rp.YstAccum - (rp.Py * 1024)) + - (int64)rp.RotMatrix[2] * (rp.Zst - (rp.Pz * 1024))) >> 10; - r.Ysp = ((int64)rp.RotMatrix[3] * ((int32)rp.XstAccum - (rp.Px * 1024)) + - (int64)rp.RotMatrix[4] * ((int32)rp.YstAccum - (rp.Py * 1024)) + - (int64)rp.RotMatrix[5] * (rp.Zst - (rp.Pz * 1024))) >> 10; - - r.Xp = rp.RotMatrix[0] * (rp.Px - rp.Cx) + - rp.RotMatrix[1] * (rp.Py - rp.Cy) + - rp.RotMatrix[2] * (rp.Pz - rp.Cz) + - (rp.Cx * 1024) + rp.Mx; - - r.Yp = rp.RotMatrix[3] * (rp.Px - rp.Cx) + - rp.RotMatrix[4] * (rp.Py - rp.Cy) + - rp.RotMatrix[5] * (rp.Pz - rp.Cz) + - (rp.Cy * 1024) + rp.My; - - r.dX = (rp.RotMatrix[0] * rp.DX + rp.RotMatrix[1] * rp.DY) >> 10; - r.dY = (rp.RotMatrix[3] * rp.DX + rp.RotMatrix[4] * rp.DY) >> 10; - - r.kx = rp.kx; - r.ky = rp.ky; - - r.KAstAccum = rp.KAstAccum; - r.DKAx = rp.DKAx; - } - } - //printf("%d, 0x%08x(%f) 0x%08x(%f)\n", VCounter, RotParams[0].KAstAccum >> 10, (int32)RotParams[0].DKAst / 1024.0, RotParams[1].KAstAccum >> 10, (int32)RotParams[1].DKAst / 1024.0); - //printf("DL: %d\n", VCounter); - lib->vdp1_hires8 = VDP1::GetLine(VCounter, lib->vdp1_line, (HRes & 1) ? 352 : 320, (int32)RotParams[0].XstAccum >> 1, (int32)RotParams[0].YstAccum >> 1, (int32)RotParams[0].DX >> 1, (int32)RotParams[0].DY >> 1); // Always call, has side effects. - VDP2REND_DrawLine(InternalVB ? -1 : VCounter, !Odd); - } - else if(VPhase == VPHASE_TOP_BORDER || VPhase == VPHASE_BOTTOM_BORDER) - VDP2REND_DrawLine(-1, !Odd); - } - else if(HPhase == HPHASE_HSYNC) - { - IncVCounter(event_timestamp); - } - } - - return (HTimings[HRes & 1][HPhase] - HCounter); -} - -sscpu_timestamp_t Update(sscpu_timestamp_t timestamp) -{ - int32 clocks = (timestamp - lastts) >> 2; - - if(MDFN_UNLIKELY(timestamp < lastts)) - { - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP2, "[VDP2] [BUG] timestamp(%d) < lastts(%d)", timestamp, lastts); - clocks = 0; - } - - lastts += clocks << 2; - // - // - int32 ne; - int32 tmp; - - ne = AddHCounter(timestamp, clocks); - VDP1::SetHBVB(timestamp, HPhase > HPHASE_ACTIVE, Out_VB); - tmp = SCU_SetHBVB(clocks, HPhase > HPHASE_ACTIVE, Out_VB); - if(tmp < ne) - ne = tmp; - - return lastts + (ne << 2); -} - -// -// Register writes seem to always be 16-bit -// -static INLINE void RegsWrite(uint32 A, uint16 V) -{ - A &= 0x1FE; - - RawRegs[A >> 1] = V; - - SS_DBGTI(SS_DBG_VDP2_REGW, "[VDP2] Register write 0x%03x: 0x%04x", A, V); - - switch(A) - { - default: -// SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP2, "[VDP2] Unknown write to register at 0x%08x of value 0x%04x", A, V); - break; - - case 0x00: - Update(SH7095_mem_timestamp); - // - DisplayOn = (V >> 15) & 0x1; - BorderMode = (V >> 8) & 0x1; - InterlaceMode = (V >> 6) & 0x3; - VRes = (V >> 4) & 0x3; - HRes = (V >> 0) & 0x7; - // - InternalVB |= !DisplayOn; - // - SS_SetEventNT(&events[SS_EVENT_VDP2], Update(SH7095_mem_timestamp)); - break; - - case 0x02: - ExLatchEnable = (V >> 9) & 0x1; - ExSyncEnable = (V >> 8) & 0x1; - - DispAreaSelect = (V >> 1) & 0x1; - ExBGEnable = (V >> 0) & 0x1; - break; - - case 0x06: - VRAMSize = (V >> 15) & 0x1; - - if(VRAMSize) - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP2, "[VDP2] VRAMSize=%d (unemulated)", VRAMSize); - break; - - case 0x0E: - RAMCTL_Raw = V & 0xB3FF; - CRAM_Mode = (V >> 12) & 0x3; - break; - - case 0x10: - case 0x12: - case 0x14: - case 0x16: - case 0x18: - case 0x1A: - case 0x1C: - case 0x1E: - { - uint8* const b = &VCPRegs[(A >> 2) & 3][(A & 0x2) << 1]; - b[0] = (V >> 12) & 0xF; - b[1] = (V >> 8) & 0xF; - b[2] = (V >> 4) & 0xF; - b[3] = (V >> 0) & 0xF; - } - break; - - case 0x20: - BGON = V & 0x1F3F; - break; - - case 0xB2: - RPRCTL[0] = (V >> 0) & 0x7; - RPRCTL[1] = (V >> 8) & 0x7; - break; - - case 0xB6: - KTAOF[0] = (V >> 0) & 0x7; - KTAOF[1] = (V >> 8) & 0x7; - break; - - case 0xBC: - RPTA = (RPTA & 0xFFFF) | ((V & 0x7) << 16); - break; - - case 0xBE: - RPTA = (RPTA & ~0xFFFF) | (V & 0xFFFE); - break; - } -} - -static INLINE uint16 RegsRead(uint32 A) -{ - switch(A & 0x1FE) - { - default: - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP2, "[VDP2] Unknown read from 0x%08x", A); - return 0; - - case 0x00: - return (DisplayOn << 15) | (BorderMode << 8) | (InterlaceMode << 6) | (VRes << 4) | (HRes << 0); - - case 0x02: - if(!ExLatchEnable) - { - SS_SetEventNT(&events[SS_EVENT_VDP2], Update(SH7095_mem_timestamp)); - LatchHV(); - } - return (ExLatchEnable << 9) | (ExSyncEnable << 8) | (DispAreaSelect << 1) | (ExBGEnable << 0); - - case 0x04: - SS_SetEventNT(&events[SS_EVENT_VDP2], Update(SH7095_mem_timestamp)); - { - // TODO: EXSYFG - uint16 ret = (HVIsExLatched << 9) | (InternalVB << 3) | ((HPhase > HPHASE_ACTIVE) << 2) | (Odd << 1) | (PAL << 0); - - HVIsExLatched = false; - - return ret; - } - - case 0x06: - return VRAMSize << 15; - - case 0x08: - return Latched_HCNT; - - case 0x0A: - return Latched_VCNT; - - case 0x0E: - return RAMCTL_Raw; - } -} - -template -static INLINE uint32 RW(uint32 A, uint16* DB) -{ - static_assert(IsWrite || sizeof(T) == 2, "Wrong type for read."); - - A &= 0x1FFFFF; - - // - // VRAM - // - if(A < 0x100000) - { - const size_t vri = (A & 0x7FFFF) >> 1; - - if(IsWrite) - { - const unsigned mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF00 >> ((A & 1) << 3)); - - VRAM[vri] = (VRAM[vri] &~ mask) | (*DB & mask); - } - else - *DB = VRAM[vri]; - - return VRAMPenalty[vri >> 16]; - } - - // - // CRAM - // - if(A < 0x180000) - { - const unsigned cri = (A & 0xFFF) >> 1; - - if(IsWrite) - { - switch(CRAM_Mode) - { - case CRAM_MODE_RGB555_1024: - (CRAM + 0x000)[cri & 0x3FF] = *DB; - (CRAM + 0x400)[cri & 0x3FF] = *DB; - break; - - case CRAM_MODE_RGB555_2048: - CRAM[cri] = *DB; - break; - - case CRAM_MODE_RGB888_1024: - case CRAM_MODE_ILLEGAL: - default: - CRAM[((cri >> 1) & 0x3FF) | ((cri & 1) << 10)] = *DB; - break; - } - } - else - { - switch(CRAM_Mode) - { - case CRAM_MODE_RGB555_1024: - case CRAM_MODE_RGB555_2048: - *DB = CRAM[cri]; - break; - - case CRAM_MODE_RGB888_1024: - case CRAM_MODE_ILLEGAL: - default: - *DB = CRAM[((cri >> 1) & 0x3FF) | ((cri & 1) << 10)]; - break; - } - } - - return 0; - } - - // - // Registers - // - if(A < 0x1C0000) - { - if(IsWrite) - { - if(sizeof(T) == 1) - SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP2, "[VDP2] Byte-write to register at 0x%08x(DB=0x%04x)", A, *DB); - - RegsWrite(A, *DB); - } - else - *DB = RegsRead(A); - - return 0; - } - - if(IsWrite) - { - //SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP2, "[VDP2] Unknown %zu-byte write to 0x%08x(DB=0x%04x)", sizeof(T), A, *DB); - } - else - { - //SS_DBGTI(SS_DBG_WARNING | SS_DBG_VDP2, "[VDP2] Unknown %zu-byte read from 0x%08x", sizeof(T), A); - *DB = 0; - } - - return 0; -} - -uint16 Read16_DB(uint32 A) -{ - uint16 DB; - - RW(A, &DB); - - return DB; -} - - -uint32 Write8_DB(uint32 A, uint16 DB) -{ - VDP2REND_Write8_DB(A, DB); - - return RW(A, &DB); -} - -uint32 Write16_DB(uint32 A, uint16 DB) -{ - VDP2REND_Write16_DB(A, DB); - - return RW(A, &DB); -} - - -// -// -// - -void AdjustTS(const int32 delta) -{ - lastts += delta; -} - - -void Init(const bool IsPAL) -{ - SurfInterlaceField = -1; - PAL = IsPAL; - lastts = 0; - - SS_SetPhysMemMap(0x05E00000, 0x05EFFFFF, VRAM, 0x80000, true); - AddMemoryDomain("VDP2 Ram", VRAM, sizeof(VRAM), MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); - AddMemoryDomain("VDP2 CRam", CRAM, sizeof(CRAM), MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_YUGEENDIAN | MEMORYAREA_FLAGS_WORDSIZE2); - - VDP2REND_Init(IsPAL); -} - -void Reset(bool powering_up) -{ - DisplayOn = false; - BorderMode = false; - ExLatchEnable = false; - ExSyncEnable = false; - ExBGEnable = false; - DispAreaSelect = false; - HRes = 0; - VRes = 0; - InterlaceMode = 0; - - VRAMSize = 0; - - InternalVB = true; - Out_VB = false; - VPhase = VPHASE_ACTIVE; - VCounter = 0; - Odd = true; - - RAMCTL_Raw = 0; - CRAM_Mode = 0; - - BGON = 0; - - memset(VCPRegs, 0, sizeof(VCPRegs)); - - for(unsigned i = 0; i < 2; i++) - { - KTAOF[i] = 0; - RPRCTL[i] = 0; - } - RPTA = 0; - memset(RotParams, 0, sizeof(RotParams)); - - // - // FIXME(init values), also in VDP2REND. - if(powering_up) - { - memset(VRAM, 0, sizeof(VRAM)); - memset(CRAM, 0, sizeof(CRAM)); - } - // - RecalcVRAMPenalty(); - // - // - VDP2REND_Reset(powering_up); -} - -// -// -// -// -uint32 GetRegister(const unsigned id, char* const special, const uint32 special_len) -{ - uint32 ret = 0xDEADBEEF; - - switch(id) - { - case GSREG_LINE: - ret = VCounter; - break; - - case GSREG_DON: - ret = DisplayOn; - break; - - case GSREG_BM: - ret = BorderMode; - break; - - case GSREG_IM: - ret = InterlaceMode; - break; - - case GSREG_VRES: - ret = VRes; - break; - - case GSREG_HRES: - ret = HRes; - break; - } - - return ret; -} - -void SetRegister(const unsigned id, const uint32 value) -{ - -} - -uint8 PeekVRAM(const uint32 addr) -{ - return ne16_rbo_be(VRAM, addr & 0x7FFFF); -} - -void PokeVRAM(const uint32 addr, const uint8 val) -{ - ne16_wbo_be(VRAM, addr & 0x7FFFF, val); - //VDP2REND_Write8_DB(addr, val << (((A & 1) ^ 1) << 3)); -} - -void SetLayerEnableMask(uint64 mask) -{ - VDP2REND_SetLayerEnableMask(mask); -} - -/*void MakeDump(const std::string& path) -{ - FileStream fp(path, FileStream::MODE_WRITE); - - fp.print_format(" { "); - for(unsigned i = 0; i < 0x100; i++) - fp.print_format("0x%04x, ", RawRegs[i]); - fp.print_format(" }, \n"); - - fp.print_format(" { "); - for(unsigned i = 0; i < 2048; i++) - fp.print_format("0x%04x, ", CRAM[i]); - fp.print_format(" }, \n"); - - fp.print_format(" { "); - for(unsigned i = 0; i < 0x40000; i++) - fp.print_format("0x%04x, ", VRAM[i]); - fp.print_format(" }, \n"); - - fp.close(); -}*/ - -} - -} diff --git a/waterbox/ss/vdp2.h b/waterbox/ss/vdp2.h deleted file mode 100644 index 793fe1a90a..0000000000 --- a/waterbox/ss/vdp2.h +++ /dev/null @@ -1,69 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp2.h: -** Copyright (C) 2015-2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_VDP2_H -#define __MDFN_SS_VDP2_H - -namespace MDFN_IEN_SS -{ -namespace VDP2 -{ - -uint32 Write8_DB(uint32 A, uint16 DB) MDFN_HOT; -uint32 Write16_DB(uint32 A, uint16 DB) MDFN_HOT; -uint16 Read16_DB(uint32 A) MDFN_HOT; - -void Init(const bool IsPAL) MDFN_COLD; - -void Reset(bool powering_up) MDFN_COLD; -void SetLayerEnableMask(uint64 mask) MDFN_COLD; - -sscpu_timestamp_t Update(sscpu_timestamp_t timestamp); -void AdjustTS(const int32 delta); - -void StartFrame(EmulateSpecStruct* espec, const bool clock28m); - -INLINE bool GetVBOut(void) { extern bool VBOut; return VBOut; } -INLINE bool GetHBOut(void) { extern bool HBOut; return HBOut; } - -// -// -enum -{ - GSREG_LINE = 0, - GSREG_DON, - GSREG_BM, - GSREG_IM, - GSREG_VRES, - GSREG_HRES -}; - -uint32 GetRegister(const unsigned id, char* const special, const uint32 special_len); -void SetRegister(const unsigned id, const uint32 value); -uint8 PeekVRAM(const uint32 addr); -void PokeVRAM(const uint32 addr, const uint8 val); -void MakeDump(const std::string& path) MDFN_COLD; - -INLINE uint32 PeekLine(void) { extern int32 VCounter; return VCounter; } -INLINE uint32 PeekHPos(void) { extern int32 HCounter; return HCounter; } -} -} -#endif diff --git a/waterbox/ss/vdp2_common.h b/waterbox/ss/vdp2_common.h deleted file mode 100644 index c71b4e09e5..0000000000 --- a/waterbox/ss/vdp2_common.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef __MDFN_SS_VDP2_COMMON_H -#define __MDFN_SS_VDP2_COMMON_H - -enum -{ - RDBS_UNUSED = 0x0, - RDBS_COEFF = 0x1, - RDBS_NAME = 0x2, - RDBS_CHAR = 0x3 -}; - -enum -{ - VCP_NBG0_NT = 0x0, - VCP_NBG1_NT = 0x1, - VCP_NBG2_NT = 0x2, - VCP_NBG3_NT = 0x3, - - VCP_NBG0_CG = 0x4, - VCP_NBG1_CG = 0x5, - VCP_NBG2_CG = 0x6, - VCP_NBG3_CG = 0x7, - - VCP_NBG0_VCS = 0xC, - VCP_NBG1_VCS = 0xD, - VCP_CPU = 0xE, - VCP_NOP = 0xF -}; - -#endif diff --git a/waterbox/ss/vdp2_render.cpp b/waterbox/ss/vdp2_render.cpp deleted file mode 100644 index bfa8a6273d..0000000000 --- a/waterbox/ss/vdp2_render.cpp +++ /dev/null @@ -1,3353 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp2_render.cpp - VDP2 Rendering -** Copyright (C) 2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -// TODO: 31KHz monitor mode. -// When implementing GetRegister(), remember RPRCTL and window x start and end registers can -// change outside of direct register writes -// Ignore T4-T7 in hires and 31KHz monitor mode. - -#include "ss.h" -// #include -#include "vdp2_common.h" -#include "vdp2_render.h" - -#include -// #include -#include - -// "Array" is a bit of a misnomer, but it helps avoid confusion with memset() semantics hopefully. -static INLINE void MDFN_FastArraySet(uint64* const dst, const uint64 value, const size_t count) -{ - #if defined(ARCH_X86) && defined(__x86_64__) - { - uint32 dummy_output0, dummy_output1; - - asm volatile( - "cld\n\t" - "rep stosq\n\t" - : "=D" (dummy_output0), "=c" (dummy_output1) - : "a" (value), "D" (dst), "c" (count) - : "cc", "memory"); - } - #else - - for(uint64 *ai = dst; MDFN_LIKELY(ai != (dst + count)); ai++) - MDFN_ennsb(ai, value); - - #endif -} - -static INLINE void MDFN_FastArraySet(uint32* const dst, const uint32 value, const size_t count) -{ - #if defined(ARCH_X86) && !defined(__x86_64__) - { - uint32 dummy_output0, dummy_output1; - - asm volatile( - "cld\n\t" - "rep stosl\n\t" - : "=D" (dummy_output0), "=c" (dummy_output1) - : "a" (value), "D" (dst), "c"(count) - : "cc", "memory"); - - return; - } - #else - if(0 == ((uintptr_t)dst & (sizeof(uint64) - 1)) && !(count & 1)) - MDFN_FastArraySet((uint64*)dst, value | ((uint64)value << 32), count >> 1); - else - { - for(uint32 *ai = dst; MDFN_LIKELY(ai != (dst + count)); ai++) - MDFN_ennsb(ai, value); - } - #endif -} - -static INLINE void MDFN_FastArraySet(uint16* const dst, const uint16 value, const size_t count) -{ - if(0 == ((uintptr_t)dst & (sizeof(uint32) - 1)) && !(count & 1)) - MDFN_FastArraySet((uint32*)dst, value | (value << 16), count >> 1); - else - { - for(uint16 *ai = dst; MDFN_LIKELY(ai != (dst + count)); ai++) - MDFN_ennsb(ai, value); - } -} - -static INLINE void MDFN_FastArraySet(uint8* const dst, const uint16 value, const size_t count) -{ - if(0 == ((uintptr_t)dst & (sizeof(uint16) - 1)) && !(count & 1)) - MDFN_FastArraySet((uint16*)dst, value | (value << 8), count >> 1); - else - { - for(uint8 *ai = dst; MDFN_LIKELY(ai != (dst + count)); ai++) - *ai = value; - } -} - -namespace MDFN_IEN_SS -{ -//uint8 vdp2rend_prepad_bss - -static EmulateSpecStruct* espec = NULL; -static bool PAL; -bool CorrectAspect; -bool ShowHOverscan; -bool DoHBlend; -int LineVisFirst, LineVisLast; -static uint32 OutLineCounter; -static bool Clock28M; -static unsigned VisibleLines; -static VDP2Rend_LIB LIB[256]; -static uint16 VRAM[262144]; -static uint16 CRAM[2048]; - -static uint8 HRes, VRes; -static bool BorderMode; -static uint8 InterlaceMode; -enum { IM_NONE, IM_ILLEGAL, IM_SINGLE, IM_DOUBLE }; - -static bool CRKTE; -static uint8 CRAM_Mode; -enum -{ - CRAM_MODE_RGB555_1024 = 0, - CRAM_MODE_RGB555_2048 = 1, - CRAM_MODE_RGB888_1024 = 2, - CRAM_MODE_ILLEGAL = 3 -}; -static uint8 VRAM_Mode; -static uint8 RDBS_Mode; - -static uint8 VCPRegs[4][8]; -static const uint16 DummyTileNT[8 * 8 * 4 / sizeof(uint16)] = { 0 }; - -static uint32 UserLayerEnableMask; -// -// -// -static uint16 BGON; -static uint16 MZCTL; -static uint8 MosaicVCount; - -static uint8 SFSEL; -static uint16 SFCODE; - -static uint16 CHCTLA; -static uint16 CHCTLB; - -static uint16 BMPNA; -static uint8 BMPNB; - -static uint16 PNCN[4]; -static uint16 PNCNR; - -static uint16 PLSZ; -static uint16 MPOFN; -static uint16 MPOFR; - -static uint8 MapRegs[4][4]; -static uint8 RotMapRegs[2][16]; -// -static uint16 XScrollI[4], YScrollI[4]; -static uint8 XScrollF[2], YScrollF[2]; - -static uint16 ZMCTL; -static uint16 SCRCTL; -static uint32 LineScrollAddr[2]; -static uint32 VCScrollAddr; -static uint32 VCLast[2]; - -static uint16 XCoordInc[2], YCoordInc[2]; -static uint32 YCoordAccum[2]; -static uint32 MosEff_YCoordAccum[2]; - -static uint32 CurXScrollIF[2]; -static uint32 CurYScrollIF[2]; -static uint16 CurXCoordInc[2]; -static uint32 CurLSA[2]; - -static uint16 NBG23_YCounter[2]; -static uint16 MosEff_NBG23_YCounter[2]; -// -static uint8 RPMD; -static uint8 KTCTL[2]; -static uint16 OVPNR[2]; -// -static uint32 BKTA; -static uint32 CurBackTabAddr; -static uint16 CurBackColor; - -static uint32 LCTA; -static uint32 CurLCTabAddr; -static uint16 CurLCColor; - -static uint8 LineColorEn; - -static uint16 SFPRMD; -static uint16 CCCTL; -static uint16 SFCCMD; -// -static uint8 NBGPrioNum[4]; -static uint8 RBG0PrioNum; - -static uint8 NBGCCRatio[4]; -static uint8 RBG0CCRatio; -static uint8 LineColorCCRatio; -static uint8 BackCCRatio; - -// -static struct -{ - uint16 XStart, XEnd; - uint16 YStart, YEnd; - uint32 LineWinAddr; - bool LineWinEn; - // - bool YMet; - uint16 CurXStart, CurXEnd; - uint32 CurLineWinAddr; -} Window[2]; - -static uint8 WinControl[8]; -enum -{ - WINLAYER_NBG0 = 0, - WINLAYER_NBG1 = 1, - WINLAYER_NBG2 = 2, - WINLAYER_NBG3 = 3, - WINLAYER_RBG0 = 4, - WINLAYER_SPRITE = 5, - WINLAYER_ROTPARAM = 6, - WINLAYER_CC = 7, -}; - -static std::array WinPieces; -// -static uint8 SpriteCCCond; -static uint8 SpriteCCNum; -static uint8 SPCTL_Low; - -static uint16 SDCTL; - -static uint8 SpritePrioNum[8]; -static uint8 SpriteCCRatio[8]; - -static uint8 SpriteCCLUT[8]; // Temp optimization data -static uint8 SpriteCC3Mask; // Temp optimization data - -// -static uint8 CRAMAddrOffs_NBG[4]; -static uint8 CRAMAddrOffs_RBG0; -static uint8 CRAMAddrOffs_Sprite; -// -static uint8 ColorOffsEn; -static uint8 ColorOffsSel; - -//enum -//{ -// COLOFFS_ENSEL_NBG0 = 0, -// COLOFFS_ENSEL_NBG1 = 0, -//}; - -static int32 ColorOffs[2][3]; // [A,B] [R << 0, G << 8, B << 16] - -template -struct TileFetcher -{ - unsigned CRAOffs; - - bool BMSCC; - bool BMSPR; - unsigned BMPalNo; - unsigned BMSize; - - unsigned PlaneSize; - unsigned PlaneOver; - uint16 PlaneOverChar; - bool PNDSize; - bool CharSize; - bool AuxMode; - unsigned Supp; - - // - // - // - unsigned BMOffset; - unsigned BMWShift; - unsigned BMWMask; - unsigned BMHMask; - - uint32 adj_map_regs[IsRot ? 16 : 4]; - uint32 doxm, doym; - - bool nt_ok[4]; - bool cg_ok[4]; - - // n=0...3, NBG0...3 - // n=4, RBG0 - // n=5, RBG1 - INLINE void Start(const unsigned n, const bool bmen, const unsigned map_offset, const uint8* map_regs) - { - BMOffset = map_offset << 16; - BMWShift = ((BMSize & 2) ? 10 : 9); - BMWMask = (1U << BMWShift) - 8; - BMHMask = (BMSize & 1) ? 0x1FF : 0xFF; - - const unsigned psshift = (13 - PNDSize - (CharSize << 1)); - - for(unsigned i = 0; i < (IsRot ? 16 : 4); i++) - { - adj_map_regs[i] = ((map_offset << 6) + (map_regs[i] &~ PlaneSize)) << psshift; - } - - if(IsRot) - { - if(bmen) - { - doxm = ~(BMWMask + 7); - doym = ~BMHMask; - } - else - { - doxm = ~((1U << ((9 + (bool)(PlaneSize & 0x1)) + (IsRot ? 2 : 1))) - 1); - doym = ~((1U << ((9 + (bool)(PlaneSize & 0x2)) + (IsRot ? 2 : 1))) - 1); - } - - if(PlaneOver == 0) - doxm = doym = 0; - else if(PlaneOver == 3) - doxm = doym = ~511; - } - - // Kludgeyness: - for(unsigned bank = 0; bank < 4; bank++) - { - const unsigned esb = bank & (2 | ((VRAM_Mode >> (bank >> 1)) & 1)); - const uint8 rdbs = (RDBS_Mode >> (esb << 1)) & 0x3; - - if(IsRot) - { - if(!(BGON & 0x20) || n == 4) - { - nt_ok[bank] = (rdbs == RDBS_NAME) && (bank < 2 || !(BGON & 0x20)); - cg_ok[bank] = (rdbs == RDBS_CHAR) && (bank < 2 || !(BGON & 0x20)); - } - else - { - nt_ok[bank] = (bank == 3); - cg_ok[bank] = (bank == 2); - } - } - else - { - nt_ok[bank] = false; - cg_ok[bank] = false; - - if(!(BGON & 0x30) || rdbs == RDBS_UNUSED) - { - for(unsigned ac = 0; ac < ((HRes & 0x6) ? 4 : 8); ac++) - { - if(VCPRegs[esb][ac] == (VCP_NBG0_CG + n)) - cg_ok[bank] = true; - - if(VCPRegs[esb][ac] == (VCP_NBG0_NT + n)) - nt_ok[bank] = true; - } - } - } - } - - #if 1 - pcco = 0; - spr = false; - scc = false; - tile_vrb = nullptr; - cellx_xor = 0; - #endif - } - - // - // - // - uint32 pcco; - bool spr; - bool scc; - const uint16* tile_vrb; - uint32 cellx_xor; - - template - INLINE bool Fetch(const bool bmen, const uint32 ix, const uint32 iy) - { - size_t cg_addr; - uint32 palno; - bool is_outside = false; - - if(IsRot) - is_outside = (ix & doxm) | (iy & doym); - - if(bmen) - { - palno = BMPalNo; - spr = BMSPR; - scc = BMSCC; - cellx_xor = (ix &~ 0x7); - cg_addr = (BMOffset + ((((ix & BMWMask) + ((iy & BMHMask) << BMWShift)) * TA_bpp) >> 4)) & 0x3FFFF; - } - else - { - bool vflip, hflip; - uint16 charno; - uint32 mapidx, planeidx, planeoffs, pageoffs; - const uint16* pnd; - uint32 celly; - size_t nt_addr; - - if(IsRot) - mapidx = ((ix >> (9 + (bool)(PlaneSize & 0x1))) & 0x3) | ((iy >> (9 + (bool)(PlaneSize & 0x2) - 2)) & 0xC); - else - mapidx = ((ix >> (9 + (bool)(PlaneSize & 0x1))) & 0x1) | ((iy >> (9 + (bool)(PlaneSize & 0x2) - 1)) & 0x2); - - planeidx = ((ix >> 9) & PlaneSize & 0x1) | ((iy >> (9 - 1)) & PlaneSize & 0x2); - planeoffs = planeidx << (13 - PNDSize - (CharSize << 1)); - pageoffs = ((((ix >> 3) & 0x3F) >> CharSize) + ((((iy >> 3) & 0x3F) >> CharSize) << (6 - CharSize))) << (1 - PNDSize); - nt_addr = (adj_map_regs[mapidx] + planeoffs + pageoffs) & 0x3FFFF; - - pnd = &VRAM[nt_addr]; - if(!nt_ok[nt_addr >> 16]) - pnd = DummyTileNT; - - if(IsRot && is_outside && PlaneOver == 1) - { - pnd = &PlaneOverChar; - goto OverCharCase; - } - - if(!PNDSize) - { - uint16 tmp = pnd[0]; - - palno = tmp & 0x7F; - vflip = (bool)(tmp & 0x8000); - hflip = (bool)(tmp & 0x4000); - spr = (bool)(tmp & 0x2000); - scc = (bool)(tmp & 0x1000); - charno = pnd[1] & 0x7FFF; - } - else - { - OverCharCase:; - uint16 tmp = pnd[0]; - - if(TA_bpp >= 8) - palno = ((tmp >> 12) & 0x7) << 4; - else - palno = ((tmp >> 12) & 0xF) | (((Supp >> 5) & 0x7) << 4); - spr = (bool)(Supp & 0x200); - scc = (bool)(Supp & 0x100); - - if(!AuxMode) - { - vflip = (bool)(tmp & 0x800); - hflip = (bool)(tmp & 0x400); - - if(CharSize) - charno = ((tmp & 0x3FF) << 2) + ((Supp & 0x1C) << 10) + (Supp & 0x3); - else - charno = (tmp & 0x3FF) + ((Supp & 0x1F) << 10); - } - else - { - hflip = vflip = false; - - if(CharSize) - charno = ((tmp & 0xFFF) << 2) + ((Supp & 0x10) << 10) + (Supp & 0x3); - else - charno = (tmp & 0xFFF) + ((Supp & 0x1C) << 10); - } - } - - if(CharSize) - { - uint32 cidx = (((ix >> 3) ^ hflip) & 0x1) + (((iy >> 2) ^ (vflip << 1)) & 0x2); - charno = (charno + cidx * (TA_bpp >> 2)) & 0x7FFF; - } - - cellx_xor = (ix &~ 0x7) | (hflip ? 0x7 : 0x0); - celly = (iy & 0x7) ^ (vflip ? 0x7 : 0); - cg_addr = ((charno << 4) + ((celly * TA_bpp) >> 1)) & 0x3FFFF; - } - tile_vrb = &VRAM[cg_addr]; - - if(!cg_ok[cg_addr >> 16]) - { - //printf("Goop: %08zx, %d %02x, %016llx %016llx %016llx %016llx\n", cg_addr, TA_bpp, VRAM_Mode, MDFN_de64lsb(VCPRegs[0]), MDFN_de64lsb(VCPRegs[1]), MDFN_de64lsb(VCPRegs[2]), MDFN_de64lsb(VCPRegs[3])); - tile_vrb = DummyTileNT; - } - - // - // - // - pcco = ((palno << 4) &~ ((1U << (TA_bpp & 0x1F)) - 1)) + CRAOffs; - - return IsRot && is_outside && (PlaneOver & 2); - } -}; - -struct RotVars -{ - int32 Xsp, Ysp;// .10 - int32 Xp, Yp; // .10 - int32 dX, dY; // .10 - - int32 kx, ky; // .16 - - bool use_coeff; - uint32 base_coeff; - - TileFetcher tf; -}; - -static struct -{ - uint64 spr[704]; - uint64 rbg0[704]; - union - { - uint64 nbg[4][8 + 704 + 8]; - struct - { - uint8 dummy[sizeof(nbg) / 2]; - uint16 vcscr[2][88 + 1 + 1]; // + 1 for fine x scroll != 0, + 1 for pointer shenanigans in FetchVCScroll - }; - struct - { - uint8 rotdummy[sizeof(nbg) / 4]; - uint8 rotabsel[352]; // Also used as a scratch buffer in T_DrawRBG() to handle mosaic-related junk. - RotVars rotv[2]; - uint32 rotcoeff[352]; - }; - }; - alignas(16) uint8 lc[704]; -} LB; - -// ColorOffsEn, etc. ?...hmm, discrepancy with ColorCalcEn and LineColorEn... -enum -{ - LAYER_NBG0 = 0, - //LAYER_RBG1 = 0, - LAYER_NBG1 = 1, - //LAYER_EXBG = 1, - LAYER_NBG2 = 2, - LAYER_NBG3 = 3, - - LAYER_RBG0 = 4, - LAYER_BACK = 5, // Line color? - LAYER_SPRITE = 6, -}; - -// -// -// -static uint32 ColorCache[2048]; -static void CacheCRE(const unsigned cri) -{ - if(CRAM_Mode & CRAM_MODE_RGB888_1024) - { - (ColorCache + 0x000)[cri >> 1] = (ColorCache + 0x400)[cri >> 1] = (((CRAM + 0x000)[(cri >> 1) & 0x3FF] & 0x80FF) << 16) | ((CRAM + 0x400)[(cri >> 1) & 0x3FF] << 0); - } - else - { - const uint16 t = CRAM[cri & ((CRAM_Mode == CRAM_MODE_RGB555_1024) ? 0x3FF : 0x7FF)]; - const uint32 col = ((t << 3) & 0xF8) | ((t << 6) & 0xF800) | ((t << 9) & 0xF80000) | ((t << 16) & 0x80000000); - - if(CRAM_Mode == CRAM_MODE_RGB555_1024) - (ColorCache + 0x000)[cri & 0x3FF] = (ColorCache + 0x400)[cri & 0x3FF] = col; - else - ColorCache[cri] = col; - } -} - -static void RecalcColorCache(void) -{ - if(CRAM_Mode & CRAM_MODE_RGB888_1024) - { - for(unsigned i = 0; i < 2048; i += 2) - CacheCRE(i); - } - else - { - const unsigned count = (CRAM_Mode == CRAM_MODE_RGB555_2048) ? 2048 : 1024; - - for(unsigned i = 0; i < count; i++) - CacheCRE(i); - } -} - -// -// Register writes seem to always be 16-bit -// -static INLINE void RegsWrite(uint32 A, uint16 V) -{ - A &= 0x1FE; - - switch(A) - { - default: - break; - - case 0x00: - //DisplayOn = (V >> 15) & 0x1; - BorderMode = (V >> 8) & 0x1; - InterlaceMode = (V >> 6) & 0x3; - VRes = (V >> 4) & 0x3; - HRes = (V >> 0) & 0x7; - break; - - case 0x02: - //ExLatchEnable = (V >> 9) & 0x1; - //ExSyncEnable = (V >> 8) & 0x1; - - //DispAreaSelect = (V >> 1) & 0x1; - //ExBGEnable = (V >> 0) & 0x1; - break; - - case 0x0E: - { - const unsigned old_CRAM_Mode = CRAM_Mode; - - CRKTE = (V >> 15) & 0x1; - CRAM_Mode = (V >> 12) & 0x3;; - VRAM_Mode = (V >> 8) & 0x3; - RDBS_Mode = V & 0xFF; - - if(old_CRAM_Mode != CRAM_Mode) - RecalcColorCache(); - } - break; - // - case 0x10: - case 0x12: - case 0x14: - case 0x16: - case 0x18: - case 0x1A: - case 0x1C: - case 0x1E: - { - uint8* const b = &VCPRegs[(A >> 2) & 3][(A & 0x2) << 1]; - b[0] = (V >> 12) & 0xF; - b[1] = (V >> 8) & 0xF; - b[2] = (V >> 4) & 0xF; - b[3] = (V >> 0) & 0xF; - } - break; - // - case 0x20: - BGON = V & 0x1F3F; - break; - - case 0x22: - MZCTL = V & 0xFF1F; - break; - - case 0x24: - SFSEL = V & 0x1F; - break; - - case 0x26: - SFCODE = V; - break; - - case 0x28: - CHCTLA = V & 0x3F7F; - break; - - case 0x2A: - CHCTLB = V & 0x7733; - break; - - case 0x2C: - BMPNA = V & 0x3737; - break; - - case 0x2E: - BMPNB = V & 0x37; - break; - - // - case 0x30: - case 0x32: - case 0x34: - case 0x36: - PNCN[(A & 0x6) >> 1] = V & 0xC3FF; - break; - - case 0x38: - PNCNR = V & 0xC3FF; - break; - - // - case 0x3A: - PLSZ = V; // Plane size - break; - - case 0x3C: - MPOFN = V & 0x7777; // Map offset NBG - break; - - case 0x3E: - MPOFR = V & 0x0077; // Map offset RBG - break; - // - case 0x40: - case 0x42: - case 0x44: - case 0x46: - case 0x48: - case 0x4A: - case 0x4C: - case 0x4E: - MapRegs[(A & 0xC) >> 2][(A & 0x2) + 0] = (V >> 0) & 0x3F; - MapRegs[(A & 0xC) >> 2][(A & 0x2) + 1] = (V >> 8) & 0x3F; - break; - - case 0x50: case 0x52: case 0x54: case 0x56: case 0x58: case 0x5A: case 0x5C: case 0x5E: - case 0x60: case 0x62: case 0x64: case 0x66: case 0x68: case 0x6A: case 0x6C: case 0x6E: - RotMapRegs[(bool)(A & 0x20)][(A & 0xE) + 0] = (V >> 0) & 0x3F; - RotMapRegs[(bool)(A & 0x20)][(A & 0xE) + 1] = (V >> 8) & 0x3F; - break; - // - case 0x70: - case 0x80: - XScrollI[A >> 7] = V & 0x7FF; - break; - - case 0x72: - case 0x82: - XScrollF[A >> 7] = (V >> 8) & 0xFF; - break; - - case 0x74: - case 0x84: - YScrollI[A >> 7] = V & 0x7FF; - break; - - case 0x76: - case 0x86: - YScrollF[A >> 7] = (V >> 8) & 0xFF; - break; - - case 0x78: - case 0x88: - XCoordInc[A >> 7] = (XCoordInc[A >> 7] & 0xFF) | ((V & 0x7) << 8); - break; - - case 0x7A: - case 0x8A: - XCoordInc[A >> 7] = (XCoordInc[A >> 7] & 0x700) | ((V >> 8) & 0xFF); - break; - - case 0x7C: - case 0x8C: - YCoordInc[A >> 7] = (YCoordInc[A >> 7] & 0xFF) | ((V & 0x7) << 8); - break; - - case 0x7E: - case 0x8E: - YCoordInc[A >> 7] = (YCoordInc[A >> 7] & 0x700) | ((V >> 8) & 0xFF); - break; - - case 0x90: - case 0x94: - XScrollI[2 + (bool)(A & 0x4)] = V & 0x7FF; - break; - - case 0x92: - case 0x96: - { - const unsigned which = (bool)(A & 0x4); - - NBG23_YCounter[which] = YScrollI[2 + which] = V & 0x7FF; - } - break; - - case 0x98: - ZMCTL = V & 0x0303; - break; - - case 0x9A: - SCRCTL = V & 0x3F3F; - break; - - case 0x9C: - VCScrollAddr = (VCScrollAddr & 0xFFFF) | ((V & 0x7) << 16); - break; - - case 0x9E: - VCScrollAddr = (VCScrollAddr & 0x70000) | (V & 0xFFFE); - break; - - case 0xA0: - LineScrollAddr[0] = (LineScrollAddr[0] & 0xFFFF) | ((V & 0x7) << 16); - break; - - case 0xA2: - LineScrollAddr[0] = (LineScrollAddr[0] & 0x70000) | (V & 0xFFFE); - break; - - case 0xA4: - LineScrollAddr[1] = (LineScrollAddr[1] & 0xFFFF) | ((V & 0x7) << 16); - break; - - case 0xA6: - LineScrollAddr[1] = (LineScrollAddr[1] & 0x70000) | (V & 0xFFFE); - break; - - // - case 0xA8: - LCTA = (LCTA & 0xFFFF) | ((V & 0x8007) << 16); - break; - - case 0xAA: - LCTA = (LCTA & ~0xFFFF) | V; - break; - - case 0xAC: - BKTA = (BKTA & 0xFFFF) | ((V & 0x8007) << 16); - break; - - case 0xAE: - BKTA = (BKTA & ~0xFFFF) | V; - break; - // - case 0xB0: - RPMD = V & 0x3; - break; - - case 0xB4: - KTCTL[0] = (V >> 0) & 0x1F; - KTCTL[1] = (V >> 8) & 0x1F; - break; - - case 0xB8: - OVPNR[0] = V; - break; - - case 0xBA: - OVPNR[1] = V; - break; - - // - case 0xC0: Window[0].XStart = V & 0x3FF; break; - case 0xC2: Window[0].YStart = V & 0x1FF; break; - case 0xC4: Window[0].XEnd = V & 0x3FF; break; - case 0xC6: Window[0].YEnd = V & 0x1FF; break; - - case 0xC8: Window[1].XStart = V & 0x3FF; break; - case 0xCA: Window[1].YStart = V & 0x1FF; break; - case 0xCC: Window[1].XEnd = V & 0x3FF; break; - case 0xCE: Window[1].YEnd = V & 0x1FF; break; - - case 0xD0: - case 0xD2: - case 0xD4: - WinControl[(A & 0x6) + 0] = (V >> 0) & 0xBF; - WinControl[(A & 0x6) + 1] = (V >> 8) & 0xBF; - break; - - case 0xD6: - WinControl[(A & 0x6) + 0] = (V >> 0) & 0x8F; // Rot - WinControl[(A & 0x6) + 1] = (V >> 8) & 0xBF; // CC - break; - - case 0xD8: - case 0xDC: - { - const unsigned w = (A & 0x4) >> 2; - - Window[w].LineWinEn = (bool)(V & 0x8000); - Window[w].LineWinAddr = (Window[w].LineWinAddr & 0xFFFF) | ((V & 0x7) << 16); - } - break; - - case 0xDA: - case 0xDE: - { - const unsigned w = (A & 0x4) >> 2; - - Window[w].LineWinAddr = (Window[w].LineWinAddr & 0x70000) | (V & 0xFFFE); - } - break; - - // - case 0xE0: - SpriteCCCond = (V >> 12) & 0x3; - SpriteCCNum = (V >> 8) & 0x7; - SPCTL_Low = V & 0x3F; - break; - - case 0xE2: - SDCTL = V & 0x13F; - break; - - case 0xE4: - CRAMAddrOffs_NBG[0] = (V >> 0) & 0x7; - CRAMAddrOffs_NBG[1] = (V >> 4) & 0x7; - CRAMAddrOffs_NBG[2] = (V >> 8) & 0x7; - CRAMAddrOffs_NBG[3] = (V >> 12) & 0x7; - break; - - case 0xE6: - CRAMAddrOffs_RBG0 = (V >> 0) & 0x7; - CRAMAddrOffs_Sprite = (V >> 4) & 0x7; - break; - - case 0xE8: - LineColorEn = V & 0x3F; - break; - - case 0xEA: - SFPRMD = V & 0x3FF; - break; - - case 0xEC: - CCCTL = V & 0xF77F; - break; - - case 0xEE: - SFCCMD = V & 0x3FF; - break; - - case 0xF0: - case 0xF2: - case 0xF4: - case 0xF6: - SpritePrioNum[(A & 0x6) + 0] = ((V >> 0) & 0x7); - SpritePrioNum[(A & 0x6) + 1] = ((V >> 8) & 0x7); - break; - - case 0xF8: - NBGPrioNum[0] = (V >> 0) & 0x7; - NBGPrioNum[1] = (V >> 8) & 0x7; - break; - - case 0xFA: - NBGPrioNum[2] = (V >> 0) & 0x7; - NBGPrioNum[3] = (V >> 8) & 0x7; - break; - - case 0xFC: - RBG0PrioNum = (V >> 0) & 0x7; - break; - - case 0x100: - case 0x102: - case 0x104: - case 0x106: - SpriteCCRatio[(A & 0x6) + 0] = (V >> 0) & 0x1F; - SpriteCCRatio[(A & 0x6) + 1] = (V >> 8) & 0x1F; - break; - - case 0x108: - case 0x10A: - NBGCCRatio[(A & 0x2) + 0] = (V >> 0) & 0x1F; - NBGCCRatio[(A & 0x2) + 1] = (V >> 8) & 0x1F; - break; - - case 0x10C: - RBG0CCRatio = V & 0x1F; - break; - - case 0x10E: - LineColorCCRatio = (V >> 0) & 0x1F; - BackCCRatio = (V >> 8) & 0x1F; - break; - - case 0x110: - ColorOffsEn = V & 0x7F; - break; - - case 0x112: - ColorOffsSel = V & 0x7F; - break; - - case 0x114: // A Red - case 0x116: // A Green - case 0x118: // A Blue - case 0x11A: // B Red - case 0x11C: // B Green - case 0x11E: // B Blue - { - const unsigned ab = (A >= 0x11A); - const unsigned wcc = ((A - 0x114) >> 1) % 3; - - ColorOffs[ab][wcc] = (uint32)sign_x_to_s32(9, V) << (wcc << 3); - } - break; - } -} - -template -static INLINE void MemW(uint32 A, const uint16 DB) -{ - A &= 0x1FFFFF; - - // - // VRAM - // - if(A < 0x100000) - { - const size_t vri = (A & 0x7FFFF) >> 1; - const unsigned mask = (sizeof(T) == 2) ? 0xFFFF : (0xFF00 >> ((A & 1) << 3)); - - VRAM[vri] = (VRAM[vri] &~ mask) | (DB & mask); - - return; - } - - // - // CRAM - // - if(A < 0x180000) - { - const unsigned cri = (A & 0xFFF) >> 1; - - switch(CRAM_Mode) - { - case CRAM_MODE_RGB555_1024: - (CRAM + 0x000)[cri & 0x3FF] = DB; - (CRAM + 0x400)[cri & 0x3FF] = DB; - CacheCRE(cri); - break; - - case CRAM_MODE_RGB555_2048: - CRAM[cri] = DB; - CacheCRE(cri); - break; - - case CRAM_MODE_RGB888_1024: - case CRAM_MODE_ILLEGAL: - default: - CRAM[((cri >> 1) & 0x3FF) | ((cri & 1) << 10)] = DB; - CacheCRE(cri); - break; - } - - return; - } - - // - // Registers - // - if(A < 0x1C0000) - { - RegsWrite(A, DB); - - return; - } -} - - -static void Reset(bool powering_up) -{ - if(powering_up) - { - memset(VRAM, 0, sizeof(VRAM)); - memset(CRAM, 0, sizeof(CRAM)); - } - // - // - CRKTE = false; - CRAM_Mode = 0; - VRAM_Mode = 0; - RDBS_Mode = 0; - HRes = 0; - VRes = 0; - BorderMode = false; - InterlaceMode = 0; - // - memset(VCPRegs, 0, sizeof(VCPRegs)); - // - BGON = 0; - MZCTL = 0; - MosaicVCount = 0; - - SFSEL = 0; - SFCODE = 0; - - CHCTLA = 0; - CHCTLB = 0; - - BMPNA = 0; - BMPNB = 0; - - for(unsigned n = 0; n < 4; n++) - PNCN[n] = 0; - - PNCNR = 0; - - PLSZ = 0; - MPOFN = 0; - MPOFR = 0; - - for(unsigned n = 0; n < 4; n++) - { - for(unsigned i = 0; i < 4; i++) - MapRegs[n][i] = 0; - } - - for(unsigned rn = 0; rn < 2; rn++) - { - for(unsigned i = 0; i < 16; i++) - RotMapRegs[rn][i] = 0; - } - - // - for(unsigned n = 0; n < 4; n++) - { - XScrollI[n] = 0; - YScrollI[n] = 0; - - if(n < 2) - { - XScrollF[n] = 0; - YScrollF[n] = 0; - - XCoordInc[n] = 0; - YCoordInc[n] = 0; - YCoordAccum[n] = 0; - MosEff_YCoordAccum[n] = 0; - } - else - { - NBG23_YCounter[n & 1] = 0; - MosEff_NBG23_YCounter[n & 1] = 0; - } - } - - ZMCTL = 0; - SCRCTL = 0; - LineScrollAddr[0] = 0; - LineScrollAddr[1] = 0; - VCScrollAddr = 0; - VCLast[0] = VCLast[1] = 0; - - for(unsigned n = 0; n < 2; n++) - { - CurXScrollIF[n] = 0; - CurYScrollIF[n] = 0; - CurLSA[n] = 0; - CurXCoordInc[n] = 0; - } - - for(unsigned n = 0; n < 4; n++) - NBGPrioNum[n] = 0; - - RBG0PrioNum = 0; - - for(unsigned n = 0; n < 4; n++) - NBGCCRatio[n] = 0; - - RBG0CCRatio = 0; - LineColorCCRatio = 0; - BackCCRatio = 0; - - for(unsigned w = 0; w < 2; w++) - { - Window[w].XStart = 0; - Window[w].XEnd = 0; - Window[w].YStart = 0; - Window[w].YEnd = 0; - Window[w].LineWinAddr = 0; - Window[w].LineWinEn = false; - - Window[w].YMet = false; - Window[w].CurXStart = 0; - Window[w].CurXEnd = 0; - Window[w].CurLineWinAddr = 0; - } - - for(unsigned i = 0; i < 8; i++) - WinControl[i] = 0; - - // - RPMD = 0; - for(unsigned i = 0; i < 2; i++) - { - KTCTL[i] = 0; - OVPNR[i] = 0; - } - // - BKTA = 0; - CurBackTabAddr = 0; - CurBackColor = 0; - - LCTA = 0; - CurLCTabAddr = 0; - CurLCColor = 0; - - LineColorEn = 0; - - SFPRMD = 0; - SFCCMD = 0; - - CCCTL = 0; - // - SpriteCCCond = 0; - SpriteCCNum = 0; - SPCTL_Low = 0; - - SDCTL = 0; - // - for(auto& spn : SpritePrioNum) - spn = 0; - // - for(auto& scr : SpriteCCRatio) - scr = 0; - // - for(auto& ao : CRAMAddrOffs_NBG) - ao = 0; - - CRAMAddrOffs_RBG0 = 0; - - CRAMAddrOffs_Sprite = 0; - // - ColorOffsEn = 0; - ColorOffsSel = 0; - - for(auto& co : ColorOffs) - for(auto& coe : co) - coe = 0; -} - -// Prio(3 bits), color calc(1 bit), layer num(3 bits), 1 bit for palette/rgb format, 1 bit for line color enable, 1 bit for color offs enable, 1 bit for color offs select -// 1 bit for line color screen enable?, 1 bit allow sprite shadow, 1 bit do sprite shadow -// Prio, color calc, layer num - -enum -{ - PIX_ISRGB_SHIFT = 0, // original format, 0 = paletted, 1 = RGB - PIX_LCE_SHIFT = 1, // Line color enable - PIX_COE_SHIFT = 2, // Color offs enable - PIX_COSEL_SHIFT = 3, // Color offset select(which color offset registers to use) - PIX_CCE_SHIFT = 4, // Color calc enable - - // - // Sprite shadow nonsense - // Keep these in this order at these bit positions - PIX_SHADEN_SHIFT = 5, // - PIX_DOSHAD_SHIFT = 6, - PIX_SELFSHAD_SHIFT = 7, - PIX_SHADHALVTEST8_VAL = 0x60, - // - // - // - // - - // 8 ... 15 - PIX_PRIO_TEST_SHIFT = 8, - PIX_PRIO_SHIFT = PIX_PRIO_TEST_SHIFT + 3, - - // - PIX_GRAD_SHIFT = 16, - PIX_LAYER_CCE_SHIFT = 17, // For extended color calculation - - // 24...31 - PIX_CCRATIO_SHIFT = 24, - - // 32 ... 55 - PIX_RGB_SHIFT = 32, - - // - PIX_SWBIT_SHIFT = 56, - - // Reminder that highest bit can be == 1 when RGB data is pulled from ColorCache - //SPECIAL_CCALC_SHIFT = 63 -}; - -static INLINE void GetCWV(const uint8 ctrl, const bool* const xmet, bool* cwv) -{ - const bool logic = (ctrl >> 7) & 1; // 0 = OR, 1 = AND - const bool w_enable[2] = { (bool)(ctrl & 0x02), (bool)(ctrl & 0x08) }; - const bool w_area[2] = { (bool)(ctrl & 0x01), (bool)(ctrl & 0x04) }; - const bool sw_enable = ctrl & 0x20; - const bool sw_area = ctrl & 0x10; - - for(unsigned swinput = 0; swinput < 2; swinput++) - { - bool wval[2]; - bool swval; - - wval[0] = (w_enable[0] ? ((xmet[0] & Window[0].YMet) ^ w_area[0]) : logic); - wval[1] = (w_enable[1] ? ((xmet[1] & Window[1].YMet) ^ w_area[1]) : logic); - - swval = sw_enable ? (swinput ^ sw_area) : logic; - - if(logic) - cwv[swinput] = wval[0] & wval[1] & swval; - else - cwv[swinput] = wval[0] | wval[1] | swval; - } -} - -static void GetWinRotAB(void) -{ - unsigned x = 0; - - for(unsigned piece = 0; piece < WinPieces.size(); piece++) - { - bool xmet[2]; - - xmet[0] = ((x >= Window[0].CurXStart) & (x <= Window[0].CurXEnd)); - xmet[1] = ((x >= Window[1].CurXStart) & (x <= Window[1].CurXEnd)); - // - // - // - bool cwv[2]; - - GetCWV(WinControl[WINLAYER_ROTPARAM], xmet, cwv); - - if(HRes & 0x2) - { - for(; MDFN_LIKELY(x < WinPieces[piece]); x += 2) - LB.rotabsel[x >> 1] = cwv[(LB.spr[x] >> PIX_SWBIT_SHIFT) & 1]; - } - else - { - for(; MDFN_LIKELY(x < WinPieces[piece]); x++) - LB.rotabsel[x] = cwv[(LB.spr[x] >> PIX_SWBIT_SHIFT) & 1]; - } - } -} - -static void ApplyWin(const unsigned wlayer, uint64* buf) -{ - unsigned x = 0; - - //printf("%d %d %d %d %d --- %d %d\n", WinPieces[0], WinPieces[1], WinPieces[2], WinPieces[3], WinPieces[4], Window[0].CurXStart, Window[0].CurXEnd); - - for(unsigned piece = 0; piece < WinPieces.size(); piece++) - { - bool xmet[2]; - - xmet[0] = ((x >= Window[0].CurXStart) & (x <= Window[0].CurXEnd)); - xmet[1] = ((x >= Window[1].CurXStart) & (x <= Window[1].CurXEnd)); - - // - // - // - bool cwv[2]; - bool cc_cwv[2]; - - GetCWV(WinControl[wlayer], xmet, cwv); - GetCWV(WinControl[WINLAYER_CC], xmet, cc_cwv); - - if(!((cwv[0] ^ cwv[1]) | (cc_cwv[0] ^ cc_cwv[1]))) // Fast path(no sprite window, or sprite window wouldn't have an effect in this piece). - { - if(cwv[0]) - { - for(; MDFN_LIKELY(x < WinPieces[piece]); x++) - buf[x] &= ~(uint64)0xFFFFFFFF; - } - else if(cc_cwv[0]) - { - for(; MDFN_LIKELY(x < WinPieces[piece]); x++) - buf[x] &= ~(uint64)(1U << PIX_CCE_SHIFT); - } - x = WinPieces[piece]; - } - else - { - uint64 masks[2]; - - for(unsigned i = 0; i < 2; i++) - { - uint64 m = ~(uint64)0; - - if(cwv[i]) - m = ~(uint64)0xFFFFFFFF; - - if(cc_cwv[i]) - m &= ~(uint64)(1U << PIX_CCE_SHIFT); - - masks[i] = m; - } - - for(; MDFN_LIKELY(x < WinPieces[piece]); x++) - { - buf[x] &= masks[(LB.spr[x] >> PIX_SWBIT_SHIFT) & 1]; - } - } - } -} - -#pragma GCC push_options -#pragma GCC optimize("no-unroll-loops,no-peel-loops,no-crossjumping") -static NO_INLINE void ApplyHMosaic(const unsigned layer, uint64* buf, const unsigned w) -{ - if(!(MZCTL & (1U << layer))) - return; - - const unsigned moz_horiz_param = ((MZCTL >> 8) & 0xF); - const unsigned moz_wmax = w - moz_horiz_param; - unsigned x = 0; - - switch(moz_horiz_param) - { - case 0x0: x = moz_wmax; break; - case 0x1: for(; x < moz_wmax; x += 0x2) { auto b = buf[x]; buf[x + 1] = b; } break; - case 0x2: for(; x < moz_wmax; x += 0x3) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; } break; - case 0x3: for(; x < moz_wmax; x += 0x4) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; } break; - case 0x4: for(; x < moz_wmax; x += 0x5) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; } break; - case 0x5: for(; x < moz_wmax; x += 0x6) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; } break; - case 0x6: for(; x < moz_wmax; x += 0x7) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; } break; - case 0x7: for(; x < moz_wmax; x += 0x8) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; } break; - case 0x8: for(; x < moz_wmax; x += 0x9) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; } break; - case 0x9: for(; x < moz_wmax; x += 0xA) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; } break; - case 0xA: for(; x < moz_wmax; x += 0xB) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; } break; - case 0xB: for(; x < moz_wmax; x += 0xC) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; } break; - case 0xC: for(; x < moz_wmax; x += 0xD) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; buf[x + 12] = b; } break; - case 0xD: for(; x < moz_wmax; x += 0xE) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; buf[x + 12] = b; buf[x + 13] = b; } break; - case 0xE: for(; x < moz_wmax; x += 0xF) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; buf[x + 12] = b; buf[x + 13] = b; buf[x + 14] = b; } break; - case 0xF: for(; x < moz_wmax; x += 0x10) { auto b = buf[x]; buf[x + 1] = b; buf[x + 2] = b; buf[x + 3] = b; buf[x + 4] = b; buf[x + 5] = b; buf[x + 6] = b; buf[x + 7] = b; buf[x + 8] = b; buf[x + 9] = b; buf[x + 10] = b; buf[x + 11] = b; buf[x + 12] = b; buf[x + 13] = b; buf[x + 14] = b; buf[x + 15] = b;} break; - } - assert(x <= w); - - for(auto b = buf[x]; x < w; x++) - buf[x] = b; -} -#pragma GCC pop_options - -// -// NBG0(HRES=0x1): -// Cycle 0: OK -// Cycle 1: OK -// -// Cycle 2: -// [Entry 0] [Entry 0] [Entry 1] [Entry 2] -// Cycle 3 ... 7: -// [Entry 44] [Entry 44] [Entry 0] [Entry 1] -// - -static void FetchVCScroll(const unsigned w) -{ - const bool vcon[2] = { (bool)(SCRCTL & BGON & !(MZCTL & 0x1)), (bool)((SCRCTL >> 8) & (BGON >> 1) & !(MZCTL & 0x2) & 0x1) }; - const unsigned max_cyc = (HRes & 0x6) ? 4 : 8; - const unsigned tc = (w >> 3) + 1; - uint32 tmp[2] = { VCLast[0], VCLast[1] }; - uint32 vcaddr = VCScrollAddr & 0x3FFFE; - uint32 base[2]; - unsigned inc[8]; - uint8 VRMVCPCache[4][8]; - - for(unsigned bank = 0; bank < 4; bank++) - { - //unsigned brm[4]; - //brm[bank] = bank & (2 | ((VRAM_Mode >> (bank >> 1)) & 1)); - const unsigned esb = bank & (2 | ((VRAM_Mode >> (bank >> 1)) & 1)); - memcpy(VRMVCPCache[bank], VCPRegs[esb], 8); - } - - for(unsigned n = 0; n < 2; n++) - base[n] = CurYScrollIF[n] + YCoordAccum[n]; - - for(unsigned cyc = 0; cyc < max_cyc; cyc++) - { - unsigned do_inc = 0; - - for(unsigned bank = 0; bank < 4; bank++) - { - const unsigned act = VRMVCPCache[bank][cyc]; - - do_inc |= vcon[0] & (act == VCP_NBG0_VCS); - do_inc |= vcon[1] & (act == VCP_NBG1_VCS); - } - - inc[cyc] = do_inc << 1; - } - - for(unsigned tile = 0; MDFN_LIKELY(tile < tc); tile++) - { - for(unsigned cyc = 0; cyc < max_cyc; cyc++) - { - const unsigned act = VRMVCPCache[vcaddr >> 16][cyc]; - - // NBG0 - if(vcon[0]) - { - if(cyc == 3) - LB.vcscr[0][tile] = ((base[0] + tmp[0]) >> 8); - - if(cyc == 3) - tmp[0] = VCLast[0]; - - if(act == VCP_NBG0_VCS) - { - VCLast[0] = (VRAM[vcaddr + 0] << 8) | (VRAM[vcaddr + 1] >> 8); - if(cyc <= (1 + !tile)) - tmp[0] = VCLast[0]; - } - } - - // NBG1 - if(vcon[1]) - { - if(cyc == 4) - LB.vcscr[1][tile] = ((base[1] + tmp[1]) >> 8); - - if(cyc == 4) - tmp[1] = VCLast[1]; - - if(act == VCP_NBG1_VCS) - { - VCLast[1] = (VRAM[vcaddr + 0] << 8) | (VRAM[vcaddr + 1] >> 8); - if(cyc <= 2) //(2 + !tile)) // TODO: Check - tmp[1] = VCLast[1]; - } - } - - vcaddr = (vcaddr + inc[cyc]) & 0x3FFFE; - } - } -} - -template -static INLINE void MakeSFCodeLUT(const unsigned layer, int16* const sfcode_lut) -{ - const uint8 code = SFCODE >> (((SFSEL >> layer) & 1) << 3); - - for(unsigned i = 0; i < 8; i++) - { - uint16 tmp = 0xFFFF; - - if(!((code >> i) & 1)) - { - if(TA_PrioMode & 2) - tmp &= ~(1U << PIX_PRIO_SHIFT); - - if(TA_CCMode == 2) - tmp &= ~(1U << PIX_CCE_SHIFT); - } - - sfcode_lut[i] = tmp; - } -} - -static INLINE uint32 rgb15_to_rgb24(uint16 src) -{ - return ((((src << 3) & 0xF8) | ((src << 6) & 0xF800) | ((src << 9) & 0xF80000) | ((src << 16) & 0x80000000)));; -} - -template -static INLINE uint64 MakeNBGRBGPix(T& tf, const uint32 pix_base_or, const int16* sfcode_lut, const uint32 ix, const uint32 iy) -{ - uint32 cellx = (ix ^ tf.cellx_xor); - const uint16* vrb = &tf.tile_vrb[((cellx * TA_bpp) >> 4)]; - // - // - // - uint32 pbor = pix_base_or; - uint32 rgb24; - bool opaque; - - if(TA_CCMode == 1 || (TA_CCMode == 2 && !TA_isrgb)) - pbor |= (tf.scc << PIX_CCE_SHIFT); - - if(TA_PrioMode == 1 || (TA_PrioMode == 2 && !TA_isrgb)) - pbor |= (tf.spr << PIX_PRIO_SHIFT); - - if(TA_isrgb) - { - if(TA_bpp == 32) - { - uint32 tmp = (vrb[0] << 16) | vrb[1]; - - rgb24 = tmp & 0xFFFFFF; - opaque = (bool)(tmp & 0x80000000); - } - else - { - uint32 tmp = vrb[0]; - - rgb24 = rgb15_to_rgb24(tmp & 0x7FFF); - opaque = (bool)(tmp & 0x8000); - } - - if(TA_CCMode == 3) - pbor |= (1 << PIX_CCE_SHIFT); - } - else - { - uint32 dcc; - uint32 tmp = vrb[0]; //charno ^ (charno << 8); //vrb[0]; - - if(TA_bpp == 16) - dcc = tmp & 0x7FF; - else if(TA_bpp == 8) - dcc = (tmp >> (((cellx & 1) ^ 1) << 3)) & 0xFF; - else - dcc = (tmp >> (((cellx & 3) ^ 3) << 2)) & 0x0F; - - opaque = (bool)dcc; - - rgb24 = ColorCache[(tf.pcco + dcc) & 2047]; - - if(TA_CCMode == 3) - pbor |= ((int32)rgb24 >> 31) & (1 << PIX_CCE_SHIFT); - // - if(TA_PrioMode == 2 || TA_CCMode == 2) - pbor &= *(const int16*)((const uint8*)sfcode_lut + (dcc & 0xE)); - } - - if(!TA_igntp && !opaque) - pbor = 0; - - return pbor | ((uint64)rgb24 << PIX_RGB_SHIFT); -} - -template -static void T_DrawNBG(const unsigned n, uint64* bgbuf, const unsigned w, const uint32 pix_base_or) -{ - assert(n < 2); - // - // - const bool VCSEn = ((SCRCTL >> (n << 3)) & 0x1) && !(MZCTL & (1U << n)); - // - TileFetcher tf; - uint32 xcinc; - uint32 xc; - uint32 iy; - int16 sfcode_lut[8]; - - tf.CRAOffs = CRAMAddrOffs_NBG[n] << 8; - // - tf.BMSCC = ((BMPNA >> (4 + (n << 3))) & 1); - tf.BMSPR = ((BMPNA >> (5 + (n << 3))) & 1); - tf.BMPalNo = ((BMPNA >> (0 + (n << 3))) & 0x7) << 4; - tf.BMSize = ((CHCTLA >> (2 + (n << 3))) & 0x3); - // - tf.PlaneSize = (PLSZ >> (n << 1)) & 0x3; - tf.PNDSize = (PNCN[n] >> 15) & 1; // 0 = 2 words, 1 = 1 word - tf.CharSize = ((CHCTLA >> (0 + (n << 3))) & 1); - tf.AuxMode = (PNCN[n] >> 14) & 1; - tf.Supp = (PNCN[n] & 0x3FF); // Supplement bits when PNDSize == 1 - // - tf.Start(n, TA_bmen, (MPOFN >> (n << 2)) & 0x7, MapRegs[n]); - - MakeSFCodeLUT(n, sfcode_lut); - - xc = CurXScrollIF[n]; - iy = (CurYScrollIF[n] + MosEff_YCoordAccum[n]) >> 8; - xcinc = CurXCoordInc[n]; - - //if(line == 64) - // printf("Mega %d: planesize=0x%1x charsize=%d pndsize=%d(auxmode=%d,supp=0x%04x) bpp=%d/%d ccmode=0x%04x SFSEL=0x%04x SFCODE=0x%04x SFCCMD=0x%04x\n", n, PlaneSize, CharSize, PNDSize, AuxMode, Supp, TA_bpp, TA_isrgb, TA_CCMode, SFSEL, SFCODE, SFCCMD); - - //printf("Mega %d %02x %d --- %04x %04x -- %04x --- lsa=0x%06x vcsa=0x%06x --- imode=0x%01x\n", TA_bpp, BMSize, w, xcinc, ycinc, SCRCTL, LineScrollAddr[n], VCScrollAddr, InterlaceMode); - - // Map: 2x2 planes - // Plane: 1x1, 2x1, or 2x2 pages - // Page: 64x64 cells - // Character: 1x1, 2x2 cells - // Cell: 8x8 dots - uint32 prev_ix = ~0U; - - if(((ZMCTL >> (n << 3)) & 0x3) && VCSEn) - { - for(unsigned i = 0; MDFN_LIKELY(i < w); i++) - { - const uint32 ix = xc >> 8; - iy = LB.vcscr[n][i >> 3]; - tf.Fetch(TA_bmen, ix, iy); - // - // - // - bgbuf[i] = MakeNBGRBGPix(tf, pix_base_or, sfcode_lut, ix, iy); - xc += xcinc; - } - } - else - { - for(unsigned i = 0; MDFN_LIKELY(i < w); i++) - { - const uint32 ix = xc >> 8; - - if((ix >> 3) != prev_ix) - { - prev_ix = ix >> 3; - // - if(VCSEn) - iy = LB.vcscr[n][(i + 7) >> 3]; - - tf.Fetch(TA_bmen, ix, iy); - } - // - // - // - bgbuf[i] = MakeNBGRBGPix(tf, pix_base_or, sfcode_lut, ix, iy); - xc += xcinc; - } - } -} - -static void (*DrawNBG[2 /*bitmap enable*/][5/*col mode*/][2/*igntp*/][3/*priomode*/][4/*ccmode*/])(const unsigned n, uint64* bgbuf, const unsigned w, const uint32 pix_base_or) = -{ - { - { { { T_DrawNBG<0, 4, 0, 0, 0, 0>, T_DrawNBG<0, 4, 0, 0, 0, 1>, T_DrawNBG<0, 4, 0, 0, 0, 2>, T_DrawNBG<0, 4, 0, 0, 0, 3>, }, { T_DrawNBG<0, 4, 0, 0, 1, 0>, T_DrawNBG<0, 4, 0, 0, 1, 1>, T_DrawNBG<0, 4, 0, 0, 1, 2>, T_DrawNBG<0, 4, 0, 0, 1, 3>, }, { T_DrawNBG<0, 4, 0, 0, 2, 0>, T_DrawNBG<0, 4, 0, 0, 2, 1>, T_DrawNBG<0, 4, 0, 0, 2, 2>, T_DrawNBG<0, 4, 0, 0, 2, 3>, }, }, { { T_DrawNBG<0, 4, 0, 1, 0, 0>, T_DrawNBG<0, 4, 0, 1, 0, 1>, T_DrawNBG<0, 4, 0, 1, 0, 2>, T_DrawNBG<0, 4, 0, 1, 0, 3>, }, { T_DrawNBG<0, 4, 0, 1, 1, 0>, T_DrawNBG<0, 4, 0, 1, 1, 1>, T_DrawNBG<0, 4, 0, 1, 1, 2>, T_DrawNBG<0, 4, 0, 1, 1, 3>, }, { T_DrawNBG<0, 4, 0, 1, 2, 0>, T_DrawNBG<0, 4, 0, 1, 2, 1>, T_DrawNBG<0, 4, 0, 1, 2, 2>, T_DrawNBG<0, 4, 0, 1, 2, 3>, }, }, }, - { { { T_DrawNBG<0, 8, 0, 0, 0, 0>, T_DrawNBG<0, 8, 0, 0, 0, 1>, T_DrawNBG<0, 8, 0, 0, 0, 2>, T_DrawNBG<0, 8, 0, 0, 0, 3>, }, { T_DrawNBG<0, 8, 0, 0, 1, 0>, T_DrawNBG<0, 8, 0, 0, 1, 1>, T_DrawNBG<0, 8, 0, 0, 1, 2>, T_DrawNBG<0, 8, 0, 0, 1, 3>, }, { T_DrawNBG<0, 8, 0, 0, 2, 0>, T_DrawNBG<0, 8, 0, 0, 2, 1>, T_DrawNBG<0, 8, 0, 0, 2, 2>, T_DrawNBG<0, 8, 0, 0, 2, 3>, }, }, { { T_DrawNBG<0, 8, 0, 1, 0, 0>, T_DrawNBG<0, 8, 0, 1, 0, 1>, T_DrawNBG<0, 8, 0, 1, 0, 2>, T_DrawNBG<0, 8, 0, 1, 0, 3>, }, { T_DrawNBG<0, 8, 0, 1, 1, 0>, T_DrawNBG<0, 8, 0, 1, 1, 1>, T_DrawNBG<0, 8, 0, 1, 1, 2>, T_DrawNBG<0, 8, 0, 1, 1, 3>, }, { T_DrawNBG<0, 8, 0, 1, 2, 0>, T_DrawNBG<0, 8, 0, 1, 2, 1>, T_DrawNBG<0, 8, 0, 1, 2, 2>, T_DrawNBG<0, 8, 0, 1, 2, 3>, }, }, }, - { { { T_DrawNBG<0, 16, 0, 0, 0, 0>, T_DrawNBG<0, 16, 0, 0, 0, 1>, T_DrawNBG<0, 16, 0, 0, 0, 2>, T_DrawNBG<0, 16, 0, 0, 0, 3>, }, { T_DrawNBG<0, 16, 0, 0, 1, 0>, T_DrawNBG<0, 16, 0, 0, 1, 1>, T_DrawNBG<0, 16, 0, 0, 1, 2>, T_DrawNBG<0, 16, 0, 0, 1, 3>, }, { T_DrawNBG<0, 16, 0, 0, 2, 0>, T_DrawNBG<0, 16, 0, 0, 2, 1>, T_DrawNBG<0, 16, 0, 0, 2, 2>, T_DrawNBG<0, 16, 0, 0, 2, 3>, }, }, { { T_DrawNBG<0, 16, 0, 1, 0, 0>, T_DrawNBG<0, 16, 0, 1, 0, 1>, T_DrawNBG<0, 16, 0, 1, 0, 2>, T_DrawNBG<0, 16, 0, 1, 0, 3>, }, { T_DrawNBG<0, 16, 0, 1, 1, 0>, T_DrawNBG<0, 16, 0, 1, 1, 1>, T_DrawNBG<0, 16, 0, 1, 1, 2>, T_DrawNBG<0, 16, 0, 1, 1, 3>, }, { T_DrawNBG<0, 16, 0, 1, 2, 0>, T_DrawNBG<0, 16, 0, 1, 2, 1>, T_DrawNBG<0, 16, 0, 1, 2, 2>, T_DrawNBG<0, 16, 0, 1, 2, 3>, }, }, }, - { { { T_DrawNBG<0, 16, 1, 0, 0, 0>, T_DrawNBG<0, 16, 1, 0, 0, 1>, T_DrawNBG<0, 16, 1, 0, 0, 2>, T_DrawNBG<0, 16, 1, 0, 0, 3>, }, { T_DrawNBG<0, 16, 1, 0, 1, 0>, T_DrawNBG<0, 16, 1, 0, 1, 1>, T_DrawNBG<0, 16, 1, 0, 1, 2>, T_DrawNBG<0, 16, 1, 0, 1, 3>, }, { T_DrawNBG<0, 16, 1, 0, 2, 0>, T_DrawNBG<0, 16, 1, 0, 2, 1>, T_DrawNBG<0, 16, 1, 0, 2, 2>, T_DrawNBG<0, 16, 1, 0, 2, 3>, }, }, { { T_DrawNBG<0, 16, 1, 1, 0, 0>, T_DrawNBG<0, 16, 1, 1, 0, 1>, T_DrawNBG<0, 16, 1, 1, 0, 2>, T_DrawNBG<0, 16, 1, 1, 0, 3>, }, { T_DrawNBG<0, 16, 1, 1, 1, 0>, T_DrawNBG<0, 16, 1, 1, 1, 1>, T_DrawNBG<0, 16, 1, 1, 1, 2>, T_DrawNBG<0, 16, 1, 1, 1, 3>, }, { T_DrawNBG<0, 16, 1, 1, 2, 0>, T_DrawNBG<0, 16, 1, 1, 2, 1>, T_DrawNBG<0, 16, 1, 1, 2, 2>, T_DrawNBG<0, 16, 1, 1, 2, 3>, }, }, }, - { { { T_DrawNBG<0, 32, 1, 0, 0, 0>, T_DrawNBG<0, 32, 1, 0, 0, 1>, T_DrawNBG<0, 32, 1, 0, 0, 2>, T_DrawNBG<0, 32, 1, 0, 0, 3>, }, { T_DrawNBG<0, 32, 1, 0, 1, 0>, T_DrawNBG<0, 32, 1, 0, 1, 1>, T_DrawNBG<0, 32, 1, 0, 1, 2>, T_DrawNBG<0, 32, 1, 0, 1, 3>, }, { T_DrawNBG<0, 32, 1, 0, 2, 0>, T_DrawNBG<0, 32, 1, 0, 2, 1>, T_DrawNBG<0, 32, 1, 0, 2, 2>, T_DrawNBG<0, 32, 1, 0, 2, 3>, }, }, { { T_DrawNBG<0, 32, 1, 1, 0, 0>, T_DrawNBG<0, 32, 1, 1, 0, 1>, T_DrawNBG<0, 32, 1, 1, 0, 2>, T_DrawNBG<0, 32, 1, 1, 0, 3>, }, { T_DrawNBG<0, 32, 1, 1, 1, 0>, T_DrawNBG<0, 32, 1, 1, 1, 1>, T_DrawNBG<0, 32, 1, 1, 1, 2>, T_DrawNBG<0, 32, 1, 1, 1, 3>, }, { T_DrawNBG<0, 32, 1, 1, 2, 0>, T_DrawNBG<0, 32, 1, 1, 2, 1>, T_DrawNBG<0, 32, 1, 1, 2, 2>, T_DrawNBG<0, 32, 1, 1, 2, 3>, }, }, }, - }, - { - { { { T_DrawNBG<1, 4, 0, 0, 0, 0>, T_DrawNBG<1, 4, 0, 0, 0, 1>, T_DrawNBG<1, 4, 0, 0, 0, 2>, T_DrawNBG<1, 4, 0, 0, 0, 3>, }, { T_DrawNBG<1, 4, 0, 0, 1, 0>, T_DrawNBG<1, 4, 0, 0, 1, 1>, T_DrawNBG<1, 4, 0, 0, 1, 2>, T_DrawNBG<1, 4, 0, 0, 1, 3>, }, { T_DrawNBG<1, 4, 0, 0, 2, 0>, T_DrawNBG<1, 4, 0, 0, 2, 1>, T_DrawNBG<1, 4, 0, 0, 2, 2>, T_DrawNBG<1, 4, 0, 0, 2, 3>, }, }, { { T_DrawNBG<1, 4, 0, 1, 0, 0>, T_DrawNBG<1, 4, 0, 1, 0, 1>, T_DrawNBG<1, 4, 0, 1, 0, 2>, T_DrawNBG<1, 4, 0, 1, 0, 3>, }, { T_DrawNBG<1, 4, 0, 1, 1, 0>, T_DrawNBG<1, 4, 0, 1, 1, 1>, T_DrawNBG<1, 4, 0, 1, 1, 2>, T_DrawNBG<1, 4, 0, 1, 1, 3>, }, { T_DrawNBG<1, 4, 0, 1, 2, 0>, T_DrawNBG<1, 4, 0, 1, 2, 1>, T_DrawNBG<1, 4, 0, 1, 2, 2>, T_DrawNBG<1, 4, 0, 1, 2, 3>, }, }, }, - { { { T_DrawNBG<1, 8, 0, 0, 0, 0>, T_DrawNBG<1, 8, 0, 0, 0, 1>, T_DrawNBG<1, 8, 0, 0, 0, 2>, T_DrawNBG<1, 8, 0, 0, 0, 3>, }, { T_DrawNBG<1, 8, 0, 0, 1, 0>, T_DrawNBG<1, 8, 0, 0, 1, 1>, T_DrawNBG<1, 8, 0, 0, 1, 2>, T_DrawNBG<1, 8, 0, 0, 1, 3>, }, { T_DrawNBG<1, 8, 0, 0, 2, 0>, T_DrawNBG<1, 8, 0, 0, 2, 1>, T_DrawNBG<1, 8, 0, 0, 2, 2>, T_DrawNBG<1, 8, 0, 0, 2, 3>, }, }, { { T_DrawNBG<1, 8, 0, 1, 0, 0>, T_DrawNBG<1, 8, 0, 1, 0, 1>, T_DrawNBG<1, 8, 0, 1, 0, 2>, T_DrawNBG<1, 8, 0, 1, 0, 3>, }, { T_DrawNBG<1, 8, 0, 1, 1, 0>, T_DrawNBG<1, 8, 0, 1, 1, 1>, T_DrawNBG<1, 8, 0, 1, 1, 2>, T_DrawNBG<1, 8, 0, 1, 1, 3>, }, { T_DrawNBG<1, 8, 0, 1, 2, 0>, T_DrawNBG<1, 8, 0, 1, 2, 1>, T_DrawNBG<1, 8, 0, 1, 2, 2>, T_DrawNBG<1, 8, 0, 1, 2, 3>, }, }, }, - { { { T_DrawNBG<1, 16, 0, 0, 0, 0>, T_DrawNBG<1, 16, 0, 0, 0, 1>, T_DrawNBG<1, 16, 0, 0, 0, 2>, T_DrawNBG<1, 16, 0, 0, 0, 3>, }, { T_DrawNBG<1, 16, 0, 0, 1, 0>, T_DrawNBG<1, 16, 0, 0, 1, 1>, T_DrawNBG<1, 16, 0, 0, 1, 2>, T_DrawNBG<1, 16, 0, 0, 1, 3>, }, { T_DrawNBG<1, 16, 0, 0, 2, 0>, T_DrawNBG<1, 16, 0, 0, 2, 1>, T_DrawNBG<1, 16, 0, 0, 2, 2>, T_DrawNBG<1, 16, 0, 0, 2, 3>, }, }, { { T_DrawNBG<1, 16, 0, 1, 0, 0>, T_DrawNBG<1, 16, 0, 1, 0, 1>, T_DrawNBG<1, 16, 0, 1, 0, 2>, T_DrawNBG<1, 16, 0, 1, 0, 3>, }, { T_DrawNBG<1, 16, 0, 1, 1, 0>, T_DrawNBG<1, 16, 0, 1, 1, 1>, T_DrawNBG<1, 16, 0, 1, 1, 2>, T_DrawNBG<1, 16, 0, 1, 1, 3>, }, { T_DrawNBG<1, 16, 0, 1, 2, 0>, T_DrawNBG<1, 16, 0, 1, 2, 1>, T_DrawNBG<1, 16, 0, 1, 2, 2>, T_DrawNBG<1, 16, 0, 1, 2, 3>, }, }, }, - { { { T_DrawNBG<1, 16, 1, 0, 0, 0>, T_DrawNBG<1, 16, 1, 0, 0, 1>, T_DrawNBG<1, 16, 1, 0, 0, 2>, T_DrawNBG<1, 16, 1, 0, 0, 3>, }, { T_DrawNBG<1, 16, 1, 0, 1, 0>, T_DrawNBG<1, 16, 1, 0, 1, 1>, T_DrawNBG<1, 16, 1, 0, 1, 2>, T_DrawNBG<1, 16, 1, 0, 1, 3>, }, { T_DrawNBG<1, 16, 1, 0, 2, 0>, T_DrawNBG<1, 16, 1, 0, 2, 1>, T_DrawNBG<1, 16, 1, 0, 2, 2>, T_DrawNBG<1, 16, 1, 0, 2, 3>, }, }, { { T_DrawNBG<1, 16, 1, 1, 0, 0>, T_DrawNBG<1, 16, 1, 1, 0, 1>, T_DrawNBG<1, 16, 1, 1, 0, 2>, T_DrawNBG<1, 16, 1, 1, 0, 3>, }, { T_DrawNBG<1, 16, 1, 1, 1, 0>, T_DrawNBG<1, 16, 1, 1, 1, 1>, T_DrawNBG<1, 16, 1, 1, 1, 2>, T_DrawNBG<1, 16, 1, 1, 1, 3>, }, { T_DrawNBG<1, 16, 1, 1, 2, 0>, T_DrawNBG<1, 16, 1, 1, 2, 1>, T_DrawNBG<1, 16, 1, 1, 2, 2>, T_DrawNBG<1, 16, 1, 1, 2, 3>, }, }, }, - { { { T_DrawNBG<1, 32, 1, 0, 0, 0>, T_DrawNBG<1, 32, 1, 0, 0, 1>, T_DrawNBG<1, 32, 1, 0, 0, 2>, T_DrawNBG<1, 32, 1, 0, 0, 3>, }, { T_DrawNBG<1, 32, 1, 0, 1, 0>, T_DrawNBG<1, 32, 1, 0, 1, 1>, T_DrawNBG<1, 32, 1, 0, 1, 2>, T_DrawNBG<1, 32, 1, 0, 1, 3>, }, { T_DrawNBG<1, 32, 1, 0, 2, 0>, T_DrawNBG<1, 32, 1, 0, 2, 1>, T_DrawNBG<1, 32, 1, 0, 2, 2>, T_DrawNBG<1, 32, 1, 0, 2, 3>, }, }, { { T_DrawNBG<1, 32, 1, 1, 0, 0>, T_DrawNBG<1, 32, 1, 1, 0, 1>, T_DrawNBG<1, 32, 1, 1, 0, 2>, T_DrawNBG<1, 32, 1, 1, 0, 3>, }, { T_DrawNBG<1, 32, 1, 1, 1, 0>, T_DrawNBG<1, 32, 1, 1, 1, 1>, T_DrawNBG<1, 32, 1, 1, 1, 2>, T_DrawNBG<1, 32, 1, 1, 1, 3>, }, { T_DrawNBG<1, 32, 1, 1, 2, 0>, T_DrawNBG<1, 32, 1, 1, 2, 1>, T_DrawNBG<1, 32, 1, 1, 2, 2>, T_DrawNBG<1, 32, 1, 1, 2, 3>, }, }, }, - } -}; - -template -static INLINE uint64 MakeNBG23Pix(uint32 dcc, uint32 pbor, const int16* sfcode_lut, uint32 colcacheoffs) -{ - uint32 rgb24; - - rgb24 = ColorCache[(colcacheoffs + dcc) & 2047]; - - if(TA_CCMode == 3) - pbor |= ((int32)rgb24 >> 31) & (1 << PIX_CCE_SHIFT); - - if(TA_PrioMode == 2 || TA_CCMode == 2) - pbor &= *(const int16*)((const uint8*)sfcode_lut + (dcc & 0xE)); - - if(!TA_igntp && !dcc) - pbor = 0; - - return pbor + ((uint64)rgb24 << PIX_RGB_SHIFT); -} - -// -// CCMode will be forced to 0 in the effective instantiation if corresponding NBG CCE bit in CCCTL is 0. -// -template -static void T_DrawNBG23(const unsigned n, uint64* bgbuf, const unsigned w, const uint32 pix_base_or) -{ - assert(n >= 2); - TileFetcher tf; - int16 sfcode_lut[8]; - unsigned tc = 1 + (w >> 3); - const unsigned xscr = XScrollI[n]; - const unsigned yscr = MosEff_NBG23_YCounter[n & 1]; - unsigned tx; - - tf.CRAOffs = CRAMAddrOffs_NBG[n] << 8; - // - tf.PlaneSize = (PLSZ >> (n << 1)) & 0x3; - tf.PNDSize = (PNCN[n] >> 15) & 1; // 0 = 2 words, 1 = 1 word - tf.CharSize = ((CHCTLB >> (0 + ((n & 1) << 2))) & 1); - tf.AuxMode = (PNCN[n] >> 14) & 1; - tf.Supp = (PNCN[n] & 0x3FF); // Supplement bits when PNDSize == 1 - // - tf.Start(n, false, (MPOFN >> (n << 2)) & 0x7, MapRegs[n]); - - MakeSFCodeLUT(n, sfcode_lut); - - bgbuf -= xscr & 0x7; - tx = xscr >> 3; - - //if(TA_bpp == 4 && n == 3) - // printf("Goop: %d %d %02x, %016llx %016llx %016llx %016llx\n", n, TA_bpp, VRAM_Mode, MDFN_de64lsb(VCPRegs[0]), MDFN_de64lsb(VCPRegs[1]), MDFN_de64lsb(VCPRegs[2]), MDFN_de64lsb(VCPRegs[3])); - // Kludge for Akumajou Dracula X - if(MDFN_UNLIKELY(TA_bpp == 4 && n == 3 && VRAM_Mode == 0x2 && MDFN_de64lsb(VCPRegs[0]) == 0x0f0f070406060505ULL && MDFN_de64lsb(VCPRegs[2]) == 0x0f0f03000f0f0201ULL && MDFN_de64lsb(VCPRegs[3]) == 0x0f0f0f0f0f0f0f0fULL)) - { - for(unsigned i = 0; i < 8; i++) - *bgbuf++ = 0; - tc--; - } - - while(MDFN_LIKELY(tc--)) - { - uint32 pbor = pix_base_or; - - tf.Fetch(false, tx << 3, yscr); - - if(TA_CCMode == 1 || TA_CCMode == 2) - pbor |= (tf.scc << PIX_CCE_SHIFT); - - if(TA_PrioMode == 1 || TA_PrioMode == 2) - pbor |= (tf.spr << PIX_PRIO_SHIFT); - // - // - auto* const mbp = MakeNBG23Pix; - - if(TA_bpp == 8) - { - if(tf.cellx_xor & 0x7) - { - bgbuf[7] = mbp((uint8)(tf.tile_vrb[0] >> 8), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[6] = mbp((uint8)(tf.tile_vrb[0] >> 0), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[5] = mbp((uint8)(tf.tile_vrb[1] >> 8), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[4] = mbp((uint8)(tf.tile_vrb[1] >> 0), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[3] = mbp((uint8)(tf.tile_vrb[2] >> 8), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[2] = mbp((uint8)(tf.tile_vrb[2] >> 0), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[1] = mbp((uint8)(tf.tile_vrb[3] >> 8), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[0] = mbp((uint8)(tf.tile_vrb[3] >> 0), /**/pbor, sfcode_lut, tf.pcco); - } - else - { - bgbuf[0] = mbp((uint8)(tf.tile_vrb[0] >> 8), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[1] = mbp((uint8)(tf.tile_vrb[0] >> 0), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[2] = mbp((uint8)(tf.tile_vrb[1] >> 8), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[3] = mbp((uint8)(tf.tile_vrb[1] >> 0), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[4] = mbp((uint8)(tf.tile_vrb[2] >> 8), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[5] = mbp((uint8)(tf.tile_vrb[2] >> 0), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[6] = mbp((uint8)(tf.tile_vrb[3] >> 8), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[7] = mbp((uint8)(tf.tile_vrb[3] >> 0), /**/pbor, sfcode_lut, tf.pcco); - } - } - else - { - if(tf.cellx_xor & 0x7) - { - bgbuf[7] = mbp((tf.tile_vrb[0] >> 12), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[6] = mbp((tf.tile_vrb[0] >> 8) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[5] = mbp((tf.tile_vrb[0] >> 4) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[4] = mbp((tf.tile_vrb[0] >> 0) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[3] = mbp((tf.tile_vrb[1] >> 12), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[2] = mbp((tf.tile_vrb[1] >> 8) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[1] = mbp((tf.tile_vrb[1] >> 4) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[0] = mbp((tf.tile_vrb[1] >> 0) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - } - else - { - bgbuf[0] = mbp((tf.tile_vrb[0] >> 12), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[1] = mbp((tf.tile_vrb[0] >> 8) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[2] = mbp((tf.tile_vrb[0] >> 4) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[3] = mbp((tf.tile_vrb[0] >> 0) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[4] = mbp((tf.tile_vrb[1] >> 12), /**/pbor, sfcode_lut, tf.pcco); - bgbuf[5] = mbp((tf.tile_vrb[1] >> 8) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[6] = mbp((tf.tile_vrb[1] >> 4) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - bgbuf[7] = mbp((tf.tile_vrb[1] >> 0) & 0xF, /**/pbor, sfcode_lut, tf.pcco); - } - } - - // - // - // - tx++; - bgbuf += 8; - } -} - -static void (*DrawNBG23[2/*col mode*/][2/*igntp*/][3/*priomode*/][4/*ccmode*/])(const unsigned n, uint64* bgbuf, const unsigned w, const uint32 pix_base_or) = -{ - { - { { T_DrawNBG23<4, 0, 0, 0>, T_DrawNBG23<4, 0, 0, 1>, T_DrawNBG23<4, 0, 0, 2>, T_DrawNBG23<4, 0, 0, 3>, }, { T_DrawNBG23<4, 0, 1, 0>, T_DrawNBG23<4, 0, 1, 1>, T_DrawNBG23<4, 0, 1, 2>, T_DrawNBG23<4, 0, 1, 3>, }, { T_DrawNBG23<4, 0, 2, 0>, T_DrawNBG23<4, 0, 2, 1>, T_DrawNBG23<4, 0, 2, 2>, T_DrawNBG23<4, 0, 2, 3>, }, }, - { { T_DrawNBG23<4, 1, 0, 0>, T_DrawNBG23<4, 1, 0, 1>, T_DrawNBG23<4, 1, 0, 2>, T_DrawNBG23<4, 1, 0, 3>, }, { T_DrawNBG23<4, 1, 1, 0>, T_DrawNBG23<4, 1, 1, 1>, T_DrawNBG23<4, 1, 1, 2>, T_DrawNBG23<4, 1, 1, 3>, }, { T_DrawNBG23<4, 1, 2, 0>, T_DrawNBG23<4, 1, 2, 1>, T_DrawNBG23<4, 1, 2, 2>, T_DrawNBG23<4, 1, 2, 3>, }, }, - }, - { - { { T_DrawNBG23<8, 0, 0, 0>, T_DrawNBG23<8, 0, 0, 1>, T_DrawNBG23<8, 0, 0, 2>, T_DrawNBG23<8, 0, 0, 3>, }, { T_DrawNBG23<8, 0, 1, 0>, T_DrawNBG23<8, 0, 1, 1>, T_DrawNBG23<8, 0, 1, 2>, T_DrawNBG23<8, 0, 1, 3>, }, { T_DrawNBG23<8, 0, 2, 0>, T_DrawNBG23<8, 0, 2, 1>, T_DrawNBG23<8, 0, 2, 2>, T_DrawNBG23<8, 0, 2, 3>, }, }, - { { T_DrawNBG23<8, 1, 0, 0>, T_DrawNBG23<8, 1, 0, 1>, T_DrawNBG23<8, 1, 0, 2>, T_DrawNBG23<8, 1, 0, 3>, }, { T_DrawNBG23<8, 1, 1, 0>, T_DrawNBG23<8, 1, 1, 1>, T_DrawNBG23<8, 1, 1, 2>, T_DrawNBG23<8, 1, 1, 3>, }, { T_DrawNBG23<8, 1, 2, 0>, T_DrawNBG23<8, 1, 2, 1>, T_DrawNBG23<8, 1, 2, 2>, T_DrawNBG23<8, 1, 2, 3>, }, }, - }, -}; - -static INLINE uint32 GetCoeffAddr(const unsigned i, uint32 offset) -{ - const uint32 src_mask = (CRKTE ? 0x3FF : 0x3FFFF); - - offset >>= 10; - offset <<= !(KTCTL[i] & 0x2); - offset &= src_mask; - - return offset; -} - -static INLINE uint32 ReadCoeff(const unsigned i, const uint32 addr) -{ - const uint16* src = (CRKTE ? &CRAM[0x400] : VRAM); - uint32 coeff; - - if(KTCTL[i] & 0x2) - { - const uint16 tmp = src[addr]; - coeff = (sign_x_to_s32(21, tmp << 6) & 0x00FFFFFF) | ((tmp & 0x8000) << 16); - //printf("%d Coeff %08x, %04x -- %08x\n", i, offset, tmp, coeff); - } - else - { - const uint16* ea = &src[addr]; - coeff = (ea[0] << 16) | ea[1]; - } - - return coeff; -} - -// Coefficient table reading can (temporarily) override kx, ky, and/or Xp -// -// When RBG1 is enabled, line color screen uses rotation parameter A coefficient table -// -// RBG1 always uses MSB of coefficient data as transparent bit. -// -// RBG1 requires RPMD == 0, or else bad things happen? - -template -static void SetupRotVars(const T* rs, const unsigned rbg_w) -{ - const uint8 EffRPMD = ((BGON & 0x20) ? 0 : RPMD); - - if(EffRPMD < 2) - { - for(unsigned x = 0; MDFN_LIKELY(x < rbg_w); x++) - LB.rotabsel[x] = RPMD; - } - else if(EffRPMD == 3) - GetWinRotAB(); - - // - // - // - - for(unsigned i = 0; i < 2; i++) - { - auto& r = LB.rotv[i]; - - r.Xsp = rs[i].Xsp; - r.Ysp = rs[i].Ysp; - r.Xp = rs[i].Xp; - r.Yp = rs[i].Yp; - r.dX = rs[i].dX; - r.dY = rs[i].dY; - r.kx = rs[i].kx; - r.ky = rs[i].ky; - - LB.rotv[i].tf.BMSCC = ((BMPNB >> 4) & 1); - LB.rotv[i].tf.BMSPR = ((BMPNB >> 5) & 1); - LB.rotv[i].tf.BMPalNo = ((BMPNB >> 0) & 0x7) << 4; - LB.rotv[i].tf.BMSize = ((CHCTLB >> 10) & 0x1); - - // - // - // - // - // - // - if((BGON & 0x20) && i) - { - LB.rotv[1].tf.CRAOffs = CRAMAddrOffs_NBG[0] << 8; - LB.rotv[1].tf.PNDSize = (PNCN[0] >> 15) & 1; - LB.rotv[1].tf.CharSize = ((CHCTLA >> 0) & 1); - LB.rotv[1].tf.AuxMode = (PNCN[0] >> 14) & 1; - LB.rotv[1].tf.Supp = (PNCN[0] & 0x3FF); - } - else - { - LB.rotv[i].tf.CRAOffs = CRAMAddrOffs_RBG0 << 8; - LB.rotv[i].tf.PNDSize = (PNCNR >> 15) & 1; - LB.rotv[i].tf.CharSize = ((CHCTLB >> 8) & 1); - LB.rotv[i].tf.AuxMode = (PNCNR >> 14) & 1; - LB.rotv[i].tf.Supp = (PNCNR & 0x3FF); - } - LB.rotv[i].tf.PlaneSize = (PLSZ >> ( 8 + (i << 2))) & 0x3; - LB.rotv[i].tf.PlaneOver = (PLSZ >> (10 + (i << 2))) & 0x3; - LB.rotv[i].tf.PlaneOverChar = OVPNR[i]; - LB.rotv[i].tf.Start(4 + i, !i && ((CHCTLB >> 9) & 1), (MPOFR >> (i << 2)) & 0x7, RotMapRegs[i]); - } - - // - // - // - { - bool bank_tab[4]; - - for(unsigned i = 0; i < 4; i++) - bank_tab[i] = ((RDBS_Mode >> (i << 1)) & 0x3) == RDBS_COEFF; - // - if(!(VRAM_Mode & 0x1)) - bank_tab[1] = bank_tab[0]; - - if(!(VRAM_Mode & 0x2)) - bank_tab[3] = bank_tab[2]; - - if(BGON & 0x20) - bank_tab[2] = bank_tab[3] = false; - // - if(CRKTE) - bank_tab[0] = bank_tab[1] = bank_tab[2] = bank_tab[3] = true; - // - // - LB.rotv[0].use_coeff = (bool)(KTCTL[0] & 0x1); - LB.rotv[1].use_coeff = (bool)(KTCTL[1] & 0x1); - - uint32 coeff[2]; - - for(unsigned i = 0; i < 2; i++) - LB.rotv[i].base_coeff = coeff[i] = ReadCoeff(i, GetCoeffAddr(i, rs[i].KAstAccum)); - - //if(grumpus == 120) - // printf("BankTab: %d %d %d %d, UC: %d %d, Coeff: @0x%05x=0x%08x @0x%05x=0x%08x, DKAx: %f %f\n", bank_tab[0], bank_tab[1], bank_tab[2], bank_tab[3], LB.rotv[0].use_coeff, LB.rotv[1].use_coeff, GetCoeffAddr(0, rs[0].KAstAccum), coeff[0], GetCoeffAddr(1, rs[1].KAstAccum), coeff[1], rs[0].DKAx / 1024.0, rs[1].DKAx / 1024.0); - - for(unsigned x = 0; MDFN_LIKELY(x < rbg_w); x++) - { - const unsigned i = ((EffRPMD == 2) ? 0 : LB.rotabsel[x]); - const uint32 addr = GetCoeffAddr(i, rs[i].KAstAccum + (x * rs[i].DKAx)); - - if(bank_tab[addr >> 16]) - coeff[i] = ReadCoeff(i, addr); - - if(KTCTL[i] & 0x10) - LB.lc[x] = (coeff[i] >> 24) & 0x7F; - - if(EffRPMD == 2) - { - uint32 tmp = coeff[0]; - - LB.rotabsel[x] = tmp >> 31; - - if((int32)tmp < 0) - tmp = coeff[1]; - - LB.rotcoeff[x] = tmp; - } - else - LB.rotcoeff[x] = coeff[i]; - } - } -} - -// const bool TA_bmen = ((rn == 1) ? false : ((CHCTLB >> 9) & 1)); -template -static void T_DrawRBG(const bool rn, uint64* bgbuf, const unsigned w, const uint32 pix_base_or) -{ - // Full color format selection for both RBG0 and RBG1 - // Bitmap only allowed for RBG0 - // RBG0 can use rot param A and B, RBG1 is fixed to rot param B - // RBG1 shares setting bitfields with NBG0 - // 16 planes instead of 4 like with NBG* - // Mosaic only has effect in the horizontal direction? - // - int16 sfcode_lut[8]; - - MakeSFCodeLUT((rn ? 0 : 4), sfcode_lut); - - for(unsigned i = 0; MDFN_LIKELY(i < w); i++) - { - const unsigned ab = LB.rotabsel[i]; - auto& r = LB.rotv[ab]; - auto& tf = r.tf; - uint32 Xp = r.Xp; - int32 kx = r.kx; - int32 ky = r.ky; - bool rot_tp = false; - - if(r.use_coeff) - { - const uint32 coeff = (rn ? r.base_coeff : LB.rotcoeff[i]); - - rot_tp = ((int32)coeff < 0); - - const uint32 sext = sign_x_to_s32(24, coeff); - - switch((KTCTL[ab] >> 2) & 0x3) - { - case 0: kx = ky = sext; break; - case 1: kx = sext; break; - case 2: ky = sext; break; - case 3: Xp = sext << 2; break; - } - } - - const uint32 ix = ( Xp + (uint32)(((int64)kx * (int32)(r.Xsp + (r.dX * i))) >> 16)) >> 10; - const uint32 iy = (r.Yp + (uint32)(((int64)ky * (int32)(r.Ysp + (r.dY * i))) >> 16)) >> 10; - - rot_tp |= tf.Fetch(TA_bmen, ix, iy); - - LB.rotabsel[i] = rot_tp; - // - // - // - bgbuf[i] = MakeNBGRBGPix(tf, pix_base_or, sfcode_lut, ix, iy); - } -} - -//template -static void (*DrawRBG[2 /*bitmap enable*/][5/*col mode*/][2/*igntp*/][3/*priomode*/][4/*ccmode*/])(const bool rn, uint64* bgbuf, const unsigned w, const uint32 pix_base_or) = -{ - { - { { { T_DrawRBG<0, 4, 0, 0, 0, 0>, T_DrawRBG<0, 4, 0, 0, 0, 1>, T_DrawRBG<0, 4, 0, 0, 0, 2>, T_DrawRBG<0, 4, 0, 0, 0, 3>, }, { T_DrawRBG<0, 4, 0, 0, 1, 0>, T_DrawRBG<0, 4, 0, 0, 1, 1>, T_DrawRBG<0, 4, 0, 0, 1, 2>, T_DrawRBG<0, 4, 0, 0, 1, 3>, }, { T_DrawRBG<0, 4, 0, 0, 2, 0>, T_DrawRBG<0, 4, 0, 0, 2, 1>, T_DrawRBG<0, 4, 0, 0, 2, 2>, T_DrawRBG<0, 4, 0, 0, 2, 3>, }, }, { { T_DrawRBG<0, 4, 0, 1, 0, 0>, T_DrawRBG<0, 4, 0, 1, 0, 1>, T_DrawRBG<0, 4, 0, 1, 0, 2>, T_DrawRBG<0, 4, 0, 1, 0, 3>, }, { T_DrawRBG<0, 4, 0, 1, 1, 0>, T_DrawRBG<0, 4, 0, 1, 1, 1>, T_DrawRBG<0, 4, 0, 1, 1, 2>, T_DrawRBG<0, 4, 0, 1, 1, 3>, }, { T_DrawRBG<0, 4, 0, 1, 2, 0>, T_DrawRBG<0, 4, 0, 1, 2, 1>, T_DrawRBG<0, 4, 0, 1, 2, 2>, T_DrawRBG<0, 4, 0, 1, 2, 3>, }, }, }, - { { { T_DrawRBG<0, 8, 0, 0, 0, 0>, T_DrawRBG<0, 8, 0, 0, 0, 1>, T_DrawRBG<0, 8, 0, 0, 0, 2>, T_DrawRBG<0, 8, 0, 0, 0, 3>, }, { T_DrawRBG<0, 8, 0, 0, 1, 0>, T_DrawRBG<0, 8, 0, 0, 1, 1>, T_DrawRBG<0, 8, 0, 0, 1, 2>, T_DrawRBG<0, 8, 0, 0, 1, 3>, }, { T_DrawRBG<0, 8, 0, 0, 2, 0>, T_DrawRBG<0, 8, 0, 0, 2, 1>, T_DrawRBG<0, 8, 0, 0, 2, 2>, T_DrawRBG<0, 8, 0, 0, 2, 3>, }, }, { { T_DrawRBG<0, 8, 0, 1, 0, 0>, T_DrawRBG<0, 8, 0, 1, 0, 1>, T_DrawRBG<0, 8, 0, 1, 0, 2>, T_DrawRBG<0, 8, 0, 1, 0, 3>, }, { T_DrawRBG<0, 8, 0, 1, 1, 0>, T_DrawRBG<0, 8, 0, 1, 1, 1>, T_DrawRBG<0, 8, 0, 1, 1, 2>, T_DrawRBG<0, 8, 0, 1, 1, 3>, }, { T_DrawRBG<0, 8, 0, 1, 2, 0>, T_DrawRBG<0, 8, 0, 1, 2, 1>, T_DrawRBG<0, 8, 0, 1, 2, 2>, T_DrawRBG<0, 8, 0, 1, 2, 3>, }, }, }, - { { { T_DrawRBG<0, 16, 0, 0, 0, 0>, T_DrawRBG<0, 16, 0, 0, 0, 1>, T_DrawRBG<0, 16, 0, 0, 0, 2>, T_DrawRBG<0, 16, 0, 0, 0, 3>, }, { T_DrawRBG<0, 16, 0, 0, 1, 0>, T_DrawRBG<0, 16, 0, 0, 1, 1>, T_DrawRBG<0, 16, 0, 0, 1, 2>, T_DrawRBG<0, 16, 0, 0, 1, 3>, }, { T_DrawRBG<0, 16, 0, 0, 2, 0>, T_DrawRBG<0, 16, 0, 0, 2, 1>, T_DrawRBG<0, 16, 0, 0, 2, 2>, T_DrawRBG<0, 16, 0, 0, 2, 3>, }, }, { { T_DrawRBG<0, 16, 0, 1, 0, 0>, T_DrawRBG<0, 16, 0, 1, 0, 1>, T_DrawRBG<0, 16, 0, 1, 0, 2>, T_DrawRBG<0, 16, 0, 1, 0, 3>, }, { T_DrawRBG<0, 16, 0, 1, 1, 0>, T_DrawRBG<0, 16, 0, 1, 1, 1>, T_DrawRBG<0, 16, 0, 1, 1, 2>, T_DrawRBG<0, 16, 0, 1, 1, 3>, }, { T_DrawRBG<0, 16, 0, 1, 2, 0>, T_DrawRBG<0, 16, 0, 1, 2, 1>, T_DrawRBG<0, 16, 0, 1, 2, 2>, T_DrawRBG<0, 16, 0, 1, 2, 3>, }, }, }, - { { { T_DrawRBG<0, 16, 1, 0, 0, 0>, T_DrawRBG<0, 16, 1, 0, 0, 1>, T_DrawRBG<0, 16, 1, 0, 0, 2>, T_DrawRBG<0, 16, 1, 0, 0, 3>, }, { T_DrawRBG<0, 16, 1, 0, 1, 0>, T_DrawRBG<0, 16, 1, 0, 1, 1>, T_DrawRBG<0, 16, 1, 0, 1, 2>, T_DrawRBG<0, 16, 1, 0, 1, 3>, }, { T_DrawRBG<0, 16, 1, 0, 2, 0>, T_DrawRBG<0, 16, 1, 0, 2, 1>, T_DrawRBG<0, 16, 1, 0, 2, 2>, T_DrawRBG<0, 16, 1, 0, 2, 3>, }, }, { { T_DrawRBG<0, 16, 1, 1, 0, 0>, T_DrawRBG<0, 16, 1, 1, 0, 1>, T_DrawRBG<0, 16, 1, 1, 0, 2>, T_DrawRBG<0, 16, 1, 1, 0, 3>, }, { T_DrawRBG<0, 16, 1, 1, 1, 0>, T_DrawRBG<0, 16, 1, 1, 1, 1>, T_DrawRBG<0, 16, 1, 1, 1, 2>, T_DrawRBG<0, 16, 1, 1, 1, 3>, }, { T_DrawRBG<0, 16, 1, 1, 2, 0>, T_DrawRBG<0, 16, 1, 1, 2, 1>, T_DrawRBG<0, 16, 1, 1, 2, 2>, T_DrawRBG<0, 16, 1, 1, 2, 3>, }, }, }, - { { { T_DrawRBG<0, 32, 1, 0, 0, 0>, T_DrawRBG<0, 32, 1, 0, 0, 1>, T_DrawRBG<0, 32, 1, 0, 0, 2>, T_DrawRBG<0, 32, 1, 0, 0, 3>, }, { T_DrawRBG<0, 32, 1, 0, 1, 0>, T_DrawRBG<0, 32, 1, 0, 1, 1>, T_DrawRBG<0, 32, 1, 0, 1, 2>, T_DrawRBG<0, 32, 1, 0, 1, 3>, }, { T_DrawRBG<0, 32, 1, 0, 2, 0>, T_DrawRBG<0, 32, 1, 0, 2, 1>, T_DrawRBG<0, 32, 1, 0, 2, 2>, T_DrawRBG<0, 32, 1, 0, 2, 3>, }, }, { { T_DrawRBG<0, 32, 1, 1, 0, 0>, T_DrawRBG<0, 32, 1, 1, 0, 1>, T_DrawRBG<0, 32, 1, 1, 0, 2>, T_DrawRBG<0, 32, 1, 1, 0, 3>, }, { T_DrawRBG<0, 32, 1, 1, 1, 0>, T_DrawRBG<0, 32, 1, 1, 1, 1>, T_DrawRBG<0, 32, 1, 1, 1, 2>, T_DrawRBG<0, 32, 1, 1, 1, 3>, }, { T_DrawRBG<0, 32, 1, 1, 2, 0>, T_DrawRBG<0, 32, 1, 1, 2, 1>, T_DrawRBG<0, 32, 1, 1, 2, 2>, T_DrawRBG<0, 32, 1, 1, 2, 3>, }, }, }, - }, - { - { { { T_DrawRBG<1, 4, 0, 0, 0, 0>, T_DrawRBG<1, 4, 0, 0, 0, 1>, T_DrawRBG<1, 4, 0, 0, 0, 2>, T_DrawRBG<1, 4, 0, 0, 0, 3>, }, { T_DrawRBG<1, 4, 0, 0, 1, 0>, T_DrawRBG<1, 4, 0, 0, 1, 1>, T_DrawRBG<1, 4, 0, 0, 1, 2>, T_DrawRBG<1, 4, 0, 0, 1, 3>, }, { T_DrawRBG<1, 4, 0, 0, 2, 0>, T_DrawRBG<1, 4, 0, 0, 2, 1>, T_DrawRBG<1, 4, 0, 0, 2, 2>, T_DrawRBG<1, 4, 0, 0, 2, 3>, }, }, { { T_DrawRBG<1, 4, 0, 1, 0, 0>, T_DrawRBG<1, 4, 0, 1, 0, 1>, T_DrawRBG<1, 4, 0, 1, 0, 2>, T_DrawRBG<1, 4, 0, 1, 0, 3>, }, { T_DrawRBG<1, 4, 0, 1, 1, 0>, T_DrawRBG<1, 4, 0, 1, 1, 1>, T_DrawRBG<1, 4, 0, 1, 1, 2>, T_DrawRBG<1, 4, 0, 1, 1, 3>, }, { T_DrawRBG<1, 4, 0, 1, 2, 0>, T_DrawRBG<1, 4, 0, 1, 2, 1>, T_DrawRBG<1, 4, 0, 1, 2, 2>, T_DrawRBG<1, 4, 0, 1, 2, 3>, }, }, }, - { { { T_DrawRBG<1, 8, 0, 0, 0, 0>, T_DrawRBG<1, 8, 0, 0, 0, 1>, T_DrawRBG<1, 8, 0, 0, 0, 2>, T_DrawRBG<1, 8, 0, 0, 0, 3>, }, { T_DrawRBG<1, 8, 0, 0, 1, 0>, T_DrawRBG<1, 8, 0, 0, 1, 1>, T_DrawRBG<1, 8, 0, 0, 1, 2>, T_DrawRBG<1, 8, 0, 0, 1, 3>, }, { T_DrawRBG<1, 8, 0, 0, 2, 0>, T_DrawRBG<1, 8, 0, 0, 2, 1>, T_DrawRBG<1, 8, 0, 0, 2, 2>, T_DrawRBG<1, 8, 0, 0, 2, 3>, }, }, { { T_DrawRBG<1, 8, 0, 1, 0, 0>, T_DrawRBG<1, 8, 0, 1, 0, 1>, T_DrawRBG<1, 8, 0, 1, 0, 2>, T_DrawRBG<1, 8, 0, 1, 0, 3>, }, { T_DrawRBG<1, 8, 0, 1, 1, 0>, T_DrawRBG<1, 8, 0, 1, 1, 1>, T_DrawRBG<1, 8, 0, 1, 1, 2>, T_DrawRBG<1, 8, 0, 1, 1, 3>, }, { T_DrawRBG<1, 8, 0, 1, 2, 0>, T_DrawRBG<1, 8, 0, 1, 2, 1>, T_DrawRBG<1, 8, 0, 1, 2, 2>, T_DrawRBG<1, 8, 0, 1, 2, 3>, }, }, }, - { { { T_DrawRBG<1, 16, 0, 0, 0, 0>, T_DrawRBG<1, 16, 0, 0, 0, 1>, T_DrawRBG<1, 16, 0, 0, 0, 2>, T_DrawRBG<1, 16, 0, 0, 0, 3>, }, { T_DrawRBG<1, 16, 0, 0, 1, 0>, T_DrawRBG<1, 16, 0, 0, 1, 1>, T_DrawRBG<1, 16, 0, 0, 1, 2>, T_DrawRBG<1, 16, 0, 0, 1, 3>, }, { T_DrawRBG<1, 16, 0, 0, 2, 0>, T_DrawRBG<1, 16, 0, 0, 2, 1>, T_DrawRBG<1, 16, 0, 0, 2, 2>, T_DrawRBG<1, 16, 0, 0, 2, 3>, }, }, { { T_DrawRBG<1, 16, 0, 1, 0, 0>, T_DrawRBG<1, 16, 0, 1, 0, 1>, T_DrawRBG<1, 16, 0, 1, 0, 2>, T_DrawRBG<1, 16, 0, 1, 0, 3>, }, { T_DrawRBG<1, 16, 0, 1, 1, 0>, T_DrawRBG<1, 16, 0, 1, 1, 1>, T_DrawRBG<1, 16, 0, 1, 1, 2>, T_DrawRBG<1, 16, 0, 1, 1, 3>, }, { T_DrawRBG<1, 16, 0, 1, 2, 0>, T_DrawRBG<1, 16, 0, 1, 2, 1>, T_DrawRBG<1, 16, 0, 1, 2, 2>, T_DrawRBG<1, 16, 0, 1, 2, 3>, }, }, }, - { { { T_DrawRBG<1, 16, 1, 0, 0, 0>, T_DrawRBG<1, 16, 1, 0, 0, 1>, T_DrawRBG<1, 16, 1, 0, 0, 2>, T_DrawRBG<1, 16, 1, 0, 0, 3>, }, { T_DrawRBG<1, 16, 1, 0, 1, 0>, T_DrawRBG<1, 16, 1, 0, 1, 1>, T_DrawRBG<1, 16, 1, 0, 1, 2>, T_DrawRBG<1, 16, 1, 0, 1, 3>, }, { T_DrawRBG<1, 16, 1, 0, 2, 0>, T_DrawRBG<1, 16, 1, 0, 2, 1>, T_DrawRBG<1, 16, 1, 0, 2, 2>, T_DrawRBG<1, 16, 1, 0, 2, 3>, }, }, { { T_DrawRBG<1, 16, 1, 1, 0, 0>, T_DrawRBG<1, 16, 1, 1, 0, 1>, T_DrawRBG<1, 16, 1, 1, 0, 2>, T_DrawRBG<1, 16, 1, 1, 0, 3>, }, { T_DrawRBG<1, 16, 1, 1, 1, 0>, T_DrawRBG<1, 16, 1, 1, 1, 1>, T_DrawRBG<1, 16, 1, 1, 1, 2>, T_DrawRBG<1, 16, 1, 1, 1, 3>, }, { T_DrawRBG<1, 16, 1, 1, 2, 0>, T_DrawRBG<1, 16, 1, 1, 2, 1>, T_DrawRBG<1, 16, 1, 1, 2, 2>, T_DrawRBG<1, 16, 1, 1, 2, 3>, }, }, }, - { { { T_DrawRBG<1, 32, 1, 0, 0, 0>, T_DrawRBG<1, 32, 1, 0, 0, 1>, T_DrawRBG<1, 32, 1, 0, 0, 2>, T_DrawRBG<1, 32, 1, 0, 0, 3>, }, { T_DrawRBG<1, 32, 1, 0, 1, 0>, T_DrawRBG<1, 32, 1, 0, 1, 1>, T_DrawRBG<1, 32, 1, 0, 1, 2>, T_DrawRBG<1, 32, 1, 0, 1, 3>, }, { T_DrawRBG<1, 32, 1, 0, 2, 0>, T_DrawRBG<1, 32, 1, 0, 2, 1>, T_DrawRBG<1, 32, 1, 0, 2, 2>, T_DrawRBG<1, 32, 1, 0, 2, 3>, }, }, { { T_DrawRBG<1, 32, 1, 1, 0, 0>, T_DrawRBG<1, 32, 1, 1, 0, 1>, T_DrawRBG<1, 32, 1, 1, 0, 2>, T_DrawRBG<1, 32, 1, 1, 0, 3>, }, { T_DrawRBG<1, 32, 1, 1, 1, 0>, T_DrawRBG<1, 32, 1, 1, 1, 1>, T_DrawRBG<1, 32, 1, 1, 1, 2>, T_DrawRBG<1, 32, 1, 1, 1, 3>, }, { T_DrawRBG<1, 32, 1, 1, 2, 0>, T_DrawRBG<1, 32, 1, 1, 2, 1>, T_DrawRBG<1, 32, 1, 1, 2, 2>, T_DrawRBG<1, 32, 1, 1, 2, 3>, }, }, }, - } -}; - -template -static INLINE void Doubleize(T* ptr, const int orig_len) -{ - for(int i = orig_len - 1; MDFN_LIKELY(i >= 0); i--) - { - auto tmp = *(ptr + i); - - *(ptr + (i << 1) + 0) = tmp; - *(ptr + (i << 1) + 1) = tmp; - } -} - -static void RBGPP(const unsigned layer, uint64* buf, const unsigned rbg_w) -{ - ApplyHMosaic(layer, buf, rbg_w); - - for(unsigned i = 0; i < rbg_w; i++) - { - uint64 tmp = buf[i]; - - if(LB.rotabsel[i]) - tmp &= ~(uint64)0xFFFFFFFF; - - buf[i] = tmp; - } - - if(HRes & 0x2) - Doubleize(buf, rbg_w); - - ApplyWin(layer, buf); -} - -// Call before DrawSpriteData() -static INLINE void MakeSpriteCCLUT(void) -{ - const bool cce = ((CCCTL >> 6) & 1); - - for(unsigned pr = 0; pr < 8; pr++) - { - bool mask = false; - - switch(SpriteCCCond) - { - case 0: mask = (SpritePrioNum[pr] <= SpriteCCNum); break; - case 1: mask = (SpritePrioNum[pr] == SpriteCCNum); break; - case 2: mask = (SpritePrioNum[pr] >= SpriteCCNum); break; - } - SpriteCCLUT[pr] = (cce & mask) << PIX_CCE_SHIFT; - } - - SpriteCC3Mask = 0; - if(SpriteCCCond == 3 && cce) - SpriteCC3Mask = 1U << PIX_CCE_SHIFT; -} - -template -static void T_DrawSpriteData(const uint16* vdp1sb, const bool vdp1_hires8, unsigned w) -{ - const unsigned SpriteType = (TA_SPCTL_Low & 0xF); - const bool SpriteWinEn = (TA_SPCTL_Low & 0x10); - const bool SpriteColorMode = (TA_SPCTL_Low & 0x20); - // - const size_t cao = CRAMAddrOffs_Sprite << 8; - uint32 spix_base_or = 0; - - spix_base_or |= ((ColorOffsEn >> 6) & 1) << PIX_COE_SHIFT; - spix_base_or |= ((ColorOffsSel >> 6) & 1) << PIX_COSEL_SHIFT; - spix_base_or |= ((LineColorEn >> 5/*5 here, not 6*/) & 1) << PIX_LCE_SHIFT; - spix_base_or |= (((CCCTL >> 12) & 0x7) == 0x0) << PIX_GRAD_SHIFT; - spix_base_or |= ((CCCTL >> 6) & 1) << PIX_LAYER_CCE_SHIFT; - - for(unsigned i = 0; MDFN_LIKELY(i < w); i++) - { - unsigned src; - unsigned pr = 0, cc = 0; - bool tp = false; - uint64 spix; - - src = vdp1sb[i >> TA_HiRes]; - - if(vdp1_hires8) - { - if(TA_HiRes) - src = 0xFF00 | (src >> (((i & 1) ^ 1) << 3)); - else - src = 0xFF00 | (src >> 8); - } - - if(SpriteColorMode && (src & 0x8000)) - { - spix = (uint64)rgb15_to_rgb24(src) << PIX_RGB_SHIFT; - spix |= 1U << PIX_ISRGB_SHIFT; - spix |= SpriteCC3Mask; - - if(SpriteType & 0x8) - tp = !(src & 0xFF); - else if(SpriteWinEn) - { - if(SpriteType >= 0x2 && SpriteType <= 0x7) - tp = !(src & 0x7FFF); - } - } - else - { - bool nshad = false; - bool sd = false; - unsigned dc; - - if(SpriteType & 0x8) - src &= 0xFF; - - tp = !src; - - switch(SpriteType) - { - case 0x0: - pr = (src >> 14) & 0x3; - cc = (src >> 11) & 0x7; - dc = src & 0x7FF; - nshad = (dc == 0x7FE); - break; - - case 0x1: - pr = (src >> 13) & 0x7; - cc = (src >> 11) & 0x3; - dc = src & 0x7FF; - nshad = (dc == 0x7FE); - break; - - case 0x2: - sd = (src >> 15) & 0x1; - pr = (src >> 14) & 0x1; - cc = (src >> 11) & 0x7; - dc = src & 0x7FF; - nshad = (dc == 0x7FE); - break; - - case 0x3: - sd = (src >> 15) & 0x1; - pr = (src >> 13) & 0x3; - cc = (src >> 11) & 0x3; - dc = src & 0x7FF; - nshad = (dc == 0x7FE); - break; - - case 0x4: - sd = (src >> 15) & 0x1; - pr = (src >> 13) & 0x3; - cc = (src >> 10) & 0x7; - dc = src & 0x3FF; - nshad = (dc == 0x3FE); - break; - - case 0x5: - sd = (src >> 15) & 0x1; - pr = (src >> 12) & 0x7; - cc = (src >> 11) & 0x1; - dc = src & 0x7FF; - nshad = (dc == 0x7FE); - break; - - case 0x6: - sd = (src >> 15) & 0x1; - pr = (src >> 12) & 0x7; - cc = (src >> 10) & 0x3; - dc = src & 0x3FF; - nshad = (dc == 0x3FE); - break; - - case 0x7: - sd = (src >> 15) & 0x1; - pr = (src >> 12) & 0x7; - cc = (src >> 9) & 0x7; - dc = src & 0x1FF; - nshad = (dc == 0x1FE); - break; - // - // - // - case 0x8: - pr = (src >> 7) & 0x1; - dc = src & 0x7F; - nshad = (dc == 0x7E); - break; - - case 0x9: - pr = (src >> 7) & 0x1; - cc = (src >> 6) & 0x1; - dc = src & 0x3F; - nshad = (dc == 0x3E); - break; - - case 0xA: - pr = (src >> 6) & 0x3; - dc = src & 0x3F; - nshad = (dc == 0x3E); - break; - - case 0xB: - cc = (src >> 6) & 0x3; - dc = src & 0x3F; - nshad = (dc == 0x3E); - break; - // - case 0xC: - pr = (src >> 7) & 0x1; - dc = src & 0xFF; - nshad = (dc == 0xFE); - break; - - case 0xD: - pr = (src >> 7) & 0x1; - cc = (src >> 6) & 0x1; - dc = src & 0xFF; - nshad = (dc == 0xFE); - break; - - case 0xE: - pr = (src >> 6) & 0x3; - dc = src & 0xFF; - nshad = (dc == 0xFE); - break; - - case 0xF: - cc = (src >> 6) & 0x3; - dc = src & 0xFF; - nshad = (dc == 0xFE); - break; - } - // - // - // - uint32 rgb24 = ColorCache[(cao + dc) & 0x7FF]; - - spix = (uint64)rgb24 << PIX_RGB_SHIFT; - - spix |= ((int32)rgb24 >> 31) & SpriteCC3Mask; - - if(SpriteWinEn) // Sprite window enable - spix |= ((uint64)sd << PIX_SWBIT_SHIFT); - - if(nshad) - spix |= 1 << PIX_DOSHAD_SHIFT; - else - { - if(SpriteWinEn) - { - if(SpriteType >= 0x2 && SpriteType <= 0x7) - tp = !(src & 0x7FFF); - } - else if(sd) - { - if(src & 0x7FFF) - spix |= 1 << PIX_SELFSHAD_SHIFT; - else if(TA_TPShadSel) - spix |= 1 << PIX_DOSHAD_SHIFT; - else - tp = true; - } - } - } - - spix |= spix_base_or; - spix |= (tp ? 0 : SpritePrioNum[pr]) << PIX_PRIO_SHIFT; - spix |= SpriteCCRatio[cc] << PIX_CCRATIO_SHIFT; - spix |= SpriteCCLUT[pr]; - - LB.spr[i] = spix; - } -} - -static void (*DrawSpriteData[2][2][0x40])(const uint16* vdp1sb, const bool vdp1_hires8, unsigned w) = -{ - { - { T_DrawSpriteData<0, 0, 0x00>, T_DrawSpriteData<0, 0, 0x01>, T_DrawSpriteData<0, 0, 0x02>, T_DrawSpriteData<0, 0, 0x03>, T_DrawSpriteData<0, 0, 0x04>, T_DrawSpriteData<0, 0, 0x05>, T_DrawSpriteData<0, 0, 0x06>, T_DrawSpriteData<0, 0, 0x07>, T_DrawSpriteData<0, 0, 0x08>, T_DrawSpriteData<0, 0, 0x09>, T_DrawSpriteData<0, 0, 0x0a>, T_DrawSpriteData<0, 0, 0x0b>, T_DrawSpriteData<0, 0, 0x0c>, T_DrawSpriteData<0, 0, 0x0d>, T_DrawSpriteData<0, 0, 0x0e>, T_DrawSpriteData<0, 0, 0x0f>, T_DrawSpriteData<0, 0, 0x10>, T_DrawSpriteData<0, 0, 0x11>, T_DrawSpriteData<0, 0, 0x12>, T_DrawSpriteData<0, 0, 0x13>, T_DrawSpriteData<0, 0, 0x14>, T_DrawSpriteData<0, 0, 0x15>, T_DrawSpriteData<0, 0, 0x16>, T_DrawSpriteData<0, 0, 0x17>, T_DrawSpriteData<0, 0, 0x18>, T_DrawSpriteData<0, 0, 0x19>, T_DrawSpriteData<0, 0, 0x1a>, T_DrawSpriteData<0, 0, 0x1b>, T_DrawSpriteData<0, 0, 0x1c>, T_DrawSpriteData<0, 0, 0x1d>, T_DrawSpriteData<0, 0, 0x1e>, T_DrawSpriteData<0, 0, 0x1f>, T_DrawSpriteData<0, 0, 0x20>, T_DrawSpriteData<0, 0, 0x21>, T_DrawSpriteData<0, 0, 0x22>, T_DrawSpriteData<0, 0, 0x23>, T_DrawSpriteData<0, 0, 0x24>, T_DrawSpriteData<0, 0, 0x25>, T_DrawSpriteData<0, 0, 0x26>, T_DrawSpriteData<0, 0, 0x27>, T_DrawSpriteData<0, 0, 0x28>, T_DrawSpriteData<0, 0, 0x29>, T_DrawSpriteData<0, 0, 0x2a>, T_DrawSpriteData<0, 0, 0x2b>, T_DrawSpriteData<0, 0, 0x2c>, T_DrawSpriteData<0, 0, 0x2d>, T_DrawSpriteData<0, 0, 0x2e>, T_DrawSpriteData<0, 0, 0x2f>, T_DrawSpriteData<0, 0, 0x30>, T_DrawSpriteData<0, 0, 0x31>, T_DrawSpriteData<0, 0, 0x32>, T_DrawSpriteData<0, 0, 0x33>, T_DrawSpriteData<0, 0, 0x34>, T_DrawSpriteData<0, 0, 0x35>, T_DrawSpriteData<0, 0, 0x36>, T_DrawSpriteData<0, 0, 0x37>, T_DrawSpriteData<0, 0, 0x38>, T_DrawSpriteData<0, 0, 0x39>, T_DrawSpriteData<0, 0, 0x3a>, T_DrawSpriteData<0, 0, 0x3b>, T_DrawSpriteData<0, 0, 0x3c>, T_DrawSpriteData<0, 0, 0x3d>, T_DrawSpriteData<0, 0, 0x3e>, T_DrawSpriteData<0, 0, 0x3f> }, - { T_DrawSpriteData<0, 1, 0x00>, T_DrawSpriteData<0, 1, 0x01>, T_DrawSpriteData<0, 1, 0x02>, T_DrawSpriteData<0, 1, 0x03>, T_DrawSpriteData<0, 1, 0x04>, T_DrawSpriteData<0, 1, 0x05>, T_DrawSpriteData<0, 1, 0x06>, T_DrawSpriteData<0, 1, 0x07>, T_DrawSpriteData<0, 1, 0x08>, T_DrawSpriteData<0, 1, 0x09>, T_DrawSpriteData<0, 1, 0x0a>, T_DrawSpriteData<0, 1, 0x0b>, T_DrawSpriteData<0, 1, 0x0c>, T_DrawSpriteData<0, 1, 0x0d>, T_DrawSpriteData<0, 1, 0x0e>, T_DrawSpriteData<0, 1, 0x0f>, T_DrawSpriteData<0, 1, 0x10>, T_DrawSpriteData<0, 1, 0x11>, T_DrawSpriteData<0, 1, 0x12>, T_DrawSpriteData<0, 1, 0x13>, T_DrawSpriteData<0, 1, 0x14>, T_DrawSpriteData<0, 1, 0x15>, T_DrawSpriteData<0, 1, 0x16>, T_DrawSpriteData<0, 1, 0x17>, T_DrawSpriteData<0, 1, 0x18>, T_DrawSpriteData<0, 1, 0x19>, T_DrawSpriteData<0, 1, 0x1a>, T_DrawSpriteData<0, 1, 0x1b>, T_DrawSpriteData<0, 1, 0x1c>, T_DrawSpriteData<0, 1, 0x1d>, T_DrawSpriteData<0, 1, 0x1e>, T_DrawSpriteData<0, 1, 0x1f>, T_DrawSpriteData<0, 1, 0x20>, T_DrawSpriteData<0, 1, 0x21>, T_DrawSpriteData<0, 1, 0x22>, T_DrawSpriteData<0, 1, 0x23>, T_DrawSpriteData<0, 1, 0x24>, T_DrawSpriteData<0, 1, 0x25>, T_DrawSpriteData<0, 1, 0x26>, T_DrawSpriteData<0, 1, 0x27>, T_DrawSpriteData<0, 1, 0x28>, T_DrawSpriteData<0, 1, 0x29>, T_DrawSpriteData<0, 1, 0x2a>, T_DrawSpriteData<0, 1, 0x2b>, T_DrawSpriteData<0, 1, 0x2c>, T_DrawSpriteData<0, 1, 0x2d>, T_DrawSpriteData<0, 1, 0x2e>, T_DrawSpriteData<0, 1, 0x2f>, T_DrawSpriteData<0, 1, 0x30>, T_DrawSpriteData<0, 1, 0x31>, T_DrawSpriteData<0, 1, 0x32>, T_DrawSpriteData<0, 1, 0x33>, T_DrawSpriteData<0, 1, 0x34>, T_DrawSpriteData<0, 1, 0x35>, T_DrawSpriteData<0, 1, 0x36>, T_DrawSpriteData<0, 1, 0x37>, T_DrawSpriteData<0, 1, 0x38>, T_DrawSpriteData<0, 1, 0x39>, T_DrawSpriteData<0, 1, 0x3a>, T_DrawSpriteData<0, 1, 0x3b>, T_DrawSpriteData<0, 1, 0x3c>, T_DrawSpriteData<0, 1, 0x3d>, T_DrawSpriteData<0, 1, 0x3e>, T_DrawSpriteData<0, 1, 0x3f> }, - }, - { - { T_DrawSpriteData<1, 0, 0x00>, T_DrawSpriteData<1, 0, 0x01>, T_DrawSpriteData<1, 0, 0x02>, T_DrawSpriteData<1, 0, 0x03>, T_DrawSpriteData<1, 0, 0x04>, T_DrawSpriteData<1, 0, 0x05>, T_DrawSpriteData<1, 0, 0x06>, T_DrawSpriteData<1, 0, 0x07>, T_DrawSpriteData<1, 0, 0x08>, T_DrawSpriteData<1, 0, 0x09>, T_DrawSpriteData<1, 0, 0x0a>, T_DrawSpriteData<1, 0, 0x0b>, T_DrawSpriteData<1, 0, 0x0c>, T_DrawSpriteData<1, 0, 0x0d>, T_DrawSpriteData<1, 0, 0x0e>, T_DrawSpriteData<1, 0, 0x0f>, T_DrawSpriteData<1, 0, 0x10>, T_DrawSpriteData<1, 0, 0x11>, T_DrawSpriteData<1, 0, 0x12>, T_DrawSpriteData<1, 0, 0x13>, T_DrawSpriteData<1, 0, 0x14>, T_DrawSpriteData<1, 0, 0x15>, T_DrawSpriteData<1, 0, 0x16>, T_DrawSpriteData<1, 0, 0x17>, T_DrawSpriteData<1, 0, 0x18>, T_DrawSpriteData<1, 0, 0x19>, T_DrawSpriteData<1, 0, 0x1a>, T_DrawSpriteData<1, 0, 0x1b>, T_DrawSpriteData<1, 0, 0x1c>, T_DrawSpriteData<1, 0, 0x1d>, T_DrawSpriteData<1, 0, 0x1e>, T_DrawSpriteData<1, 0, 0x1f>, T_DrawSpriteData<1, 0, 0x20>, T_DrawSpriteData<1, 0, 0x21>, T_DrawSpriteData<1, 0, 0x22>, T_DrawSpriteData<1, 0, 0x23>, T_DrawSpriteData<1, 0, 0x24>, T_DrawSpriteData<1, 0, 0x25>, T_DrawSpriteData<1, 0, 0x26>, T_DrawSpriteData<1, 0, 0x27>, T_DrawSpriteData<1, 0, 0x28>, T_DrawSpriteData<1, 0, 0x29>, T_DrawSpriteData<1, 0, 0x2a>, T_DrawSpriteData<1, 0, 0x2b>, T_DrawSpriteData<1, 0, 0x2c>, T_DrawSpriteData<1, 0, 0x2d>, T_DrawSpriteData<1, 0, 0x2e>, T_DrawSpriteData<1, 0, 0x2f>, T_DrawSpriteData<1, 0, 0x30>, T_DrawSpriteData<1, 0, 0x31>, T_DrawSpriteData<1, 0, 0x32>, T_DrawSpriteData<1, 0, 0x33>, T_DrawSpriteData<1, 0, 0x34>, T_DrawSpriteData<1, 0, 0x35>, T_DrawSpriteData<1, 0, 0x36>, T_DrawSpriteData<1, 0, 0x37>, T_DrawSpriteData<1, 0, 0x38>, T_DrawSpriteData<1, 0, 0x39>, T_DrawSpriteData<1, 0, 0x3a>, T_DrawSpriteData<1, 0, 0x3b>, T_DrawSpriteData<1, 0, 0x3c>, T_DrawSpriteData<1, 0, 0x3d>, T_DrawSpriteData<1, 0, 0x3e>, T_DrawSpriteData<1, 0, 0x3f> }, - { T_DrawSpriteData<1, 1, 0x00>, T_DrawSpriteData<1, 1, 0x01>, T_DrawSpriteData<1, 1, 0x02>, T_DrawSpriteData<1, 1, 0x03>, T_DrawSpriteData<1, 1, 0x04>, T_DrawSpriteData<1, 1, 0x05>, T_DrawSpriteData<1, 1, 0x06>, T_DrawSpriteData<1, 1, 0x07>, T_DrawSpriteData<1, 1, 0x08>, T_DrawSpriteData<1, 1, 0x09>, T_DrawSpriteData<1, 1, 0x0a>, T_DrawSpriteData<1, 1, 0x0b>, T_DrawSpriteData<1, 1, 0x0c>, T_DrawSpriteData<1, 1, 0x0d>, T_DrawSpriteData<1, 1, 0x0e>, T_DrawSpriteData<1, 1, 0x0f>, T_DrawSpriteData<1, 1, 0x10>, T_DrawSpriteData<1, 1, 0x11>, T_DrawSpriteData<1, 1, 0x12>, T_DrawSpriteData<1, 1, 0x13>, T_DrawSpriteData<1, 1, 0x14>, T_DrawSpriteData<1, 1, 0x15>, T_DrawSpriteData<1, 1, 0x16>, T_DrawSpriteData<1, 1, 0x17>, T_DrawSpriteData<1, 1, 0x18>, T_DrawSpriteData<1, 1, 0x19>, T_DrawSpriteData<1, 1, 0x1a>, T_DrawSpriteData<1, 1, 0x1b>, T_DrawSpriteData<1, 1, 0x1c>, T_DrawSpriteData<1, 1, 0x1d>, T_DrawSpriteData<1, 1, 0x1e>, T_DrawSpriteData<1, 1, 0x1f>, T_DrawSpriteData<1, 1, 0x20>, T_DrawSpriteData<1, 1, 0x21>, T_DrawSpriteData<1, 1, 0x22>, T_DrawSpriteData<1, 1, 0x23>, T_DrawSpriteData<1, 1, 0x24>, T_DrawSpriteData<1, 1, 0x25>, T_DrawSpriteData<1, 1, 0x26>, T_DrawSpriteData<1, 1, 0x27>, T_DrawSpriteData<1, 1, 0x28>, T_DrawSpriteData<1, 1, 0x29>, T_DrawSpriteData<1, 1, 0x2a>, T_DrawSpriteData<1, 1, 0x2b>, T_DrawSpriteData<1, 1, 0x2c>, T_DrawSpriteData<1, 1, 0x2d>, T_DrawSpriteData<1, 1, 0x2e>, T_DrawSpriteData<1, 1, 0x2f>, T_DrawSpriteData<1, 1, 0x30>, T_DrawSpriteData<1, 1, 0x31>, T_DrawSpriteData<1, 1, 0x32>, T_DrawSpriteData<1, 1, 0x33>, T_DrawSpriteData<1, 1, 0x34>, T_DrawSpriteData<1, 1, 0x35>, T_DrawSpriteData<1, 1, 0x36>, T_DrawSpriteData<1, 1, 0x37>, T_DrawSpriteData<1, 1, 0x38>, T_DrawSpriteData<1, 1, 0x39>, T_DrawSpriteData<1, 1, 0x3a>, T_DrawSpriteData<1, 1, 0x3b>, T_DrawSpriteData<1, 1, 0x3c>, T_DrawSpriteData<1, 1, 0x3d>, T_DrawSpriteData<1, 1, 0x3e>, T_DrawSpriteData<1, 1, 0x3f> }, - } -}; - -// Don't change these constants without also updating the template variable -// setup for the call into MixIt(and the contents of MixIt itself...). -enum -{ - MIXIT_SPECIAL_NONE = 0x0, - MIXIT_SPECIAL_GRAD = 0x1, - MIXIT_SPECIAL_EXCC_CRAM0 = 0x2, - MIXIT_SPECIAL_EXCC_CRAM12 = 0x3, - MIXIT_SPECIAL_EXCC_LINE_CRAM0 = 0x4, - MIXIT_SPECIAL_EXCC_LINE_CRAM12 = 0x5 -}; - -template -static void T_MixIt(uint32* target, const unsigned vdp2_line, const unsigned w, const uint32 back_rgb24, const uint64* blursrc) -{ - //printf("MixIt: %d, %d, %d, %d\n", TA_rbg1en, TA_Special, TA_CCRTMD, TA_CCMD); - const uint32* lclut = &ColorCache[CurLCColor &~ 0x7F]; - uint32 blurprev[2]; - - if(TA_Special == MIXIT_SPECIAL_GRAD) - blurprev[0] = blurprev[1] = *blursrc >> PIX_RGB_SHIFT; - - uint32 line_pix_l; - { - line_pix_l = 0U << PIX_ISRGB_SHIFT; - line_pix_l |= LineColorCCRatio << PIX_CCRATIO_SHIFT; - line_pix_l |= ((CCCTL >> 5) & 1) << PIX_CCE_SHIFT; - line_pix_l |= ((CCCTL >> 5) & 1) << PIX_LAYER_CCE_SHIFT; - } - - // - // - uint64 back_pix; - { - back_pix = (uint64)back_rgb24 << PIX_RGB_SHIFT; - back_pix |= 1U << PIX_ISRGB_SHIFT; - back_pix |= ((ColorOffsEn >> 5) & 1) << PIX_COE_SHIFT; - back_pix |= ((ColorOffsSel >> 5) & 1) << PIX_COSEL_SHIFT; - back_pix |= ((SDCTL >> 5) & 1) << PIX_SHADEN_SHIFT; - back_pix |= BackCCRatio << PIX_CCRATIO_SHIFT; - } - - for(uint32 i = 0; MDFN_LIKELY(i < w); i++) - { - uint64 pix = back_pix; - uint32 blurcake; - - // - // Listed from lowest priority to greatest priority when prio levels are equal(back pixel has prio level of 0, - // and should display on "top" of any other layers). - // - uint64 tmp_pix[8] = - { - (TA_rbg1en ? 0 : (LB.nbg[3] + 8)[i]), - (TA_rbg1en ? 0 : (LB.nbg[2] + 8)[i]), - (TA_rbg1en ? 0 : (LB.nbg[1] + 8)[i]), - (LB.nbg[0] + 8)[i], - LB.rbg0[i], - LB.spr[i], - 0/*null pixel*/, - back_pix - }; - uint64 pt; - unsigned st; - - pt = 0x01ULL << (uint8)(tmp_pix[0] >> PIX_PRIO_TEST_SHIFT); - pt |= 0x02ULL << (uint8)(tmp_pix[1] >> PIX_PRIO_TEST_SHIFT); - pt |= 0x04ULL << (uint8)(tmp_pix[2] >> PIX_PRIO_TEST_SHIFT); - pt |= 0x08ULL << (uint8)(tmp_pix[3] >> PIX_PRIO_TEST_SHIFT); - pt |= 0x10ULL << (uint8)(tmp_pix[4] >> PIX_PRIO_TEST_SHIFT); - pt |= 0x20ULL << (uint8)(tmp_pix[5] >> PIX_PRIO_TEST_SHIFT); - pt |= 0xC0ULL; // Back pixel(0x80) and null pixel(0x40) - - st = 63 ^ MDFN_lzcount64_0UD(pt); - pt ^= 1ULL << st; - pt |= 0x40; // Restore the null! - pix = tmp_pix[st & 0x7]; - - if(pix & (1U << PIX_DOSHAD_SHIFT)) - { - st = 63 ^ MDFN_lzcount64_0UD(pt); - pt ^= 1ULL << st; - pt |= 0x40; // Restore the null! - pix = tmp_pix[st & 0x7]; - pix |= (1U << PIX_DOSHAD_SHIFT); - } - - if(TA_Special == MIXIT_SPECIAL_GRAD) - { - const uint32 blurpie = blursrc[i] >> PIX_RGB_SHIFT; - - blurcake = ((blurprev[0] + blurprev[1]) - ((blurprev[0] ^ blurprev[1]) & 0x01010101)) >> 1; - blurcake = ((blurcake + blurpie) - ((blurcake ^ blurpie) & 0x01010101)) >> 1; - blurprev[0] = blurprev[1]; - blurprev[1] = blurpie; - } - - // - // Color calculation - // - if(pix & (1U << PIX_CCE_SHIFT)) - { - uint64 pix2, pix3; - - st = 63 ^ MDFN_lzcount64_0UD(pt); - pt ^= 1ULL << st; - pt |= 0x40; // Restore the null! - pix2 = tmp_pix[st & 0x7]; - - st = 63 ^ MDFN_lzcount64_0UD(pt); - pt ^= 1ULL << st; - pt |= 0x40; // Restore the null! - pix3 = tmp_pix[st & 0x7]; - - if(TA_Special == MIXIT_SPECIAL_GRAD) - { - if((pix | pix2) & (1U << PIX_GRAD_SHIFT)) - pix2 = (uint32)pix2 | ((uint64)blurcake << PIX_RGB_SHIFT); // Be sure to preserve the color calc ratio, at least. - } - else if(pix & (1U << PIX_LCE_SHIFT)) - { - // - // Line color - // - const uint64 pix4 = pix3; - const uint32 line_pix_rgb = lclut[LB.lc[i]]; - pix3 = pix2; - pix2 = line_pix_l | ((uint64)line_pix_rgb << PIX_RGB_SHIFT); - - if(TA_Special == MIXIT_SPECIAL_EXCC_LINE_CRAM0) - { - uint32 sec_rgb = line_pix_rgb; - uint32 third_rgb = (pix3 >> PIX_RGB_SHIFT); - - if(pix3 & (1U << PIX_LAYER_CCE_SHIFT)) - third_rgb = (third_rgb >> 1) & 0x7F7F7F; - - sec_rgb = ((sec_rgb + third_rgb) - ((sec_rgb ^ third_rgb) & 0x01010101)) >> 1; - pix2 = (uint32)pix2 | ((uint64)sec_rgb << PIX_RGB_SHIFT); - } - else if(TA_Special == MIXIT_SPECIAL_EXCC_LINE_CRAM12) - { - uint32 sec_rgb = line_pix_rgb; - uint32 third_rgb = (pix3 >> PIX_RGB_SHIFT); - - if(pix3 & (1U << PIX_ISRGB_SHIFT)) - { - if((pix3 & (1U << PIX_LAYER_CCE_SHIFT)) && (pix4 & (1U << PIX_ISRGB_SHIFT))) - { - const uint32 fourth_rgb = (pix4 >> PIX_RGB_SHIFT); - third_rgb = ((third_rgb + fourth_rgb) - ((third_rgb ^ fourth_rgb) & 0x01010101)) >> 1; - } - - sec_rgb = ((sec_rgb + third_rgb) - ((sec_rgb ^ third_rgb) & 0x01010101)) >> 1; - pix2 = (uint32)pix2 | ((uint64)sec_rgb << PIX_RGB_SHIFT); - } - } - } - else - { - if(TA_Special == MIXIT_SPECIAL_EXCC_CRAM0 || TA_Special == MIXIT_SPECIAL_EXCC_CRAM12 || TA_Special == MIXIT_SPECIAL_EXCC_LINE_CRAM0 || TA_Special == MIXIT_SPECIAL_EXCC_LINE_CRAM12) - { - if(pix2 & (1U << PIX_LAYER_CCE_SHIFT)) - { - if(TA_Special == MIXIT_SPECIAL_EXCC_CRAM0 || TA_Special == MIXIT_SPECIAL_EXCC_LINE_CRAM0 || (pix3 & (1U << PIX_ISRGB_SHIFT))) - { - uint32 sec_rgb = pix2 >> PIX_RGB_SHIFT; - const uint32 third_rgb = (pix3 >> PIX_RGB_SHIFT); - - sec_rgb = ((sec_rgb + third_rgb) - ((sec_rgb ^ third_rgb) & 0x01010101)) >> 1; - pix2 = (uint32)pix2 | ((uint64)sec_rgb << PIX_RGB_SHIFT); - } - } - } - } - - uint32 fore_rgb = pix >> PIX_RGB_SHIFT; - uint32 sec_rgb = pix2 >> PIX_RGB_SHIFT; - uint32 new_rgb; - - if(TA_CCMD) // Ignore ratio, add as-is. - { - new_rgb = std::min(0x0000FF, (fore_rgb & 0x0000FF) + (sec_rgb & 0x0000FF)); - new_rgb |= std::min(0x00FF00, (fore_rgb & 0x00FF00) + (sec_rgb & 0x00FF00)); - new_rgb |= std::min(0xFF0000, (fore_rgb & 0xFF0000) + (sec_rgb & 0xFF0000)); - } - else - { - unsigned fore_ratio = ((uint32)(TA_CCRTMD ? pix2 : pix) >> PIX_CCRATIO_SHIFT) ^ 0x1F; - unsigned sec_ratio = 0x20 - fore_ratio; - - new_rgb = ((((fore_rgb & 0x0000FF) * fore_ratio) + ((sec_rgb & 0x0000FF) * sec_ratio)) >> 5); - new_rgb |= ((((fore_rgb & 0x00FF00) * fore_ratio) + ((sec_rgb & 0x00FF00) * sec_ratio)) >> 5) & 0x00FF00; - new_rgb |= ((((fore_rgb & 0xFF0000) * fore_ratio) + ((sec_rgb & 0xFF0000) * sec_ratio)) >> 5) & 0xFF0000; - } - pix = ((uint64)new_rgb << 32) | (uint32)pix; - } - - // - // Color offset - // - if(pix & (1U << PIX_COE_SHIFT)) - { - const unsigned sel = (pix >> PIX_COSEL_SHIFT) & 1; - const uint32 rgb_tmp = pix >> PIX_RGB_SHIFT; - int32 rt, gt, bt; - - rt = ColorOffs[sel][0] + (rgb_tmp & 0x000000FF); - if(rt < 0) rt = 0; - if(rt & 0x00000100) rt = 0x000000FF; - - gt = ColorOffs[sel][1] + (rgb_tmp & 0x0000FF00); - if(gt < 0) gt = 0; - if(gt & 0x00010000) gt = 0x0000FF00; - - bt = ColorOffs[sel][2] + (rgb_tmp & 0x00FF0000); - if(bt < 0) bt = 0; - if(bt & 0x01000000) bt = 0x00FF0000; - - pix = (uint32)pix | ((uint64)(uint32)(rt | gt | bt) << PIX_RGB_SHIFT); - } - - // - // Sprite shadow - // - if((uint8)pix >= PIX_SHADHALVTEST8_VAL) - pix = (uint32)pix | ((pix >> 1) & 0x7F7F7F00000000ULL); - - target[i] = pix >> PIX_RGB_SHIFT; - } -} - -//template -static void (*MixIt[2][6][2][2])(uint32* target, const unsigned vdp2_line, const unsigned w, const uint32 back_rgb24, const uint64* blursrc) = -{ - { { { T_MixIt<0, 0, 0, 0>, T_MixIt<0, 0, 0, 1>, }, { T_MixIt<0, 0, 1, 0>, T_MixIt<0, 0, 1, 1>, }, }, { { T_MixIt<0, 1, 0, 0>, T_MixIt<0, 1, 0, 1>, }, { T_MixIt<0, 1, 1, 0>, T_MixIt<0, 1, 1, 1>, }, }, { { T_MixIt<0, 2, 0, 0>, T_MixIt<0, 2, 0, 1>, }, { T_MixIt<0, 2, 1, 0>, T_MixIt<0, 2, 1, 1>, }, }, { { T_MixIt<0, 3, 0, 0>, T_MixIt<0, 3, 0, 1>, }, { T_MixIt<0, 3, 1, 0>, T_MixIt<0, 3, 1, 1>, }, }, { { T_MixIt<0, 4, 0, 0>, T_MixIt<0, 4, 0, 1>, }, { T_MixIt<0, 4, 1, 0>, T_MixIt<0, 4, 1, 1>, }, }, { { T_MixIt<0, 5, 0, 0>, T_MixIt<0, 5, 0, 1>, }, { T_MixIt<0, 5, 1, 0>, T_MixIt<0, 5, 1, 1>, }, }, }, - { { { T_MixIt<1, 0, 0, 0>, T_MixIt<1, 0, 0, 1>, }, { T_MixIt<1, 0, 1, 0>, T_MixIt<1, 0, 1, 1>, }, }, { { T_MixIt<1, 1, 0, 0>, T_MixIt<1, 1, 0, 1>, }, { T_MixIt<1, 1, 1, 0>, T_MixIt<1, 1, 1, 1>, }, }, { { T_MixIt<1, 2, 0, 0>, T_MixIt<1, 2, 0, 1>, }, { T_MixIt<1, 2, 1, 0>, T_MixIt<1, 2, 1, 1>, }, }, { { T_MixIt<1, 3, 0, 0>, T_MixIt<1, 3, 0, 1>, }, { T_MixIt<1, 3, 1, 0>, T_MixIt<1, 3, 1, 1>, }, }, { { T_MixIt<1, 4, 0, 0>, T_MixIt<1, 4, 0, 1>, }, { T_MixIt<1, 4, 1, 0>, T_MixIt<1, 4, 1, 1>, }, }, { { T_MixIt<1, 5, 0, 0>, T_MixIt<1, 5, 0, 1>, }, { T_MixIt<1, 5, 1, 0>, T_MixIt<1, 5, 1, 1>, }, }, }, -}; - -static int32 ApplyHBlend(uint32* const target, int32 w) -{ - #define BHALF(m, n) ((((uint64)(m) + (n)) - (((m) ^ (n)) & 0x01010101)) >> 1) - - assert(w >= 4); - -#if 1 - if(!(HRes & 0x2)) - { - target[(w - 1) * 2 + 1] = target[w - 1]; - target[(w - 1) * 2 + 0] = BHALF(BHALF(target[w - 2], target[w - 1]), target[w - 1]); - - for(int32 x = w - 2; x > 0; x--) - { - uint32 ptxm1 = target[x - 1]; - uint32 ptx = target[x]; - uint32 ptxp1 = target[x + 1]; - uint32 ptxm1_ptx = BHALF(ptxm1, ptx); - uint32 ptx_ptxp1 = BHALF(ptx, ptxp1); - - target[x * 2 + 0] = BHALF(ptxm1_ptx, ptx); - target[x * 2 + 1] = BHALF(ptx_ptxp1, ptx); - } - - target[1] = BHALF(BHALF(target[0], target[1]), target[0]); - target[0] = target[0]; - - return w << 1; - } - else -#else - if(!(HRes & 0x2)) - { - for(int32 x = w - 1; x >= 0; x--) - target[x * 2 + 0] = target[x * 2 + 1] = target[x]; - - w <<= 1; - } -#endif - { - uint32 a = target[0]; - for(int32 x = 0; x < w - 1; x++) - { - uint32 b = target[x]; - uint32 c = target[x + 1]; - uint32 ac = BHALF(a, c); - uint32 bac = BHALF(b, ac); - - target[x] = bac; - a = b; - } - return w; - } - #undef BHALF -} - -static void ReorderRGB(uint32* target, const unsigned w) -{ - const unsigned Rshift = 16; - const unsigned Gshift = 8; - const unsigned Bshift = 0; - assert(!(w & 1)); - uint32* const bound = target + w; - - while(MDFN_LIKELY(target != bound)) - { - const uint32 tmp0 = target[0]; - const uint32 tmp1 = target[1]; - - target[0] = ((uint8)(tmp0 >> 0) << Rshift) | - ((uint8)(tmp0 >> 8) << Gshift) | - ((uint8)(tmp0 >> 16) << Bshift); - - target[1] = ((uint8)(tmp1 >> 0) << Rshift) | - ((uint8)(tmp1 >> 8) << Gshift) | - ((uint8)(tmp1 >> 16) << Bshift); - - target += 2; - } -} - -static NO_INLINE void DrawLine(const uint16 out_line, const uint16 vdp2_line, const bool field) -{ - uint32* target; - const int32 tvdw = ((!CorrectAspect || Clock28M) ? 352 : 330) << ((HRes & 0x2) >> 1); - const unsigned rbg_w = ((HRes & 0x1) ? 352 : 320); - const unsigned w = ((HRes & 0x1) ? 352 : 320) << ((HRes & 0x2) >> 1); - const int32 tvxo = std::max(0, (int32)(tvdw - w) >> 1); - uint32 back_rgb24; - uint32 border_ncf; - - target = espec->pixels + out_line * espec->pitch32; - espec->LineWidths[out_line] = tvdw; - - if(!ShowHOverscan) - { - const int32 ntdw = tvdw * 1024 / 1056; - const int32 tadj = std::max(0, espec->x - ((tvdw - ntdw) >> 1)); - - //if(out_line == 100) - // printf("tvdw=%d, ntdw=%d, tadj=%d --- tvdw+tadj=%d\n", tvdw, ntdw, tadj, tvdw + tadj); - - assert((tvdw + tadj) <= 704); - - target += tadj; - espec->LineWidths[out_line] = ntdw; - } - - // - // FIXME: Timing - // - if(vdp2_line == 0) - { - CurBackTabAddr = (BKTA & 0x7FFFF) + ((BKTA & 0x80000000) && InterlaceMode == IM_DOUBLE && field); - CurLCTabAddr = (LCTA & 0x7FFFF) + ((LCTA & 0x80000000) && InterlaceMode == IM_DOUBLE && field); - - for(unsigned n = 0; n < 2; n++) - { - YCoordAccum[n] = (InterlaceMode == IM_DOUBLE && field) ? YCoordInc[n] : 0; - - CurLSA[n] = LineScrollAddr[n]; - - if(InterlaceMode == IM_DOUBLE && field) - { - const uint8 sc = (SCRCTL >> (n << 3)); - - CurLSA[n] += ((bool)(sc & 0x2) + (bool)(sc & 0x4) + (bool)(sc & 0x8)) << 1; - } - // - // - NBG23_YCounter[n & 1] = YScrollI[2 + n]; - } - - for(unsigned d = 0; d < 2; d++) - { - Window[d].CurLineWinAddr = Window[d].LineWinAddr; - - if(InterlaceMode == IM_DOUBLE && field) - Window[d].CurLineWinAddr += 2; - } - - MosaicVCount = 0; - } - - if(vdp2_line != 0xFFFF) - { - CurBackColor = VRAM[CurBackTabAddr & 0x3FFFF] & 0x7FFF; - - if(BKTA & 0x80000000) - CurBackTabAddr += 1 << (InterlaceMode == IM_DOUBLE); - // - CurLCColor = VRAM[CurLCTabAddr & 0x3FFFF] & 0x07FF; - if(LCTA & 0x80000000) - CurLCTabAddr += 1 << (InterlaceMode == IM_DOUBLE); - } - - back_rgb24 = rgb15_to_rgb24(CurBackColor); - - if(BorderMode) - border_ncf = back_rgb24 & 0xff00 | back_rgb24 << 16 && 0xff0000 | back_rgb24 >> 16 & 0xff; - else - border_ncf = 0; - - if(vdp2_line == 0xFFFF) - { - for(int32 i = 0; i < tvdw; i++) - target[i] = border_ncf; - } - else - { - // - // Line scroll - // - unsigned ls_comp_line = vdp2_line; - - for(unsigned n = 0; n < 2; n++) - { - const uint8 sc = (SCRCTL >> (n << 3)); - const uint8 lss = ((sc >> 4) & 0x3); - - if((ls_comp_line & ((1 << lss) - 1)) == 0) - { - if(sc & 0x2) // X - { - CurXScrollIF[n] = (VRAM[CurLSA[n] & 0x3FFFF] & 0x7FF) << 8; - CurLSA[n]++; - CurXScrollIF[n] |= VRAM[CurLSA[n] & 0x3FFFF] >> 8; - CurLSA[n]++; - - CurXScrollIF[n] += (XScrollI[n] << 8) + XScrollF[n]; - } - - if(sc & 0x4) // Y - { - YCoordAccum[n] = 0; // Don't (InterlaceMode == IM_DOUBLE && field) - // - CurYScrollIF[n] = (VRAM[CurLSA[n] & 0x3FFFF] & 0x7FF) << 8; - CurLSA[n]++; - CurYScrollIF[n] |= VRAM[CurLSA[n] & 0x3FFFF] >> 8; - CurLSA[n]++; - - CurYScrollIF[n] += (YScrollI[n] << 8) + YScrollF[n]; - //printf("%d %d %08x: %08x \n", vdp2_line, n, CurLSA[n], CurYScrollIF[n]); - } - - if(sc & 0x8) // X zoom - { - CurXCoordInc[n] = (VRAM[CurLSA[n] & 0x3FFFF] & 0x7) << 8; - CurLSA[n]++; - CurXCoordInc[n] |= VRAM[CurLSA[n] & 0x3FFFF] >> 8; - CurLSA[n]++; - } - - if(InterlaceMode == IM_DOUBLE) - CurLSA[n] += ((bool)(sc & 0x2) + (bool)(sc & 0x4) + (bool)(sc & 0x8)) << 1; - } - - if(!(sc & 0x2)) - CurXScrollIF[n] = (XScrollI[n] << 8) + XScrollF[n]; - - if(!(sc & 0x4)) - CurYScrollIF[n] = (YScrollI[n] << 8) + YScrollF[n]; - - if(!(sc & 0x8)) - CurXCoordInc[n] = XCoordInc[n]; - } - - // - // Line Window - // - { - int32 w_ycomp_line; - - if(InterlaceMode == IM_DOUBLE) - w_ycomp_line = (vdp2_line << 1) + field; - else - w_ycomp_line = vdp2_line; - - for(unsigned d = 0; d < 2; d++) - { - int32 ys = Window[d].YStart, ye = Window[d].YEnd; - - if(Window[d].LineWinEn) - { - const uint16* vrt = &VRAM[Window[d].CurLineWinAddr & 0x3FFFE]; - - Window[d].XStart = vrt[0] & 0x3FF; - Window[d].XEnd = vrt[1] & 0x3FF; - - //printf("LWin %d, %d(%08x): %04x %04x\n", vdp2_line, d, Window[d].CurLineWinAddr & 0x3FFFE, vrt[0], vrt[1]); - } - // - // - // - int32 xs = Window[d].XStart, xe = Window[d].XEnd; - - // FIXME: Kludge, until we can figure out what's going on. - if(xs >= 0x380) - xs = 0; - - // FIXME: Kludge, until we can figure out what's going on. - if(xe >= 0x380) - { - xs = 2; - xe = 0; - } - - if(!(HRes & 0x2)) - { - xs >>= 1; - xe >>= 1; - } - Window[d].CurXStart = xs; - Window[d].CurXEnd = xe; - - Window[d].CurLineWinAddr += 2 << (InterlaceMode == IM_DOUBLE); - - if(InterlaceMode != IM_DOUBLE) - { - ys >>= 1; - ye >>= 1; - } - - Window[d].YMet = (w_ycomp_line >= Window[d].YStart) & (w_ycomp_line <= Window[d].YEnd); - // - // - // - } - - // - // - // - WinPieces[0] = Window[0].CurXStart; - WinPieces[1] = Window[0].CurXEnd + 1; - WinPieces[2] = Window[1].CurXStart; - WinPieces[3] = Window[1].CurXEnd + 1; - WinPieces[4] = w; - - for(unsigned piece = 0; piece < WinPieces.size(); piece++) - WinPieces[piece] = std::min(w, WinPieces[piece]); // Almost forgot to do this... - - std::sort(WinPieces.begin(), WinPieces.end()); - } - - // - // - // - if(vdp2_line == 64) - { - //printf("%d:%d, %d:%d (%d) --- %d:%d, %d:%d (%d)\n", Window[0].XStart, Window[0].YStart, Window[0].XEnd, Window[0].YEnd, Window[0].LineWinEn, Window[1].XStart, Window[1].YStart, Window[1].XEnd, Window[1].YEnd, Window[1].LineWinEn); - //printf("SPCTL_Low: %02x, SDCTL: %03x, SpriteCCCond: %01x, CCNum: %01x -- %01x %01x %01x %01x %01x %01x %01x %01x \n", SPCTL_Low, SDCTL, SpriteCCCond, SpriteCCNum, SpriteCCRatio[0], SpriteCCRatio[1], SpriteCCRatio[2], SpriteCCRatio[3], SpriteCCRatio[4], SpriteCCRatio[5], SpriteCCRatio[6], SpriteCCRatio[7]); - //printf("WinControl[WINLAYER_CC]=%02x\n", WinControl[WINLAYER_CC]); - } - - // - // Process sprite data before NBG0-3 and RBG0-1, but defer applying the window until after NBG and RBG are handled(so the sprite window - // bit in the sprite linebuffer data isn't trashed prematurely). - // - if(MDFN_LIKELY(UserLayerEnableMask & (1U << 6))) - { - MakeSpriteCCLUT(); - DrawSpriteData[(HRes & 0x2) >> 0x1][(SDCTL >> 8) & 0x1][SPCTL_Low](LIB[vdp2_line].vdp1_line, LIB[vdp2_line].vdp1_hires8, w); - } - else - MDFN_FastArraySet(LB.spr, 0, w); - // - // - // - // - // - // - // - if(BGON & 0x30) - { - MDFN_FastArraySet(LB.lc, CurLCColor & 0x7F, rbg_w); - SetupRotVars(LIB[vdp2_line].rv, rbg_w); - if(HRes & 0x2) - Doubleize(LB.lc, rbg_w); - - // RBG0 - if(MDFN_LIKELY(UserLayerEnableMask & 0x10)) - { - const bool igntp = (BGON >> 12) & 1; - const bool bmen = (CHCTLB >> 9) & 1; - const unsigned colornum = std::min(4, (CHCTLB >> 12) & 0x7); // TODO: Test 5 ... 7 - const unsigned priomode = (SFPRMD >> 8) & 0x3; - const unsigned ccmode = (CCCTL & 0x10) ? ((SFCCMD >> 8) & 0x3) : 0; - const uint32 prio = RBG0PrioNum; - uint32 pix_base_or; - - pix_base_or = ((colornum >= 3) << PIX_ISRGB_SHIFT); - pix_base_or |= ((ColorOffsEn >> 4) & 1) << PIX_COE_SHIFT; - pix_base_or |= ((ColorOffsSel >> 4) & 1) << PIX_COSEL_SHIFT; - pix_base_or |= ((LineColorEn >> 4) & 1) << PIX_LCE_SHIFT; - pix_base_or |= RBG0CCRatio << PIX_CCRATIO_SHIFT; - pix_base_or |= (((CCCTL >> 12) & 0x7) == 0x1) << PIX_GRAD_SHIFT; - pix_base_or |= ((CCCTL >> 4) & 1) << PIX_LAYER_CCE_SHIFT; - pix_base_or |= ((SDCTL >> 4) & 1) << PIX_SHADEN_SHIFT; - - if(ccmode == 0) - pix_base_or |= ((CCCTL >> 4) & 1) << PIX_CCE_SHIFT; - - if(priomode >= 1) - pix_base_or |= ((prio &~ 1) << PIX_PRIO_SHIFT); - else - pix_base_or |= (prio << PIX_PRIO_SHIFT); - - DrawRBG[bmen][colornum][igntp][priomode % 3][ccmode](0, LB.rbg0, rbg_w, pix_base_or); - RBGPP(4, LB.rbg0, rbg_w); - } - else - MDFN_FastArraySet(LB.rbg0, 0, w); - - // RBG1 - if(BGON & UserLayerEnableMask & 0x20) - { - const bool igntp = (BGON >> 8) & 1; - const unsigned colornum = std::min(4, (CHCTLA >> 4) & 0x7); // TODO: Test 5 ... 7 - const unsigned priomode = (SFPRMD >> 0) & 0x3; - const unsigned ccmode = (CCCTL & 0x01) ? ((SFCCMD >> 0) & 0x3) : 0; - const uint32 prio = NBGPrioNum[0]; - uint32 pix_base_or; - - pix_base_or = (false << PIX_ISRGB_SHIFT); - pix_base_or |= ((ColorOffsEn >> 0) & 1) << PIX_COE_SHIFT; - pix_base_or |= ((ColorOffsSel >> 0) & 1) << PIX_COSEL_SHIFT; - pix_base_or |= ((LineColorEn >> 0) & 1) << PIX_LCE_SHIFT; - pix_base_or |= NBGCCRatio[0] << PIX_CCRATIO_SHIFT; - pix_base_or |= (((CCCTL >> 12) & 0x7) == 0x2) << PIX_GRAD_SHIFT; - pix_base_or |= ((CCCTL >> 0) & 1) << PIX_LAYER_CCE_SHIFT; - pix_base_or |= ((SDCTL >> 0) & 1) << PIX_SHADEN_SHIFT; - - if(ccmode == 0) - pix_base_or |= ((CCCTL >> 0) & 1) << PIX_CCE_SHIFT; - - if(priomode >= 1) - pix_base_or |= ((prio &~ 1) << PIX_PRIO_SHIFT); - else - pix_base_or |= (prio << PIX_PRIO_SHIFT); - - MDFN_FastArraySet(LB.rotabsel, 1, rbg_w); - DrawRBG[false][colornum][igntp][priomode % 3][ccmode](1, LB.nbg[0] + 8, rbg_w, pix_base_or); - RBGPP(0, LB.nbg[0] + 8, rbg_w); - } - else if(BGON & 0x20) - MDFN_FastArraySet(LB.nbg[0] + 8, 0, w); - } - else - { - MDFN_FastArraySet(LB.lc, CurLCColor & 0x7F, w); - MDFN_FastArraySet(LB.rbg0, 0, w); - } - // - // - // - for(unsigned n = 0; n < 4; n++) - { - if(!MosaicVCount || !(MZCTL & (1U << n))) - { - if(n < 2) - { - MosEff_YCoordAccum[n] = YCoordAccum[n]; // Don't + (InterlaceMode == IM_DOUBLE && field) - } - else - { - MosEff_NBG23_YCounter[n & 1] = NBG23_YCounter[n & 1] + (InterlaceMode == IM_DOUBLE && field); - } - } - } - - if(SCRCTL & 0x0101) - FetchVCScroll(w); // Call after handling line scroll, and before DrawNBG() stuff - - if(!(BGON & 0x20)) - { - for(unsigned n = 0; n < 4; n++) - { - if(((BGON >> n) & 1) && MDFN_LIKELY((UserLayerEnableMask >> n) & 1)) - { - const bool igntp = (BGON >> (n + 8)) & 1; - bool bmen = false; - unsigned colornum; - unsigned priomode; - unsigned ccmode; - - if(n < 2) - { - const unsigned nshift = (n & 1) << 3; - - bmen = (CHCTLA >> (1 + nshift)) & 1; - colornum = (CHCTLA >> (4 + nshift)) & (n ? 0x3 : 0x7); - } - else // n >= 2 - { - const unsigned nshift = (n & 1) << 2; - - colornum = (CHCTLB >> (1 + nshift)) & 1; - } - - if(colornum > 4) // TODO: test 5 ... 7 - colornum = 4; - - priomode = (SFPRMD >> (n << 1)) & 0x3; - ccmode = (SFCCMD >> (n << 1)) & 0x3; - if(!((CCCTL >> n) & 1)) - ccmode = 0; - // - // - const uint32 prio = NBGPrioNum[n]; - uint32 pix_base_or; - - pix_base_or = ((colornum >= 3) << PIX_ISRGB_SHIFT); - pix_base_or |= ((ColorOffsEn >> n) & 1) << PIX_COE_SHIFT; - pix_base_or |= ((ColorOffsSel >> n) & 1) << PIX_COSEL_SHIFT; - pix_base_or |= ((LineColorEn >> n) & 1) << PIX_LCE_SHIFT; - pix_base_or |= NBGCCRatio[n] << PIX_CCRATIO_SHIFT; - pix_base_or |= (((CCCTL >> 12) & 0x7) == (3 + n - !n)) << PIX_GRAD_SHIFT; - pix_base_or |= ((CCCTL >> n) & 1) << PIX_LAYER_CCE_SHIFT; - pix_base_or |= ((SDCTL >> n) & 1) << PIX_SHADEN_SHIFT; - - if(ccmode == 0) - pix_base_or |= ((CCCTL >> n) & 1) << PIX_CCE_SHIFT; - - if(priomode >= 1) - pix_base_or |= ((prio &~ 1) << PIX_PRIO_SHIFT); - else - pix_base_or |= (prio << PIX_PRIO_SHIFT); - - if(n < 2) - DrawNBG[bmen][colornum][igntp][priomode % 3][ccmode](n, LB.nbg[n] + 8, w, pix_base_or); - else - DrawNBG23[colornum][igntp][priomode % 3][ccmode](n, LB.nbg[n] + 8, w, pix_base_or); - - ApplyHMosaic(n, LB.nbg[n] + 8, w); - ApplyWin(n, LB.nbg[n] + 8); - } - else - MDFN_FastArraySet(LB.nbg[n] + 8, 0, w); - } - } - - // - // - // - // - // - // Apply window to sprite linebuffer after BG layers have windows applied. - ApplyWin(WINLAYER_SPRITE, LB.spr); - - // - for(int32 i = 0; i < tvxo; i++) - target[i] = border_ncf; - - for(int32 i = tvxo + w; i < tvdw; i++) - target[i] = border_ncf; - - { - const bool rbg1en = (bool)(BGON & 0x20); - unsigned special = MIXIT_SPECIAL_NONE; - const bool CCRTMD = (bool)(CCCTL & 0x0200); - const bool CCMD = (bool)(CCCTL & 0x0100); - static const uint64* blurremap[8] = { LB.spr, LB.rbg0, LB.nbg[0] + 8, /*Dummy:*/LB.spr, - LB.nbg[1] + 8, LB.nbg[2] + 8, LB.nbg[3] + 8, /*Dummy:*/LB.spr - }; - const uint64* blursrc = blurremap[(CCCTL >> 12) & 0x7]; - - if(!(HRes & 0x6)) - { - if(CCCTL & 0x8000) - { - if(CRAM_Mode == 0) - special = MIXIT_SPECIAL_GRAD; - } - else if(CCCTL & 0x0400) - { - special = 0x2; - special += (bool)CRAM_Mode; - special += (CCCTL >> 4) & 0x2; - } - } - MixIt[rbg1en][special][CCRTMD][CCMD](target + tvxo, vdp2_line, w, back_rgb24, blursrc); - ReorderRGB(target + tvxo, w); - } - - // - // - // - // FIXME: Timing - // - for(unsigned n = 0; n < 2; n++) - { - YCoordAccum[n] += YCoordInc[n] << (InterlaceMode == IM_DOUBLE); - NBG23_YCounter[n & 1] += 1 << (InterlaceMode == IM_DOUBLE); - } - - if(MosaicVCount >= ((MZCTL >> 12) & 0xF)) - MosaicVCount = 0; - else - MosaicVCount++; - } - - // - // - // - if(DoHBlend) - { - espec->LineWidths[out_line] = ApplyHBlend(espec->pixels + out_line * espec->pitch32 + espec->x, espec->LineWidths[out_line]); - - // Kind of late, but meh. ;p - assert((espec->x + espec->LineWidths[out_line]) <= 704); - } -} - -enum -{ - COMMAND_WRITE8 = 0, - COMMAND_WRITE16, - - COMMAND_DRAW_LINE, - - COMMAND_SET_LEM, - COMMAND_RESET, - COMMAND_EXIT -}; - -static int32 LastDrawnLine; - -static INLINE void WWQ(uint16 command, uint32 arg32 = 0, uint16 arg16 = 0) -{ - switch(command) - { - case COMMAND_WRITE8: - MemW(arg32, arg16); - break; - - case COMMAND_WRITE16: - MemW(arg32, arg16); - break; - - case COMMAND_DRAW_LINE: - //for(unsigned i = 0; i < 2; i++) - DrawLine((uint16)arg32, arg32 >> 16, arg16); - // - LastDrawnLine = (uint16)arg32; - break; - - case COMMAND_RESET: - Reset(arg32); - break; - - case COMMAND_SET_LEM: - UserLayerEnableMask = arg32; - break; - } -} - - -// -// -// -// -// -void VDP2REND_Init(const bool IsPAL) -{ - PAL = IsPAL; - VisibleLines = PAL ? 288 : 240; - // - UserLayerEnableMask = ~0U; -} - -void VDP2REND_StartFrame(EmulateSpecStruct* espec_arg, const bool clock28m, const int SurfInterlaceField) -{ - OutLineCounter = 0; - Clock28M = clock28m; - - espec = espec_arg; - - if(SurfInterlaceField >= 0) - { - espec->LineWidths[0] = 0; - espec->InterlaceOn = true; - espec->InterlaceField = SurfInterlaceField; - } - else - espec->InterlaceOn = false; - - espec->x = (ShowHOverscan ? 0 : 10); - espec->y = LineVisFirst << espec->InterlaceOn; - espec->h = (LineVisLast + 1 - LineVisFirst) << espec->InterlaceOn; -} - -void VDP2REND_EndFrame(void) -{ - if(OutLineCounter < VisibleLines) - { - //printf("OutLineCounter(%d) < VisibleLines(%d)\n", OutLineCounter, VisibleLines); - do - { - uint16 out_line = OutLineCounter; - uint32* target; - - if(espec->InterlaceOn) - out_line = (out_line << 1) | espec->InterlaceField; - - target = espec->pixels + out_line * espec->pitch32; - target[0] = target[1] = target[2] = target[3] = 0; - espec->LineWidths[out_line] = 4; - } while(++OutLineCounter < VisibleLines); - } - - espec = NULL; -} - -VDP2Rend_LIB* VDP2REND_GetLIB(unsigned line) -{ - assert(line < (PAL ? 256 : 240)); // NO: VisibleLines); - - return &LIB[line]; -} - -void VDP2REND_DrawLine(int vdp2_line, const bool field) -{ - if(MDFN_LIKELY(OutLineCounter < VisibleLines)) - { - uint16 out_line = OutLineCounter; - - if(espec->InterlaceOn) - out_line = (out_line << 1) | espec->InterlaceField; - - WWQ(COMMAND_DRAW_LINE, ((uint16)vdp2_line << 16) | out_line, field); - OutLineCounter++; - } -} - -void VDP2REND_Reset(bool powering_up) -{ - WWQ(COMMAND_RESET, powering_up); -} - -void VDP2REND_SetLayerEnableMask(uint64 mask) -{ - WWQ(COMMAND_SET_LEM, mask); -} - -void VDP2REND_Write8_DB(uint32 A, uint16 DB) -{ - //if(DrawCounter.load(std::memory_order_acquire) != 0) - WWQ(COMMAND_WRITE8, A, DB); - //else - // MemW(A, DB); -} - -void VDP2REND_Write16_DB(uint32 A, uint16 DB) -{ - //if(DrawCounter.load(std::memory_order_acquire) != 0) - WWQ(COMMAND_WRITE16, A, DB); - //else - // MemW(A, DB); -} - -} diff --git a/waterbox/ss/vdp2_render.h b/waterbox/ss/vdp2_render.h deleted file mode 100644 index fb4859dff7..0000000000 --- a/waterbox/ss/vdp2_render.h +++ /dev/null @@ -1,57 +0,0 @@ -/******************************************************************************/ -/* Mednafen Sega Saturn Emulation Module */ -/******************************************************************************/ -/* vdp2_render.h: -** Copyright (C) 2016 Mednafen Team -** -** This program is free software; you can redistribute it and/or -** modify it under the terms of the GNU General Public License -** as published by the Free Software Foundation; either version 2 -** of the License, or (at your option) any later version. -** -** This program is distributed in the hope that it will be useful, -** but WITHOUT ANY WARRANTY; without even the implied warranty of -** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -** GNU General Public License for more details. -** -** You should have received a copy of the GNU General Public License -** along with this program; if not, write to the Free Software Foundation, Inc., -** 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. -*/ - -#ifndef __MDFN_SS_VDP2_RENDER_H -#define __MDFN_SS_VDP2_RENDER_H - -namespace MDFN_IEN_SS -{ - -void VDP2REND_Init(const bool IsPAL) MDFN_COLD; -void VDP2REND_StartFrame(EmulateSpecStruct* espec, const bool clock28m, const int SurfInterlaceField); -void VDP2REND_EndFrame(void); -void VDP2REND_Reset(bool powering_up) MDFN_COLD; -void VDP2REND_SetLayerEnableMask(uint64 mask) MDFN_COLD; - -struct VDP2Rend_LIB -{ - struct - { - uint32 Xsp, Ysp;// .10 - uint32 Xp, Yp; // .10 - uint32 dX, dY; // .10 - int32 kx, ky; // .16 - uint32 KAstAccum; - uint32 DKAx; - } rv[2]; - bool vdp1_hires8; - uint16 vdp1_line[352]; -}; - -VDP2Rend_LIB* VDP2REND_GetLIB(unsigned line); -void VDP2REND_DrawLine(int vdp2_line, const bool field); - -void VDP2REND_Write8_DB(uint32 A, uint16 DB); -void VDP2REND_Write16_DB(uint32 A, uint16 DB); - -} - -#endif