1 | #include "test.h"
|
2 | #include <SPI.h>
|
3 | // RAM Datalines
|
4 | int d0 = A0;
|
5 | int d1 = A1;
|
6 | int d2 = A2;
|
7 | int d3 = A3;
|
8 | int d4 = A4;
|
9 | int d5 = A5;
|
10 | int d6 = 6;
|
11 | int d7 = 7;
|
12 |
|
13 | // RAM Control
|
14 | int cs_ram = 4;
|
15 | int we_ram = 3;
|
16 | int oe_ram = 2;
|
17 |
|
18 | // RAM Addresslines
|
19 | int miso = 11;
|
20 | int mosi = 12;
|
21 | int sck = 13;
|
22 | int oe_sr = 10;
|
23 | int ce1_sr = 8;
|
24 | int ce2_sr = 9;
|
25 |
|
26 | // MPU Control
|
27 | int reset = 5;
|
28 |
|
29 |
|
30 |
|
31 | void vSetReset(bool active)
|
32 | {
|
33 | digitalWrite(reset, !active);
|
34 | }
|
35 |
|
36 | void vSetChipSelectRam(bool select)
|
37 | {
|
38 | digitalWrite(cs_ram, !select);
|
39 | }
|
40 |
|
41 | void vSetWriteRam(bool active)
|
42 | {
|
43 | digitalWrite(we_ram, !active);
|
44 | }
|
45 |
|
46 | void vSetReadRam(bool active)
|
47 | {
|
48 | digitalWrite(oe_ram, !active);
|
49 | }
|
50 |
|
51 | void vSetChipSelectSr1(bool select)
|
52 | {
|
53 | digitalWrite(ce1_sr, select);
|
54 | }
|
55 |
|
56 | void vSetChipSelectSr2(bool select)
|
57 | {
|
58 | digitalWrite(ce2_sr, select);
|
59 | }
|
60 |
|
61 | void vSetOutputEnableSr(bool active)
|
62 | {
|
63 | digitalWrite(oe_sr, !active);
|
64 | }
|
65 |
|
66 | void vWriteLowerAddress(byte lowAddress)
|
67 | {
|
68 | vSetChipSelectSr1(true);
|
69 | SPI.transfer(lowAddress);
|
70 | vSetChipSelectSr1(false);
|
71 | }
|
72 |
|
73 | void vWriteHighAddress(byte highAddress)
|
74 | {
|
75 | vSetChipSelectSr2(true);
|
76 | SPI.transfer(highAddress);
|
77 | vSetChipSelectSr2(false);
|
78 | }
|
79 |
|
80 | void vWriteAddress(uint16_t addr)
|
81 | {
|
82 | vWriteLowerAddress((byte)(addr & 0xff));
|
83 | vWriteHighAddress((byte)((addr >> 8) & 0xff));
|
84 | }
|
85 |
|
86 | void writeToAddress(uint16_t addr, byte data)
|
87 | {
|
88 | vSetChipSelectRam(false);
|
89 | vSetWriteRam(false);
|
90 | vSetReadRam(false);
|
91 | vSetOutputEnableSr(false);
|
92 |
|
93 | vWriteAddress(addr);
|
94 |
|
95 | pinMode(d0, OUTPUT);
|
96 | pinMode(d1, OUTPUT);
|
97 | pinMode(d2, OUTPUT);
|
98 | pinMode(d3, OUTPUT);
|
99 | pinMode(d4, OUTPUT);
|
100 | pinMode(d5, OUTPUT);
|
101 | pinMode(d6, OUTPUT);
|
102 | pinMode(d7, OUTPUT);
|
103 |
|
104 | digitalWrite(d0, (data >> 0) & 0x1);
|
105 | digitalWrite(d1, (data >> 1) & 0x1);
|
106 | digitalWrite(d2, (data >> 2) & 0x1);
|
107 | digitalWrite(d3, (data >> 3) & 0x1);
|
108 | digitalWrite(d4, (data >> 4) & 0x1);
|
109 | digitalWrite(d5, (data >> 5) & 0x1);
|
110 | digitalWrite(d6, (data >> 6) & 0x1);
|
111 | digitalWrite(d7, (data >> 7) & 0x1);
|
112 |
|
113 | vSetOutputEnableSr(true);
|
114 | vSetChipSelectRam(true);
|
115 | vSetWriteRam(true);
|
116 | //delay(100);
|
117 | vSetWriteRam(false);
|
118 | vSetChipSelectRam(false);
|
119 | vSetOutputEnableSr(false);
|
120 | }
|
121 |
|
122 | void readFromAddress(uint16_t addr, byte *data)
|
123 | {
|
124 | vSetChipSelectRam(false);
|
125 | vSetWriteRam(false);
|
126 | vSetReadRam(false);
|
127 | vSetOutputEnableSr(false);
|
128 |
|
129 | vWriteAddress(addr);
|
130 |
|
131 | pinMode(d0, INPUT);
|
132 | pinMode(d1, INPUT);
|
133 | pinMode(d2, INPUT);
|
134 | pinMode(d3, INPUT);
|
135 | pinMode(d4, INPUT);
|
136 | pinMode(d5, INPUT);
|
137 | pinMode(d6, INPUT);
|
138 | pinMode(d7, INPUT);
|
139 |
|
140 | vSetOutputEnableSr(true);
|
141 | vSetChipSelectRam(true);
|
142 | vSetReadRam(true);
|
143 | //delay(100);
|
144 |
|
145 | *data = 0;
|
146 | *data |= ((byte)digitalRead(d0) << 0);
|
147 | *data |= ((byte)digitalRead(d1) << 1);
|
148 | *data |= ((byte)digitalRead(d2) << 2);
|
149 | *data |= ((byte)digitalRead(d3) << 3);
|
150 | *data |= ((byte)digitalRead(d4) << 4);
|
151 | *data |= ((byte)digitalRead(d5) << 5);
|
152 | *data |= ((byte)digitalRead(d6) << 6);
|
153 | *data |= ((byte)digitalRead(d7) << 7);
|
154 |
|
155 | vSetReadRam(false);
|
156 | vSetChipSelectRam(false);
|
157 | vSetOutputEnableSr(false);
|
158 | }
|
159 |
|
160 | void setup() {
|
161 | // MPU Control
|
162 | pinMode(reset, OUTPUT);
|
163 |
|
164 | // RAM Control
|
165 | pinMode(cs_ram, OUTPUT);
|
166 | pinMode(we_ram, OUTPUT);
|
167 | pinMode(oe_ram, OUTPUT);
|
168 |
|
169 | // RAM Addresslines
|
170 | pinMode(oe_sr, OUTPUT);
|
171 | pinMode(ce1_sr, OUTPUT);
|
172 | pinMode(ce2_sr, OUTPUT);
|
173 |
|
174 | SPI.begin();
|
175 | SPI.setClockDivider(SPI_CLOCK_DIV2);
|
176 | SPI.setDataMode(SPI_MODE0);
|
177 |
|
178 | vSetReset(true);
|
179 | vSetChipSelectRam(false);
|
180 | vSetWriteRam(false);
|
181 | vSetReadRam(false);
|
182 | vSetChipSelectSr1(false);
|
183 | vSetChipSelectSr2(false);
|
184 | vSetOutputEnableSr(false);
|
185 | Serial.begin(9600);
|
186 | }
|
187 |
|
188 | void loop() {
|
189 | byte data;
|
190 |
|
191 | prog_uchar *prog = program;
|
192 |
|
193 | for (uint16_t i = 0; i < programSize; i++)
|
194 | {
|
195 | writeToAddress(i, pgm_read_byte_near(prog));
|
196 | prog++;
|
197 | }
|
198 |
|
199 | prog = program;
|
200 | bool progOk = true;
|
201 | for (uint16_t i = 0; i < programSize; i++)
|
202 | {
|
203 | byte data;
|
204 | readFromAddress(i, &data);
|
205 | if (data != pgm_read_byte_near(prog))
|
206 | {
|
207 | progOk = false;
|
208 | break;
|
209 | }
|
210 | prog++;
|
211 | }
|
212 |
|
213 | if (progOk)
|
214 | Serial.println("Memory Ok start Z80 Booting ...");
|
215 | else
|
216 | Serial.println("Memory not Ok. Freeze System");
|
217 |
|
218 | pinMode(cs_ram, INPUT);
|
219 | pinMode(we_ram, INPUT);
|
220 | pinMode(oe_ram, INPUT);
|
221 |
|
222 | pinMode(d0, INPUT);
|
223 | pinMode(d1, INPUT);
|
224 | pinMode(d2, INPUT);
|
225 | pinMode(d3, INPUT);
|
226 | pinMode(d4, INPUT);
|
227 | pinMode(d5, INPUT);
|
228 | pinMode(d6, INPUT);
|
229 | pinMode(d7, INPUT);
|
230 |
|
231 | if (!progOk)
|
232 | while (1) ;
|
233 |
|
234 | vSetReset(false);
|
235 |
|
236 | while(1) ;
|
237 | }
|