summaryrefslogtreecommitdiff
path: root/arm9/source
diff options
context:
space:
mode:
authorIan C <ianc@noddybox.co.uk>2007-01-12 00:40:03 +0000
committerIan C <ianc@noddybox.co.uk>2007-01-12 00:40:03 +0000
commitef641589bf763ea12e73abf4bf42e45ac1acd2ff (patch)
tree0afa591a9c5294a07508f6c5c56a0857adfd2285 /arm9/source
parent50d960d99f0783799f81236d9225a6940606fe38 (diff)
Gone back to a simpler ARM9 only build as the new dynamic libfat library means I can use that, and dswifi wouldn't work with my AP.
Diffstat (limited to 'arm9/source')
-rw-r--r--arm9/source/framebuffer.c276
-rw-r--r--arm9/source/gui.c193
-rw-r--r--arm9/source/keyboard.c353
-rw-r--r--arm9/source/main.c553
-rw-r--r--arm9/source/tapes.c278
-rw-r--r--arm9/source/z80.c331
-rw-r--r--arm9/source/z80_decode.c2533
-rw-r--r--arm9/source/z80_dis.c2494
-rw-r--r--arm9/source/zx81.c792
9 files changed, 0 insertions, 7803 deletions
diff --git a/arm9/source/framebuffer.c b/arm9/source/framebuffer.c
deleted file mode 100644
index 65bedc9..0000000
--- a/arm9/source/framebuffer.c
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- ds81 - Nintendo DS ZX81 emulator.
-
- Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
-
- 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.
-
- $Id$
-*/
-
-#include <nds.h>
-#include <string.h>
-
-#include "ds81_global.h"
-
-/* ---------------------------------------- STATIC DATA
-*/
-#define WIDTH 256
-#define HEIGHT 192
-
-static uint16 *buff=0;
-
-static uint8 font[]=
-{
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x08, 0x08, 0x08, 0x08, 0x00, 0x08, 0x00,
- 0x00, 0x24, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x24, 0x7e, 0x24, 0x24, 0x7e, 0x24, 0x00,
- 0x00, 0x10, 0x7c, 0x14, 0x7c, 0x50, 0x7c, 0x10,
- 0x00, 0x46, 0x26, 0x10, 0x08, 0x64, 0x62, 0x00,
- 0x00, 0x08, 0x14, 0x08, 0x54, 0x22, 0x5c, 0x00,
- 0x00, 0x10, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x20, 0x10, 0x10, 0x10, 0x10, 0x20, 0x00,
- 0x00, 0x04, 0x08, 0x08, 0x08, 0x08, 0x04, 0x00,
- 0x00, 0x00, 0x28, 0x10, 0x7c, 0x10, 0x28, 0x00,
- 0x00, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x08,
- 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00,
- 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x00,
- 0x00, 0x3c, 0x62, 0x52, 0x4a, 0x46, 0x3c, 0x00,
- 0x00, 0x18, 0x14, 0x10, 0x10, 0x10, 0x7c, 0x00,
- 0x00, 0x3c, 0x42, 0x40, 0x3c, 0x02, 0x7e, 0x00,
- 0x00, 0x3c, 0x42, 0x30, 0x40, 0x42, 0x3c, 0x00,
- 0x00, 0x10, 0x18, 0x14, 0x12, 0x7e, 0x10, 0x00,
- 0x00, 0x7e, 0x02, 0x3e, 0x40, 0x42, 0x3c, 0x00,
- 0x00, 0x3c, 0x02, 0x3e, 0x42, 0x42, 0x3c, 0x00,
- 0x00, 0x7e, 0x40, 0x20, 0x10, 0x08, 0x08, 0x00,
- 0x00, 0x3c, 0x42, 0x3c, 0x42, 0x42, 0x3c, 0x00,
- 0x00, 0x3c, 0x42, 0x42, 0x7c, 0x40, 0x3c, 0x00,
- 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x00,
- 0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x08, 0x04,
- 0x00, 0x00, 0x20, 0x10, 0x08, 0x10, 0x20, 0x00,
- 0x00, 0x00, 0x00, 0x7c, 0x00, 0x7c, 0x00, 0x00,
- 0x00, 0x00, 0x08, 0x10, 0x20, 0x10, 0x08, 0x00,
- 0x00, 0x3c, 0x42, 0x20, 0x10, 0x00, 0x10, 0x00,
- 0x00, 0x3c, 0x52, 0x6a, 0x7a, 0x02, 0x3c, 0x00,
- 0x00, 0x3c, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x00,
- 0x00, 0x3e, 0x42, 0x3e, 0x42, 0x42, 0x3e, 0x00,
- 0x00, 0x3c, 0x42, 0x02, 0x02, 0x42, 0x3c, 0x00,
- 0x00, 0x1e, 0x22, 0x42, 0x42, 0x22, 0x1e, 0x00,
- 0x00, 0x7e, 0x02, 0x3e, 0x02, 0x02, 0x7e, 0x00,
- 0x00, 0x7e, 0x02, 0x3e, 0x02, 0x02, 0x02, 0x00,
- 0x00, 0x3c, 0x42, 0x02, 0x72, 0x42, 0x3c, 0x00,
- 0x00, 0x42, 0x42, 0x7e, 0x42, 0x42, 0x42, 0x00,
- 0x00, 0x7c, 0x10, 0x10, 0x10, 0x10, 0x7c, 0x00,
- 0x00, 0x40, 0x40, 0x40, 0x42, 0x42, 0x3c, 0x00,
- 0x00, 0x22, 0x12, 0x0e, 0x12, 0x22, 0x42, 0x00,
- 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x7e, 0x00,
- 0x00, 0x42, 0x66, 0x5a, 0x42, 0x42, 0x42, 0x00,
- 0x00, 0x42, 0x46, 0x4a, 0x52, 0x62, 0x42, 0x00,
- 0x00, 0x3c, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00,
- 0x00, 0x3e, 0x42, 0x42, 0x3e, 0x02, 0x02, 0x00,
- 0x00, 0x3c, 0x42, 0x42, 0x4a, 0x52, 0x3c, 0x00,
- 0x00, 0x3e, 0x42, 0x42, 0x3e, 0x22, 0x42, 0x00,
- 0x00, 0x3c, 0x02, 0x3c, 0x40, 0x42, 0x3c, 0x00,
- 0x00, 0x7f, 0x08, 0x08, 0x08, 0x08, 0x08, 0x00,
- 0x00, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3c, 0x00,
- 0x00, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00,
- 0x00, 0x42, 0x42, 0x42, 0x42, 0x5a, 0x24, 0x00,
- 0x00, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x00,
- 0x00, 0x41, 0x22, 0x14, 0x08, 0x08, 0x08, 0x00,
- 0x00, 0x7e, 0x20, 0x10, 0x08, 0x04, 0x7e, 0x00,
- 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x70, 0x00,
- 0x00, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00,
- 0x00, 0x0e, 0x08, 0x08, 0x08, 0x08, 0x0e, 0x00,
- 0x00, 0x08, 0x1c, 0x2a, 0x08, 0x08, 0x08, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
- 0x00, 0x38, 0x44, 0x1e, 0x04, 0x04, 0x7e, 0x00,
- 0x00, 0x00, 0x1c, 0x20, 0x3c, 0x22, 0x3c, 0x00,
- 0x00, 0x04, 0x04, 0x3c, 0x44, 0x44, 0x3c, 0x00,
- 0x00, 0x00, 0x38, 0x04, 0x04, 0x04, 0x38, 0x00,
- 0x00, 0x20, 0x20, 0x3c, 0x22, 0x22, 0x3c, 0x00,
- 0x00, 0x00, 0x1c, 0x22, 0x1e, 0x02, 0x3c, 0x00,
- 0x00, 0x30, 0x08, 0x18, 0x08, 0x08, 0x08, 0x00,
- 0x00, 0x00, 0x3c, 0x22, 0x22, 0x3c, 0x20, 0x1c,
- 0x00, 0x02, 0x02, 0x1e, 0x22, 0x22, 0x22, 0x00,
- 0x00, 0x08, 0x00, 0x0c, 0x08, 0x08, 0x1c, 0x00,
- 0x00, 0x20, 0x00, 0x20, 0x20, 0x20, 0x24, 0x18,
- 0x00, 0x04, 0x14, 0x0c, 0x0c, 0x14, 0x24, 0x00,
- 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x30, 0x00,
- 0x00, 0x00, 0x16, 0x2a, 0x2a, 0x2a, 0x2a, 0x00,
- 0x00, 0x00, 0x1e, 0x22, 0x22, 0x22, 0x22, 0x00,
- 0x00, 0x00, 0x1c, 0x22, 0x22, 0x22, 0x1c, 0x00,
- 0x00, 0x00, 0x1e, 0x22, 0x22, 0x1e, 0x02, 0x02,
- 0x00, 0x00, 0x3c, 0x22, 0x22, 0x3c, 0x20, 0x60,
- 0x00, 0x00, 0x38, 0x04, 0x04, 0x04, 0x04, 0x00,
- 0x00, 0x00, 0x1c, 0x02, 0x1c, 0x20, 0x1e, 0x00,
- 0x00, 0x08, 0x1c, 0x08, 0x08, 0x08, 0x30, 0x00,
- 0x00, 0x00, 0x22, 0x22, 0x22, 0x22, 0x1c, 0x00,
- 0x00, 0x00, 0x22, 0x22, 0x14, 0x14, 0x08, 0x00,
- 0x00, 0x00, 0x22, 0x2a, 0x2a, 0x2a, 0x14, 0x00,
- 0x00, 0x00, 0x22, 0x14, 0x08, 0x14, 0x22, 0x00,
- 0x00, 0x00, 0x22, 0x22, 0x22, 0x3c, 0x20, 0x1c,
- 0x00, 0x00, 0x3e, 0x10, 0x08, 0x04, 0x3e, 0x00,
- 0x00, 0x70, 0x10, 0x0c, 0x10, 0x10, 0x70, 0x00,
- 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00,
- 0x00, 0x0e, 0x08, 0x30, 0x08, 0x08, 0x0e, 0x00,
- 0x00, 0x28, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x3c, 0x42, 0x99, 0x85, 0x85, 0x99, 0x42, 0x3c
-};
-
-/* ---------------------------------------- PUBLIC INTERFACES
-*/
-void FB_Init(uint16 *vram)
-{
- buff=vram;
-}
-
-
-void FB_Print(const char *text, int x, int y, int colour, int paper)
-{
- uint16 *base;
-
- base=buff+y*WIDTH+x;
-
- while(*text)
- {
- int x,y;
- int ch;
-
- ch=((*text)-32)*8;
-
- for(y=0;y<8;y++)
- {
- for(x=0;x<8;x++)
- {
- if (font[ch]&(1<<x))
- {
- *(base+x+y*WIDTH)=colour;
- }
- else
- {
- if (paper!=-1)
- {
- *(base+x+y*WIDTH)=paper;
- }
- }
- }
-
- ch++;
- }
-
- base+=8;
- text++;
- }
-}
-
-
-void FB_Centre(const char *text, int y, int colour, int paper)
-{
- FB_Print(text,WIDTH/2-strlen(text)*4,y,colour,paper);
-}
-
-
-void FB_HLine(int x1, int x2, int y, int colour)
-{
- uint16 *line;
-
- line=buff+y*WIDTH+x1;
-
- while(x1<=x2)
- {
- *line++=colour;
- x1++;
- }
-}
-
-
-void FB_VLine(int x, int y1, int y2, int colour)
-{
- uint16 *line;
-
- line=buff+y1*WIDTH+x;
-
- while(y1<=y2)
- {
- *line=colour;
- line+=WIDTH;
- y1++;
- }
-}
-
-
-void FB_Box(int x, int y, int w, int h, int colour)
-{
- FB_HLine(x,x+w-1,y,colour);
- FB_HLine(x,x+w-1,y+h-1,colour);
- FB_VLine(x,y,y+h-1,colour);
- FB_VLine(x+w-1,y,y+h-1,colour);
-}
-
-
-void FB_FillBox(int x, int y, int w, int h, int colour)
-{
- int f;
- uint16 *base;
-
- base=buff+x+y*WIDTH;
-
- while(h--)
- {
- for(f=0;f<w;f++)
- {
- *(base+f)=colour;
- }
-
- base+=WIDTH;
- }
-}
-
-
-void FB_Clear(void)
-{
- uint16 *p;
- int f;
-
- f=WIDTH*HEIGHT;
- p=buff;
-
- while(f--)
- {
- *p++=0x8000;
- }
-}
-
-
-void FB_Blit(sImage *img, int x, int y)
-{
- if (img->width==WIDTH && img->height==HEIGHT)
- {
- dmaCopy(img->data8,buff,SCREEN_WIDTH*SCREEN_HEIGHT*2);
- }
- else
- {
- int f;
-
- for(f=0;f<img->height;f++)
- {
- dmaCopy(img->data16+(f*img->width),
- buff+x+(y+f)*WIDTH,img->width*2);
- }
- }
-}
diff --git a/arm9/source/gui.c b/arm9/source/gui.c
deleted file mode 100644
index e505330..0000000
--- a/arm9/source/gui.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- ds81 - Nintendo DS ZX81 emulator.
-
- Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
-
- 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.
-
- $Id$
-*/
-
-#include <nds.h>
-#include <string.h>
-
-#include "ds81_global.h"
-
-#include "framebuffer.h"
-
-
-/* ---------------------------------------- PUBLIC INTERFACES
-*/
-int GUI_Menu(const char *opts[])
-{
- int x,y;
- int h;
- int w;
- int no;
- int sel;
- int f;
- bool done;
- bool defer;
-
- w=0;
- h=0;
- sel=0;
- done=false;
- defer=false;
-
- for(no=0;opts[no];no++)
- {
- h+=16;
-
- if (strlen(opts[no])>w)
- {
- w=strlen(opts[no]);
- }
- }
-
- w=w*8+16;
-
- x=SCREEN_WIDTH/2-w/2;
- y=SCREEN_HEIGHT/2-h/2;
-
- while(!done)
- {
- uint32 key=0;
-
- FB_FillBox(x,y,w,h,FB_RGB(0,0,0));
- FB_Box(x,y,w,h,FB_RGB(31,31,31));
- FB_FillBox(x+1,y+sel*16+1,w-2,14,FB_RGB(8,8,31));
-
- for(f=0;f<no;f++)
- {
- FB_Centre(opts[f],y+4+f*16,FB_RGB(31,31,31),-1);
- }
-
- do
- {
- swiWaitForVBlank();
- } while(!defer && !(key=keysDownRepeat()));
-
- if (defer)
- {
- do
- {
- swiWaitForVBlank();
- } while (keysHeld()&KEY_TOUCH);
- done=true;
- }
- else
- {
- if (key & (KEY_A|KEY_B|KEY_X|KEY_Y))
- {
- done=true;
- }
- else if ((key & KEY_UP) && sel)
- {
- sel--;
- }
- else if ((key & KEY_DOWN) && sel<no-1)
- {
- sel++;
- }
- else if (key & KEY_TOUCH)
- {
- touchPosition tp=touchReadXY();
-
- if (tp.px>=x && tp.px<(w+w) && tp.py>=y && tp.py<(y+h))
- {
- defer=true;
- sel=(tp.py-y)/16;
- }
- }
- }
- }
-
- return sel;
-}
-
-
-void GUI_Alert(int fatal, const char *text)
-{
- char line[80];
- int h;
- const char *p;
- char *d;
-
- h=40;
- p=text;
-
- while(*p)
- {
- if (*p++=='\n')
- {
- h+=8;
- }
- }
-
- FB_FillBox(0,0,SCREEN_WIDTH,h,FB_RGB(0,0,0));
- FB_Box(1,1,SCREEN_WIDTH-2,h-2,FB_RGB(31,0,0));
-
- p=text;
- h=4;
- d=line;
-
- while(*p)
- {
- if (*p=='\n')
- {
- *d++=0;
- p++;
- FB_Centre(line,h,FB_RGB(31,31,31),-1);
- h+=8;
- d=line;
- }
- else
- {
- *d++=*p++;
- }
- }
-
- if (d>line)
- {
- *d=0;
- FB_Centre(line,h,FB_RGB(31,31,31),-1);
- h+=8;
- }
-
- if (!fatal)
- {
- FB_Centre("PRESS ANY BUTTON OR SCREEN",h+16,FB_RGB(31,31,0),-1);
-
- while(!keysDown())
- {
- swiWaitForVBlank();
- }
-
- while(keysHeld())
- {
- swiWaitForVBlank();
- }
- }
- else
- {
- FB_Centre("PLEASE RESET YOUR CONSOLE",h+16,FB_RGB(31,31,0),-1);
-
- while(1)
- {
- swiWaitForVBlank();
- }
- }
-}
diff --git a/arm9/source/keyboard.c b/arm9/source/keyboard.c
deleted file mode 100644
index 76f16e6..0000000
--- a/arm9/source/keyboard.c
+++ /dev/null
@@ -1,353 +0,0 @@
-/*
- ds81 - Nintendo DS ZX81 emulator.
-
- Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
-
- 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.
-
- $Id$
-*/
-
-#include <nds.h>
-
-#include "ds81_global.h"
-
-#include "keyboard.h"
-#include "framebuffer.h"
-#include "keyb_bin.h"
-
-/* ---------------------------------------- STATIC DATA
-*/
-static uint16 white = FB_RGB(31, 31, 31);
-static uint16 black = FB_RGB(0, 0, 0);
-
-static struct
-{
- int state;
- int new_state;
- int handled;
- int is_sticky;
-} key_state[NUM_SOFT_KEYS];
-
-static SoftKey pad_left_key = SK_5;
-static SoftKey pad_right_key = SK_8;
-static SoftKey pad_up_key = SK_7;
-static SoftKey pad_down_key = SK_6;
-static SoftKey pad_A_key = SK_0;
-static SoftKey pad_B_key = SK_NEWLINE;
-static SoftKey pad_X_key = NUM_SOFT_KEYS;
-static SoftKey pad_Y_key = NUM_SOFT_KEYS;
-static SoftKey pad_R_key = NUM_SOFT_KEYS;
-static SoftKey pad_L_key = NUM_SOFT_KEYS;
-static SoftKey pad_start_key = NUM_SOFT_KEYS;
-static SoftKey pad_select_key = NUM_SOFT_KEYS;
-
-#define CLEAR_STATE(SHORTCUT) \
- do \
- { \
- if (SHORTCUT != NUM_SOFT_KEYS && \
- !key_state[SHORTCUT].handled) \
- { \
- key_state[SHORTCUT].new_state = FALSE; \
- } \
- } while(0)
-
-#define CHECK_STATE(KEYS,BIT,CODE,SHORTCUT,USE_SHORTCUT) \
- do \
- { \
- key_state[CODE].new_state = (KEYS & BIT); \
- if (USE_SHORTCUT && SHORTCUT != NUM_SOFT_KEYS && \
- !key_state[SHORTCUT].handled && (KEYS & BIT)) \
- { \
- key_state[SHORTCUT].new_state = TRUE; \
- } \
- } while(0)
-
-
-static const char *keynames[]=
-{
- "1", "2", "3", "4", "5",
- "6", "7", "8", "9", "0",
- "Q", "W", "E", "R", "T",
- "Y", "U", "I", "O", "P",
- "A", "S", "D", "F", "G",
- "H", "J", "K", "L", "NEWLINE",
- "SHIFT", "Z", "X", "C", "V",
- "B", "N", "M", "PERIOD", "SPACE",
-
- "ABOUT",
- "CONFIG",
- "JOYPAD UP",
- "JOYPAD DOWN",
- "JOYPAD LEFT",
- "JOYPAD RIGHT",
- "A BUTTON",
- "B BUTTON",
- "X BUTTON",
- "Y BUTTON",
- "RIGHT SHOULDER BUTTON",
- "LEFT SHOULDER BUTTON",
- "START BUTTON",
- "SELECT BUTTON"
-};
-
-/* ---------------------------------------- PRIVATE INTERFACES
-*/
-static SoftKey LocatePress(const touchPosition *p)
-{
- int kx=0,ky=0;
- int py=0;
- SoftKey key = NUM_SOFT_KEYS;
-
- if (p->py > 36 && p->px > 2)
- {
- kx = (p->px - 3) / 25;
- ky = p->py - 37;
-
- py = ky % 30;
- ky /= 30;
-
- if (py<17 && kx >= 0 && kx<10 && ky>=0 && ky<=4)
- {
- key = kx + ky * 10;
- }
- }
-
- if (key>SK_SPACE)
- {
- key = NUM_SOFT_KEYS;
- }
-
- return key;
-}
-
-
-static int GetEvent(SoftKeyEvent *ev, int map)
-{
- static SoftKey last = NUM_SOFT_KEYS;
- static int poll_index = -1;
-
- /* Read the keys if this is a new loop
- */
- if (poll_index == -1)
- {
- int f;
- uint32 keys;
-
- keys = keysHeld();
-
- /* Clear the non-sticky keys
- */
- for(f=SK_1; f<=SK_CONFIG; f++)
- {
- key_state[f].handled = FALSE;
-
- if (key_state[f].is_sticky)
- {
- key_state[f].new_state = key_state[f].state;
- }
- else
- {
- key_state[f].new_state = FALSE;
- }
- }
-
- /* Check the soft keyboard
- */
- if (keys & KEY_TOUCH)
- {
- touchPosition tp=touchReadXY();
-
- if (tp.py<21 || tp.py>165)
- {
- key_state[SK_CONFIG].new_state = TRUE;
- }
- else
- {
- SoftKey press;
-
- press = LocatePress(&tp);
-
- if (press != NUM_SOFT_KEYS)
- {
- key_state[press].handled = TRUE;
-
- if (key_state[press].is_sticky)
- {
- if (last != press)
- {
- key_state[press].new_state =
- !key_state[press].state;
- }
- }
- else
- {
- key_state[press].new_state = TRUE;
- }
-
- last = press;
- }
- }
- }
- else
- {
- last = NUM_SOFT_KEYS;
- }
-
- /* Check non soft-keyboard controls
- */
- CHECK_STATE(keys, KEY_A, SK_PAD_A, pad_A_key, map);
- CHECK_STATE(keys, KEY_B, SK_PAD_B, pad_B_key, map);
- CHECK_STATE(keys, KEY_X, SK_PAD_X, pad_X_key, map);
- CHECK_STATE(keys, KEY_Y, SK_PAD_Y, pad_Y_key, map);
- CHECK_STATE(keys, KEY_R, SK_PAD_R, pad_R_key, map);
- CHECK_STATE(keys, KEY_L, SK_PAD_L, pad_L_key, map);
- CHECK_STATE(keys, KEY_START, SK_PAD_START, pad_start_key, map);
- CHECK_STATE(keys, KEY_SELECT, SK_PAD_SELECT, pad_select_key, map);
- CHECK_STATE(keys, KEY_UP, SK_PAD_UP, pad_up_key, map);
- CHECK_STATE(keys, KEY_DOWN, SK_PAD_DOWN, pad_down_key, map);
- CHECK_STATE(keys, KEY_LEFT, SK_PAD_LEFT, pad_left_key, map);
- CHECK_STATE(keys, KEY_RIGHT, SK_PAD_RIGHT, pad_right_key, map);
-
- /* Reset key event poll index
- */
- poll_index = 0;
-
- /* Update any on-screen indicators
- */
- for(f=SK_1; f<SK_CONFIG; f++)
- {
- if (key_state[f].state != key_state[f].new_state)
- {
- int x,y;
-
- x = 3 + (f % 10) * 25;
- y = 37 + (f / 10) * 30;
-
- FB_Box(x, y, 25, 18, key_state[f].new_state ? white:black);
- }
- }
- }
-
- while(poll_index < NUM_SOFT_KEYS &&
- key_state[poll_index].state == key_state[poll_index].new_state)
- {
- poll_index++;
- }
-
- if (poll_index < NUM_SOFT_KEYS)
- {
- key_state[poll_index].state = key_state[poll_index].new_state;
-
- ev->key = poll_index;
- ev->pressed = key_state[poll_index].state;
-
- return TRUE;
- }
- else
- {
- poll_index = -1;
- return FALSE;
- }
-}
-
-
-/* ---------------------------------------- PUBLIC INTERFACES
-*/
-void SK_DisplayKeyboard(uint16 *vram)
-{
- sImage img;
-
- loadPCX(keyb_bin,&img);
- image8to16(&img);
- dmaCopy(img.data8,vram,SCREEN_WIDTH*SCREEN_HEIGHT*2);
-}
-
-
-int SK_GetEvent(SoftKeyEvent *ev)
-{
- return GetEvent(ev,TRUE);
-}
-
-
-int SK_GetBareEvent(SoftKeyEvent *ev)
-{
- return GetEvent(ev,FALSE);
-}
-
-
-void SK_SetSticky(SoftKey key, int is_sticky)
-{
- key_state[key].is_sticky = is_sticky;
-
- if (!is_sticky)
- {
- key_state[key].new_state = FALSE;
- }
-}
-
-
-void SK_DefinePad(SoftKey pad, SoftKey key)
-{
- switch(pad)
- {
- case SK_PAD_LEFT:
- pad_left_key = key;
- break;
- case SK_PAD_RIGHT:
- pad_right_key = key;
- break;
- case SK_PAD_UP:
- pad_up_key = key;
- break;
- case SK_PAD_DOWN:
- pad_down_key = key;
- break;
- case SK_PAD_A:
- pad_A_key = key;
- break;
- case SK_PAD_B:
- pad_B_key = key;
- break;
- case SK_PAD_X:
- pad_X_key = key;
- break;
- case SK_PAD_Y:
- pad_Y_key = key;
- break;
- case SK_PAD_R:
- pad_R_key = key;
- break;
- case SK_PAD_L:
- pad_L_key = key;
- break;
- case SK_PAD_START:
- pad_start_key = key;
- break;
- case SK_PAD_SELECT:
- pad_select_key = key;
- break;
- default:
- break;
- }
-}
-
-
-const char *SK_KeyName(SoftKey k)
-{
- return keynames[k];
-}
-
-
diff --git a/arm9/source/main.c b/arm9/source/main.c
deleted file mode 100644
index d0d0434..0000000
--- a/arm9/source/main.c
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- ds81 - Nintendo DS ZX81 emulator.
-
- Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
-
- 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.
-
- $Id$
-*/
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <nds.h>
-#include <fat.h>
-#include <dswifi9.h>
-
-#include "ds81_ipc.h"
-
-#include "ds81_global.h"
-#include "ds81_fader.h"
-
-#include "framebuffer.h"
-#include "gui.h"
-#include "keyboard.h"
-#include "z80.h"
-#include "zx81.h"
-#include "tapes.h"
-
-#include "splashimg_bin.h"
-#include "rom_font_bin.h"
-
-/* ---------------------------------------- STATIC DATA
-*/
-static const char *main_menu[]=
- {
- "Reset ZX81",
- "Select Tape",
- "Sticky Shift On",
- "Sticky Shift Off",
- "Map Joypad to Keys",
- "Select Web Server (WFC)",
- "Cancel",
- NULL
- };
-
-typedef enum
-{
- MenuReset,
- MenuSelectTape,
- MenuStickyOn,
- MenuStickyOff,
- MenuMapJoypad,
- MenuConfigNetwork
-} MenuOpt;
-
-
-/* Hope ints are atomic... Having said that we are on the one processor so
- I doubt it'll mess up. Which are usually famous last words.
-*/
-static volatile int wifi_enabled = FALSE;
-
-static u32 main_heartbeat;
-
-
-/* ---------------------------------------- IRQ FUNCS
-*/
-
-static void Timer(void)
-{
- {
- static int c=0;
- char s[32];
- sprintf(s,"C:%d H:%d",(c++)/50,IPC->heartbeat);
- FB_Print(s,0,184-10,FB_RGB(31,31,31),FB_RGB(10,10,10));
- }
-
- Wifi_Timer(50);
-}
-
-static void ARM9_SyncToARM7(void)
-{
- REG_IPC_FIFO_TX = DS81_WIFI_SYNC_IPC;
-}
-
-
-static void ARM9_Fifo(void)
-{
- static int c=0;
- u32 v;
-
- v = REG_IPC_FIFO_RX;
-
- {
- char s[32];
- sprintf(s,"%d:%x ",c++,v);
- FB_Print(s,0,184,FB_RGB(31,31,31),FB_RGB(10,10,10));
- }
-
- if (v == DS81_WIFI_SYNC_IPC)
- {
- Wifi_Sync();
- }
-}
-
-
-/* ---------------------------------------- DISPLAY FUNCS
-*/
-static void VBlankFunc(void)
-{
-#if 0
- char t[32];
-
- if (IPC->rtc_hours < 12)
- {
- sprintf(t,"%2.2d:%2.2d:%2.2d",IPC->rtc_hours,
- IPC->rtc_minutes,
- IPC->rtc_seconds);
- }
- else
- {
- sprintf(t,"%2.2d:%2.2d:%2.2d",IPC->rtc_hours-40,
- IPC->rtc_minutes,
- IPC->rtc_seconds);
- }
-
- FB_Print(t,192,0,FB_RGB(31,31,31),FB_RGB(10,10,10));
-
- sprintf(t,"H:%8.8x M:%8.8x",IPC->heartbeat,main_heartbeat);
- FB_Print(t,0,0,FB_RGB(31,31,31),FB_RGB(10,10,10));
-#endif
-
- scanKeys();
-}
-
-static void Splash(void)
-{
- static const char *text[]=
- {
- "DS81 \177 2006 Ian C",
- " ",
- "ZX81 ROM \177 1981",
- "Nine Tiles Networks LTD",
- " ",
- "PRESS A TO CONTINUE",
- " ",
- "http://www.noddybox.co.uk/",
- " ",
- " ",
- " ",
- " ",
- "Checking for FAT device...",
- NULL
- };
-
- sImage img;
- int f;
- int y;
- int res=FALSE;
-
- ZX81DisplayString("10 print '%the zx81 is ace%'\n20 goto 10");
-
- FB_Clear();
-
- loadPCX(splashimg_bin,&img);
- image8to16(&img);
-
- FB_Blit(&img,0,0);
-
- y = 10;
-
- for(f=0;text[f];f++)
- {
- FB_Centre(text[f],y,FB_RGB(31,31,31),-1);
- y += 8;
- }
-
- y += 8;
-
-#ifndef DS81_DISABLE_FAT
- res = fatInitDefault();
-#endif
-
- if (res)
- {
- ZX81EnableFileSystem(TRUE);
-
- FB_Centre("Found a FAT device.",y,FB_RGB(31,31,31),-1);
- y += 8;
-
- FB_Centre("If you place .P tape files in",y,FB_RGB(31,31,31),-1);
- y += 8;
-
- FB_Centre("the top directory or ZX81TAPE",y,FB_RGB(31,31,31),-1);
- y += 8;
-
- FB_Centre("then you should be able to load",y,FB_RGB(31,31,31),-1);
- y += 8;
-
- FB_Centre("GAME.P with the command",y,FB_RGB(31,31,31),-1);
- y += 8;
-
- FB_Centre("LOAD \"GAME\"",y,FB_RGB(31,31,31),-1);
- y += 8;
- }
- else
- {
- ZX81EnableFileSystem(FALSE);
-
- FB_Centre("Sorry, but you don't have a",y,FB_RGB(31,31,31),-1);
- y += 8;
-
- FB_Centre("supported FAT device.",y,FB_RGB(31,31,31),-1);
- y += 8;
-
- FB_Centre("Only the internal tape",y,FB_RGB(31,31,31),-1);
- y += 8;
-
- FB_Centre("files can be used.",y,FB_RGB(31,31,31),-1);
- y += 8;
- }
-
- while(!(keysDown() & KEY_A))
- {
- swiWaitForVBlank();
- }
-}
-
-
-/* ---------------------------------------- JOYPAD MAPPING
-*/
-static void MapJoypad(void)
-{
- SoftKeyEvent ev;
- SoftKey pad = NUM_SOFT_KEYS;
- int done = FALSE;
- char text[256];
-
- SK_DisplayKeyboard(BG_GFX_SUB);
-
- ZX81DisplayString("press the joypad button you want\n"
- "to define and then the ZX81 key\n"
- "you want to use.\n\n"
- "press on the config banner to\n"
- "finish.");
-
- while(!done)
- {
- while(SK_GetBareEvent(&ev))
- {
- if (ev.pressed)
- {
- if (ev.key==SK_ABOUT || ev.key==SK_CONFIG)
- {
- done = true;
- }
- }
- else
- {
- if (ev.key>=SK_PAD_UP && ev.key<=SK_PAD_SELECT)
- {
- pad = ev.key;
-
- /* Now, just how dumb was making % the inverse on/off...
- */
- sprintf(text,"defining\n %%%s%%",SK_KeyName(pad));
- ZX81DisplayString(text);
- }
-
- if (ev.key<=SK_SPACE && pad!=NUM_SOFT_KEYS)
- {
- sprintf(text,"mapped\n %%%s%%\nto\n %%%s%%",
- SK_KeyName(pad),SK_KeyName(ev.key));
- ZX81DisplayString(text);
-
- SK_DefinePad(pad,ev.key);
-
- pad = NUM_SOFT_KEYS;
- }
- }
- }
-
- swiWaitForVBlank();
- }
-}
-
-
-/* ---------------------------------------- NETWORK CONFIGURATION
-*/
-static const char *AssocStatus(enum WIFI_ASSOCSTATUS s, int *exit_loop)
-{
- switch(s)
- {
- case ASSOCSTATUS_DISCONNECTED:
- return "Not trying to connect...";
-
- case ASSOCSTATUS_SEARCHING:
- return "Searching for AP...";
-
- case ASSOCSTATUS_AUTHENTICATING:
- return "Connecting (authenticate)...";
-
- case ASSOCSTATUS_ASSOCIATING:
- return "Connecting (associating)...";
-
- case ASSOCSTATUS_ACQUIRINGDHCP:
- return "Requesting IP address...";
-
- case ASSOCSTATUS_ASSOCIATED:
- *exit_loop = 1;
- return "Associated";
-
- case ASSOCSTATUS_CANNOTCONNECT:
- *exit_loop = 1;
- return "Cannot connect";
-
- default:
- *exit_loop = 1;
- return "Unknown status";
- }
-}
-
-static void ConfigNetwork(void)
-{
- int col;
- int coli;
- u32 wifi_pass;
- enum WIFI_ASSOCSTATUS assoc;
- int exit_loop;
-
- FB_Clear();
-
- FB_Centre("Initialising WIFI...",0,FB_RGB(31,31,31),-1);
-
- wifi_pass = Wifi_Init(WIFIINIT_OPTION_USELED);
-
- REG_IPC_FIFO_TX = DS81_WIFI_INIT_IPC;
- REG_IPC_FIFO_TX = wifi_pass;
-
- Wifi_SetSyncHandler(ARM9_SyncToARM7);
-
- FB_Centre("Waiting for WIFI...",10,FB_RGB(31,31,31),-1);
-
- col = 31;
- coli = -1;
-
- while(Wifi_CheckInit() == 0)
- {
- FB_Centre("Waiting for WIFI...",10,FB_RGB(col,col,col),-1);
- DS81_BOUNCE(col,coli);
- swiWaitForVBlank();
- }
-
- FB_Centre("Waiting for WIFI...",10,FB_RGB(31,31,31),-1);
-
- wifi_enabled = TRUE;
-
- FB_Centre("Using WFC settings...",20,FB_RGB(31,31,31),-1);
- Wifi_AutoConnect();
-
- /*
- {
- static Wifi_AccessPoint p;
- static unsigned char key[32];
-
- strcpy(p.ssid,"NODDYBOX_WAP");
- p.ssid_len=strlen(p.ssid);
- p.channel=11;
- Wifi_ConnectAP(&p,0,0,key);
- }
- */
-
- FB_Centre("Waiting for association...",30,FB_RGB(31,31,31),-1);
- exit_loop = FALSE;
-
- while(!exit_loop)
- {
- assoc = Wifi_AssocStatus();
-
- FB_Centre(AssocStatus(assoc,&exit_loop),40,FB_RGB(col,col,col),-1);
- DS81_BOUNCE(col,coli);
- swiWaitForVBlank();
- }
-
- FB_Centre(AssocStatus(assoc,&exit_loop),40,FB_RGB(31,31,31),-1);
-
- FB_Centre("Press a key...",60,FB_RGB(31,31,31),-1);
-
- while(!keysDown())
- {
- swiWaitForVBlank();
- }
-
- while(keysHeld())
- {
- swiWaitForVBlank();
- }
-
- SK_DisplayKeyboard(BG_GFX_SUB);
- swiWaitForVBlank();
-}
-
-
-/* ---------------------------------------- MAIN
-*/
-int main(int argc, char *argv[])
-{
- Z80 *z80;
-
- powerON(POWER_ALL_2D);
-
- /* Set up main text screen and load the ROM character data
- */
- videoSetMode(MODE_0_2D | DISPLAY_BG0_ACTIVE);
-
- vramSetBankA(VRAM_A_MAIN_BG_0x6000000);
- vramSetBankB(VRAM_B_MAIN_BG_0x6020000);
-
- BG0_CR = BG_COLOR_256|BG_MAP_BASE(0)|BG_TILE_BASE(1);
- BG0_X0 = 0;
- BG0_Y0 = 0;
-
- BG_PALETTE[0] = RGB15(31,31,31);
- BG_PALETTE[1] = RGB15(0,0,0);
-
- dmaCopy(rom_font_bin,(void *)BG_TILE_RAM(1),rom_font_bin_size);
-
- /* Set up the sub-screen for rotation (basically for use as a framebuffer)
- */
- videoSetModeSub(MODE_5_2D | DISPLAY_BG2_ACTIVE);
- vramSetBankC(VRAM_C_SUB_BG_0x6200000);
-
- SUB_BG2_CR = BG_BMP16_256x256;
- SUB_BG2_XDX = 0x100;
- SUB_BG2_XDY = 0;
- SUB_BG2_YDX = 0;
- SUB_BG2_YDY = 0x100;
- SUB_BG2_CX = 0;
- SUB_BG2_CY = 0;
-
- /* Tell 'framebuffer' routines to use this
- */
- FB_Init(BG_GFX_SUB);
-
- /* Set up interrupts and timers
- */
- irqInit();
- irqSet(IRQ_VBLANK,VBlankFunc);
- irqEnable(IRQ_VBLANK);
-
- REG_IPC_FIFO_CR = IPC_FIFO_ENABLE | IPC_FIFO_RECV_IRQ;
-
- TIMER3_CR = 0;
-
- irqSet(IRQ_TIMER3,Timer);
- TIMER3_DATA = TIMER_FREQ_256(20);
- TIMER3_CR = TIMER_ENABLE | TIMER_IRQ_REQ | TIMER_DIV_256;
- irqEnable(IRQ_TIMER3);
-
- irqSet(IRQ_FIFO_NOT_EMPTY,ARM9_Fifo);
- irqEnable(IRQ_FIFO_NOT_EMPTY);
-
- /* All required stuff initialised
- */
- keysSetRepeat(30,15);
-
- z80 = Z80Init(ZX81ReadMem,
- ZX81WriteMem,
- ZX81ReadPort,
- ZX81WritePort,
- NULL);
-
- if (!z80)
- {
- GUI_Alert(TRUE,"Failed to initialise\nthe Z80 CPU emulation!");
- }
-
- ZX81Init((uint16*)SCREEN_BASE_BLOCK(0), z80);
-
- Splash();
-
- SK_DisplayKeyboard(BG_GFX_SUB);
-
- SK_SetSticky(SK_SHIFT,1);
-
- while(1)
- {
- SoftKeyEvent ev;
-
- main_heartbeat++;
-
- Z80Exec(z80);
-
- while(SK_GetEvent(&ev))
- {
- switch(ev.key)
- {
- case SK_ABOUT:
- case SK_CONFIG:
- if (ev.pressed)
- {
- switch(GUI_Menu(main_menu))
- {
- case MenuReset:
- ZX81Reset(z80);
- break;
-
- case MenuSelectTape:
- SelectTape();
- break;
-
- case MenuStickyOn:
- SK_SetSticky(SK_SHIFT,1);
- break;
-
- case MenuStickyOff:
- SK_SetSticky(SK_SHIFT,0);
- break;
-
- case MenuMapJoypad:
- MapJoypad();
- break;
-
- case MenuConfigNetwork:
- ConfigNetwork();
- break;
- }
-
- SK_DisplayKeyboard(BG_GFX_SUB);
- }
- break;
-
- default:
- ZX81HandleKey(ev.key,ev.pressed);
- break;
- }
- }
- }
-
- return 0;
-}
diff --git a/arm9/source/tapes.c b/arm9/source/tapes.c
deleted file mode 100644
index 5c49346..0000000
--- a/arm9/source/tapes.c
+++ /dev/null
@@ -1,278 +0,0 @@
-/*
- ds81 - Nintendo DS ZX81 emulator.
-
- Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
-
- 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.
-
- $Id$
-*/
-
-#include <nds.h>
-
-#include "ds81_global.h"
-
-#include "tapes.h"
-#include "framebuffer.h"
-#include "keyboard.h"
-#include "zx81.h"
-
-#include "maze_bin.h"
-#include "maze_inlay_bin.h"
-#include "cpatrol_bin.h"
-#include "cpatrol_inlay_bin.h"
-#include "sabotage_bin.h"
-#include "sabotage_inlay_bin.h"
-#include "mazogs_bin.h"
-#include "mazogs_inlay_bin.h"
-
-
-/* ---------------------------------------- STATIC DATA
-*/
-typedef struct
-{
- const u8 *tape;
- const u32 *tape_len;
- sImage img;
- const void *source_pcx;
- SoftKey *keys;
- const char *text;
-} Tape;
-
-#define NO_TAPES 4
-
-static SoftKey maze_keys[]=
- {
- SK_PAD_UP, SK_7,
- SK_PAD_LEFT, SK_5,
- SK_PAD_RIGHT, SK_8,
- SK_PAD_START, SK_C,
- SK_PAD_SELECT, SK_A,
- NUM_SOFT_KEYS
- };
-
-static SoftKey cpatrol_keys[]=
- {
- SK_PAD_UP, SK_F,
- SK_PAD_RIGHT, SK_J,
- SK_PAD_LEFT, SK_N,
- SK_PAD_DOWN, SK_V,
- SK_PAD_R, SK_N,
- SK_PAD_L, SK_J,
- SK_PAD_A, SK_0,
- SK_PAD_B, SK_NEWLINE,
- NUM_SOFT_KEYS
- };
-
-static SoftKey sabotage_keys[]=
- {
- SK_PAD_UP, SK_W,
- SK_PAD_LEFT, SK_H,
- SK_PAD_RIGHT, SK_J,
- SK_PAD_DOWN, SK_S,
- SK_PAD_A, SK_E,
- SK_PAD_R, SK_1,
- SK_PAD_L, SK_2,
- SK_PAD_START, SK_0,
- NUM_SOFT_KEYS
- };
-
-static SoftKey mazogs_keys[]=
- {
- SK_PAD_UP, SK_W,
- SK_PAD_LEFT, SK_H,
- SK_PAD_RIGHT, SK_J,
- SK_PAD_DOWN, SK_S,
- SK_PAD_A, SK_NEWLINE,
- SK_PAD_R, SK_R,
- SK_PAD_L, SK_L,
- SK_PAD_START, SK_Y,
- SK_PAD_SELECT, SK_V,
- NUM_SOFT_KEYS
- };
-
-static Tape tapes[NO_TAPES]=
- {
- {
- maze_bin,
- &maze_bin_size,
- {0},
- maze_inlay_bin,
- maze_keys,
- "%3d monster maze%\n"
- "(c) 1983 Malcom E. Evans\n\n"
- "Escape the maze and its T-Rex\n\n"
- "use joypad for turning and to\n"
- "move forward.\n"
- "%start% to start.\n"
- "%select% to appeal.\n\n"
- "%note% when the screen goes grey\n"
- "for 30-60 seconds this is not a\n"
- "problem - the game is creating\n"
- "the maze."
- },
- {
- mazogs_bin,
- &mazogs_bin_size,
- {0},
- mazogs_inlay_bin,
- mazogs_keys,
- "%Mazogs%\n"
- "(c) 1981 Don Priestley\n\n"
- "Find the treasure and\n"
- "return to the start.\n"
- "Avoid the %Mazogs% that roam\n"
- "the maze.\n\n"
- "Use joypad to move.\n"
- "%select% to view map.\n"
- "%start% to quit.\n"
- "%L% or %R% shoulder to select\n"
- "direction at start."
- },
- {
- cpatrol_bin,
- &cpatrol_bin_size,
- {0},
- cpatrol_inlay_bin,
- cpatrol_keys,
- "%city patrol%\n"
- "(c) 1982 Don Priestley\n\n"
- "Defend the city from the aliens.\n\n"
- "yes - that parallax city was\n"
- "done with a text mode and the\n"
- "equivalent of a 0.8mhz z80\n\n"
- "the joypad controls the cursor.\n"
- "hold %L% or %R% shoulder buttons\n"
- "to move fast when moving in the\n"
- "same direction.\n\n"
- "%A% fires when moving.\n"
- "%B% fires when still.\n\n"
- "sorry about that, but the keys\n"
- "are a bit odd in this game."
- },
- {
- sabotage_bin,
- &sabotage_bin_size,
- {0},
- sabotage_inlay_bin,
- sabotage_keys,
- "%sabotage%\n"
- "(c) 1982 Don Priestley\n\n"
- "Destroy the boxes before the\n"
- "guard finds you.\n\n"
- "or find the saboteur as the\n"
- "guard.\n\n"
- "while this game may not feature\n"
- "the dazzling graphics of other\n"
- "ZX81 games it more than makes\n"
- "up with a simply joyous\n"
- "gameplay mechanic.\n\n"
- "The joypad controls the player.\n"
- "%A% plants a bomb. %L% shoulder\n"
- "to play as the guard, %R% as\n"
- "the saboteur."
- }
- };
-
-
-static int current=0;
-
-/* ---------------------------------------- PRIVATE INTERFACES
-*/
-static void InitTapes(void)
-{
- static int init=FALSE;
- int f;
-
- if (init)
- {
- return;
- }
-
- init=TRUE;
-
- for(f=0;f<NO_TAPES;f++)
- {
- loadPCX(tapes[f].source_pcx,&tapes[f].img);
- image8to16(&tapes[f].img);
- }
-}
-
-static void DisplayTape(Tape *t)
-{
- FB_Clear();
- FB_Blit(&t->img,255-t->img.width,0);
-
- FB_Print("LEFT/RIGHT",0,0,FB_RGB(255,255,255),-1);
- FB_Print("to choose",0,10,FB_RGB(255,255,255),-1);
- FB_Print("A to select",0,30,FB_RGB(255,255,255),-1);
- FB_Print("B to cancel",0,40,FB_RGB(255,255,255),-1);
- FB_Print("REMEMBER TO",0,60,FB_RGB(255,255,255),-1);
- FB_Print("LOAD \"\"",0,70,FB_RGB(255,255,255),-1);
- FB_Print("ON THE ZX81!",0,80,FB_RGB(255,255,255),-1);
-
- ZX81DisplayString(t->text);
-}
-
-/* ---------------------------------------- PUBLIC INTERFACES
-*/
-void SelectTape(void)
-{
- int done=FALSE;
-
- InitTapes();
-
- while(!done)
- {
- uint32 key=0;
-
- DisplayTape(tapes+current);
-
- do
- {
- swiWaitForVBlank();
- } while(!(key=keysDownRepeat()));
-
- if (key & KEY_LEFT)
- {
- if (--current<0)
- {
- current=NO_TAPES-1;
- }
- }
- else if (key & KEY_RIGHT)
- {
- current=(current+1)%NO_TAPES;
- }
- else if (key & KEY_A)
- {
- int f;
-
- done=TRUE;
- ZX81SetTape(tapes[current].tape,*tapes[current].tape_len);
-
- for(f=0;tapes[current].keys[f]!=NUM_SOFT_KEYS;f+=2)
- {
- SK_DefinePad(tapes[current].keys[f],
- tapes[current].keys[f+1]);
- }
- }
- else if (key & KEY_B)
- {
- done=TRUE;
- }
- }
-}
-
diff --git a/arm9/source/z80.c b/arm9/source/z80.c
deleted file mode 100644
index 36c5793..0000000
--- a/arm9/source/z80.c
+++ /dev/null
@@ -1,331 +0,0 @@
-/*
-
- z80 - Z80 Emulator
-
- Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
-
- 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
-
- -------------------------------------------------------------------------
-
- $Id$
-
- Z80
-
-*/
-#include <stdlib.h>
-#include <string.h>
-
-#include "z80.h"
-#include "z80_private.h"
-
-static const char ident[]="$Id$";
-static const char ident_z80_header[]=Z80_H;
-static const char ident_z80_private_header[]=Z80_PRIVATE_H;
-
-Z80Label *z80_labels=NULL;
-
-/* ---------------------------------------- PRIVATE FUNCTIONS
-*/
-static void InitTables()
-{
- static int init=FALSE;
-
- if (init)
- return;
-
- init=TRUE;
-
- Z80_InitialiseInternals();
-}
-
-static void Z80_CheckInterrupt(Z80 *cpu)
-{
- /* Check interrupts
- */
- if (PRIV->raise)
- {
- if (PRIV->nmi)
- {
- if (PRIV->halt)
- {
- PRIV->halt=FALSE;
- CALLBACK(eZ80_Halt,0);
- cpu->PC++;
- }
-
- TSTATE(2);
- cpu->IFF1=0;
- PRIV->nmi=FALSE;
- PUSH(cpu->PC);
- cpu->PC=0x66;
- }
- else if (cpu->IFF1)
- {
- if (PRIV->halt)
- {
- PRIV->halt=FALSE;
- CALLBACK(eZ80_Halt,0);
- cpu->PC++;
- }
-
- TSTATE(2);
-
- cpu->IFF1=0;
- cpu->IFF2=0;
-
- switch(cpu->IM)
- {
- default:
- case 0:
- INC_R;
- Z80_Decode(cpu,PRIV->devbyte);
- return;
- break;
-
- case 1:
- PUSH(cpu->PC);
- cpu->PC=0x38;
- break;
-
- case 2:
- PUSH(cpu->PC);
- cpu->PC=(Z80Word)cpu->I*256+PRIV->devbyte;
- break;
- }
- }
-
- PRIV->raise=FALSE;
- }
-}
-
-
-/* ---------------------------------------- INTERFACES
-*/
-
-#ifdef ENABLE_ARRAY_MEMORY
-Z80 *Z80Init(Z80ReadPort read_port,
- Z80WritePort write_port)
-#else
-Z80 *Z80Init(Z80ReadMemory read_memory,
- Z80WriteMemory write_memory,
- Z80ReadPort read_port,
- Z80WritePort write_port,
- Z80ReadMemory read_for_disassem)
-#endif
-{
- Z80 *cpu;
- int f;
- int r;
-
- InitTables();
-
-#ifndef ENABLE_ARRAY_MEMORY
- if (!read_memory || !write_memory)
- return NULL;
-#endif
-
- cpu=malloc(sizeof *cpu);
-
- if (cpu)
- {
- cpu->priv=malloc(sizeof *cpu->priv);
-
- if (cpu->priv)
- {
-#ifndef ENABLE_ARRAY_MEMORY
- PRIV->mread=read_memory;
- PRIV->mwrite=write_memory;
- PRIV->disread=read_for_disassem;
-#endif
- PRIV->pread=read_port;
- PRIV->pwrite=write_port;
-
- for(f=0;f<eZ80_NO_CALLBACK;f++)
- for(r=0;r<MAX_PER_CALLBACK;r++)
- PRIV->callback[f][r]=NULL;
-
- Z80Reset(cpu);
- }
- else
- {
- free(cpu);
- cpu=NULL;
- }
- }
-
- return cpu;
-}
-
-
-void Z80Reset(Z80 *cpu)
-{
- PRIV->cycle=0;
- cpu->PC=0;
-
- cpu->AF.w=0xffff;
- cpu->BC.w=0xffff;
- cpu->DE.w=0xffff;
- cpu->HL.w=0xffff;
- cpu->AF_=0xffff;
- cpu->BC_=0xffff;
- cpu->DE_=0xffff;
- cpu->HL_=0xffff;
-
- cpu->IX.w=0xffff;
- cpu->IY.w=0xffff;
-
- cpu->SP=0xffff;
- cpu->IFF1=0;
- cpu->IFF2=0;
- cpu->IM=0;
- cpu->I=0;
- cpu->R=0;
- PRIV->halt=0;
-
- PRIV->raise=FALSE;
- PRIV->nmi=FALSE;
-}
-
-
-Z80Val Z80Cycles(Z80 *cpu)
-{
- return PRIV->cycle;
-}
-
-
-void Z80ResetCycles(Z80 *cpu, Z80Val cycles)
-{
- PRIV->cycle=cycles;
-}
-
-
-int Z80LodgeCallback(Z80 *cpu, Z80CallbackReason reason, Z80Callback callback)
-{
- int f;
-
- for(f=0;f<MAX_PER_CALLBACK;f++)
- {
- if (!PRIV->callback[reason][f])
- {
- PRIV->callback[reason][f]=callback;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
-void Z80RemoveCallback(Z80 *cpu, Z80CallbackReason reason, Z80Callback callback)
-{
- int f;
-
- for(f=0;f<MAX_PER_CALLBACK;f++)
- {
- if (PRIV->callback[reason][f]==callback)
- {
- PRIV->callback[reason][f]=NULL;
- }
- }
-}
-
-
-void Z80Interrupt(Z80 *cpu, Z80Byte devbyte)
-{
- PRIV->raise=TRUE;
- PRIV->devbyte=devbyte;
- PRIV->nmi=FALSE;
-}
-
-
-void Z80NMI(Z80 *cpu)
-{
- PRIV->raise=TRUE;
- PRIV->nmi=TRUE;
-}
-
-
-int Z80SingleStep(Z80 *cpu)
-{
- Z80Byte opcode;
-
- PRIV->last_cb=TRUE;
- PRIV->shift=0;
-
- Z80_CheckInterrupt(cpu);
-
- CALLBACK(eZ80_Instruction,PRIV->cycle);
-
- INC_R;
-
- opcode=FETCH_BYTE;
-
- Z80_Decode(cpu,opcode);
-
- return PRIV->last_cb;
-}
-
-
-void Z80Exec(Z80 *cpu)
-{
- while (Z80SingleStep(cpu));
-}
-
-
-void Z80SetLabels(Z80Label labels[])
-{
- z80_labels=labels;
-}
-
-
-const char *Z80Disassemble(Z80 *cpu, Z80Word *pc)
-{
-#ifdef ENABLE_DISASSEM
- Z80Byte Z80_Dis_FetchByte(Z80 *cpu, Z80Word *pc);
- static char s[80];
- Z80Word opc,npc;
- Z80Byte op;
- int f;
-
- opc=*pc;
- op=Z80_Dis_FetchByte(cpu,pc);
- dis_opcode_z80[op](cpu,op,pc);
- npc=*pc;
-
- strcpy(s,Z80_Dis_Printf("%-5s",Z80_Dis_GetOp()));
- strcat(s,Z80_Dis_Printf("%-40s ;",Z80_Dis_GetArg()));
-
- for(f=0;f<5 && opc!=npc;f++)
- {
-#ifdef ENABLE_ARRAY_MEMORY
- strcat(s,Z80_Dis_Printf(" %.2x",(int)Z80_MEMORY[opc++]));
-#else
- strcat(s,Z80_Dis_Printf(" %.2x",(int)PRIV->disread(cpu,opc++)));
-#endif
- }
-
- if (opc!=npc)
- for(f=1;f<3;f++)
- s[strlen(s)-f]='.';
-
- return s;
-#else
- (*pc)+=4;
- return "NO DISASSEMBLER";
-#endif
-}
-
-/* END OF FILE */
diff --git a/arm9/source/z80_decode.c b/arm9/source/z80_decode.c
deleted file mode 100644
index a8f66ca..0000000
--- a/arm9/source/z80_decode.c
+++ /dev/null
@@ -1,2533 +0,0 @@
-/*
-
- z80 - Z80 Emulator
-
- Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
-
- 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
-
- -------------------------------------------------------------------------
-
- $Id$
-
-*/
-#include <stdlib.h>
-#include <limits.h>
-
-#include "z80.h"
-#include "z80_private.h"
-
-static const char ident[]="$Id$";
-
-/* ---------------------------------------- TABLES AND INIT
-*/
-static Z80Byte PSZtable[512];
-static Z80Byte SZtable[512];
-static Z80Byte Ptable[512];
-static Z80Byte Stable[512];
-static Z80Byte Ztable[512];
-
-
-int Z80_HI_WORD;
-int Z80_LO_WORD;
-
-#define HI Z80_HI_WORD
-#define LO Z80_LO_WORD
-
-/* ---------------------------------------- MISC FUNCTIONS
-*/
-void Z80_InitialiseInternals(void)
-{
- Z80Word f;
- Z80Reg r;
-
- /* Check endianness
- */
- r.w=0x1234;
-
- if (r.b[0] == 0x12)
- {
- HI=0;
- LO=1;
- }
- else if (r.b[1] == 0x12)
- {
- HI=1;
- LO=0;
- }
- else
- {
- exit(1);
- }
-
- /* Check variable sizes
- */
- if (CHAR_BIT!=8 || sizeof(Z80Word)!=2)
- {
- exit(2);
- }
-
- /* Initialise flag tables
- */
- for(f=0;f<256;f++)
- {
- Z80Byte p,z,s;
- int b;
-
- p=0;
-
- for(b=0;b<8;b++)
- if (f&(1<<b))
- p++;
-
- if (p&1)
- p=0;
- else
- p=P_Z80;
-
- if (f)
- z=0;
- else
- z=Z_Z80;
-
- if (f&0x80)
- s=S_Z80;
- else
- s=0;
-
- Ptable[f]=p;
- Stable[f]=s;
- Ztable[f]=z;
- SZtable[f]=z|s;
- PSZtable[f]=z|s|p;
-
- Ptable[f+256]=Ptable[f]|C_Z80;
- Stable[f+256]=Stable[f]|C_Z80;
- Ztable[f+256]=Ztable[f]|C_Z80;
- SZtable[f+256]=SZtable[f]|C_Z80;
- PSZtable[f+256]=PSZtable[f]|C_Z80;
- }
-}
-
-#ifndef ENABLE_ARRAY_MEMORY
-static Z80Word FPEEKW(Z80 *cpu, Z80Word addr)
-{
- return (PEEK(addr) | (Z80Word)PEEK(addr+1)<<8);
-}
-
-
-static void FPOKEW(Z80 *cpu, Z80Word addr, Z80Word val)
-{
- PRIV->mwrite(cpu,addr,val);
- PRIV->mwrite(cpu,addr+1,val>>8);
-}
-#endif
-
-
-/* ---------------------------------------- GENERAL MACROS
-*/
-#define SWAP(A,B) \
-do { \
- unsigned swap_tmp; \
- swap_tmp=A; \
- A=B; \
- B=swap_tmp; \
-} while(0)
-
-
-/* ---------------------------------------- ARITHMETIC OPS
-*/
-#define ADD8(ONCE) \
-do { \
- Z80Byte VAL=ONCE; \
- unsigned w; \
- w=cpu->AF.b[HI]+(unsigned)VAL; \
- cpu->AF.b[LO]=SZtable[w]; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI]^0x80)&(VAL^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
- SETHIDDEN(w); \
- cpu->AF.b[HI]=w; \
-} while(0)
-
-
-#define ADC8(ONCE) \
-do { \
- Z80Byte VAL=ONCE; \
- unsigned w; \
- w=(cpu->AF.b[HI]+(unsigned)VAL+CARRY)&0x1ff; \
- cpu->AF.b[LO]=SZtable[w]; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI]^0x80)&(VAL^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
- SETHIDDEN(w); \
- cpu->AF.b[HI]=w; \
-} while(0)
-
-
-#define SUB8(ONCE) \
-do { \
- Z80Byte VAL=ONCE; \
- unsigned w; \
- w=(cpu->AF.b[HI]-(unsigned)VAL)&0x1ff; \
- cpu->AF.b[LO]=SZtable[w]|N_Z80; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI])&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
- SETHIDDEN(w); \
- cpu->AF.b[HI]=w; \
-} while(0)
-
-
-#define CMP8(ONCE) \
-do { \
- Z80Byte VAL=ONCE; \
- unsigned w; \
- w=(cpu->AF.b[HI]-(unsigned)VAL)&0x1ff; \
- cpu->AF.b[LO]=SZtable[w]|N_Z80; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI])&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
- SETHIDDEN(VAL); \
-} while(0)
-
-
-#define SBC8(ONCE) \
-do { \
- Z80Byte VAL=ONCE; \
- unsigned w; \
- w=(cpu->AF.b[HI]-(unsigned)VAL-CARRY)&0x1ff; \
- cpu->AF.b[LO]=SZtable[w]|N_Z80; \
- if ((cpu->AF.b[HI]^w^VAL)&H_Z80) cpu->AF.b[LO]|=H_Z80; \
- if ((VAL^cpu->AF.b[HI])&(cpu->AF.b[HI]^w)&0x80) cpu->AF.b[LO]|=P_Z80; \
- SETHIDDEN(w); \
- cpu->AF.b[HI]=w; \
-} while(0)
-
-
-#define ADD16(REG,ONCE) \
-do { \
- Z80Word VAL=ONCE; \
- Z80Val w; \
- w=(REG)+(Z80Val)VAL; \
- cpu->AF.b[LO]&=(S_Z80|Z_Z80|V_Z80); \
- if (w>0xffff) cpu->AF.b[LO]|=C_Z80; \
- if (((REG)^w^VAL)&0x1000) cpu->AF.b[LO]|=H_Z80; \
- SETHIDDEN(w>>8); \
- (REG)=w; \
-} while(0)
-
-
-#define ADC16(REG, ONCE) \
-do { \
- Z80Word VAL=ONCE; \
- Z80Val w; \
- w=(REG)+(Z80Val)VAL+CARRY; \
- cpu->AF.b[LO]=0; \
- if ((w&0xffff)==0) cpu->AF.b[LO]=Z_Z80; \
- if (w&0x8000) cpu->AF.b[LO]|=S_Z80; \
- if (w>0xffff) cpu->AF.b[LO]|=C_Z80; \
- if ((VAL^(REG)^0x8000)&((REG)^w)&0x8000) cpu->AF.b[LO]|=P_Z80; \
- if (((REG)^w^VAL)&0x1000) cpu->AF.b[LO]|=H_Z80; \
- SETHIDDEN(w>>8); \
- (REG)=w; \
-} while(0)
-
-
-#define SBC16(REG, ONCE) \
-do { \
- Z80Word VAL=ONCE; \
- Z80Val w; \
- w=(REG)-(Z80Val)VAL-CARRY; \
- cpu->AF.b[LO]=N_Z80; \
- if (w&0x8000) cpu->AF.b[LO]|=S_Z80; \
- if ((w&0xffff)==0) cpu->AF.b[LO]|=Z_Z80; \
- if (w>0xffff) cpu->AF.b[LO]|=C_Z80; \
- if ((VAL^(REG))&((REG)^w)&0x8000) cpu->AF.b[LO]|=P_Z80; \
- if (((REG)^w^VAL)&0x1000) cpu->AF.b[LO]|=H_Z80; \
- SETHIDDEN(w>>8); \
- (REG)=w; \
-} while(0)
-
-
-#define INC8(REG) \
-do { \
- (REG)++; \
- cpu->AF.b[LO]=CARRY|SZtable[(REG)]; \
- if ((REG)==0x80) cpu->AF.b[LO]|=P_Z80; \
- if (((REG)&0x0f)==0) cpu->AF.b[LO]|=H_Z80; \
-} while(0)
-
-
-#define DEC8(REG) \
-do { \
- (REG)--; \
- cpu->AF.b[LO]=N_Z80|CARRY; \
- if ((REG)==0x7f) cpu->AF.b[LO]|=P_Z80; \
- if (((REG)&0x0f)==0x0f) cpu->AF.b[LO]|=H_Z80; \
- cpu->AF.b[LO]|=SZtable[(REG)]; \
-} while(0)
-
-
-#define OP_ON_MEM(OP,addr) \
-do { \
- Z80Byte memop=PEEK(addr); \
- OP(memop); \
- POKE(addr,memop); \
-} while(0)
-
-
-#define OP_ON_MEM_WITH_ARG(OP,addr,arg) \
-do { \
- Z80Byte memop=PEEK(addr); \
- OP(memop,arg); \
- POKE(addr,memop); \
-} while(0)
-
-
-#define OP_ON_MEM_WITH_COPY(OP,addr,copy) \
-do { \
- Z80Byte memop=PEEK(addr); \
- OP(memop); \
- copy=memop; \
- POKE(addr,memop); \
-} while(0)
-
-
-#define OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,arg,copy) \
-do { \
- Z80Byte memop=PEEK(addr); \
- OP(memop,arg); \
- copy=memop; \
- POKE(addr,memop); \
-} while(0)
-
-
-/* ---------------------------------------- ROTATE AND SHIFT OPS
-*/
-#define RRCA \
-do { \
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b[HI]&C_Z80); \
- cpu->AF.b[HI]=(cpu->AF.b[HI]>>1)|(cpu->AF.b[HI]<<7); \
- SETHIDDEN(cpu->AF.b[HI]); \
-} while(0)
-
-
-#define RRA \
-do { \
- Z80Byte c; \
- c=CARRY; \
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b[HI]&C_Z80); \
- cpu->AF.b[HI]=(cpu->AF.b[HI]>>1)|(c<<7); \
- SETHIDDEN(cpu->AF.b[HI]); \
-} while(0)
-
-
-#define RRC(REG) \
-do { \
- Z80Byte c; \
- c=(REG)&C_Z80; \
- (REG)=((REG)>>1)|((REG)<<7); \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
- SETHIDDEN(REG); \
-} while(0)
-
-
-#define RR(REG) \
-do { \
- Z80Byte c; \
- c=(REG)&C_Z80; \
- (REG)=((REG)>>1)|(CARRY<<7); \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
- SETHIDDEN(REG); \
-} while(0)
-
-
-#define RLCA \
-do { \
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b[HI]>>7); \
- cpu->AF.b[HI]=(cpu->AF.b[HI]<<1)|(cpu->AF.b[HI]>>7); \
- SETHIDDEN(cpu->AF.b[HI]); \
-} while(0)
-
-
-#define RLA \
-do { \
- Z80Byte c; \
- c=CARRY; \
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))|(cpu->AF.b[HI]>>7); \
- cpu->AF.b[HI]=(cpu->AF.b[HI]<<1)|c; \
- SETHIDDEN(cpu->AF.b[HI]); \
-} while(0)
-
-
-#define RLC(REG) \
-do { \
- Z80Byte c; \
- c=(REG)>>7; \
- (REG)=((REG)<<1)|c; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
- SETHIDDEN(REG); \
-} while(0)
-
-
-#define RL(REG) \
-do { \
- Z80Byte c; \
- c=(REG)>>7; \
- (REG)=((REG)<<1)|CARRY; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
- SETHIDDEN(REG); \
-} while(0)
-
-
-#define SRL(REG) \
-do { \
- Z80Byte c; \
- c=(REG)&C_Z80; \
- (REG)>>=1; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
- SETHIDDEN(REG); \
-} while(0)
-
-
-#define SRA(REG) \
-do { \
- Z80Byte c; \
- c=(REG)&C_Z80; \
- (REG)=((REG)>>1)|((REG)&0x80); \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
- SETHIDDEN(REG); \
-} while(0)
-
-
-#define SLL(REG) \
-do { \
- Z80Byte c; \
- c=(REG)>>7; \
- (REG)=((REG)<<1)|1; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
- SETHIDDEN(REG); \
-} while(0)
-
-
-#define SLA(REG) \
-do { \
- Z80Byte c; \
- c=(REG)>>7; \
- (REG)=(REG)<<1; \
- cpu->AF.b[LO]=PSZtable[(REG)]|c; \
- SETHIDDEN(REG); \
-} while(0)
-
-
-/* ---------------------------------------- BOOLEAN OPS
-*/
-#define AND(VAL) \
-do { \
- cpu->AF.b[HI]&=VAL; \
- cpu->AF.b[LO]=PSZtable[cpu->AF.b[HI]]|H_Z80; \
- SETHIDDEN(cpu->AF.b[HI]); \
-} while(0)
-
-
-#define OR(VAL) \
-do { \
- cpu->AF.b[HI]|=VAL; \
- cpu->AF.b[LO]=PSZtable[cpu->AF.b[HI]]; \
- SETHIDDEN(cpu->AF.b[HI]); \
-} while(0)
-
-
-#define XOR(VAL) \
-do { \
- cpu->AF.b[HI]^=VAL; \
- cpu->AF.b[LO]=PSZtable[cpu->AF.b[HI]]; \
- SETHIDDEN(cpu->AF.b[HI]); \
-} while(0)
-
-
-#define BIT(REG,B) \
-do { \
- cpu->AF.b[LO]=CARRY|H_Z80; \
- if ((REG)&(1<<B)) \
- { \
- if (B==7 && (REG&S_Z80)) cpu->AF.b[LO]|=S_Z80; \
- if (B==5 && (REG&B5_Z80)) cpu->AF.b[LO]|=B5_Z80; \
- if (B==3 && (REG&B3_Z80)) cpu->AF.b[LO]|=B3_Z80; \
- } \
- else \
- { \
- cpu->AF.b[LO]|=Z_Z80; \
- cpu->AF.b[LO]|=P_Z80; \
- } \
-} while(0)
-
-#define BIT_SET(REG,B) (REG)|=(1<<B)
-#define BIT_RES(REG,B) (REG)&=~(1<<B)
-
-
-/* ---------------------------------------- JUMP OPERATIONS
-*/
-#define JR_COND(COND) \
-do { \
- if (COND) \
- { \
- TSTATE(12); \
- JR; \
- } \
- else \
- { \
- TSTATE(7); \
- NOJR; \
- } \
-} while(0)
-
-
-#define JP_COND(COND) \
-do { \
- TSTATE(10); \
- if (COND) \
- { \
- JP; \
- } \
- else \
- { \
- NOJP; \
- } \
-} while(0)
-
-
-#define CALL_COND(COND) \
-do { \
- if (COND) \
- { \
- TSTATE(17); \
- CALL; \
- } \
- else \
- { \
- TSTATE(10); \
- NOCALL; \
- } \
-} while(0)
-
-
-#define RET_COND(COND) \
-do { \
- if (COND) \
- { \
- TSTATE(11); \
- POP(cpu->PC); \
- } \
- else \
- { \
- TSTATE(5); \
- } \
-} while(0)
-
-
-#define RST(ADDR) \
- TSTATE(11); \
- PUSH(cpu->PC); \
- cpu->PC=ADDR
-
-/* ---------------------------------------- BLOCK OPERATIONS
-*/
-#define LDI \
-do { \
- Z80Byte b; \
- \
- b=PEEK(cpu->HL.w); \
- POKE(cpu->DE.w,b); \
- cpu->DE.w++; \
- cpu->HL.w++; \
- cpu->BC.w--; \
- \
- CLRFLAG(H_Z80); \
- CLRFLAG(N_Z80); \
- \
- if (cpu->BC.w) \
- SETFLAG(P_Z80); \
- else \
- CLRFLAG(P_Z80); \
- \
- SETHIDDEN(cpu->AF.b[HI]+b); \
-} while(0)
-
-#define LDD \
-do { \
- Z80Byte b; \
- \
- b=PEEK(cpu->HL.w); \
- POKE(cpu->DE.w,b); \
- cpu->DE.w--; \
- cpu->HL.w--; \
- cpu->BC.w--; \
- \
- CLRFLAG(H_Z80); \
- CLRFLAG(N_Z80); \
- \
- if (cpu->BC.w) \
- SETFLAG(P_Z80); \
- else \
- CLRFLAG(P_Z80); \
- \
- SETHIDDEN(cpu->AF.b[HI]+b); \
-} while(0)
-
-#define CPI \
-do { \
- Z80Byte c,b; \
- \
- c=CARRY; \
- b=PEEK(cpu->HL.w); \
- \
- CMP8(b); \
- \
- if (c) \
- SETFLAG(C_Z80); \
- else \
- CLRFLAG(C_Z80); \
- \
- cpu->HL.w++; \
- cpu->BC.w--; \
- \
- if (cpu->BC.w) \
- SETFLAG(P_Z80); \
- else \
- CLRFLAG(P_Z80); \
-} while(0)
-
-#define CPD \
-do { \
- Z80Byte c,b; \
- \
- c=CARRY; \
- b=PEEK(cpu->HL.w); \
- \
- CMP8(b); \
- \
- if (c) \
- SETFLAG(C_Z80); \
- else \
- CLRFLAG(C_Z80); \
- \
- cpu->HL.w--; \
- cpu->BC.w--; \
- \
- if (cpu->BC.w) \
- SETFLAG(P_Z80); \
- else \
- CLRFLAG(P_Z80); \
-} while(0)
-
-#define INI \
-do { \
- Z80Word w; \
- Z80Byte b; \
- \
- b=IN(cpu->BC.w); \
- POKE(cpu->HL.w,b); \
- \
- cpu->BC.b[HI]--; \
- cpu->HL.w++; \
- \
- cpu->AF.b[LO]=SZtable[cpu->BC.b[HI]]; \
- SETHIDDEN(cpu->BC.b[HI]); \
- \
- w=(((Z80Word)cpu->BC.b[LO])&0xff)+b; \
- \
- if (b&0x80) \
- SETFLAG(N_Z80); \
- \
- if (w&0x100) \
- { \
- SETFLAG(C_Z80); \
- SETFLAG(H_Z80); \
- } \
- else \
- { \
- CLRFLAG(C_Z80); \
- CLRFLAG(H_Z80); \
- } \
-} while(0)
-
-#define IND \
-do { \
- Z80Word w; \
- Z80Byte b; \
- \
- b=IN(cpu->BC.w); \
- POKE(cpu->HL.w,b); \
- \
- cpu->BC.b[HI]--; \
- cpu->HL.w--; \
- \
- cpu->AF.b[LO]=SZtable[cpu->BC.b[HI]]; \
- SETHIDDEN(cpu->BC.b[HI]); \
- \
- w=(((Z80Word)cpu->BC.b[LO])&0xff)+b; \
- \
- if (b&0x80) \
- SETFLAG(N_Z80); \
- \
- if (w&0x100) \
- { \
- SETFLAG(C_Z80); \
- SETFLAG(H_Z80); \
- } \
- else \
- { \
- CLRFLAG(C_Z80); \
- CLRFLAG(H_Z80); \
- } \
-} while(0) \
-
-#define OUTI \
-do { \
- OUT(cpu->BC.w,PEEK(cpu->HL.w)); \
- \
- cpu->HL.w++; \
- cpu->BC.b[HI]--; \
- \
- cpu->AF.b[LO]=SZtable[cpu->BC.b[HI]]; \
- SETHIDDEN(cpu->BC.b[HI]); \
-} while(0)
-
-#define OUTD \
-do { \
- OUT(cpu->BC.w,PEEK(cpu->HL.w)); \
- \
- cpu->HL.w--; \
- cpu->BC.b[HI]--; \
- \
- cpu->AF.b[LO]=SZtable[cpu->BC.b[HI]]; \
- SETFLAG(N_Z80); \
- SETHIDDEN(cpu->BC.b[HI]); \
-} while(0)
-
-
-/* ---------------------------------------- BASE OPCODE SHORT-HAND BLOCKS
-*/
-
-#define LD_BLOCK(BASE,DEST,DEST2) \
- case BASE: /* LD DEST,B */ \
- TSTATE(4); \
- DEST=cpu->BC.b[HI]; \
- break; \
- \
- case BASE+1: /* LD DEST,C */ \
- TSTATE(4); \
- DEST=cpu->BC.b[LO]; \
- break; \
- \
- case BASE+2: /* LD DEST,D */ \
- TSTATE(4); \
- DEST=cpu->DE.b[HI]; \
- break; \
- \
- case BASE+3: /* LD DEST,E */ \
- TSTATE(4); \
- DEST=cpu->DE.b[LO]; \
- break; \
- \
- case BASE+4: /* LD DEST,H */ \
- TSTATE(4); \
- DEST=*H; \
- break; \
- \
- case BASE+5: /* LD DEST,L */ \
- TSTATE(4); \
- DEST=*L; \
- break; \
- \
- case BASE+6: /* LD DEST,(HL) */ \
- TSTATE(7); \
- OFFSET(off); \
- DEST2=PEEK(*HL+off); \
- break; \
- \
- case BASE+7: /* LD DEST,A */ \
- TSTATE(4); \
- DEST=cpu->AF.b[HI]; \
- break;
-
-#define ALU_BLOCK(BASE,OP) \
- case BASE: /* OP A,B */ \
- TSTATE(4); \
- OP(cpu->BC.b[HI]); \
- break; \
- \
- case BASE+1: /* OP A,C */ \
- TSTATE(4); \
- OP(cpu->BC.b[LO]); \
- break; \
- \
- case BASE+2: /* OP A,D */ \
- TSTATE(4); \
- OP(cpu->DE.b[HI]); \
- break; \
- \
- case BASE+3: /* OP A,E */ \
- TSTATE(4); \
- OP(cpu->DE.b[LO]); \
- break; \
- \
- case BASE+4: /* OP A,H */ \
- TSTATE(4); \
- OP(*H); \
- break; \
- \
- case BASE+5: /* OP A,L */ \
- TSTATE(4); \
- OP(*L); \
- break; \
- \
- case BASE+6: /* OP A,(HL) */ \
- TSTATE(7); \
- OFFSET(off); \
- OP_ON_MEM(OP,*HL+off); \
- break; \
- \
- case BASE+7: /* OP A,A */ \
- TSTATE(4); \
- OP(cpu->AF.b[HI]); \
- break;
-
-
-/* ---------------------------------------- CB OPCODE SHORT-HAND BLOCKS
-*/
-
-#define CB_ALU_BLOCK(BASE,OP) \
- case BASE: /* OP B */ \
- TSTATE(8); \
- OP(cpu->BC.b[HI]); \
- break; \
- \
- case BASE+1: /* OP C */ \
- TSTATE(8); \
- OP(cpu->BC.b[LO]); \
- break; \
- \
- case BASE+2: /* OP D */ \
- TSTATE(8); \
- OP(cpu->DE.b[HI]); \
- break; \
- \
- case BASE+3: /* OP E */ \
- TSTATE(8); \
- OP(cpu->DE.b[LO]); \
- break; \
- \
- case BASE+4: /* OP H */ \
- TSTATE(8); \
- OP(cpu->HL.b[HI]); \
- break; \
- \
- case BASE+5: /* OP L */ \
- TSTATE(8); \
- OP(cpu->HL.b[LO]); \
- break; \
- \
- case BASE+6: /* OP (HL) */ \
- TSTATE(15); \
- OP_ON_MEM(OP,cpu->HL.w); \
- break; \
- \
- case BASE+7: /* OP A */ \
- TSTATE(8); \
- OP(cpu->AF.b[HI]); \
- break;
-
-#define CB_BITMANIP_BLOCK(BASE,OP,BIT_NO) \
- case BASE: /* OP B */ \
- TSTATE(8); \
- OP(cpu->BC.b[HI],BIT_NO); \
- break; \
- \
- case BASE+1: /* OP C */ \
- TSTATE(8); \
- OP(cpu->BC.b[LO],BIT_NO); \
- break; \
- \
- case BASE+2: /* OP D */ \
- TSTATE(8); \
- OP(cpu->DE.b[HI],BIT_NO); \
- break; \
- \
- case BASE+3: /* OP E */ \
- TSTATE(8); \
- OP(cpu->DE.b[LO],BIT_NO); \
- break; \
- \
- case BASE+4: /* OP H */ \
- TSTATE(8); \
- OP(cpu->HL.b[HI],BIT_NO); \
- break; \
- \
- case BASE+5: /* OP L */ \
- TSTATE(8); \
- OP(cpu->HL.b[LO],BIT_NO); \
- break; \
- \
- case BASE+6: /* OP (HL) */ \
- TSTATE(12); \
- OP_ON_MEM_WITH_ARG(OP,cpu->HL.w,BIT_NO); \
- break; \
- \
- case BASE+7: /* OP A */ \
- TSTATE(8); \
- OP(cpu->AF.b[HI],BIT_NO); \
- break;
-
-/* ---------------------------------------- SHIFTED CB OPCODE SHORT-HAND BLOCKS
-*/
-
-#define SHIFTED_CB_ALU_BLOCK(BASE,OP) \
- case BASE: /* OP B */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->BC.b[HI]); \
- break; \
- \
- case BASE+1: /* OP C */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->BC.b[LO]); \
- break; \
- \
- case BASE+2: /* OP D */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->DE.b[HI]); \
- break; \
- \
- case BASE+3: /* OP E */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->DE.b[LO]); \
- break; \
- \
- case BASE+4: /* OP H */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->HL.b[HI]); \
- break; \
- \
- case BASE+5: /* OP L */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->HL.b[LO]); \
- break; \
- \
- case BASE+6: /* OP (HL) */ \
- TSTATE(15); \
- OP_ON_MEM(OP,addr); \
- break; \
- \
- case BASE+7: /* OP A */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_COPY(OP,addr,cpu->AF.b[HI]); \
- break;
-
-#define SHIFTED_CB_BITMANIP_BLOCK(BASE,OP,BIT_NO) \
- case BASE: /* OP B */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->BC.b[HI]); \
- break; \
- \
- case BASE+1: /* OP C */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->BC.b[LO]); \
- break; \
- \
- case BASE+2: /* OP D */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->DE.b[HI]); \
- break; \
- \
- case BASE+3: /* OP E */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->DE.b[LO]); \
- break; \
- \
- case BASE+4: /* OP H */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->HL.b[HI]); \
- break; \
- \
- case BASE+5: /* OP L */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->HL.b[LO]); \
- break; \
- \
- case BASE+6: /* OP (HL) */ \
- TSTATE(12); \
- OP_ON_MEM_WITH_ARG(OP,addr,BIT_NO); \
- break; \
- \
- case BASE+7: /* OP A */ \
- TSTATE(8); \
- OP_ON_MEM_WITH_ARG_AND_COPY(OP,addr,BIT_NO,cpu->AF.b[HI]); \
- break;
-
-/* ---------------------------------------- DAA
-*/
-
-/* This alogrithm is based on info from
- http://www.worldofspectrum.org/faq/reference/z80reference.htm
-*/
-static void DAA (Z80 *cpu)
-{
- Z80Byte add=0;
- Z80Byte carry=0;
- Z80Byte nf=cpu->AF.b[LO]&N_Z80;
- Z80Byte acc=cpu->AF.b[HI];
-
- if (acc>0x99 || IS_C)
- {
- add|=0x60;
- carry=C_Z80;
- }
-
- if ((acc&0xf)>0x9 || IS_H)
- {
- add|=0x06;
- }
-
- if (nf)
- {
- cpu->AF.b[HI]-=add;
- }
- else
- {
- cpu->AF.b[HI]+=add;
- }
-
- cpu->AF.b[LO]=PSZtable[cpu->AF.b[HI]]
- | carry
- | nf
- | ((acc^cpu->AF.b[HI])&H_Z80)
- | (cpu->AF.b[HI]&(B3_Z80|B5_Z80));
-}
-
-/* ---------------------------------------- HANDLERS FOR ED OPCODES
-*/
-static void DecodeED(Z80 *cpu, Z80Byte opcode)
-{
- switch(opcode)
- {
- case 0x40: /* IN B,(C) */
- TSTATE(12);
-
- if (PRIV->pread)
- {
- cpu->BC.b[HI]=PRIV->pread(cpu,cpu->BC.w);
- }
- else
- {
- cpu->BC.b[HI]=0;
- }
-
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->BC.b[HI]];
- SETHIDDEN(cpu->BC.b[HI]);
- break;
-
- case 0x41: /* OUT (C),B */
- TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->BC.b[HI]);
- break;
-
- case 0x42: /* SBC HL,BC */
- TSTATE(15);
- SBC16(cpu->HL.w,cpu->BC.w);
- break;
-
- case 0x43: /* LD (nnnn),BC */
- TSTATE(20);
- POKEW(FETCH_WORD,cpu->BC.w);
- break;
-
- case 0x44: /* NEG */
- {
- Z80Byte b;
-
- TSTATE(8);
-
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
- SUB8(b);
- break;
- }
-
- case 0x45: /* RETN */
- TSTATE(14);
- cpu->IFF1=cpu->IFF2;
- POP(cpu->PC);
- break;
-
- case 0x46: /* IM 0 */
- TSTATE(8);
- cpu->IM=0;
- break;
-
- case 0x47: /* LD I,A */
- TSTATE(9);
- cpu->I=cpu->AF.b[HI];
- break;
-
- case 0x48: /* IN C,(C) */
- TSTATE(12);
-
- if (PRIV->pread)
- {
- cpu->BC.b[LO]=PRIV->pread(cpu,cpu->BC.w);
- }
- else
- {
- cpu->BC.b[LO]=0;
- }
-
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->BC.b[LO]];
- SETHIDDEN(cpu->BC.b[LO]);
- break;
-
- case 0x49: /* OUT (C),C */
- TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->BC.b[LO]);
- break;
-
- case 0x4a: /* ADC HL,BC */
- TSTATE(15);
- ADC16(cpu->HL.w,cpu->BC.w);
- break;
-
- case 0x4b: /* LD BC,(nnnn) */
- TSTATE(20);
- cpu->BC.w=PEEKW(FETCH_WORD);
- break;
-
- case 0x4c: /* NEG */
- {
- Z80Byte b;
-
- TSTATE(8);
-
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
- SUB8(b);
- break;
- }
-
- case 0x4d: /* RETI */
- TSTATE(14);
- CALLBACK(eZ80_RETI,0);
- cpu->IFF1=cpu->IFF2;
- POP(cpu->PC);
- break;
-
- case 0x4e: /* IM 0/1 */
- TSTATE(8);
- cpu->IM=0;
- break;
-
- case 0x4f: /* LD R,A */
- TSTATE(9);
- cpu->R=cpu->AF.b[HI];
- break;
-
- case 0x50: /* IN D,(C) */
- TSTATE(12);
-
- if (PRIV->pread)
- {
- cpu->DE.b[HI]=PRIV->pread(cpu,cpu->BC.w);
- }
- else
- {
- cpu->DE.b[HI]=0;
- }
-
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->DE.b[HI]];
- SETHIDDEN(cpu->BC.b[HI]);
- break;
-
- case 0x51: /* OUT (C),D */
- TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->DE.b[HI]);
- break;
-
- case 0x52: /* SBC HL,DE */
- TSTATE(15);
- SBC16(cpu->HL.w,cpu->DE.w);
- break;
-
- case 0x53: /* LD (nnnn),DE */
- TSTATE(20);
- POKEW(FETCH_WORD,cpu->DE.w);
- break;
-
- case 0x54: /* NEG */
- {
- Z80Byte b;
-
- TSTATE(8);
-
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
- SUB8(b);
- break;
- }
-
- case 0x55: /* RETN */
- TSTATE(14);
- cpu->IFF1=cpu->IFF2;
- POP(cpu->PC);
- break;
-
- case 0x56: /* IM 1 */
- TSTATE(8);
- cpu->IM=1;
- break;
-
- case 0x57: /* LD A,I */
- TSTATE(9);
- cpu->AF.b[HI]=cpu->I;
- break;
-
- case 0x58: /* IN E,(C) */
- TSTATE(12);
-
- if (PRIV->pread)
- {
- cpu->DE.b[LO]=PRIV->pread(cpu,cpu->BC.w);
- }
- else
- {
- cpu->BC.b[LO]=0;
- }
-
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->DE.b[LO]];
- SETHIDDEN(cpu->DE.b[LO]);
- break;
-
- case 0x59: /* OUT (C),E */
- TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->DE.b[LO]);
- break;
-
- case 0x5a: /* ADC HL,DE */
- TSTATE(15);
- ADC16(cpu->HL.w,cpu->DE.w);
- break;
-
- case 0x5b: /* LD DE,(nnnn) */
- TSTATE(20);
- cpu->DE.w=PEEKW(FETCH_WORD);
- break;
-
- case 0x5c: /* NEG */
- {
- Z80Byte b;
-
- TSTATE(8);
-
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
- SUB8(b);
- break;
- }
-
- case 0x5d: /* RETN */
- TSTATE(14);
- cpu->IFF1=cpu->IFF2;
- POP(cpu->PC);
- break;
-
- case 0x5e: /* IM 2 */
- TSTATE(8);
- cpu->IM=2;
- break;
-
- case 0x5f: /* LD A,R */
- TSTATE(9);
- cpu->AF.b[HI]=cpu->R;
- break;
-
- case 0x60: /* IN H,(C) */
- TSTATE(12);
-
- if (PRIV->pread)
- {
- cpu->HL.b[HI]=PRIV->pread(cpu,cpu->BC.w);
- }
- else
- {
- cpu->HL.b[HI]=0;
- }
-
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->HL.b[HI]];
- SETHIDDEN(cpu->HL.b[HI]);
- break;
-
- case 0x61: /* OUT (C),H */
- TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->HL.b[HI]);
- break;
-
- case 0x62: /* SBC HL,HL */
- TSTATE(15);
- SBC16(cpu->HL.w,cpu->HL.w);
- break;
-
- case 0x63: /* LD (nnnn),HL */
- TSTATE(20);
- POKEW(FETCH_WORD,cpu->HL.w);
- break;
-
- case 0x64: /* NEG */
- {
- Z80Byte b;
-
- TSTATE(8);
-
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
- SUB8(b);
- break;
- }
-
- case 0x65: /* RETN */
- TSTATE(14);
- cpu->IFF1=cpu->IFF2;
- POP(cpu->PC);
- break;
-
- case 0x66: /* IM 0 */
- TSTATE(8);
- cpu->IM=0;
- break;
-
- case 0x67: /* RRD */
- {
- Z80Byte b;
-
- TSTATE(18);
-
- b=PEEK(cpu->HL.w);
-
- POKE(cpu->HL.w,(b>>4)|(cpu->AF.b[HI]<<4));
- cpu->AF.b[HI]=(cpu->AF.b[HI]&0xf0)|(b&0x0f);
-
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->AF.b[HI]];
- SETHIDDEN(cpu->AF.b[HI]);
- break;
- }
-
- case 0x68: /* IN L,(C) */
- TSTATE(12);
-
- if (PRIV->pread)
- {
- cpu->HL.b[LO]=PRIV->pread(cpu,cpu->BC.w);
- }
- else
- {
- cpu->HL.b[LO]=0;
- }
-
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->HL.b[LO]];
- SETHIDDEN(cpu->HL.b[LO]);
- break;
-
- case 0x69: /* OUT (C),L */
- TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->HL.b[LO]);
- break;
-
- case 0x6a: /* ADC HL,HL */
- TSTATE(15);
- ADC16(cpu->HL.w,cpu->HL.w);
- break;
-
- case 0x6b: /* LD HL,(nnnn) */
- TSTATE(20);
- cpu->HL.w=PEEKW(FETCH_WORD);
- break;
-
- case 0x6c: /* NEG */
- {
- Z80Byte b;
-
- TSTATE(8);
-
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
- SUB8(b);
- break;
- }
-
- case 0x6d: /* RETN */
- TSTATE(14);
- cpu->IFF1=cpu->IFF2;
- POP(cpu->PC);
- break;
-
- case 0x6e: /* IM 0/1 */
- TSTATE(8);
- cpu->IM=0;
- break;
-
- case 0x6f: /* RLD */
- {
- Z80Byte b;
-
- TSTATE(18);
-
- b=PEEK(cpu->HL.w);
-
- POKE(cpu->HL.w,(b<<4)|(cpu->AF.b[HI]&0x0f));
- cpu->AF.b[HI]=(cpu->AF.b[HI]&0xf0)|(b>>4);
-
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->AF.b[HI]];
- SETHIDDEN(cpu->AF.b[HI]);
- break;
- }
-
- case 0x70: /* IN (C) */
- {
- Z80Byte b;
-
- TSTATE(12);
-
- if (PRIV->pread)
- {
- b=PRIV->pread(cpu,cpu->BC.w);
- }
- else
- {
- b=0;
- }
-
- cpu->AF.b[LO]=CARRY|PSZtable[b];
- SETHIDDEN(b);
- break;
- }
-
- case 0x71: /* OUT (C) */
- TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,0);
- break;
-
- case 0x72: /* SBC HL,SP */
- TSTATE(15);
- SBC16(cpu->HL.w,cpu->SP);
- break;
-
- case 0x73: /* LD (nnnn),SP */
- TSTATE(20);
- POKEW(FETCH_WORD,cpu->SP);
- break;
-
- case 0x74: /* NEG */
- {
- Z80Byte b;
-
- TSTATE(8);
-
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
- SUB8(b);
- break;
- }
-
- case 0x75: /* RETN */
- TSTATE(14);
- cpu->IFF1=cpu->IFF2;
- POP(cpu->PC);
- break;
-
- case 0x76: /* IM 1 */
- TSTATE(8);
- cpu->IM=1;
- break;
-
- case 0x77: /* NOP */
- TSTATE(8);
- CALLBACK(eZ80_EDHook,opcode);
- break;
-
- case 0x78: /* IN A,(C) */
- TSTATE(12);
-
- if (PRIV->pread)
- {
- cpu->AF.b[HI]=PRIV->pread(cpu,cpu->BC.w);
- }
- else
- {
- cpu->AF.b[HI]=0;
- }
-
- cpu->AF.b[LO]=CARRY|PSZtable[cpu->AF.b[HI]];
- SETHIDDEN(cpu->AF.b[HI]);
- break;
-
- case 0x79: /* OUT (C),A */
- TSTATE(12);
- if (PRIV->pwrite) PRIV->pwrite(cpu,cpu->BC.w,cpu->AF.b[HI]);
- break;
-
- case 0x7a: /* ADC HL,SP */
- TSTATE(15);
- ADC16(cpu->HL.w,cpu->SP);
- break;
-
- case 0x7b: /* LD SP,(nnnn) */
- TSTATE(20);
- cpu->SP=PEEKW(FETCH_WORD);
- break;
-
- case 0x7c: /* NEG */
- {
- Z80Byte b;
-
- TSTATE(8);
-
- b=cpu->AF.b[HI];
- cpu->AF.b[HI]=0;
- SUB8(b);
- break;
- }
-
- case 0x7d: /* RETN */
- TSTATE(14);
- cpu->IFF1=cpu->IFF2;
- POP(cpu->PC);
- break;
-
- case 0x7e: /* IM 2 */
- TSTATE(8);
- cpu->IM=2;
- break;
-
- case 0x7f: /* NOP */
- TSTATE(8);
- CALLBACK(eZ80_EDHook,opcode);
- break;
-
- case 0xa0: /* LDI */
- TSTATE(16);
- LDI;
- break;
-
- case 0xa1: /* CPI */
- TSTATE(16);
- CPI;
- break;
-
- case 0xa2: /* INI */
- TSTATE(16);
- INI;
- break;
-
- case 0xa3: /* OUTI */
- TSTATE(16);
- OUTI;
- break;
-
- case 0xa8: /* LDD */
- TSTATE(16);
- LDD;
- break;
-
- case 0xa9: /* CPD */
- TSTATE(16);
- CPD;
- break;
-
- case 0xaa: /* IND */
- TSTATE(16);
- IND;
- break;
-
- case 0xab: /* OUTD */
- TSTATE(16);
- OUTD;
- break;
-
- case 0xb0: /* LDIR */
- TSTATE(16);
- LDI;
- if (cpu->BC.w)
- {
- TSTATE(5);
- cpu->PC-=2;
- }
- break;
-
- case 0xb1: /* CPIR */
- TSTATE(16);
- CPI;
- if (cpu->BC.w && !IS_Z)
- {
- TSTATE(5);
- cpu->PC-=2;
- }
- break;
-
- case 0xb2: /* INIR */
- TSTATE(16);
- INI;
- if (cpu->BC.w)
- {
- TSTATE(5);
- cpu->PC-=2;
- }
- break;
-
- case 0xb3: /* OTIR */
- TSTATE(16);
- OUTI;
- if (cpu->BC.w)
- {
- TSTATE(5);
- cpu->PC-=2;
- }
- break;
-
- case 0xb8: /* LDDR */
- TSTATE(16);
- LDD;
- if (cpu->BC.w)
- {
- TSTATE(5);
- cpu->PC-=2;
- }
- break;
-
- case 0xb9: /* CPDR */
- TSTATE(16);
- CPD;
- if (cpu->BC.w && !IS_Z)
- {
- TSTATE(5);
- cpu->PC-=2;
- }
- break;
-
- case 0xba: /* INDR */
- TSTATE(16);
- IND;
- if (cpu->BC.w)
- {
- TSTATE(5);
- cpu->PC-=2;
- }
- break;
-
- case 0xbb: /* OTDR */
- TSTATE(16);
- OUTD;
- if (cpu->BC.w)
- {
- TSTATE(5);
- cpu->PC-=2;
- }
- break;
-
- /* All the rest are NOP/invalid
- */
- default:
- TSTATE(8);
- CALLBACK(eZ80_EDHook,opcode);
- break;
- }
-}
-
-
-/* ---------------------------------------- HANDLERS FOR CB OPCODES
-*/
-static void DecodeCB(Z80 *cpu, Z80Byte opcode)
-{
- switch(opcode)
- {
- CB_ALU_BLOCK(0x00,RLC)
- CB_ALU_BLOCK(0x08,RRC)
- CB_ALU_BLOCK(0x10,RL)
- CB_ALU_BLOCK(0x18,RR)
- CB_ALU_BLOCK(0x20,SLA)
- CB_ALU_BLOCK(0x28,SRA)
- CB_ALU_BLOCK(0x30,SLL)
- CB_ALU_BLOCK(0x38,SRL)
-
- CB_BITMANIP_BLOCK(0x40,BIT,0)
- CB_BITMANIP_BLOCK(0x48,BIT,1)
- CB_BITMANIP_BLOCK(0x50,BIT,2)
- CB_BITMANIP_BLOCK(0x58,BIT,3)
- CB_BITMANIP_BLOCK(0x60,BIT,4)
- CB_BITMANIP_BLOCK(0x68,BIT,5)
- CB_BITMANIP_BLOCK(0x70,BIT,6)
- CB_BITMANIP_BLOCK(0x78,BIT,7)
-
- CB_BITMANIP_BLOCK(0x80,BIT_RES,0)
- CB_BITMANIP_BLOCK(0x88,BIT_RES,1)
- CB_BITMANIP_BLOCK(0x90,BIT_RES,2)
- CB_BITMANIP_BLOCK(0x98,BIT_RES,3)
- CB_BITMANIP_BLOCK(0xa0,BIT_RES,4)
- CB_BITMANIP_BLOCK(0xa8,BIT_RES,5)
- CB_BITMANIP_BLOCK(0xb0,BIT_RES,6)
- CB_BITMANIP_BLOCK(0xb8,BIT_RES,7)
-
- CB_BITMANIP_BLOCK(0xc0,BIT_SET,0)
- CB_BITMANIP_BLOCK(0xc8,BIT_SET,1)
- CB_BITMANIP_BLOCK(0xd0,BIT_SET,2)
- CB_BITMANIP_BLOCK(0xd8,BIT_SET,3)
- CB_BITMANIP_BLOCK(0xe0,BIT_SET,4)
- CB_BITMANIP_BLOCK(0xe8,BIT_SET,5)
- CB_BITMANIP_BLOCK(0xf0,BIT_SET,6)
- CB_BITMANIP_BLOCK(0xf8,BIT_SET,7)
- }
-}
-
-
-static void ShiftedDecodeCB(Z80 *cpu, Z80Byte opcode, Z80Relative offset)
-{
- Z80Word addr;
-
- /* See if we've come here from a IX/IY shift.
- */
- switch (PRIV->shift)
- {
- case 0xdd:
- addr=cpu->IX.w+offset;
- break;
- case 0xfd:
- addr=cpu->IY.w+offset;
- break;
- default:
- addr=cpu->HL.w; /* Play safe... */
- break;
- }
-
- switch(opcode)
- {
- SHIFTED_CB_ALU_BLOCK(0x00,RLC)
- SHIFTED_CB_ALU_BLOCK(0x08,RRC)
- SHIFTED_CB_ALU_BLOCK(0x10,RL)
- SHIFTED_CB_ALU_BLOCK(0x18,RR)
- SHIFTED_CB_ALU_BLOCK(0x20,SLA)
- SHIFTED_CB_ALU_BLOCK(0x28,SRA)
- SHIFTED_CB_ALU_BLOCK(0x30,SLL)
- SHIFTED_CB_ALU_BLOCK(0x38,SRL)
-
- SHIFTED_CB_BITMANIP_BLOCK(0x40,BIT,0)
- SHIFTED_CB_BITMANIP_BLOCK(0x48,BIT,1)
- SHIFTED_CB_BITMANIP_BLOCK(0x50,BIT,2)
- SHIFTED_CB_BITMANIP_BLOCK(0x58,BIT,3)
- SHIFTED_CB_BITMANIP_BLOCK(0x60,BIT,4)
- SHIFTED_CB_BITMANIP_BLOCK(0x68,BIT,5)
- SHIFTED_CB_BITMANIP_BLOCK(0x70,BIT,6)
- SHIFTED_CB_BITMANIP_BLOCK(0x78,BIT,7)
-
- SHIFTED_CB_BITMANIP_BLOCK(0x80,BIT_RES,0)
- SHIFTED_CB_BITMANIP_BLOCK(0x88,BIT_RES,1)
- SHIFTED_CB_BITMANIP_BLOCK(0x90,BIT_RES,2)
- SHIFTED_CB_BITMANIP_BLOCK(0x98,BIT_RES,3)
- SHIFTED_CB_BITMANIP_BLOCK(0xa0,BIT_RES,4)
- SHIFTED_CB_BITMANIP_BLOCK(0xa8,BIT_RES,5)
- SHIFTED_CB_BITMANIP_BLOCK(0xb0,BIT_RES,6)
- SHIFTED_CB_BITMANIP_BLOCK(0xb8,BIT_RES,7)
-
- SHIFTED_CB_BITMANIP_BLOCK(0xc0,BIT_SET,0)
- SHIFTED_CB_BITMANIP_BLOCK(0xc8,BIT_SET,1)
- SHIFTED_CB_BITMANIP_BLOCK(0xd0,BIT_SET,2)
- SHIFTED_CB_BITMANIP_BLOCK(0xd8,BIT_SET,3)
- SHIFTED_CB_BITMANIP_BLOCK(0xe0,BIT_SET,4)
- SHIFTED_CB_BITMANIP_BLOCK(0xe8,BIT_SET,5)
- SHIFTED_CB_BITMANIP_BLOCK(0xf0,BIT_SET,6)
- SHIFTED_CB_BITMANIP_BLOCK(0xf8,BIT_SET,7)
- }
-}
-
-
-/* ---------------------------------------- NORMAL OPCODE DECODER
-*/
-void Z80_Decode(Z80 *cpu, Z80Byte opcode)
-{
- Z80Word *HL;
- Z80Byte *H;
- Z80Byte *L;
- Z80Relative off;
-
- /* See if we've come here from a IX/IY shift
- */
- switch (PRIV->shift)
- {
- case 0xdd:
- HL=&(cpu->IX.w);
- L=cpu->IX.b+LO;
- H=cpu->IX.b+HI;
- break;
- case 0xfd:
- HL=&(cpu->IY.w);
- L=cpu->IY.b+LO;
- H=cpu->IY.b+HI;
- break;
- default:
- HL=&(cpu->HL.w);
- L=cpu->HL.b+LO;
- H=cpu->HL.b+HI;
- break;
- }
-
- switch(opcode)
- {
- case 0x00: /* NOP */
- TSTATE(4);
- break;
-
- case 0x01: /* LD BC,nnnn */
- TSTATE(10);
- cpu->BC.w=FETCH_WORD;
- break;
-
- case 0x02: /* LD (BC),A */
- TSTATE(7);
- POKE(cpu->BC.w,cpu->AF.b[HI]);
- break;
-
- case 0x03: /* INC BC */
- TSTATE(6);
- cpu->BC.w++;
- break;
-
- case 0x04: /* INC B */
- TSTATE(4);
- INC8(cpu->BC.b[HI]);
- break;
-
- case 0x05: /* DEC B */
- TSTATE(4);
- DEC8(cpu->BC.b[HI]);
- break;
-
- case 0x06: /* LD B,n */
- TSTATE(7);
- cpu->BC.b[HI]=FETCH_BYTE;
- break;
-
- case 0x07: /* RLCA */
- TSTATE(4);
- RLCA;
- break;
-
- case 0x08: /* EX AF,AF' */
- TSTATE(4);
- SWAP(cpu->AF.w,cpu->AF_);
- break;
-
- case 0x09: /* ADD HL,BC */
- TSTATE(11);
- ADD16(*HL,cpu->BC.w);
- break;
-
- case 0x0a: /* LD A,(BC) */
- TSTATE(7);
- cpu->AF.b[HI]=PEEK(cpu->BC.w);
- break;
-
- case 0x0b: /* DEC BC */
- TSTATE(6);
- cpu->BC.w--;
- break;
-
- case 0x0c: /* INC C */
- TSTATE(4);
- INC8(cpu->BC.b[LO]);
- break;
-
- case 0x0d: /* DEC C */
- TSTATE(4);
- DEC8(cpu->BC.b[LO]);
- break;
-
- case 0x0e: /* LD C,n */
- TSTATE(7);
- cpu->BC.b[LO]=FETCH_BYTE;
- break;
-
- case 0x0f: /* RRCA */
- TSTATE(4);
- RRCA;
- break;
-
- case 0x10: /* DJNZ */
- if (--(cpu->BC.b[HI]))
- {
- TSTATE(13);
- JR;
- }
- else
- {
- TSTATE(8);
- NOJR;
- }
- break;
-
- case 0x11: /* LD DE,nnnn */
- TSTATE(10);
- cpu->DE.w=FETCH_WORD;
- break;
-
- case 0x12: /* LD (DE),A */
- TSTATE(7);
- POKE(cpu->DE.w,cpu->AF.b[HI]);
- break;
-
- case 0x13: /* INC DE */
- TSTATE(6);
- cpu->DE.w++;
- break;
-
- case 0x14: /* INC D */
- TSTATE(4);
- INC8(cpu->DE.b[HI]);
- break;
-
- case 0x15: /* DEC D */
- TSTATE(4);
- DEC8(cpu->DE.b[HI]);
- break;
-
- case 0x16: /* LD D,n */
- TSTATE(7);
- cpu->DE.b[HI]=FETCH_BYTE;
- break;
-
- case 0x17: /* RLA */
- TSTATE(4);
- RLA;
- break;
-
- case 0x18: /* JR d */
- TSTATE(12);
- JR;
- break;
-
- case 0x19: /* ADD HL,DE */
- TSTATE(11);
- ADD16(*HL,cpu->DE.w);
- break;
-
- case 0x1a: /* LD A,(DE) */
- TSTATE(7);
- cpu->AF.b[HI]=PEEK(cpu->DE.w);
- break;
-
- case 0x1b: /* DEC DE */
- TSTATE(6);
- cpu->DE.w--;
- break;
-
- case 0x1c: /* INC E */
- TSTATE(4);
- INC8(cpu->DE.b[LO]);
- break;
-
- case 0x1d: /* DEC E */
- TSTATE(4);
- DEC8(cpu->DE.b[LO]);
- break;
-
- case 0x1e: /* LD E,n */
- TSTATE(7);
- cpu->DE.b[LO]=FETCH_BYTE;
- break;
-
- case 0x1f: /* RRA */
- TSTATE(4);
- RRA;
- break;
-
- case 0x20: /* JR NZ,e */
- JR_COND(!IS_Z);
- break;
-
- case 0x21: /* LD HL,nnnn */
- TSTATE(10);
- *HL=FETCH_WORD;
- break;
-
- case 0x22: /* LD (nnnn),HL */
- TSTATE(16);
- POKEW(FETCH_WORD,*HL);
- break;
-
- case 0x23: /* INC HL */
- TSTATE(6);
- (*HL)++;
- break;
-
- case 0x24: /* INC H */
- TSTATE(4);
- INC8(*H);
- break;
-
- case 0x25: /* DEC H */
- TSTATE(4);
- DEC8(*H);
- break;
-
- case 0x26: /* LD H,n */
- TSTATE(7);
- *H=FETCH_BYTE;
- break;
-
- case 0x27: /* DAA */
- TSTATE(4);
- DAA(cpu);
- break;
-
- case 0x28: /* JR Z,d */
- JR_COND(IS_Z);
- break;
-
- case 0x29: /* ADD HL,HL */
- TSTATE(11);
- ADD16(*HL,*HL);
- break;
-
- case 0x2a: /* LD HL,(nnnn) */
- TSTATE(7);
- *HL=PEEKW(FETCH_WORD);
- break;
-
- case 0x2b: /* DEC HL */
- TSTATE(6);
- (*HL)--;
- break;
-
- case 0x2c: /* INC L */
- TSTATE(4);
- INC8(*L);
- break;
-
- case 0x2d: /* DEC L */
- TSTATE(4);
- DEC8(*L);
- break;
-
- case 0x2e: /* LD L,n */
- TSTATE(7);
- *L=FETCH_BYTE;
- break;
-
- case 0x2f: /* CPL */
- TSTATE(4);
- cpu->AF.b[HI]^=0xff;
- SETFLAG(H_Z80);
- SETFLAG(N_Z80);
- SETHIDDEN(cpu->AF.b[HI]);
- break;
-
- case 0x30: /* JR NC,d */
- JR_COND(!IS_C);
- break;
-
- case 0x31: /* LD SP,nnnn */
- TSTATE(10);
- cpu->SP=FETCH_WORD;
- break;
-
- case 0x32: /* LD (nnnn),A */
- TSTATE(13);
- POKE(FETCH_WORD,cpu->AF.b[HI]);
- break;
-
- case 0x33: /* INC SP */
- TSTATE(6);
- cpu->SP++;
- break;
-
- case 0x34: /* INC (HL) */
- TSTATE(11);
- OFFSET(off);
- OP_ON_MEM(INC8,*HL+off);
- break;
-
- case 0x35: /* DEC (HL) */
- TSTATE(11);
- OFFSET(off);
- OP_ON_MEM(DEC8,*HL+off);
- break;
-
- case 0x36: /* LD (HL),n */
- TSTATE(10);
- OFFSET(off);
- POKE(*HL+off,FETCH_BYTE);
- break;
-
- case 0x37: /* SCF */
- TSTATE(4);
- cpu->AF.b[LO]=(cpu->AF.b[LO]&(S_Z80|Z_Z80|P_Z80))
- | C_Z80
- | (cpu->AF.b[HI]&(B3_Z80|B5_Z80));
- break;
-
- case 0x38: /* JR C,d */
- JR_COND(IS_C);
- break;
-
- case 0x39: /* ADD HL,SP */
- TSTATE(11);
- ADD16(*HL,cpu->SP);
- break;
-
- case 0x3a: /* LD A,(nnnn) */
- TSTATE(13);
- cpu->AF.b[HI]=PEEK(FETCH_WORD);
- break;
-
- case 0x3b: /* DEC SP */
- TSTATE(6);
- cpu->SP--;
- break;
-
- case 0x3c: /* INC A */
- TSTATE(4);
- INC8(cpu->AF.b[HI]);
- break;
-
- case 0x3d: /* DEC A */
- TSTATE(4);
- DEC8(cpu->AF.b[HI]);
- break;
-
- case 0x3e: /* LD A,n */
- TSTATE(7);
- cpu->AF.b[HI]=FETCH_BYTE;
- break;
-
- case 0x3f: /* CCF */
- TSTATE(4);
-
- if (CARRY)
- SETFLAG(H_Z80);
- else
- CLRFLAG(H_Z80);
-
- cpu->AF.b[LO]^=C_Z80;
- SETHIDDEN(cpu->AF.b[HI]);
- break;
-
- LD_BLOCK(0x40,cpu->BC.b[HI],cpu->BC.b[HI])
- LD_BLOCK(0x48,cpu->BC.b[LO],cpu->BC.b[LO])
- LD_BLOCK(0x50,cpu->DE.b[HI],cpu->DE.b[HI])
- LD_BLOCK(0x58,cpu->DE.b[LO],cpu->DE.b[LO])
- LD_BLOCK(0x60,*H,cpu->HL.b[HI])
- LD_BLOCK(0x68,*L,cpu->HL.b[LO])
-
- case 0x70: /* LD (HL),B */
- TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->BC.b[HI]);
- break;
-
- case 0x71: /* LD (HL),C */
- TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->BC.b[LO]);
- break;
-
- case 0x72: /* LD (HL),D */
- TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->DE.b[HI]);
- break;
-
- case 0x73: /* LD (HL),E */
- TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->DE.b[LO]);
- break;
-
- case 0x74: /* LD (HL),H */
- TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->HL.b[HI]);
- break;
-
- case 0x75: /* LD (HL),L */
- TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->HL.b[LO]);
- break;
-
- case 0x76: /* HALT */
- TSTATE(4);
- cpu->PC--;
-
- if (!PRIV->halt)
- CALLBACK(eZ80_Halt,1);
-
- PRIV->halt=TRUE;
- break;
-
- case 0x77: /* LD (HL),A */
- TSTATE(7);
- OFFSET(off);
- POKE(*HL+off,cpu->AF.b[HI]);
- break;
-
- LD_BLOCK(0x78,cpu->AF.b[HI],cpu->AF.b[HI])
-
- ALU_BLOCK(0x80,ADD8)
- ALU_BLOCK(0x88,ADC8)
- ALU_BLOCK(0x90,SUB8)
- ALU_BLOCK(0x98,SBC8)
- ALU_BLOCK(0xa0,AND)
- ALU_BLOCK(0xa8,XOR)
- ALU_BLOCK(0xb0,OR)
- ALU_BLOCK(0xb8,CMP8)
-
- case 0xc0: /* RET NZ */
- RET_COND(!IS_Z);
- break;
-
- case 0xc1: /* POP BC */
- TSTATE(10);
- POP(cpu->BC.w);
- break;
-
- case 0xc2: /* JP NZ,nnnn */
- JP_COND(!IS_Z);
- break;
-
- case 0xc3: /* JP nnnn */
- JP_COND(1);
- break;
-
- case 0xc4: /* CALL NZ,nnnn */
- CALL_COND(!IS_Z);
- break;
-
- case 0xc5: /* PUSH BC */
- TSTATE(10);
- PUSH(cpu->BC.w);
- break;
-
- case 0xc6: /* ADD A,n */
- TSTATE(7);
- ADD8(FETCH_BYTE);
- break;
-
- case 0xc7: /* RST 0 */
- RST(0);
- break;
-
- case 0xc8: /* RET Z */
- RET_COND(IS_Z);
- break;
-
- case 0xc9: /* RET */
- TSTATE(10);
- POP(cpu->PC);
- break;
-
- case 0xca: /* JP Z,nnnn */
- JP_COND(IS_Z);
- break;
-
- case 0xcb: /* CB PREFIX */
- INC_R;
-
- /* Check for previous IX/IY shift.
- */
- if (PRIV->shift!=0)
- {
- Z80Relative cb_offset;
-
- TSTATE(4); /* Wild stab in the dark! */
- cb_offset=FETCH_BYTE;
- ShiftedDecodeCB(cpu,FETCH_BYTE,cb_offset);
- }
- else
- {
- DecodeCB(cpu,FETCH_BYTE);
- }
- break;
-
- case 0xcc: /* CALL Z,nnnn */
- CALL_COND(IS_Z);
- break;
-
- case 0xcd: /* CALL nnnn */
- CALL_COND(1);
- break;
-
- case 0xce: /* ADC A,n */
- ADC8(FETCH_BYTE);
- break;
-
- case 0xcf: /* RST 8 */
- RST(8);
- break;
-
- case 0xd0: /* RET NC */
- RET_COND(!IS_C);
- break;
-
- case 0xd1: /* POP DE */
- TSTATE(10);
- POP(cpu->DE.w);
- break;
-
- case 0xd2: /* JP NC,nnnn */
- JP_COND(!IS_C);
- break;
-
- case 0xd3: /* OUT (n),A */
- TSTATE(11);
- if (PRIV->pwrite)
- {
- Z80Word port;
-
- port=FETCH_BYTE;
- port|=(Z80Word)cpu->AF.b[HI]<<8;
- PRIV->pwrite(cpu,port,cpu->AF.b[HI]);
- }
- else
- cpu->PC++;
- break;
-
- case 0xd4: /* CALL NC,nnnn */
- CALL_COND(!IS_C);
- break;
-
- case 0xd5: /* PUSH DE */
- TSTATE(11);
- PUSH(cpu->DE.w);
- break;
-
- case 0xd6: /* SUB A,n */
- TSTATE(7);
- SUB8(FETCH_BYTE);
- break;
-
- case 0xd7: /* RST 10 */
- RST(0x10);
- break;
-
- case 0xd8: /* RET C */
- RET_COND(IS_C);
- break;
-
- case 0xd9: /* EXX */
- TSTATE(4);
- SWAP(cpu->BC.w,cpu->BC_);
- SWAP(cpu->DE.w,cpu->DE_);
- SWAP(cpu->HL.w,cpu->HL_);
- break;
-
- case 0xda: /* JP C,nnnn */
- JP_COND(IS_C);
- break;
-
- case 0xdb: /* IN A,(n) */
- TSTATE(11);
- if (PRIV->pread)
- {
- Z80Word port;
-
- port=FETCH_BYTE;
- port|=(Z80Word)cpu->AF.b[HI]<<8;
- cpu->AF.b[HI]=PRIV->pread(cpu,port);
- }
- else
- cpu->PC++;
- break;
-
- case 0xdc: /* CALL C,nnnn */
- CALL_COND(IS_C);
- break;
-
- case 0xdd: /* DD PREFIX */
- TSTATE(4);
- INC_R;
-
- PRIV->shift=opcode;
- Z80_Decode(cpu,FETCH_BYTE);
- break;
-
- case 0xde: /* SBC A,n */
- TSTATE(7);
- SBC8(FETCH_BYTE);
- break;
-
- case 0xdf: /* RST 18 */
- RST(0x18);
- break;
-
- case 0xe0: /* RET PO */
- RET_COND(!IS_P);
- break;
-
- case 0xe1: /* POP HL */
- TSTATE(10);
- POP(*HL);
- break;
-
- case 0xe2: /* JP PO,nnnn */
- JP_COND(!IS_P);
- break;
-
- case 0xe3: /* EX (SP),HL */
- {
- Z80Word tmp;
- TSTATE(19);
- POP(tmp);
- PUSH(*HL);
- *HL=tmp;
- }
- break;
-
- case 0xe4: /* CALL PO,nnnn */
- CALL_COND(!IS_P);
- break;
-
- case 0xe5: /* PUSH HL */
- TSTATE(10);
- PUSH(*HL);
- break;
-
- case 0xe6: /* AND A,n */
- TSTATE(7);
- AND(FETCH_BYTE);
- break;
-
- case 0xe7: /* RST 20 */
- RST(0x20);
- break;
-
- case 0xe8: /* RET PE */
- RET_COND(IS_P);
- break;
-
- case 0xe9: /* JP (HL) */
- TSTATE(4);
- cpu->PC=*HL;
- break;
-
- case 0xea: /* JP PE,nnnn */
- JP_COND(IS_P);
- break;
-
- case 0xeb: /* EX DE,HL */
- TSTATE(4);
- SWAP(cpu->DE.w,*HL);
- break;
-
- case 0xec: /* CALL PE,nnnn */
- CALL_COND(IS_P);
- break;
-
- case 0xed: /* ED PREFIX */
- INC_R;
- DecodeED(cpu,FETCH_BYTE);
- break;
-
- case 0xee: /* XOR A,n */
- TSTATE(7);
- XOR(FETCH_BYTE);
- break;
-
- case 0xef: /* RST 28 */
- RST(0x28);
- break;
-
- case 0xf0: /* RET P */
- RET_COND(!IS_S);
- break;
-
- case 0xf1: /* POP AF */
- TSTATE(10);
- POP(cpu->AF.w);
- break;
-
- case 0xf2: /* JP P,nnnn */
- JP_COND(!IS_S);
- break;
-
- case 0xf3: /* DI */
- TSTATE(4);
- cpu->IFF1=0;
- cpu->IFF2=0;
- break;
-
- case 0xf4: /* CALL P,nnnn */
- CALL_COND(!IS_S);
- break;
-
- case 0xf5: /* PUSH AF */
- TSTATE(10);
- PUSH(cpu->AF.w);
- break;
-
- case 0xf6: /* OR A,n */
- TSTATE(7);
- OR(FETCH_BYTE);
- break;
-
- case 0xf7: /* RST 30 */
- RST(0x30);
- break;
-
- case 0xf8: /* RET M */
- RET_COND(IS_S);
- break;
-
- case 0xf9: /* LD SP,HL */
- TSTATE(6);
- cpu->SP=*HL;
- break;
-
- case 0xfa: /* JP M,nnnn */
- JP_COND(IS_S);
- break;
-
- case 0xfb: /* EI */
- TSTATE(4);
- cpu->IFF1=1;
- cpu->IFF2=1;
- break;
-
- case 0xfc: /* CALL M,nnnn */
- CALL_COND(IS_S);
- break;
-
- case 0xfd: /* FD PREFIX */
- TSTATE(4);
- INC_R;
-
- PRIV->shift=opcode;
- Z80_Decode(cpu,FETCH_BYTE);
- break;
-
- case 0xfe: /* CP A,n */
- TSTATE(7);
- CMP8(FETCH_BYTE);
- break;
-
- case 0xff: /* RST 38 */
- RST(0x38);
- break;
-
- }
-}
-
-
-/* END OF FILE */
diff --git a/arm9/source/z80_dis.c b/arm9/source/z80_dis.c
deleted file mode 100644
index 8a8ade8..0000000
--- a/arm9/source/z80_dis.c
+++ /dev/null
@@ -1,2494 +0,0 @@
-/*
-
- z80 - Z80 Emulator
-
- Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
-
- 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
-
- -------------------------------------------------------------------------
-
- $Id$
-
-*/
-static const char ident[]="$Id$";
-
-#include "z80_config.h"
-
-#ifdef ENABLE_DISASSEM
-
-#include <stdio.h>
-#include <string.h>
-#include <stdarg.h>
-
-#include "z80.h"
-#include "z80_private.h"
-
-static Z80Relative cb_off;
-
-/* ---------------------------------------- SHARED ROUTINES
-*/
-static const char *z80_dis_reg8[]={"b","c","d","e","h","l","(hl)","a"};
-static const char *z80_dis_reg16[]={"bc","de","hl","sp"};
-static const char *z80_dis_condition[]={"nz","z","nc","c","po","pe","p","m"};
-
-static const char *dis_op;
-static const char *dis_arg;
-
-const char *Z80_Dis_Printf(const char *format, ...)
-{
- static int p=0;
- static char s[16][80];
- va_list arg;
-
- va_start(arg,format);
- p=(p+1)%16;
- vsprintf(s[p],format,arg);
- va_end(arg);
-
- return s[p];
-}
-
-
-Z80Byte Z80_Dis_FetchByte(Z80 *cpu, Z80Word *pc)
-{
-#ifdef ENABLE_ARRAY_MEMORY
- return Z80_MEMORY[(*pc)++];
-#else
- return cpu->priv->disread(cpu,(*pc)++);
-#endif
-}
-
-
-Z80Word Z80_Dis_FetchWord(Z80 *cpu, Z80Word *pc)
-{
- Z80Byte l,h;
-
- l=Z80_Dis_FetchByte(cpu,pc);
- h=Z80_Dis_FetchByte(cpu,pc);
-
- return ((Z80Word)h<<8)|l;
-}
-
-
-void Z80_Dis_Set(const char *op, const char *arg)
-{
- dis_op=op;
- dis_arg=arg;
-}
-
-
-const char *Z80_Dis_GetOp(void)
-{
- return dis_op ? dis_op : "";
-}
-
-
-const char *Z80_Dis_GetArg(void)
-{
- return dis_arg ? dis_arg : "";
-}
-
-
-static const char *GetLabel(Z80Word w)
-{
- if (z80_labels)
- {
- int f;
-
- for(f=0;z80_labels[f].label;f++)
- {
- if (z80_labels[f].address==w)
- {
- return z80_labels[f].label;
- }
- }
- }
-
- return NULL;
-}
-
-
-
-/* ---------------------------------------- CB xx BYTE OPCODES
-*/
-static void DIS_RLC_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("rlc",reg);
-}
-
-static void DIS_RRC_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("rrc",reg);
-}
-
-static void DIS_RL_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("rl",reg);
-}
-
-static void DIS_RR_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("rr",reg);
-}
-
-static void DIS_SLA_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("sla",reg);
-}
-
-static void DIS_SRA_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("sra",reg);
-}
-
-static void DIS_SLL_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("sll",reg);
-}
-
-static void DIS_SRL_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("srl",reg);
-}
-
-static void DIS_BIT_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
- int bit;
-
- reg=z80_dis_reg8[op%8];
- bit=(op-0x40)/8;
- Z80_Dis_Set("bit",Z80_Dis_Printf("%d,%s",bit,reg));
-}
-
-static void DIS_RES_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
- int bit;
-
- reg=z80_dis_reg8[op%8];
- bit=(op-0x80)/8;
- Z80_Dis_Set("res",Z80_Dis_Printf("%d,%s",bit,reg));
-}
-
-static void DIS_SET_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
- int bit;
-
- reg=z80_dis_reg8[op%8];
- bit=(op-0xc0)/8;
- Z80_Dis_Set("set",Z80_Dis_Printf("%d,%s",bit,reg));
-}
-
-/* ---------------------------------------- DD OPCODES
-*/
-
-static const char *IX_RelStr(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- static char s[80];
- Z80Relative r;
-
- r=(Z80Relative)Z80_Dis_FetchByte(z80,pc);
-
- if (r<0)
- sprintf(s,"(ix-$%.2x)",-r);
- else
- sprintf(s,"(ix+$%.2x)",r);
-
- return(s);
-}
-
-
-static const char *IX_RelStrCB(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- static char s[80];
- Z80Relative r;
-
- r=(Z80Relative)cb_off;
-
- if (r<0)
- sprintf(s,"(ix-$%.2x)",-r);
- else
- sprintf(s,"(ix+$%.2x)",r);
-
- return(s);
-}
-
-
-static const char *XR8(Z80 *z80, int reg, Z80Word *pc)
-{
- switch(reg)
- {
- case 0:
- return("b");
- break;
- case 1:
- return("c");
- break;
- case 2:
- return("d");
- break;
- case 3:
- return("e");
- break;
- case 4:
- return("ixh");
- break;
- case 5:
- return("ixl");
- break;
- case 6:
- return(IX_RelStr(z80,0,pc));
- break;
- case 7:
- return("a");
- break;
- default:
- return(Z80_Dis_Printf("BUG %d",reg));
- break;
- }
-}
-
-static void DIS_DD_NOP(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- dis_opcode_z80[op](z80,op,pc);
-}
-
-static void DIS_ADD_IX_BC(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add","ix,bc");
-}
-
-static void DIS_ADD_IX_DE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add","ix,de");
-}
-
-static void DIS_LD_IX_WORD(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld",Z80_Dis_Printf("ix,$%.4x",Z80_Dis_FetchWord(z80,pc)));
-}
-
-static void DIS_LD_ADDR_IX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("(%s),ix",p));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("($%.4x),ix",w));
-}
-
-static void DIS_INC_IX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("inc","ix");
-}
-
-static void DIS_INC_IXH(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("inc","ixh");
-}
-
-static void DIS_DEC_IXH(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("dec","ixh");
-}
-
-static void DIS_LD_IXH_BYTE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld",Z80_Dis_Printf("ixh,$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_ADD_IX_IX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add","ix,ix");
-}
-
-static void DIS_LD_IX_ADDR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("ix,(%s)",p));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("ix,($%.4x)",w));
-}
-
-static void DIS_DEC_IX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("dec","ix");
-}
-
-static void DIS_INC_IXL(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("inc","ixl");
-}
-
-static void DIS_DEC_IXL(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("dec","ixl");
-}
-
-static void DIS_LD_IXL_BYTE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld",Z80_Dis_Printf("ixl,$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_INC_IIX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("inc",Z80_Dis_Printf("%s",IX_RelStr(z80,op,pc)));
-}
-
-static void DIS_DEC_IIX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("dec",Z80_Dis_Printf("%s",IX_RelStr(z80,op,pc)));
-}
-
-static void DIS_LD_IIX_BYTE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *rel;
- int b;
-
- rel=IX_RelStr(z80,op,pc);
- b=Z80_Dis_FetchByte(z80,pc);
- Z80_Dis_Set("ld",Z80_Dis_Printf("%s,$%.2x",rel,b));
-}
-
-
-static void DIS_ADD_IX_SP(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add","ix,sp");
-}
-
-static void DIS_XLD_R8_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int src_r,dest_r;
- const char *src,*dest;
-
- dest_r=(op-0x40)/8;
- src_r=op%8;
-
- /* IX can't be used as source and destination when reading z80ory
- */
- if (dest_r==6)
- {
- dest=XR8(z80,dest_r,pc);
- src=z80_dis_reg8[src_r];
- }
- else if (((dest_r==4)||(dest_r==5))&&(src_r==6))
- {
- dest=z80_dis_reg8[dest_r];
- src=XR8(z80,src_r,pc);
- }
- else
- {
- dest=XR8(z80,dest_r,pc);
- src=XR8(z80,src_r,pc);
- }
-
- Z80_Dis_Set("ld",Z80_Dis_Printf("%s,%s",dest,src));
-}
-
-static void DIS_XADD_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add",Z80_Dis_Printf("a,%s",XR8(z80,(op%8),pc)));
-}
-
-static void DIS_XADC_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("adc",Z80_Dis_Printf("a,%s",XR8(z80,(op%8),pc)));
-}
-
-static void DIS_XSUB_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("sub",Z80_Dis_Printf("a,%s",XR8(z80,(op%8),pc)));
-}
-
-static void DIS_XSBC_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("sbc",Z80_Dis_Printf("a,%s",XR8(z80,(op%8),pc)));
-}
-
-static void DIS_XAND_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("and",Z80_Dis_Printf("%s",XR8(z80,(op%8),pc)));
-}
-
-static void DIS_XXOR_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("xor",Z80_Dis_Printf("%s",XR8(z80,(op%8),pc)));
-}
-
-static void DIS_X_OR_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("or",Z80_Dis_Printf("%s",XR8(z80,(op%8),pc)));
-}
-
-static void DIS_XCP_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("cp",Z80_Dis_Printf("%s",XR8(z80,(op%8),pc)));
-}
-
-static void DIS_POP_IX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("pop","ix");
-}
-
-static void DIS_EX_ISP_IX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ex","(sp),ix");
-}
-
-static void DIS_PUSH_IX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("push","ix");
-}
-
-static void DIS_JP_IX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("jp","(ix)");
-}
-
-static void DIS_LD_SP_IX(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld","sp,ix");
-}
-
-static void DIS_DD_CB_DECODE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- cb_off=(Z80Relative)Z80_Dis_FetchByte(z80,pc);
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_DD_CB_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_DD_DD_DECODE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_DD_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_DD_ED_DECODE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_ED_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_DD_FD_DECODE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_FD_opcode[nop](z80,nop,pc);
-}
-
-
-/* ---------------------------------------- DD CB OPCODES
-*/
-
-static void DIS_RLC_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("rlc",Z80_Dis_Printf("%s",IX_RelStrCB(z80,op,pc)));
- else
- {
- Z80_Dis_Set("rlc",Z80_Dis_Printf("%s[%s]",IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
- }
-}
-
-static void DIS_RRC_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("rrc",Z80_Dis_Printf("%s",IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("rrc",Z80_Dis_Printf("%s[%s]",IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_RL_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("rl",Z80_Dis_Printf("%s",IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("rl",Z80_Dis_Printf("%s[%s]",IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_RR_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("rr",Z80_Dis_Printf("%s",IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("rr",Z80_Dis_Printf("%s[%s]",IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SLA_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("sla",Z80_Dis_Printf("%s",IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("sla",Z80_Dis_Printf("%s[%s]",IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SRA_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("sra",Z80_Dis_Printf("%s",IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("sra",Z80_Dis_Printf("%s[%s]",IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SRL_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("srl",Z80_Dis_Printf("%s",IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("srl",Z80_Dis_Printf("%s[%s]",IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SLL_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("sll",Z80_Dis_Printf("%s",IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("sll",Z80_Dis_Printf("%s[%s]",IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_BIT_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
- int bit;
-
- reg=(op%8);
- bit=(op-0x40)/8;
-
- if (reg==6)
- Z80_Dis_Set("bit",Z80_Dis_Printf("%d,%s",bit,IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("bit",Z80_Dis_Printf("%d,%s[%s]",bit,IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_RES_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
- int bit;
-
- reg=(op%8);
- bit=(op-0x80)/8;
-
- if (reg==6)
- Z80_Dis_Set("res",Z80_Dis_Printf("%d,%s",bit,IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("res",Z80_Dis_Printf("%d,%s[%s]",bit,IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SET_IX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
- int bit;
-
- reg=(op%8);
- bit=(op-0xc0)/8;
-
- if (reg==6)
- Z80_Dis_Set("set",Z80_Dis_Printf("%d,%s",bit,IX_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("set",Z80_Dis_Printf("%d,%s[%s]",bit,IX_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-
-/* ---------------------------------------- ED OPCODES
-*/
-
-static const char *ER8(int reg)
-{
- switch(reg)
- {
- case 0:
- return("b");
- break;
- case 1:
- return("c");
- break;
- case 2:
- return("d");
- break;
- case 3:
- return("e");
- break;
- case 4:
- return("h");
- break;
- case 5:
- return("l");
- break;
- case 6:
- return("0");
- break;
- case 7:
- return("a");
- break;
- }
-
- return "?";
-}
-
-/* Assumes illegal ED ops are being used for break points
-*/
-static void DIS_ED_NOP(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("brk",Z80_Dis_Printf("$%.2x",op));
-}
-
-static void DIS_IN_R8_C(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("in",Z80_Dis_Printf("%s,(c)",ER8((op-0x40)/8)));
-}
-
-static void DIS_OUT_C_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("out",Z80_Dis_Printf("(c),%s",ER8((op-0x40)/8)));
-}
-
-static void DIS_SBC_HL_R16(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("sbc",Z80_Dis_Printf("hl,%s",z80_dis_reg16[(op-0x40)/16]));
-}
-
-static void DIS_ED_LD_ADDR_R16(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("(%s),%s",p,z80_dis_reg16[(op-0x40)/16]));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("($%.4x),%s",w,z80_dis_reg16[(op-0x40)/16]));
-}
-
-static void DIS_NEG(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("neg",NULL);
-}
-
-static void DIS_RETN(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("retn",NULL);
-}
-
-static void DIS_IM_0(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("im","0");
-}
-
-static void DIS_LD_I_A(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld","i,a");
-}
-
-static void DIS_ADC_HL_R16(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("adc",Z80_Dis_Printf("hl,%s",z80_dis_reg16[(op-0x40)/16]));
-}
-
-static void DIS_ED_LD_R16_ADDR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("%s,(%s)",z80_dis_reg16[(op-0x40)/16],p));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("%s,($%.4x)",z80_dis_reg16[(op-0x40)/16],w));
-}
-
-static void DIS_RETI(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("reti",NULL);
-}
-
-static void DIS_LD_R_A(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld","r,a");
-}
-
-static void DIS_IM_1(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("im","1");
-}
-
-static void DIS_LD_A_I(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld","a,i");
-}
-
-static void DIS_IM_2(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("im","2");
-}
-
-static void DIS_LD_A_R(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld","a,r");
-}
-
-static void DIS_RRD(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("rrd",NULL);
-}
-
-static void DIS_RLD(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("rld",NULL);
-}
-
-static void DIS_LDI(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ldi",NULL);
-}
-
-static void DIS_CPI(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("cpi",NULL);
-}
-
-static void DIS_INI(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ini",NULL);
-}
-
-static void DIS_OUTI(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("outi",NULL);
-}
-
-static void DIS_LDD(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ldd",NULL);
-}
-
-static void DIS_CPD(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("cpd",NULL);
-}
-
-static void DIS_IND(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ind",NULL);
-}
-
-static void DIS_OUTD(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("outd",NULL);
-}
-
-static void DIS_LDIR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ldir",NULL);
-}
-
-static void DIS_CPIR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("cpir",NULL);
-}
-
-static void DIS_INIR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("inir",NULL);
-}
-
-static void DIS_OTIR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("otir",NULL);
-}
-
-static void DIS_LDDR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("lddr",NULL);
-}
-
-static void DIS_CPDR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("cpdr",NULL);
-}
-
-static void DIS_INDR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("indr",NULL);
-}
-
-static void DIS_OTDR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("otdr",NULL);
-}
-
-
-/* ---------------------------------------- FD OPCODES
-*/
-
-static const char *IY_RelStr(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- static char s[80];
- Z80Relative r;
-
- r=(Z80Relative)Z80_Dis_FetchByte(z80,pc);
-
- if (r<0)
- sprintf(s,"(iy-$%.2x)",-r);
- else
- sprintf(s,"(iy+$%.2x)",r);
-
- return(s);
-}
-
-
-static const char *IY_RelStrCB(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- static char s[80];
- Z80Relative r;
-
- r=(Z80Relative)cb_off;
-
- if (r<0)
- sprintf(s,"(iy-$%.2x)",-r);
- else
- sprintf(s,"(iy+$%.2x)",r);
-
- return(s);
-}
-
-
-static const char *YR8(Z80 *z80, int reg, Z80Word *pc)
-{
- switch(reg)
- {
- case 0:
- return("b");
- break;
- case 1:
- return("c");
- break;
- case 2:
- return("d");
- break;
- case 3:
- return("e");
- break;
- case 4:
- return("iyh");
- break;
- case 5:
- return("iyl");
- break;
- case 6:
- return(IY_RelStr(z80,0,pc));
- break;
- case 7:
- return("a");
- break;
- default:
- return(Z80_Dis_Printf("BUG %d",reg));
- break;
- }
-}
-
-static void DIS_FD_NOP(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- dis_opcode_z80[op](z80,op,pc);
-}
-
-static void DIS_ADD_IY_BC(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add","iy,bc");
-}
-
-static void DIS_ADD_IY_DE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add","iy,de");
-}
-
-static void DIS_LD_IY_WORD(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld",Z80_Dis_Printf("iy,$%.4x",Z80_Dis_FetchWord(z80,pc)));
-}
-
-static void DIS_LD_ADDR_IY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("(%s),iy",p));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("($%.4x),iy",w));
-}
-
-static void DIS_INC_IY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("inc","iy");
-}
-
-static void DIS_INC_IYH(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("inc","iyh");
-}
-
-static void DIS_DEC_IYH(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("dec","iyh");
-}
-
-static void DIS_LD_IYH_BYTE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld",Z80_Dis_Printf("iyh,$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_ADD_IY_IY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add","iy,iy");
-}
-
-static void DIS_LD_IY_ADDR(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("iy,(%s)",p));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("iy,($%.4x)",w));
-}
-
-static void DIS_DEC_IY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("dec","iy");
-}
-
-static void DIS_INC_IYL(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("inc","iyl");
-}
-
-static void DIS_DEC_IYL(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("dec","iyl");
-}
-
-static void DIS_LD_IYL_BYTE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld",Z80_Dis_Printf("iyl,$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_INC_IIY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("inc",Z80_Dis_Printf("%s",IY_RelStr(z80,op,pc)));
-}
-
-static void DIS_DEC_IIY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("dec",Z80_Dis_Printf("%s",IY_RelStr(z80,op,pc)));
-}
-
-static void DIS_LD_IIY_BYTE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *rel;
- int b;
-
- rel=IY_RelStr(z80,op,pc);
- b=Z80_Dis_FetchByte(z80,pc);
- Z80_Dis_Set("ld",Z80_Dis_Printf("%s,$%.2x",rel,b));
-}
-
-
-static void DIS_ADD_IY_SP(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add","iy,sp");
-}
-
-static void DIS_YLD_R8_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int src_r,dest_r;
- const char *src,*dest;
-
- dest_r=(op-0x40)/8;
- src_r=op%8;
-
- /* IY can't be used as source and destination when reading z80ory
- */
- if (dest_r==6)
- {
- dest=YR8(z80,dest_r,pc);
- src=z80_dis_reg8[src_r];
- }
- else if (((dest_r==4)||(dest_r==5))&&(src_r==6))
- {
- dest=z80_dis_reg8[dest_r];
- src=YR8(z80,src_r,pc);
- }
- else
- {
- dest=YR8(z80,dest_r,pc);
- src=YR8(z80,src_r,pc);
- }
-
- Z80_Dis_Set("ld",Z80_Dis_Printf("%s,%s",dest,src));
-}
-
-static void DIS_YADD_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add",Z80_Dis_Printf("a,%s",YR8(z80,(op%8),pc)));
-}
-
-static void DIS_YADC_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("adc",Z80_Dis_Printf("a,%s",YR8(z80,(op%8),pc)));
-}
-
-static void DIS_YSUB_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("sub",Z80_Dis_Printf("a,%s",YR8(z80,(op%8),pc)));
-}
-
-static void DIS_YSBC_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("sbc",Z80_Dis_Printf("a,%s",YR8(z80,(op%8),pc)));
-}
-
-static void DIS_YAND_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("and",Z80_Dis_Printf("%s",YR8(z80,(op%8),pc)));
-}
-
-static void DIS_YYOR_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("xor",Z80_Dis_Printf("%s",YR8(z80,(op%8),pc)));
-}
-
-static void DIS_Y_OR_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("or",Z80_Dis_Printf("%s",YR8(z80,(op%8),pc)));
-}
-
-static void DIS_YCP_R8(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("cp",Z80_Dis_Printf("%s",YR8(z80,(op%8),pc)));
-}
-
-static void DIS_POP_IY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("pop","iy");
-}
-
-static void DIS_EY_ISP_IY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ex","(sp),iy");
-}
-
-static void DIS_PUSH_IY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("push","iy");
-}
-
-static void DIS_JP_IY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("jp","(iy)");
-}
-
-static void DIS_LD_SP_IY(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld","sp,iy");
-}
-
-static void DIS_FD_CB_DECODE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- cb_off=(Z80Relative)Z80_Dis_FetchByte(z80,pc);
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_FD_CB_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_FD_DD_DECODE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_DD_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_FD_ED_DECODE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_ED_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_FD_FD_DECODE(Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_FD_opcode[nop](z80,nop,pc);
-}
-
-
-/* ---------------------------------------- FD CB OPCODES
-*/
-
-static void DIS_RLC_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("rlc",Z80_Dis_Printf("%s",IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("rlc",Z80_Dis_Printf("%s[%s]",IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_RRC_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("rrc",Z80_Dis_Printf("%s",IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("rrc",Z80_Dis_Printf("%s[%s]",IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_RL_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("rl",Z80_Dis_Printf("%s",IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("rl",Z80_Dis_Printf("%s[%s]",IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_RR_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("rr",Z80_Dis_Printf("%s",IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("rr",Z80_Dis_Printf("%s[%s]",IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SLA_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("sla",Z80_Dis_Printf("%s",IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("sla",Z80_Dis_Printf("%s[%s]",IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SRA_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("sra",Z80_Dis_Printf("%s",IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("sra",Z80_Dis_Printf("%s[%s]",IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SRL_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("srl",Z80_Dis_Printf("%s",IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("srl",Z80_Dis_Printf("%s[%s]",IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SLL_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
-
- reg=(op%8);
-
- if (reg==6)
- Z80_Dis_Set("sll",Z80_Dis_Printf("%s",IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("sll",Z80_Dis_Printf("%s[%s]",IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_BIT_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
- int bit;
-
- reg=(op%8);
- bit=(op-0x40)/8;
-
- if (reg==6)
- Z80_Dis_Set("bit",Z80_Dis_Printf("%d,%s",bit,IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("bit",Z80_Dis_Printf("%d,%s[%s]",bit,IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_RES_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
- int bit;
-
- reg=(op%8);
- bit=(op-0x80)/8;
-
- if (reg==6)
- Z80_Dis_Set("res",Z80_Dis_Printf("%d,%s",bit,IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("res",Z80_Dis_Printf("%d,%s[%s]",bit,IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-static void DIS_SET_IY (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int reg;
- int bit;
-
- reg=(op%8);
- bit=(op-0xc0)/8;
-
- if (reg==6)
- Z80_Dis_Set("set",Z80_Dis_Printf("%d,%s",bit,IY_RelStrCB(z80,op,pc)));
- else
- Z80_Dis_Set("set",Z80_Dis_Printf("%d,%s[%s]",bit,IY_RelStrCB(z80,op,pc),z80_dis_reg8[reg]));
-}
-
-
-/* ---------------------------------------- SINGLE BYTE OPCODES
-*/
-static void DIS_NOP (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("nop",NULL);
-}
-
-static void DIS_LD_R16_WORD (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg16[(op&0x30)/0x10];
- Z80_Dis_Set("ld",Z80_Dis_Printf("%s,$%.4x",reg,Z80_Dis_FetchWord(z80,pc)));
-}
-
-static void DIS_LD_R16_A (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg16[(op&0x30)/0x10];
- Z80_Dis_Set("ld",Z80_Dis_Printf("(%s),a",reg));
-}
-
-static void DIS_INC_R16 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg16[(op&0x30)/0x10];
- Z80_Dis_Set("inc",reg);
-}
-
-static void DIS_INC_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[(op&0x38)/0x8];
- Z80_Dis_Set("inc",reg);
-}
-
-static void DIS_DEC_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[(op&0x38)/0x8];
- Z80_Dis_Set("dec",reg);
-}
-
-static void DIS_LD_R8_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[(op&0x38)/0x8];
- Z80_Dis_Set("ld",Z80_Dis_Printf("%s,$%.2x",reg,Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_RLCA (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("rlca",NULL);
-}
-
-static void DIS_EX_AF_AF (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ex","af,af'");
-}
-
-static void DIS_ADD_HL_R16 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg16[(op&0x30)/0x10];
- Z80_Dis_Set("add",Z80_Dis_Printf("hl,%s",reg));
-}
-
-static void DIS_LD_A_R16 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg16[(op&0x30)/0x10];
- Z80_Dis_Set("ld",Z80_Dis_Printf("a,(%s)",reg));
-}
-
-static void DIS_DEC_R16 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg16[(op&0x30)/0x10];
- Z80_Dis_Set("dec",reg);
-}
-
-static void DIS_RRCA (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("rrca",NULL);
-}
-
-static void DIS_DJNZ (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word new;
-
-#ifdef ENABLE_ARRAY_MEMORY
- new=*pc+(Z80Relative)Z80_MEMORY[*pc]+1;
-#else
- new=*pc+(Z80Relative)z80->priv->disread(z80,*pc)+1;
-#endif
- (*pc)++;
- Z80_Dis_Set("djnz",Z80_Dis_Printf("$%.4x",new));
-}
-
-static void DIS_RLA (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("rla",NULL);
-}
-
-static void DIS_JR (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word new;
- const char *p;
-
-#ifdef ENABLE_ARRAY_MEMORY
- new=*pc+(Z80Relative)Z80_MEMORY[*pc]+1;
-#else
- new=*pc+(Z80Relative)z80->priv->disread(z80,*pc)+1;
-#endif
- (*pc)++;
-
- if ((p=GetLabel(new)))
- Z80_Dis_Set("jr",Z80_Dis_Printf("%s",p));
- else
- Z80_Dis_Set("jr",Z80_Dis_Printf("$%.4x",new));
-}
-
-static void DIS_RRA (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("rra",NULL);
-}
-
-static void DIS_JR_CO (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *con;
- Z80Word new;
- const char *p;
-
- con=z80_dis_condition[(op-0x20)/8];
-#ifdef ENABLE_ARRAY_MEMORY
- new=*pc+(Z80Relative)Z80_MEMORY[*pc]+1;
-#else
- new=*pc+(Z80Relative)z80->priv->disread(z80,*pc)+1;
-#endif
- (*pc)++;
-
- if ((p=GetLabel(new)))
- Z80_Dis_Set("jr",Z80_Dis_Printf("%s,%s",con,p));
- else
- Z80_Dis_Set("jr",Z80_Dis_Printf("%s,$%.4x",con,new));
-}
-
-static void DIS_LD_ADDR_HL (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("(%s),hl",p));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("($%.4x),hl",w));
-}
-
-static void DIS_DAA (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("daa",NULL);
-}
-
-static void DIS_LD_HL_ADDR (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("hl,(%s)",p));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("hl,($%.4x)",w));
-}
-
-static void DIS_CPL (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("cpl",NULL);
-}
-
-static void DIS_LD_ADDR_A (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("(%s),a",p));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("($%.4x),a",w));
-}
-
-static void DIS_SCF (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("scf",NULL);
-}
-
-static void DIS_LD_A_ADDR (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("ld",Z80_Dis_Printf("a,(%s)",p));
- else
- Z80_Dis_Set("ld",Z80_Dis_Printf("a,($%.4x)",w));
-}
-
-static void DIS_CCF (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ccf",NULL);
-}
-
-static void DIS_LD_R8_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *src,*dest;
-
- dest=z80_dis_reg8[(op-0x40)/8];
- src=z80_dis_reg8[op%8];
- Z80_Dis_Set("ld",Z80_Dis_Printf("%s,%s",dest,src));
-}
-
-static void DIS_HALT (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("halt",NULL);
-}
-
-static void DIS_ADD_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("add",Z80_Dis_Printf("a,%s",reg));
-}
-
-static void DIS_ADC_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("adc",Z80_Dis_Printf("a,%s",reg));
-}
-
-static void DIS_SUB_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("sub",Z80_Dis_Printf("a,%s",reg));
-}
-
-static void DIS_SBC_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("sbc",Z80_Dis_Printf("a,%s",reg));
-}
-
-static void DIS_AND_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("and",Z80_Dis_Printf("%s",reg));
-}
-
-static void DIS_XOR_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("xor",Z80_Dis_Printf("%s",reg));
-}
-
-static void DIS_OR_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("or",Z80_Dis_Printf("%s",reg));
-}
-
-static void DIS_CP_R8 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg8[op%8];
- Z80_Dis_Set("cp",Z80_Dis_Printf("%s",reg));
-}
-
-
-static void DIS_RET_CO (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *con;
-
- con=z80_dis_condition[(op-0xc0)/8];
- Z80_Dis_Set("ret",con);
-}
-
-static void DIS_POP_R16 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg16[(op-0xc0)/16];
-
- if (!strcmp(reg,"sp"))
- reg="af";
-
- Z80_Dis_Set("pop",reg);
-}
-
-static void DIS_JP (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("jp",Z80_Dis_Printf("%s",p));
- else
- Z80_Dis_Set("jp",Z80_Dis_Printf("$%.4x",w));
-}
-
-static void DIS_PUSH_R16 (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *reg;
-
- reg=z80_dis_reg16[(op-0xc0)/16];
-
- if (!strcmp(reg,"sp"))
- reg="af";
-
- Z80_Dis_Set("push",reg);
-}
-
-static void DIS_ADD_A_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("add",Z80_Dis_Printf("a,$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_RST (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int add;
-
- add=(op&0x3f)-7;
- Z80_Dis_Set("rst",Z80_Dis_Printf("%.2xh",add));
-}
-
-static void DIS_RET (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ret",NULL);
-}
-
-static void DIS_JP_CO (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *con;
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
- con=z80_dis_condition[(op-0xc0)/8];
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("jp",Z80_Dis_Printf("%s,%s",con,p));
- else
- Z80_Dis_Set("jp",Z80_Dis_Printf("%s,$%.4x",con,w));
-}
-
-static void DIS_CB_DECODE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_CB_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_CALL_CO (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- const char *con;
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
- con=z80_dis_condition[(op-0xc0)/8];
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("call",Z80_Dis_Printf("%s,%s",con,p));
- else
- Z80_Dis_Set("call",Z80_Dis_Printf("%s,$%.4x",con,w));
-}
-
-static void DIS_CALL (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80Word w;
- const char *p;
-
- w=Z80_Dis_FetchWord(z80,pc);
-
- if ((p=GetLabel(w)))
- Z80_Dis_Set("call",Z80_Dis_Printf("%s",p));
- else
- Z80_Dis_Set("call",Z80_Dis_Printf("$%.4x",w));
-}
-
-static void DIS_ADC_A_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("adc",Z80_Dis_Printf("a,$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_OUT_BYTE_A (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("out",Z80_Dis_Printf("($%.2x),a",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_SUB_A_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("sub",Z80_Dis_Printf("a,$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_EXX (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("exx",NULL);
-}
-
-static void DIS_IN_A_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("in",Z80_Dis_Printf("a,($%.2x)",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_DD_DECODE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_DD_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_SBC_A_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("sbc",Z80_Dis_Printf("a,$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-
-static void DIS_EX_ISP_HL (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ex","(sp),hl");
-}
-
-static void DIS_AND_A_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("and",Z80_Dis_Printf("$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_JP_HL (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("jp","(hl)");
-}
-
-static void DIS_EX_DE_HL (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ex","de,hl");
-}
-
-static void DIS_ED_DECODE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_ED_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_XOR_A_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("xor",Z80_Dis_Printf("$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_DI (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("di",NULL);
-}
-
-static void DIS_OR_A_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("or",Z80_Dis_Printf("$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-static void DIS_LD_SP_HL (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ld","sp,hl");
-}
-
-static void DIS_EI (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("ei",NULL);
-}
-
-static void DIS_FD_DECODE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- int nop;
-
- nop=Z80_Dis_FetchByte(z80,pc);
- dis_FD_opcode[nop](z80,nop,pc);
-}
-
-static void DIS_CP_A_BYTE (Z80 *z80, Z80Byte op, Z80Word *pc)
-{
- Z80_Dis_Set("cp",Z80_Dis_Printf("$%.2x",Z80_Dis_FetchByte(z80,pc)));
-}
-
-
-/* ---------------------------------------- TABLES
-*/
-
-/* CB opcodes
-*/
-DIS_OP_CALLBACK dis_CB_opcode[0x100]=
- {
-/* 0x00 - 0x03 */ DIS_RLC_R8, DIS_RLC_R8, DIS_RLC_R8, DIS_RLC_R8,
-/* 0x04 - 0x07 */ DIS_RLC_R8, DIS_RLC_R8, DIS_RLC_R8, DIS_RLC_R8,
-/* 0x08 - 0x0b */ DIS_RRC_R8, DIS_RRC_R8, DIS_RRC_R8, DIS_RRC_R8,
-/* 0x0c - 0x0f */ DIS_RRC_R8, DIS_RRC_R8, DIS_RRC_R8, DIS_RRC_R8,
-
-/* 0x10 - 0x13 */ DIS_RL_R8, DIS_RL_R8, DIS_RL_R8, DIS_RL_R8,
-/* 0x14 - 0x17 */ DIS_RL_R8, DIS_RL_R8, DIS_RL_R8, DIS_RL_R8,
-/* 0x18 - 0x1b */ DIS_RR_R8, DIS_RR_R8, DIS_RR_R8, DIS_RR_R8,
-/* 0x1c - 0x1f */ DIS_RR_R8, DIS_RR_R8, DIS_RR_R8, DIS_RR_R8,
-
-/* 0x20 - 0x23 */ DIS_SLA_R8, DIS_SLA_R8, DIS_SLA_R8, DIS_SLA_R8,
-/* 0x24 - 0x27 */ DIS_SLA_R8, DIS_SLA_R8, DIS_SLA_R8, DIS_SLA_R8,
-/* 0x28 - 0x2b */ DIS_SRA_R8, DIS_SRA_R8, DIS_SRA_R8, DIS_SRA_R8,
-/* 0x2c - 0x2f */ DIS_SRA_R8, DIS_SRA_R8, DIS_SRA_R8, DIS_SRA_R8,
-
-/* 0x30 - 0x33 */ DIS_SLL_R8, DIS_SLL_R8, DIS_SLL_R8, DIS_SLL_R8,
-/* 0x34 - 0x37 */ DIS_SLL_R8, DIS_SLL_R8, DIS_SLL_R8, DIS_SLL_R8,
-/* 0x38 - 0x3b */ DIS_SRL_R8, DIS_SRL_R8, DIS_SRL_R8, DIS_SRL_R8,
-/* 0x3c - 0x3f */ DIS_SRL_R8, DIS_SRL_R8, DIS_SRL_R8, DIS_SRL_R8,
-
-/* 0x40 - 0x43 */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x44 - 0x47 */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x48 - 0x4b */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x4c - 0x4f */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-
-/* 0x50 - 0x53 */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x54 - 0x57 */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x58 - 0x5b */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x5c - 0x5f */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-
-/* 0x60 - 0x63 */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x64 - 0x67 */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x68 - 0x6b */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x6c - 0x6f */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-
-/* 0x70 - 0x73 */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x74 - 0x77 */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x78 - 0x7b */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-/* 0x7c - 0x7f */ DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8, DIS_BIT_R8,
-
-/* 0x80 - 0x83 */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0x84 - 0x87 */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0x88 - 0x8b */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0x8c - 0x8f */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-
-/* 0x90 - 0x93 */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0x94 - 0x97 */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0x98 - 0x9b */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0x9c - 0x9f */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-
-/* 0xa0 - 0xa3 */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0xa4 - 0xa7 */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0xa8 - 0xab */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0xac - 0xaf */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-
-/* 0xb0 - 0xb3 */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0xb4 - 0xb7 */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0xb8 - 0xbb */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-/* 0xbc - 0xbf */ DIS_RES_R8, DIS_RES_R8, DIS_RES_R8, DIS_RES_R8,
-
-/* 0xc0 - 0xc3 */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xc4 - 0xc7 */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xc8 - 0xcb */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xcc - 0xcf */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-
-/* 0xd0 - 0xd3 */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xd4 - 0xd7 */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xd8 - 0xdb */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xdc - 0xdf */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-
-/* 0xe0 - 0xe3 */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xe4 - 0xe7 */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xe8 - 0xeb */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xec - 0xef */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-
-/* 0xf0 - 0xf3 */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xf4 - 0xf7 */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xf8 - 0xfb */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
-/* 0xfc - 0xff */ DIS_SET_R8, DIS_SET_R8, DIS_SET_R8, DIS_SET_R8,
- };
-
-/* DIS_DD opcodes
-*/
-DIS_OP_CALLBACK dis_DD_opcode[0x100]=
- {
-/* 0x00 - 0x03 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x04 - 0x07 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x08 - 0x0b */ DIS_DD_NOP, DIS_ADD_IX_BC, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x0c - 0x0f */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-
-/* 0x10 - 0x13 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x14 - 0x17 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x18 - 0x1b */ DIS_DD_NOP, DIS_ADD_IX_DE, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x1c - 0x1f */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-
-/* 0x20 - 0x23 */ DIS_DD_NOP, DIS_LD_IX_WORD, DIS_LD_ADDR_IX, DIS_INC_IX,
-/* 0x24 - 0x27 */ DIS_INC_IXH, DIS_DEC_IXH, DIS_LD_IXH_BYTE, DIS_DD_NOP,
-/* 0x28 - 0x2b */ DIS_DD_NOP, DIS_ADD_IX_IX, DIS_LD_IX_ADDR, DIS_DEC_IX,
-/* 0x2c - 0x2f */ DIS_INC_IXL, DIS_DEC_IXL, DIS_LD_IXL_BYTE, DIS_DD_NOP,
-
-/* 0x30 - 0x33 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x34 - 0x37 */ DIS_INC_IIX, DIS_DEC_IIX, DIS_LD_IIX_BYTE, DIS_DD_NOP,
-/* 0x38 - 0x3b */ DIS_DD_NOP, DIS_ADD_IX_SP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x3c - 0x3f */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-
-/* 0x40 - 0x43 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x44 - 0x47 */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_DD_NOP,
-/* 0x48 - 0x4b */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x4c - 0x4f */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_DD_NOP,
-
-/* 0x50 - 0x53 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x54 - 0x57 */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_DD_NOP,
-/* 0x58 - 0x5b */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x5c - 0x5f */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_DD_NOP,
-
-/* 0x60 - 0x63 */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8,
-/* 0x64 - 0x67 */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8,
-/* 0x68 - 0x6b */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8,
-/* 0x6c - 0x6f */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8,
-
-/* 0x70 - 0x73 */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8,
-/* 0x74 - 0x77 */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_DD_NOP, DIS_XLD_R8_R8,
-/* 0x78 - 0x7b */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x7c - 0x7f */ DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_XLD_R8_R8, DIS_DD_NOP,
-
-/* 0x80 - 0x83 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x84 - 0x87 */ DIS_XADD_R8, DIS_XADD_R8, DIS_XADD_R8, DIS_DD_NOP,
-/* 0x88 - 0x8b */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x8c - 0x8f */ DIS_XADC_R8, DIS_XADC_R8, DIS_XADC_R8, DIS_DD_NOP,
-
-/* 0x90 - 0x93 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x94 - 0x97 */ DIS_XSUB_R8, DIS_XSUB_R8, DIS_XSUB_R8, DIS_DD_NOP,
-/* 0x98 - 0x9b */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0x9c - 0x9f */ DIS_XSBC_R8, DIS_XSBC_R8, DIS_XSBC_R8, DIS_DD_NOP,
-
-/* 0xa0 - 0xa3 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xa4 - 0xa7 */ DIS_XAND_R8, DIS_XAND_R8, DIS_XAND_R8, DIS_DD_NOP,
-/* 0xa8 - 0xab */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xac - 0xaf */ DIS_XXOR_R8, DIS_XXOR_R8, DIS_XXOR_R8, DIS_DD_NOP,
-
-/* 0xb0 - 0xb3 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xb4 - 0xb7 */ DIS_X_OR_R8, DIS_X_OR_R8, DIS_X_OR_R8, DIS_DD_NOP,
-/* 0xb8 - 0xbb */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xbc - 0xbf */ DIS_XCP_R8, DIS_XCP_R8, DIS_XCP_R8, DIS_DD_NOP,
-
-/* 0xc0 - 0xc3 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xc4 - 0xc7 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xc8 - 0xcb */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_CB_DECODE,
-/* 0xcc - 0xcf */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-
-/* 0xd0 - 0xd3 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xd4 - 0xd7 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xd8 - 0xdb */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xdc - 0xdf */ DIS_DD_NOP, DIS_DD_DD_DECODE, DIS_DD_NOP, DIS_DD_NOP,
-
-/* 0xe0 - 0xe3 */ DIS_DD_NOP, DIS_POP_IX, DIS_DD_NOP, DIS_EX_ISP_IX,
-/* 0xe4 - 0xe7 */ DIS_DD_NOP, DIS_PUSH_IX, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xe8 - 0xeb */ DIS_DD_NOP, DIS_JP_IX, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xec - 0xef */ DIS_DD_NOP, DIS_DD_ED_DECODE, DIS_DD_NOP, DIS_DD_NOP,
-
-/* 0xf0 - 0xf3 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xf4 - 0xf7 */ DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xf8 - 0xfb */ DIS_DD_NOP, DIS_LD_SP_IX, DIS_DD_NOP, DIS_DD_NOP,
-/* 0xfc - 0xff */ DIS_DD_NOP, DIS_DD_FD_DECODE, DIS_DD_NOP, DIS_DD_NOP,
- };
-
-
-/* DIS_DD DIS_CB opcodes
-*/
-DIS_OP_CALLBACK dis_DD_CB_opcode[0x100]=
- {
-/* 0x00 - 0x03 */ DIS_RLC_IX, DIS_RLC_IX, DIS_RLC_IX, DIS_RLC_IX,
-/* 0x04 - 0x07 */ DIS_RLC_IX, DIS_RLC_IX, DIS_RLC_IX, DIS_RLC_IX,
-/* 0x08 - 0x0b */ DIS_RRC_IX, DIS_RRC_IX, DIS_RRC_IX, DIS_RRC_IX,
-/* 0x0c - 0x0f */ DIS_RRC_IX, DIS_RRC_IX, DIS_RRC_IX, DIS_RRC_IX,
-
-/* 0x10 - 0x13 */ DIS_RL_IX, DIS_RL_IX, DIS_RL_IX, DIS_RL_IX,
-/* 0x14 - 0x17 */ DIS_RL_IX, DIS_RL_IX, DIS_RL_IX, DIS_RL_IX,
-/* 0x18 - 0x1b */ DIS_RR_IX, DIS_RR_IX, DIS_RR_IX, DIS_RR_IX,
-/* 0x1c - 0x1f */ DIS_RR_IX, DIS_RR_IX, DIS_RR_IX, DIS_RR_IX,
-
-/* 0x20 - 0x23 */ DIS_SLA_IX, DIS_SLA_IX, DIS_SLA_IX, DIS_SLA_IX,
-/* 0x24 - 0x27 */ DIS_SLA_IX, DIS_SLA_IX, DIS_SLA_IX, DIS_SLA_IX,
-/* 0x28 - 0x2b */ DIS_SRA_IX, DIS_SRA_IX, DIS_SRA_IX, DIS_SRA_IX,
-/* 0x2c - 0x2f */ DIS_SRA_IX, DIS_SRA_IX, DIS_SRA_IX, DIS_SRA_IX,
-
-/* 0x30 - 0x33 */ DIS_SLL_IX, DIS_SLL_IX, DIS_SLL_IX, DIS_SLL_IX,
-/* 0x34 - 0x37 */ DIS_SLL_IX, DIS_SLL_IX, DIS_SLL_IX, DIS_SLL_IX,
-/* 0x38 - 0x3b */ DIS_SRL_IX, DIS_SRL_IX, DIS_SRL_IX, DIS_SRL_IX,
-/* 0x3c - 0x3f */ DIS_SRL_IX, DIS_SRL_IX, DIS_SRL_IX, DIS_SRL_IX,
-
-/* 0x40 - 0x43 */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x44 - 0x47 */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x48 - 0x4b */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x4c - 0x4f */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-
-/* 0x50 - 0x53 */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x54 - 0x57 */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x58 - 0x5b */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x5c - 0x5f */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-
-/* 0x60 - 0x63 */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x64 - 0x67 */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x68 - 0x6b */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x6c - 0x6f */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-
-/* 0x70 - 0x73 */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x74 - 0x77 */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x78 - 0x7b */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-/* 0x7c - 0x7f */ DIS_BIT_IX,DIS_BIT_IX, DIS_BIT_IX, DIS_BIT_IX,
-
-/* 0x80 - 0x83 */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0x84 - 0x87 */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0x88 - 0x8b */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0x8c - 0x8f */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-
-/* 0x90 - 0x93 */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0x94 - 0x97 */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0x98 - 0x9b */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0x9c - 0x9f */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-
-/* 0xa0 - 0xa3 */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0xa4 - 0xa7 */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0xa8 - 0xab */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0xac - 0xaf */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-
-/* 0xb0 - 0xb3 */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0xb4 - 0xb7 */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0xb8 - 0xbb */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-/* 0xbc - 0xbf */ DIS_RES_IX,DIS_RES_IX, DIS_RES_IX, DIS_RES_IX,
-
-/* 0xc0 - 0xc3 */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xc4 - 0xc7 */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xc8 - 0xcb */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xcc - 0xcf */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-
-/* 0xd0 - 0xd3 */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xd4 - 0xd7 */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xd8 - 0xdb */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xdc - 0xdf */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-
-/* 0xe0 - 0xe3 */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xe4 - 0xe7 */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xe8 - 0xeb */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xec - 0xef */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-
-/* 0xf0 - 0xf3 */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xf4 - 0xf7 */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xf8 - 0xfb */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
-/* 0xfc - 0xff */ DIS_SET_IX,DIS_SET_IX, DIS_SET_IX, DIS_SET_IX,
- };
-
-/* DIS_ED opcodes
-*/
-DIS_OP_CALLBACK dis_ED_opcode[0x100]=
- {
-/* 0x00 - 0x03 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x04 - 0x07 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x08 - 0x0b */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x0c - 0x0f */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0x10 - 0x13 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x14 - 0x17 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x18 - 0x1b */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x1c - 0x1f */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0x20 - 0x23 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x24 - 0x27 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x28 - 0x2b */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x2c - 0x2f */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0x30 - 0x33 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x34 - 0x37 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x38 - 0x3b */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x3c - 0x3f */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0x40 - 0x43 */ DIS_IN_R8_C, DIS_OUT_C_R8, DIS_SBC_HL_R16, DIS_ED_LD_ADDR_R16,
-/* 0x44 - 0x47 */ DIS_NEG, DIS_RETN, DIS_IM_0, DIS_LD_I_A,
-/* 0x48 - 0x4b */ DIS_IN_R8_C, DIS_OUT_C_R8, DIS_ADC_HL_R16, DIS_ED_LD_R16_ADDR,
-/* 0x4c - 0x4f */ DIS_NEG, DIS_RETI, DIS_IM_0, DIS_LD_R_A,
-
-/* 0x50 - 0x53 */ DIS_IN_R8_C, DIS_OUT_C_R8, DIS_SBC_HL_R16, DIS_ED_LD_ADDR_R16,
-/* 0x54 - 0x57 */ DIS_NEG, DIS_RETN, DIS_IM_1, DIS_LD_A_I,
-/* 0x58 - 0x5b */ DIS_IN_R8_C, DIS_OUT_C_R8, DIS_ADC_HL_R16, DIS_ED_LD_R16_ADDR,
-/* 0x5c - 0x5f */ DIS_NEG, DIS_RETI, DIS_IM_2, DIS_LD_A_R,
-
-/* 0x60 - 0x63 */ DIS_IN_R8_C, DIS_OUT_C_R8, DIS_SBC_HL_R16, DIS_ED_LD_ADDR_R16,
-/* 0x64 - 0x67 */ DIS_NEG, DIS_RETN, DIS_IM_0, DIS_RRD,
-/* 0x68 - 0x6b */ DIS_IN_R8_C, DIS_OUT_C_R8, DIS_ADC_HL_R16, DIS_ED_LD_R16_ADDR,
-/* 0x6c - 0x6f */ DIS_NEG, DIS_RETI, DIS_IM_0, DIS_RLD,
-
-/* 0x70 - 0x73 */ DIS_IN_R8_C, DIS_OUT_C_R8, DIS_SBC_HL_R16, DIS_ED_LD_ADDR_R16,
-/* 0x74 - 0x77 */ DIS_NEG, DIS_RETN, DIS_IM_1, DIS_ED_NOP,
-/* 0x78 - 0x7b */ DIS_IN_R8_C, DIS_OUT_C_R8, DIS_ADC_HL_R16, DIS_ED_LD_R16_ADDR,
-/* 0x7c - 0x7f */ DIS_NEG, DIS_RETI, DIS_IM_2, DIS_ED_NOP,
-
-/* 0x80 - 0x83 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x84 - 0x87 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x88 - 0x8b */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x8c - 0x8f */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0x90 - 0x93 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x94 - 0x97 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x98 - 0x9b */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0x9c - 0x9f */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0xa0 - 0xa3 */ DIS_LDI, DIS_CPI, DIS_INI, DIS_OUTI,
-/* 0xa4 - 0xa7 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xa8 - 0xab */ DIS_LDD, DIS_CPD, DIS_IND, DIS_OUTD,
-/* 0xac - 0xaf */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0xb0 - 0xb3 */ DIS_LDIR, DIS_CPIR, DIS_INIR, DIS_OTIR,
-/* 0xb4 - 0xb7 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xb8 - 0xbb */ DIS_LDDR, DIS_CPDR, DIS_INDR, DIS_OTDR,
-/* 0xbc - 0xbf */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0xc0 - 0xc3 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xc4 - 0xc7 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xc8 - 0xcb */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xcc - 0xcf */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0xd0 - 0xd3 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xd4 - 0xd7 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xd8 - 0xdb */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xdc - 0xdf */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0xe0 - 0xe3 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xe4 - 0xe7 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xe8 - 0xeb */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xec - 0xef */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-
-/* 0xf0 - 0xf3 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xf4 - 0xf7 */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xf8 - 0xfb */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
-/* 0xfc - 0xff */ DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP, DIS_ED_NOP,
- };
-
-/* DIS_FD opcodes
-*/
-DIS_OP_CALLBACK dis_FD_opcode[0x100]=
- {
-/* 0x00 - 0x03 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x04 - 0x07 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x08 - 0x0b */ DIS_FD_NOP, DIS_ADD_IY_BC, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x0c - 0x0f */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-
-/* 0x10 - 0x13 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x14 - 0x17 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x18 - 0x1b */ DIS_FD_NOP, DIS_ADD_IY_DE, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x1c - 0x1f */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-
-/* 0x20 - 0x23 */ DIS_FD_NOP, DIS_LD_IY_WORD, DIS_LD_ADDR_IY, DIS_INC_IY,
-/* 0x24 - 0x27 */ DIS_INC_IYH, DIS_DEC_IYH, DIS_LD_IYH_BYTE, DIS_FD_NOP,
-/* 0x28 - 0x2b */ DIS_FD_NOP, DIS_ADD_IY_IY, DIS_LD_IY_ADDR, DIS_DEC_IY,
-/* 0x2c - 0x2f */ DIS_INC_IYL, DIS_DEC_IYL, DIS_LD_IYL_BYTE, DIS_FD_NOP,
-
-/* 0x30 - 0x33 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x34 - 0x37 */ DIS_INC_IIY, DIS_DEC_IIY, DIS_LD_IIY_BYTE, DIS_FD_NOP,
-/* 0x38 - 0x3b */ DIS_FD_NOP, DIS_ADD_IY_SP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x3c - 0x3f */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-
-/* 0x40 - 0x43 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x44 - 0x47 */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_FD_NOP,
-/* 0x48 - 0x4b */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x4c - 0x4f */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_FD_NOP,
-
-/* 0x50 - 0x53 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x54 - 0x57 */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_FD_NOP,
-/* 0x58 - 0x5b */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x5c - 0x5f */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_FD_NOP,
-
-/* 0x60 - 0x63 */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8,
-/* 0x64 - 0x67 */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8,
-/* 0x68 - 0x6b */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8,
-/* 0x6c - 0x6f */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8,
-
-/* 0x70 - 0x73 */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8,
-/* 0x74 - 0x77 */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_FD_NOP, DIS_YLD_R8_R8,
-/* 0x78 - 0x7b */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x7c - 0x7f */ DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_YLD_R8_R8, DIS_FD_NOP,
-
-/* 0x80 - 0x83 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x84 - 0x87 */ DIS_YADD_R8, DIS_YADD_R8, DIS_YADD_R8, DIS_FD_NOP,
-/* 0x88 - 0x8b */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x8c - 0x8f */ DIS_YADC_R8, DIS_YADC_R8, DIS_YADC_R8, DIS_FD_NOP,
-
-/* 0x90 - 0x93 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x94 - 0x97 */ DIS_YSUB_R8, DIS_YSUB_R8, DIS_YSUB_R8, DIS_FD_NOP,
-/* 0x98 - 0x9b */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0x9c - 0x9f */ DIS_YSBC_R8, DIS_YSBC_R8, DIS_YSBC_R8, DIS_FD_NOP,
-
-/* 0xa0 - 0xa3 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xa4 - 0xa7 */ DIS_YAND_R8, DIS_YAND_R8, DIS_YAND_R8, DIS_FD_NOP,
-/* 0xa8 - 0xab */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xac - 0xaf */ DIS_YYOR_R8, DIS_YYOR_R8, DIS_YYOR_R8, DIS_FD_NOP,
-
-/* 0xb0 - 0xb3 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xb4 - 0xb7 */ DIS_Y_OR_R8, DIS_Y_OR_R8, DIS_Y_OR_R8, DIS_FD_NOP,
-/* 0xb8 - 0xbb */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xbc - 0xbf */ DIS_YCP_R8, DIS_YCP_R8, DIS_YCP_R8, DIS_FD_NOP,
-
-/* 0xc0 - 0xc3 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xc4 - 0xc7 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xc8 - 0xcb */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_CB_DECODE,
-/* 0xcc - 0xcf */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-
-/* 0xd0 - 0xd3 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xd4 - 0xd7 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xd8 - 0xdb */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xdc - 0xdf */ DIS_FD_NOP, DIS_FD_DD_DECODE, DIS_FD_NOP, DIS_FD_NOP,
-
-/* 0xe0 - 0xe3 */ DIS_FD_NOP, DIS_POP_IY, DIS_FD_NOP, DIS_EY_ISP_IY,
-/* 0xe4 - 0xe7 */ DIS_FD_NOP, DIS_PUSH_IY, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xe8 - 0xeb */ DIS_FD_NOP, DIS_JP_IY, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xec - 0xef */ DIS_FD_NOP, DIS_FD_ED_DECODE, DIS_FD_NOP, DIS_FD_NOP,
-
-/* 0xf0 - 0xf3 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xf4 - 0xf7 */ DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xf8 - 0xfb */ DIS_FD_NOP, DIS_LD_SP_IY, DIS_FD_NOP, DIS_FD_NOP,
-/* 0xfc - 0xff */ DIS_FD_NOP, DIS_FD_FD_DECODE, DIS_FD_NOP, DIS_FD_NOP,
- };
-
-
-/* DIS_FD DIS_CB opcodes
-*/
-DIS_OP_CALLBACK dis_FD_CB_opcode[0x100]=
- {
-/* 0x00 - 0x03 */ DIS_RLC_IY, DIS_RLC_IY, DIS_RLC_IY, DIS_RLC_IY,
-/* 0x04 - 0x07 */ DIS_RLC_IY, DIS_RLC_IY, DIS_RLC_IY, DIS_RLC_IY,
-/* 0x08 - 0x0b */ DIS_RRC_IY, DIS_RRC_IY, DIS_RRC_IY, DIS_RRC_IY,
-/* 0x0c - 0x0f */ DIS_RRC_IY, DIS_RRC_IY, DIS_RRC_IY, DIS_RRC_IY,
-
-/* 0x10 - 0x13 */ DIS_RL_IY, DIS_RL_IY, DIS_RL_IY, DIS_RL_IY,
-/* 0x14 - 0x17 */ DIS_RL_IY, DIS_RL_IY, DIS_RL_IY, DIS_RL_IY,
-/* 0x18 - 0x1b */ DIS_RR_IY, DIS_RR_IY, DIS_RR_IY, DIS_RR_IY,
-/* 0x1c - 0x1f */ DIS_RR_IY, DIS_RR_IY, DIS_RR_IY, DIS_RR_IY,
-
-/* 0x20 - 0x23 */ DIS_SLA_IY, DIS_SLA_IY, DIS_SLA_IY, DIS_SLA_IY,
-/* 0x24 - 0x27 */ DIS_SLA_IY, DIS_SLA_IY, DIS_SLA_IY, DIS_SLA_IY,
-/* 0x28 - 0x2b */ DIS_SRA_IY, DIS_SRA_IY, DIS_SRA_IY, DIS_SRA_IY,
-/* 0x2c - 0x2f */ DIS_SRA_IY, DIS_SRA_IY, DIS_SRA_IY, DIS_SRA_IY,
-
-/* 0x30 - 0x33 */ DIS_SLL_IY, DIS_SLL_IY, DIS_SLL_IY, DIS_SLL_IY,
-/* 0x34 - 0x37 */ DIS_SLL_IY, DIS_SLL_IY, DIS_SLL_IY, DIS_SLL_IY,
-/* 0x38 - 0x3b */ DIS_SRL_IY, DIS_SRL_IY, DIS_SRL_IY, DIS_SRL_IY,
-/* 0x3c - 0x3f */ DIS_SRL_IY, DIS_SRL_IY, DIS_SRL_IY, DIS_SRL_IY,
-
-/* 0x40 - 0x43 */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x44 - 0x47 */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x48 - 0x4b */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x4c - 0x4f */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-
-/* 0x50 - 0x53 */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x54 - 0x57 */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x58 - 0x5b */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x5c - 0x5f */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-
-/* 0x60 - 0x63 */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x64 - 0x67 */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x68 - 0x6b */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x6c - 0x6f */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-
-/* 0x70 - 0x73 */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x74 - 0x77 */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x78 - 0x7b */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-/* 0x7c - 0x7f */ DIS_BIT_IY,DIS_BIT_IY, DIS_BIT_IY, DIS_BIT_IY,
-
-/* 0x80 - 0x83 */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0x84 - 0x87 */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0x88 - 0x8b */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0x8c - 0x8f */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-
-/* 0x90 - 0x93 */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0x94 - 0x97 */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0x98 - 0x9b */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0x9c - 0x9f */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-
-/* 0xa0 - 0xa3 */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0xa4 - 0xa7 */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0xa8 - 0xab */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0xac - 0xaf */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-
-/* 0xb0 - 0xb3 */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0xb4 - 0xb7 */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0xb8 - 0xbb */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-/* 0xbc - 0xbf */ DIS_RES_IY,DIS_RES_IY, DIS_RES_IY, DIS_RES_IY,
-
-/* 0xc0 - 0xc3 */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xc4 - 0xc7 */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xc8 - 0xcb */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xcc - 0xcf */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-
-/* 0xd0 - 0xd3 */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xd4 - 0xd7 */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xd8 - 0xdb */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xdc - 0xdf */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-
-/* 0xe0 - 0xe3 */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xe4 - 0xe7 */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xe8 - 0xeb */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xec - 0xef */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-
-/* 0xf0 - 0xf3 */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xf4 - 0xf7 */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xf8 - 0xfb */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
-/* 0xfc - 0xff */ DIS_SET_IY,DIS_SET_IY, DIS_SET_IY, DIS_SET_IY,
- };
-
-/* DIS_First/single byte opcodes
-*/
-DIS_OP_CALLBACK dis_opcode_z80[0x100]=
- {
-/* 0x00 - 0x03 */ DIS_NOP, DIS_LD_R16_WORD, DIS_LD_R16_A, DIS_INC_R16,
-/* 0x04 - 0x07 */ DIS_INC_R8, DIS_DEC_R8, DIS_LD_R8_BYTE, DIS_RLCA,
-/* 0x08 - 0x0b */ DIS_EX_AF_AF, DIS_ADD_HL_R16, DIS_LD_A_R16, DIS_DEC_R16,
-/* 0x0c - 0x0f */ DIS_INC_R8, DIS_DEC_R8, DIS_LD_R8_BYTE, DIS_RRCA,
-
-/* 0x10 - 0x13 */ DIS_DJNZ, DIS_LD_R16_WORD, DIS_LD_R16_A, DIS_INC_R16,
-/* 0x14 - 0x17 */ DIS_INC_R8, DIS_DEC_R8, DIS_LD_R8_BYTE, DIS_RLA,
-/* 0x18 - 0x1b */ DIS_JR, DIS_ADD_HL_R16, DIS_LD_A_R16, DIS_DEC_R16,
-/* 0x1c - 0x1f */ DIS_INC_R8, DIS_DEC_R8, DIS_LD_R8_BYTE, DIS_RRA,
-
-/* 0x20 - 0x23 */ DIS_JR_CO, DIS_LD_R16_WORD, DIS_LD_ADDR_HL, DIS_INC_R16,
-/* 0x24 - 0x27 */ DIS_INC_R8, DIS_DEC_R8, DIS_LD_R8_BYTE, DIS_DAA,
-/* 0x28 - 0x2b */ DIS_JR_CO, DIS_ADD_HL_R16, DIS_LD_HL_ADDR, DIS_DEC_R16,
-/* 0x2c - 0x2f */ DIS_INC_R8, DIS_DEC_R8, DIS_LD_R8_BYTE, DIS_CPL,
-
-/* 0x30 - 0x33 */ DIS_JR_CO, DIS_LD_R16_WORD, DIS_LD_ADDR_A, DIS_INC_R16,
-/* 0x34 - 0x37 */ DIS_INC_R8, DIS_DEC_R8, DIS_LD_R8_BYTE, DIS_SCF,
-/* 0x38 - 0x3b */ DIS_JR_CO, DIS_ADD_HL_R16, DIS_LD_A_ADDR, DIS_DEC_R16,
-/* 0x3c - 0x3f */ DIS_INC_R8, DIS_DEC_R8, DIS_LD_R8_BYTE, DIS_CCF,
-
-/* 0x40 - 0x43 */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x44 - 0x47 */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x48 - 0x4b */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x4c - 0x4f */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-
-/* 0x50 - 0x53 */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x54 - 0x57 */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x58 - 0x5b */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x5c - 0x5f */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-
-/* 0x60 - 0x63 */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x64 - 0x67 */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x68 - 0x6b */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x6c - 0x6f */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-
-/* 0x70 - 0x73 */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x74 - 0x77 */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_HALT, DIS_LD_R8_R8,
-/* 0x78 - 0x7b */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-/* 0x7c - 0x7f */ DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8, DIS_LD_R8_R8,
-
-/* 0x80 - 0x83 */ DIS_ADD_R8, DIS_ADD_R8, DIS_ADD_R8, DIS_ADD_R8,
-/* 0x84 - 0x87 */ DIS_ADD_R8, DIS_ADD_R8, DIS_ADD_R8, DIS_ADD_R8,
-/* 0x88 - 0x8b */ DIS_ADC_R8, DIS_ADC_R8, DIS_ADC_R8, DIS_ADC_R8,
-/* 0x8c - 0x8f */ DIS_ADC_R8, DIS_ADC_R8, DIS_ADC_R8, DIS_ADC_R8,
-
-/* 0x90 - 0x93 */ DIS_SUB_R8, DIS_SUB_R8, DIS_SUB_R8, DIS_SUB_R8,
-/* 0x94 - 0x97 */ DIS_SUB_R8, DIS_SUB_R8, DIS_SUB_R8, DIS_SUB_R8,
-/* 0x98 - 0x9b */ DIS_SBC_R8, DIS_SBC_R8, DIS_SBC_R8, DIS_SBC_R8,
-/* 0x9c - 0x9f */ DIS_SBC_R8, DIS_SBC_R8, DIS_SBC_R8, DIS_SBC_R8,
-
-/* 0xa0 - 0xa3 */ DIS_AND_R8, DIS_AND_R8, DIS_AND_R8, DIS_AND_R8,
-/* 0xa4 - 0xa7 */ DIS_AND_R8, DIS_AND_R8, DIS_AND_R8, DIS_AND_R8,
-/* 0xa8 - 0xab */ DIS_XOR_R8, DIS_XOR_R8, DIS_XOR_R8, DIS_XOR_R8,
-/* 0xac - 0xaf */ DIS_XOR_R8, DIS_XOR_R8, DIS_XOR_R8, DIS_XOR_R8,
-
-/* 0xb0 - 0xb3 */ DIS_OR_R8, DIS_OR_R8, DIS_OR_R8, DIS_OR_R8,
-/* 0xb4 - 0xb7 */ DIS_OR_R8, DIS_OR_R8, DIS_OR_R8, DIS_OR_R8,
-/* 0xb8 - 0xbb */ DIS_CP_R8, DIS_CP_R8, DIS_CP_R8, DIS_CP_R8,
-/* 0xbc - 0xbf */ DIS_CP_R8, DIS_CP_R8, DIS_CP_R8, DIS_CP_R8,
-
-/* 0xc0 - 0xc3 */ DIS_RET_CO, DIS_POP_R16, DIS_JP_CO, DIS_JP,
-/* 0xc4 - 0xc7 */ DIS_CALL_CO, DIS_PUSH_R16, DIS_ADD_A_BYTE, DIS_RST,
-/* 0xc8 - 0xcb */ DIS_RET_CO, DIS_RET, DIS_JP_CO, DIS_CB_DECODE,
-/* 0xcc - 0xcf */ DIS_CALL_CO, DIS_CALL, DIS_ADC_A_BYTE, DIS_RST,
-
-/* 0xd0 - 0xd3 */ DIS_RET_CO, DIS_POP_R16, DIS_JP_CO, DIS_OUT_BYTE_A,
-/* 0xd4 - 0xd7 */ DIS_CALL_CO, DIS_PUSH_R16, DIS_SUB_A_BYTE, DIS_RST,
-/* 0xd8 - 0xdb */ DIS_RET_CO, DIS_EXX, DIS_JP_CO, DIS_IN_A_BYTE,
-/* 0xdc - 0xdf */ DIS_CALL_CO, DIS_DD_DECODE, DIS_SBC_A_BYTE, DIS_RST,
-
-/* 0xe0 - 0xe3 */ DIS_RET_CO, DIS_POP_R16, DIS_JP_CO, DIS_EX_ISP_HL,
-/* 0xe4 - 0xe7 */ DIS_CALL_CO, DIS_PUSH_R16, DIS_AND_A_BYTE, DIS_RST,
-/* 0xe8 - 0xeb */ DIS_RET_CO, DIS_JP_HL, DIS_JP_CO, DIS_EX_DE_HL,
-/* 0xec - 0xef */ DIS_CALL_CO, DIS_ED_DECODE, DIS_XOR_A_BYTE, DIS_RST,
-
-/* 0xf0 - 0xf3 */ DIS_RET_CO, DIS_POP_R16, DIS_JP_CO, DIS_DI,
-/* 0xf4 - 0xf7 */ DIS_CALL_CO, DIS_PUSH_R16, DIS_OR_A_BYTE, DIS_RST,
-/* 0xf8 - 0xfb */ DIS_RET_CO, DIS_LD_SP_HL, DIS_JP_CO, DIS_EI,
-/* 0xfc - 0xff */ DIS_CALL_CO, DIS_FD_DECODE, DIS_CP_A_BYTE, DIS_RST,
- };
-
-
-#endif
-
-/* END OF FILE */
diff --git a/arm9/source/zx81.c b/arm9/source/zx81.c
deleted file mode 100644
index 41ff686..0000000
--- a/arm9/source/zx81.c
+++ /dev/null
@@ -1,792 +0,0 @@
-/*
- ds81 - Nintendo DS ZX81 emulator
-
- Copyright (C) 2006 Ian Cowburn <ianc@noddybox.co.uk>
-
- 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
-
- -------------------------------------------------------------------------
-
- Provides the emulation for the zX81
-
-*/
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <ctype.h>
-#include <nds.h>
-
-#include "ds81_global.h"
-
-#include "zx81.h"
-#include "gui.h"
-
-#include "zx81_bin.h"
-
-#ifndef TRUE
-#define TRUE 1
-#endif
-
-#ifndef FALSE
-#define FALSE 0
-#endif
-
-#define MAX_FNAME_LEN 30
-
-
-/* ---------------------------------------- STATICS
-*/
-#define ROMLEN 0x2000
-#define ROM_SAVE 0x2fc
-#define ROM_LOAD 0x347
-
-#define ED_SAVE 0xf0
-#define ED_LOAD 0xf1
-#define ED_WAITKEY 0xf2
-#define ED_ENDWAITKEY 0xf3
-#define ED_PAUSE 0xf4
-
-#define SLOW_TSTATES 16000
-#define FAST_TSTATES 64000
-
-#define LASTK1 16421
-#define LASTK2 16422
-#define MARGIN 16424
-#define FRAMES 16436
-#define CDFLAG 16443
-
-static Z80Val FRAME_TSTATES=FAST_TSTATES;
-
-/* The ZX81 screen and memory
-*/
-static int waitkey=FALSE;
-static int started=FALSE;
-
-#define SCR_W 256
-#define SCR_H 192
-#define TXT_W 32
-#define TXT_H 24
-
-static Z80Byte mem[0x10000];
-
-static Z80Word RAMBOT=0;
-static Z80Word RAMTOP=0;
-static Z80Word RAMLEN=0;
-
-#define DFILE 0x400c
-
-#define WORD(a) (mem[a] | (Z80Word)mem[a+1]<<8)
-
-/* Tape
-*/
-static int enable_filesystem;
-static const Z80Byte *tape_image;
-static int tape_len;
-
-/* GFX vars
-*/
-static uint16 *screen;
-
-/* The keyboard
-*/
-static Z80Byte matrix[8];
-
-static struct
-{
- int row;
- int bit;
-} key_matrix[]=
- {
- {3,0x01}, {3,0x02}, {3,0x04}, {3,0x08}, {3,0x10}, /* 1 - 5 */
- {4,0x10}, {4,0x08}, {4,0x04}, {4,0x02}, {4,0x01}, /* 6 - 0 */
- {2,0x01}, {2,0x02}, {2,0x04}, {2,0x08}, {2,0x10}, /* Q - T */
- {5,0x10}, {5,0x08}, {5,0x04}, {5,0x02}, {5,0x01}, /* Y - P */
- {1,0x01}, {1,0x02}, {1,0x04}, {1,0x08}, {1,0x10}, /* A - G */
- {6,0x10}, {6,0x08}, {6,0x04}, {6,0x02}, {6,0x01}, /* H - NL */
- {0,0x01}, {0,0x02}, {0,0x04}, {0,0x08}, {0,0x10}, /* CAPS - V */
- {7,0x10}, {7,0x08}, {7,0x04}, {7,0x02}, {7,0x01} /* B - SPACE */
- };
-
-
-/* ---------------------------------------- PRIVATE FUNCTIONS
-*/
-#define PEEKW(addr) (mem[addr] | (Z80Word)mem[addr+1]<<8)
-
-#define POKEW(addr,val) do \
- { \
- Z80Word wa=addr; \
- Z80Word wv=val; \
- mem[wa]=wv; \
- mem[wa+1]=wv>>8; \
- } while(0)
-
-static void RomPatch(void)
-{
- static const Z80Byte save[]=
- {
- 0xed, ED_SAVE, /* (SAVE) */
- 0xc3, 0x07, 0x02, /* JP $0207 */
- 0xff /* End of patch */
- };
-
- static const Z80Byte load[]=
- {
- 0xed, ED_LOAD, /* (LOAD) */
- 0xc3, 0x07, 0x02, /* JP $0207 */
- 0xff /* End of patch */
- };
-
- static const Z80Byte fast_hack[]=
- {
- 0xed, ED_WAITKEY, /* (START KEY WAIT) */
- 0xcb,0x46, /* L: bit 0,(hl) */
- 0x28,0xfc, /* jr z,L */
- 0xed, ED_ENDWAITKEY, /* (END KEY WAIT) */
- 0x00, /* nop */
- 0xff /* End of patch */
- };
-
- static const Z80Byte kbd_hack[]=
- {
- 0x2a,0x25,0x40, /* ld hl,(LASTK) */
- 0xc9, /* ret */
- 0xff /* End of patch */
- };
-
- static const Z80Byte pause_hack[]=
- {
- 0xed, ED_PAUSE, /* (PAUSE) */
- 0x00, /* nop */
- 0xff /* End of patch */
- };
-
- int f;
-
- for(f=0;save[f]!=0xff;f++)
- {
- mem[ROM_SAVE+f]=save[f];
- }
-
- for(f=0;load[f]!=0xff;f++)
- {
- mem[ROM_LOAD+f]=load[f];
- }
-
- for(f=0;fast_hack[f]!=0xff;f++)
- {
- mem[0x4ca+f]=fast_hack[f];
- }
-
- for(f=0;kbd_hack[f]!=0xff;f++)
- {
- mem[0x2bb+f]=kbd_hack[f];
- }
-
- for(f=0;pause_hack[f]!=0xff;f++)
- {
- mem[0xf3a+f]=pause_hack[f];
- }
-
- /* Trust me, we have a ZX81... Honestly.
- */
- mem[0x21c]=0x00;
- mem[0x21d]=0x00;
-
- /* Remove HALTs as we don't do interrupts
- */
- mem[0x0079]=0;
- mem[0x02ec]=0;
-}
-
-static Z80Byte FromASCII(char c)
-{
- switch(c)
- {
- case '\'':
- case '"':
- return 11;
-
- case '(':
- return 16;
-
- case ')':
- return 17;
-
- case '-':
- return 22;
-
- case '*':
- return 23;
-
- case ',':
- return 26;
-
- case '.':
- return 27;
- }
-
- if (c>='0' && c<='9')
- return (c-'0')+28;
-
- if (c>='a' && c<='z')
- return (c-'a')+38;
-
- if (c>='A' && c<='Z')
- return (c-'A')+38;
-
- return 0;
-}
-
-
-/* Open a tape file the passed address
-*/
-static FILE *OpenTapeFile(Z80Word addr)
-{
- FILE *fp;
- char fn[MAX_FNAME_LEN];
- int f;
- int done;
-
- f=0;
- done=FALSE;
-
- while(f<(MAX_FNAME_LEN-3) && !done)
- {
- int ch;
-
- ch=mem[addr++];
-
- if (ch&0x80)
- {
- done=TRUE;
- ch&=0x7f;
- }
-
- switch(ch)
- {
- case 22:
- fn[f++]='-';
- break;
-
- case 27:
- fn[f++]='.';
-
- default:
- if (ch>=28 && ch<=37)
- {
- fn[f++]='0'+(ch-28);
- }
- else if (ch>=38 && ch<=63)
- {
- fn[f++]='A'+(ch-38);
- }
- break;
- }
- }
-
- fn[f++]='.';
- fn[f++]='P';
- fn[f]=0;
-
- if (!(fp=fopen(fn,"rb")))
- {
- char full_fn[MAX_FNAME_LEN+11]="\\ZX81SNAP\\";
-
- strcat(full_fn,fn);
- fp=fopen(full_fn,"rb");
- }
-
- return fp;
-}
-
-
-static void LoadInternalTape(Z80 *z80)
-{
- memcpy(mem+0x4009,tape_image,tape_len);
-}
-
-
-static void LoadExternalTape(FILE *tape, Z80 *z80)
-{
- int c;
- Z80Byte *a;
-
- a=mem+0x4009;
-
- while((c=getc(tape))!=EOF)
- {
- *a++=c;
- }
-}
-
-
-static void DrawScreen(Z80 *z80)
-{
- Z80Byte *scr=mem+WORD(DFILE);
- int x,y;
-
- x=0;
- y=0;
-
- while(y<TXT_H)
- {
- scr++;
- x=0;
-
- while((*scr!=118)&&(x<TXT_W))
- {
- Z80Byte ch = *scr++;
-
- if (ch&0x80)
- {
- screen[x+y*32]=(ch&0x3f)|0x40;
- }
- else
- {
- screen[x+y*32]=(ch&0x3f);
- }
-
- x++;
- }
-
- y++;
- }
-}
-
-
-static void DrawSnow(Z80 *z80)
-{
- uint16 *s;
- int f;
-
- s = screen;
-
- for(f=0;f<TXT_W*TXT_H;f++)
- {
- *s++=8;
- }
-}
-
-
-/* Perform ZX81 housekeeping functions like updating FRAMES and updating LASTK
-*/
-static void ZX81HouseKeeping(Z80 *z80)
-{
- static unsigned prev_lk1,prev_lk2;
- unsigned row;
- unsigned lastk1;
- unsigned lastk2;
-
- /* British ZX81
- */
- mem[MARGIN]=55;
-
- /* Update FRAMES
- */
- if (FRAME_TSTATES==SLOW_TSTATES)
- {
- Z80Word frame=PEEKW(FRAMES)&0x7fff;
-
- if (frame)
- {
- frame--;
- }
-
- POKEW(FRAMES,frame|0x8000);
- }
-
- if (!started)
- {
- prev_lk1=0;
- prev_lk2=0;
- return;
- }
-
- /* Update LASTK
- */
- lastk1=0;
- lastk2=0;
-
- for(row=0;row<8;row++)
- {
- unsigned b;
-
- b=(~matrix[row]&0x1f)<<1;
-
- if (row==0)
- {
- unsigned shift;
-
- shift=b&2;
- b&=~2;
- b|=(shift>>1);
- }
-
- if (b)
- {
- if (b>1)
- {
- lastk1|=(1<<row);
- }
-
- lastk2|=b;
- }
- }
-
- if (lastk1 && (lastk1!=prev_lk1 || lastk2!=prev_lk2))
- {
- mem[CDFLAG]|=1;
- }
- else
- {
- mem[CDFLAG]&=~1;
- }
-
- mem[LASTK1]=lastk1^0xff;
- mem[LASTK2]=lastk2^0xff;
-
- prev_lk1=lastk1;
- prev_lk2=lastk2;
-}
-
-
-static int CheckTimers(Z80 *z80, Z80Val val)
-{
- if (val>=FRAME_TSTATES)
- {
- Z80ResetCycles(z80,val-FRAME_TSTATES);
-
- if (started && ((mem[CDFLAG] & 0x80) || waitkey))
- {
- DrawScreen(z80);
- FRAME_TSTATES=SLOW_TSTATES;
- }
- else
- {
- DrawSnow(z80);
- FRAME_TSTATES=FAST_TSTATES;
- }
-
- /* Update FRAMES (if in SLOW) and scan the keyboard. This only happens
- once we've got to a decent point in the boot cycle (detected with
- a valid stack pointer).
- */
- if (z80->SP<0x8000)
- {
- ZX81HouseKeeping(z80);
- }
-
- swiWaitForVBlank();
-
- return FALSE;
- }
- else
- {
- return TRUE;
- }
-}
-
-
-static int EDCallback(Z80 *z80, Z80Val data)
-{
- Z80Word pause;
-
- switch((Z80Byte)data)
- {
- case ED_SAVE:
- break;
-
- case ED_LOAD:
- /* Try and load the external file if a name given. Otherwise, we
- try the internal one. Some of this is slightly dodgy -- it was
- never intended for the emulator to be doing any GUI related
- nonsense (like the alerts) but simply emulating.
- */
- if (enable_filesystem && z80->DE.w<0x8000)
- {
- FILE *fp;
-
- if ((fp=OpenTapeFile(z80->DE.w)))
- {
- LoadExternalTape(fp,z80);
- fclose(fp);
- }
- else
- {
- GUI_Alert(FALSE,"Couldn't open tape");
- SK_DisplayKeyboard(BG_GFX_SUB);
- }
- }
- else
- {
- if (tape_image)
- {
- LoadInternalTape(z80);
- }
- else
- {
- GUI_Alert(FALSE,"No tape image selected");
- SK_DisplayKeyboard(BG_GFX_SUB);
- }
- }
-
- mem[CDFLAG]=0xc0;
- break;
-
- case ED_WAITKEY:
- waitkey=TRUE;
- started=TRUE;
- break;
-
- case ED_ENDWAITKEY:
- waitkey=FALSE;
- break;
-
- case ED_PAUSE:
- waitkey=TRUE;
-
- pause=z80->BC.w;
-
- while(pause-- && !(mem[CDFLAG]&1))
- {
- SoftKeyEvent ev;
-
- while (SK_GetEvent(&ev))
- {
- ZX81HandleKey(ev.key,ev.pressed);
- }
-
- CheckTimers(z80,FRAME_TSTATES);
- }
-
- waitkey=FALSE;
- break;
-
- default:
- break;
- }
-
- return TRUE;
-}
-
-
-/* ---------------------------------------- EXPORTED INTERFACES
-*/
-void ZX81Init(uint16 *vram, Z80 *z80)
-{
- Z80Word f;
-
- screen = vram;
-
- /* Load the ROM
- */
- memcpy(mem,zx81_bin,ROMLEN);
-
- /* Patch the ROM
- */
- RomPatch();
- Z80LodgeCallback(z80,eZ80_EDHook,EDCallback);
- Z80LodgeCallback(z80,eZ80_Instruction,CheckTimers);
-
- /* Mirror the ROM
- */
- memcpy(mem+ROMLEN,mem,ROMLEN);
-
-
- /* Memory size (16K)
- */
- RAMBOT=0x4000;
- RAMLEN=0x4000;
- RAMTOP=RAMBOT+RAMLEN;
-
- for(f=RAMBOT;f<=RAMTOP;f++)
- mem[f]=0;
-
- for(f=0;f<8;f++)
- matrix[f]=0x1f;
-}
-
-
-void ZX81HandleKey(SoftKey key, int is_pressed)
-{
- if (key<SK_CONFIG)
- {
- if (is_pressed)
- {
- matrix[key_matrix[key].row]&=~key_matrix[key].bit;
- }
- else
- {
- matrix[key_matrix[key].row]|=key_matrix[key].bit;
- }
- }
- else
- {
- /* TODO: Joysticks? */
- }
-}
-
-
-Z80Byte ZX81ReadMem(Z80 *z80, Z80Word addr)
-{
- /* Hopefully by simply returning RET for ULA reads we save a lot of
- ROM patching shenanigans.
- */
- if (addr>0x7fff)
- {
- return 0xc9;
- }
- else
- {
- return mem[addr];
- }
-}
-
-
-void ZX81WriteMem(Z80 *z80, Z80Word addr, Z80Byte val)
-{
- if (addr>=RAMBOT && addr<=RAMTOP)
- {
- mem[addr]=val;
- }
-}
-
-
-Z80Byte ZX81ReadPort(Z80 *z80, Z80Word port)
-{
- Z80Byte b=0;
-
- switch(port&0xff)
- {
- case 0xfe: /* ULA */
- /* Key matrix
- */
- switch(port&0xff00)
- {
- case 0xfe00:
- b=matrix[0];
- break;
- case 0xfd00:
- b=matrix[1];
- break;
- case 0xfb00:
- b=matrix[2];
- break;
- case 0xf700:
- b=matrix[3];
- break;
- case 0xef00:
- b=matrix[4];
- break;
- case 0xdf00:
- b=matrix[5];
- break;
- case 0xbf00:
- b=matrix[6];
- break;
- case 0x7f00:
- b=matrix[7];
- break;
- }
- break;
-
- default:
- break;
- }
-
- return b;
-}
-
-
-void ZX81WritePort(Z80 *z80, Z80Word port, Z80Byte val)
-{
- switch(port&0xff)
- {
- case 0xfd:
- break;
-
- case 0xfe:
- break;
- }
-}
-
-
-void ZX81Reset(Z80 *z80)
-{
- int f;
-
- for(f=0;f<8;f++)
- matrix[f]=0x1f;
-
- Z80Reset(z80);
- Z80ResetCycles(z80,0);
-
- started=FALSE;
-}
-
-
-void ZX81EnableFileSystem(int enable)
-{
- enable_filesystem=enable;
-}
-
-
-void ZX81SetTape(const Z80Byte *image, int len)
-{
- tape_image=image;
- tape_len=len;
-}
-
-
-void ZX81DisplayString(const char *p)
-{
- uint16 *s;
- uint16 inv=0;
- int f;
-
- s = screen;
-
- for(f=0;f<TXT_W*TXT_H;f++)
- {
- *s++=0;
- }
-
- s = screen;
- f = 0;
-
- while(*p)
- {
- switch(*p)
- {
- case '\n':
- s+=32;
- f=0;
- break;
-
- case '%':
- inv^=0x40;
- break;
-
- default:
- s[f++]=FromASCII(*p)|inv;
- break;
- }
-
- p++;
- }
-}
-
-
-/* END OF FILE */