Fixed 8080 bug exposed by the exerciser (but still a long way from 100% passing)

This commit is contained in:
Jeff Parsons 2016-04-27 15:36:21 -07:00
commit 2a447fa6ae
8 changed files with 1974 additions and 13 deletions

View file

@ -4,8 +4,8 @@
<name pos="center">8080 Test Machine</name>
<computer id="computer" busWidth="16"/>
<cpu id="cpu8080" model="8080" cycles="2000000"/>
<rom id="romTest" addr="0x0100" size="0x0400" file="/devices/pc8080/rom/test/8080PRE.json" writable="true"/>
<ram id="ramTest" addr="0x0500" size="0xFB00"/>
<rom id="romTest" addr="0x0100" size="0x1200" file="/devices/pc8080/rom/test/8080EXER.json" writable="true"/>
<ram id="ramTest" addr="0x1300" size="0xED00"/>
<panel ref="/devices/pc8080/panel/wide.xml"/>
<debugger id="debugger" commands="s 8086"/>
<debugger id="debugger"/>
</machine>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,290 @@
{"bytes":[
195,19,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,42,6,0,249,17,246,13,14,9,205,234,13,33,
58,1,126,35,182,202,47,1,43,205,206,10,195,34,1,17,
19,14,14,9,205,234,13,195,0,0,110,1,206,1,46,2,
142,2,238,2,78,3,174,3,14,4,110,4,206,4,46,5,
142,5,238,5,78,6,174,6,14,7,110,7,206,7,46,8,
142,8,238,8,78,9,174,9,14,10,110,10,0,0,255,9,
0,0,0,165,196,199,196,38,210,80,160,234,88,102,133,198,
222,201,155,48,0,0,0,0,0,0,0,0,0,33,248,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,255,255,255,255,255,255,215,0,255,255,0,0,0,0,100,
97,100,32,60,98,44,100,44,104,44,115,112,62,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,198,
0,0,0,64,145,60,126,103,122,109,223,97,91,41,11,16,
102,178,133,56,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,97,
108,117,111,112,32,110,110,46,46,46,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,128,
0,0,0,62,197,58,87,77,76,3,1,9,227,102,166,208,
59,187,173,63,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,
0,0,0,255,255,255,255,215,0,0,0,0,0,0,0,97,
108,117,111,112,32,60,98,44,99,44,100,44,101,44,104,44,
108,44,109,44,97,62,46,46,46,46,46,46,46,36,255,39,
0,0,0,65,33,250,9,96,29,89,165,91,141,121,144,4,
142,157,41,24,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,215,255,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,
100,97,97,44,99,109,97,44,115,116,99,44,99,109,99,62,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,60,
0,0,0,223,74,216,213,152,229,43,138,176,167,27,67,68,
90,48,208,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,114,44,100,99,114,62,32,97,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,4,
0,0,0,35,214,45,67,97,122,128,129,134,90,133,30,134,
88,187,155,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,114,44,100,99,114,62,32,98,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,3,
0,0,0,151,205,171,68,201,141,227,227,204,17,164,232,2,
73,77,42,8,0,0,0,0,0,0,0,0,0,0,0,0,
0,33,248,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,120,44,100,99,120,62,32,98,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,12,
0,0,0,137,215,53,9,91,5,133,159,39,139,8,210,149,
5,96,6,1,0,0,0,0,0,0,0,0,0,0,0,0,
0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,114,44,100,99,114,62,32,99,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,20,
0,0,0,234,160,186,95,251,101,28,152,204,56,188,222,67,
92,189,3,1,0,0,0,0,0,0,0,0,0,0,0,0,
255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,114,44,100,99,114,62,32,100,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,19,
0,0,0,46,52,29,19,201,40,202,10,103,153,46,58,146,
246,84,157,8,0,0,0,0,0,0,0,0,0,0,0,33,
248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,120,44,100,99,120,62,32,100,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,28,
0,0,0,47,96,13,76,2,36,245,226,244,160,10,161,19,
50,37,89,1,0,0,0,0,0,0,0,0,0,0,0,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,114,44,100,99,114,62,32,101,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,36,
0,0,0,6,21,235,242,221,232,43,38,166,17,26,188,23,
6,24,40,1,0,0,0,0,0,0,0,0,0,0,255,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,114,44,100,99,114,62,32,104,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,35,
0,0,0,244,195,165,7,109,27,4,79,194,226,42,130,87,
224,225,195,8,0,0,0,0,0,0,0,0,0,33,248,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,120,44,100,99,120,62,32,104,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,44,
0,0,0,49,128,32,165,86,67,9,180,193,244,162,223,209,
60,162,62,1,0,0,0,0,0,0,0,0,0,255,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,114,44,100,99,114,62,32,108,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,52,
0,0,0,86,184,124,12,62,229,3,1,126,135,88,218,21,
92,55,31,1,0,0,0,255,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,114,44,100,99,114,62,32,109,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,51,
0,0,0,111,52,130,212,105,209,182,222,148,164,118,244,83,
2,91,133,8,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,33,248,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
105,110,120,44,100,99,120,62,32,115,112,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,42,
3,1,0,99,152,48,120,119,32,254,177,250,185,184,171,4,
6,21,96,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,
104,108,100,32,110,110,110,110,46,46,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,34,
3,1,0,3,208,114,119,83,127,114,63,234,100,128,225,16,
45,233,53,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,115,
104,108,100,32,110,110,110,110,46,46,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,1,
0,0,0,28,92,70,45,185,142,120,96,177,116,14,179,70,
209,204,48,48,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,
120,105,32,60,98,44,100,44,104,44,115,112,62,44,110,110,
110,110,46,46,46,46,46,46,46,46,46,46,46,36,255,10,
0,0,0,168,179,42,29,142,127,172,66,3,1,3,1,198,
177,142,239,16,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,
0,0,0,0,0,0,0,215,255,0,0,0,0,0,0,108,
100,97,120,32,60,98,44,100,62,46,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,6,
0,0,0,7,196,157,244,61,209,57,3,137,222,85,116,83,
192,9,85,56,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,109,
118,105,32,60,98,44,99,44,100,44,101,44,104,44,108,44,
109,44,97,62,44,110,110,46,46,46,46,46,46,36,255,64,
0,0,0,164,114,36,160,172,97,3,1,199,130,143,113,151,
143,142,239,63,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,
0,0,0,255,255,255,255,215,255,0,0,0,0,0,0,109,
111,118,32,60,98,99,100,101,104,108,97,62,44,60,98,99,
100,101,104,108,97,62,46,46,46,46,46,46,46,36,255,50,
3,1,0,104,253,236,244,160,68,67,181,83,6,186,205,210,
79,216,31,8,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,
0,0,0,0,0,0,0,215,255,0,0,0,0,0,0,115,
116,97,32,110,110,110,110,32,47,32,108,100,97,32,110,110,
110,110,46,46,46,46,46,46,46,46,46,46,46,36,255,7,
0,0,0,146,203,67,109,144,10,132,194,83,12,14,245,145,
235,252,64,24,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,215,0,0,0,0,0,0,0,60,
114,108,99,44,114,114,99,44,114,97,108,44,114,97,114,62,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,255,2,
0,0,0,59,12,146,181,255,108,158,149,3,1,4,1,193,
33,231,189,24,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,
0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,115,
116,97,120,32,60,98,44,100,62,46,46,46,46,46,46,46,
46,46,46,46,46,46,46,46,46,46,46,46,46,36,229,126,
35,102,111,126,50,127,13,35,229,17,20,0,25,17,222,12,
205,77,12,225,229,17,40,0,25,17,6,13,205,77,12,33,
6,13,54,1,225,229,17,77,13,1,4,0,126,18,35,19,
11,120,177,194,252,10,17,3,1,1,16,0,126,18,35,19,
11,120,177,194,12,11,17,44,0,25,235,14,9,205,234,13,
205,142,14,58,77,13,254,118,202,58,11,230,223,254,221,194,
55,11,58,78,13,254,118,196,46,13,205,141,12,196,177,12,
225,202,118,11,17,60,0,25,205,79,14,17,34,14,202,109,
11,17,41,14,14,9,205,234,13,205,181,13,17,68,14,14,
9,205,234,13,33,162,14,205,181,13,17,76,14,14,9,205,
234,13,225,35,35,201,229,62,1,50,236,11,50,16,12,33,
222,12,34,237,11,33,6,13,34,17,12,6,4,225,229,17,
77,13,205,160,11,6,16,17,3,1,205,160,11,195,35,11,
205,169,11,35,5,194,160,11,201,197,213,229,78,17,20,0,
25,126,254,0,202,202,11,6,8,15,245,62,0,220,239,11,
169,15,79,241,5,194,185,11,6,8,17,20,0,25,126,254,
0,202,229,11,6,8,15,245,62,0,220,19,12,169,15,79,
241,5,194,214,11,225,209,121,18,19,193,201,0,0,0,197,
229,42,237,11,70,33,236,11,126,79,7,119,254,1,194,8,
12,42,237,11,35,34,237,11,120,161,225,193,200,62,1,201,
0,0,0,197,229,42,17,12,70,33,16,12,126,79,7,119,
254,1,194,44,12,42,17,12,35,34,17,12,120,161,225,193,
200,62,1,201,245,197,213,229,54,0,84,93,19,11,126,18,
35,19,11,120,177,194,62,12,225,209,193,241,201,213,235,1,
40,0,205,52,12,235,6,20,14,1,22,0,94,123,161,202,
99,12,20,121,7,79,254,1,194,93,12,35,5,194,92,12,
122,230,248,15,15,15,111,38,0,122,230,7,60,71,62,128,
7,5,194,128,12,209,25,17,20,0,25,119,201,197,213,229,
33,222,12,17,20,0,235,25,235,52,126,254,0,202,172,12,
71,26,160,202,168,12,54,0,193,209,225,201,35,19,195,153,
12,197,213,229,33,6,13,17,20,0,235,25,235,126,183,202,
217,12,71,26,160,194,213,12,120,7,254,1,194,211,12,54,
0,35,19,119,175,225,209,193,201,35,19,195,189,12,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,245,197,
213,229,243,33,0,0,57,34,169,13,49,5,1,225,225,225,
209,193,241,34,151,13,42,17,1,249,42,151,13,0,0,0,
0,34,151,13,33,0,0,218,94,13,57,195,96,13,57,55,
34,167,13,42,151,13,49,167,13,245,197,213,229,229,229,42,
169,13,249,251,42,3,1,34,153,13,33,165,13,126,230,255,
119,6,16,17,153,13,33,162,14,26,19,205,102,14,5,194,
137,13,225,209,193,241,201,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,126,205,199,13,35,
5,194,171,13,201,245,197,229,6,4,126,205,199,13,35,5,
194,186,13,225,193,241,201,245,15,15,15,15,205,208,13,241,
245,197,213,229,230,15,254,10,218,221,13,198,39,198,48,95,
14,2,205,234,13,225,209,193,241,201,245,197,213,229,205,5,
0,225,209,193,241,201,56,48,56,48,32,105,110,115,116,114,
117,99,116,105,111,110,32,101,120,101,114,99,105,115,101,114,
10,13,36,84,101,115,116,115,32,99,111,109,112,108,101,116,
101,36,32,32,79,75,10,13,36,32,32,69,82,82,79,82,
32,42,42,42,42,32,99,114,99,32,101,120,112,101,99,116,
101,100,58,36,32,102,111,117,110,100,58,36,10,13,36,197,
213,229,17,162,14,6,4,26,190,194,98,14,35,19,5,194,
87,14,225,209,193,201,245,197,213,229,229,17,3,0,25,174,
111,38,0,41,41,235,33,166,14,25,235,225,1,4,0,26,
168,70,119,19,35,13,194,127,14,225,209,193,241,201,245,197,
229,33,162,14,62,255,6,4,119,35,5,194,152,14,225,193,
241,201,0,0,0,0,0,0,0,0,119,7,48,150,238,14,
97,44,153,9,81,186,7,109,196,25,112,106,244,143,233,99,
165,53,158,100,149,163,14,219,136,50,121,220,184,164,224,213,
233,30,151,210,217,136,9,182,76,43,126,177,124,189,231,184,
45,7,144,191,29,145,29,183,16,100,106,176,32,242,243,185,
113,72,132,190,65,222,26,218,212,125,109,221,228,235,244,212,
181,81,131,211,133,199,19,108,152,86,100,107,168,192,253,98,
249,122,138,101,201,236,20,1,92,79,99,6,108,217,250,15,
61,99,141,8,13,245,59,110,32,200,76,105,16,94,213,96,
65,228,162,103,113,114,60,3,228,209,75,4,212,71,210,13,
133,253,165,10,181,107,53,181,168,250,66,178,152,108,219,187,
201,214,172,188,249,64,50,216,108,227,69,223,92,117,220,214,
13,207,171,209,61,89,38,217,48,172,81,222,0,58,200,215,
81,128,191,208,97,22,33,180,244,181,86,179,196,35,207,186,
149,153,184,189,165,15,40,2,184,158,95,5,136,8,198,12,
217,178,177,11,233,36,47,111,124,135,88,104,76,17,193,97,
29,171,182,102,45,61,118,220,65,144,1,219,113,6,152,210,
32,188,239,213,16,42,113,177,133,137,6,182,181,31,159,191,
228,165,232,184,212,51,120,7,201,162,15,0,249,52,150,9,
168,142,225,14,152,24,127,106,13,187,8,109,61,45,145,100,
108,151,230,99,92,1,107,107,81,244,28,108,97,98,133,101,
48,216,242,98,0,78,108,6,149,237,27,1,165,123,130,8,
244,193,245,15,196,87,101,176,217,198,18,183,233,80,139,190,
184,234,252,185,136,124,98,221,29,223,21,218,45,73,140,211,
124,243,251,212,76,101,77,178,97,88,58,181,81,206,163,188,
0,116,212,187,48,226,74,223,165,65,61,216,149,215,164,209,
196,109,211,214,244,251,67,105,233,106,52,110,217,252,173,103,
136,70,218,96,184,208,68,4,45,115,51,3,29,229,170,10,
76,95,221,13,124,201,80,5,113,60,39,2,65,170,190,11,
16,16,201,12,32,134,87,104,181,37,32,111,133,179,185,102,
212,9,206,97,228,159,94,222,249,14,41,217,201,152,176,208,
152,34,199,215,168,180,89,179,61,23,46,180,13,129,183,189,
92,59,192,186,108,173,237,184,131,32,154,191,179,182,3,182,
226,12,116,177,210,154,234,213,71,57,157,210,119,175,4,219,
38,21,115,220,22,131,227,99,11,18,148,100,59,132,13,109,
106,62,122,106,90,168,228,14,207,11,147,9,255,157,10,0,
174,39,125,7,158,177,240,15,147,68,135,8,163,210,30,1,
242,104,105,6,194,254,247,98,87,93,128,101,103,203,25,108,
54,113,110,107,6,231,254,212,27,118,137,211,43,224,16,218,
122,90,103,221,74,204,249,185,223,111,142,190,239,249,23,183,
190,67,96,176,142,213,214,214,163,232,161,209,147,126,56,216,
194,196,79,223,242,82,209,187,103,241,166,188,87,103,63,181,
6,221,72,178,54,75,216,13,43,218,175,10,27,76,54,3,
74,246,65,4,122,96,223,96,239,195,168,103,223,85,49,110,
142,239,70,105,190,121,203,97,179,140,188,102,131,26,37,111,
210,160,82,104,226,54,204,12,119,149,187,11,71,3,34,2,
22,185,85,5,38,47,197,186,59,190,178,189,11,40,43,180,
90,146,92,179,106,4,194,215,255,167,181,208,207,49,44,217,
158,139,91,222,174,29,155,100,194,176,236,99,242,38,117,106,
163,156,2,109,147,10,156,9,6,169,235,14,54,63,114,7,
103,133,5,0,87,19,149,191,74,130,226,184,122,20,123,177,
43,174,12,182,27,56,146,210,142,155,229,213,190,13,124,220,
239,183,11,219,223,33,134,211,210,212,241,212,226,66,104,221,
179,248,31,218,131,110,129,190,22,205,246,185,38,91,111,176,
119,225,24,183,71,119,136,8,90,230,255,15,106,112,102,6,
59,202,17,1,11,92,143,101,158,255,248,98,174,105,97,107,
255,211,22,108,207,69,160,10,226,120,215,13,210,238,78,4,
131,84,57,3,179,194,167,103,38,97,208,96,22,247,73,105,
71,77,62,110,119,219,174,209,106,74,217,214,90,220,64,223,
11,102,55,216,59,240,169,188,174,83,222,187,158,197,71,178,
207,127,48,181,255,233,189,189,242,28,202,186,194,138,83,179,
147,48,36,180,163,166,186,208,54,5,205,215,6,147,84,222,
87,41,35,217,103,191,179,102,122,46,196,97,74,184,93,104,
27,2,42,111,43,148,180,11,190,55,195,12,142,161,90,5,
223,27,45,2,239,141,160,10,226,120,215,13,210,238,78,4,
131,84,57,3,179,194,167,103,38,97,208,96,22,247,73,105,
71,77,62,110,119,219,174,209,106,74,217,214,90,220,64,223,
11,102,55,216,59,240,169,188,174,83,222,187,158,197,71,178,
207,127,48,181,255,233,189,189,242,28,202,186,194,138,83,179,
147,48,36,180,163,166,186,208,54,5,205,215,6,147,84,222]
}

