Example #1
0
void Processor::z_restart() {
	flush_buffer();

	os_restart_game(RESTART_BEGIN);

	seed_random(0);

	if (!first_restart) {
		story_fp->seek(0);

		if (story_fp->read(zmp, h_dynamic_size) != h_dynamic_size)
			error("Story file read error");

	} else {
		first_restart = false;
	}

	restart_header();
	restart_screen();

	_sp = _fp = _stack + STACK_SIZE;
	_frameCount = 0;

	if (h_version != V6 && h_version != V9) {
		long pc = (long)h_start_pc;
		SET_PC(pc);
	} else {
		call(h_start_pc, 0, nullptr, 0);
	}

	os_restart_game(RESTART_END);
}
Example #2
0
void z_restart (void)
{
    static bool first_restart = TRUE;

    flush_buffer ();

    os_restart_game (RESTART_BEGIN);

    seed_random (0);

    if (!first_restart) {

        fseek (story_fp, blorb_ofs, SEEK_SET);

        if (fread (zmp, 1, h_dynamic_size, story_fp) != h_dynamic_size)
            os_fatal ("Story file read error");

    } else first_restart = FALSE;

    restart_header ();
    restart_screen ();

    sp = fp = stack + STACK_SIZE;
    frame_count = 0;

    if (h_version != V6) {

        long pc = (long) h_start_pc;
        SET_PC (pc);

    } else call (h_start_pc, 0, NULL, 0);

    os_restart_game (RESTART_END);

}/* z_restart */
Example #3
0
/*
struct CPU_t{
  uint8_t   a;    // 0x7F00
  uint8_t   pce;  
  uint8_t   pch;     
  uint8_t   pcl;   
  uint8_t   xh;    
  uint8_t   xl;  
  uint8_t   yh;  
  uint8_t   yl;   
  uint8_t  sph; 
  uint8_t  spl; 
  Flag     ccr;   // 0x7F0A 
};



*/
void test_cpuInit_given_write_something_to_CPU_should_save_in_cpuBlock_data_because_is_pointed(void)
{ 
  cpuInit(CPU_START_ADDR, CPU_SIZE); 
  
  uint8_t *dataArr = cpuBlock->data;
  
  A = 0xAA;
  SET_PC(0x112233);
  SET_X(0xCCDD);
  SET_Y(0xEEFF);
  SET_SP(0x77BB);
  CC = 0x99;

  TEST_ASSERT_EQUAL_INT8(0xAA, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0x11, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0x22, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0x33, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0xCC, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0xDD, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0xEE, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0xFF, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0x77, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0xBB, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0x99, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0, *dataArr++);
  TEST_ASSERT_EQUAL_INT8(0, *dataArr++);
}
void test_mcu_callf(void)
{
  uint32_t address   = 0x556677;
  uint8_t   length   = 4;
  
  SET_PC(0x12BBCC);
  
  mcu_callf( address,  length);    //12BBCC + 4 = 12BBDO
  TEST_ASSERT_EQUAL_INT8(0xD0, MEM_READ_BYTE(inputSP) );   // test is pcl store in the address
  TEST_ASSERT_EQUAL_INT8(0xBB, MEM_READ_BYTE(sp_minus1) );  // test is pch store in the address ( sp decrement)
  TEST_ASSERT_EQUAL_INT8(0x12, MEM_READ_BYTE(sp_minus2) );  // test is pce store in the address ( sp decrement)
  TEST_ASSERT_EQUAL_INT32( address , *pcToLoad );  
  TEST_ASSERT_EQUAL_INT8(inputSP -3, SP ); // test is sp decreament 3 time
}
Example #5
0
void setUp(void){
  instantiateCPU();
  gpioInit(0x0, 0xFFFF);
  SET_PC(0XFF);
  pcToLoad = malloc(sizeof(uint32_t));
  *pcToLoad = 0;
  
  /*  result:
      If true (pos_N is 1)  pcToLoad = PC + 5 + CC , where CC is signed numbrt
                                     = FF + 5 + CC
                                     = 0xD0
                        
      If false (pos_N is 0)  pcToLoad = PC + 5 
                                      = 0x0104
  */
}
Example #6
0
int64_t				read_memory(void *memory, int pc, int len)
{
	union u_data	out;
	int				i;

	out.value = 0;
	i = 0;
	while (i < len)
	{
		out.raw[i] = *(char *)(memory + SET_PC(pc + len - (i + 1)));
		i++;
	}
	if (len == 2)
		out.value = (short)out.value;
	if (len == 1)
		out.value = (char)out.value;
	return (out.value);
}
Example #7
0
static void write_PC(u32 d)
{
  SET_PC(d);
  g_cycles--;
}
Example #8
0
void z_restore (void)
{
    FILE *gfp;

    zword success = 0;

    if (zargc != 0) {

        /* Get the file name */

        /* Open auxilary file */

        if ((gfp = frotzopenprompt(FILE_LOAD_AUX)) == NULL)
            goto finished;

        /* Load auxilary file */

        success = fread (zmp + zargs[0], 1, zargs[1], gfp);

        /* Close auxilary file */

        fclose (gfp);

    } else {

        long pc;
        zword release;
        zword addr;
        int i;

        /* Open game file */

        if ((gfp = frotzopenprompt(FILE_RESTORE)) == NULL)
            goto finished;

        if (f_setup.save_quetzal) {
            success = restore_quetzal (gfp, story_fp, blorb_ofs);

        } else {
            /* Load game file */

            release = (unsigned) fgetc (gfp) << 8;
            release |= fgetc (gfp);

            (void) fgetc (gfp);
            (void) fgetc (gfp);

            /* Check the release number */

            if (release == h_release) {

                pc = (long) fgetc (gfp) << 16;
                pc |= (unsigned) fgetc (gfp) << 8;
                pc |= fgetc (gfp);

                SET_PC (pc);

                sp = stack + (fgetc (gfp) << 8);
                sp += fgetc (gfp);
                fp = stack + (fgetc (gfp) << 8);
                fp += fgetc (gfp);

                for (i = (int) (sp - stack); i < STACK_SIZE; i++) {
                    stack[i] = (unsigned) fgetc (gfp) << 8;
                    stack[i] |= fgetc (gfp);
                }

                fseek (story_fp, blorb_ofs, SEEK_SET);

                for (addr = 0; addr < h_dynamic_size; addr++) {
                    int skip = fgetc (gfp);
                    for (i = 0; i < skip; i++)
                        zmp[addr++] = fgetc (story_fp);
                    zmp[addr] = fgetc (gfp);
                    (void) fgetc (story_fp);
                }

                /* Check for errors */

                if (ferror (gfp) || ferror (story_fp) || addr != h_dynamic_size)
                    success = -1;
                else

                    /* Success */

                    success = 2;

            } else print_string ("Invalid save file\n");
        }

        if ((short) success >= 0) {

            /* Close game file */

            fclose (gfp);

            if ((short) success > 0) {
                zbyte old_screen_rows;
                zbyte old_screen_cols;

                /* In V3, reset the upper window. */
                if (h_version == V3)
                    split_window (0);

                LOW_BYTE (H_SCREEN_ROWS, old_screen_rows);
                LOW_BYTE (H_SCREEN_COLS, old_screen_cols);

                /* Reload cached header fields. */
                restart_header ();

                /*
                 * Since QUETZAL files may be saved on many different machines,
                 * the screen sizes may vary a lot. Erasing the status window
                 * seems to cover up most of the resulting badness.
                 */
                if (h_version > V3 && h_version != V6
                        && (h_screen_rows != old_screen_rows
                            || h_screen_cols != old_screen_cols))
                    erase_window (1);
            }
        } else
            os_fatal ("Error reading save file");
    }

finished:

    if (h_version <= V3)
        branch (success);
    else
        store (success);

}/* z_restore */
Example #9
0
void init_memory (void)
{
    long size;
    zword addr;
    unsigned n;
    int i, j;

    static struct {
        enum story story_id;
        zword release;
        zbyte serial[6];
    } records[] = {
        {       SHERLOCK,  21, "871214" },
        {       SHERLOCK,  26, "880127" },
        {    BEYOND_ZORK,  47, "870915" },
        {    BEYOND_ZORK,  49, "870917" },
        {    BEYOND_ZORK,  51, "870923" },
        {    BEYOND_ZORK,  57, "871221" },
        {      ZORK_ZERO, 296, "881019" },
        {      ZORK_ZERO, 366, "890323" },
        {      ZORK_ZERO, 383, "890602" },
        {      ZORK_ZERO, 393, "890714" },
        {         SHOGUN, 292, "890314" },
        {         SHOGUN, 295, "890321" },
        {         SHOGUN, 311, "890510" },
        {         SHOGUN, 322, "890706" },
        {         ARTHUR,  54, "890606" },
        {         ARTHUR,  63, "890622" },
        {         ARTHUR,  74, "890714" },
        {        JOURNEY,  26, "890316" },
        {        JOURNEY,  30, "890322" },
        {        JOURNEY,  77, "890616" },
        {        JOURNEY,  83, "890706" },
        { LURKING_HORROR, 203, "870506" },
        { LURKING_HORROR, 219, "870912" },
        { LURKING_HORROR, 221, "870918" },
        {        UNKNOWN,   0, "------" }
    };

    /* Open story file */
    {
        giblorb_map_t *map;
        giblorb_result_t res;
        char magic[4] = "XXXX";
        strid_t file;

        file = game_file_stream;

        fread(magic, 1, 4, file);

        if (!memcmp(magic, "FORM", 4))
        {
            if (giblorb_set_resource_map(file))
                os_fatal("This Blorb file seems to be invalid.");

            map = giblorb_get_resource_map();

            if (giblorb_load_resource(map, giblorb_method_FilePos,
                                      &res, giblorb_ID_Exec, 0))
                os_fatal("This Blorb file does not contain an executable chunk.");
            if (res.chunktype != giblorb_make_id('Z','C','O','D'))
                os_fatal("This Blorb file contains an executable chunk, but it is not a Z-code file.");

            story_fp = file;
            blorb_ofs = res.data.startpos;
            blorb_len = res.length;
        }
        else
        {
            story_fp = file;
            blorb_ofs = 0;
            fseek(story_fp, 0, SEEK_END);
            blorb_len = ftell(story_fp);
        }

    }

    if (blorb_len < 64)
        os_fatal("This file is too small to be a Z-code file.");

    /* Allocate memory for story header */

    if ((zmp = (zbyte *) malloc (64)) == NULL)
        os_fatal ("Out of memory");

    /* Load header into memory */

    fseek(story_fp, blorb_ofs, 0);

    if (fread (zmp, 1, 64, story_fp) != 64)
        os_fatal ("Story file read error");

    /* Copy header fields to global variables */

    LOW_BYTE (H_VERSION, h_version);

    if (h_version < V1 || h_version > V8)
        os_fatal ("Unknown Z-code version");

    if (h_version == V6)
        os_fatal ("Cannot play Z-code version 6");

    LOW_BYTE (H_CONFIG, h_config);

    if (h_version == V3 && (h_config & CONFIG_BYTE_SWAPPED))
        os_fatal ("Byte swapped story file");

    LOW_WORD (H_RELEASE, h_release);
    LOW_WORD (H_RESIDENT_SIZE, h_resident_size);
    LOW_WORD (H_START_PC, h_start_pc);
    LOW_WORD (H_DICTIONARY, h_dictionary);
    LOW_WORD (H_OBJECTS, h_objects);
    LOW_WORD (H_GLOBALS, h_globals);
    LOW_WORD (H_DYNAMIC_SIZE, h_dynamic_size);
    LOW_WORD (H_FLAGS, h_flags);

    for (i = 0, addr = H_SERIAL; i < 6; i++, addr++)
        LOW_BYTE (addr, h_serial[i]);

    /* Auto-detect buggy story files that need special fixes */

    story_id = UNKNOWN;

    for (i = 0; records[i].story_id != UNKNOWN; i++) {

        if (h_release == records[i].release) {

            for (j = 0; j < 6; j++)
                if (h_serial[j] != records[i].serial[j])
                    goto no_match;

            story_id = records[i].story_id;

        }

no_match: ; /* null statement */

    }

    LOW_WORD (H_ABBREVIATIONS, h_abbreviations);
    LOW_WORD (H_FILE_SIZE, h_file_size);

    /* Calculate story file size in bytes */

    if (h_file_size != 0) {

        story_size = (long) 2 * h_file_size;

        if (h_version >= V4)
            story_size *= 2;
        if (h_version >= V6)
            story_size *= 2;

    } else {		/* some old games lack the file size entry */

        story_size = blorb_len;
    }

    LOW_WORD (H_CHECKSUM, h_checksum);
    LOW_WORD (H_ALPHABET, h_alphabet);
    LOW_WORD (H_FUNCTIONS_OFFSET, h_functions_offset);
    LOW_WORD (H_STRINGS_OFFSET, h_strings_offset);
    LOW_WORD (H_TERMINATING_KEYS, h_terminating_keys);
    LOW_WORD (H_EXTENSION_TABLE, h_extension_table);

    /* Zork Zero Macintosh doesn't have the graphics flag set */

    if (story_id == ZORK_ZERO && h_release == 296)
        h_flags |= GRAPHICS_FLAG;

    /* Adjust opcode tables */

    if (h_version <= V4) {
        op0_opcodes[0x09] = z_pop;
        op1_opcodes[0x0f] = z_not;
    } else {
        op0_opcodes[0x09] = z_catch;
        op1_opcodes[0x0f] = z_call_n;
    }

    /* Allocate memory for story data */

    if ((zmp = (zbyte *) realloc (zmp, story_size)) == NULL)
        os_fatal ("Out of memory");

    /* Load story file in chunks of 32KB */

    n = 0x8000;

    for (size = 64; size < story_size; size += n) {

        if (story_size - size < 0x8000)
            n = (unsigned) (story_size - size);

        SET_PC (size);

        if (fread (pcp, 1, n, story_fp) != n)
            os_fatal ("Story file read error");

    }

    /* Read header extension table */

    hx_table_size = get_header_extension (HX_TABLE_SIZE);
    hx_unicode_table = get_header_extension (HX_UNICODE_TABLE);

}/* init_memory */
Example #10
0
//---------------------------------------------------------------------------
bool OGInit()
{
  MemoryFile mf;
  mf.offset=0;

  mf.data=NULL;
  HRSRC res;
  HGLOBAL hglob=NULL;
  res=FindResource(NULL,"OG_DATA",RCNUM(300));
  if (res) hglob=LoadResource(NULL,res);
  if (hglob) mf.data=(void*)LockResource(hglob);
  if (mf.data==NULL) return 0;

  mf.size=SizeofResource(Inst,res);

  char *data_ptr;
  DWORD data_size;

  if (urarlib_get(&data_ptr,&data_size,ONEGAME_NAME ".st",(char*)&mf,"")){
    OGDiskPath.SetLength(MAX_PATH);
    char temppath[MAX_PATH+1];
    GetTempPath(MAX_PATH,temppath);
    GetTempFileName(temppath,"TMP",0,OGDiskPath.Text);

    FILE *f=fopen(OGDiskPath,"wb");
    if (f==NULL) return 0;
    fwrite(data_ptr,1,data_size,f);
    fclose(f);

    SetFileAttributes(OGDiskPath,FILE_ATTRIBUTE_READONLY);

    FloppyDrive[0].SetDisk(OGDiskPath);
    OGRestoreSectors();
  }

  if (urarlib_get(&data_ptr,&data_size,"tos.img",(char*)&mf,"")==0) return 0;
  memset(Rom,0xff,256*1024);
  for (DWORD n=0;n<tos_len;n++){
    ROM_PEEK(n)=(BYTE)*(data_ptr++);
  }

  if (urarlib_get(&data_ptr,&data_size,ONEGAME_NAME ".sts",(char*)&mf,"")==0) return 0;
  if (LoadSnapShot(data_ptr,0,0,0)==0) return 0;

  if (urarlib_get(&data_ptr,&data_size,ONEGAME_NAME ".stsprites",(char*)&mf,"")){
    pOGSprites=new WORD[data_size];
    memcpy(pOGSprites,data_ptr,data_size);
  }

#if ONEGAME_IDX==OG_AW1_IDX
  if (urarlib_get(&data_ptr,&data_size,ONEGAME_NAME "_load.raw",(char*)&mf,"")){
    pOGExtraScreen[0]=(WORD*)new BYTE[data_size];
    memcpy(pOGExtraScreen[0],data_ptr,data_size);
  }
  if (urarlib_get(&data_ptr,&data_size,ONEGAME_NAME "_end.raw",(char*)&mf,"")){
    pOGExtraScreen[1]=(WORD*)new BYTE[data_size];
    memcpy(pOGExtraScreen[1],data_ptr,data_size);
  }
#endif

  if (urarlib_get(&data_ptr,&data_size,ONEGAME_NAME "_title.raw",(char*)&mf,"")==0) return 0;
  pOGTitle=(WORD*)data_ptr;

/*
  Str SnapShot=RunDir+SLASH+ONEGAME_NAME+".sts";
  if (Exists(SnapShot)==0){
    if (Exists(SnapShot+".lnk")){
      WIN32_FIND_DATA wfd;
      SnapShot=GetLinkDest(SnapShot+".lnk",&wfd);
    }else{
      SnapShot="";
    }
  }
  if (SnapShot.Empty()) return 0;
*/

  SHORTCUTINFO si[5];
  int nSI=3;

  ClearSHORTCUTINFO(&(si[0])); si[0].Id[0]=MAKEWORD(101,10), si[0].Action=CUT_PRESSKEY, si[0].PressKey=VK_MENU;
  ClearSHORTCUTINFO(&(si[1])); si[1].Id[0]=MAKEWORD(102,10), si[1].Action=CUT_PRESSKEY, si[1].PressKey=VK_LSHIFT;
  ClearSHORTCUTINFO(&(si[2])); si[2].Id[0]=VK_END,           si[2].Action=CUT_PRESSKEY, si[2].PressKey=VK_ESCAPE;

#if ONEGAME_IDX==OG_AW1_IDX || ONEGAME_IDX==OG_AW2_IDX
  // Turn off colour changing
  m68k_dpoke(0x387C,0x4e71);
  m68k_dpoke(0x387C+2,0x4e71);
  m68k_dpoke(0x387C+4,0x4e71);
  m68k_dpoke(0x387C+6,0x4e71);
#endif

#if ONEGAME_IDX==OG_NM1_IDX

  nSI++;
  ClearSHORTCUTINFO(&(si[3])); si[3].Id[0]=VK_SPACE,           si[3].Action=CUT_PRESSKEY, si[3].PressKey=VK_MENU;

  m68k_dpoke(0x21AA,0xffff); // Set up hook

  m68k_dpoke(0x233C,0x4e71); // Disable VBL colour change

  m68k_dpoke(0x2420,0x4e71);
  m68k_dpoke(0x2422,0x4e71);
  m68k_dpoke(0x2424,0x4e71);

  m68k_dpoke(0x2448,0x4e71);
  m68k_dpoke(0x244a,0x4e71);
  m68k_dpoke(0x244c,0x4e71);
  m68k_dpoke(0x244e,0x4e71);
  m68k_dpoke(0x2450,0x4e71);
  m68k_dpoke(0x2452,0x4e71);
  m68k_dpoke(0x2454,0x4e71);
  m68k_dpoke(0x2456,0x4e71);

  m68k_dpoke(0x23D0,0x4e71);
  m68k_dpoke(0x23D2,0x4e71);
  m68k_dpoke(0x23D4,0x4e71);
  m68k_dpoke(0x23D6,0x4e71);

  // Turn off top overscan
  m68k_dpoke(0x235E,0x4e71);
  m68k_dpoke(0x2360,0x4e71);
  m68k_dpoke(0x2362,0x4e71);
  m68k_dpoke(0x2364,0x4e71);

  m68k_dpoke(0x236E,0x4e71);
  m68k_dpoke(0x2370,0x4e71);
  m68k_dpoke(0x2372,0x4e71);
  m68k_dpoke(0x2374,0x4e71);

  // Turn off bottom overscan
  m68k_dpoke(0x246A,0x4e71);
  m68k_dpoke(0x246C,0x4e71);
  m68k_dpoke(0x246E,0x4e71);
  m68k_dpoke(0x2470,0x4e71);

  m68k_dpoke(0x2478,0x4e71);
  m68k_dpoke(0x247a,0x4e71);
  m68k_dpoke(0x247c,0x4e71);
  m68k_dpoke(0x247e,0x4e71);

/*
  // PROGRAM BY IGNACIO ABRIL
  // GRAPHIC DESIGNER SNATCHO
  // MUSIC COMPOSED BY MAC
  // PRODUCED BY VICTOR RUIZ
  // COPYRIGHT [^]^ DINAMIC
  char *text_replace[5]={"PROGRAMA POR IGNACIO ABRIL","GRAFICOS POR SNATCHO","COPYRIGHT FX INTERACTIVE",
                          "PRODUCIDO POR VICTOR RUIZ"," "};
  MEM_ADDRESS text_read_ad[5]={0x20be,0x20E6,0x20D2,0x20FA,0x210E};
  MEM_ADDRESS x_pos_ad[5]={0x20B6,0x20DE,0x20CA,0x20F2,0x2106};

  MEM_ADDRESS text_ad=0x3061E;
  for (int n=0;n<5;n++){
    m68k_lpoke(text_read_ad[n],text_ad);
    m68k_dpoke(x_pos_ad[n],WORD(max(157-(int)strlen(text_replace[n])*6,0)));
    text_ad=write_string_to_memory(text_ad,text_replace[n]);
  }
*/

  if (OGInfinite){
    m68k_dpoke(0x3718,0x4e71); // nop
    m68k_dpoke(0x371a,0x4e71); // nop
    m68k_dpoke(0x371c,0x4e71); // nop
  }
  if (OGNumLives){
    m68k_dpoke(0x217a,(WORD)min(OGNumLives,0x7f));
    m68k_poke(0x30706,(BYTE)min(OGNumLives,0x7f));
  }
  if (OGEasyMode){
    // 0x3167A - first mines
    m68k_dpoke(0x3167A+3*2,0x2a00);
    m68k_dpoke(0x3167A+5*2,m68k_dpeek(0x3167A+6*2));
    m68k_dpoke(0x3167A+11*2,m68k_dpeek(0x3167A+10*2));

    // 0x31694 - second mines
    m68k_dpoke(0x31694+0*2,0x9c00);
    m68k_dpoke(0x31694+1*2,0x9c00);
    m68k_dpoke(0x31694+4*2,m68k_dpeek(0x31694+5*2));
    m68k_dpoke(0x31694+9*2,m68k_dpeek(0x31694+10*2));
    m68k_dpoke(0x31694+11*2,m68k_dpeek(0x31694+12*2));

    // 0x316B4 - first enemies
    for (MEM_ADDRESS ad=0x316B5;ad<0x316dc;ad+=2){
      if (m68k_peek(ad) & 0x10) m68k_poke(ad,0);
    }

    // 0x316DE - second enemies
    for (MEM_ADDRESS ad=0x316DF;ad<0x31716;ad+=2){
      if (m68k_peek(ad) & 0x10) m68k_poke(ad,0);
    }
  }


#elif ONEGAME_IDX==OG_NM2_IDX

  ClearSHORTCUTINFO(&(si[0])); si[0].Id[0]=MAKEWORD(101,10), si[0].Action=CUT_PRESSKEY, si[0].PressKey=VK_SPACE;
/*
  Can't do this, stops space from working in console!
  ClearSHORTCUTINFO(&(si[3])); si[3].Id[0]=VK_SPACE,         si[3].Action=CUT_PRESSKEY, si[3].PressKey=VK_MENU;
  ClearSHORTCUTINFO(&(si[4])); si[4].Id[0]=VK_MENU,          si[4].Action=CUT_PRESSKEY, si[4].PressKey=VK_SPACE;
  nSI+=2;
*/

  m68k_dpoke(0x216E,0xffff); // Set title hook
  m68k_dpoke(0x2178,0xffff); // Restore palette hook
  m68k_dpoke(0x387E,0xffff); // Skip get ready

  MEM_ADDRESS ad=OG_TEXT_ADDRESS;
  ad=OGMemWrite_AndSetRef(ad,"SISTEMA CONECTADO",0x71C6,0x71DA,0);  // 0x7572=READY
  ad=OGMemWrite_AndSetRef(ad,"INTRODUCE COMANDO",0x72B2,0);  // 0x7579=INSERT MESSAGE
  ad=OGMemWrite_AndSetRef(ad,"\rORDEN DE PRIORIDAD\rALPHA REQUIRIDA\rAUTORIZACION\r",0x739E,0);  // 0x7588=\rPRIORITY ORDER ALPHA\rAUTHORISATION REQUIRED\r
  ad=OGMemWrite_AndSetRef(ad,"\rORDEN DE PRIORIDAD\rBETA REQUIRIDA\rAUTORIZACION\r",0x73FA,0);  // 0x75B6=\rPRIORITY ORDER BETA\rAUTHORISATION REQUIRED\r
  ad=OGMemWrite_AndSetRef(ad,"INTRODUCE CODIGO DEL\rPRIMER OFICIAL",0x7404,0);  // 0x75E3=INSERT 1ST OFFICIAL\rCODE
  ad=OGMemWrite_AndSetRef(ad,"INTRODUCE CODIGO DEL\rOFICIAL DE MAQUINAS",0x7414,0);  // 0x75FC=INSERT MACHINES CODE
  ad=OGMemWrite_AndSetRef(ad,"INTRODUCE CODIGO DEL\rOFICIAL DE\rCOMUNICACIONES CODE",0x741E,0);  // 0x7611=INSERT TRANSMISSIONS\rCODE
  write_string_to_memory(0x762B,"BUSCANDO\r");  // 0x762B=SEARCHING\r
  ad=OGMemWrite_AndSetRef(ad,"0010101110 DISL  OK\r\rFOUND\rOPERACION ACEPTADA\r",0x74C6,0);  // 0x7672=0010101110 DISL  OK\r\rFOUND\rOPERATION ALLOWED\r
  ad=OGMemWrite_AndSetRef(ad,"1100110101 ACOP ERROR\r\rOPERATION DENEGADA\r",0x007512,0);  // 0x76A0=1100110101 ACOP FAILED\r\rOPERATION DENIED\r
  ad=OGMemWrite_AndSetRef(ad,"0010101110 DISL ERROR\r\rOPERATION DENEGADA\r",0x0074DC,0);  // 0x76CA=0010101110 DISL FAILED\r\rOPERATION DENIED\r
  ad=OGMemWrite_AndSetRef(ad,"ACCEDIENDO A SISTEMA\01PRINCIPAL PETICION DE\01ACTION ALTO SECRETO\01COMPROBANDO\01AUTORIZACION\r",0x00723C,0);  // 0x7778=MAIN FILE OPEN\01ACTION FILE TOP SECRET\01FILE CLOSED\r
  ad=OGMemWrite_AndSetRef(ad,"SISTEMA DE CIFRADO  OK",0x007508,0x00743A,0);  // 0x76F4=LOGICAL STATUS   OK
  ad=OGMemWrite_AndSetRef(ad,"SUBMARINO EN\rSUPERFICIE\r",0x007310,0);  // 0x770C=SUBMARINE HAS EMERGED\r
  ad=OGMemWrite_AndSetRef(ad,"PUERTA ABIERTA\r",0x007356,0);  // 0x7723=DOOR OPEN\r
  write_string_to_memory(0x772E,"MOTORES PARADOS\r");  // 0x772E=MACHINES STOPED\r
  ad=OGMemWrite_AndSetRef(ad,"MISILES PREPARADOS\rPARA EL LANZAMIENTO\r",0x0071d0,0);  // 0x774a=OABERBYAMDMISSILES READY\rTO LAUNCH\r
  ad=OGMemWrite_AndSetRef(ad,"INTRODUCE CODIGO\rDEFCOM",0x0073BC,0);  // 0x7764=INSERT DEFCOM CODE\r
  ad=OGMemWrite_AndSetRef(ad,"PETICION DENEGADA\r",0x00726C,0);  // 0x77AB=SYSTEM ERROR 0 \r
  write_string_to_memory(0x77BC,"FX INTERACTIVE");  // 0x77BC=DINAMIC SOFTWARE
  ad=OGMemWrite_AndSetRef(ad,"BIENVENIDO AL U*5544\rPOR FAVOR INTRODUCE EL\r   CODIGO DE ACCESO\r",0x007130,0);  // 0x77CD=WELCOME TO THE U*5544\r  PLEASE INSERT THE\r     ACCESS CODE\r
  write_string_to_memory(0x7810,"CODIGO ERRONEO\r\rDETECTADO\rINTRUSO\r\r    ' GAME OVER '    \r\r\r\r PULSA DISPARO");  // 0x7810=THE CODE IS WRONG\r\rYOU ARE AN ILLEGAL\rPLAYER\r\r    ' GAME OVER '    \r\r\r\r PRESS FIRE
  ad=OGMemWrite_AndSetRef(ad,"MENSAJE MAL CODIFICADO\r",0x007284,0);  // 0x7864=WRONG MESSAGE\r
  write_string_to_memory(0x7873,"\r\r      NAVY MOVES\rCOPYRIGHT FX INTERACTIVE\r\r\PROGRAMA POR IGNACIO ABRIL\rGRAFICOS POR SNATCHO\r PRODUCIDO POR VICTOR RUIZ\r\r\r\r\r\r\r");

  write_string_to_memory(0x12B80,"BOMBA PREPARADA"); // THE BOMB IS SET
  write_string_to_memory(0x12B90,"INICIO CUENTA ATRAS"); // THE COUNTDOWN BEGINS
  ad=OGMemWrite_AndSetRef(ad,"INICIADA CUENTA ATRAS",0x35C6,0);  // 0x12B90=THE COUNTDOWN BEGINS
  write_string_to_memory(0x12BA5,"LA MISION HA FRACASADO"); // "YOUR MISSION HAS FAILED"
  write_string_to_memory(0x12BBD," HAS PERDIDO"); // "YOU HAVE LOST"
//  write_string_to_memory(0x12BCB,"TUS EFECTIVOS"); // "YOUR WEAPONS"
  OGMemWrite_AndSetRef(ad,"TUS EFECTIVOS",0x3812,0);  // 0x12BCB="YOUR WEAPONS"
  write_string_to_memory(0x12BD8,"LA BOMBA HA EXPLOTADO"); // "THE BOMB HAS EXPLODED"
  write_string_to_memory(0x12BEE,"  MISION  CUMPLIDA"); // "MISSION ACCOMPLISHED"
  write_string_to_memory(0x12C03,"AHORA PUEDES DISFRUTAR DEL"); // "NOW YOU CAN LIE IN THE SUN"
  write_string_to_memory(0x12C1E,"SOL Y PREPARARTE PARA"); // "AND KEEP IN SHAPE FOR"
//  write_string_to_memory(0x12C34,"ARCTIC MOVES"); // "ARCTIC MOVES"

/*
  char *text_replace[]={"GET READY",                  // GET READY
                        "PLAYER ONE",                 // PLAYER ONE
                        "FX INTERACTIVE",             // COPYRIGHT [^]^ DINAMIC
                        "PROGRAMA POR IGNACIO ABRIL", // PROGRAM BY IGNACIO ABRIL
                        "GRAFICOS POR SNATCHO",       // MUSIC COMPOSED BY MAC
                        "PRODUCIDO POR VICTOR RUIZ",  // GRAPHIC DESIGNER SNATCHO
                        "COPYRIGHT [^]^",             // PRODUCED BY VICTOR RUIZ
                        "THE BOMB IS SET",            // THE BOMB IS SET
                        "THE COUNTDOWN BEGINS",       // THE COUNTDOWN BEGINS
                        "YOUR MISSION HAS FAILED",    // YOUR MISSION HAS FAILED
                        "YOU HAVE LOST YOUR WEAPONS", // YOU HAVE LOST YOUR WEAPONS
                        "THE BOMB HAS EXPLODED",      // THE BOMB HAS EXPLODED
                        "MISSION ACCOMPLISHED",       // MISSION ACCOMPLISHED
                        "NOW YOU CAN LIE IN THE SUN", // NOW YOU CAN LIE IN THE SUN
                        "AND KEEP IN SHAPE FOR",      // AND KEEP IN SHAPE FOR
                        "ARCTIC MOVES",               // ARCTIC MOVES
                        NULL};
  MEM_ADDRESS text_draw_ad[]={0xff003856,0xff00386A,0x210A,0x211e,0x2132,0x2146,0x215a,
                              0x35A6,0x35BA,0xff0037FC,0x7EB2,0x6A90,0x6AA4,0x6AB8,0x6ACC};
  MEM_ADDRESS text_ad=0x012AF4;
  int n=0;
  do{
    if (text_draw_ad[n] & 0xff000000){ // address first
      text_draw_ad[n]&=0xffffff;
      m68k_lpoke(text_draw_ad[n]+2,text_ad);
      m68k_dpoke(text_draw_ad[n]+10,WORD(max(157-(int)strlen(text_replace[n])*6,0)));
    }else{
      m68k_lpoke(text_draw_ad[n]+12,text_ad);
      m68k_dpoke(text_draw_ad[n]+4,WORD(max(157-(int)strlen(text_replace[n])*6,0)));
    }
    text_ad=write_string_to_memory(text_ad,text_replace[n++]);
  }while (text_replace[n]!=NULL);
*/

  if (OGInfinite){
    m68k_dpoke(0x4ad6,0x4e71); // nop
    m68k_dpoke(0x4ad8,0x4e71); // nop
    m68k_dpoke(0x4ada,0x4e71); // nop
  }
  if (OGNumLives){
    BYTE tens=BYTE(min(OGNumLives/10,9)+0x30);
    BYTE ones=BYTE(min(OGNumLives % 10,9)+0x30);

    m68k_poke(0x225a,tens);
    m68k_poke(0x225b,ones);
    m68k_poke(0x12C42,tens);
    m68k_poke(0x12C43,ones);
  }


#elif ONEGAME_IDX==OG_SAT1_IDX


  m68k_dpoke(0x153E,0xffff); // Title screen draw
  m68k_dpoke(0x154a,0xffff); // Restore palette

  m68k_dpoke(0x158e,0x4e71); // Cancel drawing of keys
  m68k_dpoke(0x1590,0x4e71); // Cancel drawing of keys
  m68k_dpoke(0x163a,0x4e71); // Cancel clearing of keys
  m68k_dpoke(0x163c,0x4e71); // Cancel clearing of keys

/*
  write_string_to_memory_255(0x1658,"COPYRIGHT         SOFTWARE");  // 0x1658=COPYRIGHT         SOFTWARE
  write_string_to_memory_255(0x1673,"CODED BY");  // 0x1673=CODED BY
  write_string_to_memory_255(0x167C,"GRAPHICS");  // 0x167C=GRAPHICS
  write_string_to_memory_255(0x1685,"DANIEL");  // 0x1685=DANIEL
  write_string_to_memory_255(0x168C,"PRODUCTION");  // 0x168C=PRODUCTION
  write_string_to_memory_255(0x1697,"RODRIGUEZ");  // 0x1697=RODRIGUEZ
  write_string_to_memory_255(0x16A1,"SNATCHO");  // 0x16A1=SNATCHO
  write_string_to_memory_255(0x16A9,"KEYS");  // 0x16A9=KEYS
  write_string_to_memory_255(0x16EE,"UP##CONTROL");  //  0x16EE=UP##CONTROL
  write_string_to_memory_255(0x16FA,"DOWN##L#SHIFT");  // 0x16FA=DOWN##L#SHIFT
  write_string_to_memory_255(0x1708,"RIGHT##R#SHIFT");  // 0x1708=RIGHT##R#SHIFT
  write_string_to_memory_255(0x1717,"LEFT##%");  // 0x1717=LEFT##%
  write_string_to_memory_255(0x171F,"FIRE#SPACE");  // 0x171F=FIRE#SPACE
  write_string_to_memory_255(0x172A,"PAUSE##F1");  // 0x172A=PAUSE##F1
  write_string_to_memory_255(0x1734,"ABORT##F10");  // 0x1734=ABORT##F10
*/

  MEM_ADDRESS ad=OG_TEXT_ADDRESS;
  m68k_dpoke(0x1984,0xffff); // Set up hook
  m68k_dpoke(0x1984+2,WORD(ad-OG_TEXT_ADDRESS)); // Set address
  ad=OGMemWrite_AndSetRef(ad | nt255,"PREPARATE PARA LA BATALLA",0);  //   0x19A6=GET READY FOR THE BATTLE

  m68k_dpoke(0x1278,0xffff); // Set up hook
  m68k_dpoke(0x1278+2,WORD(ad-OG_TEXT_ADDRESS)); // Set address
  ad=OGMemWrite_AndSetRef(ad | nt255,"FIN DEL TIEMPO",0);  //  0x19C0=TIME OVER

//  write_string_to_memory_255(0x19CA,"GAME OVER");  // 0x19CA=GAME OVER

  m68k_dpoke(0x17E8,0xffff); // Set up hook
  m68k_dpoke(0x17E8+2,WORD(ad-OG_TEXT_ADDRESS)); // Set address
  ad=OGMemWrite_AndSetRef(ad | nt255," BIEN HECHO GUERRERO",0);  // 0x19D4=WELL DONE WARRIOR

  m68k_dpoke(0x1802,0xffff); // Set up hook
  m68k_dpoke(0x1802+2,WORD(ad-OG_TEXT_ADDRESS)); // Set address
  ad=OGMemWrite_AndSetRef(ad | nt255,"EL CAMINO HACIA EL REINO",0);  // 0x19E6=THE WAY TO THE MAGIC

  m68k_dpoke(0x181C,0xffff); // Set up hook
  m68k_dpoke(0x181C+2,WORD(ad-OG_TEXT_ADDRESS)); // Set address
  ad=OGMemWrite_AndSetRef(ad | nt255,"DE LA MAGIA ESTA CERCA",0);  //  0x19FC=KINGDOM IS CLOSER

  write_string_to_memory_255(0x1A0E," FELICITACIONES");  // 0x1A0E=CONGRATULATIONS

  m68k_dpoke(0x18E0,0xffff); // Set up hook
  m68k_dpoke(0x18E0+2,WORD(ad-OG_TEXT_ADDRESS)); // Set address
  OGMemWrite_AndSetRef(ad | nt255,"LO HAS CONSEGUIDO",0);  // 0x1A1E=YOU HAVE GOT IT

  write_string_to_memory_255(0x1A2E,"    YA ERES UN MAGO");  // 0x1A2E=NOW YOU ARE A MAGICIAN

  OGDrawSprite(0,0x3ba98);

  if (OGInfinite){                   
    m68k_dpoke(0x55FC,0x4e71);
    m68k_dpoke(0x55FE,0x4e71);
  }


#elif ONEGAME_IDX==OG_SAT2_IDX


  m68k_dpoke(0x11c4,0xffff); // Title screen draw
  m68k_dpoke(0x11CE,0xffff); // Restore palette

  m68k_dpoke(0x4A32,0x4e71); // Cancel drawing/clearing of keys
  m68k_dpoke(0x4A34,0x4e71); // Cancel drawing/clearing of keys
  m68k_dpoke(0x4A44,0x4e71); // Cancel drawing/clearing of keys
  m68k_dpoke(0x4A46,0x4e71); // Cancel drawing/clearing of keys

  m68k_dpoke(0xDA42,0xff); // Remove drawing of logos and copyright line in shop

/*
  write_string_to_memory_255(0x94DC,"SUPER");  // 0x94DC=SUPER
  write_string_to_memory_255(0x94E2,"EXTRA");  // 0x94E2=EXTRA
  write_string_to_memory_255(0x94E8,"POWER");  // 0x94E8=POWER
  write_string_to_memory_255(0x94F6,"MEDIUM");  // 0x94F6=MEDIUM
  write_string_to_memory_255(0x94FD,"EXTRA");  // 0x94FD=EXTRA
  write_string_to_memory_255(0x9503,"POWER");  // 0x9503=POWER
  write_string_to_memory_255(0x9512,"LIGHT");  // 0x9512=LIGHT
  write_string_to_memory_255(0x9518,"EXTRA");  // 0x9518=EXTRA
  write_string_to_memory_255(0x951E,"POWER");  // 0x951E=POWER
  write_string_to_memory_255(0x952C,"FIRE");   // 0x952C=FIRE
  write_string_to_memory_255(0x9531,"SHIELD");  // 0x9531=SHIELD
  write_string_to_memory_255(0x9540,"LIGHT");  // 0x9540=LIGHT
  write_string_to_memory_255(0x9546,"SHIELD");  // 0x9546=SHIELD
  write_string_to_memory_255(0x9556,"TELECARD");  // 0x9556=TELECARD
  write_string_to_memory_255(0x9568,"ADVANCED");  // 0x9568=ADVANCED
  write_string_to_memory_255(0x9571,"SATAN");  // 0x9571=SATAN
  write_string_to_memory_255(0x9577,"SCANNER");  // 0x9577=SCANNER
  write_string_to_memory_255(0x9588,"SATAN");  // 0x9588=SATAN
  write_string_to_memory_255(0x958E,"SCANNER");  // 0x958E=SCANNER
  write_string_to_memory_255(0x959E,"ABOUT");  // 0x959E=ABOUT
  write_string_to_memory_255(0x95A4,"SATAN");  // 0x95A4=SATAN
  write_string_to_memory_255(0x95B2,"MAGIC");  // 0x95B2=MAGIC
  write_string_to_memory_255(0x95B8,"AXE");  // 0x95B8=AXE
  write_string_to_memory_255(0x95C4,"TRIPLE");  // 0x95C4=TRIPLE
  write_string_to_memory_255(0x95CB,"MAGIC");  // 0x95CB=MAGIC
  write_string_to_memory_255(0x95D1,"AXE");  // 0x95D1=AXE
*/

  MEM_ADDRESS ad=OG_TEXT_ADDRESS;
  m68k_dpoke(0x35BE,0xffff); // Set up hook
  m68k_dpoke(0x35BE+2,WORD(ad-OG_TEXT_ADDRESS)); // Set address
  ad=OGMemWrite_AndSetRef(ad | nt255,"SALIR",0);  // 0x95DE=EXIT
//  write_string_to_memory_255(0x95DE,"SALIR");  // 0x95DE=EXIT

  write_string_to_memory_255(0x9600,"     NO PUEDES COMPRAR");  // 0x9600=     YOU CANT BUY MORE
  write_string_to_memory_255(0x9617,"    INSUFICIENTE DINERO");  // 0x9617=  YOU HAVENT ENOUGHT MONEY
  write_string_to_memory_255(0x9632,"     YA LO HAS COMPRADO");  // 0x9632=     YOU ALREADY HAVE IT
  write_string_to_memory_255(0x964B,"");  // 0x964B= AUTHORS MARCOS AND SNATCHO
  write_string_to_memory_255(0x9667,"##ENHORABUENA");  // 0x9667=CONGRATULATIONS
  write_string_to_memory_255(0x9677,"AL#FIN#EL#MUNDO");  // 0x9677=AT#LAST#THE#WORLD

  ad=OGMemWrite_AndSetRef(ad | nt255,"ESTA#LIBRE#DEL#MAL",0x157a,0);  // 0x9689=IS#FREE#FROM#EVIL
//  write_string_to_memory_255(0x9689,"ESTA#LIBRE#DEL#MAL");  // 0x9689=IS#FREE#FROM#EVIL

  ad=OGMemWrite_AndSetRef(ad | nt255,"ESC#PARA#VOLVER",0x23C6,0);  // 0x969B=ESC#TO#RETURN
//  write_string_to_memory_255(0x969B,"ESC#PARA#VOLVER");  // 0x969B=ESC#TO#RETURN
  OGMemWrite_AndSetRef(ad | nt255,"NO#QUEDA#TIEMPO",0x14FA,0);  // 0x96A9=TIME#OVER
//  write_string_to_memory_255(0x96A9,"NO#QUEDA#TIEMPO");  // 0x96A9=TIME#OVER

//  write_string_to_memory_255(0x96B3,"GAME##OVER");  // 0x96B3=GAME##OVER

  OGDrawSprite(0,0x5F240);  
  OGDrawSprite(1,0x5f3f0);
  OGDrawSprite(2,0x5c390);
  OGDrawSprite(3,0x5bc50);
  OGDrawSprite(4,0x5c750);

/*
  write_string_to_memory_255(0x96BE,"COPYRIGHT##########SOFTWARE");  // 0x96BE=COPYRIGHT##########SOFTWARE
  write_string_to_memory_255(0x96DA,"CODED#BY");  // 0x96DA=CODED#BY
  write_string_to_memory_255(0x96E3,"GRAPHICS");  // 0x96E3=GRAPHICS
  write_string_to_memory_255(0x96EC,"MARCOS");  // 0x96EC=MARCOS
  write_string_to_memory_255(0x96F3,"PRODUCTION");  // 0x96F3=PRODUCTION
  write_string_to_memory_255(0x96FE,"JOURON");  // 0x96FE=JOURON
  write_string_to_memory_255(0x9705,"SNATCHO");  // 0x9705=SNATCHO
  write_string_to_memory_255(0x970D,"KEYS");  // 0x970D=KEYS
  write_string_to_memory_255(0x9712,"$$$$$$$$$$$$$");  // 0x9712=$$$$$$$$$$$$$
  write_string_to_memory_255(0x975C,"UP$$CONTROL");  // 0x975C=UP$$CONTROL
  write_string_to_memory_255(0x9768,"DOWN$$L$SHIFT");  // 0x9768=DOWN$$L$SHIFT
  write_string_to_memory_255(0x9776,"RIGHT$$R$SHIFT");  // 0x9776=RIGHT$$R$SHIFT
  write_string_to_memory_255(0x9785,"LEFT$$%");  // 0x9785=LEFT$$%
  write_string_to_memory_255(0x978D,"FIRE$$SPACE");  // 0x978D=FIRE$$SPACE
  write_string_to_memory_255(0x9799,"UP$DOWN$$ALT");  // 0x9799=UP$DOWN$$ALT
  write_string_to_memory_255(0x97A6,"TELEPORT$$T");  // 0x97A6=TELEPORT$$T
  write_string_to_memory_255(0x97B2,"PAUSE$$H");  // 0x97B2=PAUSE$$H
  write_string_to_memory_255(0x97BB,"ABORT$$UNDO");  // 0x97BB=ABORT$$UNDO
*/


#elif ONEGAME_IDX==OG_AW1_IDX

  m68k_dpoke(0xa0aa,0xffff); // Title screen
  m68k_dpoke(0xA0B0,0xffff); // Restore palette

  m68k_dpoke(0x8986,0xffff); // Load screen
  m68k_dpoke(0x8988,0xffff); // Load screen

  m68k_dpoke(0x8CEC,0xffff); // End screen
  m68k_dpoke(0x8CEE,0xffff); // End screen

  m68k_dpoke(0x9FFA,0x4e71); // Disable scrollers
  m68k_dpoke(0x9FFA+2,0x4e71); // Disable scrollers
  m68k_dpoke(0x9FFA+4,0x4e71); // Disable scrollers
  m68k_dpoke(0x9FFA+6,0x4e71); // Disable scrollers

  m68k_dpoke(0xa01a,0x4e71); // Disable Dinamic logo
  m68k_dpoke(0xa01a+2,0x4e71); // Disable Dinamic logo
  m68k_dpoke(0xa01a+4,0x4e71); // Disable Dinamic logo
  m68k_dpoke(0xa028,0x4e71); // Disable Dinamic logo
  m68k_dpoke(0xa028+2,0x4e71); // Disable Dinamic logo
  m68k_dpoke(0xa028+4,0x4e71); // Disable Dinamic logo

  m68k_dpoke(0x8996,0xffff); // Fade out before load hook
  m68k_dpoke(0x8998,0xffff); // "Do what above instruction should" hook

  m68k_dpoke(0x899e,0x4e71); // Disable normal fade out
  m68k_dpoke(0x899e+2,0x4e71); // Disable normal fade out
  m68k_dpoke(0x899e+4,0x4e71); // Disable normal fade out

/*
  0xa578="1. KEYBOARD"
  0xa584="2. KEYS AND JOYSTICK"
  0xa599="PRESS FIRE TO START"
  0xa5ad="INSERT DISK 2"
  0xa5bb="ACCESS CODE"
  0xa5c7="101069"
  0x20b86="AFTER THE WAR   COPYRIGHT DINAMIC SOFTWARE 1989   "
          "PROGRAM BY DANIEL RODRIGUEZ    MUSIC BY MAC   SOUND FX BY VICTOR RUIZ   "
          "ADDITIONAL SOUNDS, MAPS AND GRAPHICS BY JAVIER CUBEDO   "
          "ARTISTIC DESIGN BY RICARDO MACHUCA   GRAPHICS, DESIGN AND PRODUCTION BY SNATCHO      "
  0x20cd7="      KEYS AND JOYSTICK   ALT-KICK   SPACE-PUNCH   F1-PAUSE   F10-ABORT      "
  0x20d4e="      KEYBOARD   CTRL-JUMP   SHIFT-DUCK DOWN   /-LEFT   SHIFT-RIGHT   SPACE-PUNCH   ALT-KICK   F1-PAUSE   F10-ABORT      "
*/
//  OG_AW_WriteString(0x18796+00 | NONULL,"WAR.......");
  OG_AW_WriteString(0x18796+14 | NONULL,"..........");
  OG_AW_WriteString(0x18796+28 | NONULL,"..........");

/*
  OG_AW_WriteString(0xa578,"1. KEYBOARD");
  OG_AW_WriteString(0xa584,"2. KEYS AND JOYSTICK");
  OG_AW_WriteString(0xa599,"PRESS FIRE TO START");
  OG_AW_WriteString(0xa5ad,"INSERT DISK 2");
  OG_AW_WriteString(0xa5bb,"ACCESS CODE");
//  OG_AW_WriteString(0xa5c7,"101069");
  OG_AW_WriteString(0x20cd7,"      KEYS AND JOYSTICK   ALT-KICK   SPACE-PUNCH   "
                        "F1-PAUSE   F10-ABORT      ");
  OG_AW_WriteString(0x20d4e,"      KEYBOARD  CTRL-JUMP   SHIFT-DUCK DOWN   /-LEFT   "
                        "SHIFT-RIGHT   SPACE-PUNCH   ALT-KICK   F1-PAUSE   F10-ABORT      ");
*/
  OG_AW_WriteString(0x20b86,"             ");

  OGDrawSprite(0,0x1c506);
  OGDrawSprite(1,0x1cde6);
  OGDrawSprite(2,0x1d106);
  OGDrawSprite(3,0x1d286);
  OGDrawSprite(4,0x1c6de);
  OGDrawSprite(5,0x1bfe6);
  OGDrawSprite(6,0x1d346);
  OGDrawSprite(7,0x1d446);

  if (OGNumLives){
    m68k_dpoke(0x8E94+2,(WORD)min(OGNumLives+1,4));
  }
  if (OGInfinite){
    m68k_dpoke(0x0150FA,0x4e71);
    m68k_dpoke(0x0150FA+2,0x4e71);
  }

#elif ONEGAME_IDX==OG_AW2_IDX

  m68k_dpoke(0xCFDC,0xffff); // Title screen
  m68k_dpoke(0xCFE0,0xffff); // Restore palette

  m68k_dpoke(0xcf38,0x4e71); // Disable scroller
  m68k_dpoke(0xcf38+2,0x4e71); // Disable scroller
  m68k_dpoke(0xcf3c,0x4e71); // Disable scroller
  m68k_dpoke(0xcf3c+2,0x4e71); // Disable scroller

  m68k_dpoke(0xcf54,0x4e71); // Disable Dinamic logo
  m68k_dpoke(0xcf54+2,0x4e71); // Disable Dinamic logo
  m68k_dpoke(0xCF60,0x4e71); // Disable Dinamic logo
  m68k_dpoke(0xCF60+2,0x4e71); // Disable Dinamic logo

/*
  0x97d6="AFTER THE WAR    COPYRIGHT DINAMIC SOFTWARE 1989   PROGRAM BY JOSE LOPEZ   "
         "MUSIC BY MAC   SOUND FX BY VICTOR RUIZ   "
         "ADDITIONAL SOUNDS, MAPS AND GRAPHICS BY JAVIER CUBEDO   "
         "ARTISTIC DESIGN BY RICARDO MACHUCA   GRAPHICS, DESIGN AND PRODUCTION BY SNATCHO      "
  0x9920="      KEYBOARD    CTRL-RAISE GUN    SHIFT-LOWER GUN    /-LEFT    SHIFT-RIGHT    "
         "RETURN-CHANGE FLOOR    SPACE-SHOOT    ALT-DUCK DOWN    F1-PAUSE    F10-ABORT      "
  0x99e2="      JOYSTICK   SPACE-SHOOT   ALT-DUCK DOWN   F1-PAUSE   F10-ABORT      "
  0x9a54="      KEYS AND JOYSTICK   CTRL OR SHIFT-CHANGE FLOOR   SPACE-SHOOT   "
         "ALT-DUCK DOWN   F1-PAUSE   F10-ABORT      "
  0x9aec="  THIS IS AFTER THE WAR.IF YOU HAVE      ENJOYED IT GET READY FOR A.M.C.    "
         "ASTRO-MARINE CORPS BY DINAMIC      SOON ON YOUR SCREEN      "
  0x9b8d="1. KEYBOARD"
  0x9b99="2. JOYSTICK"
  0x9ba5="3. KEYS AND JOYSTICK"
  0x9bba="PRESS FIRE TO START"
  0x9bce="INPUT ACCESS CODE"
*/
//  OG_AW_WriteString(0x14f2e | NONULL,"WAR.......");
  OG_AW_WriteString(0x14f3c | NONULL,"..........");
  OG_AW_WriteString(0x14f4a | NONULL,"..........");
  OG_AW_WriteString(0x97d6,"    "); // This never appears, but changing it will make the hiscores appear quicker
/*
  OG_AW_WriteString(0x9920,"      KEYBOARD    CTRL-RAISE GUN    SHIFT-LOWER GUN    /-LEFT    SHIFT-RIGHT    "
         "RETURN-CHANGE FLOOR    SPACE-SHOOT    ALT-DUCK DOWN    F1-PAUSE    F10-ABORT      ");
  OG_AW_WriteString(0x99e2,"      JOYSTICK  SPACE-SHOOT   ALT-DUCK DOWN   F1-PAUSE   F10-ABORT      ");
  OG_AW_WriteString(0x9a54,"      KEYS AND JOYSTICK   CTRL OR SHIFT-CHANGE FLOOR   SPACE-SHOOT   "
         "ALT-DUCK DOWN   F1-PAUSE   F10-ABORT      ");
  OG_AW_WriteString(0x9b8d,"1. KEYBOARD");
  OG_AW_WriteString(0x9b99,"2. JOYSTICK");
  OG_AW_WriteString(0x9ba5,"3. KEYS AND JOYSTICK");
  OG_AW_WriteString(0x9bba,"PRESS FIRE TO START");
  OG_AW_WriteString(0x9bce,"INPUT ACCESS CODE");
                            0123456789012345678901234567890123456789*/
  OG_AW_WriteString(0x9aec,"       ESTO HA SIDO AFTER THE WAR       "
                           "     SI HAS DISFRUTADO, PREPARATE PARA  "
                           "             ASTRO-MARINE CORPS         "
                           "             PRONTO EN TU PC            ");

  OGDrawSprite(0,0x41D8E);
  OGDrawSprite(1,0x444ce);
  OGDrawSprite(2,0x40F1E);
  OGDrawSprite(3,0x44c1e);
  OGDrawSprite(4,0x41526);
  OGDrawSprite(5,0x4463e);
  OGDrawSprite(6,0x41fee+32);
  OGDrawSprite(7,0x4478e);
  OGDrawSprite(8,0x44a8e);
  OGDrawSprite(9,0x44d26);

  m68k_dpoke(0x01198E,0xffff); // rts from load routine (need to draw sprites 10-13 here)

  if (OGNumLives){
    m68k_poke(0x11898+3,(BYTE)min(OGNumLives,3));
  }
  if (OGInfinite){
    m68k_dpoke(0xE48C,0x4e71);
    m68k_dpoke(0xE48C+2,0x4e71);
  }

#endif
  SET_PC(PC32); // Might start at altered address, reset prefetch

  CurrentCuts.DeleteAll();
  for (int n=0;n<nSI;n++) CurrentCuts.Add(si[n]);
  ShortcutBox.CurrentCutSelType=2;

  return true;
}
Example #11
0
//---------------------------------------------------------------------------
void OGIntercept()
{
  MEM_ADDRESS OGTitleAd=0,OGPalAd=0;
  int OGBmpNum=0;
  switch (pc){
#if ONEGAME_IDX==OG_NM1_IDX
    case 0x21AA: // Title screen routine
      areg[0]=0x249E;
      SET_PC(0x21B0);
      OGTitleAd=xbios2;
      break;
#elif ONEGAME_IDX==OG_NM2_IDX
    case 0x216E: // Title screen routine
      areg[0]=0x8AB4;
      SET_PC(0x2174);

      OGTitleAd=xbios2;
      OGPalAd=areg[0];
      for (int i=0;i<16;i++) OGStorePal[i]=m68k_dpeek(OGPalAd + i*2);
      break;
    case 0x2178: // Restore palette
      m68k_lpoke(0x12E80,0x006A0098);
      SET_PC(0x2182);

      for (int i=0;i<16;i++) m68k_dpoke(0x8AB4 + i*2,OGStorePal[i]);
      break;
    case 0x387E: // Skip "Get ready.."
      SET_PC(0x389E);
      break;
#elif ONEGAME_IDX==OG_SAT1_IDX
    case 0x153E: // Title screen routine
      areg[0]=0xA67E;
      SET_PC(0x1544);

      OGTitleAd=xbios2;
      OGPalAd=areg[0];
      for (int i=0;i<16;i++) OGStorePal[i]=m68k_dpeek(OGPalAd + i*2);
      break;
    case 0x154A: // Restore palette
      m68k_dpoke(0x16ea,0x36B0);
      SET_PC(0x1552);

      for (int i=0;i<16;i++) m68k_dpoke(0xA67E + i*2,OGStorePal[i]);
      break;
    case 0x1984: // "Get ready for battle"
    case 0x1278: // "Time Over"
    case 0x17E8: // "Well done warrior"
    case 0x1802: // "The way to the magic"
    case 0x181C: // "Kingdom is closer"
    case 0x18E0: // "You got it"
      areg[0]=OG_TEXT_ADDRESS+m68k_dpeek(pc+2);
      SET_PC(pc+4);
      break;
#elif ONEGAME_IDX==OG_SAT2_IDX
    case 0x11c4: // Title screen routine
      areg[0]=0xD8C2;
      SET_PC(0x11ca);

      OGTitleAd=0x77300;
      OGPalAd=areg[0];
      for (int i=0;i<16;i++) OGStorePal[i]=m68k_dpeek(OGPalAd + i*2);
      break;
    case 0x11CE: // Restore palette
      m68k_dpoke(0x9758,0x64);
      SET_PC(0x11d6);
      for (int i=0;i<16;i++) m68k_dpoke(0xD8C2 + i*2,OGStorePal[i]);
      break;
    case 0x35BE: // Draw description of item in shop
      m68k_dpoke(0x93A6,0xe6);
      SET_PC(0x35C6);
      if (areg[0]==0x95DE) areg[0]=OG_TEXT_ADDRESS+m68k_dpeek(0x35BE+2);
      break;
#elif ONEGAME_IDX==OG_AW1_IDX
    case 0xa0aa: // Title screen routine
      areg[7]-=4;
      m68k_lpoke(areg[7],0xA0b0);
      SET_PC(0xA678);

      OGTitleAd=0x78000;
      OGPalAd=0x18832;
      for (int i=0;i<16;i++) OGStorePal[i]=m68k_dpeek(OGPalAd + i*2);
      break;
    case 0xA0b0: // Restore palette
      areg[0]=0x187CE;
      SET_PC(0xA0b6);

      for (int i=0;i<16;i++) m68k_dpoke(0x18832 + i*2,OGStorePal[i]);
      break;
    case 0x8986: // Load screen fade up
      areg[7]-=4;
      m68k_lpoke(areg[7],0x8988);
      SET_PC(0xA670);

      OGTitleAd=xbios2;
      OGPalAd=0x18812;
      OGBmpNum=1;
      for (int i=0;i<16;i++) OGStorePal[i]=m68k_dpeek(OGPalAd + i*2);
      break;
    case 0x8988: // Load screen restore pal
      SET_PC(0x898a);
      for (int i=0;i<16;i++) m68k_dpoke(0x18812 + i*2,OGStorePal[i]);
      break;

    case 0x8CEC: // End screen fade up
      areg[7]-=4;
      m68k_lpoke(areg[7],0x8CEE);
      SET_PC(0xA678);

      OGTitleAd=xbios2;
      OGPalAd=0x18832;
      OGBmpNum=2;
      for (int i=0;i<16;i++) OGStorePal[i]=m68k_dpeek(OGPalAd + i*2);
      break;
    case 0x8CEE: // End screen restore pal
      SET_PC(0x8CF2);
      for (int i=0;i<16;i++) m68k_dpoke(0x18832 + i*2,OGStorePal[i]);
      break;

    case 0x8996: // Fade out before load hook
      areg[7]-=4;
      m68k_lpoke(areg[7],0x8998); // return address
      SET_PC(0x17976);
      break;
    case 0x8998: // Do what above instruction should hook
      areg[7]-=4;
      m68k_lpoke(areg[7],0x899a); // return address
      SET_PC(0x8e24);
      break;

#elif ONEGAME_IDX==OG_AW2_IDX
    case 0xCFDC: // Title screen routine
      areg[7]-=4;
      m68k_lpoke(areg[7],0xCFE0); // return address
      SET_PC(0xfdf4);

      OGTitleAd=0x78000;
      OGPalAd=0x14312;
      for (int i=0;i<16;i++) OGStorePal[i]=m68k_dpeek(OGPalAd + i*2);
      break;
    case 0xCFE0: // Restore palette
      areg[0]=0x125B2;
      SET_PC(0xCFE4);

      for (int i=0;i<16;i++) m68k_dpoke(0x14312 + i*2,OGStorePal[i]);
      break;
    case 0x01198E: // Load enemy at end of level 2
      SET_PC(m68k_lpeek(r[15]));
      r[15]+=4;

      OGDrawSprite(10,0x69a62);
      OGDrawSprite(11,0x69B62);
      OGDrawSprite(12,0x69C22);
      OGDrawSprite(13,0x69CA2);
      break;
#endif
  }
  if (pOGTitle && OGTitleAd){
    MEM_ADDRESS ad=OGTitleAd & 0xffffff;
    MEM_ADDRESS ad_end=ad+32000;
    WORD *p=pOGTitle;
    if (OGBmpNum) if (pOGExtraScreen[OGBmpNum-1]) p=pOGExtraScreen[OGBmpNum-1];
    if (ad_end<=mem_len){
      while (ad<ad_end){
        DPEEK(ad)=*(p++);
        ad+=2;
      }
      if (OGBmpNum==0){
#if ONEGAME_IDX==OG_SAT2_IDX
        MEM_ADDRESS ad2=0x2B500;
#elif ONEGAME_IDX==OG_AW1_IDX
        MEM_ADDRESS ad2=0x3CE00;
#elif ONEGAME_IDX==OG_AW2_IDX
        MEM_ADDRESS ad2=0x70300;
#else
        MEM_ADDRESS ad2=0;
#endif
        if (ad2){
          ad=OGTitleAd & 0xffffff;
          while (ad<ad_end) PEEK((ad2++))=PEEK((ad++));
        }
      }
      if (OGPalAd){
        for (int i=0;i<16;i++){
          DPEEK(OGPalAd)=*(p++);
          OGPalAd+=2;
        }
      }else{
        for (int i=0;i<16;i++) STpal[i]=*(p++);
        palette_convert_all();
      }
    }
  }
}
//#define SET_PC(extend)       setBigEndianExt(&PCE, extend)
void test_setBigEndianExt_given_PC(void){
  
  SET_PC(0xABCCD5);
  
  TEST_ASSERT_EQUAL_INT32(0xABCCD5, PC);
}
Example #13
0
void n8x300_cpu_device::execute_run()
{
	do
	{
		UINT16 opcode;
		UINT8 src = 0;
		UINT8 dst;
		UINT8 rotlen;  // rotate amount or I/O field length
		UINT8 mask;
		UINT16 result;

		/* fetch the opcode */
		debugger_instruction_hook(this, m_genPC);
		opcode = FETCHOP(m_genPC);
		m_PC++;
		m_PC &= 0x1fff;
		m_AR = m_PC;
		m_IR = opcode;
		m_genPC = m_PC << 1;

		switch (OP)
		{
		case 0x00:  // MOVE
			rotlen = ROTLEN;
			if(is_rot(opcode))  // MOVE reg,reg
			{
				src = get_reg(SRC);
				dst = rotate(src,rotlen);
				set_reg(DST,dst);
			}
			else
			{
				if(rotlen == 0)
					rotlen = 8;  // 0 = 8-bit I/O field length
				if(is_src_reg(opcode) && !(is_dst_reg(opcode)))
				{  // MOVE reg,IV
					DST_LATCH;
					mask = ((1 << rotlen)-1);
					src = (get_reg(SRC)) << (7-DST_LSB);
					mask <<= (7-DST_LSB);
					if(DST_IS_RIGHT_BANK)
					{
						dst = (m_right_IV & ~mask) | (src & mask);
						m_right_IV = dst;
						WRITEPORT(m_IVR+0x100,m_right_IV);
					}
					else
					{
						dst = (m_left_IV & ~mask) | (src & mask);
						m_left_IV = dst;
						WRITEPORT(m_IVL,m_left_IV);
					}
				}
				else if(!(is_src_reg(opcode)) && is_dst_reg(opcode))
				{  // MOVE IV,reg
					SRC_LATCH;
					if(SRC_IS_RIGHT_BANK)
						src = rotate(m_right_IV,7-SRC_LSB);
					else
						src = rotate(m_left_IV,7-SRC_LSB);
					mask = ((1 << rotlen)-1);
					dst = src & mask;
					set_reg(DST,dst);
				}
				else if(!(is_src_reg(opcode)) && !(is_dst_reg(opcode)))
				{  // MOVE IV,IV
					SRC_LATCH;
					if(SRC_IS_RIGHT_BANK)
						src = rotate(m_right_IV,7-SRC_LSB);
					else
						src = rotate(m_left_IV,7-SRC_LSB);
					mask = ((1 << rotlen)-1);
					dst = src & mask;
					dst <<= (7-DST_LSB);
					mask <<= (7-DST_LSB);
					if(SRC_IS_RIGHT_BANK)  // untouched source IV bits are preserved and sent to destination IV
					{
						dst = (m_right_IV & ~mask) | (dst & mask);
						m_right_IV = dst;
						WRITEPORT(m_IVR+0x100,m_right_IV);
					}
					else
					{
						dst = (m_left_IV & ~mask) | (dst & mask);
						m_left_IV = dst;
						WRITEPORT(m_IVL,m_left_IV);
					}
				}
			}
			break;
		case 0x01:  // ADD
			rotlen = ROTLEN;
			if(is_rot(opcode))
			{  // ADD reg,reg
				src = rotate(get_reg(SRC),rotlen);
				result = src + m_AUX;
				set_reg(DST,result & 0xff);
				SET_OVF;
			}
			else
			{
				if(rotlen == 0)
					rotlen = 8;  // 0 = 8-bit I/O field length
				if(is_src_reg(opcode) && !(is_dst_reg(opcode)))
				{  // ADD reg,IV
					DST_LATCH;
					result = get_reg(SRC) + m_AUX;
					mask = ((1 << rotlen)-1);
					dst = (result & 0xff) << DST_LSB;
					mask <<= DST_LSB;
					SET_OVF;
					if(DST_IS_RIGHT_BANK)
					{
						dst = (m_right_IV & ~mask) | (dst & mask);
						m_right_IV = dst;
						WRITEPORT(m_IVR+0x100,m_right_IV);
					}
					else
					{
						dst = (m_left_IV & ~mask) | (dst & mask);
						m_left_IV = dst;
						WRITEPORT(m_IVL,m_left_IV);
					}
				}
				else if(!(is_src_reg(opcode)) && is_dst_reg(opcode))
				{  // ADD IV,reg
					SRC_LATCH;
					mask = ((1 << rotlen)-1);
					if(SRC_IS_RIGHT_BANK)
						src = rotate(m_right_IV,7-SRC_LSB) & mask;
					else
						src = rotate(m_left_IV,7-SRC_LSB) & mask;
					result = src + m_AUX;
					SET_OVF;
					set_reg(DST,result & 0xff);
				}
				else if(!(is_src_reg(opcode)) && !(is_dst_reg(opcode)))
				{  // ADD IV,IV
					SRC_LATCH;
					DST_LATCH;
					mask = ((1 << rotlen)-1);
					if(SRC_IS_RIGHT_BANK)
						src = rotate(m_right_IV,7-SRC_LSB) & mask;
					else
						src = rotate(m_left_IV,7-SRC_LSB) & mask;
					result = src + m_AUX;
					SET_OVF;
					dst = (result << (7-DST_LSB)) & 0xff;
					mask <<= (7-DST_LSB);
					if(SRC_IS_RIGHT_BANK)  // unused destination IV data is not preserved, is merged with input IV data
					{
						dst = (m_right_IV & ~mask) | (dst & mask);
						m_right_IV = dst;
						WRITEPORT(m_IVR+0x100,m_right_IV);
					}
					else
					{
						dst = (m_left_IV & ~mask) | (dst & mask);
						m_left_IV = dst;
						WRITEPORT(m_IVL,m_left_IV);
					}
				}
			}
			break;
		case 0x02:  // AND
			rotlen = ROTLEN;
			if(is_rot(opcode))
			{  // AND reg,reg
				src = rotate(get_reg(SRC),rotlen);
				dst = src & m_AUX;
				set_reg(DST,dst);
			}
			else
			{
				if(rotlen == 0)
					rotlen = 8;  // 0 = 8-bit I/O field length
				if(is_src_reg(opcode) && !(is_dst_reg(opcode)))
				{  // AND reg,IV
					DST_LATCH;
					src = get_reg(SRC) & m_AUX;
					mask = ((1 << rotlen)-1);
					src <<= (7-DST_LSB);
					mask <<= (7-DST_LSB);
					if(DST_IS_RIGHT_BANK)
					{
						dst = (m_right_IV & ~mask) | (src & mask);
						m_right_IV = dst;
						WRITEPORT(m_IVR+0x100,m_right_IV);
					}
					else
					{
						dst = (m_left_IV & ~mask) | (src & mask);
						m_left_IV = dst;
						WRITEPORT(m_IVL,m_left_IV);
					}
				}
				else if(!(is_src_reg(opcode)) && is_dst_reg(opcode))
				{  // AND IV,reg
					SRC_LATCH;
					mask = ((1 << rotlen)-1);
					if(SRC_IS_RIGHT_BANK)
						src = rotate(m_right_IV,7-SRC_LSB) & mask;
					else
						src = rotate(m_left_IV,7-SRC_LSB) & mask;
					src &= mask;
					dst = src & m_AUX;
					set_reg(DST,dst);
				}
				else if(!(is_src_reg(opcode)) && !(is_dst_reg(opcode)))
				{  // AND IV,IV
					SRC_LATCH;
					DST_LATCH;
					mask = ((1 << rotlen)-1);
					if(SRC_IS_RIGHT_BANK)
						src = rotate(m_right_IV,7-SRC_LSB) & mask;
					else
						src = rotate(m_left_IV,7-SRC_LSB) & mask;
					src &= mask;
					dst = src & m_AUX;
					dst <<= (7-DST_LSB);
					mask <<= (7-DST_LSB);
					if(SRC_IS_RIGHT_BANK)
					{
						dst = (m_right_IV & ~mask) | (src & mask);
						m_right_IV = dst;
						WRITEPORT(m_IVR+0x100,m_right_IV);
					}
					else
					{
						dst = (m_left_IV & ~mask) | (src & mask);
						m_left_IV = dst;
						WRITEPORT(m_IVL,m_left_IV);
					}
				}
			}
			break;
		case 0x03:  // XOR
			rotlen = ROTLEN;
			if(is_rot(opcode))
			{  // AND reg,reg
				src = rotate(get_reg(SRC),rotlen);
				dst = src ^ m_AUX;
				set_reg(DST,dst);
			}
			else
			{
				if(rotlen == 0)
					rotlen = 8;  // 0 = 8-bit I/O field length
				if(is_src_reg(opcode) && !(is_dst_reg(opcode)))
				{  // AND reg,IV
					DST_LATCH;
					src = get_reg(SRC) ^ m_AUX;
					mask = ((1 << rotlen)-1);
					src <<= (7-DST_LSB);
					mask <<= (7-DST_LSB);
					if(DST_IS_RIGHT_BANK)
					{
						dst = (m_right_IV & ~mask) | (src & mask);
						m_right_IV = dst;
						WRITEPORT(m_IVR+0x100,m_right_IV);
					}
					else
					{
						dst = (m_left_IV & ~mask) | (src & mask);
						m_left_IV = dst;
						WRITEPORT(m_IVL,m_left_IV);
					}
				}
				else if(!(is_src_reg(opcode)) && is_dst_reg(opcode))
				{  // AND IV,reg
					SRC_LATCH;
					mask = ((1 << rotlen)-1);
					if(SRC_IS_RIGHT_BANK)
						src = rotate(m_right_IV,7-SRC_LSB) & mask;
					else
						src = rotate(m_left_IV,7-SRC_LSB) & mask;
					src &= mask;
					dst = src ^ m_AUX;
					set_reg(DST,dst);
				}
				else if(!(is_src_reg(opcode)) && !(is_dst_reg(opcode)))
				{  // AND IV,IV
					SRC_LATCH;
					DST_LATCH;
					mask = ((1 << rotlen)-1);
					if(SRC_IS_RIGHT_BANK)
						src = rotate(m_right_IV,7-SRC_LSB) & mask;
					else
						src = rotate(m_left_IV,7-SRC_LSB) & mask;
					src &= mask;
					dst = src ^ m_AUX;
					dst <<= (7-DST_LSB);
					mask <<= (7-DST_LSB);
					if(SRC_IS_RIGHT_BANK)
					{
						dst = (m_right_IV & ~mask) | (src & mask);
						m_right_IV = dst;
						WRITEPORT(m_IVR+0x100,m_right_IV);
					}
					else
					{
						dst = (m_left_IV & ~mask) | (src & mask);
						m_left_IV = dst;
						WRITEPORT(m_IVL,m_left_IV);
					}
				}
			}
			break;
		case 0x04:  // XEC  (Execute)
			if(is_src_reg(opcode))
			{
				src = get_reg(SRC);
				src += IMM8;
				SET_AR((m_AR & 0x1f00) | src);
			}
			else
			{
				SRC_LATCH;
				rotlen = ROTLEN;
				if(rotlen == 0)
					rotlen = 8;  // 0 = 8-bit I/O field length
				mask = ((1 << rotlen)-1);
				if(SRC_IS_RIGHT_BANK)
					src = rotate(m_right_IV,7-SRC_LSB);
				else
					src = rotate(m_left_IV,7-SRC_LSB);
				src &= mask;
				src += IMM5;
				SET_AR((m_AR & 0x1fe0) | (src & 0x1f));
			}
			break;
		case 0x05:  // NZT  (Non-zero transfer)
			if(is_src_reg(opcode))
			{
				src = get_reg(SRC);
				if(src != 0)
					SET_PC((m_PC & 0x1f00) | IMM8);
			}
			else
			{
				SRC_LATCH;
				rotlen = ROTLEN;
				if(rotlen == 0)
					rotlen = 8;  // 0 = 8-bit I/O field length
				mask = ((1 << rotlen)-1);
				if(SRC_IS_RIGHT_BANK)
					src = rotate(m_right_IV,7-SRC_LSB);
				else
					src = rotate(m_left_IV,7-SRC_LSB);
				rotate(src,SRC_LSB);
				src &= mask;
				if(src != 0)
					SET_PC((m_PC & 0x1fe0) | IMM5);
			}
			break;
		case 0x06:  // XMIT (Transmit)
			// the source is actually the destination for this instruction
			if(is_src_reg(opcode))
				set_reg(SRC,IMM8);
			else
			{
				SRC_LATCH;
				rotlen = ROTLEN;
				if(rotlen == 0)
					rotlen = 8;  // 0 = 8-bit I/O field length
				mask = ((1 << rotlen)-1);
				dst = IMM5;
				mask <<= (7-SRC_LSB);
				dst <<= (7-SRC_LSB);
				if(SRC_IS_RIGHT_BANK)
				{
					m_right_IV = (m_right_IV & ~mask) | (dst & mask);
					WRITEPORT(m_IVR+0x100,m_right_IV);
				}
				else
				{
					m_left_IV = (m_left_IV & ~mask) | (dst & mask);
					WRITEPORT(m_IVL,m_left_IV);
				}
			}
			break;
		case 0x07:  // JMP
			SET_PC(ADDR);
			break;
		}
		CYCLES(1);  // all instructions take 1 cycle (250ns)
	} while (m_icount > 0);
}