/* * Z80SIM - a Z80-CPU simulator * * Copyright (C) 1987-92 by Udo Munk * * This module of the Z80-CPU simulator must not be modified by a user, * see license agreement! * * 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 */ #include "sim.h" #include "simglb.h" /* * 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. */ cpu() { long op_notimpl(); long op_nop(), op_halt(), op_scf(), op_ccf(), op_cpl(), op_daa(); long op_ei(), op_di(); long op_in(), op_out(); long op_ldan(), op_ldbn(), op_ldcn(), op_lddn(), op_lden(); long op_ldhn(), op_ldln(); long op_ldabc(), op_ldade(), op_ldann(); long op_ldbca(), op_lddea(), op_ldnna(); long op_ldhla(), op_ldhlb(), op_ldhlc(), op_ldhld(); long op_ldhle(), op_ldhlh(), op_ldhll(), op_ldhl1(); long op_ldaa(), op_ldab(), op_ldac(), op_ldad(), op_ldae(); long op_ldah(), op_ldal(), op_ldahl(); long op_ldba(), op_ldbb(), op_ldbc(), op_ldbd(), op_ldbe(); long op_ldbh(), op_ldbl(), op_ldbhl(); long op_ldca(), op_ldcb(), op_ldcc(), op_ldcd(), op_ldce(); long op_ldch(), op_ldcl(), op_ldchl(); long op_ldda(), op_lddb(), op_lddc(), op_lddd(), op_ldde(); long op_lddh(), op_lddl(), op_lddhl(); long op_ldea(), op_ldeb(), op_ldec(), op_lded(), op_ldee(); long op_ldeh(), op_ldel(), op_ldehl(); long op_ldha(), op_ldhb(), op_ldhc(), op_ldhd(), op_ldhe(); long op_ldhh(), op_ldhl(), op_ldhhl(); long op_ldla(), op_ldlb(), op_ldlc(), op_ldld(), op_ldle(); long op_ldlh(), op_ldll(), op_ldlhl(); long op_ldbcnn(), op_lddenn(), op_ldhlnn(), op_ldspnn(), op_ldsphl(); long op_ldhlin(), op_ldinhl(); long op_incbc(), op_incde(), op_inchl(), op_incsp(); long op_decbc(), op_decde(), op_dechl(), op_decsp(); long op_adhlbc(), op_adhlde(), op_adhlhl(), op_adhlsp(); long op_anda(), op_andb(), op_andc(), op_andd(), op_ande(); long op_andh(), op_andl(), op_andhl(), op_andn(); long op_ora(), op_orb(), op_orc(), op_ord(), op_ore(); long op_orh(), op_orl(), op_orhl(), op_orn(); long op_xora(), op_xorb(), op_xorc(), op_xord(), op_xore(); long op_xorh(), op_xorl(), op_xorhl(), op_xorn(); long op_adda(), op_addb(), op_addc(), op_addd(), op_adde(); long op_addh(), op_addl(), op_addhl(), op_addn(); long op_adca(), op_adcb(), op_adcc(), op_adcd(), op_adce(); long op_adch(), op_adcl(), op_adchl(), op_adcn(); long op_suba(), op_subb(), op_subc(), op_subd(), op_sube(); long op_subh(), op_subl(), op_subhl(), op_subn(); long op_sbca(), op_sbcb(), op_sbcc(), op_sbcd(), op_sbce(); long op_sbch(), op_sbcl(), op_sbchl(), op_sbcn(); long op_cpa(), op_cpb(), op_cpc(), op_cpd(), op_cpe(); long op_cph(), op_cplr(), op_cphl(), op_cpn(); long op_inca(), op_incb(), op_incc(), op_incd(), op_ince(); long op_inch(), op_incl(), op_incihl(); long op_deca(), op_decb(), op_decc(), op_decd(), op_dece(); long op_dech(), op_decl(), op_decihl(); long op_rlca(), op_rrca(),op_rla(),op_rra(); long op_exdehl(), op_exafaf(), op_exx(), op_exsphl(); long op_pushaf(), op_pushbc(), op_pushde(), op_pushhl(); long op_popaf(), op_popbc(), op_popde(), op_pophl(); long op_jp(), op_jphl(), op_jr(), op_djnz(), op_call(), op_ret(); long op_jpz(), op_jpnz(), op_jpc(), op_jpnc(); long op_jppe(), op_jppo(), op_jpm(), op_jpp(); long op_calz(), op_calnz(), op_calc(), op_calnc(); long op_calpe(), op_calpo(), op_calm(), op_calp(); long op_retz(), op_retnz(), op_retc(), op_retnc(); long op_retpe(), op_retpo(), op_retm(), op_retp(); long op_jrz(), op_jrnz(), op_jrc(), op_jrnc(); long op_rst00(), op_rst08(), op_rst10(), op_rst18(); long op_rst20(), op_rst28(), op_rst30(), op_rst38(); extern long op_cb_handel(), op_dd_handel(), op_ed_handel(), op_fd_handel(); static long (*op_sim[256]) () = { 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 long 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 */ break; case INT_INT: /* maskable interrupt */ break; } #endif #ifdef WANT_TIM t = (*op_sim[*PC++]) ();/* execute next opcode */ #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 measurement off */ } #endif } while (cpu_state); } /* * Trap not implemented opcodes. This function may be usefull * later to trap some wanted opcodes. */ static long op_notimpl() { cpu_error = OPTRAP1; cpu_state = STOPPED; #ifdef WANT_TIM return(0L); #endif } static long op_nop() /* NOP */ { #ifdef WANT_TIM return(4L); #endif } static long op_halt() /* HALT */ { if (break_flag) { cpu_error = OPHALT; cpu_state = STOPPED; } else while (int_type == 0) R++; #ifdef WANT_TIM return(0L); #endif } static long op_scf() /* SCF */ { F |= C_FLAG; F &= ~(N_FLAG | H_FLAG); #ifdef WANT_TIM return(4L); #endif } static long op_ccf() /* CCF */ { if (F & C_FLAG) { F |= H_FLAG; F &= ~C_FLAG; } else { F &= ~H_FLAG; F |= C_FLAG; } F &= ~N_FLAG; #ifdef WANT_TIM return(4L); #endif } static long op_cpl() /* CPL */ { A = ~A; F |= H_FLAG | N_FLAG; #ifdef WANT_TIM return(4L); #endif } static long op_daa() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_ei() /* EI */ { IFF = 2; #ifdef WANT_TIM return(4L); #endif } static long op_di() /* DI */ { IFF = 0; #ifdef WANT_TIM return(4L); #endif } static long op_in() /* IN A,(n) */ { BYTE io_in(); A = io_in(*PC++); #ifdef WANT_TIM return(11L); #endif } static long op_out() /* OUT (n),A */ { BYTE io_out(); io_out(*PC++, A); #ifdef WANT_TIM return(11L); #endif } static long op_ldan() /* LD A,n */ { A = *PC++; #ifdef WANT_TIM return(7L); #endif } static long op_ldbn() /* LD B,n */ { B = *PC++; #ifdef WANT_TIM return(7L); #endif } static long op_ldcn() /* LD C,n */ { C = *PC++; #ifdef WANT_TIM return(7L); #endif } static long op_lddn() /* LD D,n */ { D = *PC++; #ifdef WANT_TIM return(7L); #endif } static long op_lden() /* LD E,n */ { E = *PC++; #ifdef WANT_TIM return(7L); #endif } static long op_ldhn() /* LD H,n */ { H = *PC++; #ifdef WANT_TIM return(7L); #endif } static long op_ldln() /* LD L,n */ { L = *PC++; #ifdef WANT_TIM return(7L); #endif } static long op_ldabc() /* LD A,(BC) */ { A = *(ram + (B << 8) + C); #ifdef WANT_TIM return(7L); #endif } static long op_ldade() /* LD A,(DE) */ { A = *(ram + (D << 8) + E); #ifdef WANT_TIM return(7L); #endif } static long op_ldann() /* LD A,(nn) */ { register unsigned i; i = *PC++; i += *PC++ << 8; A = *(ram + i); #ifdef WANT_TIM return(13L); #endif } static long op_ldbca() /* LD (BC),A */ { *(ram + (B << 8) + C) = A; #ifdef WANT_TIM return(7L); #endif } static long op_lddea() /* LD (DE),A */ { *(ram + (D << 8) + E) = A; #ifdef WANT_TIM return(7L); #endif } static long op_ldnna() /* LD (nn),A */ { register unsigned i; i = *PC++; i += *PC++ << 8; *(ram + i) = A; #ifdef WANT_TIM return(13L); #endif } static long op_ldhla() /* LD (HL),A */ { *(ram + (H << 8) + L) = A; #ifdef WANT_TIM return(7L); #endif } static long op_ldhlb() /* LD (HL),B */ { *(ram + (H << 8) + L) = B; #ifdef WANT_TIM return(7L); #endif } static long op_ldhlc() /* LD (HL),C */ { *(ram + (H << 8) + L) = C; #ifdef WANT_TIM return(7L); #endif } static long op_ldhld() /* LD (HL),D */ { *(ram + (H << 8) + L) = D; #ifdef WANT_TIM return(7L); #endif } static long op_ldhle() /* LD (HL),E */ { *(ram + (H << 8) + L) = E; #ifdef WANT_TIM return(7L); #endif } static long op_ldhlh() /* LD (HL),H */ { *(ram + (H << 8) + L) = H; #ifdef WANT_TIM return(7L); #endif } static long op_ldhll() /* LD (HL),L */ { *(ram + (H << 8) + L) = L; #ifdef WANT_TIM return(7L); #endif } static long op_ldhl1() /* LD (HL),n */ { *(ram + (H << 8) + L) = *PC++; #ifdef WANT_TIM return(10L); #endif } static long op_ldaa() /* LD A,A */ { #ifdef WANT_TIM return(4L); #endif } static long op_ldab() /* LD A,B */ { A = B; #ifdef WANT_TIM return(4L); #endif } static long op_ldac() /* LD A,C */ { A = C; #ifdef WANT_TIM return(4L); #endif } static long op_ldad() /* LD A,D */ { A = D; #ifdef WANT_TIM return(4L); #endif } static long op_ldae() /* LD A,E */ { A = E; #ifdef WANT_TIM return(4L); #endif } static long op_ldah() /* LD A,H */ { A = H; #ifdef WANT_TIM return(4L); #endif } static long op_ldal() /* LD A,L */ { A = L; #ifdef WANT_TIM return(4L); #endif } static long op_ldahl() /* LD A,(HL) */ { A = *(ram + (H << 8) + L); #ifdef WANT_TIM return(7L); #endif } static long op_ldba() /* LD B,A */ { B = A; #ifdef WANT_TIM return(4L); #endif } static long op_ldbb() /* LD B,B */ { #ifdef WANT_TIM return(4L); #endif } static long op_ldbc() /* LD B,C */ { B = C; #ifdef WANT_TIM return(4L); #endif } static long op_ldbd() /* LD B,D */ { B = D; #ifdef WANT_TIM return(4L); #endif } static long op_ldbe() /* LD B,E */ { B = E; #ifdef WANT_TIM return(4L); #endif } static long op_ldbh() /* LD B,H */ { B = H; #ifdef WANT_TIM return(4L); #endif } static long op_ldbl() /* LD B,L */ { B = L; #ifdef WANT_TIM return(4L); #endif } static long op_ldbhl() /* LD B,(HL) */ { B = *(ram + (H << 8) + L); #ifdef WANT_TIM return(7L); #endif } static long op_ldca() /* LD C,A */ { C = A; #ifdef WANT_TIM return(4L); #endif } static long op_ldcb() /* LD C,B */ { C = B; #ifdef WANT_TIM return(4L); #endif } static long op_ldcc() /* LD C,C */ { #ifdef WANT_TIM return(4L); #endif } static long op_ldcd() /* LD C,D */ { C = D; #ifdef WANT_TIM return(4L); #endif } static long op_ldce() /* LD C,E */ { C = E; #ifdef WANT_TIM return(4L); #endif } static long op_ldch() /* LD C,H */ { C = H; #ifdef WANT_TIM return(4L); #endif } static long op_ldcl() /* LD C,L */ { C = L; #ifdef WANT_TIM return(4L); #endif } static long op_ldchl() /* LD C,(HL) */ { C = *(ram + (H << 8) + L); #ifdef WANT_TIM return(7L); #endif } static long op_ldda() /* LD D,A */ { D = A; #ifdef WANT_TIM return(4L); #endif } static long op_lddb() /* LD D,B */ { D = B; #ifdef WANT_TIM return(4L); #endif } static long op_lddc() /* LD D,C */ { D = C; #ifdef WANT_TIM return(4L); #endif } static long op_lddd() /* LD D,D */ { #ifdef WANT_TIM return(4L); #endif } static long op_ldde() /* LD D,E */ { D = E; #ifdef WANT_TIM return(4L); #endif } static long op_lddh() /* LD D,H */ { D = H; #ifdef WANT_TIM return(4L); #endif } static long op_lddl() /* LD D,L */ { D = L; #ifdef WANT_TIM return(4L); #endif } static long op_lddhl() /* LD D,(HL) */ { D = *(ram + (H << 8) + L); #ifdef WANT_TIM return(7L); #endif } static long op_ldea() /* LD E,A */ { E = A; #ifdef WANT_TIM return(4L); #endif } static long op_ldeb() /* LD E,B */ { E = B; #ifdef WANT_TIM return(4L); #endif } static long op_ldec() /* LD E,C */ { E = C; #ifdef WANT_TIM return(4L); #endif } static long op_lded() /* LD E,D */ { E = D; #ifdef WANT_TIM return(4L); #endif } static long op_ldee() /* LD E,E */ { #ifdef WANT_TIM return(4L); #endif } static long op_ldeh() /* LD E,H */ { E = H; #ifdef WANT_TIM return(4L); #endif } static long op_ldel() /* LD E,L */ { E = L; #ifdef WANT_TIM return(4L); #endif } static long op_ldehl() /* LD E,(HL) */ { E = *(ram + (H << 8) + L); #ifdef WANT_TIM return(7L); #endif } static long op_ldha() /* LD H,A */ { H = A; #ifdef WANT_TIM return(4L); #endif } static long op_ldhb() /* LD H,B */ { H = B; #ifdef WANT_TIM return(4L); #endif } static long op_ldhc() /* LD H,C */ { H = C; #ifdef WANT_TIM return(4L); #endif } static long op_ldhd() /* LD H,D */ { H = D; #ifdef WANT_TIM return(4L); #endif } static long op_ldhe() /* LD H,E */ { H = E; #ifdef WANT_TIM return(4L); #endif } static long op_ldhh() /* LD H,H */ { #ifdef WANT_TIM return(4L); #endif } static long op_ldhl() /* LD H,L */ { H = L; #ifdef WANT_TIM return(4L); #endif } static long op_ldhhl() /* LD H,(HL) */ { H = *(ram + (H << 8) + L); #ifdef WANT_TIM return(7L); #endif } static long op_ldla() /* LD L,A */ { L = A; #ifdef WANT_TIM return(4L); #endif } static long op_ldlb() /* LD L,B */ { L = B; #ifdef WANT_TIM return(4L); #endif } static long op_ldlc() /* LD L,C */ { L = C; #ifdef WANT_TIM return(4L); #endif } static long op_ldld() /* LD L,D */ { L = D; #ifdef WANT_TIM return(4L); #endif } static long op_ldle() /* LD L,E */ { L = E; #ifdef WANT_TIM return(4L); #endif } static long op_ldlh() /* LD L,H */ { L = H; #ifdef WANT_TIM return(4L); #endif } static long op_ldll() /* LD L,L */ { #ifdef WANT_TIM return(4L); #endif } static long op_ldlhl() /* LD L,(HL) */ { L = *(ram + (H << 8) + L); #ifdef WANT_TIM return(7L); #endif } static long op_ldbcnn() /* LD BC,nn */ { C = *PC++; B = *PC++; #ifdef WANT_TIM return(10L); #endif } static long op_lddenn() /* LD DE,nn */ { E = *PC++; D = *PC++; #ifdef WANT_TIM return(10L); #endif } static long op_ldhlnn() /* LD HL,nn */ { L = *PC++; H = *PC++; #ifdef WANT_TIM return(10L); #endif } static long op_ldspnn() /* LD SP,nn */ { STACK = ram + *PC++; STACK += *PC++ << 8; #ifdef WANT_TIM return(10L); #endif } static long op_ldsphl() /* LD SP,HL */ { STACK = ram + (H << 8) + L; #ifdef WANT_TIM return(6L); #endif } static long op_ldhlin() /* LD HL,(nn) */ { register unsigned i; i = *PC++; i += *PC++ << 8; L = *(ram + i); H = *(ram + i + 1); #ifdef WANT_TIM return(16L); #endif } static long op_ldinhl() /* LD (nn),HL */ { register unsigned i; i = *PC++; i += *PC++ << 8; *(ram + i) = L; *(ram + i + 1) = H; #ifdef WANT_TIM return(16L); #endif } static long op_incbc() /* INC BC */ { C++; if (!C) B++; #ifdef WANT_TIM return(6L); #endif } static long op_incde() /* INC DE */ { E++; if (!E) D++; #ifdef WANT_TIM return(6L); #endif } static long op_inchl() /* INC HL */ { L++; if (!L) H++; #ifdef WANT_TIM return(6L); #endif } static long op_incsp() /* INC SP */ { STACK++; #ifdef WANT_SPC if (STACK > ram + 65535) STACK = ram; #endif #ifdef WANT_TIM return(6L); #endif } static long op_decbc() /* DEC BC */ { C--; if (C == 0xff) B--; #ifdef WANT_TIM return(6L); #endif } static long op_decde() /* DEC DE */ { E--; if (E == 0xff) D--; #ifdef WANT_TIM return(6L); #endif } static long op_dechl() /* DEC HL */ { L--; if (L == 0xff) H--; #ifdef WANT_TIM return(6L); #endif } static long op_decsp() /* DEC SP */ { STACK--; #ifdef WANT_SPC if (STACK < ram) STACK = ram + 65535; #endif #ifdef WANT_TIM return(6L); #endif } static long op_adhlbc() /* ADD HL,BC */ { register long i; i = ((((long)H) << 8) + L + (((long)B) << 8) + C); H = i >> 8; L = i; (i > 0xffffL) ? (F |= C_FLAG) : (F &= ~C_FLAG); F &= ~N_FLAG; #ifdef WANT_TIM return(11L); #endif } static long op_adhlde() /* ADD HL,DE */ { register long i; i = ((((long)H) << 8) + L + (((long)D) << 8) + E); H = i >> 8; L = i; (i > 0xffffL) ? (F |= C_FLAG) : (F &= ~C_FLAG); F &= ~N_FLAG; #ifdef WANT_TIM return(11L); #endif } static long op_adhlhl() /* ADD HL,HL */ { register long i; i = (((((long)H) << 8) + L) << 1); H = i >> 8; L = i; (i > 0xffffL) ? (F |= C_FLAG) : (F &= ~C_FLAG); F &= ~N_FLAG; #ifdef WANT_TIM return(11L); #endif } static long op_adhlsp() /* ADD HL,SP */ { register long i; i = ((((long)H) << 8) + L + STACK - ram); H = i >> 8; L = i; (i > 0xffffL) ? (F |= C_FLAG) : (F &= ~C_FLAG); F &= ~N_FLAG; #ifdef WANT_TIM return(11L); #endif } static long op_anda() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_andb() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_andc() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_andd() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_ande() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_andh() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_andl() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_andhl() /* 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); #ifdef WANT_TIM return(7L); #endif } static long op_andn() /* 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); #ifdef WANT_TIM return(7L); #endif } static long op_ora() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_orb() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_orc() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_ord() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_ore() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_orh() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_orl() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_orhl() /* 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); #ifdef WANT_TIM return(7L); #endif } static long op_orn() /* 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); #ifdef WANT_TIM return(7L); #endif } static long op_xora() /* XOR A */ { A = 0; F &= ~(S_FLAG | H_FLAG | N_FLAG | C_FLAG); F |= Z_FLAG | P_FLAG; #ifdef WANT_TIM return(4L); #endif } static long op_xorb() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_xorc() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_xord() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_xore() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_xorh() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_xorl() /* 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); #ifdef WANT_TIM return(4L); #endif } static long op_xorhl() /* 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); #ifdef WANT_TIM return(7L); #endif } static long op_xorn() /* 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); #ifdef WANT_TIM return(7L); #endif } static long op_adda() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_addb() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_addc() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_addd() /* ADD A,D */ { 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; #ifdef WANT_TIM return(4L); #endif } static long op_adde() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_addh() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_addl() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_addhl() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_addn() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_adca() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_adcb() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_adcc() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_adcd() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_adce() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_adch() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_adcl() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_adchl() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_adcn() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_suba() /* SUB A,A */ { A = 0; F &= ~(S_FLAG | H_FLAG | P_FLAG | C_FLAG); F |= Z_FLAG | N_FLAG; #ifdef WANT_TIM return(4L); #endif } static long op_subb() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_subc() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_subd() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_sube() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_subh() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_subl() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_subhl() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_subn() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_sbca() /* 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; } #ifdef WANT_TIM return(4L); #endif } static long op_sbcb() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_sbcc() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_sbcd() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_sbce() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_sbch() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_sbcl() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_sbchl() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_sbcn() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_cpa() /* CP A */ { F &= ~(S_FLAG | H_FLAG | P_FLAG | C_FLAG); F |= Z_FLAG | N_FLAG; #ifdef WANT_TIM return(4L); #endif } static long op_cpb() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_cpc() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_cpd() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_cpe() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_cph() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_cplr() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_cphl() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_cpn() /* 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; #ifdef WANT_TIM return(7L); #endif } static long op_inca() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_incb() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_incc() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_incd() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_ince() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_inch() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_incl() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_incihl() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_deca() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_decb() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_decc() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_decd() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_dece() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_dech() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_decl() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_decihl() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_rlca() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_rrca() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_rla() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_rra() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_exdehl() /* EX DE,HL */ { register unsigned i; i = D; D = H; H = i; i = E; E = L; L = i; #ifdef WANT_TIM return(4L); #endif } static long op_exafaf() /* EX AF,AF' */ { register unsigned i; i = A; A = A_; A_ = i; i = F; F = F_; F_ = i; #ifdef WANT_TIM return(4L); #endif } static long op_exx() /* 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; #ifdef WANT_TIM return(4L); #endif } static long op_exsphl() /* EX (SP),HL */ { register int i; i = *STACK; *STACK = L; L = i; i = *(STACK + 1); *(STACK + 1) = H; H = i; #ifdef WANT_TIM return(19L); #endif } static long op_pushaf() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_pushbc() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_pushde() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_pushhl() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_popaf() /* 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 #ifdef WANT_TIM return(10L); #endif } static long op_popbc() /* 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 #ifdef WANT_TIM return(10L); #endif } static long op_popde() /* 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 #ifdef WANT_TIM return(10L); #endif } static long op_pophl() /* 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 #ifdef WANT_TIM return(10L); #endif } static long op_jp() /* JP */ { register unsigned i; i = *PC++; i += *PC << 8; PC = ram + i; #ifdef WANT_TIM return(10L); #endif } static long op_jphl() /* JP (HL) */ { PC = ram + (H << 8) + L; #ifdef WANT_TIM return(4L); #endif } static long op_jr() /* JR */ { PC += (char) *PC + 1; #ifdef WANT_TIM return(12L); #endif } static long op_djnz() /* DJNZ */ { if (--B) { PC += (char) *PC + 1; #ifdef WANT_TIM return(13L); #endif } else { PC++; #ifdef WANT_TIM return(8L); #endif } } static long op_call() /* 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; #ifdef WANT_TIM return(17L); #endif } static long op_ret() /* 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; #ifdef WANT_TIM return(10L); #endif } static long op_jpz() /* JP Z,nn */ { register unsigned i; if (F & Z_FLAG) { i = *PC++; i += *PC++ << 8; PC = ram + i; } else PC += 2; #ifdef WANT_TIM return(10L); #endif } static long op_jpnz() /* JP NZ,nn */ { register unsigned i; if (!(F & Z_FLAG)) { i = *PC++; i += *PC++ << 8; PC = ram + i; } else PC += 2; #ifdef WANT_TIM return(10L); #endif } static long op_jpc() /* JP C,nn */ { register unsigned i; if (F & C_FLAG) { i = *PC++; i += *PC++ << 8; PC = ram + i; } else PC += 2; #ifdef WANT_TIM return(10L); #endif } static long op_jpnc() /* JP NC,nn */ { register unsigned i; if (!(F & C_FLAG)) { i = *PC++; i += *PC++ << 8; PC = ram + i; } else PC += 2; #ifdef WANT_TIM return(10L); #endif } static long op_jppe() /* JP PE,nn */ { register unsigned i; if (F & P_FLAG) { i = *PC++; i += *PC++ << 8; PC = ram + i; } else PC += 2; #ifdef WANT_TIM return(10L); #endif } static long op_jppo() /* JP PO,nn */ { register unsigned i; if (!(F & P_FLAG)) { i = *PC++; i += *PC++ << 8; PC = ram + i; } else PC += 2; #ifdef WANT_TIM return(10L); #endif } static long op_jpm() /* JP M,nn */ { register unsigned i; if (F & S_FLAG) { i = *PC++; i += *PC++ << 8; PC = ram + i; } else PC += 2; #ifdef WANT_TIM return(10L); #endif } static long op_jpp() /* JP P,nn */ { register unsigned i; if (!(F & S_FLAG)) { i = *PC++; i += *PC++ << 8; PC = ram + i; } else PC += 2; #ifdef WANT_TIM return(10L); #endif } static long op_calz() /* 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; #ifdef WANT_TIM return(17L); #endif } else { PC += 2; #ifdef WANT_TIM return(10L); #endif } } static long op_calnz() /* 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; #ifdef WANT_TIM return(17L); #endif } else { PC += 2; #ifdef WANT_TIM return(10L); #endif } } static long op_calc() /* 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; #ifdef WANT_TIM return(17L); #endif } else { PC += 2; #ifdef WANT_TIM return(10L); #endif } } static long op_calnc() /* 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; #ifdef WANT_TIM return(17L); #endif } else { PC += 2; #ifdef WANT_TIM return(10L); #endif } } static long op_calpe() /* 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; #ifdef WANT_TIM return(17L); #endif } else { PC += 2; #ifdef WANT_TIM return(10L); #endif } } static long op_calpo() /* 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; #ifdef WANT_TIM return(17L); #endif } else { PC += 2; #ifdef WANT_TIM return(10L); #endif } } static long op_calm() /* 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; #ifdef WANT_TIM return(17L); #endif } else { PC += 2; #ifdef WANT_TIM return(10L); #endif } } static long op_calp() /* 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; #ifdef WANT_TIM return(17L); #endif } else { PC += 2; #ifdef WANT_TIM return(10L); #endif } } static long op_retz() /* 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; #ifdef WANT_TIM return(11L); #endif } else { #ifdef WANT_TIM return(5L); #endif } } static long op_retnz() /* 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; #ifdef WANT_TIM return(11L); #endif } else { #ifdef WANT_TIM return(5L); #endif } } static long op_retc() /* 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; #ifdef WANT_TIM return(11L); #endif } else { #ifdef WANT_TIM return(5L); #endif } } static long op_retnc() /* 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; #ifdef WANT_TIM return(11L); #endif } else { #ifdef WANT_TIM return(5L); #endif } } static long op_retpe() /* 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; #ifdef WANT_TIM return(11L); #endif } else { #ifdef WANT_TIM return(5L); #endif } } static long op_retpo() /* 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; #ifdef WANT_TIM return(11L); #endif } else { #ifdef WANT_TIM return(5L); #endif } } static long op_retm() /* 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; #ifdef WANT_TIM return(11L); #endif } else { #ifdef WANT_TIM return(5L); #endif } } static long op_retp() /* 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; #ifdef WANT_TIM return(11L); #endif } else { #ifdef WANT_TIM return(5L); #endif } } static long op_jrz() /* JR Z,n */ { if (F & Z_FLAG) { PC += (char) *PC + 1; #ifdef WANT_TIM return(12L); #endif } else { PC++; #ifdef WANT_TIM return(7L); #endif } } static long op_jrnz() /* JR NZ,n */ { if (!(F & Z_FLAG)) { PC += (char) *PC + 1; #ifdef WANT_TIM return(12L); #endif } else { PC++; #ifdef WANT_TIM return(7L); #endif } } static long op_jrc() /* JR C,n */ { if (F & C_FLAG) { PC += (char) *PC + 1; #ifdef WANT_TIM return(12L); #endif } else { PC++; #ifdef WANT_TIM return(7L); #endif } } static long op_jrnc() /* JR NC,n */ { if (!(F & C_FLAG)) { PC += (char) *PC + 1; #ifdef WANT_TIM return(12L); #endif } else { PC++; #ifdef WANT_TIM return(7L); #endif } } static long op_rst00() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_rst08() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_rst10() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_rst18() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_rst20() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_rst28() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_rst30() /* 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; #ifdef WANT_TIM return(11L); #endif } static long op_rst38() /* 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; #ifdef WANT_TIM return(11L); #endif }