/* z80_cb.c: z80 CBxx opcodes
   Copyright (c) 1999,2002 Philip Kendall

   $Id: z80_cb.c,v 1.2 2002/01/13 18:40:03 pak21 Exp $

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

   Author contact information:

   E-mail: pak21-fuse@srcf.ucam.org
   Postal address: 15 Crescent Road, Wokingham, Berks, RG40 2DB, England

*/

case 0x00:	/* RLC B */
RLC(B);
break;

case 0x01:	/* RLC C */
RLC(C);
break;

case 0x02:	/* RLC D */
RLC(D);
break;

case 0x03:	/* RLC E */
RLC(E);
break;

case 0x04:	/* RLC H */
RLC(H);
break;

case 0x05:	/* RLC L */
RLC(L);
break;

case 0x06:	/* RLC (HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 ); contend( HL, 3 );
  RLC(bytetemp);
  writebyte(HL,bytetemp);
}
break;

case 0x07:	/* RLC A */
RLC(A);
break;

case 0x08:	/* RRC B */
RRC(B);
break;

case 0x09:	/* RRC C */
RRC(C);
break;

case 0x0a:	/* RRC D */
RRC(D);
break;

case 0x0b:	/* RRC E */
RRC(E);
break;

case 0x0c:	/* RRC H */
RRC(H);
break;

case 0x0d:	/* RRC L */
RRC(L);
break;

case 0x0e:	/* RRC (HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL,4 ); contend( HL, 3 );
  RRC(bytetemp);
  writebyte(HL,bytetemp);
}
break;

case 0x0f:	/* RRC A */
RRC(A);
break;

case 0x10:	/* RL B */
RL(B);
break;

case 0x11:	/* RL C */
RL(C);
break;

case 0x12:	/* RL D */
RL(D);
break;

case 0x13:	/* RL E */
RL(E);
break;

case 0x14:	/* RL H */
RL(H);
break;

case 0x15:	/* RL L */
RL(L);
break;

case 0x16:	/* RL (HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 ); contend( HL, 3 );
  RL(bytetemp);
  writebyte(HL,bytetemp);
}
break;

case 0x17:	/* RL A */
RL(A);
break;

case 0x18:	/* RR B */
RR(B);
break;

case 0x19:	/* RR C */
RR(C);
break;

case 0x1a:	/* RR D */
RR(D);
break;

case 0x1b:	/* RR E */
RR(E);
break;

case 0x1c:	/* RR H */
RR(H);
break;

case 0x1d:	/* RR L */
RR(L);
break;

case 0x1e:	/* RR (HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 ); contend( HL, 3 );
  RR(bytetemp);
  writebyte(HL,bytetemp);
}
break;

case 0x1f:	/* RR A */
RR(A);
break;

case 0x20:	/* SLA B */
SLA(B);
break;

case 0x21:	/* SLA C */
SLA(C);
break;

case 0x22:	/* SLA D */
SLA(D);
break;

case 0x23:	/* SLA E */
SLA(E);
break;

case 0x24:	/* SLA H */
SLA(H);
break;

case 0x25:	/* SLA L */
SLA(L);
break;

case 0x26:	/* SLA (HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 ); contend( HL, 3 );
  SLA(bytetemp);
  writebyte(HL,bytetemp);
}
break;

case 0x27:	/* SLA A */
SLA(A);
break;

case 0x28:	/* SRA B */
SRA(B);
break;

case 0x29:	/* SRA C */
SRA(C);
break;

case 0x2a:	/* SRA D */
SRA(D);
break;

case 0x2b:	/* SRA E */
SRA(E);
break;

case 0x2c:	/* SRA H */
SRA(H);
break;

case 0x2d:	/* SRA L */
SRA(L);
break;

case 0x2e:	/* SRA (HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 ); contend( HL, 3 );
  SRA(bytetemp);
  writebyte(HL,bytetemp);
}
break;

case 0x2f:	/* SRA A */
SRA(A);
break;

case 0x30:	/* SLL B */
SLL(B);
break;

