05a7f14f8d
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@10950 a1c6a512-1295-4272-9138-f99709370657
305 lines
5.5 KiB
C
305 lines
5.5 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_op4.h"
|
|
#include "z80_ari.h"
|
|
#endif
|
|
|
|
#define RET_CC(ccn, cc, n) \
|
|
OPDEF(ret_ ## ccn, 0xC0+n*8) \
|
|
{ \
|
|
if(!(cc)) { \
|
|
ENTIME(5); \
|
|
} \
|
|
else { \
|
|
POP(PC); \
|
|
ENTIME(11); \
|
|
} \
|
|
}
|
|
|
|
RET_CC(nz, !TESTZF, 0)
|
|
RET_CC(z, TESTZF, 1)
|
|
RET_CC(nc, !TESTCF, 2)
|
|
RET_CC(c, TESTCF, 3)
|
|
RET_CC(po, !TESTPF, 4)
|
|
RET_CC(pe, TESTPF, 5)
|
|
RET_CC(p, !TESTSF, 6)
|
|
RET_CC(m, TESTSF, 7)
|
|
|
|
#define POP_RR(rrn, rr, n) \
|
|
OPDEF(pop_ ## rrn, 0xC1+n*0x10) \
|
|
{ \
|
|
POP(rr); \
|
|
ENTIME(10); \
|
|
}
|
|
|
|
POP_RR(bc, BC, 0)
|
|
POP_RR(de, DE, 1)
|
|
POP_RR(hl, HL, 2)
|
|
POP_RR(af, AF, 3)
|
|
|
|
OPDEF(ret, 0xC9)
|
|
{
|
|
POP(PC);
|
|
ENTIME(10);
|
|
}
|
|
|
|
OPDEF(exx, 0xD9)
|
|
{
|
|
register dbyte dtmp;
|
|
|
|
dtmp = BCBK, BCBK = BC, BC = dtmp;
|
|
dtmp = DEBK, DEBK = DE, DE = dtmp;
|
|
dtmp = HLBK, HLBK = HL, HL = dtmp;
|
|
|
|
ENTIME(4);
|
|
}
|
|
|
|
#define JP_RR(rrn, rr) \
|
|
OPDEF(jp_ ## rrn, 0xE9) \
|
|
{ \
|
|
PC = rr; \
|
|
ENTIME(4); \
|
|
}
|
|
|
|
JP_RR(hl, HL)
|
|
|
|
#define LD_SP_RR(rrn, rr) \
|
|
OPDEF(ld_sp_ ## rrn, 0xF9) \
|
|
{ \
|
|
SP = rr; \
|
|
ENTIME(6); \
|
|
}
|
|
|
|
LD_SP_RR(hl, HL)
|
|
|
|
#define JP_CC(ccn, cc, n) \
|
|
OPDEF(jp_ ## ccn ## _nn, 0xC2+n*8) \
|
|
{ \
|
|
if(!(cc)) { \
|
|
PC+=2; \
|
|
ENTIME(10); \
|
|
} \
|
|
else { \
|
|
PC = DREAD(PC); \
|
|
ENTIME(10); \
|
|
} \
|
|
}
|
|
|
|
JP_CC(nz, !TESTZF, 0)
|
|
JP_CC(z, TESTZF, 1)
|
|
JP_CC(nc, !TESTCF, 2)
|
|
JP_CC(c, TESTCF, 3)
|
|
JP_CC(po, !TESTPF, 4)
|
|
JP_CC(pe, TESTPF, 5)
|
|
JP_CC(p, !TESTSF, 6)
|
|
JP_CC(m, TESTSF, 7)
|
|
|
|
OPDEF(jp_nn, 0xC3)
|
|
{
|
|
PC = DREAD(PC);
|
|
ENTIME(10);
|
|
}
|
|
|
|
|
|
OPDEF(out_in_a, 0xD3)
|
|
{
|
|
OUT(RA, *PCP, RA);
|
|
PC++;
|
|
ENTIME(11);
|
|
}
|
|
|
|
OPDEF(in_a_in, 0xDB)
|
|
{
|
|
IN(RA, *PCP, RA);
|
|
PC++;
|
|
ENTIME(11);
|
|
}
|
|
|
|
#define EX_ISP_RR(rrn, rr) \
|
|
OPDEF(ex_isp_ ## rrn, 0xE3) \
|
|
{ \
|
|
register dbyte dtmp; \
|
|
dtmp = DREAD(SP); \
|
|
DWRITE(SP, rr); \
|
|
rr = dtmp; \
|
|
ENTIME(19); \
|
|
}
|
|
|
|
EX_ISP_RR(hl, HL)
|
|
|
|
OPDEF(ex_de_hl, 0xEB)
|
|
{
|
|
register dbyte dtmp;
|
|
dtmp = DE;
|
|
DE = HL;
|
|
HL = dtmp;
|
|
ENTIME(4);
|
|
}
|
|
|
|
OPDEF(di, 0xF3)
|
|
{
|
|
DANM(iff1) = 0;
|
|
DANM(iff2) = 0;
|
|
DI_CHECK
|
|
ENTIME(4);
|
|
}
|
|
|
|
OPDEF(ei, 0xFB)
|
|
{
|
|
DANM(iff1) = 1;
|
|
DANM(iff2) = 1;
|
|
ENTIME(4);
|
|
}
|
|
|
|
|
|
|
|
#define CALL_CC(ccn, cc, n) \
|
|
OPDEF(call_ ## ccn ## _nn, 0xC4+n*8) \
|
|
{ \
|
|
if(!(cc)) { \
|
|
PC+=2; \
|
|
ENTIME(10); \
|
|
} \
|
|
else { \
|
|
register dbyte dtmp; \
|
|
dtmp = PC; \
|
|
PC = DREAD(dtmp); \
|
|
dtmp += 2; \
|
|
PUSH(dtmp); \
|
|
ENTIME(17); \
|
|
} \
|
|
}
|
|
|
|
CALL_CC(nz, !TESTZF, 0)
|
|
CALL_CC(z, TESTZF, 1)
|
|
CALL_CC(nc, !TESTCF, 2)
|
|
CALL_CC(c, TESTCF, 3)
|
|
CALL_CC(po, !TESTPF, 4)
|
|
CALL_CC(pe, TESTPF, 5)
|
|
CALL_CC(p, !TESTSF, 6)
|
|
CALL_CC(m, TESTSF, 7)
|
|
|
|
|
|
|
|
#define PUSH_RR(rrn, rr, n) \
|
|
OPDEF(push_ ## rrn, 0xC5+n*0x10) \
|
|
{ \
|
|
PUSH(rr); \
|
|
ENTIME(11); \
|
|
}
|
|
|
|
PUSH_RR(bc, BC, 0)
|
|
PUSH_RR(de, DE, 1)
|
|
PUSH_RR(hl, HL, 2)
|
|
PUSH_RR(af, AF, 3)
|
|
|
|
|
|
OPDEF(call_nn, 0xCD)
|
|
{
|
|
register dbyte dtmp;
|
|
dtmp = PC;
|
|
PC = DREAD(dtmp);
|
|
dtmp += 2;
|
|
PUSH(dtmp);
|
|
ENTIME(17);
|
|
}
|
|
|
|
|
|
OPDEF(add_a_n, 0xC6)
|
|
{
|
|
ADD(*PCP);
|
|
PC++;
|
|
ENTIME(7);
|
|
}
|
|
|
|
|
|
OPDEF(adc_a_n, 0xCE)
|
|
{
|
|
ADC(*PCP);
|
|
PC++;
|
|
ENTIME(7);
|
|
}
|
|
|
|
OPDEF(sub_n, 0xD6)
|
|
{
|
|
SUB(*PCP);
|
|
PC++;
|
|
ENTIME(7);
|
|
}
|
|
|
|
|
|
OPDEF(sbc_a_n, 0xDE)
|
|
{
|
|
SBC(*PCP);
|
|
PC++;
|
|
ENTIME(7);
|
|
}
|
|
|
|
OPDEF(and_n, 0xE6)
|
|
{
|
|
AND(*PCP);
|
|
PC++;
|
|
ENTIME(7);
|
|
}
|
|
|
|
|
|
OPDEF(xor_n, 0xEE)
|
|
{
|
|
XOR(*PCP);
|
|
PC++;
|
|
ENTIME(7);
|
|
}
|
|
|
|
OPDEF(or_n, 0xF6)
|
|
{
|
|
OR(*PCP);
|
|
PC++;
|
|
ENTIME(7);
|
|
}
|
|
|
|
|
|
OPDEF(cp_n, 0xFE)
|
|
{
|
|
CP(*PCP);
|
|
PC++;
|
|
ENTIME(7);
|
|
}
|
|
|
|
#define RST_NN(nnn, n) \
|
|
OPDEF(rst_ ## nnn, 0xC7+n*8) \
|
|
{ \
|
|
PUSH(PC); \
|
|
PC = n*8; \
|
|
ENTIME(11); \
|
|
}
|
|
|
|
RST_NN(00, 0)
|
|
RST_NN(08, 1)
|
|
RST_NN(10, 2)
|
|
RST_NN(18, 3)
|
|
RST_NN(20, 4)
|
|
RST_NN(28, 5)
|
|
RST_NN(30, 6)
|
|
RST_NN(38, 7)
|
|
|
|
#include "z80_op4x.c"
|