View file

@ -0,0 +1,291 @@
title 'Preliminary Z80 tests'
; prelim.z80 - Preliminary Z80 tests
; Copyright (C) 1994 Frank D. Cringle
;
; This program is free software; you can redistribute it and/or
; modify it under the terms of the GNU General Public License
; as published by the Free Software Foundation; either version 2
; of the License, or (at your option) any later version.
;
; This program is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with this program; if not, write to the Free Software
; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
; These tests have two goals. To start with, we assume the worst and
; successively test the instructions needed to continue testing.
; Then we try to test all instructions which cannot be handled by
; zexlax - the crc-based instruction exerciser.
; Initially errors are 'reported' by jumping to 0. This should reboot
; cp/m, so if the program terminates without any output one of the
; early tests failed. Later errors are reported by outputting an
; address via the bdos conout routine. The address can be located in
; a listing of this program.
; If the program runs to completion it displays a suitable message.
;******************************************************************************
;
; Modified by Ian Bartholomew to run a preliminary test on an 8080 CPU
;
; Assemble using M80
;
;******************************************************************************
.8080
aseg
org 100h
start: mvi a,1 ; test simple compares and z/nz jumps
cpi 2
jz 0
cpi 1
jnz 0
jmp lab0
hlt ; emergency exit
db 0ffh
lab0: call lab2 ; does a simple call work?
lab1: jmp 0 ; fail
lab2: pop h ; check return address
mov a,h
cpi high lab1
jz lab3
jmp 0
lab3: mov a,l
cpi low lab1
jz lab4
jmp 0
; test presence and uniqueness of all machine registers
; (except ir)
lab4: lxi sp,regs1
pop psw
pop b
pop d
pop h
lxi sp,regs2+8
push h
push d
push b
push psw
v defl 0
rept 8
lda regs2+v/2
v defl v+2
cpi v
jnz 0
endm
; test access to memory via (hl)
lxi h,hlval
mov a,m
cpi 0a5h
jnz 0
lxi h,hlval+1
mov a,m
cpi 03ch
jnz 0
; test unconditional return
lxi sp,stack
lxi h,reta
push h
ret
jmp 0
; test instructions needed for hex output
reta: mvi a,0ffh
ani 0fh
cpi 0fh
jnz 0
mvi a,05ah
ani 0fh
cpi 0ah
jnz 0
rrc
cpi 05h
jnz 0
rrc
cpi 82h
jnz 0
rrc
cpi 41h
jnz 0
rrc
cpi 0a0h
jnz 0
lxi h,01234h
push h
pop b
mov a,b
cpi 12h
jnz 0
mov a,c
cpi 34h
jnz 0
; from now on we can report errors by displaying an address
; test conditional call, ret, jp, jr
tcond macro flag,pcond,ncond,rel
lxi h,&flag
push h
pop psw
c&pcond lab1&pcond
jmp error
lab1&pcond: pop h
lxi h,0d7h xor &flag
push h
pop psw
c&ncond lab2&pcond
jmp error
lab2&pcond: pop h
lxi h,lab3&pcond
push h
lxi h,&flag
push h
pop psw
r&pcond
call error
lab3&pcond: lxi h,lab4&pcond
push h
lxi h,0d7h xor &flag
push h
pop psw
r&ncond
call error
lab4&pcond: lxi h,&flag
push h
pop psw
j&pcond lab5&pcond
call error
lab5&pcond: lxi h,0d7h xor &flag
push h
pop psw
j&ncond lab6&pcond
call error
lab6&pcond:
endm
tcond 1,c,nc,1
tcond 4,pe,po,0
tcond 040h,z,nz,1
tcond 080h,m,p,0
; test indirect jumps
lxi h,lab7
pchl
call error
; djnz (and (partially) inc a, inc hl)
lab7: mvi a,0a5h
mvi b,4
lab8: rrc
dcr b
jnz lab8
cpi 05ah
cnz error
mvi b,16
lab9: inr a
dcr b
jnz lab9
cpi 06ah
cnz error
mvi b,0
lxi h,0
lab10: inx h
dcr b
jnz lab10
mov a,h
cpi 1
cnz error
mov a,l
cpi 0
cnz error
allok: lxi d,okmsg
mvi c,9
call 5
jmp 0
okmsg: db '8080 Preliminary tests complete$'
; display address at top of stack and exit
error: pop b
mvi h,high hextab
mov a,b
rrc
rrc
rrc
rrc
ani 15
mov l,a
mov a,m
call conout
mov a,b
ani 15
mov l,a
mov a,m
call conout
mov a,c
rrc
rrc
rrc
rrc
ani 15
mov l,a
mov a,m
call conout
mov a,c
ani 15
mov l,a
mov a,m
call conout
mvi a,13
call conout
mvi a,10
call conout
jmp 0
conout: push psw
push b
push d
push h
mvi c,2
mov e,a
call 5
pop h
pop d
pop b
pop psw
ret
v defl 0
regs1: rept 8
v defl v+2
db v
endm
regs2: ds 8,0
hlval: db 0a5h,03ch
; skip to next page boundary
org (($+255)/256)*256
hextab: db '0123456789abcdef'
ds 240
stack equ $
end start


