/*
* Z80SIM - a Z80-CPU simulator
*
* Copyright (C) 1987-92 by Udo Munk
*
* This module of the Z80-CPU simulator must not be modified by a user,
* see license agreement!
*
* History:
* 28-SEP-87 Development on TARGON/35 with AT&T Unix System V(3.1)
* 11-JAN-89 Release 1.1
* 08-FEB-89 Release 1.2
* 13-MAR-89 Release 1.3
* 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
* 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
* 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
* and some optimization
* 25-JUN-92 Release 1.7 comments in english
*/
/*
* Like the function "cpu()" this one emulates 4 byte opcodes
* starting with 0xfd 0xcb
*/
#include "sim.h"
#include "simglb.h"
long op_fdcb_handel()
{
long trap_fdcb();
long op_tb0iyd(), op_tb1iyd(), op_tb2iyd(), op_tb3iyd();
long op_tb4iyd(), op_tb5iyd(), op_tb6iyd(), op_tb7iyd();
long op_rb0iyd(), op_rb1iyd(), op_rb2iyd(), op_rb3iyd();
long op_rb4iyd(), op_rb5iyd(), op_rb6iyd(), op_rb7iyd();
long op_sb0iyd(), op_sb1iyd(), op_sb2iyd(), op_sb3iyd();
long op_sb4iyd(), op_sb5iyd(), op_sb6iyd(), op_sb7iyd();
long op_rlciyd(), op_rrciyd(), op_rliyd(), op_rriyd();
long op_slaiyd(), op_sraiyd(), op_srliyd();
register int d;
#ifdef WANT_TIM
register long t;
#endif
d = (char) *PC++;
#ifdef WANT_PCC
if (PC > ram + 65535) /* correct PC overrun */
PC = ram;
#endif
#ifdef WANT_TIM
t = (*op_fdcb[*PC++]) (d); /* execute next opcode */
#else
(*op_fdcb[*PC++]) (d);
#endif
#ifdef WANT_PCC
if (PC > ram + 65535) /* again correct PC overrun */
PC = ram;
#endif
#ifdef WANT_TIM
return(t);
#endif
}
/*
* This function traps all illegal opcodes following the
* initial 0xfd 0xcb of a 4 byte opcode.
*/
static long trap_fdcb()
{
cpu_error = OPTRAP4;
cpu_state = STOPPED;
#ifdef WANT_TIM
return(0L);
#endif
}
static long op_tb0iyd(data) /* BIT 0,(IY+d) */
register int data;
{
F &= ~N_FLAG;
F |= H_FLAG;
(*(ram + IY + data) & 1) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
#ifdef WANT_TIM
return(20L);
#endif
}
static long op_tb1iyd(data) /* BIT 1,(IY+d) */
register int data;
{
F &= ~N_FLAG;
F |= H_FLAG;
(*(ram + IY + data) & 2) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
#ifdef WANT_TIM
return(20L);
#endif
}
static long op_tb2iyd(data) /* BIT 2,(IY+d) */
register int data;
{
F &= ~N_FLAG;
F |= H_FLAG;
(*(ram + IY + data) & 4) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
#ifdef WANT_TIM
return(20L);
#endif
}
static long op_tb3iyd(data) /* BIT 3,(IY+d) */
register int data;
{
F &= ~N_FLAG;
F |= H_FLAG;
(*(ram + IY + data) & 8) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
#ifdef WANT_TIM
return(20L);
#endif
}
static long op_tb4iyd(data) /* BIT 4,(IY+d) */
register int data;
{
F &= ~N_FLAG;
F |= H_FLAG;
(*(ram + IY + data) & 16) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
#ifdef WANT_TIM
return(20L);
#endif
}
static long op_tb5iyd(data) /* BIT 5,(IY+d) */
register int data;
{
F &= ~N_FLAG;
F |= H_FLAG;
(*(ram + IY + data) & 32) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
#ifdef WANT_TIM
return(20L);
#endif
}
static long op_tb6iyd(data) /* BIT 6,(IY+d) */
register int data;
{
F &= ~N_FLAG;
F |= H_FLAG;
(*(ram + IY + data) & 64) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
#ifdef WANT_TIM
return(20L);
#endif
}
static long op_tb7iyd(data) /* BIT 7,(IY+d) */
register int data;
{
F &= ~N_FLAG;
F |= H_FLAG;
(*(ram + IY + data) & 128) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
#ifdef WANT_TIM
return(20L);
#endif
}
static long op_rb0iyd(data) /* RES 0,(IY+d) */
register int data;
{
*(ram + IY + data) &= ~1;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_rb1iyd(data) /* RES 1,(IY+d) */
register int data;
{
*(ram + IY + data) &= ~2;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_rb2iyd(data) /* RES 2,(IY+d) */
register int data;
{
*(ram + IY + data) &= ~4;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_rb3iyd(data) /* RES 3,(IY+d) */
register int data;
{
*(ram + IY + data) &= ~8;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_rb4iyd(data) /* RES 4,(IY+d) */
register int data;
{
*(ram + IY + data) &= ~16;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_rb5iyd(data) /* RES 5,(IY+d) */
register int data;
{
*(ram + IY + data) &= ~32;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_rb6iyd(data) /* RES 6,(IY+d) */
register int data;
{
*(ram + IY + data) &= ~64;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_rb7iyd(data) /* RES 7,(IY+d) */
register int data;
{
*(ram + IY + data) &= ~128;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_sb0iyd(data) /* SET 0,(IY+d) */
register int data;
{
*(ram + IY + data) |= 1;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_sb1iyd(data) /* SET 1,(IY+d) */
register int data;
{
*(ram + IY + data) |= 2;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_sb2iyd(data) /* SET 2,(IY+d) */
register int data;
{
*(ram + IY + data) |= 4;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_sb3iyd(data) /* SET 3,(IY+d) */
register int data;
{
*(ram + IY + data) |= 8;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_sb4iyd(data) /* SET 4,(IY+d) */
register int data;
{
*(ram + IY + data) |= 16;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_sb5iyd(data) /* SET 5,(IY+d) */
register int data;
{
*(ram + IY + data) |= 32;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_sb6iyd(data) /* SET 6,(IY+d) */
register int data;
{
*(ram + IY + data) |= 64;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_sb7iyd(data) /* SET 7,(IY+d) */
register int data;
{
*(ram + IY + data) |= 128;
#ifdef WANT_TIM
return(23L);
#endif
}
static long op_rlciyd(data) /* RLC (IY+d) */
register int data;
{
register int i;
register BYTE *p;