case 0x31:	/* SLL C */
SLL(C);
break;

case 0x32:	/* SLL D */
SLL(D);
break;

case 0x33:	/* SLL E */
SLL(E);
break;

case 0x34:	/* SLL H */
SLL(H);
break;

case 0x35:	/* SLL L */
SLL(L);
break;

case 0x36:	/* SLL (HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 ); contend( HL, 3 );
  SLL(bytetemp);
  writebyte(HL,bytetemp);
}
break;

case 0x37:	/* SLL A */
SLL(A);
break;

case 0x38:	/* SRL B */
SRL(B);
break;

case 0x39:	/* SRL C */
SRL(C);
break;

case 0x3a:	/* SRL D */
SRL(D);
break;

case 0x3b:	/* SRL E */
SRL(E);
break;

case 0x3c:	/* SRL H */
SRL(H);
break;

case 0x3d:	/* SRL L */
SRL(L);
break;

case 0x3e:	/* SRL (HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 ); contend( HL, 3 );
  SRL(bytetemp);
  writebyte(HL,bytetemp);
}
break;

case 0x3f:	/* SRL A */
SRL(A);
break;

case 0x40:	/* BIT 0,B */
BIT(0,B);
break;

case 0x41:	/* BIT 0,C */
BIT(0,C);
break;

case 0x42:	/* BIT 0,D */
BIT(0,D);
break;

case 0x43:	/* BIT 0,E */
BIT(0,E);
break;

case 0x44:	/* BIT 0,H */
BIT(0,H);
break;

case 0x45:	/* BIT 0,L */
BIT(0,L);
break;

case 0x46:	/* BIT 0,(HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 );
  BIT(0,bytetemp);
}
break;

case 0x47:	/* BIT 0,A */
BIT(0,A);
break;

case 0x48:	/* BIT 1,B */
BIT(1,B);
break;

case 0x49:	/* BIT 1,C */
BIT(1,C);
break;

case 0x4a:	/* BIT 1,D */
BIT(1,D);
break;

case 0x4b:	/* BIT 1,E */
BIT(1,E);
break;

case 0x4c:	/* BIT 1,H */
BIT(1,H);
break;

case 0x4d:	/* BIT 1,L */
BIT(1,L);
break;

case 0x4e:	/* BIT 1,(HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 );
  BIT(1,bytetemp);
}
break;

case 0x4f:	/* BIT 1,A */
BIT(1,A);
break;

case 0x50:	/* BIT 2,B */
BIT(2,B);
break;

case 0x51:	/* BIT 2,C */
BIT(2,C);
break;

case 0x52:	/* BIT 2,D */
BIT(2,D);
break;

case 0x53:	/* BIT 2,E */
BIT(2,E);
break;

case 0x54:	/* BIT 2,H */
BIT(2,H);
break;

case 0x55:	/* BIT 2,L */
BIT(2,L);
break;

case 0x56:	/* BIT 2,(HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 );
  BIT(2,bytetemp);
}
break;

case 0x57:	/* BIT 2,A */
BIT(2,A);
break;

case 0x58:	/* BIT 3,B */
BIT(3,B);
break;

case 0x59:	/* BIT 3,C */
BIT(3,C);
break;

case 0x5a:	/* BIT 3,D */
BIT(3,D);
break;

case 0x5b:	/* BIT 3,E */
BIT(3,E);
break;

case 0x5c:	/* BIT 3,H */
BIT(3,H);
break;

case 0x5d:	/* BIT 3,L */
BIT(3,L);
break;

case 0x5e:	/* BIT 3,(HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 );
  BIT(3,bytetemp);
}
break;

case 0x5f:	/* BIT 3,A */
BIT(3,A);
break;

case 0x60:	/* BIT 4,B */
BIT(4,B);
break;

case 0x61:	/* BIT 4,C */
BIT(4,C);
break;

case 0x62:	/* BIT 4,D */
BIT(4,D);
break;

case 0x63:	/* BIT 4,E */
BIT(4,E);
break;