View file

@ -628,7 +628,7 @@ CPUDef.opSTC = function()
CPUDef.opDADSP = function()
{
var w;
this.setSP(w = this.getHL() + this.getSP());
this.setHL(w = this.getHL() + this.getSP());
this.resultZeroCarry = (this.resultZeroCarry & 0xff) | ((w >> 8) & 0x100);
this.nStepCycles -= 10;
};

View file

@ -3707,6 +3707,7 @@ if (DEBUGGER) {
sMsg = "halting";
this.stopCPU();
} else {
if (this.isBusy(true)) return;
sMsg = "already halted";
}
if (!fQuiet) this.println(sMsg);

View file

@ -115,7 +115,29 @@ function ROM(parmsROM)
Component.subclass(ROM);
ROM.CPM_VECTORS = [0x0000, 0x0005];
ROM.CPM = {
BIOS: {
VECTOR: 0x0000
},
BDOS: {
VECTOR: 0x0005,
FUNC: { // function number (specified in regC)
RESET: 0x00,
CON_READ: 0x01, // output: A = L = ASCII character
CON_WRITE: 0x02, // input: E = ASCII character
AUX_READ: 0x03, // output: A = L = ASCII character
AUX_WRITE: 0x04, // input: E = ASCII character
PRN_WRITE: 0x05, // input: E = ASCII character
MEM_SIZE: 0x06, // output: base address of CCP (Console Command Processor), but which register? (perhaps moot if this was CP/M 1.3 only...)
CON_IO: 0x06, // input: E = ASCII character (or 0xFF to return ASCII character in A)
GET_IOBYTE: 0x07,
SET_IOBYTE: 0x08,
STR_WRITE: 0x09 // input: DE = address of string
}
}
};
ROM.CPM.VECTORS = [ROM.CPM.BIOS.VECTOR, ROM.CPM.BDOS.VECTOR];
/*
* NOTE: There's currently no need for this component to have a reset() function, since
@ -344,12 +366,14 @@ ROM.prototype.addROM = function(addr)
* (namely, 0x0000, which is the CP/M reset vector, and 0x0005, which is the CP/M system call vector) and
* then telling the CPU to call us whenever a HLT occurs, so we can check PC for one of these addresses.
*/
for (i = 0; i < ROM.CPM_VECTORS.length; i++) {
this.bus.setByteDirect(ROM.CPM_VECTORS[i], CPUDef.OPCODE.HLT);
for (i = 0; i < ROM.CPM.VECTORS.length; i++) {
this.bus.setByteDirect(ROM.CPM.VECTORS[i], CPUDef.OPCODE.HLT);
}
this.cpu.addHaltCheck(function(rom) {
return function(addr) {rom.checkCPMVector(addr)};
return function(addr) {
return rom.checkCPMVector(addr)
};
}(this));
this.cpu.setReset(addr);
@ -371,18 +395,88 @@ ROM.prototype.addROM = function(addr)
*/
ROM.prototype.checkCPMVector = function(addr)
{
var i = ROM.CPM_VECTORS.indexOf(addr);
var i = ROM.CPM.VECTORS.indexOf(addr);
if (i >= 0) {
if (this.dbg) {
this.println("CP/M vector " + str.toHexWord(addr));
this.cpu.setPC(addr); // this is purely for the Debugger's benefit, to show the HLT
this.dbg.stopCPU();
var fCPM = false;
var cpu = this.cpu;
var dbg = this.dbg;
if (addr == ROM.CPM.BDOS.VECTOR) {
fCPM = true;
switch(cpu.regC) {
case ROM.CPM.BDOS.FUNC.CON_WRITE:
this.writeCPMString(this.getCPMChar(cpu.regE));
break;
case ROM.CPM.BDOS.FUNC.STR_WRITE:
this.writeCPMString(this.getCPMString(cpu.getDE(), '$'));
break;
default:
fCPM = false;
break;
}
}
if (fCPM) {
CPUDef.opRET.call(cpu); // for recognized calls, automatically return
}
else if (dbg) {
this.println("\nCP/M vector " + str.toHexWord(addr));
cpu.setPC(addr); // this is purely for the Debugger's benefit, to show the HLT
dbg.stopCPU();
}
return true;
}
return false;
};
/**
* getCPMChar(ch)
*
* @this {ROM}
* @param {number} ch
* @return {string}
*/
ROM.prototype.getCPMChar = function(ch)
{
return String.fromCharCode(ch);
};
/**
* getCPMString(addr, chEnd)
*
* @this {ROM}
* @param {number} addr (of a string)
* @param {string|number} [chEnd] (terminating character, default is 0)
* @return {string}
*/
ROM.prototype.getCPMString = function(addr, chEnd)
{
var s = "";
var cchMax = 255;
var bEnd = chEnd && chEnd.length && chEnd.charCodeAt(0) || chEnd || 0;
while (cchMax--) {
var b = this.cpu.getByte(addr++);
if (b == bEnd) break;
s += String.fromCharCode(b);
}
return s;
};
/**
* writeCPMString(s)
*
* @this {ROM}
* @param {string} s
*/
ROM.prototype.writeCPMString = function(s)
{
s = s.replace(/\r/g, '');
if (this.controlPrint) {
this.controlPrint.value += s;
this.controlPrint.scrollTop = this.controlPrint.scrollHeight;
}
this.log(s);
};
/**
* cloneROM(addr)
*

View file

@ -6663,6 +6663,7 @@ if (DEBUGGER) {
sMsg = "halting";
this.stopCPU();
} else {
if (this.isBusy(true)) return;
sMsg = "already halted";
}
if (!fQuiet) this.println(sMsg);