BootLoader.ino


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
}