diff options
Diffstat (limited to 'arm9/source')
| -rw-r--r-- | arm9/source/framebuffer.c | 276 | ||||
| -rw-r--r-- | arm9/source/gui.c | 193 | ||||
| -rw-r--r-- | arm9/source/keyboard.c | 353 | ||||
| -rw-r--r-- | arm9/source/main.c | 553 | ||||
| -rw-r--r-- | arm9/source/tapes.c | 278 | ||||
| -rw-r--r-- | arm9/source/z80.c | 331 | ||||
| -rw-r--r-- | arm9/source/z80_decode.c | 2533 | ||||
| -rw-r--r-- | arm9/source/z80_dis.c | 2494 | ||||
| -rw-r--r-- | arm9/source/zx81.c | 792 | 
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 */ | 
