8 #define set_HL(x) do {unsigned int macro = (x); c.L = macro&0xFF; c.H = macro>>8;} while(0)
9 #define set_BC(x) do {unsigned int macro = (x); c.C = macro&0xFF; c.B = macro>>8;} while(0)
10 #define set_DE(x) do {unsigned int macro = (x); c.E = macro&0xFF; c.D = macro>>8;} while(0)
11 #define set_AF(x) do {unsigned int macro = (x); c.F = macro&0xFF; c.A = macro>>8;} while(0)
13 #define get_AF() ((c.A<<8) | c.F)
14 #define get_BC() ((c.B<<8) | c.C)
15 #define get_DE() ((c.D<<8) | c.E)
16 #define get_HL() ((c.H<<8) | c.L)
19 #define set_Z(x) c.F = ((c.F&0x7F) | ((x)<<7))
20 #define set_N(x) c.F = ((c.F&0xBF) | ((x)<<6))
21 #define set_H(x) c.F = ((c.F&0xDF) | ((x)<<5))
22 #define set_C(x) c.F = ((c.F&0xEF) | ((x)<<4))
24 #define flag_Z !!((c.F & 0x80))
25 #define flag_N !!((c.F & 0x40))
26 #define flag_H !!((c.F & 0x20))
27 #define flag_C !!((c.F & 0x10))
33 set_H((x & 0xF) == 0); \
41 set_H((x & 0xF) == 0xF); \
49 x = mem_get_byte(c.PC); \
78 set_C((c.A - x) < 0); \
79 set_H(((c.A - x)&0xF) > (c.A&0xF)); \
85 set_C((c.A - x) < 0); \
86 set_H(((c.A - x)&0xF) > (c.A&0xF)); \
111 static int is_debugged;
131 static unsigned short get_word_ticked(
unsigned short i)
135 word = mem_get_byte(i);
138 word |= (mem_get_byte(i+1)<<8);
145 static void write_word_ticked(
unsigned short d,
unsigned short i)
147 mem_write_byte(d+1, i >> 8);
150 mem_write_byte(d, i & 0xFF);
155 static void RLC(
unsigned char reg)
157 unsigned char t, old;
163 c.B = (c.B << 1) | old;
200 t = mem_get_byte(get_HL());
206 mem_write_byte(get_HL(), t);
211 c.A = (c.A<<1) | old;
221 static void RRC(
unsigned char reg)
223 unsigned char t, old;
230 c.B = c.B>>1 | old<<7;
236 c.C = c.C>>1 | old<<7;
242 c.D = c.D>>1 | old<<7;
248 c.E = c.E>>1 | old<<7;
254 c.H = c.H>>1 | old<<7;
260 c.L = c.L>>1 | old<<7;
266 t = mem_get_byte(get_HL());
272 mem_write_byte(get_HL(), t);
278 c.A = c.A>>1 | old<<7;
287 static void RL(
unsigned char reg)
296 c.B = (c.B << 1) | !!(t2);
302 c.C = (c.C << 1) | !!(t2);
308 c.D = (c.D << 1) | !!(t2);
314 c.E = (c.E << 1) | !!(t2);
320 c.H = (c.H << 1) | !!(t2);
326 c.L = (c.L << 1) | !!(t2);
332 t = mem_get_byte(get_HL());
335 t = (t << 1) | !!(t2);
338 mem_write_byte(get_HL(), t);
344 c.A = (c.A << 1) | !!(t2);
353 static void RR(
unsigned char reg)
362 c.B = (c.B >> 1) | t2<<7;
368 c.C = (c.C >> 1) | t2<<7;
374 c.D = (c.D >> 1) | t2<<7;
380 c.E = (c.E >> 1) | t2<<7;
386 c.H = (c.H >> 1) | t2<<7;
392 c.L = (c.L >> 1) | t2<<7;
398 t = mem_get_byte(get_HL());
401 t = (t >> 1) | t2<<7;
405 mem_write_byte(get_HL(), t);
410 c.A = (c.A >> 1) | (t2<<7);
418 static void SLA(
unsigned char reg)
425 set_C(!!(c.B & 0x80));
430 set_C(!!(c.C & 0x80));
435 set_C(!!(c.D & 0x80));
440 set_C(!!(c.E & 0x80));
445 set_C(!!(c.H & 0x80));
450 set_C(!!(c.L & 0x80));
457 t = mem_get_byte(get_HL());
462 mem_write_byte(get_HL(), t);
466 set_C(!!(c.A & 0x80));
476 static void SRA(
unsigned char reg)
478 unsigned char old, t;
485 c.B = c.B >> 1 | old;
491 c.C = c.C >> 1 | old;
497 c.D = c.D >> 1 | old;
503 c.E = c.E >> 1 | old;
509 c.H = c.H >> 1 | old;
515 c.L = c.L >> 1 | old;
521 t = mem_get_byte(get_HL());
527 mem_write_byte(get_HL(), t);
533 c.A = c.A >> 1 | old;
542 static void SRL(
unsigned char reg)
581 t = mem_get_byte(get_HL());
586 mem_write_byte(get_HL(), t);
600 static void SWAP(
unsigned char reg)
607 c.B = ((c.B&0xF)<<4) | ((c.B&0xF0)>>4);
611 c.C = ((c.C&0xF)<<4) | ((c.C&0xF0)>>4);
615 c.D = ((c.D&0xF)<<4) | ((c.D&0xF0)>>4);
619 c.E = ((c.E&0xF)<<4) | ((c.E&0xF0)>>4);
623 c.H = ((c.H&0xF)<<4) | ((c.H&0xF0)>>4);
627 c.L = ((c.L&0xF)<<4) | ((c.L&0xF0)>>4);
633 t = mem_get_byte(get_HL());
634 t = ((t&0xF)<<4) | ((t&0xF0)>>4);
637 mem_write_byte(get_HL(), t);
641 c.A = ((c.A&0xF)<<4) | ((c.A&0xF0)>>4);
647 static void BIT(
unsigned char bit,
unsigned char reg)
649 unsigned char t, f = 0 ;
674 t = mem_get_byte(get_HL());
687 static void RES(
unsigned char bit,
unsigned char reg)
714 t = mem_get_byte(get_HL());
718 mem_write_byte(get_HL(), t);
726 static void SET(
unsigned char bit,
unsigned char reg)
753 t = mem_get_byte(get_HL());
757 mem_write_byte(get_HL(), t);
778 static void decode_CB(
unsigned char t)
780 unsigned char reg, opcode, bit;
781 void (*f[])(
unsigned char) = {RLC, RRC, RL, RR, SLA, SRA, SWAP, SRL};
782 void (*f2[])(
unsigned char,
unsigned char) = {BIT, RES, SET};
797 f2[opcode-1](1<<bit, reg);
806 unsigned int cpu_get_cycles(
void)
811 static int halt_bug = 0;
813 void cpu_unhalt(
void)
823 unsigned int cpu_getpc(
void)
828 void cpu_interrupt_begin(
void)
833 mem_write_word(c.SP, c.PC);
837 void cpu_interrupt(
unsigned short n)
845 void cpu_print_debug(
void)
847 printf(
"PC: %04X AF: %02X%02X, BC: %02X%02X, DE: %02X%02X, HL: %02X%02X, SP: %04X, cycles: %d\n",
848 c.PC, c.A, c.F, c.B, c.C, c.D, c.E, c.H, c.L, c.SP, c.cycles);
876 if(c.PC == 0xC0BD && is_debugged)
877 {is_debugged = 0; exit(0);}
884 b = mem_get_byte(c.PC);
897 s = mem_get_word(c.PC);
905 mem_write_byte(get_BC(), c.A);
929 mem_write_word(mem_get_word(c.PC), c.SP);
934 i = get_HL() + get_BC();
937 set_H((i&0xFFF) < (get_HL()&0xFFF));
944 c.A = mem_get_byte(get_BC());
968 s = mem_get_word(c.PC);
976 mem_write_byte(get_DE(), c.A);
1000 c.PC += (
signed char)mem_get_byte(c.PC) + 1;
1004 i = get_HL() + get_DE();
1005 set_H((i&0xFFF) < (get_HL()&0xFFF));
1014 c.A = mem_get_byte(get_DE());
1040 c.PC += (
signed char)mem_get_byte(c.PC) + 1;
1048 s = mem_get_word(c.PC);
1057 mem_write_byte(i, c.A);
1083 s = (s - 0x06)&0xFF;
1089 if(flag_H || (s & 0xF) > 9)
1091 if(flag_C || s > 0x9F)
1105 c.PC += (
signed char)mem_get_byte(c.PC) + 1;
1114 set_H((i&0xFFF) < (get_HL()&0xFFF));
1124 c.A = mem_get_byte(s);
1150 c.PC += (
signed char)mem_get_byte(c.PC) + 1;
1158 c.SP = mem_get_word(c.PC);
1166 mem_write_byte(i, c.A);
1177 t = mem_get_byte(get_HL());
1181 mem_write_byte(get_HL(), t);
1184 set_H((t & 0xF) == 0);
1190 t = mem_get_byte(get_HL());
1194 mem_write_byte(get_HL(), t);
1197 set_H((t & 0xF) == 0xF);
1203 t = mem_get_byte(c.PC);
1204 mem_write_byte(get_HL(), t);
1217 c.PC += (
signed char)mem_get_byte(c.PC) + 1;
1225 i = get_HL() + c.SP;
1226 set_H((i&0x7FF) < (get_HL()&0x7FF));
1235 c.A = mem_get_byte(get_HL());
1279 c.B = mem_get_byte(get_HL());
1306 c.C = mem_get_byte(get_HL());
1333 c.D = mem_get_byte(get_HL());
1360 c.E = mem_get_byte(get_HL());
1387 c.H = mem_get_byte(get_HL());
1414 c.L = mem_get_byte(get_HL());
1423 mem_write_byte(get_HL(), c.B);
1429 mem_write_byte(get_HL(), c.C);
1435 mem_write_byte(get_HL(), c.D);
1441 mem_write_byte(get_HL(), c.E);
1447 mem_write_byte(get_HL(), c.H);
1453 mem_write_byte(get_HL(), c.L);
1457 if(interrupt_get_enabled())
1464 if(!interrupt_pending())
1474 mem_write_byte(get_HL(), c.A);
1498 c.A = mem_get_byte(get_HL());
1506 set_H((c.A&0xF)+(c.B&0xF) > 0xF);
1515 set_H((c.A&0xF)+(c.C&0xF) > 0xF);
1524 set_H((c.A&0xF)+(c.D&0xF) > 0xF);
1533 set_H((c.A&0xF)+(c.E&0xF) > 0xF);
1542 set_H((c.A&0xF)+(c.H&0xF) > 0xF);
1551 set_H((c.A&0xF)+(c.L&0xF) > 0xF);
1561 i = c.A + mem_get_byte(get_HL());
1562 set_H((i&0xF) < (c.A&0xF));
1571 set_H((c.A&0xF)+(c.A&0xF) > 0xF);
1579 i = c.A + c.B + flag_C >= 0x100;
1581 set_H(((c.A&0xF) + (c.B&0xF) + flag_C) >= 0x10);
1582 c.A = c.A + c.B + flag_C;
1588 i = c.A + c.C + flag_C >= 0x100;
1590 set_H(((c.A&0xF) + (c.C&0xF) + flag_C) >= 0x10);
1591 c.A = c.A + c.C + flag_C;
1597 i = c.A + c.D + flag_C >= 0x100;
1599 set_H(((c.A&0xF) + (c.D&0xF) + flag_C) >= 0x10);
1600 c.A = c.A + c.D + flag_C;
1606 i = c.A + c.E + flag_C >= 0x100;
1608 set_H(((c.A&0xF) + (c.E&0xF) + flag_C) >= 0x10);
1609 c.A = c.A + c.E + flag_C;
1615 i = c.A + c.H + flag_C >= 0x100;
1617 set_H(((c.A&0xF) + (c.H&0xF) + flag_C) >= 0x10);
1618 c.A = c.A + c.H + flag_C;
1624 i = c.A + c.L + flag_C >= 0x100;
1626 set_H(((c.A&0xF) + (c.L&0xF) + flag_C) >= 0x10);
1627 c.A = c.A + c.L + flag_C;
1635 t = mem_get_byte(get_HL());
1636 i = c.A + t + flag_C >= 0x100;
1638 set_H(((c.A&0xF) + (t&0xF) + flag_C) >= 0x10);
1639 c.A = c.A + t + flag_C;
1645 i = c.A + c.A + flag_C >= 0x100;
1647 set_H(((c.A&0xF) + (c.A&0xF) + flag_C) >= 0x10);
1648 c.A = c.A + c.A + flag_C;
1674 t = mem_get_byte(get_HL());
1675 set_C((c.A - t) < 0);
1676 set_H(((c.A - t)&0xF) > (c.A&0xF));
1687 set_H(((c.A&0xF) - (c.B&0xF) - flag_C) < 0);
1688 set_C((c.A - c.B - flag_C) < 0);
1696 set_H(((c.A&0xF) - (c.C&0xF) - flag_C) < 0);
1697 set_C((c.A - c.C - flag_C) < 0);
1705 set_H(((c.A&0xF) - (c.D&0xF) - flag_C) < 0);
1706 set_C((c.A - c.D - flag_C) < 0);
1714 set_H(((c.A&0xF) - (c.E&0xF) - flag_C) < 0);
1715 set_C((c.A - c.E - flag_C) < 0);
1723 set_H(((c.A&0xF) - (c.H&0xF) - flag_C) < 0);
1724 set_C((c.A - c.H - flag_C) < 0);
1732 set_H(((c.A&0xF) - (c.L&0xF) - flag_C) < 0);
1733 set_C((c.A - c.L - flag_C) < 0);
1742 t = mem_get_byte(get_HL());
1744 set_H(((c.A&0xF) - (t&0xF) - flag_C) < 0);
1745 set_C((c.A - t - flag_C) < 0);
1753 set_H(((c.A&0xF) - (c.A&0xF) - flag_C) < 0);
1754 set_C((c.A - c.A - flag_C) < 0);
1781 c.A &= mem_get_byte(get_HL());
1812 c.A ^= mem_get_byte(get_HL());
1840 c.A |= mem_get_byte(get_HL());
1868 t = mem_get_byte(get_HL());
1870 set_H(((c.A - t)&0xF) > (c.A&0xF));
1872 set_C((c.A - t) < 0);
1883 c.PC = get_word_ticked(c.SP);
1893 s = get_word_ticked(c.SP);
1902 c.PC = get_word_ticked(c.PC);
1912 c.PC = get_word_ticked(c.PC);
1920 i = get_word_ticked(c.PC);
1924 write_word_ticked(c.SP, c.PC+2);
1935 write_word_ticked(c.SP, get_BC());
1938 t = mem_get_byte(c.PC);
1939 set_C((c.A + t) >= 0x100);
1940 set_H(((c.A + t)&0xF) < (c.A&0xF));
1951 write_word_ticked(c.SP, c.PC);
1959 c.PC = get_word_ticked(c.SP);
1969 c.PC = get_word_ticked(c.SP);
1978 c.PC = get_word_ticked(c.PC);
1986 decode_CB(mem_get_byte(c.PC));
1994 i = get_word_ticked(c.PC);
1998 write_word_ticked(c.SP, c.PC+2);
2009 i = get_word_ticked(c.PC);
2015 write_word_ticked(c.SP, c.PC+2);
2019 t = mem_get_byte(c.PC);
2020 i = c.A + t + flag_C >= 0x100;
2022 set_H(((c.A&0xF) + (t&0xF) + flag_C) >= 0x10);
2023 c.A = c.A + t + flag_C;
2033 write_word_ticked(c.SP, c.PC);
2041 c.PC = get_word_ticked(c.SP);
2051 s = get_word_ticked(c.SP);
2060 c.PC = get_word_ticked(c.PC);
2072 i = get_word_ticked(c.PC);
2076 write_word_ticked(c.SP, c.PC+2);
2087 write_word_ticked(c.SP, get_DE());
2090 t = mem_get_byte(c.PC);
2091 set_C((c.A - t) < 0);
2092 set_H(((c.A - t)&0xF) > (c.A&0xF));
2103 write_word_ticked(c.SP, c.PC);
2111 c.PC = get_word_ticked(c.SP);
2121 c.PC = get_word_ticked(c.SP);
2131 c.PC = get_word_ticked(c.PC);
2143 i = get_word_ticked(c.PC);
2147 write_word_ticked(c.SP, c.PC+2);
2155 t = mem_get_byte(c.PC);
2157 set_H(((t&0xF) + flag_C) > (c.A&0xF));
2158 set_C(t + flag_C > c.A);
2169 write_word_ticked(c.SP, c.PC);
2173 t = mem_get_byte(c.PC);
2176 mem_write_byte(0xFF00 + t, c.A);
2183 i = get_word_ticked(c.SP);
2191 mem_write_byte(s, c.A);
2198 write_word_ticked(c.SP, get_HL());
2201 t = mem_get_byte(c.PC);
2214 write_word_ticked(c.SP, c.PC);
2220 i = mem_get_byte(c.PC);
2224 set_C(((c.SP+i)&0xFF) < (c.SP&0xFF));
2225 set_H(((c.SP+i)&0xF) < (c.SP&0xF));
2226 c.SP += (
signed char)i;
2236 s = get_word_ticked(c.PC);
2237 mem_write_byte(s, c.A);
2242 c.A ^= mem_get_byte(c.PC);
2251 write_word_ticked(c.SP, c.PC);
2255 t = mem_get_byte(c.PC);
2258 c.A = mem_get_byte(0xFF00 + t);
2265 s = get_word_ticked(c.SP);
2272 c.A = mem_get_byte(0xFF00 + c.C);
2277 interrupt_disable();
2281 mem_write_word(c.SP, get_AF());
2285 c.A |= mem_get_byte(c.PC);
2294 write_word_ticked(c.SP, c.PC);
2300 i = mem_get_byte(c.PC);
2303 set_C(((c.SP+i)&0xFF) < (c.SP&0xFF));
2304 set_H(((c.SP+i)&0xF) < (c.SP&0xF));
2305 set_HL(c.SP + (
signed char)i);
2316 s = get_word_ticked(c.PC);
2317 c.A = mem_get_byte(s);
2322 if(!interrupt_get_enabled())
2329 t = mem_get_byte(c.PC);
2332 set_H(((c.A - t)&0xF) > (c.A&0xF));
2341 write_word_ticked(c.SP, c.PC);
2345 printf(
"Unhandled opcode %02X at %04X\n", b, c.PC);
2346 printf(
"cycles: %d\n", c.cycles);
Основные определения ядра