case 0x64:	/* BIT 4,H */
BIT(4,H);
break;

case 0x65:	/* BIT 4,L */
BIT(4,L);
break;

case 0x66:	/* BIT 4,(HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 );
  BIT(4,bytetemp);
}
break;

case 0x67:	/* BIT 4,A */
BIT(4,A);
break;

case 0x68:	/* BIT 5,B */
BIT(5,B);
break;

case 0x69:	/* BIT 5,C */
BIT(5,C);
break;

case 0x6a:	/* BIT 5,D */
BIT(5,D);
break;

case 0x6b:	/* BIT 5,E */
BIT(5,E);
break;

case 0x6c:	/* BIT 5,H */
BIT(5,H);
break;

case 0x6d:	/* BIT 5,L */
BIT(5,L);
break;

case 0x6e:	/* BIT 5,(HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 );
  BIT(5,bytetemp);
}
break;

case 0x6f:	/* BIT 5,A */
BIT(5,A);
break;

case 0x70:	/* BIT 6,B */
BIT(6,B);
break;

case 0x71:	/* BIT 6,C */
BIT(6,C);
break;

case 0x72:	/* BIT 6,D */
BIT(6,D);
break;

case 0x73:	/* BIT 6,E */
BIT(6,E);
break;

case 0x74:	/* BIT 6,H */
BIT(6,H);
break;

case 0x75:	/* BIT 6,L */
BIT(6,L);
break;

case 0x76:	/* BIT 6,(HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 );
  BIT(6,bytetemp);
}
break;

case 0x77:	/* BIT 6,A */
BIT(6,A);
break;

case 0x78:	/* BIT 7,B */
BIT7(B);
break;

case 0x79:	/* BIT 7,C */
BIT7(C);
break;

case 0x7a:	/* BIT 7,D */
BIT7(D);
break;

case 0x7b:	/* BIT 7,E */
BIT7(E);
break;

case 0x7c:	/* BIT 7,H */
BIT7(H);
break;

case 0x7d:	/* BIT 7,L */
BIT7(L);
break;

case 0x7e:	/* BIT 7,(HL) */
{
  BYTE bytetemp = readbyte(HL);
  contend( HL, 4 );
  BIT7(bytetemp);
}
break;

case 0x7f:	/* BIT 7,A */
BIT7(A);
break;

case 0x80:	/* RES 0,B */
B &= 0xfe;
break;

case 0x81:	/* RES 0,C */
C &= 0xfe;
break;

case 0x82:	/* RES 0,D */
D &= 0xfe;
break;

case 0x83:	/* RES 0,E */
E &= 0xfe;
break;

case 0x84:	/* RES 0,H */
H &= 0xfe;
break;

case 0x85:	/* RES 0,L */
L &= 0xfe;
break;

case 0x86:	/* RES 0,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) & 0xfe);
break;

case 0x87:	/* RES 0,A */
A &= 0xfe;
break;

case 0x88:	/* RES 1,B */
B &= 0xfd;
break;

case 0x89:	/* RES 1,C */
C &= 0xfd;
break;

case 0x8a:	/* RES 1,D */
D &= 0xfd;
break;

case 0x8b:	/* RES 1,E */
E &= 0xfd;
break;

case 0x8c:	/* RES 1,H */
H &= 0xfd;
break;

case 0x8d:	/* RES 1,L */
L &= 0xfd;
break;

case 0x8e:	/* RES 1,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) & 0xfd);
break;

case 0x8f:	/* RES 1,A */
A &= 0xfd;
break;

case 0x90:	/* RES 2,B */
B &= 0xfb;
break;

case 0x91:	/* RES 2,C */
C &= 0xfb;
break;

case 0x92:	/* RES 2,D */
D &= 0xfb;
break;

case 0x93:	/* RES 2,E */
E &= 0xfb;
break;

case 0x94:	/* RES 2,H */
H &= 0xfb;
break;

case 0x95:	/* RES 2,L */
L &= 0xfb;
break;

