/* Emulations of the CB operations of the Z80 instruction set. * Copyright (C) 1994 Ian Collier. * * 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define var_t unsigned char t #define rlc(x) (x=(x<<1)|(x>>7),rflags(x,x&1)) #define rrc(x) do{var_t=x&1;x=(x>>1)|(t<<7);rflags(x,t);}while(0) #define rl(x) do{var_t=x>>7;x=(x<<1)|(f&1);rflags(x,t);}while(0) #define rr(x) do{var_t=x&1;x=(x>>1)|(f<<7);rflags(x,t);}while(0) #define sla(x) do{var_t=x>>7;x<<=1;rflags(x,t);}while(0) #define sra(x) do{var_t=x&1;x=((signed char)x)>>1;rflags(x,t);}while(0) #define sll(x) do{var_t=x>>7;x=(x<<1)|1;rflags(x,t);}while(0) #define srl(x) do{var_t=x&1;x>>=1;rflags(x,t);}while(0) #define rflags(x,c) (f=(c)|(x&0xa8)|((!x)<<6)|parity(x)) #define bit(n,x) (f=(f&1)|((x&(1<> 3) & 7; switch (op & 0xc7) { case 0x40: bit(n, b); break; case 0x41: bit(n, c); break; case 0x42: bit(n, d); break; case 0x43: bit(n, e); break; case 0x44: bit(n, h); break; case 0x45: bit(n, l); break; case 0x46: tstates += 4; val = fetch(addr); bit(n, val); store(addr, val); break; case 0x47: bit(n, a); break; case 0x80: res(n, b); break; case 0x81: res(n, c); break; case 0x82: res(n, d); break; case 0x83: res(n, e); break; case 0x84: res(n, h); break; case 0x85: res(n, l); break; case 0x86: tstates += 4; val = fetch(addr); res(n, val); store(addr, val); break; case 0x87: res(n, a); break; case 0xc0: set(n, b); break; case 0xc1: set(n, c); break; case 0xc2: set(n, d); break; case 0xc3: set(n, e); break; case 0xc4: set(n, h); break; case 0xc5: set(n, l); break; case 0xc6: tstates += 4; val = fetch(addr); set(n, val); store(addr, val); break; case 0xc7: set(n, a); break; } } if (ixoriy)switch (reg) { case 0:b = val; break; case 1:c = val; break; case 2:d = val; break; case 3:e = val; break; case 4:h = val; break; case 5:l = val; break; case 7:a = val; break; } } #undef var_t #undef rlc #undef rrc #undef rl #undef rr #undef sla #undef sra #undef sll #undef srl #undef rflags #undef bit #undef set #undef res