438 lines
9.3 KiB
C
438 lines
9.3 KiB
C
|
/*
|
||
|
* Copyright (C) 1996-1998 Szeredi Miklos
|
||
|
* Email: mszeredi@inf.bme.hu
|
||
|
*
|
||
|
* 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. See the file COPYING.
|
||
|
*
|
||
|
* 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.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef NO_OPDEF
|
||
|
#include "z80_def.h"
|
||
|
#include "z80_op6.h"
|
||
|
#endif
|
||
|
|
||
|
#define GHL DANM(cbaddr)
|
||
|
|
||
|
#define B7(r) (((r) & 0x80) >> 7)
|
||
|
#define B0(r) ((r) & 0x01)
|
||
|
|
||
|
#define SHIFTROTL(r, mod) \
|
||
|
{ \
|
||
|
register int carry; \
|
||
|
carry = B7(r); \
|
||
|
r = mod; \
|
||
|
RF = (RF & ~(AALLF)) | carry | \
|
||
|
TAB(orf_tbl)[(byte) r]; \
|
||
|
}
|
||
|
|
||
|
|
||
|
#define SHIFTROTR(r, mod) \
|
||
|
{ \
|
||
|
register int carry; \
|
||
|
carry = B0(r); \
|
||
|
r = mod; \
|
||
|
RF = (RF & ~(AALLF)) | carry | \
|
||
|
TAB(orf_tbl)[(byte) r]; \
|
||
|
}
|
||
|
|
||
|
|
||
|
#define RLC(r) SHIFTROTL(r, (r << 1) | carry)
|
||
|
#define RRC(r) SHIFTROTR(r, (r >> 1) | (carry << 7))
|
||
|
#define RLN(r) SHIFTROTL(r, (r << 1) | (RF & CF))
|
||
|
#define RRN(r) SHIFTROTR(r, (r >> 1) | ((RF & CF) << 7))
|
||
|
#define SLA(r) SHIFTROTL(r, r << 1)
|
||
|
#define SRA(r) SHIFTROTR(r, (byte) ((sbyte) r >> 1))
|
||
|
#define SLL(r) SHIFTROTL(r, (r << 1) | 0x01)
|
||
|
#define SRL(r) SHIFTROTR(r, r >> 1)
|
||
|
|
||
|
|
||
|
#define SHRR(shrn, func, an, rn, r, n) \
|
||
|
OPDEF(shrn ## _ ## rn, 0x00+an*8+n) \
|
||
|
{ \
|
||
|
func(r); \
|
||
|
ENTIME(8); \
|
||
|
}
|
||
|
|
||
|
#define SHRIHL(shrn, func, an) \
|
||
|
OPDEF(shrn ## _ihl, 0x06+an*8) \
|
||
|
{ \
|
||
|
register byte btmp; \
|
||
|
btmp = READ(GHL); \
|
||
|
func(btmp); \
|
||
|
WRITE(GHL, btmp); \
|
||
|
ENTIME(15); \
|
||
|
}
|
||
|
|
||
|
#define RLC_R(rn, r, n) SHRR(rlc, RLC, 0, rn, r, n)
|
||
|
#define RRC_R(rn, r, n) SHRR(rrc, RRC, 1, rn, r, n)
|
||
|
#define RL_R(rn, r, n) SHRR(rl, RLN, 2, rn, r, n)
|
||
|
#define RR_R(rn, r, n) SHRR(rr, RRN, 3, rn, r, n)
|
||
|
#define SLA_R(rn, r, n) SHRR(sla, SLA, 4, rn, r, n)
|
||
|
#define SRA_R(rn, r, n) SHRR(sra, SRA, 5, rn, r, n)
|
||
|
#define SLL_R(rn, r, n) SHRR(sll, SLL, 6, rn, r, n)
|
||
|
#define SRL_R(rn, r, n) SHRR(srl, SRL, 7, rn, r, n)
|
||
|
|
||
|
RLC_R(b, RB, 0)
|
||
|
RLC_R(c, RC, 1)
|
||
|
RLC_R(d, RD, 2)
|
||
|
RLC_R(e, RE, 3)
|
||
|
RLC_R(h, RH, 4)
|
||
|
RLC_R(l, RL, 5)
|
||
|
RLC_R(a, RA, 7)
|
||
|
|
||
|
RRC_R(b, RB, 0)
|
||
|
RRC_R(c, RC, 1)
|
||
|
RRC_R(d, RD, 2)
|
||
|
RRC_R(e, RE, 3)
|
||
|
RRC_R(h, RH, 4)
|
||
|
RRC_R(l, RL, 5)
|
||
|
RRC_R(a, RA, 7)
|
||
|
|
||
|
RL_R(b, RB, 0)
|
||
|
RL_R(c, RC, 1)
|
||
|
RL_R(d, RD, 2)
|
||
|
RL_R(e, RE, 3)
|
||
|
RL_R(h, RH, 4)
|
||
|
RL_R(l, RL, 5)
|
||
|
RL_R(a, RA, 7)
|
||
|
|
||
|
RR_R(b, RB, 0)
|
||
|
RR_R(c, RC, 1)
|
||
|
RR_R(d, RD, 2)
|
||
|
RR_R(e, RE, 3)
|
||
|
RR_R(h, RH, 4)
|
||
|
RR_R(l, RL, 5)
|
||
|
RR_R(a, RA, 7)
|
||
|
|
||
|
SLA_R(b, RB, 0)
|
||
|
SLA_R(c, RC, 1)
|
||
|
SLA_R(d, RD, 2)
|
||
|
SLA_R(e, RE, 3)
|
||
|
SLA_R(h, RH, 4)
|
||
|
SLA_R(l, RL, 5)
|
||
|
SLA_R(a, RA, 7)
|
||
|
|
||
|
SRA_R(b, RB, 0)
|
||
|
SRA_R(c, RC, 1)
|
||
|
SRA_R(d, RD, 2)
|
||
|
SRA_R(e, RE, 3)
|
||
|
SRA_R(h, RH, 4)
|
||
|
SRA_R(l, RL, 5)
|
||
|
SRA_R(a, RA, 7)
|
||
|
|
||
|
SLL_R(b, RB, 0)
|
||
|
SLL_R(c, RC, 1)
|
||
|
SLL_R(d, RD, 2)
|
||
|
SLL_R(e, RE, 3)
|
||
|
SLL_R(h, RH, 4)
|
||
|
SLL_R(l, RL, 5)
|
||
|
SLL_R(a, RA, 7)
|
||
|
|
||
|
SRL_R(b, RB, 0)
|
||
|
SRL_R(c, RC, 1)
|
||
|
SRL_R(d, RD, 2)
|
||
|
SRL_R(e, RE, 3)
|
||
|
SRL_R(h, RH, 4)
|
||
|
SRL_R(l, RL, 5)
|
||
|
SRL_R(a, RA, 7)
|
||
|
|
||
|
SHRIHL(rlc, RLC, 0)
|
||
|
SHRIHL(rrc, RRC, 1)
|
||
|
SHRIHL(rl, RLN, 2)
|
||
|
SHRIHL(rr, RRN, 3)
|
||
|
SHRIHL(sla, SLA, 4)
|
||
|
SHRIHL(sra, SRA, 5)
|
||
|
SHRIHL(sll, SLL, 6)
|
||
|
SHRIHL(srl, SRL, 7)
|
||
|
|
||
|
#define BIT(r, n) \
|
||
|
RF = (RF & ~(SF | ZF | NF)) | (r & SF) | (((~r >> n) & 0x01) << 6)
|
||
|
|
||
|
#define BIT_N_R(bn, rn, r, n) \
|
||
|
OPDEF(bit_ ## bn ## _ ## rn, 0x40+bn*8+n) \
|
||
|
{ \
|
||
|
BIT(r, bn); \
|
||
|
ENTIME(8); \
|
||
|
}
|
||
|
|
||
|
#define BIT_N_IHL(bn) \
|
||
|
OPDEF(bit_ ## bn ## _ihl, 0x46+bn*8) \
|
||
|
{ \
|
||
|
register byte btmp; \
|
||
|
btmp = READ(GHL); \
|
||
|
BIT(btmp, bn); \
|
||
|
ENTIME(12); \
|
||
|
}
|
||
|
|
||
|
BIT_N_R(0, b, RB, 0)
|
||
|
BIT_N_R(0, c, RC, 1)
|
||
|
BIT_N_R(0, d, RD, 2)
|
||
|
BIT_N_R(0, e, RE, 3)
|
||
|
BIT_N_R(0, h, RH, 4)
|
||
|
BIT_N_R(0, l, RL, 5)
|
||
|
BIT_N_R(0, a, RA, 7)
|
||
|
|
||
|
BIT_N_R(1, b, RB, 0)
|
||
|
BIT_N_R(1, c, RC, 1)
|
||
|
BIT_N_R(1, d, RD, 2)
|
||
|
BIT_N_R(1, e, RE, 3)
|
||
|
BIT_N_R(1, h, RH, 4)
|
||
|
BIT_N_R(1, l, RL, 5)
|
||
|
BIT_N_R(1, a, RA, 7)
|
||
|
|
||
|
BIT_N_R(2, b, RB, 0)
|
||
|
BIT_N_R(2, c, RC, 1)
|
||
|
BIT_N_R(2, d, RD, 2)
|
||
|
BIT_N_R(2, e, RE, 3)
|
||
|
BIT_N_R(2, h, RH, 4)
|
||
|
BIT_N_R(2, l, RL, 5)
|
||
|
BIT_N_R(2, a, RA, 7)
|
||
|
|
||
|
BIT_N_R(3, b, RB, 0)
|
||
|
BIT_N_R(3, c, RC, 1)
|
||
|
BIT_N_R(3, d, RD, 2)
|
||
|
BIT_N_R(3, e, RE, 3)
|
||
|
BIT_N_R(3, h, RH, 4)
|
||
|
BIT_N_R(3, l, RL, 5)
|
||
|
BIT_N_R(3, a, RA, 7)
|
||
|
|
||
|
BIT_N_R(4, b, RB, 0)
|
||
|
BIT_N_R(4, c, RC, 1)
|
||
|
BIT_N_R(4, d, RD, 2)
|
||
|
BIT_N_R(4, e, RE, 3)
|
||
|
BIT_N_R(4, h, RH, 4)
|
||
|
BIT_N_R(4, l, RL, 5)
|
||
|
BIT_N_R(4, a, RA, 7)
|
||
|
|
||
|
BIT_N_R(5, b, RB, 0)
|
||
|
BIT_N_R(5, c, RC, 1)
|
||
|
BIT_N_R(5, d, RD, 2)
|
||
|
BIT_N_R(5, e, RE, 3)
|
||
|
BIT_N_R(5, h, RH, 4)
|
||
|
BIT_N_R(5, l, RL, 5)
|
||
|
BIT_N_R(5, a, RA, 7)
|
||
|
|
||
|
BIT_N_R(6, b, RB, 0)
|
||
|
BIT_N_R(6, c, RC, 1)
|
||
|
BIT_N_R(6, d, RD, 2)
|
||
|
BIT_N_R(6, e, RE, 3)
|
||
|
BIT_N_R(6, h, RH, 4)
|
||
|
BIT_N_R(6, l, RL, 5)
|
||
|
BIT_N_R(6, a, RA, 7)
|
||
|
|
||
|
BIT_N_R(7, b, RB, 0)
|
||
|
BIT_N_R(7, c, RC, 1)
|
||
|
BIT_N_R(7, d, RD, 2)
|
||
|
BIT_N_R(7, e, RE, 3)
|
||
|
BIT_N_R(7, h, RH, 4)
|
||
|
BIT_N_R(7, l, RL, 5)
|
||
|
BIT_N_R(7, a, RA, 7)
|
||
|
|
||
|
BIT_N_IHL(0)
|
||
|
BIT_N_IHL(1)
|
||
|
BIT_N_IHL(2)
|
||
|
BIT_N_IHL(3)
|
||
|
BIT_N_IHL(4)
|
||
|
BIT_N_IHL(5)
|
||
|
BIT_N_IHL(6)
|
||
|
BIT_N_IHL(7)
|
||
|
|
||
|
#define RES(r, n) r &= ~(1 << n)
|
||
|
|
||
|
#define RES_N_R(bn, rn, r, n) \
|
||
|
OPDEF(res_ ## bn ## _ ## rn, 0x80+bn*8+n) \
|
||
|
{ \
|
||
|
RES(r, bn); \
|
||
|
ENTIME(8); \
|
||
|
}
|
||
|
|
||
|
#define RES_N_IHL(bn) \
|
||
|
OPDEF(res_ ## bn ## _ihl, 0x86+bn*8) \
|
||
|
{ \
|
||
|
register byte btmp; \
|
||
|
btmp = READ(GHL); \
|
||
|
RES(btmp, bn); \
|
||
|
WRITE(GHL, btmp); \
|
||
|
ENTIME(15); \
|
||
|
}
|
||
|
|
||
|
|
||
|
RES_N_R(0, b, RB, 0)
|
||
|
RES_N_R(0, c, RC, 1)
|
||
|
RES_N_R(0, d, RD, 2)
|
||
|
RES_N_R(0, e, RE, 3)
|
||
|
RES_N_R(0, h, RH, 4)
|
||
|
RES_N_R(0, l, RL, 5)
|
||
|
RES_N_R(0, a, RA, 7)
|
||
|
|
||
|
RES_N_R(1, b, RB, 0)
|
||
|
RES_N_R(1, c, RC, 1)
|
||
|
RES_N_R(1, d, RD, 2)
|
||
|
RES_N_R(1, e, RE, 3)
|
||
|
RES_N_R(1, h, RH, 4)
|
||
|
RES_N_R(1, l, RL, 5)
|
||
|
RES_N_R(1, a, RA, 7)
|
||
|
|
||
|
RES_N_R(2, b, RB, 0)
|
||
|
RES_N_R(2, c, RC, 1)
|
||
|
RES_N_R(2, d, RD, 2)
|
||
|
RES_N_R(2, e, RE, 3)
|
||
|
RES_N_R(2, h, RH, 4)
|
||
|
RES_N_R(2, l, RL, 5)
|
||
|
RES_N_R(2, a, RA, 7)
|
||
|
|
||
|
RES_N_R(3, b, RB, 0)
|
||
|
RES_N_R(3, c, RC, 1)
|
||
|
RES_N_R(3, d, RD, 2)
|
||
|
RES_N_R(3, e, RE, 3)
|
||
|
RES_N_R(3, h, RH, 4)
|
||
|
RES_N_R(3, l, RL, 5)
|
||
|
RES_N_R(3, a, RA, 7)
|
||
|
|
||
|
RES_N_R(4, b, RB, 0)
|
||
|
RES_N_R(4, c, RC, 1)
|
||
|
RES_N_R(4, d, RD, 2)
|
||
|
RES_N_R(4, e, RE, 3)
|
||
|
RES_N_R(4, h, RH, 4)
|
||
|
RES_N_R(4, l, RL, 5)
|
||
|
RES_N_R(4, a, RA, 7)
|
||
|
|
||
|
RES_N_R(5, b, RB, 0)
|
||
|
RES_N_R(5, c, RC, 1)
|
||
|
RES_N_R(5, d, RD, 2)
|
||
|
RES_N_R(5, e, RE, 3)
|
||
|
RES_N_R(5, h, RH, 4)
|
||
|
RES_N_R(5, l, RL, 5)
|
||
|
RES_N_R(5, a, RA, 7)
|
||
|
|
||
|
RES_N_R(6, b, RB, 0)
|
||
|
RES_N_R(6, c, RC, 1)
|
||
|
RES_N_R(6, d, RD, 2)
|
||
|
RES_N_R(6, e, RE, 3)
|
||
|
RES_N_R(6, h, RH, 4)
|
||
|
RES_N_R(6, l, RL, 5)
|
||
|
RES_N_R(6, a, RA, 7)
|
||
|
|
||
|
RES_N_R(7, b, RB, 0)
|
||
|
RES_N_R(7, c, RC, 1)
|
||
|
RES_N_R(7, d, RD, 2)
|
||
|
RES_N_R(7, e, RE, 3)
|
||
|
RES_N_R(7, h, RH, 4)
|
||
|
RES_N_R(7, l, RL, 5)
|
||
|
RES_N_R(7, a, RA, 7)
|
||
|
|
||
|
RES_N_IHL(0)
|
||
|
RES_N_IHL(1)
|
||
|
RES_N_IHL(2)
|
||
|
RES_N_IHL(3)
|
||
|
RES_N_IHL(4)
|
||
|
RES_N_IHL(5)
|
||
|
RES_N_IHL(6)
|
||
|
RES_N_IHL(7)
|
||
|
|
||
|
|
||
|
#define SET(r, n) r |= (1 << n)
|
||
|
|
||
|
#define SET_N_R(bn, rn, r, n) \
|
||
|
OPDEF(set_ ## bn ## _ ## rn, 0xC0+bn*8+n) \
|
||
|
{ \
|
||
|
SET(r, bn); \
|
||
|
ENTIME(8); \
|
||
|
}
|
||
|
|
||
|
#define SET_N_IHL(bn) \
|
||
|
OPDEF(set_ ## bn ## _ihl, 0x86+bn*8) \
|
||
|
{ \
|
||
|
register byte btmp; \
|
||
|
btmp = READ(GHL); \
|
||
|
SET(btmp, bn); \
|
||
|
WRITE(GHL, btmp); \
|
||
|
ENTIME(15); \
|
||
|
}
|
||
|
|
||
|
|
||
|
SET_N_R(0, b, RB, 0)
|
||
|
SET_N_R(0, c, RC, 1)
|
||
|
SET_N_R(0, d, RD, 2)
|
||
|
SET_N_R(0, e, RE, 3)
|
||
|
SET_N_R(0, h, RH, 4)
|
||
|
SET_N_R(0, l, RL, 5)
|
||
|
SET_N_R(0, a, RA, 7)
|
||
|
|
||
|
SET_N_R(1, b, RB, 0)
|
||
|
SET_N_R(1, c, RC, 1)
|
||
|
SET_N_R(1, d, RD, 2)
|
||
|
SET_N_R(1, e, RE, 3)
|
||
|
SET_N_R(1, h, RH, 4)
|
||
|
SET_N_R(1, l, RL, 5)
|
||
|
SET_N_R(1, a, RA, 7)
|
||
|
|
||
|
SET_N_R(2, b, RB, 0)
|
||
|
SET_N_R(2, c, RC, 1)
|
||
|
SET_N_R(2, d, RD, 2)
|
||
|
SET_N_R(2, e, RE, 3)
|
||
|
SET_N_R(2, h, RH, 4)
|
||
|
SET_N_R(2, l, RL, 5)
|
||
|
SET_N_R(2, a, RA, 7)
|
||
|
|
||
|
SET_N_R(3, b, RB, 0)
|
||
|
SET_N_R(3, c, RC, 1)
|
||
|
SET_N_R(3, d, RD, 2)
|
||
|
SET_N_R(3, e, RE, 3)
|
||
|
SET_N_R(3, h, RH, 4)
|
||
|
SET_N_R(3, l, RL, 5)
|
||
|
SET_N_R(3, a, RA, 7)
|
||
|
|
||
|
SET_N_R(4, b, RB, 0)
|
||
|
SET_N_R(4, c, RC, 1)
|
||
|
SET_N_R(4, d, RD, 2)
|
||
|
SET_N_R(4, e, RE, 3)
|
||
|
SET_N_R(4, h, RH, 4)
|
||
|
SET_N_R(4, l, RL, 5)
|
||
|
SET_N_R(4, a, RA, 7)
|
||
|
|
||
|
SET_N_R(5, b, RB, 0)
|
||
|
SET_N_R(5, c, RC, 1)
|
||
|
SET_N_R(5, d, RD, 2)
|
||
|
SET_N_R(5, e, RE, 3)
|
||
|
SET_N_R(5, h, RH, 4)
|
||
|
SET_N_R(5, l, RL, 5)
|
||
|
SET_N_R(5, a, RA, 7)
|
||
|
|
||
|
SET_N_R(6, b, RB, 0)
|
||
|
SET_N_R(6, c, RC, 1)
|
||
|
SET_N_R(6, d, RD, 2)
|
||
|
SET_N_R(6, e, RE, 3)
|
||
|
SET_N_R(6, h, RH, 4)
|
||
|
SET_N_R(6, l, RL, 5)
|
||
|
SET_N_R(6, a, RA, 7)
|
||
|
|
||
|
SET_N_R(7, b, RB, 0)
|
||
|
SET_N_R(7, c, RC, 1)
|
||
|
SET_N_R(7, d, RD, 2)
|
||
|
SET_N_R(7, e, RE, 3)
|
||
|
SET_N_R(7, h, RH, 4)
|
||
|
SET_N_R(7, l, RL, 5)
|
||
|
SET_N_R(7, a, RA, 7)
|
||
|
|
||
|
SET_N_IHL(0)
|
||
|
SET_N_IHL(1)
|
||
|
SET_N_IHL(2)
|
||
|
SET_N_IHL(3)
|
||
|
SET_N_IHL(4)
|
||
|
SET_N_IHL(5)
|
||
|
SET_N_IHL(6)
|
||
|
SET_N_IHL(7)
|