case 0x96:	/* RES 2,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) & 0xfb);
break;

case 0x97:	/* RES 2,A */
A &= 0xfb;
break;

case 0x98:	/* RES 3,B */
B &= 0xf7;
break;

case 0x99:	/* RES 3,C */
C &= 0xf7;
break;

case 0x9a:	/* RES 3,D */
D &= 0xf7;
break;

case 0x9b:	/* RES 3,E */
E &= 0xf7;
break;

case 0x9c:	/* RES 3,H */
H &= 0xf7;
break;

case 0x9d:	/* RES 3,L */
L &= 0xf7;
break;

case 0x9e:	/* RES 3,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) & 0xf7);
break;

case 0x9f:	/* RES 3,A */
A &= 0xf7;
break;

case 0xa0:	/* RES 4,B */
B &= 0xef;
break;

case 0xa1:	/* RES 4,C */
C &= 0xef;
break;

case 0xa2:	/* RES 4,D */
D &= 0xef;
break;

case 0xa3:	/* RES 4,E */
E &= 0xef;
break;

case 0xa4:	/* RES 4,H */
H &= 0xef;
break;

case 0xa5:	/* RES 4,L */
L &= 0xef;
break;

case 0xa6:	/* RES 4,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) & 0xef);
break;

case 0xa7:	/* RES 4,A */
A &= 0xef;
break;

case 0xa8:	/* RES 5,B */
B &= 0xdf;
break;

case 0xa9:	/* RES 5,C */
C &= 0xdf;
break;

case 0xaa:	/* RES 5,D */
D &= 0xdf;
break;

case 0xab:	/* RES 5,E */
E &= 0xdf;
break;

case 0xac:	/* RES 5,H */
H &= 0xdf;
break;

case 0xad:	/* RES 5,L */
L &= 0xdf;
break;

case 0xae:	/* RES 5,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) & 0xdf);
break;

case 0xaf:	/* RES 5,A */
A &= 0xdf;
break;

case 0xb0:	/* RES 6,B */
B &= 0xbf;
break;

case 0xb1:	/* RES 6,C */
C &= 0xbf;
break;

case 0xb2:	/* RES 6,D */
D &= 0xbf;
break;

case 0xb3:	/* RES 6,E */
E &= 0xbf;
break;

case 0xb4:	/* RES 6,H */
H &= 0xbf;
break;

case 0xb5:	/* RES 6,L */
L &= 0xbf;
break;

case 0xb6:	/* RES 6,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) & 0xbf);
break;

case 0xb7:	/* RES 6,A */
A &= 0xbf;
break;

case 0xb8:	/* RES 7,B */
B &= 0x7f;
break;

case 0xb9:	/* RES 7,C */
C &= 0x7f;
break;

case 0xba:	/* RES 7,D */
D &= 0x7f;
break;

case 0xbb:	/* RES 7,E */
E &= 0x7f;
break;

case 0xbc:	/* RES 7,H */
H &= 0x7f;
break;

case 0xbd:	/* RES 7,L */
L &= 0x7f;
break;

case 0xbe:	/* RES 7,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) & 0x7f);
break;

case 0xbf:	/* RES 7,A */
A &= 0x7f;
break;

case 0xc0:	/* SET 0,B */
B |= 0x01;
break;

case 0xc1:	/* SET 0,C */
C |= 0x01;
break;

case 0xc2:	/* SET 0,D */
D |= 0x01;
break;

case 0xc3:	/* SET 0,E */
E |= 0x01;
break;

case 0xc4:	/* SET 0,H */
H |= 0x01;
break;

case 0xc5:	/* SET 0,L */
L |= 0x01;
break;

case 0xc6:	/* SET 0,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) | 0x01);
break;

case 0xc7:	/* SET 0,A */
A |= 0x01;
break;

case 0xc8:	/* SET 1,B */
B |= 0x02;
break;

case 0xc9:	/* SET 1,C */
C |= 0x02;
break;

case 0xca:	/* SET 1,D */
D |= 0x02;
break;

