mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 07:17:45 -04:00
basic psp snd + cz80
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@280 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
8ab3e3c1cf
commit
a4221917e1
16 changed files with 5127 additions and 62 deletions
460
cpu/cz80/cz80.c
Normal file
460
cpu/cz80/cz80.c
Normal file
|
@ -0,0 +1,460 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* CZ80 (Z80 CPU emulator) version 0.9
|
||||
* Compiled with Dev-C++
|
||||
* Copyright 2004-2005 St駱hane Dallongeville
|
||||
*
|
||||
* (Modified by NJ)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include "cz80.h"
|
||||
|
||||
#ifndef ALIGN_DATA
|
||||
#define ALIGN_DATA __attribute__((aligned(4)))
|
||||
#endif
|
||||
|
||||
#define CF 0x01
|
||||
#define NF 0x02
|
||||
#define PF 0x04
|
||||
#define VF PF
|
||||
#define XF 0x08
|
||||
#define HF 0x10
|
||||
#define YF 0x20
|
||||
#define ZF 0x40
|
||||
#define SF 0x80
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
マクロ
|
||||
******************************************************************************/
|
||||
|
||||
#include "cz80macro.h"
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
グローバル構造体
|
||||
******************************************************************************/
|
||||
|
||||
cz80_struc ALIGN_DATA CZ80;
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
ローカル変数
|
||||
******************************************************************************/
|
||||
|
||||
static UINT8 ALIGN_DATA cz80_bad_address[1 << CZ80_FETCH_SFT];
|
||||
|
||||
static UINT8 ALIGN_DATA SZ[256];
|
||||
static UINT8 ALIGN_DATA SZP[256];
|
||||
static UINT8 ALIGN_DATA SZ_BIT[256];
|
||||
static UINT8 ALIGN_DATA SZHV_inc[256];
|
||||
static UINT8 ALIGN_DATA SZHV_dec[256];
|
||||
#if CZ80_BIG_FLAGS_ARRAY
|
||||
static UINT8 ALIGN_DATA SZHVC_add[2*256*256];
|
||||
static UINT8 ALIGN_DATA SZHVC_sub[2*256*256];
|
||||
#endif
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
ローカル関数
|
||||
******************************************************************************/
|
||||
|
||||
/*--------------------------------------------------------
|
||||
割り込みコールバック
|
||||
--------------------------------------------------------*/
|
||||
|
||||
static INT32 Cz80_Interrupt_Callback(INT32 line)
|
||||
{
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
CZ80インタフェース関数
|
||||
******************************************************************************/
|
||||
|
||||
/*--------------------------------------------------------
|
||||
CPU初期化
|
||||
--------------------------------------------------------*/
|
||||
|
||||
void Cz80_Init(cz80_struc *CPU)
|
||||
{
|
||||
UINT32 i, j, p;
|
||||
#if CZ80_BIG_FLAGS_ARRAY
|
||||
int oldval, newval, val;
|
||||
UINT8 *padd, *padc, *psub, *psbc;
|
||||
#endif
|
||||
|
||||
memset(CPU, 0, sizeof(cz80_struc));
|
||||
|
||||
memset(cz80_bad_address, 0xff, sizeof(cz80_bad_address));
|
||||
|
||||
for (i = 0; i < CZ80_FETCH_BANK; i++)
|
||||
{
|
||||
CPU->Fetch[i] = (UINT32)cz80_bad_address;
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
CPU->OPFetch[i] = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
// flags tables initialisation
|
||||
for (i = 0; i < 256; i++)
|
||||
{
|
||||
SZ[i] = i & (SF | YF | XF);
|
||||
if (!i) SZ[i] |= ZF;
|
||||
|
||||
SZ_BIT[i] = i & (SF | YF | XF);
|
||||
if (!i) SZ_BIT[i] |= ZF | PF;
|
||||
|
||||
for (j = 0, p = 0; j < 8; j++) if (i & (1 << j)) p++;
|
||||
SZP[i] = SZ[i];
|
||||
if (!(p & 1)) SZP[i] |= PF;
|
||||
|
||||
SZHV_inc[i] = SZ[i];
|
||||
if(i == 0x80) SZHV_inc[i] |= VF;
|
||||
if((i & 0x0f) == 0x00) SZHV_inc[i] |= HF;
|
||||
|
||||
SZHV_dec[i] = SZ[i] | NF;
|
||||
if (i == 0x7f) SZHV_dec[i] |= VF;
|
||||
if ((i & 0x0f) == 0x0f) SZHV_dec[i] |= HF;
|
||||
}
|
||||
|
||||
#if CZ80_BIG_FLAGS_ARRAY
|
||||
padd = &SZHVC_add[ 0*256];
|
||||
padc = &SZHVC_add[256*256];
|
||||
psub = &SZHVC_sub[ 0*256];
|
||||
psbc = &SZHVC_sub[256*256];
|
||||
|
||||
for (oldval = 0; oldval < 256; oldval++)
|
||||
{
|
||||
for (newval = 0; newval < 256; newval++)
|
||||
{
|
||||
/* add or adc w/o carry set */
|
||||
val = newval - oldval;
|
||||
*padd = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
|
||||
*padd |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */
|
||||
if ((newval & 0x0f) < (oldval & 0x0f)) *padd |= HF;
|
||||
if (newval < oldval ) *padd |= CF;
|
||||
if ((val ^ oldval ^ 0x80) & (val ^ newval) & 0x80) *padd |= VF;
|
||||
padd++;
|
||||
|
||||
/* adc with carry set */
|
||||
val = newval - oldval - 1;
|
||||
*padc = (newval) ? ((newval & 0x80) ? SF : 0) : ZF;
|
||||
*padc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */
|
||||
if ((newval & 0x0f) <= (oldval & 0x0f)) *padc |= HF;
|
||||
if (newval <= oldval) *padc |= CF;
|
||||
if ((val ^ oldval ^ 0x80) & (val ^ newval) & 0x80) *padc |= VF;
|
||||
padc++;
|
||||
|
||||
/* cp, sub or sbc w/o carry set */
|
||||
val = oldval - newval;
|
||||
*psub = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
|
||||
*psub |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */
|
||||
if ((newval & 0x0f) > (oldval & 0x0f)) *psub |= HF;
|
||||
if (newval > oldval) *psub |= CF;
|
||||
if ((val^oldval) & (oldval^newval) & 0x80) *psub |= VF;
|
||||
psub++;
|
||||
|
||||
/* sbc with carry set */
|
||||
val = oldval - newval - 1;
|
||||
*psbc = NF | ((newval) ? ((newval & 0x80) ? SF : 0) : ZF);
|
||||
*psbc |= (newval & (YF | XF)); /* undocumented flag bits 5+3 */
|
||||
if ((newval & 0x0f) >= (oldval & 0x0f)) *psbc |= HF;
|
||||
if (newval >= oldval) *psbc |= CF;
|
||||
if ((val ^ oldval) & (oldval^newval) & 0x80) *psbc |= VF;
|
||||
psbc++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
CPU->pzR8[0] = &zB;
|
||||
CPU->pzR8[1] = &zC;
|
||||
CPU->pzR8[2] = &zD;
|
||||
CPU->pzR8[3] = &zE;
|
||||
CPU->pzR8[4] = &zH;
|
||||
CPU->pzR8[5] = &zL;
|
||||
CPU->pzR8[6] = &zF; // 処理の都合上、Aと入れ替え
|
||||
CPU->pzR8[7] = &zA; // 処理の都合上、Fと入れ替え
|
||||
|
||||
CPU->pzR16[0] = pzBC;
|
||||
CPU->pzR16[1] = pzDE;
|
||||
CPU->pzR16[2] = pzHL;
|
||||
CPU->pzR16[3] = pzAF;
|
||||
|
||||
zIX = zIY = 0xffff;
|
||||
zF = ZF;
|
||||
|
||||
CPU->Interrupt_Callback = Cz80_Interrupt_Callback;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
CPUリセット
|
||||
--------------------------------------------------------*/
|
||||
|
||||
void Cz80_Reset(cz80_struc *CPU)
|
||||
{
|
||||
memset(CPU, 0, (INT32)&CPU->BasePC - (INT32)CPU);
|
||||
Cz80_Set_Reg(CPU, CZ80_PC, 0);
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
CPU実行
|
||||
--------------------------------------------------------*/
|
||||
|
||||
INT32 Cz80_Exec(cz80_struc *CPU, INT32 cycles)
|
||||
{
|
||||
#if CZ80_USE_JUMPTABLE
|
||||
#include "cz80jmp.c"
|
||||
#endif
|
||||
|
||||
UINT32 PC;
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
INT32 OPBase;
|
||||
#endif
|
||||
UINT32 Opcode;
|
||||
UINT32 adr = 0;
|
||||
UINT32 res;
|
||||
UINT32 val;
|
||||
int afterEI = 0;
|
||||
|
||||
PC = CPU->PC;
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
OPBase = CPU->OPBase;
|
||||
#endif
|
||||
CPU->ICount = cycles - CPU->ExtraCycles;
|
||||
CPU->ExtraCycles = 0;
|
||||
|
||||
if (!CPU->HaltState)
|
||||
{
|
||||
Cz80_Exec:
|
||||
if (CPU->ICount > 0)
|
||||
{
|
||||
union16 *data = pzHL;
|
||||
Opcode = READ_OP();
|
||||
#if CZ80_EMULATE_R_EXACTLY
|
||||
zR++;
|
||||
#endif
|
||||
#include "cz80_op.c"
|
||||
}
|
||||
|
||||
if (afterEI)
|
||||
{
|
||||
afterEI = 0;
|
||||
Cz80_Check_Interrupt:
|
||||
CHECK_INT
|
||||
goto Cz80_Exec;
|
||||
}
|
||||
}
|
||||
else CPU->ICount = 0;
|
||||
|
||||
Cz80_Exec_End:
|
||||
CPU->PC = PC;
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
CPU->OPBase = OPBase;
|
||||
#endif
|
||||
cycles -= CPU->ICount;
|
||||
#if !CZ80_EMULATE_R_EXACTLY
|
||||
zR = (zR + (cycles >> 2)) & 0x7f;
|
||||
#endif
|
||||
|
||||
return cycles;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
割り込み処理
|
||||
--------------------------------------------------------*/
|
||||
|
||||
void Cz80_Set_IRQ(cz80_struc *CPU, INT32 line, INT32 state)
|
||||
{
|
||||
if (line == IRQ_LINE_NMI)
|
||||
{
|
||||
zIFF1 = 0;
|
||||
CPU->ExtraCycles += 11;
|
||||
CPU->HaltState = 0;
|
||||
PUSH_16(CPU->PC - CPU->BasePC)
|
||||
Cz80_Set_Reg(CPU, CZ80_PC, 0x66);
|
||||
}
|
||||
else
|
||||
{
|
||||
CPU->IRQState = state;
|
||||
|
||||
if (state != CLEAR_LINE)
|
||||
{
|
||||
UINT32 PC = CPU->PC;
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
INT32 OPBase = CPU->OPBase;
|
||||
#endif
|
||||
|
||||
CPU->IRQLine = line;
|
||||
CHECK_INT
|
||||
CPU->PC = PC;
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
CPU->OPBase = OPBase;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
レジスタ取得
|
||||
--------------------------------------------------------*/
|
||||
|
||||
UINT32 Cz80_Get_Reg(cz80_struc *CPU, INT32 regnum)
|
||||
{
|
||||
switch (regnum)
|
||||
{
|
||||
case CZ80_PC: return (CPU->PC - CPU->BasePC);
|
||||
case CZ80_SP: return zSP;
|
||||
case CZ80_AF: return zAF;
|
||||
case CZ80_BC: return zBC;
|
||||
case CZ80_DE: return zDE;
|
||||
case CZ80_HL: return zHL;
|
||||
case CZ80_IX: return zIX;
|
||||
case CZ80_IY: return zIY;
|
||||
case CZ80_AF2: return zAF2;
|
||||
case CZ80_BC2: return zBC2;
|
||||
case CZ80_DE2: return zDE2;
|
||||
case CZ80_HL2: return zHL2;
|
||||
case CZ80_R: return zR;
|
||||
case CZ80_I: return zI;
|
||||
case CZ80_IM: return zIM;
|
||||
case CZ80_IFF1: return zIFF1;
|
||||
case CZ80_IFF2: return zIFF2;
|
||||
case CZ80_HALT: return CPU->HaltState;
|
||||
case CZ80_IRQ: return CPU->IRQState;
|
||||
default: return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
レジスタ設定
|
||||
--------------------------------------------------------*/
|
||||
|
||||
void Cz80_Set_Reg(cz80_struc *CPU, INT32 regnum, UINT32 val)
|
||||
{
|
||||
switch (regnum)
|
||||
{
|
||||
case CZ80_PC:
|
||||
CPU->BasePC = CPU->Fetch[val >> CZ80_FETCH_SFT];
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
CPU->OPBase = CPU->OPFetch[val >> CZ80_FETCH_SFT];
|
||||
#endif
|
||||
CPU->PC = val + CPU->BasePC;
|
||||
break;
|
||||
|
||||
case CZ80_SP: zSP = val; break;
|
||||
case CZ80_AF: zAF = val; break;
|
||||
case CZ80_BC: zBC = val; break;
|
||||
case CZ80_DE: zDE = val; break;
|
||||
case CZ80_HL: zHL = val; break;
|
||||
case CZ80_IX: zIX = val; break;
|
||||
case CZ80_IY: zIY = val; break;
|
||||
case CZ80_AF2: zAF2 = val; break;
|
||||
case CZ80_BC2: zBC2 = val; break;
|
||||
case CZ80_DE2: zDE2 = val; break;
|
||||
case CZ80_HL2: zHL2 = val; break;
|
||||
case CZ80_R: zR = val; break;
|
||||
case CZ80_I: zI = val; break;
|
||||
case CZ80_IM: zIM = val; break;
|
||||
case CZ80_IFF1: zIFF1 = val; break;
|
||||
case CZ80_IFF2: zIFF2 = val; break;
|
||||
case CZ80_HALT: CPU->HaltState = val; break;
|
||||
case CZ80_IRQ: CPU->IRQState = val; break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
フェッチアドレス設定
|
||||
--------------------------------------------------------*/
|
||||
|
||||
void Cz80_Set_Fetch(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, UINT32 fetch_adr)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
i = low_adr >> CZ80_FETCH_SFT;
|
||||
j = high_adr >> CZ80_FETCH_SFT;
|
||||
fetch_adr -= i << CZ80_FETCH_SFT;
|
||||
|
||||
while (i <= j)
|
||||
{
|
||||
CPU->Fetch[i] = fetch_adr;
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
CPU->OPFetch[i] = 0;
|
||||
#endif
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
フェッチアドレス設定 (暗号化ROM対応)
|
||||
--------------------------------------------------------*/
|
||||
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
void Cz80_Set_Encrypt_Range(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, UINT32 decrypted_rom)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
i = low_adr >> CZ80_FETCH_SFT;
|
||||
j = high_adr >> CZ80_FETCH_SFT;
|
||||
decrypted_rom -= i << CZ80_FETCH_SFT;
|
||||
|
||||
while (i <= j)
|
||||
{
|
||||
CPU->OPFetch[i] = (INT32)decrypted_rom - (INT32)CPU->Fetch[i];
|
||||
i++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
メモリリード/ライト関数設定
|
||||
--------------------------------------------------------*/
|
||||
|
||||
void Cz80_Set_ReadB(cz80_struc *CPU, UINT8 (*Func)(UINT32 address))
|
||||
{
|
||||
CPU->Read_Byte = Func;
|
||||
}
|
||||
|
||||
void Cz80_Set_WriteB(cz80_struc *CPU, void (*Func)(UINT32 address, UINT8 data))
|
||||
{
|
||||
CPU->Write_Byte = Func;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
ポートリード/ライト関数設定
|
||||
--------------------------------------------------------*/
|
||||
|
||||
void Cz80_Set_INPort(cz80_struc *CPU, UINT8 (*Func)(UINT16 port))
|
||||
{
|
||||
CPU->IN_Port = Func;
|
||||
}
|
||||
|
||||
void Cz80_Set_OUTPort(cz80_struc *CPU, void (*Func)(UINT16 port, UINT8 value))
|
||||
{
|
||||
CPU->OUT_Port = Func;
|
||||
}
|
||||
|
||||
|
||||
/*--------------------------------------------------------
|
||||
コールバック関数設定
|
||||
--------------------------------------------------------*/
|
||||
|
||||
void Cz80_Set_IRQ_Callback(cz80_struc *CPU, INT32 (*Func)(INT32 irqline))
|
||||
{
|
||||
CPU->Interrupt_Callback = Func;
|
||||
}
|
303
cpu/cz80/cz80.h
Normal file
303
cpu/cz80/cz80.h
Normal file
|
@ -0,0 +1,303 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* CZ80 (Z80 CPU emulator) version 0.9
|
||||
* Compiled with Dev-C++
|
||||
* Copyright 2004-2005 Stéphane Dallongeville
|
||||
*
|
||||
* (Modified by NJ)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef CZ80_H
|
||||
#define CZ80_H
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/******************************/
|
||||
/* Compiler dependant defines */
|
||||
/******************************/
|
||||
|
||||
#ifndef UINT8
|
||||
#define UINT8 unsigned char
|
||||
#endif
|
||||
|
||||
#ifndef INT8
|
||||
#define INT8 char
|
||||
#endif
|
||||
|
||||
#ifndef UINT16
|
||||
#define UINT16 unsigned short
|
||||
#endif
|
||||
|
||||
#ifndef INT16
|
||||
#define INT16 short
|
||||
#endif
|
||||
|
||||
#ifndef UINT32
|
||||
#define UINT32 unsigned int
|
||||
#endif
|
||||
|
||||
#ifndef INT32
|
||||
#define INT32 int
|
||||
#endif
|
||||
|
||||
/*************************************/
|
||||
/* Z80 core Structures & definitions */
|
||||
/*************************************/
|
||||
|
||||
#define CZ80_FETCH_BITS 4 // [4-12] default = 8
|
||||
|
||||
#define CZ80_FETCH_SFT (16 - CZ80_FETCH_BITS)
|
||||
#define CZ80_FETCH_BANK (1 << CZ80_FETCH_BITS)
|
||||
|
||||
#define CZ80_LITTLE_ENDIAN 1
|
||||
#define CZ80_USE_JUMPTABLE 1
|
||||
#define CZ80_BIG_FLAGS_ARRAY 1
|
||||
//#ifdef BUILD_CPS1PSP
|
||||
//#define CZ80_ENCRYPTED_ROM 1
|
||||
//#else
|
||||
#define CZ80_ENCRYPTED_ROM 0
|
||||
//#endif
|
||||
#define CZ80_EMULATE_R_EXACTLY 0
|
||||
|
||||
#define zR8(A) (*CPU->pzR8[A])
|
||||
#define zR16(A) (CPU->pzR16[A]->W)
|
||||
|
||||
#define pzAF &(CPU->AF)
|
||||
#define zAF CPU->AF.W
|
||||
#define zlAF CPU->AF.B.L
|
||||
#define zhAF CPU->AF.B.H
|
||||
#define zA zhAF
|
||||
#define zF zlAF
|
||||
|
||||
#define pzBC &(CPU->BC)
|
||||
#define zBC CPU->BC.W
|
||||
#define zlBC CPU->BC.B.L
|
||||
#define zhBC CPU->BC.B.H
|
||||
#define zB zhBC
|
||||
#define zC zlBC
|
||||
|
||||
#define pzDE &(CPU->DE)
|
||||
#define zDE CPU->DE.W
|
||||
#define zlDE CPU->DE.B.L
|
||||
#define zhDE CPU->DE.B.H
|
||||
#define zD zhDE
|
||||
#define zE zlDE
|
||||
|
||||
#define pzHL &(CPU->HL)
|
||||
#define zHL CPU->HL.W
|
||||
#define zlHL CPU->HL.B.L
|
||||
#define zhHL CPU->HL.B.H
|
||||
#define zH zhHL
|
||||
#define zL zlHL
|
||||
|
||||
#define zAF2 CPU->AF2.W
|
||||
#define zlAF2 CPU->AF2.B.L
|
||||
#define zhAF2 CPU->AF2.B.H
|
||||
#define zA2 zhAF2
|
||||
#define zF2 zlAF2
|
||||
|
||||
#define zBC2 CPU->BC2.W
|
||||
#define zDE2 CPU->DE2.W
|
||||
#define zHL2 CPU->HL2.W
|
||||
|
||||
#define pzIX &(CPU->IX)
|
||||
#define zIX CPU->IX.W
|
||||
#define zlIX CPU->IX.B.L
|
||||
#define zhIX CPU->IX.B.H
|
||||
|
||||
#define pzIY &(CPU->IY)
|
||||
#define zIY CPU->IY.W
|
||||
#define zlIY CPU->IY.B.L
|
||||
#define zhIY CPU->IY.B.H
|
||||
|
||||
#define pzSP &(CPU->SP)
|
||||
#define zSP CPU->SP.W
|
||||
#define zlSP CPU->SP.B.L
|
||||
#define zhSP CPU->SP.B.H
|
||||
|
||||
#define zRealPC (PC - CPU->BasePC)
|
||||
#define zPC PC
|
||||
|
||||
#define zI CPU->I
|
||||
#define zIM CPU->IM
|
||||
|
||||
#define zwR CPU->R.W
|
||||
#define zR1 CPU->R.B.L
|
||||
#define zR2 CPU->R.B.H
|
||||
#define zR zR1
|
||||
|
||||
#define zIFF CPU->IFF.W
|
||||
#define zIFF1 CPU->IFF.B.L
|
||||
#define zIFF2 CPU->IFF.B.H
|
||||
|
||||
#define CZ80_SF_SFT 7
|
||||
#define CZ80_ZF_SFT 6
|
||||
#define CZ80_YF_SFT 5
|
||||
#define CZ80_HF_SFT 4
|
||||
#define CZ80_XF_SFT 3
|
||||
#define CZ80_PF_SFT 2
|
||||
#define CZ80_VF_SFT 2
|
||||
#define CZ80_NF_SFT 1
|
||||
#define CZ80_CF_SFT 0
|
||||
|
||||
#define CZ80_SF (1 << CZ80_SF_SFT)
|
||||
#define CZ80_ZF (1 << CZ80_ZF_SFT)
|
||||
#define CZ80_YF (1 << CZ80_YF_SFT)
|
||||
#define CZ80_HF (1 << CZ80_HF_SFT)
|
||||
#define CZ80_XF (1 << CZ80_XF_SFT)
|
||||
#define CZ80_PF (1 << CZ80_PF_SFT)
|
||||
#define CZ80_VF (1 << CZ80_VF_SFT)
|
||||
#define CZ80_NF (1 << CZ80_NF_SFT)
|
||||
#define CZ80_CF (1 << CZ80_CF_SFT)
|
||||
|
||||
#define CZ80_IFF_SFT CZ80_PF_SFT
|
||||
#define CZ80_IFF CZ80_PF
|
||||
|
||||
#ifndef IRQ_LINE_STATE
|
||||
#define IRQ_LINE_STATE
|
||||
#define CLEAR_LINE 0 /* clear (a fired, held or pulsed) line */
|
||||
#define ASSERT_LINE 1 /* assert an interrupt immediately */
|
||||
#define HOLD_LINE 2 /* hold interrupt line until acknowledged */
|
||||
#define PULSE_LINE 3 /* pulse interrupt line for one instruction */
|
||||
#define IRQ_LINE_NMI 127 /* IRQ line for NMIs */
|
||||
#endif
|
||||
|
||||
enum
|
||||
{
|
||||
CZ80_PC = 1,
|
||||
CZ80_SP,
|
||||
CZ80_AF,
|
||||
CZ80_BC,
|
||||
CZ80_DE,
|
||||
CZ80_HL,
|
||||
CZ80_IX,
|
||||
CZ80_IY,
|
||||
CZ80_AF2,
|
||||
CZ80_BC2,
|
||||
CZ80_DE2,
|
||||
CZ80_HL2,
|
||||
CZ80_R,
|
||||
CZ80_I,
|
||||
CZ80_IM,
|
||||
CZ80_IFF1,
|
||||
CZ80_IFF2,
|
||||
CZ80_HALT,
|
||||
CZ80_IRQ
|
||||
};
|
||||
|
||||
typedef union
|
||||
{
|
||||
struct
|
||||
{
|
||||
#if CZ80_LITTLE_ENDIAN
|
||||
UINT8 L;
|
||||
UINT8 H;
|
||||
#else
|
||||
UINT8 H;
|
||||
UINT8 L;
|
||||
#endif
|
||||
} B;
|
||||
UINT16 W;
|
||||
} union16;
|
||||
|
||||
typedef struct cz80_t
|
||||
{
|
||||
union
|
||||
{
|
||||
UINT8 r8[8];
|
||||
union16 r16[4];
|
||||
struct
|
||||
{
|
||||
union16 BC;
|
||||
union16 DE;
|
||||
union16 HL;
|
||||
union16 AF;
|
||||
};
|
||||
};
|
||||
|
||||
union16 IX;
|
||||
union16 IY;
|
||||
union16 SP;
|
||||
UINT32 PC;
|
||||
|
||||
union16 BC2;
|
||||
union16 DE2;
|
||||
union16 HL2;
|
||||
union16 AF2;
|
||||
|
||||
union16 R;
|
||||
union16 IFF;
|
||||
|
||||
UINT8 I;
|
||||
UINT8 IM;
|
||||
UINT8 HaltState;
|
||||
UINT8 dummy;
|
||||
|
||||
INT32 IRQLine;
|
||||
INT32 IRQState;
|
||||
INT32 ICount;
|
||||
INT32 ExtraCycles;
|
||||
|
||||
UINT32 BasePC;
|
||||
UINT32 Fetch[CZ80_FETCH_BANK];
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
INT32 OPBase;
|
||||
INT32 OPFetch[CZ80_FETCH_BANK];
|
||||
#endif
|
||||
|
||||
UINT8 *pzR8[8];
|
||||
union16 *pzR16[4];
|
||||
|
||||
UINT8 (*Read_Byte)(UINT32 address);
|
||||
void (*Write_Byte)(UINT32 address, UINT8 data);
|
||||
|
||||
UINT8 (*IN_Port)(UINT16 port);
|
||||
void (*OUT_Port)(UINT16 port, UINT8 value);
|
||||
|
||||
INT32 (*Interrupt_Callback)(INT32 irqline);
|
||||
|
||||
} cz80_struc;
|
||||
|
||||
|
||||
/*************************/
|
||||
/* Publics Z80 variables */
|
||||
/*************************/
|
||||
|
||||
extern cz80_struc CZ80;
|
||||
|
||||
/*************************/
|
||||
/* Publics Z80 functions */
|
||||
/*************************/
|
||||
|
||||
void Cz80_Init(cz80_struc *CPU);
|
||||
|
||||
void Cz80_Reset(cz80_struc *CPU);
|
||||
|
||||
INT32 Cz80_Exec(cz80_struc *CPU, INT32 cycles);
|
||||
|
||||
void Cz80_Set_IRQ(cz80_struc *CPU, INT32 line, INT32 state);
|
||||
|
||||
UINT32 Cz80_Get_Reg(cz80_struc *CPU, INT32 regnum);
|
||||
void Cz80_Set_Reg(cz80_struc *CPU, INT32 regnum, UINT32 value);
|
||||
|
||||
void Cz80_Set_Fetch(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, UINT32 fetch_adr);
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
void Cz80_Set_Encrypt_Range(cz80_struc *CPU, UINT32 low_adr, UINT32 high_adr, UINT32 decrypted_rom);
|
||||
#endif
|
||||
|
||||
void Cz80_Set_ReadB(cz80_struc *CPU, UINT8 (*Func)(UINT32 address));
|
||||
void Cz80_Set_WriteB(cz80_struc *CPU, void (*Func)(UINT32 address, UINT8 data));
|
||||
|
||||
void Cz80_Set_INPort(cz80_struc *CPU, UINT8 (*Func)(UINT16 port));
|
||||
void Cz80_Set_OUTPort(cz80_struc *CPU, void (*Func)(UINT16 port, UINT8 value));
|
||||
|
||||
void Cz80_Set_IRQ_Callback(cz80_struc *CPU, INT32 (*Func)(INT32 irqline));
|
||||
|
||||
#ifdef __cplusplus
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* CZ80_H */
|
1145
cpu/cz80/cz80_op.c
Normal file
1145
cpu/cz80/cz80_op.c
Normal file
File diff suppressed because it is too large
Load diff
470
cpu/cz80/cz80_opCB.c
Normal file
470
cpu/cz80/cz80_opCB.c
Normal file
|
@ -0,0 +1,470 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* CZ80 CB opcode include source file
|
||||
* CZ80 emulator version 0.9
|
||||
* Copyright 2004-2005 Stéphane Dallongeville
|
||||
*
|
||||
* (Modified by NJ)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if CZ80_USE_JUMPTABLE
|
||||
goto *JumpTableCB[Opcode];
|
||||
#else
|
||||
switch (Opcode)
|
||||
{
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------
|
||||
RLC
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x00): // RLC B
|
||||
OPCB(0x01): // RLC C
|
||||
OPCB(0x02): // RLC D
|
||||
OPCB(0x03): // RLC E
|
||||
OPCB(0x04): // RLC H
|
||||
OPCB(0x05): // RLC L
|
||||
OPCB(0x07): // RLC A
|
||||
src = zR8(Opcode);
|
||||
res = (src << 1) | (src >> 7);
|
||||
zF = SZP[res] | (src >> 7);
|
||||
zR8(Opcode) = res;
|
||||
RET(8)
|
||||
|
||||
OPCB(0x06): // RLC (HL)
|
||||
adr = zHL;
|
||||
src = READ_MEM8(adr);
|
||||
res = (src << 1) | (src >> 7);
|
||||
zF = SZP[res] | (src >> 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
RRC
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x08): // RRC B
|
||||
OPCB(0x09): // RRC C
|
||||
OPCB(0x0a): // RRC D
|
||||
OPCB(0x0b): // RRC E
|
||||
OPCB(0x0c): // RRC H
|
||||
OPCB(0x0d): // RRC L
|
||||
OPCB(0x0f): // RRC A
|
||||
src = zR8(Opcode & 7);
|
||||
res = (src >> 1) | (src << 7);
|
||||
zF = SZP[res] | (src & CF);
|
||||
zR8(Opcode & 7) = res;
|
||||
RET(8)
|
||||
|
||||
OPCB(0x0e): // RRC (HL)
|
||||
adr = zHL;
|
||||
src = READ_MEM8(adr);
|
||||
res = (src >> 1) | (src << 7);
|
||||
zF = SZP[res] | (src & CF);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
RL
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x10): // RL B
|
||||
OPCB(0x11): // RL C
|
||||
OPCB(0x12): // RL D
|
||||
OPCB(0x13): // RL E
|
||||
OPCB(0x14): // RL H
|
||||
OPCB(0x15): // RL L
|
||||
OPCB(0x17): // RL A
|
||||
src = zR8(Opcode & 7);
|
||||
res = (src << 1) | (zF & CF);
|
||||
zF = SZP[res] | (src >> 7);
|
||||
zR8(Opcode & 7) = res;
|
||||
RET(8)
|
||||
|
||||
OPCB(0x16): // RL (HL)
|
||||
adr = zHL;
|
||||
src = READ_MEM8(adr);
|
||||
res = (src << 1) | (zF & CF);
|
||||
zF = SZP[res] | (src >> 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
RR
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x18): // RR B
|
||||
OPCB(0x19): // RR C
|
||||
OPCB(0x1a): // RR D
|
||||
OPCB(0x1b): // RR E
|
||||
OPCB(0x1c): // RR H
|
||||
OPCB(0x1d): // RR L
|
||||
OPCB(0x1f): // RR A
|
||||
src = zR8(Opcode & 7);
|
||||
res = (src >> 1) | (zF << 7);
|
||||
zF = SZP[res] | (src & CF);
|
||||
zR8(Opcode & 7) = res;
|
||||
RET(8)
|
||||
|
||||
OPCB(0x1e): // RR (HL)
|
||||
adr = zHL;
|
||||
src = READ_MEM8(adr);
|
||||
res = (src >> 1) | (zF << 7);
|
||||
zF = SZP[res] | (src & CF);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
SLA
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x20): // SLA B
|
||||
OPCB(0x21): // SLA C
|
||||
OPCB(0x22): // SLA D
|
||||
OPCB(0x23): // SLA E
|
||||
OPCB(0x24): // SLA H
|
||||
OPCB(0x25): // SLA L
|
||||
OPCB(0x27): // SLA A
|
||||
src = zR8(Opcode & 7);
|
||||
res = src << 1;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
zR8(Opcode & 7) = res;
|
||||
RET(8)
|
||||
|
||||
OPCB(0x26): // SLA (HL)
|
||||
adr = zHL;
|
||||
src = READ_MEM8(adr);
|
||||
res = src << 1;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
SRA
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x28): // SRA B
|
||||
OPCB(0x29): // SRA C
|
||||
OPCB(0x2a): // SRA D
|
||||
OPCB(0x2b): // SRA E
|
||||
OPCB(0x2c): // SRA H
|
||||
OPCB(0x2d): // SRA L
|
||||
OPCB(0x2f): // SRA A
|
||||
src = zR8(Opcode & 7);
|
||||
res = (src >> 1) | (src & 0x80);
|
||||
zF = SZP[res] | (src & CF);
|
||||
zR8(Opcode & 7) = res;
|
||||
RET(8)
|
||||
|
||||
OPCB(0x2e): // SRA (HL)
|
||||
adr = zHL;
|
||||
src = READ_MEM8(adr);
|
||||
res = (src >> 1) | (src & 0x80);
|
||||
zF = SZP[res] | (src & CF);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
SLL
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x30): // SLL B
|
||||
OPCB(0x31): // SLL C
|
||||
OPCB(0x32): // SLL D
|
||||
OPCB(0x33): // SLL E
|
||||
OPCB(0x34): // SLL H
|
||||
OPCB(0x35): // SLL L
|
||||
OPCB(0x37): // SLL A
|
||||
src = zR8(Opcode & 7);
|
||||
res = (src << 1) | 0x01;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
zR8(Opcode & 7) = res;
|
||||
RET(8)
|
||||
|
||||
OPCB(0x36): // SLL (HL)
|
||||
adr = zHL;
|
||||
src = READ_MEM8(adr);
|
||||
res = (src << 1) | 0x01;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
SRL
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x38): // SRL B
|
||||
OPCB(0x39): // SRL C
|
||||
OPCB(0x3a): // SRL D
|
||||
OPCB(0x3b): // SRL E
|
||||
OPCB(0x3c): // SRL H
|
||||
OPCB(0x3d): // SRL L
|
||||
OPCB(0x3f): // SRL A
|
||||
src = zR8(Opcode & 7);
|
||||
res = src >> 1;
|
||||
zF = SZP[res] | (src & CF);
|
||||
zR8(Opcode & 7) = res;
|
||||
RET(8)
|
||||
|
||||
OPCB(0x3e): // SRL (HL)
|
||||
adr = zHL;
|
||||
src = READ_MEM8(adr);
|
||||
res = src >> 1;
|
||||
zF = SZP[res] | (src & CF);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
BIT
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x40): // BIT 0,B
|
||||
OPCB(0x41): // BIT 0,C
|
||||
OPCB(0x42): // BIT 0,D
|
||||
OPCB(0x43): // BIT 0,E
|
||||
OPCB(0x44): // BIT 0,H
|
||||
OPCB(0x45): // BIT 0,L
|
||||
OPCB(0x47): // BIT 0,A
|
||||
|
||||
OPCB(0x48): // BIT 1,B
|
||||
OPCB(0x49): // BIT 1,C
|
||||
OPCB(0x4a): // BIT 1,D
|
||||
OPCB(0x4b): // BIT 1,E
|
||||
OPCB(0x4c): // BIT 1,H
|
||||
OPCB(0x4d): // BIT 1,L
|
||||
OPCB(0x4f): // BIT 1,A
|
||||
|
||||
OPCB(0x50): // BIT 2,B
|
||||
OPCB(0x51): // BIT 2,C
|
||||
OPCB(0x52): // BIT 2,D
|
||||
OPCB(0x53): // BIT 2,E
|
||||
OPCB(0x54): // BIT 2,H
|
||||
OPCB(0x55): // BIT 2,L
|
||||
OPCB(0x57): // BIT 2,A
|
||||
|
||||
OPCB(0x58): // BIT 3,B
|
||||
OPCB(0x59): // BIT 3,C
|
||||
OPCB(0x5a): // BIT 3,D
|
||||
OPCB(0x5b): // BIT 3,E
|
||||
OPCB(0x5c): // BIT 3,H
|
||||
OPCB(0x5d): // BIT 3,L
|
||||
OPCB(0x5f): // BIT 3,A
|
||||
|
||||
OPCB(0x60): // BIT 4,B
|
||||
OPCB(0x61): // BIT 4,C
|
||||
OPCB(0x62): // BIT 4,D
|
||||
OPCB(0x63): // BIT 4,E
|
||||
OPCB(0x64): // BIT 4,H
|
||||
OPCB(0x65): // BIT 4,L
|
||||
OPCB(0x67): // BIT 4,A
|
||||
|
||||
OPCB(0x68): // BIT 5,B
|
||||
OPCB(0x69): // BIT 5,C
|
||||
OPCB(0x6a): // BIT 5,D
|
||||
OPCB(0x6b): // BIT 5,E
|
||||
OPCB(0x6c): // BIT 5,H
|
||||
OPCB(0x6d): // BIT 5,L
|
||||
OPCB(0x6f): // BIT 5,A
|
||||
|
||||
OPCB(0x70): // BIT 6,B
|
||||
OPCB(0x71): // BIT 6,C
|
||||
OPCB(0x72): // BIT 6,D
|
||||
OPCB(0x73): // BIT 6,E
|
||||
OPCB(0x74): // BIT 6,H
|
||||
OPCB(0x75): // BIT 6,L
|
||||
OPCB(0x77): // BIT 6,A
|
||||
|
||||
OPCB(0x78): // BIT 7,B
|
||||
OPCB(0x79): // BIT 7,C
|
||||
OPCB(0x7a): // BIT 7,D
|
||||
OPCB(0x7b): // BIT 7,E
|
||||
OPCB(0x7c): // BIT 7,H
|
||||
OPCB(0x7d): // BIT 7,L
|
||||
OPCB(0x7f): // BIT 7,A
|
||||
zF = (zF & CF) | HF | SZ_BIT[zR8(Opcode & 7) & (1 << ((Opcode >> 3) & 7))];
|
||||
RET(8)
|
||||
|
||||
OPCB(0x46): // BIT 0,(HL)
|
||||
OPCB(0x4e): // BIT 1,(HL)
|
||||
OPCB(0x56): // BIT 2,(HL)
|
||||
OPCB(0x5e): // BIT 3,(HL)
|
||||
OPCB(0x66): // BIT 4,(HL)
|
||||
OPCB(0x6e): // BIT 5,(HL)
|
||||
OPCB(0x76): // BIT 6,(HL)
|
||||
OPCB(0x7e): // BIT 7,(HL)
|
||||
src = READ_MEM8(zHL);
|
||||
zF = (zF & CF) | HF | SZ_BIT[src & (1 << ((Opcode >> 3) & 7))];
|
||||
RET(12)
|
||||
|
||||
/*-----------------------------------------
|
||||
RES
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0x80): // RES 0,B
|
||||
OPCB(0x81): // RES 0,C
|
||||
OPCB(0x82): // RES 0,D
|
||||
OPCB(0x83): // RES 0,E
|
||||
OPCB(0x84): // RES 0,H
|
||||
OPCB(0x85): // RES 0,L
|
||||
OPCB(0x87): // RES 0,A
|
||||
|
||||
OPCB(0x88): // RES 1,B
|
||||
OPCB(0x89): // RES 1,C
|
||||
OPCB(0x8a): // RES 1,D
|
||||
OPCB(0x8b): // RES 1,E
|
||||
OPCB(0x8c): // RES 1,H
|
||||
OPCB(0x8d): // RES 1,L
|
||||
OPCB(0x8f): // RES 1,A
|
||||
|
||||
OPCB(0x90): // RES 2,B
|
||||
OPCB(0x91): // RES 2,C
|
||||
OPCB(0x92): // RES 2,D
|
||||
OPCB(0x93): // RES 2,E
|
||||
OPCB(0x94): // RES 2,H
|
||||
OPCB(0x95): // RES 2,L
|
||||
OPCB(0x97): // RES 2,A
|
||||
|
||||
OPCB(0x98): // RES 3,B
|
||||
OPCB(0x99): // RES 3,C
|
||||
OPCB(0x9a): // RES 3,D
|
||||
OPCB(0x9b): // RES 3,E
|
||||
OPCB(0x9c): // RES 3,H
|
||||
OPCB(0x9d): // RES 3,L
|
||||
OPCB(0x9f): // RES 3,A
|
||||
|
||||
OPCB(0xa0): // RES 4,B
|
||||
OPCB(0xa1): // RES 4,C
|
||||
OPCB(0xa2): // RES 4,D
|
||||
OPCB(0xa3): // RES 4,E
|
||||
OPCB(0xa4): // RES 4,H
|
||||
OPCB(0xa5): // RES 4,L
|
||||
OPCB(0xa7): // RES 4,A
|
||||
|
||||
OPCB(0xa8): // RES 5,B
|
||||
OPCB(0xa9): // RES 5,C
|
||||
OPCB(0xaa): // RES 5,D
|
||||
OPCB(0xab): // RES 5,E
|
||||
OPCB(0xac): // RES 5,H
|
||||
OPCB(0xad): // RES 5,L
|
||||
OPCB(0xaf): // RES 5,A
|
||||
|
||||
OPCB(0xb0): // RES 6,B
|
||||
OPCB(0xb1): // RES 6,C
|
||||
OPCB(0xb2): // RES 6,D
|
||||
OPCB(0xb3): // RES 6,E
|
||||
OPCB(0xb4): // RES 6,H
|
||||
OPCB(0xb5): // RES 6,L
|
||||
OPCB(0xb7): // RES 6,A
|
||||
|
||||
OPCB(0xb8): // RES 7,B
|
||||
OPCB(0xb9): // RES 7,C
|
||||
OPCB(0xba): // RES 7,D
|
||||
OPCB(0xbb): // RES 7,E
|
||||
OPCB(0xbc): // RES 7,H
|
||||
OPCB(0xbd): // RES 7,L
|
||||
OPCB(0xbf): // RES 7,A
|
||||
zR8(Opcode & 7) &= ~(1 << ((Opcode >> 3) & 7));
|
||||
RET(8)
|
||||
|
||||
OPCB(0x86): // RES 0,(HL)
|
||||
OPCB(0x8e): // RES 1,(HL)
|
||||
OPCB(0x96): // RES 2,(HL)
|
||||
OPCB(0x9e): // RES 3,(HL)
|
||||
OPCB(0xa6): // RES 4,(HL)
|
||||
OPCB(0xae): // RES 5,(HL)
|
||||
OPCB(0xb6): // RES 6,(HL)
|
||||
OPCB(0xbe): // RES 7,(HL)
|
||||
adr = zHL;
|
||||
res = READ_MEM8(adr);
|
||||
res &= ~(1 << ((Opcode >> 3) & 7));
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
SET
|
||||
-----------------------------------------*/
|
||||
|
||||
OPCB(0xc0): // SET 0,B
|
||||
OPCB(0xc1): // SET 0,C
|
||||
OPCB(0xc2): // SET 0,D
|
||||
OPCB(0xc3): // SET 0,E
|
||||
OPCB(0xc4): // SET 0,H
|
||||
OPCB(0xc5): // SET 0,L
|
||||
OPCB(0xc7): // SET 0,A
|
||||
|
||||
OPCB(0xc8): // SET 1,B
|
||||
OPCB(0xc9): // SET 1,C
|
||||
OPCB(0xca): // SET 1,D
|
||||
OPCB(0xcb): // SET 1,E
|
||||
OPCB(0xcc): // SET 1,H
|
||||
OPCB(0xcd): // SET 1,L
|
||||
OPCB(0xcf): // SET 1,A
|
||||
|
||||
OPCB(0xd0): // SET 2,B
|
||||
OPCB(0xd1): // SET 2,C
|
||||
OPCB(0xd2): // SET 2,D
|
||||
OPCB(0xd3): // SET 2,E
|
||||
OPCB(0xd4): // SET 2,H
|
||||
OPCB(0xd5): // SET 2,L
|
||||
OPCB(0xd7): // SET 2,A
|
||||
|
||||
OPCB(0xd8): // SET 3,B
|
||||
OPCB(0xd9): // SET 3,C
|
||||
OPCB(0xda): // SET 3,D
|
||||
OPCB(0xdb): // SET 3,E
|
||||
OPCB(0xdc): // SET 3,H
|
||||
OPCB(0xdd): // SET 3,L
|
||||
OPCB(0xdf): // SET 3,A
|
||||
|
||||
OPCB(0xe0): // SET 4,B
|
||||
OPCB(0xe1): // SET 4,C
|
||||
OPCB(0xe2): // SET 4,D
|
||||
OPCB(0xe3): // SET 4,E
|
||||
OPCB(0xe4): // SET 4,H
|
||||
OPCB(0xe5): // SET 4,L
|
||||
OPCB(0xe7): // SET 4,A
|
||||
|
||||
OPCB(0xe8): // SET 5,B
|
||||
OPCB(0xe9): // SET 5,C
|
||||
OPCB(0xea): // SET 5,D
|
||||
OPCB(0xeb): // SET 5,E
|
||||
OPCB(0xec): // SET 5,H
|
||||
OPCB(0xed): // SET 5,L
|
||||
OPCB(0xef): // SET 5,A
|
||||
|
||||
OPCB(0xf0): // SET 6,B
|
||||
OPCB(0xf1): // SET 6,C
|
||||
OPCB(0xf2): // SET 6,D
|
||||
OPCB(0xf3): // SET 6,E
|
||||
OPCB(0xf4): // SET 6,H
|
||||
OPCB(0xf5): // SET 6,L
|
||||
OPCB(0xf7): // SET 6,A
|
||||
|
||||
OPCB(0xf8): // SET 7,B
|
||||
OPCB(0xf9): // SET 7,C
|
||||
OPCB(0xfa): // SET 7,D
|
||||
OPCB(0xfb): // SET 7,E
|
||||
OPCB(0xfc): // SET 7,H
|
||||
OPCB(0xfd): // SET 7,L
|
||||
OPCB(0xff): // SET 7,A
|
||||
zR8(Opcode & 7) |= 1 << ((Opcode >> 3) & 7);
|
||||
RET(8)
|
||||
|
||||
OPCB(0xc6): // SET 0,(HL)
|
||||
OPCB(0xce): // SET 1,(HL)
|
||||
OPCB(0xd6): // SET 2,(HL)
|
||||
OPCB(0xde): // SET 3,(HL)
|
||||
OPCB(0xe6): // SET 4,(HL)
|
||||
OPCB(0xee): // SET 5,(HL)
|
||||
OPCB(0xf6): // SET 6,(HL)
|
||||
OPCB(0xfe): // SET 7,(HL)
|
||||
adr = zHL;
|
||||
res = READ_MEM8(adr);
|
||||
res |= 1 << ((Opcode >> 3) & 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(15)
|
||||
|
||||
#if !CZ80_USE_JUMPTABLE
|
||||
}
|
||||
#endif
|
731
cpu/cz80/cz80_opED.c
Normal file
731
cpu/cz80/cz80_opED.c
Normal file
|
@ -0,0 +1,731 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* CZ80 ED opcode include source file
|
||||
* CZ80 emulator version 0.9
|
||||
* Copyright 2004-2005 Stéphane Dallongeville
|
||||
*
|
||||
* (Modified by NJ)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if CZ80_USE_JUMPTABLE
|
||||
goto *JumpTableED[Opcode];
|
||||
#else
|
||||
switch (Opcode)
|
||||
{
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------
|
||||
ILLEGAL
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x00):
|
||||
OPED(0x01):
|
||||
OPED(0x02):
|
||||
OPED(0x03):
|
||||
OPED(0x04):
|
||||
OPED(0x05):
|
||||
OPED(0x06):
|
||||
OPED(0x07):
|
||||
OPED(0x08):
|
||||
OPED(0x09):
|
||||
OPED(0x0a):
|
||||
OPED(0x0b):
|
||||
OPED(0x0c):
|
||||
OPED(0x0d):
|
||||
OPED(0x0e):
|
||||
OPED(0x0f):
|
||||
|
||||
OPED(0x10):
|
||||
OPED(0x11):
|
||||
OPED(0x12):
|
||||
OPED(0x13):
|
||||
OPED(0x14):
|
||||
OPED(0x15):
|
||||
OPED(0x16):
|
||||
OPED(0x17):
|
||||
OPED(0x18):
|
||||
OPED(0x19):
|
||||
OPED(0x1a):
|
||||
OPED(0x1b):
|
||||
OPED(0x1c):
|
||||
OPED(0x1d):
|
||||
OPED(0x1e):
|
||||
OPED(0x1f):
|
||||
|
||||
OPED(0x20):
|
||||
OPED(0x21):
|
||||
OPED(0x22):
|
||||
OPED(0x23):
|
||||
OPED(0x24):
|
||||
OPED(0x25):
|
||||
OPED(0x26):
|
||||
OPED(0x27):
|
||||
OPED(0x28):
|
||||
OPED(0x29):
|
||||
OPED(0x2a):
|
||||
OPED(0x2b):
|
||||
OPED(0x2c):
|
||||
OPED(0x2d):
|
||||
OPED(0x2e):
|
||||
OPED(0x2f):
|
||||
|
||||
OPED(0x30):
|
||||
OPED(0x31):
|
||||
OPED(0x32):
|
||||
OPED(0x33):
|
||||
OPED(0x34):
|
||||
OPED(0x35):
|
||||
OPED(0x36):
|
||||
OPED(0x37):
|
||||
OPED(0x38):
|
||||
OPED(0x39):
|
||||
OPED(0x3a):
|
||||
OPED(0x3b):
|
||||
OPED(0x3c):
|
||||
OPED(0x3d):
|
||||
OPED(0x3e):
|
||||
OPED(0x3f):
|
||||
|
||||
OPED(0x77):
|
||||
OPED(0x7f):
|
||||
|
||||
OPED(0x80):
|
||||
OPED(0x81):
|
||||
OPED(0x82):
|
||||
OPED(0x83):
|
||||
OPED(0x84):
|
||||
OPED(0x85):
|
||||
OPED(0x86):
|
||||
OPED(0x87):
|
||||
OPED(0x88):
|
||||
OPED(0x89):
|
||||
OPED(0x8a):
|
||||
OPED(0x8b):
|
||||
OPED(0x8c):
|
||||
OPED(0x8d):
|
||||
OPED(0x8e):
|
||||
OPED(0x8f):
|
||||
|
||||
OPED(0x90):
|
||||
OPED(0x91):
|
||||
OPED(0x92):
|
||||
OPED(0x93):
|
||||
OPED(0x94):
|
||||
OPED(0x95):
|
||||
OPED(0x96):
|
||||
OPED(0x97):
|
||||
OPED(0x98):
|
||||
OPED(0x99):
|
||||
OPED(0x9a):
|
||||
OPED(0x9b):
|
||||
OPED(0x9c):
|
||||
OPED(0x9d):
|
||||
OPED(0x9e):
|
||||
OPED(0x9f):
|
||||
|
||||
OPED(0xa4):
|
||||
OPED(0xa5):
|
||||
OPED(0xa6):
|
||||
OPED(0xa7):
|
||||
|
||||
OPED(0xac):
|
||||
OPED(0xad):
|
||||
OPED(0xae):
|
||||
OPED(0xaf):
|
||||
|
||||
OPED(0xb4):
|
||||
OPED(0xb5):
|
||||
OPED(0xb6):
|
||||
OPED(0xb7):
|
||||
|
||||
OPED(0xbc):
|
||||
OPED(0xbd):
|
||||
OPED(0xbe):
|
||||
OPED(0xbf):
|
||||
|
||||
OPED(0xc0):
|
||||
OPED(0xc1):
|
||||
OPED(0xc2):
|
||||
OPED(0xc3):
|
||||
OPED(0xc4):
|
||||
OPED(0xc5):
|
||||
OPED(0xc6):
|
||||
OPED(0xc7):
|
||||
OPED(0xc8):
|
||||
OPED(0xc9):
|
||||
OPED(0xca):
|
||||
OPED(0xcb):
|
||||
OPED(0xcc):
|
||||
OPED(0xcd):
|
||||
OPED(0xce):
|
||||
OPED(0xcf):
|
||||
|
||||
OPED(0xd0):
|
||||
OPED(0xd1):
|
||||
OPED(0xd2):
|
||||
OPED(0xd3):
|
||||
OPED(0xd4):
|
||||
OPED(0xd5):
|
||||
OPED(0xd6):
|
||||
OPED(0xd7):
|
||||
OPED(0xd8):
|
||||
OPED(0xd9):
|
||||
OPED(0xda):
|
||||
OPED(0xdb):
|
||||
OPED(0xdc):
|
||||
OPED(0xdd):
|
||||
OPED(0xde):
|
||||
OPED(0xdf):
|
||||
|
||||
OPED(0xe0):
|
||||
OPED(0xe1):
|
||||
OPED(0xe2):
|
||||
OPED(0xe3):
|
||||
OPED(0xe4):
|
||||
OPED(0xe5):
|
||||
OPED(0xe6):
|
||||
OPED(0xe7):
|
||||
OPED(0xe8):
|
||||
OPED(0xe9):
|
||||
OPED(0xea):
|
||||
OPED(0xeb):
|
||||
OPED(0xec):
|
||||
OPED(0xed):
|
||||
OPED(0xee):
|
||||
OPED(0xef):
|
||||
|
||||
OPED(0xf0):
|
||||
OPED(0xf1):
|
||||
OPED(0xf2):
|
||||
OPED(0xf3):
|
||||
OPED(0xf4):
|
||||
OPED(0xf5):
|
||||
OPED(0xf6):
|
||||
OPED(0xf7):
|
||||
OPED(0xf8):
|
||||
OPED(0xf9):
|
||||
OPED(0xfa):
|
||||
OPED(0xfb):
|
||||
OPED(0xfc):
|
||||
OPED(0xfd):
|
||||
OPED(0xfe):
|
||||
OPED(0xff):
|
||||
RET(4)
|
||||
|
||||
/*-----------------------------------------
|
||||
LD r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x47): // LD I,A
|
||||
zI = zA;
|
||||
RET(5)
|
||||
|
||||
OPED(0x4f): // LD R,A
|
||||
#if CZ80_EMULATE_R_EXACTLY
|
||||
zR = zA;
|
||||
#else
|
||||
zR = zA - ((cycles - CPU->ICount) >> 2);
|
||||
#endif
|
||||
zR2 = zA & 0x80;
|
||||
RET(5)
|
||||
|
||||
OPED(0x57): // LD A,I
|
||||
zA = zI;
|
||||
zF = (zF & CF) | SZ[zA] | zIFF2;
|
||||
RET(5)
|
||||
|
||||
OPED(0x5f): // LD A,R
|
||||
#if CZ80_EMULATE_R_EXACTLY
|
||||
zA = (zR & 0x7f) | zR2;
|
||||
#else
|
||||
zA = ((zR + ((cycles - CPU->ICount) >> 2)) & 0x7f) | zR2;
|
||||
#endif
|
||||
zF = (zF & CF) | SZ[zA] | zIFF2;
|
||||
RET(5)
|
||||
|
||||
/*-----------------------------------------
|
||||
LD r16
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x43): // LD (w),BC
|
||||
data = pzBC;
|
||||
goto OP_LD_mNN_xx;
|
||||
|
||||
OPED(0x53): // LD (w),DE
|
||||
data = pzDE;
|
||||
goto OP_LD_mNN_xx;
|
||||
|
||||
OPED(0x63): // LD (w),HL
|
||||
data = pzHL;
|
||||
goto OP_LD_mNN_xx;
|
||||
|
||||
OPED(0x73): // LD (w),SP
|
||||
data = pzSP;
|
||||
goto OP_LD_mNN_xx;
|
||||
|
||||
OPED(0x4b): // LD BC,(w)
|
||||
data = pzBC;
|
||||
goto OP_LD_xx_mNN;
|
||||
|
||||
OPED(0x5b): // LD DE,(w)
|
||||
data = pzDE;
|
||||
goto OP_LD_xx_mNN;
|
||||
|
||||
OPED(0x6b): // LD HL,(w)
|
||||
data = pzHL;
|
||||
goto OP_LD_xx_mNN;
|
||||
|
||||
OPED(0x7b): // LD SP,(w)
|
||||
data = pzSP;
|
||||
goto OP_LD_xx_mNN;
|
||||
|
||||
/*-----------------------------------------
|
||||
NEG
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x44): // NEG
|
||||
OPED(0x4c): // NEG
|
||||
OPED(0x54): // NEG
|
||||
OPED(0x5c): // NEG
|
||||
OPED(0x64): // NEG
|
||||
OPED(0x6c): // NEG
|
||||
OPED(0x74): // NEG
|
||||
OPED(0x7c): // NEG
|
||||
val = zA;
|
||||
zA = 0;
|
||||
goto OP_SUB;
|
||||
|
||||
/*-----------------------------------------
|
||||
RRD
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x67): // RRD (HL)
|
||||
adr = zHL;
|
||||
val = READ_MEM8(adr);
|
||||
WRITE_MEM8(adr, (val >> 4) | (zA << 4));
|
||||
zA = (zA & 0xf0) | (val & 0x0f);
|
||||
zF = (zF & CF) | SZP[zA];
|
||||
RET(14)
|
||||
|
||||
/*-----------------------------------------
|
||||
RLD
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x6f): // RLD (HL)
|
||||
adr = zHL;
|
||||
val = READ_MEM8(adr);
|
||||
WRITE_MEM8(adr, (val << 4) | (zA & 0x0f));
|
||||
zA = (zA & 0xf0) | (val >> 4);
|
||||
zF = (zF & CF) | SZP[zA];
|
||||
RET(14)
|
||||
|
||||
/*-----------------------------------------
|
||||
ADC 16
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x7a): // ADC HL,SP
|
||||
val = zSP;
|
||||
goto OP_ADC16;
|
||||
|
||||
OPED(0x4a): // ADC HL,BC
|
||||
OPED(0x5a): // ADC HL,DE
|
||||
OPED(0x6a): // ADC HL,HL
|
||||
val = zR16((Opcode >> 4) & 3);
|
||||
|
||||
OP_ADC16:
|
||||
res = zHL + val + (zF & CF);
|
||||
zF = (((zHL ^ res ^ val) >> 8) & HF) |
|
||||
((res >> 16) & CF) |
|
||||
((res >> 8) & (SF | YF | XF)) |
|
||||
((res & 0xffff) ? 0 : ZF) |
|
||||
(((val ^ zHL ^ 0x8000) & (val ^ res) & 0x8000) >> 13);
|
||||
zHL = (UINT16)res;
|
||||
RET(11)
|
||||
|
||||
/*-----------------------------------------
|
||||
SBC 16
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x72): // SBC HL,SP
|
||||
val = zSP;
|
||||
goto OP_SBC16;
|
||||
|
||||
OPED(0x42): // SBC HL,BC
|
||||
OPED(0x52): // SBC HL,DE
|
||||
OPED(0x62): // SBC HL,HL
|
||||
val = zR16((Opcode >> 4) & 3);
|
||||
|
||||
OP_SBC16:
|
||||
res = zHL - val - (zF & CF);
|
||||
zF = (((zHL ^ res ^ val) >> 8) & HF) | NF |
|
||||
((res >> 16) & CF) |
|
||||
((res >> 8) & (SF | YF | XF)) |
|
||||
((res & 0xffff) ? 0 : ZF) |
|
||||
(((val ^ zHL) & (zHL ^ res) & 0x8000) >> 13);
|
||||
zHL = (UINT16)res;
|
||||
RET(11)
|
||||
|
||||
/*-----------------------------------------
|
||||
IN
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x40): // IN B,(C)
|
||||
OPED(0x48): // IN C,(C)
|
||||
OPED(0x50): // IN D,(C)
|
||||
OPED(0x58): // IN E,(C)
|
||||
OPED(0x60): // IN H,(C)
|
||||
OPED(0x68): // IN L,(C)
|
||||
OPED(0x78): // IN E,(C)
|
||||
res = IN(zBC);
|
||||
zR8((Opcode >> 3) & 7) = res;
|
||||
zF = (zF & CF) | SZP[res];
|
||||
RET(8)
|
||||
|
||||
OPED(0x70): // IN 0,(C)
|
||||
res = IN(zBC);
|
||||
zF = (zF & CF) | SZP[res];
|
||||
RET(8)
|
||||
|
||||
/*-----------------------------------------
|
||||
OUT
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x51): // OUT (C),D
|
||||
OPED(0x41): // OUT (C),B
|
||||
OPED(0x49): // OUT (C),C
|
||||
OPED(0x59): // OUT (C),E
|
||||
OPED(0x61): // OUT (C),H
|
||||
OPED(0x69): // OUT (C),L
|
||||
OPED(0x79): // OUT (C),E
|
||||
res = zR8((Opcode >> 3) & 7);
|
||||
OUT(zBC, res);
|
||||
RET(8)
|
||||
|
||||
OPED(0x71): // OUT (C),0
|
||||
OUT(zBC, 0);
|
||||
RET(8)
|
||||
|
||||
/*-----------------------------------------
|
||||
RETN
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x45): // RETN;
|
||||
OPED(0x55): // RETN;
|
||||
OPED(0x65): // RETN;
|
||||
OPED(0x75): // RETN;
|
||||
POP_16(res);
|
||||
SET_PC(res);
|
||||
if (!zIFF1 && zIFF2)
|
||||
{
|
||||
zIFF1 = (1 << 2);
|
||||
if (CPU->IRQState)
|
||||
{
|
||||
USE_CYCLES(10)
|
||||
goto Cz80_Check_Interrupt;
|
||||
}
|
||||
}
|
||||
else zIFF1 = zIFF2;
|
||||
RET(10)
|
||||
|
||||
/*-----------------------------------------
|
||||
RETI
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x4d): // RETI
|
||||
OPED(0x5d): // RETI
|
||||
OPED(0x6d): // RETI
|
||||
OPED(0x7d): // RETI
|
||||
POP_16(res);
|
||||
SET_PC(res);
|
||||
RET(10)
|
||||
|
||||
/*-----------------------------------------
|
||||
IM
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0x46): // IM 0
|
||||
OPED(0x4e): // IM 0
|
||||
OPED(0x66): // IM 0
|
||||
OPED(0x6e): // IM 0
|
||||
zIM = 0;
|
||||
RET(4)
|
||||
|
||||
OPED(0x56): // IM 1
|
||||
OPED(0x76): // IM 1
|
||||
zIM = 1;
|
||||
RET(4)
|
||||
|
||||
OPED(0x5e): // IM 2
|
||||
OPED(0x7e): // IM 2
|
||||
zIM = 2;
|
||||
RET(4)
|
||||
|
||||
{
|
||||
UINT8 val;
|
||||
UINT8 res;
|
||||
UINT8 F;
|
||||
|
||||
/*-----------------------------------------
|
||||
LDI/LDD
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0xa0): // LDI
|
||||
val = READ_MEM8(zHL++);
|
||||
WRITE_MEM8(zDE++, val);
|
||||
goto OP_LDX;
|
||||
|
||||
OPED(0xa8): // LDD
|
||||
val = READ_MEM8(zHL--);
|
||||
WRITE_MEM8(zDE--, val);
|
||||
|
||||
OP_LDX:
|
||||
F = zF & (SF | ZF | CF);
|
||||
if ((zA + val) & 0x02) F |= YF;
|
||||
if ((zA + val) & 0x08) F |= XF;
|
||||
if (--zBC) F |= VF;
|
||||
zF = F;
|
||||
RET(12)
|
||||
|
||||
/*-----------------------------------------
|
||||
LDIR/LDDR
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0xb0): // LDIR
|
||||
do
|
||||
{
|
||||
val = READ_MEM8(zHL++);
|
||||
WRITE_MEM8(zDE++, val);
|
||||
zBC--;
|
||||
USE_CYCLES(17)
|
||||
} while (zBC && (CPU->ICount > 0));
|
||||
goto OP_LDXR;
|
||||
|
||||
OPED(0xb8): // LDDR
|
||||
do
|
||||
{
|
||||
val = READ_MEM8(zHL--);
|
||||
WRITE_MEM8(zDE--, val);
|
||||
zBC--;
|
||||
USE_CYCLES(17)
|
||||
} while (zBC && (CPU->ICount > 0));
|
||||
|
||||
OP_LDXR:
|
||||
F = zF & (SF | ZF | CF);
|
||||
if ((zA + val) & 0x02) F |= YF;
|
||||
if ((zA + val) & 0x08) F |= XF;
|
||||
if (zBC)
|
||||
{
|
||||
zF = F | VF;
|
||||
PC -= 2;
|
||||
#if CZ80_EMULATE_R_EXACTLY
|
||||
zR--;
|
||||
#endif
|
||||
goto Cz80_Exec_End;
|
||||
}
|
||||
zF = F;
|
||||
ADD_CYCLES(5)
|
||||
goto Cz80_Exec;
|
||||
|
||||
/*-----------------------------------------
|
||||
CPI/CPD
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0xa1): // CPI
|
||||
val = READ_MEM8(zHL++);
|
||||
goto OP_CPX;
|
||||
|
||||
OPED(0xa9): // CPD
|
||||
val = READ_MEM8(zHL--);
|
||||
|
||||
OP_CPX:
|
||||
res = zA - val;
|
||||
F = (zF & CF) | (SZ[res] & ~(YF | XF)) | ((zA ^ val ^ res) & HF) | NF;
|
||||
if (F & HF) res--;
|
||||
if (res & 0x02) F |= YF;
|
||||
if (res & 0x08) F |= XF;
|
||||
if (--zBC) F |= VF;
|
||||
zF = F;
|
||||
RET(12)
|
||||
|
||||
/*-----------------------------------------
|
||||
CPIR/CPDR
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0xb1): // CPIR
|
||||
do
|
||||
{
|
||||
val = READ_MEM8(zHL++);
|
||||
res = zA - val;
|
||||
zBC--;
|
||||
F = (zF & CF) | (SZ[res] & ~(YF | XF)) | ((zA ^ val ^ res) & HF) | NF;
|
||||
if (F & HF) res--;
|
||||
if (res & 0x02) F |= YF;
|
||||
if (res & 0x08) F |= XF;
|
||||
if (zBC) F |= VF;
|
||||
zF = F;
|
||||
USE_CYCLES(17)
|
||||
} while (zBC && !(F & ZF) && (CPU->ICount > 0));
|
||||
goto OP_CPXR;
|
||||
|
||||
OPED(0xb9): // CPDR
|
||||
do
|
||||
{
|
||||
val = READ_MEM8(zHL--);
|
||||
res = zA - val;
|
||||
zBC--;
|
||||
F = (zF & CF) | (SZ[res] & ~(YF | XF)) | ((zA ^ val ^ res) & HF) | NF;
|
||||
if (F & HF) res--;
|
||||
if (res & 0x02) F |= YF;
|
||||
if (res & 0x08) F |= XF;
|
||||
if (zBC) F |= VF;
|
||||
zF = F;
|
||||
USE_CYCLES(17)
|
||||
} while (zBC && !(F & ZF) && (CPU->ICount > 0));
|
||||
|
||||
OP_CPXR:
|
||||
if (zBC && !(F & ZF))
|
||||
{
|
||||
PC -= 2;
|
||||
#if CZ80_EMULATE_R_EXACTLY
|
||||
zR--;
|
||||
#endif
|
||||
goto Cz80_Exec_End;
|
||||
}
|
||||
ADD_CYCLES(5)
|
||||
goto Cz80_Exec;
|
||||
|
||||
/*-----------------------------------------
|
||||
INI/IND
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0xa2): // INI
|
||||
val = IN(zBC);
|
||||
zB--;
|
||||
WRITE_MEM8(zHL++, val);
|
||||
goto OP_INX;
|
||||
|
||||
OPED(0xaa): // IND
|
||||
val = IN(zBC);
|
||||
zB--;
|
||||
WRITE_MEM8(zHL--, val);
|
||||
|
||||
OP_INX:
|
||||
F = SZ[zB];
|
||||
res = ((UINT32)(zC - 1) & 0xff) + (UINT32)val;
|
||||
if (val & SF) F |= NF;
|
||||
if (res & 0x100) F |= HF | CF;
|
||||
F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
|
||||
zF = F;
|
||||
RET(12)
|
||||
|
||||
/*-----------------------------------------
|
||||
INIR/INDR
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0xb2): // INIR
|
||||
do
|
||||
{
|
||||
val = IN(zBC);
|
||||
zB--;
|
||||
WRITE_MEM8(zHL++, val);
|
||||
USE_CYCLES(17)
|
||||
} while (zB && (CPU->ICount > 0));
|
||||
goto OP_INXR;
|
||||
|
||||
OPED(0xba): // INDR
|
||||
do
|
||||
{
|
||||
val = IN(zBC);
|
||||
zB--;
|
||||
WRITE_MEM8(zHL--, val);
|
||||
USE_CYCLES(17)
|
||||
} while (zB && (CPU->ICount > 0));
|
||||
|
||||
OP_INXR:
|
||||
F = SZ[zB];
|
||||
res = ((UINT32)(zC - 1) & 0xff) + (UINT32)val;
|
||||
if (val & SF) F |= NF;
|
||||
if (res & 0x100) F |= HF | CF;
|
||||
F |= SZP[(UINT8)(res & 0x07) ^ zB] & PF;
|
||||
zF = F;
|
||||
if (zB)
|
||||
{
|
||||
PC -= 2;
|
||||
#if CZ80_EMULATE_R_EXACTLY
|
||||
zR--;
|
||||
#endif
|
||||
goto Cz80_Exec_End;
|
||||
}
|
||||
ADD_CYCLES(5);
|
||||
goto Cz80_Exec;
|
||||
|
||||
/*-----------------------------------------
|
||||
OUTI/OUTD
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0xa3): // OUTI
|
||||
val = READ_MEM8(zHL++);
|
||||
zB--;
|
||||
OUT(zBC, val);
|
||||
goto OP_OUTX;
|
||||
|
||||
OPED(0xab): // OUTD
|
||||
val = READ_MEM8(zHL--);
|
||||
zB--;
|
||||
OUT(zBC, val);
|
||||
|
||||
OP_OUTX:
|
||||
F = SZ[zB];
|
||||
res = (UINT32)zL + (UINT32)val;
|
||||
if (val & SF) F |= NF;
|
||||
if (res & 0x100) F |= HF | CF;
|
||||
F |= SZP[(UINT8)(res & 0x07) - zB] & PF;
|
||||
zF = F;
|
||||
RET(12)
|
||||
|
||||
/*-----------------------------------------
|
||||
OTIR/OTDR
|
||||
-----------------------------------------*/
|
||||
|
||||
OPED(0xb3): // OTIR
|
||||
do
|
||||
{
|
||||
val = READ_MEM8(zHL++);
|
||||
zB--;
|
||||
OUT(zBC, val);
|
||||
USE_CYCLES(17)
|
||||
} while (zB && (CPU->ICount > 0));
|
||||
goto OP_OTXR;
|
||||
|
||||
OPED(0xbb): // OTDR
|
||||
do
|
||||
{
|
||||
val = READ_MEM8(zHL--);
|
||||
zB--;
|
||||
OUT(zBC, val);
|
||||
USE_CYCLES(17)
|
||||
} while (zB && (CPU->ICount > 0));
|
||||
|
||||
OP_OTXR:
|
||||
F = SZ[zB];
|
||||
res = (UINT32)zL + (UINT32)val;
|
||||
if (val & SF) F |= NF;
|
||||
if (res & 0x100) F |= HF | CF;
|
||||
F |= SZP[(UINT8)(res & 0x07) - zB] & PF;
|
||||
zF = F;
|
||||
if (zB)
|
||||
{
|
||||
PC -= 2;
|
||||
#if CZ80_EMULATE_R_EXACTLY
|
||||
zR--;
|
||||
#endif
|
||||
goto Cz80_Exec_End;
|
||||
}
|
||||
ADD_CYCLES(5)
|
||||
goto Cz80_Exec;
|
||||
}
|
||||
|
||||
#if !CZ80_USE_JUMPTABLE
|
||||
}
|
||||
#endif
|
786
cpu/cz80/cz80_opXY.c
Normal file
786
cpu/cz80/cz80_opXY.c
Normal file
|
@ -0,0 +1,786 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* CZ80 XY opcode include source file
|
||||
* CZ80 emulator version 0.9
|
||||
* Copyright 2004-2005 Stéphane Dallongeville
|
||||
*
|
||||
* (Modified by NJ)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if CZ80_USE_JUMPTABLE
|
||||
goto *JumpTableXY[Opcode];
|
||||
#else
|
||||
switch (Opcode)
|
||||
{
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------
|
||||
NOP
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x00): // NOP
|
||||
|
||||
/*-----------------------------------------
|
||||
LD r8 (same register)
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x40): // LD B,B
|
||||
OPXY(0x49): // LD C,C
|
||||
OPXY(0x52): // LD D,D
|
||||
OPXY(0x5b): // LD E,E
|
||||
OPXY(0x64): // LD H,H
|
||||
OPXY(0x6d): // LD L,L
|
||||
OPXY(0x7f): // LD A,A
|
||||
RET(4)
|
||||
|
||||
/*-----------------------------------------
|
||||
LD r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x41): // LD B,C
|
||||
OPXY(0x42): // LD B,D
|
||||
OPXY(0x43): // LD B,E
|
||||
OPXY(0x47): // LD B,A
|
||||
|
||||
OPXY(0x48): // LD C,B
|
||||
OPXY(0x4a): // LD C,D
|
||||
OPXY(0x4b): // LD C,E
|
||||
OPXY(0x4f): // LD C,A
|
||||
|
||||
OPXY(0x50): // LD D,B
|
||||
OPXY(0x51): // LD D,C
|
||||
OPXY(0x53): // LD D,E
|
||||
OPXY(0x57): // LD D,A
|
||||
|
||||
OPXY(0x58): // LD E,B
|
||||
OPXY(0x59): // LD E,C
|
||||
OPXY(0x5a): // LD E,D
|
||||
OPXY(0x5f): // LD E,A
|
||||
|
||||
OPXY(0x78): // LD A,B
|
||||
OPXY(0x79): // LD A,C
|
||||
OPXY(0x7a): // LD A,D
|
||||
OPXY(0x7b): // LD A,E
|
||||
goto OP_LD_R_R;
|
||||
|
||||
OPXY(0x44): // LD B,HX
|
||||
OPXY(0x4c): // LD C,HX
|
||||
OPXY(0x54): // LD D,HX
|
||||
OPXY(0x5c): // LD E,HX
|
||||
OPXY(0x7c): // LD A,HX
|
||||
zR8((Opcode >> 3) & 7) = data->B.H;
|
||||
RET(5)
|
||||
|
||||
OPXY(0x45): // LD B,LX
|
||||
OPXY(0x4d): // LD C,LX
|
||||
OPXY(0x55): // LD D,LX
|
||||
OPXY(0x5d): // LD E,LX
|
||||
OPXY(0x7d): // LD A,LX
|
||||
zR8((Opcode >> 3) & 7) = data->B.L;
|
||||
RET(5)
|
||||
|
||||
OPXY(0x60): // LD HX,B
|
||||
OPXY(0x61): // LD HX,C
|
||||
OPXY(0x62): // LD HX,D
|
||||
OPXY(0x63): // LD HX,E
|
||||
OPXY(0x67): // LD HX,A
|
||||
data->B.H = zR8(Opcode & 7);
|
||||
RET(5)
|
||||
|
||||
OPXY(0x68): // LD LX,B
|
||||
OPXY(0x69): // LD LX,C
|
||||
OPXY(0x6a): // LD LX,D
|
||||
OPXY(0x6b): // LD LX,E
|
||||
OPXY(0x6f): // LD LX,A
|
||||
data->B.L = zR8(Opcode & 7);
|
||||
RET(5)
|
||||
|
||||
OPXY(0x65): // LD HX,LX
|
||||
data->B.H = data->B.L;
|
||||
RET(5)
|
||||
|
||||
OPXY(0x6c): // LD LX,HX
|
||||
data->B.L = data->B.H;
|
||||
RET(5)
|
||||
|
||||
OPXY(0x06): // LD B,#imm
|
||||
OPXY(0x0e): // LD C,#imm
|
||||
OPXY(0x16): // LD D,#imm
|
||||
OPXY(0x1e): // LD E,#imm
|
||||
OPXY(0x3e): // LD A,#imm
|
||||
goto OP_LD_R_imm;
|
||||
|
||||
OPXY(0x26): // LD HX,#imm
|
||||
data->B.H = READ_ARG();
|
||||
RET(5)
|
||||
|
||||
OPXY(0x2e): // LD LX,#imm
|
||||
data->B.L = READ_ARG();
|
||||
RET(5)
|
||||
|
||||
OPXY(0x0a): // LD A,(BC)
|
||||
goto OP_LOAD_A_mBC;
|
||||
|
||||
OPXY(0x1a): // LD A,(DE)
|
||||
goto OP_LOAD_A_mDE;
|
||||
|
||||
OPXY(0x3a): // LD A,(nn)
|
||||
goto OP_LOAD_A_mNN;
|
||||
|
||||
OPXY(0x02): // LD (BC),A
|
||||
goto OP_LOAD_mBC_A;
|
||||
|
||||
OPXY(0x12): // LD (DE),A
|
||||
goto OP_LOAD_mDE_A;
|
||||
|
||||
OPXY(0x32): // LD (nn),A
|
||||
goto OP_LOAD_mNN_A;
|
||||
|
||||
OPXY(0x46): // LD B,(IX+o)
|
||||
OPXY(0x4e): // LD C,(IX+o)
|
||||
OPXY(0x56): // LD D,(IX+o)
|
||||
OPXY(0x5e): // LD E,(IX+o)
|
||||
OPXY(0x66): // LD H,(IX+o)
|
||||
OPXY(0x6e): // LD L,(IX+o)
|
||||
OPXY(0x7e): // LD A,(IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
zR8((Opcode >> 3) & 7) = READ_MEM8(adr);
|
||||
RET(15)
|
||||
|
||||
OPXY(0x70): // LD (IX+o),B
|
||||
OPXY(0x71): // LD (IX+o),C
|
||||
OPXY(0x72): // LD (IX+o),D
|
||||
OPXY(0x73): // LD (IX+o),E
|
||||
OPXY(0x74): // LD (IX+o),H
|
||||
OPXY(0x75): // LD (IX+o),L
|
||||
OPXY(0x77): // LD (IX+o),A
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
WRITE_MEM8(adr, zR8(Opcode & 7));
|
||||
RET(15)
|
||||
|
||||
OPXY(0x36): // LD (IX+o),#imm
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
WRITE_MEM8(adr, READ_ARG());
|
||||
RET(15)
|
||||
|
||||
/*-----------------------------------------
|
||||
LD r16
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x01): // LD BC,nn
|
||||
OPXY(0x11): // LD DE,nn
|
||||
goto OP_LOAD_RR_imm16;
|
||||
|
||||
OPXY(0x21): // LD IX,nn
|
||||
data->W = READ_ARG16();
|
||||
RET(10)
|
||||
|
||||
OPXY(0x31): // LD SP,nn
|
||||
goto OP_LOAD_SP_imm16;
|
||||
|
||||
OPXY(0x2a): // LD IX,(w)
|
||||
goto OP_LD_xx_mNN;
|
||||
|
||||
OPXY(0x22): // LD (w),IX
|
||||
goto OP_LD_mNN_xx;
|
||||
|
||||
OPXY(0xf9): // LD SP,IX
|
||||
goto OP_LD_SP_xx;
|
||||
|
||||
/*-----------------------------------------
|
||||
POP
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xc1): // POP BC
|
||||
OPXY(0xd1): // POP DE
|
||||
OPXY(0xf1): // POP AF
|
||||
goto OP_POP_RR;
|
||||
|
||||
OPXY(0xe1): // POP IX
|
||||
goto OP_POP;
|
||||
|
||||
/*-----------------------------------------
|
||||
PUSH
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xc5): // PUSH BC
|
||||
OPXY(0xd5): // PUSH DE
|
||||
OPXY(0xf5): // PUSH AF
|
||||
goto OP_PUSH_RR;
|
||||
|
||||
OPXY(0xe5): // PUSH IX
|
||||
goto OP_PUSH;
|
||||
|
||||
/*-----------------------------------------
|
||||
EX
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x08): // EX AF,AF'
|
||||
goto OP_EX_AF_AF2;
|
||||
|
||||
OPXY(0xeb): // EX DE,HL
|
||||
goto OP_EX_DE_HL;
|
||||
|
||||
OPXY(0xd9): // EXX
|
||||
goto OP_EXX;
|
||||
|
||||
OPXY(0xe3): // EX (SP),IX
|
||||
goto OP_EX_xx_mSP;
|
||||
|
||||
/*-----------------------------------------
|
||||
INC r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x04): // INC B
|
||||
OPXY(0x0c): // INC C
|
||||
OPXY(0x14): // INC D
|
||||
OPXY(0x1c): // INC E
|
||||
OPXY(0x3c): // INC A
|
||||
goto OP_INC_R;
|
||||
|
||||
OPXY(0x24): // INC HX
|
||||
data->B.H++;
|
||||
zF = (zF & CF) | SZHV_inc[data->B.H];
|
||||
RET(5)
|
||||
|
||||
OPXY(0x2c): // INC LX
|
||||
data->B.L++;
|
||||
zF = (zF & CF) | SZHV_inc[data->B.L];
|
||||
RET(5)
|
||||
|
||||
OPXY(0x34): // INC (IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
USE_CYCLES(8)
|
||||
goto OP_INC_m;
|
||||
|
||||
/*-----------------------------------------
|
||||
DEC r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x05): // DEC B
|
||||
OPXY(0x0d): // DEC C
|
||||
OPXY(0x15): // DEC D
|
||||
OPXY(0x1d): // DEC E
|
||||
OPXY(0x3d): // DEC A
|
||||
goto OP_DEC_R;
|
||||
|
||||
OPXY(0x25): // DEC HX
|
||||
data->B.H--;
|
||||
zF = (zF & CF) | SZHV_dec[data->B.H];
|
||||
RET(5)
|
||||
|
||||
OPXY(0x2d): // DEC LX
|
||||
data->B.L--;
|
||||
zF = (zF & CF) | SZHV_dec[data->B.L];
|
||||
RET(5)
|
||||
|
||||
OPXY(0x35): // DEC (IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
USE_CYCLES(8)
|
||||
goto OP_DEC_m;
|
||||
|
||||
/*-----------------------------------------
|
||||
ADD r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x80): // ADD A,B
|
||||
OPXY(0x81): // ADD A,C
|
||||
OPXY(0x82): // ADD A,D
|
||||
OPXY(0x83): // ADD A,E
|
||||
OPXY(0x87): // ADD A,A
|
||||
goto OP_ADD_R;
|
||||
|
||||
OPXY(0xc6): // ADD A,n
|
||||
goto OP_ADD_imm;
|
||||
|
||||
OPXY(0x84): // ADD A,HX
|
||||
val = data->B.H;
|
||||
USE_CYCLES(1)
|
||||
goto OP_ADD;
|
||||
|
||||
OPXY(0x85): // ADD A,LX
|
||||
val = data->B.L;
|
||||
USE_CYCLES(1)
|
||||
goto OP_ADD;
|
||||
|
||||
OPXY(0x86): // ADD A,(IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
val = READ_MEM8(adr);
|
||||
USE_CYCLES(11)
|
||||
goto OP_ADD;
|
||||
|
||||
/*-----------------------------------------
|
||||
ADC r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x88): // ADC A,B
|
||||
OPXY(0x89): // ADC A,C
|
||||
OPXY(0x8a): // ADC A,D
|
||||
OPXY(0x8b): // ADC A,E
|
||||
OPXY(0x8f): // ADC A,A
|
||||
goto OP_ADC_R;
|
||||
|
||||
OPXY(0xce): // ADC A,n
|
||||
goto OP_ADC_imm;
|
||||
|
||||
OPXY(0x8c): // ADC A,HX
|
||||
val = data->B.H;
|
||||
USE_CYCLES(1)
|
||||
goto OP_ADC;
|
||||
|
||||
OPXY(0x8d): // ADC A,LX
|
||||
val = data->B.L;
|
||||
USE_CYCLES(1)
|
||||
goto OP_ADC;
|
||||
|
||||
OPXY(0x8e): // ADC A,(IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
val = READ_MEM8(adr);
|
||||
USE_CYCLES(11)
|
||||
goto OP_ADC;
|
||||
|
||||
/*-----------------------------------------
|
||||
SUB r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x90): // SUB B
|
||||
OPXY(0x91): // SUB C
|
||||
OPXY(0x92): // SUB D
|
||||
OPXY(0x93): // SUB E
|
||||
OPXY(0x97): // SUB A
|
||||
goto OP_SUB_R;
|
||||
|
||||
OPXY(0xd6): // SUB A,n
|
||||
goto OP_SUB_imm;
|
||||
|
||||
OPXY(0x94): // SUB HX
|
||||
val = data->B.H;
|
||||
USE_CYCLES(1)
|
||||
goto OP_SUB;
|
||||
|
||||
OPXY(0x95): // SUB LX
|
||||
val = data->B.L;
|
||||
USE_CYCLES(1)
|
||||
goto OP_SUB;
|
||||
|
||||
OPXY(0x96): // SUB (IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
val = READ_MEM8(adr);
|
||||
USE_CYCLES(11)
|
||||
goto OP_SUB;
|
||||
|
||||
/*-----------------------------------------
|
||||
SBC r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x98): // SBC A,B
|
||||
OPXY(0x99): // SBC A,C
|
||||
OPXY(0x9a): // SBC A,D
|
||||
OPXY(0x9b): // SBC A,E
|
||||
OPXY(0x9f): // SBC A,A
|
||||
goto OP_SBC_R;
|
||||
|
||||
OPXY(0xde): // SBC A,n
|
||||
goto OP_SBC_imm;
|
||||
|
||||
OPXY(0x9c): // SBC A,HX
|
||||
val = data->B.H;
|
||||
USE_CYCLES(1)
|
||||
goto OP_SBC;
|
||||
|
||||
OPXY(0x9d): // SBC A,LX
|
||||
val = data->B.L;
|
||||
USE_CYCLES(1)
|
||||
goto OP_SBC;
|
||||
|
||||
OPXY(0x9e): // SBC A,(IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
val = READ_MEM8(adr);
|
||||
USE_CYCLES(11)
|
||||
goto OP_SBC;
|
||||
|
||||
/*-----------------------------------------
|
||||
CP r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xb8): // CP B
|
||||
OPXY(0xb9): // CP C
|
||||
OPXY(0xba): // CP D
|
||||
OPXY(0xbb): // CP E
|
||||
OPXY(0xbf): // CP A
|
||||
goto OP_CP_R;
|
||||
|
||||
OPXY(0xfe): // CP n
|
||||
goto OP_CP_imm;
|
||||
|
||||
OPXY(0xbc): // CP HX
|
||||
val = data->B.H;
|
||||
USE_CYCLES(1)
|
||||
goto OP_CP;
|
||||
|
||||
OPXY(0xbd): // CP LX
|
||||
val = data->B.L;
|
||||
USE_CYCLES(1)
|
||||
goto OP_CP;
|
||||
|
||||
OPXY(0xbe): // CP (IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
val = READ_MEM8(adr);
|
||||
USE_CYCLES(11)
|
||||
goto OP_CP;
|
||||
|
||||
/*-----------------------------------------
|
||||
AND r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xa0): // AND B
|
||||
OPXY(0xa1): // AND C
|
||||
OPXY(0xa2): // AND D
|
||||
OPXY(0xa3): // AND E
|
||||
OPXY(0xa7): // AND A
|
||||
goto OP_AND_R;
|
||||
|
||||
OPXY(0xe6): // AND A,n
|
||||
goto OP_AND_imm;
|
||||
|
||||
OPXY(0xa4): // AND HX
|
||||
val = data->B.H;
|
||||
USE_CYCLES(1)
|
||||
goto OP_AND;
|
||||
|
||||
OPXY(0xa5): // AND LX
|
||||
val = data->B.L;
|
||||
USE_CYCLES(1)
|
||||
goto OP_AND;
|
||||
|
||||
OPXY(0xa6): // AND (IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
val = READ_MEM8(adr);
|
||||
USE_CYCLES(11)
|
||||
goto OP_AND;
|
||||
|
||||
/*-----------------------------------------
|
||||
XOR r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xa8): // XOR B
|
||||
OPXY(0xa9): // XOR C
|
||||
OPXY(0xaa): // XOR D
|
||||
OPXY(0xab): // XOR E
|
||||
OPXY(0xaf): // XOR A
|
||||
goto OP_XOR_R;
|
||||
|
||||
OPXY(0xee): // XOR A,n
|
||||
goto OP_XOR_imm;
|
||||
|
||||
OPXY(0xac): // XOR HX
|
||||
val = data->B.H;
|
||||
USE_CYCLES(1)
|
||||
goto OP_XOR;
|
||||
|
||||
OPXY(0xad): // XOR LX
|
||||
val = data->B.L;
|
||||
USE_CYCLES(1)
|
||||
goto OP_XOR;
|
||||
|
||||
OPXY(0xae): // XOR (IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
val = READ_MEM8(adr);
|
||||
USE_CYCLES(11)
|
||||
goto OP_XOR;
|
||||
|
||||
/*-----------------------------------------
|
||||
OR r8
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xb0): // OR B
|
||||
OPXY(0xb1): // OR C
|
||||
OPXY(0xb2): // OR D
|
||||
OPXY(0xb3): // OR E
|
||||
OPXY(0xb7): // OR A
|
||||
goto OP_OR_R;
|
||||
|
||||
OPXY(0xf6): // OR A,n
|
||||
goto OP_OR_imm;
|
||||
|
||||
OPXY(0xb4): // OR HX
|
||||
val = data->B.H;
|
||||
USE_CYCLES(1)
|
||||
goto OP_OR;
|
||||
|
||||
OPXY(0xb5): // OR LX
|
||||
val = data->B.L;
|
||||
USE_CYCLES(1)
|
||||
goto OP_OR;
|
||||
|
||||
OPXY(0xb6): // OR (IX+o)
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
val = READ_MEM8(adr);
|
||||
USE_CYCLES(11)
|
||||
goto OP_OR;
|
||||
|
||||
/*-----------------------------------------
|
||||
MISC ARITHMETIC & CPU CONTROL
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x27): // DAA
|
||||
goto OP_DAA;
|
||||
|
||||
OPXY(0x2f): // CPL
|
||||
goto OP_CPL;
|
||||
|
||||
OPXY(0x37): // SCF
|
||||
goto OP_SCF;
|
||||
|
||||
OPXY(0x3f): // CCF
|
||||
goto OP_CCF;
|
||||
|
||||
OPXY(0x76): // HALT
|
||||
goto OP_HALT;
|
||||
|
||||
OPXY(0xf3): // DI
|
||||
goto OP_DI;
|
||||
|
||||
OPXY(0xfb): // EI
|
||||
goto OP_EI;
|
||||
|
||||
/*-----------------------------------------
|
||||
INC r16
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x03): // INC BC
|
||||
goto OP_INC_BC;
|
||||
|
||||
OPXY(0x13): // INC DE
|
||||
goto OP_INC_DE;
|
||||
|
||||
OPXY(0x23): // INC IX
|
||||
goto OP_INC_xx;
|
||||
|
||||
OPXY(0x33): // INC SP
|
||||
goto OP_INC_SP;
|
||||
|
||||
/*-----------------------------------------
|
||||
DEC r16
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x0b): // DEC BC
|
||||
goto OP_DEC_BC;
|
||||
|
||||
OPXY(0x1b): // DEC DE
|
||||
goto OP_DEC_DE;
|
||||
|
||||
OPXY(0x2b): // DEC IX
|
||||
goto OP_DEC_xx;
|
||||
|
||||
OPXY(0x3b): // DEC SP
|
||||
goto OP_DEC_SP;
|
||||
|
||||
/*-----------------------------------------
|
||||
ADD r16
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x09): // ADD IX,BC
|
||||
goto OP_ADD16_xx_BC;
|
||||
|
||||
OPXY(0x19): // ADD IX,DE
|
||||
goto OP_ADD16_xx_DE;
|
||||
|
||||
OPXY(0x29): // ADD IX,IX
|
||||
goto OP_ADD16_xx_xx;
|
||||
|
||||
OPXY(0x39): // ADD IX,SP
|
||||
goto OP_ADD16_xx_SP;
|
||||
|
||||
/*-----------------------------------------
|
||||
ROTATE
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x07): // RLCA
|
||||
goto OP_RLCA;
|
||||
|
||||
OPXY(0x0f): // RRCA
|
||||
goto OP_RRCA;
|
||||
|
||||
OPXY(0x17): // RLA
|
||||
goto OP_RLA;
|
||||
|
||||
OPXY(0x1f): // RRA
|
||||
goto OP_RRA;
|
||||
|
||||
/*-----------------------------------------
|
||||
JP
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xc3): // JP nn
|
||||
goto OP_JP;
|
||||
|
||||
OPXY(0xe9): // JP (IX)
|
||||
goto OP_JP_xx;
|
||||
|
||||
OPXY(0xc2): // JP NZ,nn
|
||||
goto OP_JP_NZ;
|
||||
|
||||
OPXY(0xca): // JP Z,nn
|
||||
goto OP_JP_Z;
|
||||
|
||||
OPXY(0xd2): // JP NC,nn
|
||||
goto OP_JP_NC;
|
||||
|
||||
OPXY(0xda): // JP C,nn
|
||||
goto OP_JP_C;
|
||||
|
||||
OPXY(0xe2): // JP PO,nn
|
||||
goto OP_JP_PO;
|
||||
|
||||
OPXY(0xea): // JP PE,nn
|
||||
goto OP_JP_PE;
|
||||
|
||||
OPXY(0xf2): // JP P,nn
|
||||
goto OP_JP_P;
|
||||
|
||||
OPXY(0xfa): // JP M,nn
|
||||
goto OP_JP_M;
|
||||
|
||||
/*-----------------------------------------
|
||||
JR
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0x10): // DJNZ n
|
||||
goto OP_DJNZ;
|
||||
|
||||
OPXY(0x18): // JR n
|
||||
goto OP_JR;
|
||||
|
||||
OPXY(0x20): // JR NZ,n
|
||||
goto OP_JR_NZ;
|
||||
|
||||
OPXY(0x28): // JR Z,n
|
||||
goto OP_JR_Z;
|
||||
|
||||
OPXY(0x30): // JR NC,n
|
||||
goto OP_JR_NC;
|
||||
|
||||
OPXY(0x38): // JR C,n
|
||||
goto OP_JR_C;
|
||||
|
||||
/*-----------------------------------------
|
||||
CALL
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xcd): // CALL nn
|
||||
goto OP_CALL;
|
||||
|
||||
OPXY(0xc4): // CALL NZ,nn
|
||||
goto OP_CALL_NZ;
|
||||
|
||||
OPXY(0xcc): // CALL Z,nn
|
||||
goto OP_CALL_Z;
|
||||
|
||||
OPXY(0xd4): // CALL NC,nn
|
||||
goto OP_CALL_NC;
|
||||
|
||||
OPXY(0xdc): // CALL C,nn
|
||||
goto OP_CALL_C;
|
||||
|
||||
OPXY(0xe4): // CALL PO,nn
|
||||
goto OP_CALL_PO;
|
||||
|
||||
OPXY(0xec): // CALL PE,nn
|
||||
goto OP_CALL_PE;
|
||||
|
||||
OPXY(0xf4): // CALL P,nn
|
||||
goto OP_CALL_P;
|
||||
|
||||
OPXY(0xfc): // CALL M,nn
|
||||
goto OP_CALL_M;
|
||||
|
||||
/*-----------------------------------------
|
||||
RET
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xc9): // RET
|
||||
goto OP_RET;
|
||||
|
||||
OPXY(0xc0): // RET NZ
|
||||
goto OP_RET_NZ;
|
||||
|
||||
OPXY(0xc8): // RET Z
|
||||
goto OP_RET_Z;
|
||||
|
||||
OPXY(0xd0): // RET NC
|
||||
goto OP_RET_NC;
|
||||
|
||||
OPXY(0xd8): // RET C
|
||||
goto OP_RET_C;
|
||||
|
||||
OPXY(0xe0): // RET PO
|
||||
goto OP_RET_PO;
|
||||
|
||||
OPXY(0xe8): // RET PE
|
||||
goto OP_RET_PE;
|
||||
|
||||
OPXY(0xf0): // RET P
|
||||
goto OP_RET_P;
|
||||
|
||||
OPXY(0xf8): // RET M
|
||||
goto OP_RET_M;
|
||||
|
||||
/*-----------------------------------------
|
||||
RST
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xc7): // RST 0
|
||||
OPXY(0xcf): // RST 1
|
||||
OPXY(0xd7): // RST 2
|
||||
OPXY(0xdf): // RST 3
|
||||
OPXY(0xe7): // RST 4
|
||||
OPXY(0xef): // RST 5
|
||||
OPXY(0xf7): // RST 6
|
||||
OPXY(0xff): // RST 7
|
||||
goto OP_RST;
|
||||
|
||||
/*-----------------------------------------
|
||||
OUT
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xd3): // OUT (n),A
|
||||
goto OP_OUT_mN_A;
|
||||
|
||||
/*-----------------------------------------
|
||||
IN
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xdb): // IN A,(n)
|
||||
goto OP_IN_A_mN;
|
||||
|
||||
/*-----------------------------------------
|
||||
PREFIX
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXY(0xcb): // XYCB prefix (BIT & SHIFT INSTRUCTIONS)
|
||||
{
|
||||
UINT8 src;
|
||||
UINT8 res;
|
||||
|
||||
adr = data->W + (INT8)READ_ARG();
|
||||
Opcode = READ_ARG();
|
||||
#if CZ80_EMULATE_R_EXACTLY
|
||||
zR++;
|
||||
#endif
|
||||
#include "cz80_opXYCB.c"
|
||||
}
|
||||
|
||||
OPXY(0xed): // ED prefix
|
||||
goto ED_PREFIX;
|
||||
|
||||
OPXY(0xdd): // DD prefix (IX)
|
||||
goto DD_PREFIX;
|
||||
|
||||
OPXY(0xfd): // FD prefix (IY)
|
||||
goto FD_PREFIX;
|
||||
|
||||
#if !CZ80_USE_JUMPTABLE
|
||||
}
|
||||
#endif
|
474
cpu/cz80/cz80_opXYCB.c
Normal file
474
cpu/cz80/cz80_opXYCB.c
Normal file
|
@ -0,0 +1,474 @@
|
|||
/******************************************************************************
|
||||
*
|
||||
* CZ80 XYCB opcode include source file
|
||||
* CZ80 emulator version 0.9
|
||||
* Copyright 2004-2005 Stéphane Dallongeville
|
||||
*
|
||||
* (Modified by NJ)
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if CZ80_USE_JUMPTABLE
|
||||
goto *JumpTableXYCB[Opcode];
|
||||
#else
|
||||
switch (Opcode)
|
||||
{
|
||||
#endif
|
||||
|
||||
/*-----------------------------------------
|
||||
RLC
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x00): // RLC (Ix+d), B
|
||||
OPXYCB(0x01): // RLC (Ix+d), C
|
||||
OPXYCB(0x02): // RLC (Ix+d), D
|
||||
OPXYCB(0x03): // RLC (Ix+d), E
|
||||
OPXYCB(0x04): // RLC (Ix+d), H
|
||||
OPXYCB(0x05): // RLC (Ix+d), L
|
||||
OPXYCB(0x07): // RLC (Ix+d), A
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src << 1) | (src >> 7)) & 0xff;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
zR8(Opcode) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0x06): // RLC (Ix+d)
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src << 1) | (src >> 7)) & 0xff;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
/*-----------------------------------------
|
||||
RRC
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x08): // RRC (Ix+d), B
|
||||
OPXYCB(0x09): // RRC (Ix+d), C
|
||||
OPXYCB(0x0a): // RRC (Ix+d), D
|
||||
OPXYCB(0x0b): // RRC (Ix+d), E
|
||||
OPXYCB(0x0c): // RRC (Ix+d), H
|
||||
OPXYCB(0x0d): // RRC (Ix+d), L
|
||||
OPXYCB(0x0f): // RRC (Ix+d), A
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src >> 1) | (src << 7)) & 0xff;
|
||||
zF = SZP[res] | (src & CF);
|
||||
zR8(Opcode & 7) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0x0e): // RRC (Ix+d)
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src >> 1) | (src << 7)) & 0xff;
|
||||
zF = SZP[res] | (src & CF);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
/*-----------------------------------------
|
||||
RL
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x10): // RL (Ix+d), B
|
||||
OPXYCB(0x11): // RL (Ix+d), C
|
||||
OPXYCB(0x12): // RL (Ix+d), D
|
||||
OPXYCB(0x13): // RL (Ix+d), E
|
||||
OPXYCB(0x14): // RL (Ix+d), H
|
||||
OPXYCB(0x15): // RL (Ix+d), L
|
||||
OPXYCB(0x17): // RL (Ix+d), A
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src << 1) | (zF & CF)) & 0xff;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
zR8(Opcode & 7) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0x16): // RL (Ix+d)
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src << 1) | (zF & CF)) & 0xff;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
/*-----------------------------------------
|
||||
RR
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x18): // RR (Ix+d), B
|
||||
OPXYCB(0x19): // RR (Ix+d), C
|
||||
OPXYCB(0x1a): // RR (Ix+d), D
|
||||
OPXYCB(0x1b): // RR (Ix+d), E
|
||||
OPXYCB(0x1c): // RR (Ix+d), H
|
||||
OPXYCB(0x1d): // RR (Ix+d), L
|
||||
OPXYCB(0x1f): // RR (Ix+d), A
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src >> 1) | (zF << 7)) & 0xff;
|
||||
zF = SZP[res] | (src & CF);
|
||||
zR8(Opcode & 7) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0x1e): // RR (Ix+d)
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src >> 1) | (zF << 7)) & 0xff;
|
||||
zF = SZP[res] | (src & CF);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
/*-----------------------------------------
|
||||
SLA
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x20): // SLA (Ix+d), B
|
||||
OPXYCB(0x21): // SLA (Ix+d), C
|
||||
OPXYCB(0x22): // SLA (Ix+d), D
|
||||
OPXYCB(0x23): // SLA (Ix+d), E
|
||||
OPXYCB(0x24): // SLA (Ix+d), H
|
||||
OPXYCB(0x25): // SLA (Ix+d), L
|
||||
OPXYCB(0x27): // SLA (Ix+d), A
|
||||
src = READ_MEM8(adr);
|
||||
res = (src << 1) & 0xff;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
zR8(Opcode & 7) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0x26): // SLA (Ix+d)
|
||||
src = READ_MEM8(adr);
|
||||
res = (src << 1) & 0xff;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
/*-----------------------------------------
|
||||
SRA
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x28): // SRA (Ix+d), B
|
||||
OPXYCB(0x29): // SRA (Ix+d), C
|
||||
OPXYCB(0x2a): // SRA (Ix+d), D
|
||||
OPXYCB(0x2b): // SRA (Ix+d), E
|
||||
OPXYCB(0x2c): // SRA (Ix+d), H
|
||||
OPXYCB(0x2d): // SRA (Ix+d), L
|
||||
OPXYCB(0x2f): // SRA (Ix+d), A
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src >> 1) | (src & 0x80)) & 0xff;
|
||||
zF = SZP[res] | (src & CF);
|
||||
zR8(Opcode & 7) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0x2e): // SRA (Ix+d)
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src >> 1) | (src & 0x80)) & 0xff;
|
||||
zF = SZP[res] | (src & CF);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
/*-----------------------------------------
|
||||
SLL
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x30): // SLL (Ix+d), B
|
||||
OPXYCB(0x31): // SLL (Ix+d), C
|
||||
OPXYCB(0x32): // SLL (Ix+d), D
|
||||
OPXYCB(0x33): // SLL (Ix+d), E
|
||||
OPXYCB(0x34): // SLL (Ix+d), H
|
||||
OPXYCB(0x35): // SLL (Ix+d), L
|
||||
OPXYCB(0x37): // SLL (Ix+d), A
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src << 1) | 0x01) & 0xff;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
zR8(Opcode & 7) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0x36): // SLL (Ix+d)
|
||||
src = READ_MEM8(adr);
|
||||
res = ((src << 1) | 0x01) & 0xff;
|
||||
zF = SZP[res] | (src >> 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
/*-----------------------------------------
|
||||
SRL
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x38): // SRL (Ix+d), B
|
||||
OPXYCB(0x39): // SRL (Ix+d), C
|
||||
OPXYCB(0x3a): // SRL (Ix+d), D
|
||||
OPXYCB(0x3b): // SRL (Ix+d), E
|
||||
OPXYCB(0x3c): // SRL (Ix+d), H
|
||||
OPXYCB(0x3d): // SRL (Ix+d), L
|
||||
OPXYCB(0x3f): // SRL (Ix+d), A
|
||||
src = READ_MEM8(adr);
|
||||
res = (src >> 1) & 0xff;
|
||||
zF = SZP[res] | (src & CF);
|
||||
zR8(Opcode & 7) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0x3e): // SRL (Ix+d)
|
||||
src = READ_MEM8(adr);
|
||||
res = (src >> 1) & 0xff;
|
||||
zF = SZP[res] | (src & CF);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
/*-----------------------------------------
|
||||
BIT
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x40): // BIT 0,(Ix+d)
|
||||
OPXYCB(0x41): // BIT 0,(Ix+d)
|
||||
OPXYCB(0x42): // BIT 0,(Ix+d)
|
||||
OPXYCB(0x43): // BIT 0,(Ix+d)
|
||||
OPXYCB(0x44): // BIT 0,(Ix+d)
|
||||
OPXYCB(0x45): // BIT 0,(Ix+d)
|
||||
OPXYCB(0x47): // BIT 0,(Ix+d)
|
||||
|
||||
OPXYCB(0x48): // BIT 1,(Ix+d)
|
||||
OPXYCB(0x49): // BIT 1,(Ix+d)
|
||||
OPXYCB(0x4a): // BIT 1,(Ix+d)
|
||||
OPXYCB(0x4b): // BIT 1,(Ix+d)
|
||||
OPXYCB(0x4c): // BIT 1,(Ix+d)
|
||||
OPXYCB(0x4d): // BIT 1,(Ix+d)
|
||||
OPXYCB(0x4f): // BIT 1,(Ix+d)
|
||||
|
||||
OPXYCB(0x50): // BIT 2,(Ix+d)
|
||||
OPXYCB(0x51): // BIT 2,(Ix+d)
|
||||
OPXYCB(0x52): // BIT 2,(Ix+d)
|
||||
OPXYCB(0x53): // BIT 2,(Ix+d)
|
||||
OPXYCB(0x54): // BIT 2,(Ix+d)
|
||||
OPXYCB(0x55): // BIT 2,(Ix+d)
|
||||
OPXYCB(0x57): // BIT 2,(Ix+d)
|
||||
|
||||
OPXYCB(0x58): // BIT 3,(Ix+d)
|
||||
OPXYCB(0x59): // BIT 3,(Ix+d)
|
||||
OPXYCB(0x5a): // BIT 3,(Ix+d)
|
||||
OPXYCB(0x5b): // BIT 3,(Ix+d)
|
||||
OPXYCB(0x5c): // BIT 3,(Ix+d)
|
||||
OPXYCB(0x5d): // BIT 3,(Ix+d)
|
||||
OPXYCB(0x5f): // BIT 3,(Ix+d)
|
||||
|
||||
OPXYCB(0x60): // BIT 4,(Ix+d)
|
||||
OPXYCB(0x61): // BIT 4,(Ix+d)
|
||||
OPXYCB(0x62): // BIT 4,(Ix+d)
|
||||
OPXYCB(0x63): // BIT 4,(Ix+d)
|
||||
OPXYCB(0x64): // BIT 4,(Ix+d)
|
||||
OPXYCB(0x65): // BIT 4,(Ix+d)
|
||||
OPXYCB(0x67): // BIT 4,(Ix+d)
|
||||
|
||||
OPXYCB(0x68): // BIT 5,(Ix+d)
|
||||
OPXYCB(0x69): // BIT 5,(Ix+d)
|
||||
OPXYCB(0x6a): // BIT 5,(Ix+d)
|
||||
OPXYCB(0x6b): // BIT 5,(Ix+d)
|
||||
OPXYCB(0x6c): // BIT 5,(Ix+d)
|
||||
OPXYCB(0x6d): // BIT 5,(Ix+d)
|
||||
OPXYCB(0x6f): // BIT 5,(Ix+d)
|
||||
|
||||
OPXYCB(0x70): // BIT 6,(Ix+d)
|
||||
OPXYCB(0x71): // BIT 6,(Ix+d)
|
||||
OPXYCB(0x72): // BIT 6,(Ix+d)
|
||||
OPXYCB(0x73): // BIT 6,(Ix+d)
|
||||
OPXYCB(0x74): // BIT 6,(Ix+d)
|
||||
OPXYCB(0x75): // BIT 6,(Ix+d)
|
||||
OPXYCB(0x77): // BIT 6,(Ix+d)
|
||||
|
||||
OPXYCB(0x78): // BIT 7,(Ix+d)
|
||||
OPXYCB(0x79): // BIT 7,(Ix+d)
|
||||
OPXYCB(0x7a): // BIT 7,(Ix+d)
|
||||
OPXYCB(0x7b): // BIT 7,(Ix+d)
|
||||
OPXYCB(0x7c): // BIT 7,(Ix+d)
|
||||
OPXYCB(0x7d): // BIT 7,(Ix+d)
|
||||
OPXYCB(0x7f): // BIT 7,(Ix+d)
|
||||
|
||||
OPXYCB(0x46): // BIT 0,(Ix+d)
|
||||
OPXYCB(0x4e): // BIT 1,(Ix+d)
|
||||
OPXYCB(0x56): // BIT 2,(Ix+d)
|
||||
OPXYCB(0x5e): // BIT 3,(Ix+d)
|
||||
OPXYCB(0x66): // BIT 4,(Ix+d)
|
||||
OPXYCB(0x6e): // BIT 5,(Ix+d)
|
||||
OPXYCB(0x76): // BIT 6,(Ix+d)
|
||||
OPXYCB(0x7e): // BIT 7,(Ix+d)
|
||||
src = READ_MEM8(adr);
|
||||
zF = (zF & CF) | HF |
|
||||
(SZ_BIT[src & (1 << ((Opcode >> 3) & 7))] & ~(YF | XF)) |
|
||||
((adr >> 8) & (YF | XF));
|
||||
RET(16)
|
||||
|
||||
/*-----------------------------------------
|
||||
RES
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0x80): // RES 0,(Ix+d),B
|
||||
OPXYCB(0x81): // RES 0,(Ix+d),C
|
||||
OPXYCB(0x82): // RES 0,(Ix+d),D
|
||||
OPXYCB(0x83): // RES 0,(Ix+d),E
|
||||
OPXYCB(0x84): // RES 0,(Ix+d),H
|
||||
OPXYCB(0x85): // RES 0,(Ix+d),L
|
||||
OPXYCB(0x87): // RES 0,(Ix+d),A
|
||||
|
||||
OPXYCB(0x88): // RES 1,(Ix+d),B
|
||||
OPXYCB(0x89): // RES 1,(Ix+d),C
|
||||
OPXYCB(0x8a): // RES 1,(Ix+d),D
|
||||
OPXYCB(0x8b): // RES 1,(Ix+d),E
|
||||
OPXYCB(0x8c): // RES 1,(Ix+d),H
|
||||
OPXYCB(0x8d): // RES 1,(Ix+d),L
|
||||
OPXYCB(0x8f): // RES 1,(Ix+d),A
|
||||
|
||||
OPXYCB(0x90): // RES 2,(Ix+d),B
|
||||
OPXYCB(0x91): // RES 2,(Ix+d),C
|
||||
OPXYCB(0x92): // RES 2,(Ix+d),D
|
||||
OPXYCB(0x93): // RES 2,(Ix+d),E
|
||||
OPXYCB(0x94): // RES 2,(Ix+d),H
|
||||
OPXYCB(0x95): // RES 2,(Ix+d),L
|
||||
OPXYCB(0x97): // RES 2,(Ix+d),A
|
||||
|
||||
OPXYCB(0x98): // RES 3,(Ix+d),B
|
||||
OPXYCB(0x99): // RES 3,(Ix+d),C
|
||||
OPXYCB(0x9a): // RES 3,(Ix+d),D
|
||||
OPXYCB(0x9b): // RES 3,(Ix+d),E
|
||||
OPXYCB(0x9c): // RES 3,(Ix+d),H
|
||||
OPXYCB(0x9d): // RES 3,(Ix+d),L
|
||||
OPXYCB(0x9f): // RES 3,(Ix+d),A
|
||||
|
||||
OPXYCB(0xa0): // RES 4,(Ix+d),B
|
||||
OPXYCB(0xa1): // RES 4,(Ix+d),C
|
||||
OPXYCB(0xa2): // RES 4,(Ix+d),D
|
||||
OPXYCB(0xa3): // RES 4,(Ix+d),E
|
||||
OPXYCB(0xa4): // RES 4,(Ix+d),H
|
||||
OPXYCB(0xa5): // RES 4,(Ix+d),L
|
||||
OPXYCB(0xa7): // RES 4,(Ix+d),A
|
||||
|
||||
OPXYCB(0xa8): // RES 5,(Ix+d),B
|
||||
OPXYCB(0xa9): // RES 5,(Ix+d),C
|
||||
OPXYCB(0xaa): // RES 5,(Ix+d),D
|
||||
OPXYCB(0xab): // RES 5,(Ix+d),E
|
||||
OPXYCB(0xac): // RES 5,(Ix+d),H
|
||||
OPXYCB(0xad): // RES 5,(Ix+d),L
|
||||
OPXYCB(0xaf): // RES 5,(Ix+d),A
|
||||
|
||||
OPXYCB(0xb0): // RES 6,(Ix+d),B
|
||||
OPXYCB(0xb1): // RES 6,(Ix+d),C
|
||||
OPXYCB(0xb2): // RES 6,(Ix+d),D
|
||||
OPXYCB(0xb3): // RES 6,(Ix+d),E
|
||||
OPXYCB(0xb4): // RES 6,(Ix+d),H
|
||||
OPXYCB(0xb5): // RES 6,(Ix+d),L
|
||||
OPXYCB(0xb7): // RES 6,(Ix+d),A
|
||||
|
||||
OPXYCB(0xb8): // RES 7,(Ix+d),B
|
||||
OPXYCB(0xb9): // RES 7,(Ix+d),C
|
||||
OPXYCB(0xba): // RES 7,(Ix+d),D
|
||||
OPXYCB(0xbb): // RES 7,(Ix+d),E
|
||||
OPXYCB(0xbc): // RES 7,(Ix+d),H
|
||||
OPXYCB(0xbd): // RES 7,(Ix+d),L
|
||||
OPXYCB(0xbf): // RES 7,(Ix+d),A
|
||||
res = READ_MEM8(adr);
|
||||
res &= ~(1 << ((Opcode >> 3) & 7));
|
||||
zR8(Opcode & 7) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0x86): // RES 0,(Ix+d)
|
||||
OPXYCB(0x8e): // RES 1,(Ix+d)
|
||||
OPXYCB(0x96): // RES 2,(Ix+d)
|
||||
OPXYCB(0x9e): // RES 3,(Ix+d)
|
||||
OPXYCB(0xa6): // RES 4,(Ix+d)
|
||||
OPXYCB(0xae): // RES 5,(Ix+d)
|
||||
OPXYCB(0xb6): // RES 6,(Ix+d)
|
||||
OPXYCB(0xbe): // RES 7,(Ix+d)
|
||||
res = READ_MEM8(adr);
|
||||
res &= ~(1 << ((Opcode >> 3) & 7));
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
/*-----------------------------------------
|
||||
SET
|
||||
-----------------------------------------*/
|
||||
|
||||
OPXYCB(0xc0): // SET 0,(Ix+d),B
|
||||
OPXYCB(0xc1): // SET 0,(Ix+d),C
|
||||
OPXYCB(0xc2): // SET 0,(Ix+d),D
|
||||
OPXYCB(0xc3): // SET 0,(Ix+d),E
|
||||
OPXYCB(0xc4): // SET 0,(Ix+d),H
|
||||
OPXYCB(0xc5): // SET 0,(Ix+d),L
|
||||
OPXYCB(0xc7): // SET 0,(Ix+d),A
|
||||
|
||||
OPXYCB(0xc8): // SET 1,(Ix+d),B
|
||||
OPXYCB(0xc9): // SET 1,(Ix+d),C
|
||||
OPXYCB(0xca): // SET 1,(Ix+d),D
|
||||
OPXYCB(0xcb): // SET 1,(Ix+d),E
|
||||
OPXYCB(0xcc): // SET 1,(Ix+d),H
|
||||
OPXYCB(0xcd): // SET 1,(Ix+d),L
|
||||
OPXYCB(0xcf): // SET 1,(Ix+d),A
|
||||
|
||||
OPXYCB(0xd0): // SET 2,(Ix+d),B
|
||||
OPXYCB(0xd1): // SET 2,(Ix+d),C
|
||||
OPXYCB(0xd2): // SET 2,(Ix+d),D
|
||||
OPXYCB(0xd3): // SET 2,(Ix+d),E
|
||||
OPXYCB(0xd4): // SET 2,(Ix+d),H
|
||||
OPXYCB(0xd5): // SET 2,(Ix+d),L
|
||||
OPXYCB(0xd7): // SET 2,(Ix+d),A
|
||||
|
||||
OPXYCB(0xd8): // SET 3,(Ix+d),B
|
||||
OPXYCB(0xd9): // SET 3,(Ix+d),C
|
||||
OPXYCB(0xda): // SET 3,(Ix+d),D
|
||||
OPXYCB(0xdb): // SET 3,(Ix+d),E
|
||||
OPXYCB(0xdc): // SET 3,(Ix+d),H
|
||||
OPXYCB(0xdd): // SET 3,(Ix+d),L
|
||||
OPXYCB(0xdf): // SET 3,(Ix+d),A
|
||||
|
||||
OPXYCB(0xe0): // SET 4,(Ix+d),B
|
||||
OPXYCB(0xe1): // SET 4,(Ix+d),C
|
||||
OPXYCB(0xe2): // SET 4,(Ix+d),D
|
||||
OPXYCB(0xe3): // SET 4,(Ix+d),E
|
||||
OPXYCB(0xe4): // SET 4,(Ix+d),H
|
||||
OPXYCB(0xe5): // SET 4,(Ix+d),L
|
||||
OPXYCB(0xe7): // SET 4,(Ix+d),A
|
||||
|
||||
OPXYCB(0xe8): // SET 5,(Ix+d),B
|
||||
OPXYCB(0xe9): // SET 5,(Ix+d),C
|
||||
OPXYCB(0xea): // SET 5,(Ix+d),D
|
||||
OPXYCB(0xeb): // SET 5,(Ix+d),E
|
||||
OPXYCB(0xec): // SET 5,(Ix+d),H
|
||||
OPXYCB(0xed): // SET 5,(Ix+d),L
|
||||
OPXYCB(0xef): // SET 5,(Ix+d),A
|
||||
|
||||
OPXYCB(0xf0): // SET 6,(Ix+d),B
|
||||
OPXYCB(0xf1): // SET 6,(Ix+d),C
|
||||
OPXYCB(0xf2): // SET 6,(Ix+d),D
|
||||
OPXYCB(0xf3): // SET 6,(Ix+d),E
|
||||
OPXYCB(0xf4): // SET 6,(Ix+d),H
|
||||
OPXYCB(0xf5): // SET 6,(Ix+d),L
|
||||
OPXYCB(0xf7): // SET 6,(Ix+d),A
|
||||
|
||||
OPXYCB(0xf8): // SET 7,(Ix+d),B
|
||||
OPXYCB(0xf9): // SET 7,(Ix+d),C
|
||||
OPXYCB(0xfa): // SET 7,(Ix+d),D
|
||||
OPXYCB(0xfb): // SET 7,(Ix+d),E
|
||||
OPXYCB(0xfc): // SET 7,(Ix+d),H
|
||||
OPXYCB(0xfd): // SET 7,(Ix+d),L
|
||||
OPXYCB(0xff): // SET 7,(Ix+d),A
|
||||
res = READ_MEM8(adr);
|
||||
res |= 1 << ((Opcode >> 3) & 7);
|
||||
zR8(Opcode & 7) = res;
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
OPXYCB(0xc6): // SET 0,(Ix+d)
|
||||
OPXYCB(0xce): // SET 1,(Ix+d)
|
||||
OPXYCB(0xd6): // SET 2,(Ix+d)
|
||||
OPXYCB(0xde): // SET 3,(Ix+d)
|
||||
OPXYCB(0xe6): // SET 4,(Ix+d)
|
||||
OPXYCB(0xee): // SET 5,(Ix+d)
|
||||
OPXYCB(0xf6): // SET 6,(Ix+d)
|
||||
OPXYCB(0xfe): // SET 7,(Ix+d)
|
||||
res = READ_MEM8(adr);
|
||||
res |= 1 << ((Opcode >> 3) & 7);
|
||||
WRITE_MEM8(adr, res);
|
||||
RET(19)
|
||||
|
||||
#if !CZ80_USE_JUMPTABLE
|
||||
}
|
||||
#endif
|
422
cpu/cz80/cz80jmp.c
Normal file
422
cpu/cz80/cz80jmp.c
Normal file
|
@ -0,0 +1,422 @@
|
|||
/******************************************************************************
|
||||
|
||||
cz80jmp.c
|
||||
|
||||
CZ80 opcodeƒWƒƒƒ“ƒvƒe<EFBFBD>[ƒuƒ‹
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
static const void ALIGN_DATA *JumpTable[0x100] =
|
||||
{
|
||||
&&OP0x00, &&OP0x01, &&OP0x02, &&OP0x03,
|
||||
&&OP0x04, &&OP0x05, &&OP0x06, &&OP0x07,
|
||||
&&OP0x08, &&OP0x09, &&OP0x0a, &&OP0x0b,
|
||||
&&OP0x0c, &&OP0x0d, &&OP0x0e, &&OP0x0f,
|
||||
|
||||
&&OP0x10, &&OP0x11, &&OP0x12, &&OP0x13,
|
||||
&&OP0x14, &&OP0x15, &&OP0x16, &&OP0x17,
|
||||
&&OP0x18, &&OP0x19, &&OP0x1a, &&OP0x1b,
|
||||
&&OP0x1c, &&OP0x1d, &&OP0x1e, &&OP0x1f,
|
||||
|
||||
&&OP0x20, &&OP0x21, &&OP0x22, &&OP0x23,
|
||||
&&OP0x24, &&OP0x25, &&OP0x26, &&OP0x27,
|
||||
&&OP0x28, &&OP0x29, &&OP0x2a, &&OP0x2b,
|
||||
&&OP0x2c, &&OP0x2d, &&OP0x2e, &&OP0x2f,
|
||||
|
||||
&&OP0x30, &&OP0x31, &&OP0x32, &&OP0x33,
|
||||
&&OP0x34, &&OP0x35, &&OP0x36, &&OP0x37,
|
||||
&&OP0x38, &&OP0x39, &&OP0x3a, &&OP0x3b,
|
||||
&&OP0x3c, &&OP0x3d, &&OP0x3e, &&OP0x3f,
|
||||
|
||||
&&OP0x40, &&OP0x41, &&OP0x42, &&OP0x43,
|
||||
&&OP0x44, &&OP0x45, &&OP0x46, &&OP0x47,
|
||||
&&OP0x48, &&OP0x49, &&OP0x4a, &&OP0x4b,
|
||||
&&OP0x4c, &&OP0x4d, &&OP0x4e, &&OP0x4f,
|
||||
|
||||
&&OP0x50, &&OP0x51, &&OP0x52, &&OP0x53,
|
||||
&&OP0x54, &&OP0x55, &&OP0x56, &&OP0x57,
|
||||
&&OP0x58, &&OP0x59, &&OP0x5a, &&OP0x5b,
|
||||
&&OP0x5c, &&OP0x5d, &&OP0x5e, &&OP0x5f,
|
||||
|
||||
&&OP0x60, &&OP0x61, &&OP0x62, &&OP0x63,
|
||||
&&OP0x64, &&OP0x65, &&OP0x66, &&OP0x67,
|
||||
&&OP0x68, &&OP0x69, &&OP0x6a, &&OP0x6b,
|
||||
&&OP0x6c, &&OP0x6d, &&OP0x6e, &&OP0x6f,
|
||||
|
||||
&&OP0x70, &&OP0x71, &&OP0x72, &&OP0x73,
|
||||
&&OP0x74, &&OP0x75, &&OP0x76, &&OP0x77,
|
||||
&&OP0x78, &&OP0x79, &&OP0x7a, &&OP0x7b,
|
||||
&&OP0x7c, &&OP0x7d, &&OP0x7e, &&OP0x7f,
|
||||
|
||||
&&OP0x80, &&OP0x81, &&OP0x82, &&OP0x83,
|
||||
&&OP0x84, &&OP0x85, &&OP0x86, &&OP0x87,
|
||||
&&OP0x88, &&OP0x89, &&OP0x8a, &&OP0x8b,
|
||||
&&OP0x8c, &&OP0x8d, &&OP0x8e, &&OP0x8f,
|
||||
|
||||
&&OP0x90, &&OP0x91, &&OP0x92, &&OP0x93,
|
||||
&&OP0x94, &&OP0x95, &&OP0x96, &&OP0x97,
|
||||
&&OP0x98, &&OP0x99, &&OP0x9a, &&OP0x9b,
|
||||
&&OP0x9c, &&OP0x9d, &&OP0x9e, &&OP0x9f,
|
||||
|
||||
&&OP0xa0, &&OP0xa1, &&OP0xa2, &&OP0xa3,
|
||||
&&OP0xa4, &&OP0xa5, &&OP0xa6, &&OP0xa7,
|
||||
&&OP0xa8, &&OP0xa9, &&OP0xaa, &&OP0xab,
|
||||
&&OP0xac, &&OP0xad, &&OP0xae, &&OP0xaf,
|
||||
|
||||
&&OP0xb0, &&OP0xb1, &&OP0xb2, &&OP0xb3,
|
||||
&&OP0xb4, &&OP0xb5, &&OP0xb6, &&OP0xb7,
|
||||
&&OP0xb8, &&OP0xb9, &&OP0xba, &&OP0xbb,
|
||||
&&OP0xbc, &&OP0xbd, &&OP0xbe, &&OP0xbf,
|
||||
|
||||
&&OP0xc0, &&OP0xc1, &&OP0xc2, &&OP0xc3,
|
||||
&&OP0xc4, &&OP0xc5, &&OP0xc6, &&OP0xc7,
|
||||
&&OP0xc8, &&OP0xc9, &&OP0xca, &&OP0xcb,
|
||||
&&OP0xcc, &&OP0xcd, &&OP0xce, &&OP0xcf,
|
||||
|
||||
&&OP0xd0, &&OP0xd1, &&OP0xd2, &&OP0xd3,
|
||||
&&OP0xd4, &&OP0xd5, &&OP0xd6, &&OP0xd7,
|
||||
&&OP0xd8, &&OP0xd9, &&OP0xda, &&OP0xdb,
|
||||
&&OP0xdc, &&OP0xdd, &&OP0xde, &&OP0xdf,
|
||||
|
||||
&&OP0xe0, &&OP0xe1, &&OP0xe2, &&OP0xe3,
|
||||
&&OP0xe4, &&OP0xe5, &&OP0xe6, &&OP0xe7,
|
||||
&&OP0xe8, &&OP0xe9, &&OP0xea, &&OP0xeb,
|
||||
&&OP0xec, &&OP0xed, &&OP0xee, &&OP0xef,
|
||||
|
||||
&&OP0xf0, &&OP0xf1, &&OP0xf2, &&OP0xf3,
|
||||
&&OP0xf4, &&OP0xf5, &&OP0xf6, &&OP0xf7,
|
||||
&&OP0xf8, &&OP0xf9, &&OP0xfa, &&OP0xfb,
|
||||
&&OP0xfc, &&OP0xfd, &&OP0xfe, &&OP0xff
|
||||
};
|
||||
|
||||
static const void ALIGN_DATA *JumpTableCB[0x100] =
|
||||
{
|
||||
&&OPCB0x00, &&OPCB0x01, &&OPCB0x02, &&OPCB0x03,
|
||||
&&OPCB0x04, &&OPCB0x05, &&OPCB0x06, &&OPCB0x07,
|
||||
&&OPCB0x08, &&OPCB0x09, &&OPCB0x0a, &&OPCB0x0b,
|
||||
&&OPCB0x0c, &&OPCB0x0d, &&OPCB0x0e, &&OPCB0x0f,
|
||||
|
||||
&&OPCB0x10, &&OPCB0x11, &&OPCB0x12, &&OPCB0x13,
|
||||
&&OPCB0x14, &&OPCB0x15, &&OPCB0x16, &&OPCB0x17,
|
||||
&&OPCB0x18, &&OPCB0x19, &&OPCB0x1a, &&OPCB0x1b,
|
||||
&&OPCB0x1c, &&OPCB0x1d, &&OPCB0x1e, &&OPCB0x1f,
|
||||
|
||||
&&OPCB0x20, &&OPCB0x21, &&OPCB0x22, &&OPCB0x23,
|
||||
&&OPCB0x24, &&OPCB0x25, &&OPCB0x26, &&OPCB0x27,
|
||||
&&OPCB0x28, &&OPCB0x29, &&OPCB0x2a, &&OPCB0x2b,
|
||||
&&OPCB0x2c, &&OPCB0x2d, &&OPCB0x2e, &&OPCB0x2f,
|
||||
|
||||
&&OPCB0x30, &&OPCB0x31, &&OPCB0x32, &&OPCB0x33,
|
||||
&&OPCB0x34, &&OPCB0x35, &&OPCB0x36, &&OPCB0x37,
|
||||
&&OPCB0x38, &&OPCB0x39, &&OPCB0x3a, &&OPCB0x3b,
|
||||
&&OPCB0x3c, &&OPCB0x3d, &&OPCB0x3e, &&OPCB0x3f,
|
||||
|
||||
&&OPCB0x40, &&OPCB0x41, &&OPCB0x42, &&OPCB0x43,
|
||||
&&OPCB0x44, &&OPCB0x45, &&OPCB0x46, &&OPCB0x47,
|
||||
&&OPCB0x48, &&OPCB0x49, &&OPCB0x4a, &&OPCB0x4b,
|
||||
&&OPCB0x4c, &&OPCB0x4d, &&OPCB0x4e, &&OPCB0x4f,
|
||||
|
||||
&&OPCB0x50, &&OPCB0x51, &&OPCB0x52, &&OPCB0x53,
|
||||
&&OPCB0x54, &&OPCB0x55, &&OPCB0x56, &&OPCB0x57,
|
||||
&&OPCB0x58, &&OPCB0x59, &&OPCB0x5a, &&OPCB0x5b,
|
||||
&&OPCB0x5c, &&OPCB0x5d, &&OPCB0x5e, &&OPCB0x5f,
|
||||
|
||||
&&OPCB0x60, &&OPCB0x61, &&OPCB0x62, &&OPCB0x63,
|
||||
&&OPCB0x64, &&OPCB0x65, &&OPCB0x66, &&OPCB0x67,
|
||||
&&OPCB0x68, &&OPCB0x69, &&OPCB0x6a, &&OPCB0x6b,
|
||||
&&OPCB0x6c, &&OPCB0x6d, &&OPCB0x6e, &&OPCB0x6f,
|
||||
|
||||
&&OPCB0x70, &&OPCB0x71, &&OPCB0x72, &&OPCB0x73,
|
||||
&&OPCB0x74, &&OPCB0x75, &&OPCB0x76, &&OPCB0x77,
|
||||
&&OPCB0x78, &&OPCB0x79, &&OPCB0x7a, &&OPCB0x7b,
|
||||
&&OPCB0x7c, &&OPCB0x7d, &&OPCB0x7e, &&OPCB0x7f,
|
||||
|
||||
&&OPCB0x80, &&OPCB0x81, &&OPCB0x82, &&OPCB0x83,
|
||||
&&OPCB0x84, &&OPCB0x85, &&OPCB0x86, &&OPCB0x87,
|
||||
&&OPCB0x88, &&OPCB0x89, &&OPCB0x8a, &&OPCB0x8b,
|
||||
&&OPCB0x8c, &&OPCB0x8d, &&OPCB0x8e, &&OPCB0x8f,
|
||||
|
||||
&&OPCB0x90, &&OPCB0x91, &&OPCB0x92, &&OPCB0x93,
|
||||
&&OPCB0x94, &&OPCB0x95, &&OPCB0x96, &&OPCB0x97,
|
||||
&&OPCB0x98, &&OPCB0x99, &&OPCB0x9a, &&OPCB0x9b,
|
||||
&&OPCB0x9c, &&OPCB0x9d, &&OPCB0x9e, &&OPCB0x9f,
|
||||
|
||||
&&OPCB0xa0, &&OPCB0xa1, &&OPCB0xa2, &&OPCB0xa3,
|
||||
&&OPCB0xa4, &&OPCB0xa5, &&OPCB0xa6, &&OPCB0xa7,
|
||||
&&OPCB0xa8, &&OPCB0xa9, &&OPCB0xaa, &&OPCB0xab,
|
||||
&&OPCB0xac, &&OPCB0xad, &&OPCB0xae, &&OPCB0xaf,
|
||||
|
||||
&&OPCB0xb0, &&OPCB0xb1, &&OPCB0xb2, &&OPCB0xb3,
|
||||
&&OPCB0xb4, &&OPCB0xb5, &&OPCB0xb6, &&OPCB0xb7,
|
||||
&&OPCB0xb8, &&OPCB0xb9, &&OPCB0xba, &&OPCB0xbb,
|
||||
&&OPCB0xbc, &&OPCB0xbd, &&OPCB0xbe, &&OPCB0xbf,
|
||||
|
||||
&&OPCB0xc0, &&OPCB0xc1, &&OPCB0xc2, &&OPCB0xc3,
|
||||
&&OPCB0xc4, &&OPCB0xc5, &&OPCB0xc6, &&OPCB0xc7,
|
||||
&&OPCB0xc8, &&OPCB0xc9, &&OPCB0xca, &&OPCB0xcb,
|
||||
&&OPCB0xcc, &&OPCB0xcd, &&OPCB0xce, &&OPCB0xcf,
|
||||
|
||||
&&OPCB0xd0, &&OPCB0xd1, &&OPCB0xd2, &&OPCB0xd3,
|
||||
&&OPCB0xd4, &&OPCB0xd5, &&OPCB0xd6, &&OPCB0xd7,
|
||||
&&OPCB0xd8, &&OPCB0xd9, &&OPCB0xda, &&OPCB0xdb,
|
||||
&&OPCB0xdc, &&OPCB0xdd, &&OPCB0xde, &&OPCB0xdf,
|
||||
|
||||
&&OPCB0xe0, &&OPCB0xe1, &&OPCB0xe2, &&OPCB0xe3,
|
||||
&&OPCB0xe4, &&OPCB0xe5, &&OPCB0xe6, &&OPCB0xe7,
|
||||
&&OPCB0xe8, &&OPCB0xe9, &&OPCB0xea, &&OPCB0xeb,
|
||||
&&OPCB0xec, &&OPCB0xed, &&OPCB0xee, &&OPCB0xef,
|
||||
|
||||
&&OPCB0xf0, &&OPCB0xf1, &&OPCB0xf2, &&OPCB0xf3,
|
||||
&&OPCB0xf4, &&OPCB0xf5, &&OPCB0xf6, &&OPCB0xf7,
|
||||
&&OPCB0xf8, &&OPCB0xf9, &&OPCB0xfa, &&OPCB0xfb,
|
||||
&&OPCB0xfc, &&OPCB0xfd, &&OPCB0xfe, &&OPCB0xff
|
||||
};
|
||||
|
||||
static const void ALIGN_DATA *JumpTableED[0x100] =
|
||||
{
|
||||
&&OPED0x00, &&OPED0x01, &&OPED0x02, &&OPED0x03,
|
||||
&&OPED0x04, &&OPED0x05, &&OPED0x06, &&OPED0x07,
|
||||
&&OPED0x08, &&OPED0x09, &&OPED0x0a, &&OPED0x0b,
|
||||
&&OPED0x0c, &&OPED0x0d, &&OPED0x0e, &&OPED0x0f,
|
||||
|
||||
&&OPED0x10, &&OPED0x11, &&OPED0x12, &&OPED0x13,
|
||||
&&OPED0x14, &&OPED0x15, &&OPED0x16, &&OPED0x17,
|
||||
&&OPED0x18, &&OPED0x19, &&OPED0x1a, &&OPED0x1b,
|
||||
&&OPED0x1c, &&OPED0x1d, &&OPED0x1e, &&OPED0x1f,
|
||||
|
||||
&&OPED0x20, &&OPED0x21, &&OPED0x22, &&OPED0x23,
|
||||
&&OPED0x24, &&OPED0x25, &&OPED0x26, &&OPED0x27,
|
||||
&&OPED0x28, &&OPED0x29, &&OPED0x2a, &&OPED0x2b,
|
||||
&&OPED0x2c, &&OPED0x2d, &&OPED0x2e, &&OPED0x2f,
|
||||
|
||||
&&OPED0x30, &&OPED0x31, &&OPED0x32, &&OPED0x33,
|
||||
&&OPED0x34, &&OPED0x35, &&OPED0x36, &&OPED0x37,
|
||||
&&OPED0x38, &&OPED0x39, &&OPED0x3a, &&OPED0x3b,
|
||||
&&OPED0x3c, &&OPED0x3d, &&OPED0x3e, &&OPED0x3f,
|
||||
|
||||
&&OPED0x40, &&OPED0x41, &&OPED0x42, &&OPED0x43,
|
||||
&&OPED0x44, &&OPED0x45, &&OPED0x46, &&OPED0x47,
|
||||
&&OPED0x48, &&OPED0x49, &&OPED0x4a, &&OPED0x4b,
|
||||
&&OPED0x4c, &&OPED0x4d, &&OPED0x4e, &&OPED0x4f,
|
||||
|
||||
&&OPED0x50, &&OPED0x51, &&OPED0x52, &&OPED0x53,
|
||||
&&OPED0x54, &&OPED0x55, &&OPED0x56, &&OPED0x57,
|
||||
&&OPED0x58, &&OPED0x59, &&OPED0x5a, &&OPED0x5b,
|
||||
&&OPED0x5c, &&OPED0x5d, &&OPED0x5e, &&OPED0x5f,
|
||||
|
||||
&&OPED0x60, &&OPED0x61, &&OPED0x62, &&OPED0x63,
|
||||
&&OPED0x64, &&OPED0x65, &&OPED0x66, &&OPED0x67,
|
||||
&&OPED0x68, &&OPED0x69, &&OPED0x6a, &&OPED0x6b,
|
||||
&&OPED0x6c, &&OPED0x6d, &&OPED0x6e, &&OPED0x6f,
|
||||
|
||||
&&OPED0x70, &&OPED0x71, &&OPED0x72, &&OPED0x73,
|
||||
&&OPED0x74, &&OPED0x75, &&OPED0x76, &&OPED0x77,
|
||||
&&OPED0x78, &&OPED0x79, &&OPED0x7a, &&OPED0x7b,
|
||||
&&OPED0x7c, &&OPED0x7d, &&OPED0x7e, &&OPED0x7f,
|
||||
|
||||
&&OPED0x80, &&OPED0x81, &&OPED0x82, &&OPED0x83,
|
||||
&&OPED0x84, &&OPED0x85, &&OPED0x86, &&OPED0x87,
|
||||
&&OPED0x88, &&OPED0x89, &&OPED0x8a, &&OPED0x8b,
|
||||
&&OPED0x8c, &&OPED0x8d, &&OPED0x8e, &&OPED0x8f,
|
||||
|
||||
&&OPED0x90, &&OPED0x91, &&OPED0x92, &&OPED0x93,
|
||||
&&OPED0x94, &&OPED0x95, &&OPED0x96, &&OPED0x97,
|
||||
&&OPED0x98, &&OPED0x99, &&OPED0x9a, &&OPED0x9b,
|
||||
&&OPED0x9c, &&OPED0x9d, &&OPED0x9e, &&OPED0x9f,
|
||||
|
||||
&&OPED0xa0, &&OPED0xa1, &&OPED0xa2, &&OPED0xa3,
|
||||
&&OPED0xa4, &&OPED0xa5, &&OPED0xa6, &&OPED0xa7,
|
||||
&&OPED0xa8, &&OPED0xa9, &&OPED0xaa, &&OPED0xab,
|
||||
&&OPED0xac, &&OPED0xad, &&OPED0xae, &&OPED0xaf,
|
||||
|
||||
&&OPED0xb0, &&OPED0xb1, &&OPED0xb2, &&OPED0xb3,
|
||||
&&OPED0xb4, &&OPED0xb5, &&OPED0xb6, &&OPED0xb7,
|
||||
&&OPED0xb8, &&OPED0xb9, &&OPED0xba, &&OPED0xbb,
|
||||
&&OPED0xbc, &&OPED0xbd, &&OPED0xbe, &&OPED0xbf,
|
||||
|
||||
&&OPED0xc0, &&OPED0xc1, &&OPED0xc2, &&OPED0xc3,
|
||||
&&OPED0xc4, &&OPED0xc5, &&OPED0xc6, &&OPED0xc7,
|
||||
&&OPED0xc8, &&OPED0xc9, &&OPED0xca, &&OPED0xcb,
|
||||
&&OPED0xcc, &&OPED0xcd, &&OPED0xce, &&OPED0xcf,
|
||||
|
||||
&&OPED0xd0, &&OPED0xd1, &&OPED0xd2, &&OPED0xd3,
|
||||
&&OPED0xd4, &&OPED0xd5, &&OPED0xd6, &&OPED0xd7,
|
||||
&&OPED0xd8, &&OPED0xd9, &&OPED0xda, &&OPED0xdb,
|
||||
&&OPED0xdc, &&OPED0xdd, &&OPED0xde, &&OPED0xdf,
|
||||
|
||||
&&OPED0xe0, &&OPED0xe1, &&OPED0xe2, &&OPED0xe3,
|
||||
&&OPED0xe4, &&OPED0xe5, &&OPED0xe6, &&OPED0xe7,
|
||||
&&OPED0xe8, &&OPED0xe9, &&OPED0xea, &&OPED0xeb,
|
||||
&&OPED0xec, &&OPED0xed, &&OPED0xee, &&OPED0xef,
|
||||
|
||||
&&OPED0xf0, &&OPED0xf1, &&OPED0xf2, &&OPED0xf3,
|
||||
&&OPED0xf4, &&OPED0xf5, &&OPED0xf6, &&OPED0xf7,
|
||||
&&OPED0xf8, &&OPED0xf9, &&OPED0xfa, &&OPED0xfb,
|
||||
&&OPED0xfc, &&OPED0xfd, &&OPED0xfe, &&OPED0xff
|
||||
};
|
||||
|
||||
static const void ALIGN_DATA *JumpTableXY[0x100] =
|
||||
{
|
||||
&&OPXY0x00, &&OPXY0x01, &&OPXY0x02, &&OPXY0x03,
|
||||
&&OPXY0x04, &&OPXY0x05, &&OPXY0x06, &&OPXY0x07,
|
||||
&&OPXY0x08, &&OPXY0x09, &&OPXY0x0a, &&OPXY0x0b,
|
||||
&&OPXY0x0c, &&OPXY0x0d, &&OPXY0x0e, &&OPXY0x0f,
|
||||
|
||||
&&OPXY0x10, &&OPXY0x11, &&OPXY0x12, &&OPXY0x13,
|
||||
&&OPXY0x14, &&OPXY0x15, &&OPXY0x16, &&OPXY0x17,
|
||||
&&OPXY0x18, &&OPXY0x19, &&OPXY0x1a, &&OPXY0x1b,
|
||||
&&OPXY0x1c, &&OPXY0x1d, &&OPXY0x1e, &&OPXY0x1f,
|
||||
|
||||
&&OPXY0x20, &&OPXY0x21, &&OPXY0x22, &&OPXY0x23,
|
||||
&&OPXY0x24, &&OPXY0x25, &&OPXY0x26, &&OPXY0x27,
|
||||
&&OPXY0x28, &&OPXY0x29, &&OPXY0x2a, &&OPXY0x2b,
|
||||
&&OPXY0x2c, &&OPXY0x2d, &&OPXY0x2e, &&OPXY0x2f,
|
||||
|
||||
&&OPXY0x30, &&OPXY0x31, &&OPXY0x32, &&OPXY0x33,
|
||||
&&OPXY0x34, &&OPXY0x35, &&OPXY0x36, &&OPXY0x37,
|
||||
&&OPXY0x38, &&OPXY0x39, &&OPXY0x3a, &&OPXY0x3b,
|
||||
&&OPXY0x3c, &&OPXY0x3d, &&OPXY0x3e, &&OPXY0x3f,
|
||||
|
||||
&&OPXY0x40, &&OPXY0x41, &&OPXY0x42, &&OPXY0x43,
|
||||
&&OPXY0x44, &&OPXY0x45, &&OPXY0x46, &&OPXY0x47,
|
||||
&&OPXY0x48, &&OPXY0x49, &&OPXY0x4a, &&OPXY0x4b,
|
||||
&&OPXY0x4c, &&OPXY0x4d, &&OPXY0x4e, &&OPXY0x4f,
|
||||
|
||||
&&OPXY0x50, &&OPXY0x51, &&OPXY0x52, &&OPXY0x53,
|
||||
&&OPXY0x54, &&OPXY0x55, &&OPXY0x56, &&OPXY0x57,
|
||||
&&OPXY0x58, &&OPXY0x59, &&OPXY0x5a, &&OPXY0x5b,
|
||||
&&OPXY0x5c, &&OPXY0x5d, &&OPXY0x5e, &&OPXY0x5f,
|
||||
|
||||
&&OPXY0x60, &&OPXY0x61, &&OPXY0x62, &&OPXY0x63,
|
||||
&&OPXY0x64, &&OPXY0x65, &&OPXY0x66, &&OPXY0x67,
|
||||
&&OPXY0x68, &&OPXY0x69, &&OPXY0x6a, &&OPXY0x6b,
|
||||
&&OPXY0x6c, &&OPXY0x6d, &&OPXY0x6e, &&OPXY0x6f,
|
||||
|
||||
&&OPXY0x70, &&OPXY0x71, &&OPXY0x72, &&OPXY0x73,
|
||||
&&OPXY0x74, &&OPXY0x75, &&OPXY0x76, &&OPXY0x77,
|
||||
&&OPXY0x78, &&OPXY0x79, &&OPXY0x7a, &&OPXY0x7b,
|
||||
&&OPXY0x7c, &&OPXY0x7d, &&OPXY0x7e, &&OPXY0x7f,
|
||||
|
||||
&&OPXY0x80, &&OPXY0x81, &&OPXY0x82, &&OPXY0x83,
|
||||
&&OPXY0x84, &&OPXY0x85, &&OPXY0x86, &&OPXY0x87,
|
||||
&&OPXY0x88, &&OPXY0x89, &&OPXY0x8a, &&OPXY0x8b,
|
||||
&&OPXY0x8c, &&OPXY0x8d, &&OPXY0x8e, &&OPXY0x8f,
|
||||
|
||||
&&OPXY0x90, &&OPXY0x91, &&OPXY0x92, &&OPXY0x93,
|
||||
&&OPXY0x94, &&OPXY0x95, &&OPXY0x96, &&OPXY0x97,
|
||||
&&OPXY0x98, &&OPXY0x99, &&OPXY0x9a, &&OPXY0x9b,
|
||||
&&OPXY0x9c, &&OPXY0x9d, &&OPXY0x9e, &&OPXY0x9f,
|
||||
|
||||
&&OPXY0xa0, &&OPXY0xa1, &&OPXY0xa2, &&OPXY0xa3,
|
||||
&&OPXY0xa4, &&OPXY0xa5, &&OPXY0xa6, &&OPXY0xa7,
|
||||
&&OPXY0xa8, &&OPXY0xa9, &&OPXY0xaa, &&OPXY0xab,
|
||||
&&OPXY0xac, &&OPXY0xad, &&OPXY0xae, &&OPXY0xaf,
|
||||
|
||||
&&OPXY0xb0, &&OPXY0xb1, &&OPXY0xb2, &&OPXY0xb3,
|
||||
&&OPXY0xb4, &&OPXY0xb5, &&OPXY0xb6, &&OPXY0xb7,
|
||||
&&OPXY0xb8, &&OPXY0xb9, &&OPXY0xba, &&OPXY0xbb,
|
||||
&&OPXY0xbc, &&OPXY0xbd, &&OPXY0xbe, &&OPXY0xbf,
|
||||
|
||||
&&OPXY0xc0, &&OPXY0xc1, &&OPXY0xc2, &&OPXY0xc3,
|
||||
&&OPXY0xc4, &&OPXY0xc5, &&OPXY0xc6, &&OPXY0xc7,
|
||||
&&OPXY0xc8, &&OPXY0xc9, &&OPXY0xca, &&OPXY0xcb,
|
||||
&&OPXY0xcc, &&OPXY0xcd, &&OPXY0xce, &&OPXY0xcf,
|
||||
|
||||
&&OPXY0xd0, &&OPXY0xd1, &&OPXY0xd2, &&OPXY0xd3,
|
||||
&&OPXY0xd4, &&OPXY0xd5, &&OPXY0xd6, &&OPXY0xd7,
|
||||
&&OPXY0xd8, &&OPXY0xd9, &&OPXY0xda, &&OPXY0xdb,
|
||||
&&OPXY0xdc, &&OPXY0xdd, &&OPXY0xde, &&OPXY0xdf,
|
||||
|
||||
&&OPXY0xe0, &&OPXY0xe1, &&OPXY0xe2, &&OPXY0xe3,
|
||||
&&OPXY0xe4, &&OPXY0xe5, &&OPXY0xe6, &&OPXY0xe7,
|
||||
&&OPXY0xe8, &&OPXY0xe9, &&OPXY0xea, &&OPXY0xeb,
|
||||
&&OPXY0xec, &&OPXY0xed, &&OPXY0xee, &&OPXY0xef,
|
||||
|
||||
&&OPXY0xf0, &&OPXY0xf1, &&OPXY0xf2, &&OPXY0xf3,
|
||||
&&OPXY0xf4, &&OPXY0xf5, &&OPXY0xf6, &&OPXY0xf7,
|
||||
&&OPXY0xf8, &&OPXY0xf9, &&OPXY0xfa, &&OPXY0xfb,
|
||||
&&OPXY0xfc, &&OPXY0xfd, &&OPXY0xfe, &&OPXY0xff
|
||||
};
|
||||
|
||||
static const void ALIGN_DATA *JumpTableXYCB[0x100] =
|
||||
{
|
||||
&&OPXYCB0x00, &&OPXYCB0x01, &&OPXYCB0x02, &&OPXYCB0x03,
|
||||
&&OPXYCB0x04, &&OPXYCB0x05, &&OPXYCB0x06, &&OPXYCB0x07,
|
||||
&&OPXYCB0x08, &&OPXYCB0x09, &&OPXYCB0x0a, &&OPXYCB0x0b,
|
||||
&&OPXYCB0x0c, &&OPXYCB0x0d, &&OPXYCB0x0e, &&OPXYCB0x0f,
|
||||
|
||||
&&OPXYCB0x10, &&OPXYCB0x11, &&OPXYCB0x12, &&OPXYCB0x13,
|
||||
&&OPXYCB0x14, &&OPXYCB0x15, &&OPXYCB0x16, &&OPXYCB0x17,
|
||||
&&OPXYCB0x18, &&OPXYCB0x19, &&OPXYCB0x1a, &&OPXYCB0x1b,
|
||||
&&OPXYCB0x1c, &&OPXYCB0x1d, &&OPXYCB0x1e, &&OPXYCB0x1f,
|
||||
|
||||
&&OPXYCB0x20, &&OPXYCB0x21, &&OPXYCB0x22, &&OPXYCB0x23,
|
||||
&&OPXYCB0x24, &&OPXYCB0x25, &&OPXYCB0x26, &&OPXYCB0x27,
|
||||
&&OPXYCB0x28, &&OPXYCB0x29, &&OPXYCB0x2a, &&OPXYCB0x2b,
|
||||
&&OPXYCB0x2c, &&OPXYCB0x2d, &&OPXYCB0x2e, &&OPXYCB0x2f,
|
||||
|
||||
&&OPXYCB0x30, &&OPXYCB0x31, &&OPXYCB0x32, &&OPXYCB0x33,
|
||||
&&OPXYCB0x34, &&OPXYCB0x35, &&OPXYCB0x36, &&OPXYCB0x37,
|
||||
&&OPXYCB0x38, &&OPXYCB0x39, &&OPXYCB0x3a, &&OPXYCB0x3b,
|
||||
&&OPXYCB0x3c, &&OPXYCB0x3d, &&OPXYCB0x3e, &&OPXYCB0x3f,
|
||||
|
||||
&&OPXYCB0x40, &&OPXYCB0x41, &&OPXYCB0x42, &&OPXYCB0x43,
|
||||
&&OPXYCB0x44, &&OPXYCB0x45, &&OPXYCB0x46, &&OPXYCB0x47,
|
||||
&&OPXYCB0x48, &&OPXYCB0x49, &&OPXYCB0x4a, &&OPXYCB0x4b,
|
||||
&&OPXYCB0x4c, &&OPXYCB0x4d, &&OPXYCB0x4e, &&OPXYCB0x4f,
|
||||
|
||||
&&OPXYCB0x50, &&OPXYCB0x51, &&OPXYCB0x52, &&OPXYCB0x53,
|
||||
&&OPXYCB0x54, &&OPXYCB0x55, &&OPXYCB0x56, &&OPXYCB0x57,
|
||||
&&OPXYCB0x58, &&OPXYCB0x59, &&OPXYCB0x5a, &&OPXYCB0x5b,
|
||||
&&OPXYCB0x5c, &&OPXYCB0x5d, &&OPXYCB0x5e, &&OPXYCB0x5f,
|
||||
|
||||
&&OPXYCB0x60, &&OPXYCB0x61, &&OPXYCB0x62, &&OPXYCB0x63,
|
||||
&&OPXYCB0x64, &&OPXYCB0x65, &&OPXYCB0x66, &&OPXYCB0x67,
|
||||
&&OPXYCB0x68, &&OPXYCB0x69, &&OPXYCB0x6a, &&OPXYCB0x6b,
|
||||
&&OPXYCB0x6c, &&OPXYCB0x6d, &&OPXYCB0x6e, &&OPXYCB0x6f,
|
||||
|
||||
&&OPXYCB0x70, &&OPXYCB0x71, &&OPXYCB0x72, &&OPXYCB0x73,
|
||||
&&OPXYCB0x74, &&OPXYCB0x75, &&OPXYCB0x76, &&OPXYCB0x77,
|
||||
&&OPXYCB0x78, &&OPXYCB0x79, &&OPXYCB0x7a, &&OPXYCB0x7b,
|
||||
&&OPXYCB0x7c, &&OPXYCB0x7d, &&OPXYCB0x7e, &&OPXYCB0x7f,
|
||||
|
||||
&&OPXYCB0x80, &&OPXYCB0x81, &&OPXYCB0x82, &&OPXYCB0x83,
|
||||
&&OPXYCB0x84, &&OPXYCB0x85, &&OPXYCB0x86, &&OPXYCB0x87,
|
||||
&&OPXYCB0x88, &&OPXYCB0x89, &&OPXYCB0x8a, &&OPXYCB0x8b,
|
||||
&&OPXYCB0x8c, &&OPXYCB0x8d, &&OPXYCB0x8e, &&OPXYCB0x8f,
|
||||
|
||||
&&OPXYCB0x90, &&OPXYCB0x91, &&OPXYCB0x92, &&OPXYCB0x93,
|
||||
&&OPXYCB0x94, &&OPXYCB0x95, &&OPXYCB0x96, &&OPXYCB0x97,
|
||||
&&OPXYCB0x98, &&OPXYCB0x99, &&OPXYCB0x9a, &&OPXYCB0x9b,
|
||||
&&OPXYCB0x9c, &&OPXYCB0x9d, &&OPXYCB0x9e, &&OPXYCB0x9f,
|
||||
|
||||
&&OPXYCB0xa0, &&OPXYCB0xa1, &&OPXYCB0xa2, &&OPXYCB0xa3,
|
||||
&&OPXYCB0xa4, &&OPXYCB0xa5, &&OPXYCB0xa6, &&OPXYCB0xa7,
|
||||
&&OPXYCB0xa8, &&OPXYCB0xa9, &&OPXYCB0xaa, &&OPXYCB0xab,
|
||||
&&OPXYCB0xac, &&OPXYCB0xad, &&OPXYCB0xae, &&OPXYCB0xaf,
|
||||
|
||||
&&OPXYCB0xb0, &&OPXYCB0xb1, &&OPXYCB0xb2, &&OPXYCB0xb3,
|
||||
&&OPXYCB0xb4, &&OPXYCB0xb5, &&OPXYCB0xb6, &&OPXYCB0xb7,
|
||||
&&OPXYCB0xb8, &&OPXYCB0xb9, &&OPXYCB0xba, &&OPXYCB0xbb,
|
||||
&&OPXYCB0xbc, &&OPXYCB0xbd, &&OPXYCB0xbe, &&OPXYCB0xbf,
|
||||
|
||||
&&OPXYCB0xc0, &&OPXYCB0xc1, &&OPXYCB0xc2, &&OPXYCB0xc3,
|
||||
&&OPXYCB0xc4, &&OPXYCB0xc5, &&OPXYCB0xc6, &&OPXYCB0xc7,
|
||||
&&OPXYCB0xc8, &&OPXYCB0xc9, &&OPXYCB0xca, &&OPXYCB0xcb,
|
||||
&&OPXYCB0xcc, &&OPXYCB0xcd, &&OPXYCB0xce, &&OPXYCB0xcf,
|
||||
|
||||
&&OPXYCB0xd0, &&OPXYCB0xd1, &&OPXYCB0xd2, &&OPXYCB0xd3,
|
||||
&&OPXYCB0xd4, &&OPXYCB0xd5, &&OPXYCB0xd6, &&OPXYCB0xd7,
|
||||
&&OPXYCB0xd8, &&OPXYCB0xd9, &&OPXYCB0xda, &&OPXYCB0xdb,
|
||||
&&OPXYCB0xdc, &&OPXYCB0xdd, &&OPXYCB0xde, &&OPXYCB0xdf,
|
||||
|
||||
&&OPXYCB0xe0, &&OPXYCB0xe1, &&OPXYCB0xe2, &&OPXYCB0xe3,
|
||||
&&OPXYCB0xe4, &&OPXYCB0xe5, &&OPXYCB0xe6, &&OPXYCB0xe7,
|
||||
&&OPXYCB0xe8, &&OPXYCB0xe9, &&OPXYCB0xea, &&OPXYCB0xeb,
|
||||
&&OPXYCB0xec, &&OPXYCB0xed, &&OPXYCB0xee, &&OPXYCB0xef,
|
||||
|
||||
&&OPXYCB0xf0, &&OPXYCB0xf1, &&OPXYCB0xf2, &&OPXYCB0xf3,
|
||||
&&OPXYCB0xf4, &&OPXYCB0xf5, &&OPXYCB0xf6, &&OPXYCB0xf7,
|
||||
&&OPXYCB0xf8, &&OPXYCB0xf9, &&OPXYCB0xfa, &&OPXYCB0xfb,
|
||||
&&OPXYCB0xfc, &&OPXYCB0xfd, &&OPXYCB0xfe, &&OPXYCB0xff
|
||||
};
|
113
cpu/cz80/cz80macro.h
Normal file
113
cpu/cz80/cz80macro.h
Normal file
|
@ -0,0 +1,113 @@
|
|||
/******************************************************************************
|
||||
|
||||
cz80macro.h
|
||||
|
||||
CZ80 ŠeŽíƒ}ƒNƒ<EFBFBD>
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#if CZ80_USE_JUMPTABLE
|
||||
#define _SSOP(A,B) A##B
|
||||
#define OP(A) _SSOP(OP,A)
|
||||
#define OPCB(A) _SSOP(OPCB,A)
|
||||
#define OPED(A) _SSOP(OPED,A)
|
||||
#define OPXY(A) _SSOP(OPXY,A)
|
||||
#define OPXYCB(A) _SSOP(OPXYCB,A)
|
||||
#else
|
||||
#define OP(A) case A
|
||||
#define OPCB(A) case A
|
||||
#define OPED(A) case A
|
||||
#define OPXY(A) case A
|
||||
#define OPXYCB(A) case A
|
||||
#endif
|
||||
|
||||
#define USE_CYCLES(A) CPU->ICount -= (A);
|
||||
#define ADD_CYCLES(A) CPU->ICount += (A);
|
||||
|
||||
#define RET(A) { USE_CYCLES(A) goto Cz80_Exec; }
|
||||
|
||||
#if CZ80_ENCRYPTED_ROM
|
||||
|
||||
#define SET_PC(A) \
|
||||
CPU->BasePC = CPU->Fetch[(A) >> CZ80_FETCH_SFT]; \
|
||||
OPBase = CPU->OPFetch[(A) >> CZ80_FETCH_SFT]; \
|
||||
PC = (A) + CPU->BasePC;
|
||||
|
||||
#define GET_OP() (*(UINT8 *)(OPBase + PC))
|
||||
|
||||
#else
|
||||
|
||||
#define SET_PC(A) \
|
||||
CPU->BasePC = CPU->Fetch[(A) >> CZ80_FETCH_SFT]; \
|
||||
PC = (A) + CPU->BasePC;
|
||||
|
||||
#define GET_OP() (*(UINT8 *)PC)
|
||||
|
||||
#endif
|
||||
|
||||
#define READ_OP() GET_OP(); PC++
|
||||
|
||||
#define READ_ARG() (*(UINT8 *)PC++)
|
||||
#if CZ80_LITTLE_ENDIAN
|
||||
#define READ_ARG16() (*(UINT8 *)PC | (*(UINT8 *)(PC + 1) << 8)); PC += 2
|
||||
#else
|
||||
#define READ_ARG16() (*(UINT8 *)(PC + 1) | (*(UINT8 *)PC << 8)); PC += 2
|
||||
#endif
|
||||
|
||||
//#ifndef BUILD_CPS1PSP
|
||||
//#define READ_MEM8(A) memory_region_cpu2[(A)]
|
||||
//#else
|
||||
#define READ_MEM8(A) CPU->Read_Byte(A)
|
||||
//#endif
|
||||
#if CZ80_LITTLE_ENDIAN
|
||||
#define READ_MEM16(A) (READ_MEM8(A) | (READ_MEM8((A) + 1) << 8))
|
||||
#else
|
||||
#define READ_MEM16(A) ((READ_MEM8(A) << 8) | READ_MEM8((A) + 1))
|
||||
#endif
|
||||
|
||||
#define WRITE_MEM8(A, D) CPU->Write_Byte(A, D);
|
||||
#if CZ80_LITTLE_ENDIAN
|
||||
#define WRITE_MEM16(A, D) { WRITE_MEM8(A, D); WRITE_MEM8((A) + 1, (D) >> 8); }
|
||||
#else
|
||||
#define WRITE_MEM16(A, D) { WRITE_MEM8((A) + 1, D); WRITE_MEM8(A, (D) >> 8); }
|
||||
#endif
|
||||
|
||||
#define PUSH_16(A) { UINT32 sp; zSP -= 2; sp = zSP; WRITE_MEM16(sp, A); }
|
||||
#define POP_16(A) { UINT32 sp; sp = zSP; A = READ_MEM16(sp); zSP = sp + 2; }
|
||||
|
||||
#define IN(A) CPU->IN_Port(A)
|
||||
#define OUT(A, D) CPU->OUT_Port(A, D)
|
||||
|
||||
#define CHECK_INT \
|
||||
if (zIFF1) \
|
||||
{ \
|
||||
UINT32 IntVect; \
|
||||
\
|
||||
if (CPU->IRQState == HOLD_LINE) \
|
||||
CPU->IRQState = CLEAR_LINE; \
|
||||
\
|
||||
CPU->HaltState = 0; \
|
||||
zIFF1 = zIFF2 = 0; \
|
||||
IntVect = CPU->Interrupt_Callback(CPU->IRQLine); \
|
||||
\
|
||||
PUSH_16(zRealPC) \
|
||||
\
|
||||
if (zIM == 2) \
|
||||
{ \
|
||||
IntVect = (IntVect & 0xff) | (zI << 8); \
|
||||
PC = READ_MEM16(IntVect); \
|
||||
CPU->ExtraCycles += 17; \
|
||||
} \
|
||||
else if (zIM == 1) \
|
||||
{ \
|
||||
PC = 0x38; \
|
||||
CPU->ExtraCycles += 13; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
PC = IntVect & 0x38; \
|
||||
CPU->ExtraCycles += 13; \
|
||||
} \
|
||||
\
|
||||
SET_PC(PC) \
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue