annotate ztestgen.c @ 565:9324f721efa6

Add a separate flag/define for disabling the Z80 at compile time to ease refactoring
author Michael Pavone <pavone@retrodev.com>
date Sat, 01 Mar 2014 17:11:06 -0800
parents b7b7a1cab44a
children 33ff0171301b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 400
diff changeset
1 /*
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 400
diff changeset
2 Copyright 2013 Michael Pavone
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
3 This file is part of BlastEm.
467
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 400
diff changeset
4 BlastEm is free software distributed under the terms of the GNU General Public License version 3 or greater. See COPYING for full license text.
140af5509ce7 Added copyright notice to source files and added GPL license text in COPYING
Mike Pavone <pavone@retrodev.com>
parents: 400
diff changeset
5 */
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 #include "z80inst.h"
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 #include <stdlib.h>
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 #include <string.h>
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9 #include <stdint.h>
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
10 #include <stdio.h>
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 #include <sys/stat.h>
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 #include <sys/types.h>
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 #include <errno.h>
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
15 extern z80inst z80_tbl_a[256];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
16 extern z80inst z80_tbl_extd[0xC0-0x40];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
17 extern z80inst z80_tbl_bit[256];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
18 extern z80inst z80_tbl_ix[256];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
19 extern z80inst z80_tbl_iy[256];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
20 extern z80inst z80_tbl_ix_bit[256];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
21 extern z80inst z80_tbl_iy_bit[256];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
22 extern char *z80_mnemonics[Z80_OTDR+1];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
23 extern char * z80_regs[Z80_USE_IMMED];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
24 #define PRE_IX 0xDD
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25 #define PRE_IY 0xFD
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
26 #define LD_IR16 0x01
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
27 #define LD_IR8 0x06
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
28 #define LD_RR8 0x40
400
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
29 #define AND_R 0xA0
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
30 #define PUSH 0xC5
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
31 #define POP 0xC1
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
32
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
33 uint8_t * ld_ir16(uint8_t * dst, uint8_t reg, uint16_t val)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
34 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
35 if (reg == Z80_IX) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 *(dst++) = PRE_IX;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 return ld_ir16(dst, Z80_HL, val);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 } else if(reg == Z80_IY) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39 *(dst++) = PRE_IY;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
40 return ld_ir16(dst, Z80_HL, val);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
41 } else {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
42 *(dst++) = LD_IR16 | ((reg - Z80_BC) << 4);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
43 *(dst++) = val & 0xFF;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 *(dst++) = val >> 8;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45 return dst;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
48
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 uint8_t * ld_ir8(uint8_t * dst, uint8_t reg, uint8_t val)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 if (reg <= Z80_H) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52 reg = (reg - Z80_C) ^ 1;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 } else {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54 reg = 0x7;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
55 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
56 *(dst++) = LD_IR8 | (reg << 3);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
57 *(dst++) = val;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
58 return dst;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
59 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
60
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
61 uint8_t * ld_rr8(uint8_t * dst, uint8_t src, uint8_t dstr)
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
62 {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
63 if (src <= Z80_H) {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
64 src = (src - Z80_C) ^ 1;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
65 } else {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
66 src = 0x7;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
67 }
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
68 if (dstr <= Z80_H) {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
69 dstr = (dstr - Z80_C) ^ 1;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
70 } else {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
71 dstr = 0x7;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
72 }
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
73 *(dst++) = LD_RR8 | (dstr << 3) | src;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
74 return dst;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
75 }
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
76
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
77 uint8_t * ld_amem(uint8_t * dst, uint16_t address)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
78 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
79 *(dst++) = 0x32;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80 *(dst++) = address & 0xFF;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81 *(dst++) = address >> 8;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
82 return dst;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
83 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
84
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
85 uint8_t * ld_mema(uint8_t * dst, uint16_t address)
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
86 {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
87 *(dst++) = 0x3A;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
88 *(dst++) = address & 0xFF;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
89 *(dst++) = address >> 8;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
90 return dst;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
91 }
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
92
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
93 uint8_t * push(uint8_t * dst, uint8_t reg)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
94 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
95 if (reg == Z80_IX) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
96 *(dst++) = PRE_IX;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
97 return push(dst, Z80_HL);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
98 } else if(reg == Z80_IY) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
99 *(dst++) = PRE_IY;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
100 return push(dst, Z80_HL);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
101 } else {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
102 if (reg == Z80_AF) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
103 reg--;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
104 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
105 *(dst++) = PUSH | ((reg - Z80_BC) << 4);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
106 return dst;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
107 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
108 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
109
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
110 uint8_t * pop(uint8_t * dst, uint8_t reg)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
111 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
112 if (reg == Z80_IX) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
113 *(dst++) = PRE_IX;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
114 return pop(dst, Z80_HL);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
115 } else if(reg == Z80_IY) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
116 *(dst++) = PRE_IY;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
117 return pop(dst, Z80_HL);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
118 } else {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
119 if (reg == Z80_AF) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
120 reg--;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
121 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
122 *(dst++) = POP | ((reg - Z80_BC) << 4);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
123 return dst;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
124 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
125 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
126
400
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
127 uint8_t * and_r(uint8_t * dst, uint8_t reg)
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
128 {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
129 if (reg == Z80_IXH || reg == Z80_IXL) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
130 *(dst++) = PRE_IX;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
131 return and_r(dst, reg - (Z80_IXL - Z80_L));
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
132 } else if(reg == Z80_IYH || reg == Z80_IYL) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
133 *(dst++) = PRE_IY;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
134 return and_r(dst, reg - (Z80_IYL - Z80_L));
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
135 } else {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
136 if (reg == Z80_A) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
137 reg = 7;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
138 } else {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
139 reg = (reg - Z80_C) ^ 1;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
140 }
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
141 *(dst++) = AND_R | reg;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
142 return dst;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
143 }
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
144 }
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
145
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
146 void z80_gen_test(z80inst * inst, uint8_t *instbuf, uint8_t instlen)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
147 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
148 z80inst copy;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
149 uint16_t reg_values[Z80_UNUSED];
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
150 uint8_t reg_usage[Z80_UNUSED];
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
151 memset(reg_values, 0, sizeof(reg_values));
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
152 memset(reg_usage, 0, sizeof(reg_usage));
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
153 uint8_t addr_mode = inst->addr_mode & 0x1F;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
154 uint8_t word_sized = ((inst->reg != Z80_USE_IMMED && inst->reg != Z80_UNUSED && inst->reg >= Z80_BC) || (addr_mode == Z80_REG && inst->ea_reg >= Z80_BC)) ? 1 : 0;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
155
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
156 if (inst->reg == Z80_USE_IMMED || addr_mode == Z80_IMMED || addr_mode == Z80_IMMED_INDIRECT
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
157 || addr_mode == Z80_IX_DISPLACE || addr_mode == Z80_IY_DISPLACE)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
158 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
159 memcpy(&copy, inst, sizeof(copy));
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
160 inst = &copy;
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
161 if ((inst->reg == Z80_USE_IMMED && inst->op != Z80_BIT && inst->op != Z80_RES && inst->op != Z80_SET)
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
162 || (addr_mode == Z80_IMMED && inst->op != Z80_IM))
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
163 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
164 copy.immed = rand() % (word_sized ? 65536 : 256);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
165 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
166 if (addr_mode == Z80_IX_DISPLACE || addr_mode == Z80_IY_DISPLACE) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
167 copy.ea_reg = rand() % 256;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
168 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
169 if (addr_mode == Z80_IMMED_INDIRECT) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
170 copy.immed = 0x1000 + (rand() % 256 - 128);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
171 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
172 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
173 uint8_t is_mem = 0;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
174 uint16_t address;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
175 int16_t offset;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
176 switch(addr_mode)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
177 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
178 case Z80_REG:
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
179 reg_usage[inst->ea_reg] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
180 if (word_sized) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
181 reg_values[inst->ea_reg] = rand() % 65536;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
182 reg_values[z80_high_reg(inst->ea_reg)] = reg_values[inst->ea_reg] >> 8;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
183 reg_usage[z80_high_reg(inst->ea_reg)] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
184 reg_values[z80_low_reg(inst->ea_reg)] = reg_values[inst->ea_reg] & 0xFF;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
185 reg_usage[z80_low_reg(inst->ea_reg)] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
186 } else {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
187 reg_values[inst->ea_reg] = rand() % 256;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
188 uint8_t word_reg = z80_word_reg(inst->ea_reg);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
189 if (word_reg != Z80_UNUSED) {
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
190 reg_usage[word_reg] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
191 reg_values[word_reg] = (reg_values[z80_high_reg(word_reg)] << 8) | (reg_values[z80_low_reg(word_reg)] & 0xFF);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
192 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
193 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
194 break;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
195 case Z80_REG_INDIRECT:
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
196 is_mem = 1;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
197 reg_values[inst->ea_reg] = 0x1000 + (rand() % 256 - 128);
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
198 reg_usage[inst->ea_reg] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
199 address = reg_values[inst->ea_reg];
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
200 reg_usage[z80_high_reg(inst->ea_reg)] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
201 reg_values[z80_high_reg(inst->ea_reg)] = reg_values[inst->ea_reg] >> 8;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
202 reg_usage[z80_low_reg(inst->ea_reg)] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
203 reg_values[z80_low_reg(inst->ea_reg)] = reg_values[inst->ea_reg] & 0xFF;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
204 break;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
205 case Z80_IMMED_INDIRECT:
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
206 is_mem = 1;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
207 address = inst->immed;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
208 break;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
209 case Z80_IX_DISPLACE:
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
210 reg_values[Z80_IX] = 0x1000;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
211 reg_usage[Z80_IX] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
212 reg_values[Z80_IXH] = 0x10;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
213 reg_usage[Z80_IXH] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
214 reg_values[Z80_IXL] = 0;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
215 reg_usage[Z80_IXL] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
216 is_mem = 1;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
217 offset = inst->ea_reg;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
218 if (offset > 0x7F) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
219 offset -= 256;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
220 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
221 address = 0x1000 + offset;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
222 break;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
223 case Z80_IY_DISPLACE:
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
224 reg_values[Z80_IY] = 0x1000;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
225 reg_usage[Z80_IY] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
226 reg_values[Z80_IYH] = 0x10;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
227 reg_usage[Z80_IYH] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
228 reg_values[Z80_IYL] = 0;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
229 reg_usage[Z80_IYL] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
230 is_mem = 1;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
231 offset = inst->ea_reg;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
232 if (offset > 0x7F) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
233 offset -= 256;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
234 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
235 address = 0x1000 + offset;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
236 break;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
237 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
238 if (inst->reg != Z80_UNUSED && inst->reg != Z80_USE_IMMED) {
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
239
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
240 if (word_sized) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
241 reg_values[inst->reg] = rand() % 65536;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
242 reg_usage[z80_high_reg(inst->reg)] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
243 reg_values[z80_high_reg(inst->reg)] = reg_values[inst->reg] >> 8;
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
244 reg_usage[z80_low_reg(inst->reg)] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
245 reg_values[z80_low_reg(inst->reg)] = reg_values[inst->reg] & 0xFF;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
246 } else {
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
247 if (!reg_usage[inst->reg]) {
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
248 reg_values[inst->reg] = rand() % 255;
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
249 uint8_t word_reg = z80_word_reg(inst->reg);
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
250 if (word_reg != Z80_UNUSED) {
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
251 reg_usage[word_reg] = 1;
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
252 reg_values[word_reg] = (reg_values[z80_high_reg(word_reg)] << 8) | (reg_values[z80_low_reg(word_reg)] & 0xFF);
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
253 }
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
254 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
255 }
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
256 reg_usage[inst->reg] = 1;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
257 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
258 puts("--------------");
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
259 for (uint8_t reg = 0; reg < Z80_UNUSED; reg++) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
260 if (reg_values[reg]) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
261 printf("%s: %X\n", z80_regs[reg], reg_values[reg]);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
262 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
263 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
264 char disbuf[80];
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
265 z80_disasm(inst, disbuf, 0);
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
266 puts(disbuf);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
267 char pathbuf[128];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
268 sprintf(pathbuf, "ztests/%s", z80_mnemonics[inst->op]);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
269 if (mkdir(pathbuf, 0777) != 0) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
270 if (errno != EEXIST) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
271 fprintf(stderr, "Failed to create directory %s\n", disbuf);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
272 exit(1);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
273 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
274 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
275 uint8_t prog[200];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
276 uint8_t *cur = prog;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
277 uint8_t mem_val;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
278 //disable interrupts
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
279 *(cur++) = 0xF3;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
280 //setup SP
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
281 cur = ld_ir16(cur, Z80_SP, 0x2000);
400
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
282 for (int i = 0; i < 2; i ++) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
283 //setup memory
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
284 if (is_mem) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
285 mem_val = rand() % 256;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
286 cur = ld_ir8(cur, Z80_A, mem_val);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
287 cur = ld_amem(cur, address);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
288 }
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
289 //setup AF
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
290 cur = ld_ir16(cur, Z80_BC, reg_values[Z80_A] << 8 | (i ? 0xFF : 0));
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
291 cur = push(cur, Z80_BC);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
292 cur = pop(cur, Z80_AF);
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
293
400
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
294 //setup other regs
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
295 for (uint8_t reg = Z80_BC; reg <= Z80_IY; reg++) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
296 if (reg != Z80_AF && reg != Z80_SP) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
297 cur = ld_ir16(cur, reg, reg_values[reg]);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
298 }
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
299 }
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
300
400
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
301 //copy instruction
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
302 if (instlen == 3) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
303 memcpy(cur, instbuf, 2);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
304 cur += 2;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
305 } else {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
306 memcpy(cur, instbuf, instlen);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
307 cur += instlen;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
308 }
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
309
400
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
310 //immed/displacement byte(s)
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
311 if (addr_mode == Z80_IX_DISPLACE || addr_mode == Z80_IY_DISPLACE) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
312 *(cur++) = inst->ea_reg;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
313 } else if (addr_mode == Z80_IMMED & inst->op != Z80_IM) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
314 *(cur++) = inst->immed & 0xFF;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
315 if (word_sized) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
316 *(cur++) = inst->immed >> 8;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
317 }
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
318 } else if (addr_mode == Z80_IMMED_INDIRECT) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
319 *(cur++) = inst->immed & 0xFF;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
320 *(cur++) = inst->immed >> 8;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
321 }
400
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
322 if (inst->reg == Z80_USE_IMMED && inst->op != Z80_BIT && inst->op != Z80_RES && inst->op != Z80_SET) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
323 *(cur++) = inst->immed & 0xFF;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
324 }
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
325 if (instlen == 3) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
326 *(cur++) = instbuf[2];
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
327 }
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
328 if (!i) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
329 //Save AF from first run
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
330 cur = push(cur, Z80_AF);
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
331 if (is_mem) {
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
332 //Save memory location from frist run
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
333 cur = ld_mema(cur, address);
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
334 cur = push(cur, Z80_AF);
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
335 }
400
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
336 } else {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
337 //Pop AF from first run for final result
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
338 for (int reg = Z80_BC; reg <= Z80_IY; reg++) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
339 if (reg != Z80_AF && !reg_usage[reg]) {
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
340 cur = pop(cur, reg);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
341 cur = push(cur, Z80_AF);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
342 cur = ld_ir8(cur, Z80_A, 0xC7);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
343 cur = and_r(cur, z80_low_reg(reg));
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
344 cur = ld_rr8(cur, Z80_A, z80_low_reg(reg));
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
345 cur = pop(cur, Z80_AF);
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
346 reg_usage[reg] = 1;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
347 reg_usage[z80_low_reg(reg)] = 1;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
348 break;
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
349 }
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
350 }
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
351 if (is_mem) {
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
352 //Pop memory location from frist run
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
353 for (int reg = Z80_BC; reg <= Z80_IY; reg++) {
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
354 if (reg != Z80_AF && !reg_usage[reg]) {
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
355 cur = pop(cur, reg);
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
356 cur = push(cur, Z80_AF);
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
357 cur = ld_mema(cur, address);
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
358 cur = ld_rr8(cur, Z80_A, z80_low_reg(reg));
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
359 cur = pop(cur, Z80_AF);
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
360 reg_usage[reg] = 1;
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
361 reg_usage[z80_low_reg(reg)] = 1;
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
362 break;
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
363 }
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
364 }
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
365 }
400
a09aa6d067fd Have test generator test both flag register 0 case and flag register FF case
Mike Pavone <pavone@retrodev.com>
parents: 391
diff changeset
366 }
298
170722e80fc0 Fix handling of instructions that combine an IX/IY displacement with another prefix in test generator
Mike Pavone <pavone@retrodev.com>
parents: 296
diff changeset
367 }
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
368
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
369 for (char * cur = disbuf; *cur != 0; cur++) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
370 if (*cur == ',' || *cur == ' ') {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
371 *cur = '_';
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
372 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
373 }
391
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
374 //save memory result
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
375 if (is_mem) {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
376 if (reg_usage[Z80_A]) {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
377 cur = push(cur, Z80_AF);
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
378 }
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
379 cur = ld_mema(cur, address);
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
380 if (reg_usage[Z80_A]) {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
381 for (int reg = 0; reg < Z80_I; reg++) {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
382 if (!reg_usage[reg]) {
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
383 cur = ld_rr8(cur, Z80_A, reg);
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
384 break;
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
385 }
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
386 }
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
387 cur = pop(cur, Z80_AF);
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
388 }
3f4f2b7318a1 Check memory results in ztestgen
Mike Pavone <pavone@retrodev.com>
parents: 298
diff changeset
389 }
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
390
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
391 //halt
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
392 *(cur++) = 0x76;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
393 sprintf(pathbuf + strlen(pathbuf), "/%s.bin", disbuf);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
394 FILE * progfile = fopen(pathbuf, "wb");
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
395 fwrite(prog, 1, cur - prog, progfile);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
396 fclose(progfile);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
397 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
398
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
399
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
400 uint8_t should_skip(z80inst * inst)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
401 {
505
b7b7a1cab44a The local clone on my laptop got messed up and some changes had not been pushed. This commit represents the status of the working copy from that clone. It unfortunately contains some changes that I did not intend to commit yet, but this seems like the best option at the moment.
Michael Pavone <pavone@retrodev.com>
parents: 467
diff changeset
402 return inst->op >= Z80_JP || (inst->op >= Z80_LDI && inst->op <= Z80_CPDR) || inst->op == Z80_HALT
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
403 || inst->op == Z80_DAA || inst->op == Z80_RLD || inst->op == Z80_RRD || inst->op == Z80_NOP
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
404 || inst->op == Z80_DI || inst->op == Z80_EI;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
405 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
406
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
407 void z80_gen_all()
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
408 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
409 uint8_t inst[3];
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
410 for (int op = 0; op < 256; op++) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
411 inst[0] = op;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
412 if (op == 0xCB) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
413 for (int subop = 0; subop < 256; subop++) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
414 if (!should_skip(z80_tbl_bit + subop)) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
415 inst[1] = subop;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
416 z80_gen_test(z80_tbl_bit + subop, inst, 2);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
417 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
418 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
419 } else if(op == 0xDD) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
420 for (int ixop = 0; ixop < 256; ixop++) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
421 inst[1] = ixop;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
422 if (ixop == 0xCB) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
423 for (int subop = 0; subop < 256; subop++) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
424 if (!should_skip(z80_tbl_ix_bit + subop)) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
425 inst[2] = subop;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
426 z80_gen_test(z80_tbl_ix_bit + subop, inst, 3);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
427 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
428 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
429 } else {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
430 if (!should_skip(z80_tbl_ix + ixop)) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
431 z80_gen_test(z80_tbl_ix + ixop, inst, 2);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
432 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
433 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
434 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
435 } else if(op == 0xED) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
436 for (int subop = 0; subop < sizeof(z80_tbl_extd)/sizeof(z80inst); subop++) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
437 if (!should_skip(z80_tbl_extd + subop)) {
296
f90aeea98e53 Fix encoding of "extended" instructions in Z80 test generator
Mike Pavone <pavone@retrodev.com>
parents: 292
diff changeset
438 inst[1] = subop + 0x40;
292
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
439 z80_gen_test(z80_tbl_extd + subop, inst, 2);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
440 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
441 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
442 } else if(op == 0xFD) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
443 for (int iyop = 0; iyop < 256; iyop++) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
444 inst[1] = iyop;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
445 if (iyop == 0xCB) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
446 for (int subop = 0; subop < 256; subop++) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
447 if (!should_skip(z80_tbl_iy_bit + subop)) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
448 inst[2] = subop;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
449 z80_gen_test(z80_tbl_iy_bit + subop, inst, 3);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
450 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
451 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
452 } else {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
453 if (!should_skip(z80_tbl_iy + iyop)) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
454 z80_gen_test(z80_tbl_iy + iyop, inst, 2);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
455 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
456 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
457 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
458 } else {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
459 if (!should_skip(z80_tbl_a + op)) {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
460 z80_gen_test(z80_tbl_a + op, inst, 1);
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
461 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
462 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
463 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
464 }
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
465
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
466 int main(int argc, char ** argv)
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
467 {
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
468 z80_gen_all();
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
469 return 0;
b970ea214ecb Added z80 test generator and z80 test runner.
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
470 }