case 0xcb:	/* SET 1,E */
E |= 0x02;
break;

case 0xcc:	/* SET 1,H */
H |= 0x02;
break;

case 0xcd:	/* SET 1,L */
L |= 0x02;
break;

case 0xce:	/* SET 1,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) | 0x02);
break;

case 0xcf:	/* SET 1,A */
A |= 0x02;
break;

case 0xd0:	/* SET 2,B */
B |= 0x04;
break;

case 0xd1:	/* SET 2,C */
C |= 0x04;
break;

case 0xd2:	/* SET 2,D */
D |= 0x04;
break;

case 0xd3:	/* SET 2,E */
E |= 0x04;
break;

case 0xd4:	/* SET 2,H */
H |= 0x04;
break;

case 0xd5:	/* SET 2,L */
L |= 0x04;
break;

case 0xd6:	/* SET 2,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) | 0x04);
break;

case 0xd7:	/* SET 2,A */
A |= 0x04;
break;

case 0xd8:	/* SET 3,B */
B |= 0x08;
break;

case 0xd9:	/* SET 3,C */
C |= 0x08;
break;

case 0xda:	/* SET 3,D */
D |= 0x08;
break;

case 0xdb:	/* SET 3,E */
E |= 0x08;
break;

case 0xdc:	/* SET 3,H */
H |= 0x08;
break;

case 0xdd:	/* SET 3,L */
L |= 0x08;
break;

case 0xde:	/* SET 3,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) | 0x08);
break;

case 0xdf:	/* SET 3,A */
A |= 0x08;
break;

case 0xe0:	/* SET 4,B */
B |= 0x10;
break;

case 0xe1:	/* SET 4,C */
C |= 0x10;
break;

case 0xe2:	/* SET 4,D */
D |= 0x10;
break;

case 0xe3:	/* SET 4,E */
E |= 0x10;
break;

case 0xe4:	/* SET 4,H */
H |= 0x10;
break;

case 0xe5:	/* SET 4,L */
L |= 0x10;
break;

case 0xe6:	/* SET 4,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) | 0x10);
break;

case 0xe7:	/* SET 4,A */
A |= 0x10;
break;

case 0xe8:	/* SET 5,B */
B |= 0x20;
break;

case 0xe9:	/* SET 5,C */
C |= 0x20;
break;

case 0xea:	/* SET 5,D */
D |= 0x20;
break;

case 0xeb:	/* SET 5,E */
E |= 0x20;
break;

case 0xec:	/* SET 5,H */
H |= 0x20;
break;

case 0xed:	/* SET 5,L */
L |= 0x20;
break;

case 0xee:	/* SET 5,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) | 0x20);
break;

case 0xef:	/* SET 5,A */
A |= 0x20;
break;

case 0xf0:	/* SET 6,B */
B |= 0x40;
break;

case 0xf1:	/* SET 6,C */
C |= 0x40;
break;

case 0xf2:	/* SET 6,D */
D |= 0x40;
break;

case 0xf3:	/* SET 6,E */
E |= 0x40;
break;

case 0xf4:	/* SET 6,H */
H |= 0x40;
break;

case 0xf5:	/* SET 6,L */
L |= 0x40;
break;

case 0xf6:	/* SET 6,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) | 0x40);
break;

case 0xf7:	/* SET 6,A */
A |= 0x40;
break;

case 0xf8:	/* SET 7,B */
B |= 0x80;
break;

case 0xf9:	/* SET 7,C */
C |= 0x80;
break;

case 0xfa:	/* SET 7,D */
D |= 0x80;
break;

case 0xfb:	/* SET 7,E */
E |= 0x80;
break;

case 0xfc:	/* SET 7,H */
H |= 0x80;
break;

case 0xfd:	/* SET 7,L */
L |= 0x80;
break;

case 0xfe:	/* SET 7,(HL) */
contend( HL, 4 ); contend( HL, 3 );
writebyte(HL, readbyte(HL) | 0x80);
break;

case 0xff:	/* SET 7,A */
A |= 0x80;
break;
