forked from amberisvibin/chibi-pc09
3299 lines
64 KiB
C
3299 lines
64 KiB
C
/*
|
|
* Z80SIM - a Z80-CPU simulator
|
|
*
|
|
* Copyright (C) 1987-2006 by Udo Munk
|
|
*
|
|
* History:
|
|
* 28-SEP-87 Development on TARGON/35 with AT&T Unix System V.3
|
|
* 11-JAN-89 Release 1.1
|
|
* 08-FEB-89 Release 1.2
|
|
* 13-MAR-89 Release 1.3
|
|
* 09-FEB-90 Release 1.4 Ported to TARGON/31 M10/30
|
|
* 20-DEC-90 Release 1.5 Ported to COHERENT 3.0
|
|
* 10-JUN-92 Release 1.6 long casting problem solved with COHERENT 3.2
|
|
* and some optimization
|
|
* 25-JUN-92 Release 1.7 comments in english
|
|
* 04-OCT-06 Release 1.8 modified to compile on modern POSIX OS's
|
|
*/
|
|
|
|
#include <unistd.h>
|
|
#include <stdio.h>
|
|
#include <time.h>
|
|
#include "sim.h"
|
|
#include "simglb.h"
|
|
|
|
static int op_notimpl(void);
|
|
static int op_nop(void), op_halt(void), op_scf(void);
|
|
static int op_ccf(void), op_cpl(void), op_daa(void);
|
|
static int op_ei(void), op_di(void);
|
|
static int op_in(void), op_out(void);
|
|
static int op_ldan(void), op_ldbn(void), op_ldcn(void);
|
|
static int op_lddn(void), op_lden(void);
|
|
static int op_ldhn(void), op_ldln(void);
|
|
static int op_ldabc(void), op_ldade(void), op_ldann(void);
|
|
static int op_ldbca(void), op_lddea(void), op_ldnna(void);
|
|
static int op_ldhla(void), op_ldhlb(void), op_ldhlc(void), op_ldhld(void);
|
|
static int op_ldhle(void), op_ldhlh(void), op_ldhll(void), op_ldhl1(void);
|
|
static int op_ldaa(void), op_ldab(void), op_ldac(void);
|
|
static int op_ldad(void), op_ldae(void);
|
|
static int op_ldah(void), op_ldal(void), op_ldahl(void);
|
|
static int op_ldba(void), op_ldbb(void), op_ldbc(void);
|
|
static int op_ldbd(void), op_ldbe(void);
|
|
static int op_ldbh(void), op_ldbl(void), op_ldbhl(void);
|
|
static int op_ldca(void), op_ldcb(void), op_ldcc(void);
|
|
static int op_ldcd(void), op_ldce(void);
|
|
static int op_ldch(void), op_ldcl(void), op_ldchl(void);
|
|
static int op_ldda(void), op_lddb(void), op_lddc(void);
|
|
static int op_lddd(void), op_ldde(void);
|
|
static int op_lddh(void), op_lddl(void), op_lddhl(void);
|
|
static int op_ldea(void), op_ldeb(void), op_ldec(void);
|
|
static int op_lded(void), op_ldee(void);
|
|
static int op_ldeh(void), op_ldel(void), op_ldehl(void);
|
|
static int op_ldha(void), op_ldhb(void), op_ldhc(void);
|
|
static int op_ldhd(void), op_ldhe(void);
|
|
static int op_ldhh(void), op_ldhl(void), op_ldhhl(void);
|
|
static int op_ldla(void), op_ldlb(void), op_ldlc(void);
|
|
static int op_ldld(void), op_ldle(void);
|
|
static int op_ldlh(void), op_ldll(void), op_ldlhl(void);
|
|
static int op_ldbcnn(void), op_lddenn(void), op_ldhlnn(void);
|
|
static int op_ldspnn(void), op_ldsphl(void);
|
|
static int op_ldhlin(void), op_ldinhl(void);
|
|
static int op_incbc(void), op_incde(void), op_inchl(void), op_incsp(void);
|
|
static int op_decbc(void), op_decde(void), op_dechl(void), op_decsp(void);
|
|
static int op_adhlbc(void), op_adhlde(void), op_adhlhl(void), op_adhlsp(void);
|
|
static int op_anda(void), op_andb(void), op_andc(void), op_andd(void), op_ande(void);
|
|
static int op_andh(void), op_andl(void), op_andhl(void), op_andn(void);
|
|
static int op_ora(void), op_orb(void), op_orc(void), op_ord(void), op_ore(void);
|
|
static int op_orh(void), op_orl(void), op_orhl(void), op_orn(void);
|
|
static int op_xora(void), op_xorb(void), op_xorc(void), op_xord(void), op_xore(void);
|
|
static int op_xorh(void), op_xorl(void), op_xorhl(void), op_xorn(void);
|
|
static int op_adda(void), op_addb(void), op_addc(void), op_addd(void), op_adde(void);
|
|
static int op_addh(void), op_addl(void), op_addhl(void), op_addn(void);
|
|
static int op_adca(void), op_adcb(void), op_adcc(void), op_adcd(void), op_adce(void);
|
|
static int op_adch(void), op_adcl(void), op_adchl(void), op_adcn(void);
|
|
static int op_suba(void), op_subb(void), op_subc(void), op_subd(void), op_sube(void);
|
|
static int op_subh(void), op_subl(void), op_subhl(void), op_subn(void);
|
|
static int op_sbca(void), op_sbcb(void), op_sbcc(void), op_sbcd(void), op_sbce(void);
|
|
static int op_sbch(void), op_sbcl(void), op_sbchl(void), op_sbcn(void);
|
|
static int op_cpa(void), op_cpb(void), op_cpc(void), op_cpd(void), op_cpe(void);
|
|
static int op_cph(void), op_cplr(void), op_cphl(void), op_cpn(void);
|
|
static int op_inca(void), op_incb(void), op_incc(void), op_incd(void), op_ince(void);
|
|
static int op_inch(void), op_incl(void), op_incihl(void);
|
|
static int op_deca(void), op_decb(void), op_decc(void), op_decd(void), op_dece(void);
|
|
static int op_dech(void), op_decl(void), op_decihl(void);
|
|
static int op_rlca(void), op_rrca(void),op_rla(void),op_rra(void);
|
|
static int op_exdehl(void), op_exafaf(void), op_exx(void), op_exsphl(void);
|
|
static int op_pushaf(void), op_pushbc(void), op_pushde(void), op_pushhl(void);
|
|
static int op_popaf(void), op_popbc(void), op_popde(void), op_pophl(void);
|
|
static int op_jp(void), op_jphl(void), op_jr(void), op_djnz(void), op_call(void), op_ret(void);
|
|
static int op_jpz(void), op_jpnz(void), op_jpc(void), op_jpnc(void);
|
|
static int op_jppe(void), op_jppo(void), op_jpm(void), op_jpp(void);
|
|
static int op_calz(void), op_calnz(void), op_calc(void), op_calnc(void);
|
|
static int op_calpe(void), op_calpo(void), op_calm(void), op_calp(void);
|
|
static int op_retz(void), op_retnz(void), op_retc(void), op_retnc(void);
|
|
static int op_retpe(void), op_retpo(void), op_retm(void), op_retp(void);
|
|
static int op_jrz(void), op_jrnz(void), op_jrc(void), op_jrnc(void);
|
|
static int op_rst00(void), op_rst08(void), op_rst10(void), op_rst18(void);
|
|
static int op_rst20(void), op_rst28(void), op_rst30(void), op_rst38(void);
|
|
extern int op_cb_handel(void), op_dd_handel(void);
|
|
extern int op_ed_handel(void), op_fd_handel(void);
|
|
|
|
/*
|
|
* This function builds the Z80 central processing unit.
|
|
* The opcode where PC points to is fetched from the memory
|
|
* and PC incremented by one. The opcode is used as an
|
|
* index to an array with function pointers, to execute a
|
|
* function which emulates this Z80 opcode.
|
|
*/
|
|
void cpu(void)
|
|
{
|
|
static int (*op_sim[256]) (void) = {
|
|
op_nop, /* 0x00 */
|
|
op_ldbcnn, /* 0x01 */
|
|
op_ldbca, /* 0x02 */
|
|
op_incbc, /* 0x03 */
|
|
op_incb, /* 0x04 */
|
|
op_decb, /* 0x05 */
|
|
op_ldbn, /* 0x06 */
|
|
op_rlca, /* 0x07 */
|
|
op_exafaf, /* 0x08 */
|
|
op_adhlbc, /* 0x09 */
|
|
op_ldabc, /* 0x0a */
|
|
op_decbc, /* 0x0b */
|
|
op_incc, /* 0x0c */
|
|
op_decc, /* 0x0d */
|
|
op_ldcn, /* 0x0e */
|
|
op_rrca, /* 0x0f */
|
|
op_djnz, /* 0x10 */
|
|
op_lddenn, /* 0x11 */
|
|
op_lddea, /* 0x12 */
|
|
op_incde, /* 0x13 */
|
|
op_incd, /* 0x14 */
|
|
op_decd, /* 0x15 */
|
|
op_lddn, /* 0x16 */
|
|
op_rla, /* 0x17 */
|
|
op_jr, /* 0x18 */
|
|
op_adhlde, /* 0x19 */
|
|
op_ldade, /* 0x1a */
|
|
op_decde, /* 0x1b */
|
|
op_ince, /* 0x1c */
|
|
op_dece, /* 0x1d */
|
|
op_lden, /* 0x1e */
|
|
op_rra, /* 0x1f */
|
|
op_jrnz, /* 0x20 */
|
|
op_ldhlnn, /* 0x21 */
|
|
op_ldinhl, /* 0x22 */
|
|
op_inchl, /* 0x23 */
|
|
op_inch, /* 0x24 */
|
|
op_dech, /* 0x25 */
|
|
op_ldhn, /* 0x26 */
|
|
op_daa, /* 0x27 */
|
|
op_jrz, /* 0x28 */
|
|
op_adhlhl, /* 0x29 */
|
|
op_ldhlin, /* 0x2a */
|
|
op_dechl, /* 0x2b */
|
|
op_incl, /* 0x2c */
|
|
op_decl, /* 0x2d */
|
|
op_ldln, /* 0x2e */
|
|
op_cpl, /* 0x2f */
|
|
op_jrnc, /* 0x30 */
|
|
op_ldspnn, /* 0x31 */
|
|
op_ldnna, /* 0x32 */
|
|
op_incsp, /* 0x33 */
|
|
op_incihl, /* 0x34 */
|
|
op_decihl, /* 0x35 */
|
|
op_ldhl1, /* 0x36 */
|
|
op_scf, /* 0x37 */
|
|
op_jrc, /* 0x38 */
|
|
op_adhlsp, /* 0x39 */
|
|
op_ldann, /* 0x3a */
|
|
op_decsp, /* 0x3b */
|
|
op_inca, /* 0x3c */
|
|
op_deca, /* 0x3d */
|
|
op_ldan, /* 0x3e */
|
|
op_ccf, /* 0x3f */
|
|
op_ldbb, /* 0x40 */
|
|
op_ldbc, /* 0x41 */
|
|
op_ldbd, /* 0x42 */
|
|
op_ldbe, /* 0x43 */
|
|
op_ldbh, /* 0x44 */
|
|
op_ldbl, /* 0x45 */
|
|
op_ldbhl, /* 0x46 */
|
|
op_ldba, /* 0x47 */
|
|
op_ldcb, /* 0x48 */
|
|
op_ldcc, /* 0x49 */
|
|
op_ldcd, /* 0x4a */
|
|
op_ldce, /* 0x4b */
|
|
op_ldch, /* 0x4c */
|
|
op_ldcl, /* 0x4d */
|
|
op_ldchl, /* 0x4e */
|
|
op_ldca, /* 0x4f */
|
|
op_lddb, /* 0x50 */
|
|
op_lddc, /* 0x51 */
|
|
op_lddd, /* 0x52 */
|
|
op_ldde, /* 0x53 */
|
|
op_lddh, /* 0x54 */
|
|
op_lddl, /* 0x55 */
|
|
op_lddhl, /* 0x56 */
|
|
op_ldda, /* 0x57 */
|
|
op_ldeb, /* 0x58 */
|
|
op_ldec, /* 0x59 */
|
|
op_lded, /* 0x5a */
|
|
op_ldee, /* 0x5b */
|
|
op_ldeh, /* 0x5c */
|
|
op_ldel, /* 0x5d */
|
|
op_ldehl, /* 0x5e */
|
|
op_ldea, /* 0x5f */
|
|
op_ldhb, /* 0x60 */
|
|
op_ldhc, /* 0x61 */
|
|
op_ldhd, /* 0x62 */
|
|
op_ldhe, /* 0x63 */
|
|
op_ldhh, /* 0x64 */
|
|
op_ldhl, /* 0x65 */
|
|
op_ldhhl, /* 0x66 */
|
|
op_ldha, /* 0x67 */
|
|
op_ldlb, /* 0x68 */
|
|
op_ldlc, /* 0x69 */
|
|
op_ldld, /* 0x6a */
|
|
op_ldle, /* 0x6b */
|
|
op_ldlh, /* 0x6c */
|
|
op_ldll, /* 0x6d */
|
|
op_ldlhl, /* 0x6e */
|
|
op_ldla, /* 0x6f */
|
|
op_ldhlb, /* 0x70 */
|
|
op_ldhlc, /* 0x71 */
|
|
op_ldhld, /* 0x72 */
|
|
op_ldhle, /* 0x73 */
|
|
op_ldhlh, /* 0x74 */
|
|
op_ldhll, /* 0x75 */
|
|
op_halt, /* 0x76 */
|
|
op_ldhla, /* 0x77 */
|
|
op_ldab, /* 0x78 */
|
|
op_ldac, /* 0x79 */
|
|
op_ldad, /* 0x7a */
|
|
op_ldae, /* 0x7b */
|
|
op_ldah, /* 0x7c */
|
|
op_ldal, /* 0x7d */
|
|
op_ldahl, /* 0x7e */
|
|
op_ldaa, /* 0x7f */
|
|
op_addb, /* 0x80 */
|
|
op_addc, /* 0x81 */
|
|
op_addd, /* 0x82 */
|
|
op_adde, /* 0x83 */
|
|
op_addh, /* 0x84 */
|
|
op_addl, /* 0x85 */
|
|
op_addhl, /* 0x86 */
|
|
op_adda, /* 0x87 */
|
|
op_adcb, /* 0x88 */
|
|
op_adcc, /* 0x89 */
|
|
op_adcd, /* 0x8a */
|
|
op_adce, /* 0x8b */
|
|
op_adch, /* 0x8c */
|
|
op_adcl, /* 0x8d */
|
|
op_adchl, /* 0x8e */
|
|
op_adca, /* 0x8f */
|
|
op_subb, /* 0x90 */
|
|
op_subc, /* 0x91 */
|
|
op_subd, /* 0x92 */
|
|
op_sube, /* 0x93 */
|
|
op_subh, /* 0x94 */
|
|
op_subl, /* 0x95 */
|
|
op_subhl, /* 0x96 */
|
|
op_suba, /* 0x97 */
|
|
op_sbcb, /* 0x98 */
|
|
op_sbcc, /* 0x99 */
|
|
op_sbcd, /* 0x9a */
|
|
op_sbce, /* 0x9b */
|
|
op_sbch, /* 0x9c */
|
|
op_sbcl, /* 0x9d */
|
|
op_sbchl, /* 0x9e */
|
|
op_sbca, /* 0x9f */
|
|
op_andb, /* 0xa0 */
|
|
op_andc, /* 0xa1 */
|
|
op_andd, /* 0xa2 */
|
|
op_ande, /* 0xa3 */
|
|
op_andh, /* 0xa4 */
|
|
op_andl, /* 0xa5 */
|
|
op_andhl, /* 0xa6 */
|
|
op_anda, /* 0xa7 */
|
|
op_xorb, /* 0xa8 */
|
|
op_xorc, /* 0xa9 */
|
|
op_xord, /* 0xaa */
|
|
op_xore, /* 0xab */
|
|
op_xorh, /* 0xac */
|
|
op_xorl, /* 0xad */
|
|
op_xorhl, /* 0xae */
|
|
op_xora, /* 0xaf */
|
|
op_orb, /* 0xb0 */
|
|
op_orc, /* 0xb1 */
|
|
op_ord, /* 0xb2 */
|
|
op_ore, /* 0xb3 */
|
|
op_orh, /* 0xb4 */
|
|
op_orl, /* 0xb5 */
|
|
op_orhl, /* 0xb6 */
|
|
op_ora, /* 0xb7 */
|
|
op_cpb, /* 0xb8 */
|
|
op_cpc, /* 0xb9 */
|
|
op_cpd, /* 0xba */
|
|
op_cpe, /* 0xbb */
|
|
op_cph, /* 0xbc */
|
|
op_cplr, /* 0xbd */
|
|
op_cphl, /* 0xbe */
|
|
op_cpa, /* 0xbf */
|
|
op_retnz, /* 0xc0 */
|
|
op_popbc, /* 0xc1 */
|
|
op_jpnz, /* 0xc2 */
|
|
op_jp, /* 0xc3 */
|
|
op_calnz, /* 0xc4 */
|
|
op_pushbc, /* 0xc5 */
|
|
op_addn, /* 0xc6 */
|
|
op_rst00, /* 0xc7 */
|
|
op_retz, /* 0xc8 */
|
|
op_ret, /* 0xc9 */
|
|
op_jpz, /* 0xca */
|
|
op_cb_handel, /* 0xcb */
|
|
op_calz, /* 0xcc */
|
|
op_call, /* 0xcd */
|
|
op_adcn, /* 0xce */
|
|
op_rst08, /* 0xcf */
|
|
op_retnc, /* 0xd0 */
|
|
op_popde, /* 0xd1 */
|
|
op_jpnc, /* 0xd2 */
|
|
op_out, /* 0xd3 */
|
|
op_calnc, /* 0xd4 */
|
|
op_pushde, /* 0xd5 */
|
|
op_subn, /* 0xd6 */
|
|
op_rst10, /* 0xd7 */
|
|
op_retc, /* 0xd8 */
|
|
op_exx, /* 0xd9 */
|
|
op_jpc, /* 0xda */
|
|
op_in, /* 0xdb */
|
|
op_calc, /* 0xdc */
|
|
op_dd_handel, /* 0xdd */
|
|
op_sbcn, /* 0xde */
|
|
op_rst18, /* 0xdf */
|
|
op_retpo, /* 0xe0 */
|
|
op_pophl, /* 0xe1 */
|
|
op_jppo, /* 0xe2 */
|
|
op_exsphl, /* 0xe3 */
|
|
op_calpo, /* 0xe4 */
|
|
op_pushhl, /* 0xe5 */
|
|
op_andn, /* 0xe6 */
|
|
op_rst20, /* 0xe7 */
|
|
op_retpe, /* 0xe8 */
|
|
op_jphl, /* 0xe9 */
|
|
op_jppe, /* 0xea */
|
|
op_exdehl, /* 0xeb */
|
|
op_calpe, /* 0xec */
|
|
op_ed_handel, /* 0xed */
|
|
op_xorn, /* 0xee */
|
|
op_rst28, /* 0xef */
|
|
op_retp, /* 0xf0 */
|
|
op_popaf, /* 0xf1 */
|
|
op_jpp, /* 0xf2 */
|
|
op_di, /* 0xf3 */
|
|
op_calp, /* 0xf4 */
|
|
op_pushaf, /* 0xf5 */
|
|
op_orn, /* 0xf6 */
|
|
op_rst30, /* 0xf7 */
|
|
op_retm, /* 0xf8 */
|
|
op_ldsphl, /* 0xf9 */
|
|
op_jpm, /* 0xfa */
|
|
op_ei, /* 0xfb */
|
|
op_calm, /* 0xfc */
|
|
op_fd_handel, /* 0xfd */
|
|
op_cpn, /* 0xfe */
|
|
op_rst38 /* 0xff */
|
|
};
|
|
|
|
#ifdef WANT_TIM
|
|
register int t;
|
|
#endif
|
|
|
|
do {
|
|
|
|
#ifdef HISIZE /* write history */
|
|
his[h_next].h_adr = PC - ram;
|
|
his[h_next].h_af = (A << 8) + F;
|
|
his[h_next].h_bc = (B << 8) + C;
|
|
his[h_next].h_de = (D << 8) + E;
|
|
his[h_next].h_hl = (H << 8) + L;
|
|
his[h_next].h_ix = IX;
|
|
his[h_next].h_iy = IY;
|
|
his[h_next].h_sp = STACK - ram;
|
|
h_next++;
|
|
if (h_next == HISIZE) {
|
|
h_flag = 1;
|
|
h_next = 0;
|
|
}
|
|
#endif
|
|
|
|
#ifdef WANT_TIM /* check for start address of runtime measurement */
|
|
if (PC == t_start && !t_flag) {
|
|
t_flag = 1; /* switch measurement on */
|
|
t_states = 0L; /* initialize counted T-states */
|
|
}
|
|
#endif
|
|
|
|
#ifdef WANT_INT /* CPU interrupt handling */
|
|
if (int_type)
|
|
switch (int_type) {
|
|
case INT_NMI: /* non maskable interrupt */
|
|
int_type = INT_NONE;
|
|
IFF <<= 1;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + 0x66;
|
|
break;
|
|
case INT_INT: /* maskable interrupt */
|
|
if (IFF != 3)
|
|
break;
|
|
IFF = 0;
|
|
switch (int_mode) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
int_type = INT_NONE;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + 0x38;
|
|
break;
|
|
case 2:
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
#ifdef WANT_TIM
|
|
t = (*op_sim[*PC++]) ();/* execute next opcode */
|
|
if (f_flag) { /* adjust CPU speed */
|
|
|
|
}
|
|
#else
|
|
(*op_sim[*PC++]) ();
|
|
#endif
|
|
|
|
#ifdef WANT_PCC
|
|
if (PC > ram + 65535) /* check for PC overrun */
|
|
PC = ram;
|
|
#endif
|
|
|
|
R++; /* increment refresh register */
|
|
|
|
#ifdef WANT_TIM /* do runtime measurement */
|
|
if (t_flag) {
|
|
t_states += t; /* add T-states for this opcode */
|
|
if (PC == t_end) /* check for end address */
|
|
t_flag = 0; /* if reached, switch off */
|
|
}
|
|
#endif
|
|
|
|
} while (cpu_state);
|
|
}
|
|
|
|
/*
|
|
* Trap not implemented opcodes. This function may be usefull
|
|
* later to trap some wanted opcodes.
|
|
*/
|
|
static int op_notimpl(void)
|
|
{
|
|
cpu_error = OPTRAP1;
|
|
cpu_state = STOPPED;
|
|
return(0);
|
|
}
|
|
|
|
static int op_nop(void) /* NOP */
|
|
{
|
|
return(4);
|
|
}
|
|
|
|
static int op_halt(void) /* HALT */
|
|
{
|
|
struct timespec timer;
|
|
|
|
if (break_flag) {
|
|
cpu_error = OPHALT;
|
|
cpu_state = STOPPED;
|
|
} else
|
|
while (int_type == 0) {
|
|
timer.tv_sec = 0;
|
|
timer.tv_nsec = 10000000;
|
|
nanosleep(&timer, NULL);
|
|
R += 99999;
|
|
}
|
|
return(0);
|
|
}
|
|
|
|
static int op_scf(void) /* SCF */
|
|
{
|
|
F |= C_FLAG;
|
|
F &= ~(N_FLAG | H_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_ccf(void) /* CCF */
|
|
{
|
|
if (F & C_FLAG) {
|
|
F |= H_FLAG;
|
|
F &= ~C_FLAG;
|
|
} else {
|
|
F &= ~H_FLAG;
|
|
F |= C_FLAG;
|
|
}
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_cpl(void) /* CPL */
|
|
{
|
|
A = ~A;
|
|
F |= H_FLAG | N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_daa(void) /* DAA */
|
|
{
|
|
register int old_a;
|
|
|
|
old_a = A;
|
|
if (F & N_FLAG) { /* subtractions */
|
|
if (((A & 0x0f) > 9) || (F & H_FLAG)) {
|
|
(((old_a & 0x0f) - 6) < 0) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
A = old_a -= 6;
|
|
}
|
|
if (((A & 0xf0) > 0x90) || (F & C_FLAG)) {
|
|
A -= 0x60;
|
|
if (old_a - 0x60 < 0)
|
|
F |= C_FLAG;
|
|
}
|
|
} else { /* additions */
|
|
if (((A & 0x0f) > 9) || (F & H_FLAG)) {
|
|
(((old_a & 0x0f) + 6) > 0x0f) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
A = old_a += 6;
|
|
}
|
|
if (((A & 0xf0) > 0x90) || (F & C_FLAG)) {
|
|
A += 0x60;
|
|
if (old_a + 0x60 > 255)
|
|
F |= C_FLAG;
|
|
}
|
|
}
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_ei(void) /* EI */
|
|
{
|
|
IFF = 3;
|
|
return(4);
|
|
}
|
|
|
|
static int op_di(void) /* DI */
|
|
{
|
|
IFF = 0;
|
|
return(4);
|
|
}
|
|
|
|
static int op_in(void) /* IN A,(n) */
|
|
{
|
|
BYTE io_in();
|
|
|
|
A = io_in(*PC++);
|
|
return(11);
|
|
}
|
|
|
|
static int op_out(void) /* OUT (n),A */
|
|
{
|
|
BYTE io_out();
|
|
|
|
io_out(*PC++, A);
|
|
return(11);
|
|
}
|
|
|
|
static int op_ldan(void) /* LD A,n */
|
|
{
|
|
A = *PC++;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldbn(void) /* LD B,n */
|
|
{
|
|
B = *PC++;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldcn(void) /* LD C,n */
|
|
{
|
|
C = *PC++;
|
|
return(7);
|
|
}
|
|
|
|
static int op_lddn(void) /* LD D,n */
|
|
{
|
|
D = *PC++;
|
|
return(7);
|
|
}
|
|
|
|
static int op_lden(void) /* LD E,n */
|
|
{
|
|
E = *PC++;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldhn(void) /* LD H,n */
|
|
{
|
|
H = *PC++;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldln(void) /* LD L,n */
|
|
{
|
|
L = *PC++;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldabc(void) /* LD A,(BC) */
|
|
{
|
|
A = *(ram + (B << 8) + C);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldade(void) /* LD A,(DE) */
|
|
{
|
|
A = *(ram + (D << 8) + E);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldann(void) /* LD A,(nn) */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
A = *(ram + i);
|
|
return(13);
|
|
}
|
|
|
|
static int op_ldbca(void) /* LD (BC),A */
|
|
{
|
|
*(ram + (B << 8) + C) = A;
|
|
return(7);
|
|
}
|
|
|
|
static int op_lddea(void) /* LD (DE),A */
|
|
{
|
|
*(ram + (D << 8) + E) = A;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldnna(void) /* LD (nn),A */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
*(ram + i) = A;
|
|
return(13);
|
|
}
|
|
|
|
static int op_ldhla(void) /* LD (HL),A */
|
|
{
|
|
*(ram + (H << 8) + L) = A;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldhlb(void) /* LD (HL),B */
|
|
{
|
|
*(ram + (H << 8) + L) = B;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldhlc(void) /* LD (HL),C */
|
|
{
|
|
*(ram + (H << 8) + L) = C;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldhld(void) /* LD (HL),D */
|
|
{
|
|
*(ram + (H << 8) + L) = D;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldhle(void) /* LD (HL),E */
|
|
{
|
|
*(ram + (H << 8) + L) = E;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldhlh(void) /* LD (HL),H */
|
|
{
|
|
*(ram + (H << 8) + L) = H;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldhll(void) /* LD (HL),L */
|
|
{
|
|
*(ram + (H << 8) + L) = L;
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldhl1(void) /* LD (HL),n */
|
|
{
|
|
*(ram + (H << 8) + L) = *PC++;
|
|
return(10);
|
|
}
|
|
|
|
static int op_ldaa(void) /* LD A,A */
|
|
{
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldab(void) /* LD A,B */
|
|
{
|
|
A = B;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldac(void) /* LD A,C */
|
|
{
|
|
A = C;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldad(void) /* LD A,D */
|
|
{
|
|
A = D;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldae(void) /* LD A,E */
|
|
{
|
|
A = E;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldah(void) /* LD A,H */
|
|
{
|
|
A = H;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldal(void) /* LD A,L */
|
|
{
|
|
A = L;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldahl(void) /* LD A,(HL) */
|
|
{
|
|
A = *(ram + (H << 8) + L);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldba(void) /* LD B,A */
|
|
{
|
|
B = A;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldbb(void) /* LD B,B */
|
|
{
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldbc(void) /* LD B,C */
|
|
{
|
|
B = C;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldbd(void) /* LD B,D */
|
|
{
|
|
B = D;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldbe(void) /* LD B,E */
|
|
{
|
|
B = E;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldbh(void) /* LD B,H */
|
|
{
|
|
B = H;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldbl(void) /* LD B,L */
|
|
{
|
|
B = L;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldbhl(void) /* LD B,(HL) */
|
|
{
|
|
B = *(ram + (H << 8) + L);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldca(void) /* LD C,A */
|
|
{
|
|
C = A;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldcb(void) /* LD C,B */
|
|
{
|
|
C = B;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldcc(void) /* LD C,C */
|
|
{
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldcd(void) /* LD C,D */
|
|
{
|
|
C = D;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldce(void) /* LD C,E */
|
|
{
|
|
C = E;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldch(void) /* LD C,H */
|
|
{
|
|
C = H;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldcl(void) /* LD C,L */
|
|
{
|
|
C = L;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldchl(void) /* LD C,(HL) */
|
|
{
|
|
C = *(ram + (H << 8) + L);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldda(void) /* LD D,A */
|
|
{
|
|
D = A;
|
|
return(4);
|
|
}
|
|
|
|
static int op_lddb(void) /* LD D,B */
|
|
{
|
|
D = B;
|
|
return(4);
|
|
}
|
|
|
|
static int op_lddc(void) /* LD D,C */
|
|
{
|
|
D = C;
|
|
return(4);
|
|
}
|
|
|
|
static int op_lddd(void) /* LD D,D */
|
|
{
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldde(void) /* LD D,E */
|
|
{
|
|
D = E;
|
|
return(4);
|
|
}
|
|
|
|
static int op_lddh(void) /* LD D,H */
|
|
{
|
|
D = H;
|
|
return(4);
|
|
}
|
|
|
|
static int op_lddl(void) /* LD D,L */
|
|
{
|
|
D = L;
|
|
return(4);
|
|
}
|
|
|
|
static int op_lddhl(void) /* LD D,(HL) */
|
|
{
|
|
D = *(ram + (H << 8) + L);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldea(void) /* LD E,A */
|
|
{
|
|
E = A;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldeb(void) /* LD E,B */
|
|
{
|
|
E = B;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldec(void) /* LD E,C */
|
|
{
|
|
E = C;
|
|
return(4);
|
|
}
|
|
|
|
static int op_lded(void) /* LD E,D */
|
|
{
|
|
E = D;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldee(void) /* LD E,E */
|
|
{
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldeh(void) /* LD E,H */
|
|
{
|
|
E = H;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldel(void) /* LD E,L */
|
|
{
|
|
E = L;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldehl(void) /* LD E,(HL) */
|
|
{
|
|
E = *(ram + (H << 8) + L);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldha(void) /* LD H,A */
|
|
{
|
|
H = A;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldhb(void) /* LD H,B */
|
|
{
|
|
H = B;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldhc(void) /* LD H,C */
|
|
{
|
|
H = C;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldhd(void) /* LD H,D */
|
|
{
|
|
H = D;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldhe(void) /* LD H,E */
|
|
{
|
|
H = E;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldhh(void) /* LD H,H */
|
|
{
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldhl(void) /* LD H,L */
|
|
{
|
|
H = L;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldhhl(void) /* LD H,(HL) */
|
|
{
|
|
H = *(ram + (H << 8) + L);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldla(void) /* LD L,A */
|
|
{
|
|
L = A;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldlb(void) /* LD L,B */
|
|
{
|
|
L = B;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldlc(void) /* LD L,C */
|
|
{
|
|
L = C;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldld(void) /* LD L,D */
|
|
{
|
|
L = D;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldle(void) /* LD L,E */
|
|
{
|
|
L = E;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldlh(void) /* LD L,H */
|
|
{
|
|
L = H;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldll(void) /* LD L,L */
|
|
{
|
|
return(4);
|
|
}
|
|
|
|
static int op_ldlhl(void) /* LD L,(HL) */
|
|
{
|
|
L = *(ram + (H << 8) + L);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ldbcnn(void) /* LD BC,nn */
|
|
{
|
|
C = *PC++;
|
|
B = *PC++;
|
|
return(10);
|
|
}
|
|
|
|
static int op_lddenn(void) /* LD DE,nn */
|
|
{
|
|
E = *PC++;
|
|
D = *PC++;
|
|
return(10);
|
|
}
|
|
|
|
static int op_ldhlnn(void) /* LD HL,nn */
|
|
{
|
|
L = *PC++;
|
|
H = *PC++;
|
|
return(10);
|
|
}
|
|
|
|
static int op_ldspnn(void) /* LD SP,nn */
|
|
{
|
|
STACK = ram + *PC++;
|
|
STACK += *PC++ << 8;
|
|
return(10);
|
|
}
|
|
|
|
static int op_ldsphl(void) /* LD SP,HL */
|
|
{
|
|
STACK = ram + (H << 8) + L;
|
|
return(6);
|
|
}
|
|
|
|
static int op_ldhlin(void) /* LD HL,(nn) */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
L = *(ram + i);
|
|
H = *(ram + i + 1);
|
|
return(16);
|
|
}
|
|
|
|
static int op_ldinhl(void) /* LD (nn),HL */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
*(ram + i) = L;
|
|
*(ram + i + 1) = H;
|
|
return(16);
|
|
}
|
|
|
|
static int op_incbc(void) /* INC BC */
|
|
{
|
|
C++;
|
|
if (!C)
|
|
B++;
|
|
return(6);
|
|
}
|
|
|
|
static int op_incde(void) /* INC DE */
|
|
{
|
|
E++;
|
|
if (!E)
|
|
D++;
|
|
return(6);
|
|
}
|
|
|
|
static int op_inchl(void) /* INC HL */
|
|
{
|
|
L++;
|
|
if (!L)
|
|
H++;
|
|
return(6);
|
|
}
|
|
|
|
static int op_incsp(void) /* INC SP */
|
|
{
|
|
STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK > ram + 65535)
|
|
STACK = ram;
|
|
#endif
|
|
return(6);
|
|
}
|
|
|
|
static int op_decbc(void) /* DEC BC */
|
|
{
|
|
C--;
|
|
if (C == 0xff)
|
|
B--;
|
|
return(6);
|
|
}
|
|
|
|
static int op_decde(void) /* DEC DE */
|
|
{
|
|
E--;
|
|
if (E == 0xff)
|
|
D--;
|
|
return(6);
|
|
}
|
|
|
|
static int op_dechl(void) /* DEC HL */
|
|
{
|
|
L--;
|
|
if (L == 0xff)
|
|
H--;
|
|
return(6);
|
|
}
|
|
|
|
static int op_decsp(void) /* DEC SP */
|
|
{
|
|
STACK--;
|
|
#ifdef WANT_SPC
|
|
if (STACK < ram)
|
|
STACK = ram + 65535;
|
|
#endif
|
|
return(6);
|
|
}
|
|
|
|
static int op_adhlbc(void) /* ADD HL,BC */
|
|
{
|
|
register int carry;
|
|
|
|
carry = (L + C > 255) ? 1 : 0;
|
|
L += C;
|
|
((H & 0xf) + (B & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(H + B + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
H += B + carry;
|
|
F &= ~N_FLAG;
|
|
return(11);
|
|
}
|
|
|
|
static int op_adhlde(void) /* ADD HL,DE */
|
|
{
|
|
register int carry;
|
|
|
|
carry = (L + E > 255) ? 1 : 0;
|
|
L += E;
|
|
((H & 0xf) + (D & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(H + D + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
H += D + carry;
|
|
F &= ~N_FLAG;
|
|
return(11);
|
|
}
|
|
|
|
static int op_adhlhl(void) /* ADD HL,HL */
|
|
{
|
|
register int carry;
|
|
|
|
carry = (L << 1 > 255) ? 1 : 0;
|
|
L <<= 1;
|
|
((H & 0xf) + (H & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(H + H + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
H += H + carry;
|
|
F &= ~N_FLAG;
|
|
return(11);
|
|
}
|
|
|
|
static int op_adhlsp(void) /* ADD HL,SP */
|
|
{
|
|
register int carry;
|
|
BYTE spl = (STACK - ram) & 0xff;
|
|
BYTE sph = (STACK - ram) >> 8;
|
|
|
|
carry = (L + spl > 255) ? 1 : 0;
|
|
L += spl;
|
|
((H & 0xf) + (sph & 0xf) + carry > 0xf) ? (F |= H_FLAG)
|
|
: (F &= ~H_FLAG);
|
|
(H + sph + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
H += sph + carry;
|
|
F &= ~N_FLAG;
|
|
return(11);
|
|
}
|
|
|
|
static int op_anda(void) /* AND A */
|
|
{
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= H_FLAG;
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_andb(void) /* AND B */
|
|
{
|
|
A &= B;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= H_FLAG;
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_andc(void) /* AND C */
|
|
{
|
|
A &= C;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= H_FLAG;
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_andd(void) /* AND D */
|
|
{
|
|
A &= D;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= H_FLAG;
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_ande(void) /* AND E */
|
|
{
|
|
A &= E;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= H_FLAG;
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_andh(void) /* AND H */
|
|
{
|
|
A &= H;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= H_FLAG;
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_andl(void) /* AND L */
|
|
{
|
|
A &= L;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= H_FLAG;
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_andhl(void) /* AND (HL) */
|
|
{
|
|
A &= *(ram + (H << 8) + L);
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= H_FLAG;
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(N_FLAG | C_FLAG);
|
|
return(7);
|
|
}
|
|
|
|
static int op_andn(void) /* AND n */
|
|
{
|
|
A &= *PC++;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= H_FLAG;
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(N_FLAG | C_FLAG);
|
|
return(7);
|
|
}
|
|
|
|
static int op_ora(void) /* OR A */
|
|
{
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_orb(void) /* OR B */
|
|
{
|
|
A |= B;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_orc(void) /* OR C */
|
|
{
|
|
A |= C;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_ord(void) /* OR D */
|
|
{
|
|
A |= D;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_ore(void) /* OR E */
|
|
{
|
|
A |= E;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_orh(void) /* OR H */
|
|
{
|
|
A |= H;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_orl(void) /* OR L */
|
|
{
|
|
A |= L;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_orhl(void) /* OR (HL) */
|
|
{
|
|
A |= *(ram + (H << 8) + L);
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(7);
|
|
}
|
|
|
|
static int op_orn(void) /* OR n */
|
|
{
|
|
A |= *PC++;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(7);
|
|
}
|
|
|
|
static int op_xora(void) /* XOR A */
|
|
{
|
|
A = 0;
|
|
F &= ~(S_FLAG | H_FLAG | N_FLAG | C_FLAG);
|
|
F |= Z_FLAG | P_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_xorb(void) /* XOR B */
|
|
{
|
|
A ^= B;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_xorc(void) /* XOR C */
|
|
{
|
|
A ^= C;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_xord(void) /* XOR D */
|
|
{
|
|
A ^= D;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_xore(void) /* XOR E */
|
|
{
|
|
A ^= E;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_xorh(void) /* XOR H */
|
|
{
|
|
A ^= H;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_xorl(void) /* XOR L */
|
|
{
|
|
A ^= L;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(4);
|
|
}
|
|
|
|
static int op_xorhl(void) /* XOR (HL) */
|
|
{
|
|
A ^= *(ram + (H << 8) + L);
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(7);
|
|
}
|
|
|
|
static int op_xorn(void) /* XOR n */
|
|
{
|
|
A ^= *PC++;
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
(parrity[A]) ? (F &= ~P_FLAG) : (F |= P_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG | C_FLAG);
|
|
return(7);
|
|
}
|
|
|
|
static int op_adda(void) /* ADD A,A */
|
|
{
|
|
register int i;
|
|
|
|
((A & 0xf) + (A & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
((A << 1) > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = ((char) A) << 1;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_addb(void) /* ADD A,B */
|
|
{
|
|
register int i;
|
|
|
|
((A & 0xf) + (B & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + B > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) B;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_addc(void) /* ADD A,C */
|
|
{
|
|
register int i;
|
|
|
|
((A & 0xf) + (C & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + C > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) C;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_addd(void) /* ADD A,Dn*/
|
|
{
|
|
register int i;
|
|
|
|
((A & 0xf) + (D & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + D > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) D;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_adde(void) /* ADD A,E */
|
|
{
|
|
register int i;
|
|
|
|
((A & 0xf) + (E & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + E > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) E;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_addh(void) /* ADD A,H */
|
|
{
|
|
register int i;
|
|
|
|
((A & 0xf) + (H & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + H > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) H;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_addl(void) /* ADD A,L */
|
|
{
|
|
register int i;
|
|
|
|
((A & 0xf) + (L & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + L > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) L;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_addhl(void) /* ADD A,(HL) */
|
|
{
|
|
register int i;
|
|
register BYTE P;
|
|
|
|
P = *(ram + (H << 8) + L);
|
|
((A & 0xf) + (P & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + P > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) P;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_addn(void) /* ADD A,n */
|
|
{
|
|
register int i;
|
|
register BYTE P;
|
|
|
|
P = *PC++;
|
|
((A & 0xf) + (P & 0xf) > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + P > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) P;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_adca(void) /* ADC A,A */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((A & 0xf) + (A & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
((A << 1) + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (((char) A) << 1) + carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_adcb(void) /* ADC A,B */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((A & 0xf) + (B & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + B + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) B + carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_adcc(void) /* ADC A,C */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((A & 0xf) + (C & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + C + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) C + carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_adcd(void) /* ADC A,D */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((A & 0xf) + (D & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + D + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) D + carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_adce(void) /* ADC A,E */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((A & 0xf) + (E & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + E + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) E + carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_adch(void) /* ADC A,H */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((A & 0xf) + (H & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + H + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) H + carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_adcl(void) /* ADC A,L */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((A & 0xf) + (L & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + L + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) L + carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_adchl(void) /* ADC A,(HL) */
|
|
{
|
|
register int i, carry;
|
|
register BYTE P;
|
|
|
|
P = *(ram + (H << 8) + L);
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((A & 0xf) + (P & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + P + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) P + carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_adcn(void) /* ADC A,n */
|
|
{
|
|
register int i, carry;
|
|
register BYTE P;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
P = *PC++;
|
|
((A & 0xf) + (P & 0xf) + carry > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(A + P + carry > 255) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A + (char) P + carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_suba(void) /* SUB A,A */
|
|
{
|
|
A = 0;
|
|
F &= ~(S_FLAG | H_FLAG | P_FLAG | C_FLAG);
|
|
F |= Z_FLAG | N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_subb(void) /* SUB A,B */
|
|
{
|
|
register int i;
|
|
|
|
((B & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(B > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) B;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_subc(void) /* SUB A,C */
|
|
{
|
|
register int i;
|
|
|
|
((C & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(C > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) C;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_subd(void) /* SUB A,D */
|
|
{
|
|
register int i;
|
|
|
|
((D & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(D > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) D;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_sube(void) /* SUB A,E */
|
|
{
|
|
register int i;
|
|
|
|
((E & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(E > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) E;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_subh(void) /* SUB A,H */
|
|
{
|
|
register int i;
|
|
|
|
((H & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(H > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) H;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_subl(void) /* SUB A,L */
|
|
{
|
|
register int i;
|
|
|
|
((L & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(L > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) L;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_subhl(void) /* SUB A,(HL) */
|
|
{
|
|
register int i;
|
|
register BYTE P;
|
|
|
|
P = *(ram + (H << 8) + L);
|
|
((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) P;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_subn(void) /* SUB A,n */
|
|
{
|
|
register int i;
|
|
register BYTE P;
|
|
|
|
P = *PC++;
|
|
((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) P;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_sbca(void) /* SBC A,A */
|
|
{
|
|
if (F & C_FLAG) {
|
|
F |= S_FLAG | H_FLAG | N_FLAG | C_FLAG;
|
|
F &= ~(Z_FLAG | P_FLAG);
|
|
A = 255;
|
|
} else {
|
|
F |= Z_FLAG | N_FLAG;
|
|
F &= ~(S_FLAG | H_FLAG | P_FLAG | C_FLAG);
|
|
A = 0;
|
|
}
|
|
return(4);
|
|
}
|
|
|
|
static int op_sbcb(void) /* SBC A,B */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((B & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(B + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) B - carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_sbcc(void) /* SBC A,C */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((C & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(C + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) C - carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_sbcd(void) /* SBC A,D */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((D & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(D + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) D - carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_sbce(void) /* SBC A,E */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((E & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(E + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) E - carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_sbch(void) /* SBC A,H */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((H & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(H + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) H - carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_sbcl(void) /* SBC A,L */
|
|
{
|
|
register int i, carry;
|
|
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((L & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(L + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) L - carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_sbchl(void) /* SBC A,(HL) */
|
|
{
|
|
register int i, carry;
|
|
register BYTE P;
|
|
|
|
P = *(ram + (H << 8) + L);
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((P & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(P + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) P - carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_sbcn(void) /* SBC A,n */
|
|
{
|
|
register int i, carry;
|
|
register BYTE P;
|
|
|
|
P = *PC++;
|
|
carry = (F & C_FLAG) ? 1 : 0;
|
|
((P & 0xf) + carry > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(P + carry > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
A = i = (char) A - (char) P - carry;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_cpa(void) /* CP A */
|
|
{
|
|
F &= ~(S_FLAG | H_FLAG | P_FLAG | C_FLAG);
|
|
F |= Z_FLAG | N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_cpb(void) /* CP B */
|
|
{
|
|
register int i;
|
|
|
|
((B & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(B > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
i = (char) A - (char) B;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_cpc(void) /* CP C */
|
|
{
|
|
register int i;
|
|
|
|
((C & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(C > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
i = (char) A - (char) C;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_cpd(void) /* CP D */
|
|
{
|
|
register int i;
|
|
|
|
((D & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(D > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
i = (char) A - (char) D;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_cpe(void) /* CP E */
|
|
{
|
|
register int i;
|
|
|
|
((E & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(E > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
i = (char) A - (char) E;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_cph(void) /* CP H */
|
|
{
|
|
register int i;
|
|
|
|
((H & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(H > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
i = (char) A - (char) H;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_cplr(void) /* CP L */
|
|
{
|
|
register int i;
|
|
|
|
((L & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(L > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
i = (char) A - (char) L;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_cphl(void) /* CP (HL) */
|
|
{
|
|
register int i;
|
|
register BYTE P;
|
|
|
|
P = *(ram + (H << 8) + L);
|
|
((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
i = (char) A - (char) P;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_cpn(void) /* CP n */
|
|
{
|
|
register int i;
|
|
register BYTE P;
|
|
|
|
P = *PC++;
|
|
((P & 0xf) > (A & 0xf)) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(P > A) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
i = (char) A - (char) P;
|
|
(i < -128 || i > 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(i & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(i) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(7);
|
|
}
|
|
|
|
static int op_inca(void) /* INC A */
|
|
{
|
|
((A & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
A++;
|
|
(A == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_incb(void) /* INC B */
|
|
{
|
|
((B & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
B++;
|
|
(B == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_incc(void) /* INC C */
|
|
{
|
|
((C & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
C++;
|
|
(C == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_incd(void) /* INC D */
|
|
{
|
|
((D & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
D++;
|
|
(D == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_ince(void) /* INC E */
|
|
{
|
|
((E & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
E++;
|
|
(E == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_inch(void) /* INC H */
|
|
{
|
|
((H & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
H++;
|
|
(H == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_incl(void) /* INC L */
|
|
{
|
|
((L & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
L++;
|
|
(L == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_incihl(void) /* INC (HL) */
|
|
{
|
|
register BYTE *p;
|
|
|
|
p = ram + (H << 8) + L;
|
|
((*p & 0xf) + 1 > 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(*p)++;
|
|
(*p == 128) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F &= ~N_FLAG;
|
|
return(11);
|
|
}
|
|
|
|
static int op_deca(void) /* DEC A */
|
|
{
|
|
(((A - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
A--;
|
|
(A == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(A & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(A) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_decb(void) /* DEC B */
|
|
{
|
|
(((B - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
B--;
|
|
(B == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(B & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(B) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_decc(void) /* DEC C */
|
|
{
|
|
(((C - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
C--;
|
|
(C == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(C & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(C) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_decd(void) /* DEC D */
|
|
{
|
|
(((D - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
D--;
|
|
(D == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(D & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(D) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_dece(void) /* DEC E */
|
|
{
|
|
(((E - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
E--;
|
|
(E == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(E & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(E) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_dech(void) /* DEC H */
|
|
{
|
|
(((H - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
H--;
|
|
(H == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(H & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(H) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_decl(void) /* DEC L */
|
|
{
|
|
(((L - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
L--;
|
|
(L == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(L & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(L) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(4);
|
|
}
|
|
|
|
static int op_decihl(void) /* DEC (HL) */
|
|
{
|
|
register BYTE *p;
|
|
|
|
p = ram + (H << 8) + L;
|
|
(((*p - 1) & 0xf) == 0xf) ? (F |= H_FLAG) : (F &= ~H_FLAG);
|
|
(*p)--;
|
|
(*p == 127) ? (F |= P_FLAG) : (F &= ~P_FLAG);
|
|
(*p & 128) ? (F |= S_FLAG) : (F &= ~S_FLAG);
|
|
(*p) ? (F &= ~Z_FLAG) : (F |= Z_FLAG);
|
|
F |= N_FLAG;
|
|
return(11);
|
|
}
|
|
|
|
static int op_rlca(void) /* RLCA */
|
|
{
|
|
register int i;
|
|
|
|
i = (A & 128) ? 1 : 0;
|
|
(i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG);
|
|
A <<= 1;
|
|
A |= i;
|
|
return(4);
|
|
}
|
|
|
|
static int op_rrca(void) /* RRCA */
|
|
{
|
|
register int i;
|
|
|
|
i = A & 1;
|
|
(i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG);
|
|
A >>= 1;
|
|
if (i) A |= 128;
|
|
return(4);
|
|
}
|
|
|
|
static int op_rla(void) /* RLA */
|
|
{
|
|
register int old_c_flag;
|
|
|
|
old_c_flag = F & C_FLAG;
|
|
(A & 128) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG);
|
|
A <<= 1;
|
|
if (old_c_flag) A |= 1;
|
|
return(4);
|
|
}
|
|
|
|
static int op_rra(void) /* RRA */
|
|
{
|
|
register int i, old_c_flag;
|
|
|
|
old_c_flag = F & C_FLAG;
|
|
i = A & 1;
|
|
(i) ? (F |= C_FLAG) : (F &= ~C_FLAG);
|
|
F &= ~(H_FLAG | N_FLAG);
|
|
A >>= 1;
|
|
if (old_c_flag) A |= 128;
|
|
return(4);
|
|
}
|
|
|
|
static int op_exdehl(void) /* EX DE,HL */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = D;
|
|
D = H;
|
|
H = i;
|
|
i = E;
|
|
E = L;
|
|
L = i;
|
|
return(4);
|
|
}
|
|
|
|
static int op_exafaf(void) /* EX AF,AF' */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = A;
|
|
A = A_;
|
|
A_ = i;
|
|
i = F;
|
|
F = F_;
|
|
F_ = i;
|
|
return(4);
|
|
}
|
|
|
|
static int op_exx(void) /* EXX */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = B;
|
|
B = B_;
|
|
B_ = i;
|
|
i = C;
|
|
C = C_;
|
|
C_ = i;
|
|
i = D;
|
|
D = D_;
|
|
D_ = i;
|
|
i = E;
|
|
E = E_;
|
|
E_ = i;
|
|
i = H;
|
|
H = H_;
|
|
H_ = i;
|
|
i = L;
|
|
L = L_;
|
|
L_ = i;
|
|
return(4);
|
|
}
|
|
|
|
static int op_exsphl(void) /* EX (SP),HL */
|
|
{
|
|
register int i;
|
|
|
|
i = *STACK;
|
|
*STACK = L;
|
|
L = i;
|
|
i = *(STACK + 1);
|
|
*(STACK + 1) = H;
|
|
H = i;
|
|
return(19);
|
|
}
|
|
|
|
static int op_pushaf(void) /* PUSH AF */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = A;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = F;
|
|
return(11);
|
|
}
|
|
|
|
static int op_pushbc(void) /* PUSH BC */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = B;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = C;
|
|
return(11);
|
|
}
|
|
|
|
static int op_pushde(void) /* PUSH DE */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = D;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = E;
|
|
return(11);
|
|
}
|
|
|
|
static int op_pushhl(void) /* PUSH HL */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = H;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = L;
|
|
return(11);
|
|
}
|
|
|
|
static int op_popaf(void) /* POP AF */
|
|
{
|
|
F = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
A = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
return(10);
|
|
}
|
|
|
|
static int op_popbc(void) /* POP BC */
|
|
{
|
|
C = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
B = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
return(10);
|
|
}
|
|
|
|
static int op_popde(void) /* POP DE */
|
|
{
|
|
E = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
D = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
return(10);
|
|
}
|
|
|
|
static int op_pophl(void) /* POP HL */
|
|
{
|
|
L = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
H = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
return(10);
|
|
}
|
|
|
|
static int op_jp(void) /* JP */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = *PC++;
|
|
i += *PC << 8;
|
|
PC = ram + i;
|
|
return(10);
|
|
}
|
|
|
|
static int op_jphl(void) /* JP (HL) */
|
|
{
|
|
PC = ram + (H << 8) + L;
|
|
return(4);
|
|
}
|
|
|
|
static int op_jr(void) /* JR */
|
|
{
|
|
PC += (char) *PC + 1;
|
|
return(12);
|
|
}
|
|
|
|
static int op_djnz(void) /* DJNZ */
|
|
{
|
|
if (--B) {
|
|
PC += (char) *PC + 1;
|
|
return(13);
|
|
} else {
|
|
PC++;
|
|
return(8);
|
|
}
|
|
}
|
|
|
|
static int op_call(void) /* CALL */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + i;
|
|
return(17);
|
|
}
|
|
|
|
static int op_ret(void) /* RET */
|
|
{
|
|
register unsigned i;
|
|
|
|
i = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
i += *STACK++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
PC = ram + i;
|
|
return(10);
|
|
}
|
|
|
|
static int op_jpz(void) /* JP Z,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & Z_FLAG) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
PC = ram + i;
|
|
} else
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
|
|
static int op_jpnz(void) /* JP NZ,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & Z_FLAG)) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
PC = ram + i;
|
|
} else
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
|
|
static int op_jpc(void) /* JP C,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & C_FLAG) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
PC = ram + i;
|
|
} else
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
|
|
static int op_jpnc(void) /* JP NC,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & C_FLAG)) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
PC = ram + i;
|
|
} else
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
|
|
static int op_jppe(void) /* JP PE,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & P_FLAG) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
PC = ram + i;
|
|
} else
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
|
|
static int op_jppo(void) /* JP PO,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & P_FLAG)) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
PC = ram + i;
|
|
} else
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
|
|
static int op_jpm(void) /* JP M,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & S_FLAG) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
PC = ram + i;
|
|
} else
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
|
|
static int op_jpp(void) /* JP P,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & S_FLAG)) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
PC = ram + i;
|
|
} else
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
|
|
static int op_calz(void) /* CALL Z,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & Z_FLAG) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + i;
|
|
return(17);
|
|
} else {
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
}
|
|
|
|
static int op_calnz(void) /* CALL NZ,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & Z_FLAG)) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + i;
|
|
return(17);
|
|
} else {
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
}
|
|
|
|
static int op_calc(void) /* CALL C,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & C_FLAG) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + i;
|
|
return(17);
|
|
} else {
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
}
|
|
|
|
static int op_calnc(void) /* CALL NC,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & C_FLAG)) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + i;
|
|
return(17);
|
|
} else {
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
}
|
|
|
|
static int op_calpe(void) /* CALL PE,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & P_FLAG) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + i;
|
|
return(17);
|
|
} else {
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
}
|
|
|
|
static int op_calpo(void) /* CALL PO,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & P_FLAG)) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + i;
|
|
return(17);
|
|
} else {
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
}
|
|
|
|
static int op_calm(void) /* CALL M,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & S_FLAG) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + i;
|
|
return(17);
|
|
} else {
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
}
|
|
|
|
static int op_calp(void) /* CALL P,nn */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & S_FLAG)) {
|
|
i = *PC++;
|
|
i += *PC++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + i;
|
|
return(17);
|
|
} else {
|
|
PC += 2;
|
|
return(10);
|
|
}
|
|
}
|
|
|
|
static int op_retz(void) /* RET Z */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & Z_FLAG) {
|
|
i = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
i += *STACK++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
PC = ram + i;
|
|
return(11);
|
|
} else {
|
|
return(5);
|
|
}
|
|
}
|
|
|
|
static int op_retnz(void) /* RET NZ */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & Z_FLAG)) {
|
|
i = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
i += *STACK++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
PC = ram + i;
|
|
return(11);
|
|
} else {
|
|
return(5);
|
|
}
|
|
}
|
|
|
|
static int op_retc(void) /* RET C */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & C_FLAG) {
|
|
i = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
i += *STACK++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
PC = ram + i;
|
|
return(11);
|
|
} else {
|
|
return(5);
|
|
}
|
|
}
|
|
|
|
static int op_retnc(void) /* RET NC */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & C_FLAG)) {
|
|
i = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
i += *STACK++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
PC = ram + i;
|
|
return(11);
|
|
} else {
|
|
return(5);
|
|
}
|
|
}
|
|
|
|
static int op_retpe(void) /* RET PE */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & P_FLAG) {
|
|
i = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
i += *STACK++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
PC = ram + i;
|
|
return(11);
|
|
} else {
|
|
return(5);
|
|
}
|
|
}
|
|
|
|
static int op_retpo(void) /* RET PO */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & P_FLAG)) {
|
|
i = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
i += *STACK++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
PC = ram + i;
|
|
return(11);
|
|
} else {
|
|
return(5);
|
|
}
|
|
}
|
|
|
|
static int op_retm(void) /* RET M */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (F & S_FLAG) {
|
|
i = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
i += *STACK++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
PC = ram + i;
|
|
return(11);
|
|
} else {
|
|
return(5);
|
|
}
|
|
}
|
|
|
|
static int op_retp(void) /* RET P */
|
|
{
|
|
register unsigned i;
|
|
|
|
if (!(F & S_FLAG)) {
|
|
i = *STACK++;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
i += *STACK++ << 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK >= ram + 65536L)
|
|
STACK = ram;
|
|
#endif
|
|
PC = ram + i;
|
|
return(11);
|
|
} else {
|
|
return(5);
|
|
}
|
|
}
|
|
|
|
static int op_jrz(void) /* JR Z,n */
|
|
{
|
|
if (F & Z_FLAG) {
|
|
PC += (char) *PC + 1;
|
|
return(12);
|
|
} else {
|
|
PC++;
|
|
return(7);
|
|
}
|
|
}
|
|
|
|
static int op_jrnz(void) /* JR NZ,n */
|
|
{
|
|
if (!(F & Z_FLAG)) {
|
|
PC += (char) *PC + 1;
|
|
return(12);
|
|
} else {
|
|
PC++;
|
|
return(7);
|
|
}
|
|
}
|
|
|
|
static int op_jrc(void) /* JR C,n */
|
|
{
|
|
if (F & C_FLAG) {
|
|
PC += (char) *PC + 1;
|
|
return(12);
|
|
} else {
|
|
PC++;
|
|
return(7);
|
|
}
|
|
}
|
|
|
|
static int op_jrnc(void) /* JR NC,n */
|
|
{
|
|
if (!(F & C_FLAG)) {
|
|
PC += (char) *PC + 1;
|
|
return(12);
|
|
} else {
|
|
PC++;
|
|
return(7);
|
|
}
|
|
}
|
|
|
|
static int op_rst00(void) /* RST 00 */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram;
|
|
return(11);
|
|
}
|
|
|
|
static int op_rst08(void) /* RST 08 */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + 0x08;
|
|
return(11);
|
|
}
|
|
|
|
static int op_rst10(void) /* RST 10 */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + 0x10;
|
|
return(11);
|
|
}
|
|
|
|
static int op_rst18(void) /* RST 18 */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + 0x18;
|
|
return(11);
|
|
}
|
|
|
|
static int op_rst20(void) /* RST 20 */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + 0x20;
|
|
return(11);
|
|
}
|
|
|
|
static int op_rst28(void) /* RST 28 */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + 0x28;
|
|
return(11);
|
|
}
|
|
|
|
static int op_rst30(void) /* RST 30 */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + 0x30;
|
|
return(11);
|
|
}
|
|
|
|
static int op_rst38(void) /* RST 38 */
|
|
{
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram) >> 8;
|
|
#ifdef WANT_SPC
|
|
if (STACK <= ram)
|
|
STACK = ram + 65536L;
|
|
#endif
|
|
*--STACK = (PC - ram);
|
|
PC = ram + 0x38;
|
|
return(11);
|
|
}
|