166 lines
4.2 KiB
C
166 lines
4.2 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.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#include "z80.h"
|
||
|
|
||
|
#ifdef PROCP
|
||
|
|
||
|
typedef Z80 *z80t;
|
||
|
|
||
|
#define OPDEF(name, num) z80t z80op_ ## name (z80t z80p)
|
||
|
#define ENDOP() return z80p
|
||
|
#undef DANM
|
||
|
#define DANM(x) z80p->x
|
||
|
|
||
|
#define TAB(t) DANM(t)
|
||
|
#define PORT(t) DANM(t)
|
||
|
#define SPECP(t) DANM(t)
|
||
|
|
||
|
#else
|
||
|
|
||
|
typedef void z80t;
|
||
|
|
||
|
#define OPDEF(name, num) void z80op_ ## name (z80t)
|
||
|
#define ENDOP()
|
||
|
|
||
|
#define TAB(t) z80c_ ## t
|
||
|
#define PORT(t) PRNM(t)
|
||
|
#define SPECP(t) SPNM(t)
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
typedef z80t (*op_f)(z80t);
|
||
|
extern op_f z80c_op_tab[];
|
||
|
extern op_f z80c_op_tab_cb[];
|
||
|
extern op_f z80c_op_tab_dd[];
|
||
|
extern op_f z80c_op_tab_ed[];
|
||
|
extern op_f z80c_op_tab_fd[];
|
||
|
|
||
|
#define TIME(x) DANM(tc) -= (x)
|
||
|
|
||
|
#define ENTIME(x) { TIME(x); ENDOP(); }
|
||
|
|
||
|
#define READ(addr) (DANM(mem)[addr])
|
||
|
#define WRITE(addr, val) PUTMEM(addr, DANM(mem) + (dbyte) (addr), val)
|
||
|
|
||
|
#define DREAD(addr) (DANM(mem)[addr] | (DANM(mem)[(dbyte)(addr+1)] << 8))
|
||
|
#define DWRITE(addr, x) WRITE(addr, (byte) x); \
|
||
|
WRITE((dbyte) (addr+1), (byte) (x >> 8))
|
||
|
|
||
|
#define IPCS ((sbyte) *PCP)
|
||
|
|
||
|
|
||
|
#define MODMEM(func) \
|
||
|
{ \
|
||
|
register byte bdef; \
|
||
|
bdef = *HLP; \
|
||
|
func(bdef); \
|
||
|
PUTMEM(HL, HLP, bdef); \
|
||
|
}
|
||
|
|
||
|
#define MODMEMADDR(func, addr) \
|
||
|
{ \
|
||
|
register byte bdef; \
|
||
|
bdef = READ(addr); \
|
||
|
func(bdef); \
|
||
|
WRITE(addr, bdef); \
|
||
|
}
|
||
|
|
||
|
#define IXDGET(ixy, addr) addr = ((dbyte) (ixy + IPCS)), PC++
|
||
|
|
||
|
#define FETCHD(x) \
|
||
|
{ \
|
||
|
register dbyte ddef; \
|
||
|
ddef = PC; \
|
||
|
x = DREAD(ddef); \
|
||
|
PC = ddef+2; \
|
||
|
}
|
||
|
|
||
|
#define POP(x) \
|
||
|
{ \
|
||
|
register dbyte ddef; \
|
||
|
ddef = SP; \
|
||
|
x = DREAD(ddef); \
|
||
|
SP = ddef+2; \
|
||
|
}
|
||
|
|
||
|
#define PUSH(x) \
|
||
|
{ \
|
||
|
register dbyte ddef, dval; \
|
||
|
dval = x; \
|
||
|
ddef = SP-2; \
|
||
|
DWRITE(ddef, dval); \
|
||
|
SP = ddef; \
|
||
|
}
|
||
|
|
||
|
#ifdef SPECT_MEM
|
||
|
#include "sp_def.h"
|
||
|
#else
|
||
|
|
||
|
#define PUTMEM(addr, ptr, val) *(ptr) = (val)
|
||
|
#define IN(porth, portl, dest) dest = PORT(inports)[portl]
|
||
|
#define OUT(porth, portl, source) PORT(outports)[portl] = (source)
|
||
|
#define DI_CHECK
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define SF 0x80
|
||
|
#define ZF 0x40
|
||
|
#define B5F 0x20
|
||
|
#define HF 0x10
|
||
|
#define B3F 0x08
|
||
|
#define PVF 0x04
|
||
|
#define NF 0x02
|
||
|
#define CF 0x01
|
||
|
|
||
|
#define ALLF (SF | ZF | HF | PVF | NF | CF)
|
||
|
#define BUTCF (SF | ZF | HF | PVF | NF)
|
||
|
|
||
|
#define AALLF 0xff
|
||
|
#define ABUTCF 0xfe
|
||
|
|
||
|
#define SETFLAGS(mask, val) (RF = (RF & ~(mask)) | (val))
|
||
|
#define SET_FL(x) (RF |= (x))
|
||
|
#define CLR_FL(x) (RF &= ~(x))
|
||
|
|
||
|
|
||
|
#define TESTZF (RF & ZF)
|
||
|
#define TESTCF (RF & CF)
|
||
|
#define TESTSF (RF & SF)
|
||
|
#define TESTPF (RF & PVF)
|
||
|
#define TESTHF (RF & HF)
|
||
|
#define TESTNF (RF & NF)
|
||
|
|
||
|
|
||
|
#define IDXCALC(v1, v2, res) \
|
||
|
((res & 0xA8) | ((v1 & 0x88) >> 1) | ((v2 & 0x88) >> 3))
|
||
|
|
||
|
#define DIDXCALC(v1, v2, res) \
|
||
|
(((res & 0x8800) >> 8) | ((v1 & 0x8800) >> 9) | ((v2 & 0x8800) >> 11))
|
||
|
|
||
|
|
||
|
extern byte z80c_incf_tbl[];
|
||
|
extern byte z80c_decf_tbl[];
|
||
|
extern byte z80c_addf_tbl[];
|
||
|
extern byte z80c_subf_tbl[];
|
||
|
extern byte z80c_orf_tbl[];
|