OpenCores
URL https://opencores.org/ocsvn/thor/thor/trunk

Subversion Repositories thor

[/] [thor/] [trunk/] [software/] [emuThor/] [source/] [clsSystem.cpp] - Blame information for rev 35

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 30 robfinch
#include "stdafx.h"
2
 
3 32 robfinch
extern unsigned int breakpoints[30];
4
extern unsigned __int64 ibreakpoints[10];
5
extern bool ib_active[10];
6
extern bool isRunning;
7
extern bool stepout, stepover;
8
extern unsigned int step_depth, stepover_depth;
9
extern unsigned int stepoverBkpt;
10
extern unsigned int stepover_pc;
11
extern bool animate;
12
extern bool fullspeed;
13
extern bool runstop;
14 30 robfinch
 
15
clsSystem::clsSystem() {
16
        int nn;
17
        WriteROM = false;
18
        for (nn = 0; nn < sizeof(memory); nn+=8) {
19
                memory[nn>>3] = 0;
20
        }
21 32 robfinch
        quit = false;
22 30 robfinch
        Reset();
23
};
24
void clsSystem::Reset()
25
{
26
        int nn;
27
        WriteROM = false;
28
        m_z = 88888888;
29
        m_w = 12345678;
30
        for (nn = 0; nn < 4096; nn++) {
31
                VideoMem[nn] = random();
32
                VideoMemDirty[nn] = true;
33
        }
34
        leds = 0;
35
        write_error = false;
36
        runstop = false;
37 32 robfinch
        cpu2.system1 = this;
38 30 robfinch
        refscreen = true;
39 32 robfinch
        cpu2.Reset();
40
        pic1.Reset();
41
        uart1.Reset();
42 30 robfinch
};
43
        unsigned __int64 clsSystem::Read(unsigned int ad, int sr) {
44
                __int64 rr;
45
                unsigned __int8 sc;
46
                unsigned __int8 st;
47
                if (sr) {
48
                        if (radr1 == 0)
49
                                radr1 = ad;
50
                        else if (radr2 == 0)
51
                                radr2 = ad;
52
                        else {
53
                                if (random()&1)
54
                                        radr2 = ad;
55
                                else
56
                                        radr1 = ad;
57
                        }
58
                }
59
                if (ad < 134217728) {
60
                        return memory[ad >> 3];
61
                }
62
                else if ((ad & 0xFFFF0000)==0xFFD00000) {
63
                        rr = VideoMem[(ad>>2)& 0xFFF];
64
                        rr = (rr << 32) | rr;
65
                        return rr;
66
                }
67
                else if ((ad & 0xFFFC0000)==0xFFFC0000) {
68
                        return rom[(ad&0x3FFFF)>>3];
69
                }
70
                else if (keybd.IsSelected(ad)) {
71
                        switch(ad & 0x1) {
72
                        case 0:
73
                                sc = keybd.Get();
74
                                rr = ((int)sc<<24)|((int)sc << 16)|((int)sc<<8)|sc;
75
                                rr = (rr << 32) | rr;
76
                                break;
77
                        case 1:
78
                                st = keybd.GetStatus();
79
                                rr = ((int)st<<24)|((int)st<<16)|((int)st<<8)|st;
80
                                rr = (rr << 32) | rr;
81
                                keybd_status = st;
82
                                break;
83
                        }
84
                        return rr;
85
                }
86
                else if (pic1.IsSelected(ad)) {
87
                        rr = pic1.Read(ad);
88
                        rr = (rr << 48) | (rr << 32) | (rr << 16) | rr;
89
                        return rr;
90
                }
91 32 robfinch
                else if (uart1.IsSelected(ad)) {
92
                        rr = uart1.Read(ad) & 0xFF;
93
                        rr = (rr << 56) | (rr << 48) || (rr << 40) | (rr << 32)
94
                                 | (rr << 24) | (rr << 16) | (rr << 8) | rr;
95
                        return rr;
96
                }
97 30 robfinch
                return 0;
98
        };
99
        int clsSystem::Write(unsigned int ad, unsigned __int64 dat, unsigned int mask, int cr) {
100
                int nn;
101
                int ret;
102
 
103
                if (cr && (ad!=radr1 && ad!=radr2)) {
104
                        ret = false;
105
                        goto j1;
106
                }
107
                if (cr) {
108
                        if (ad==radr1)
109
                                radr1 = 0x00000000;
110
                        if (ad==radr2)
111
                                radr2 = 0x00000000;
112
                }
113
                if (ad < 134217728) {
114 32 robfinch
                        if (ad >= 0xFFFC0000LL) {
115 30 robfinch
                                write_error = true;
116
                                ret = true;
117
                                goto j1;
118
                        }
119
                        if ((ad & 0xfffffff0)==0x00c431a0) {
120
                                ret = true;
121
                        }
122
                        switch(mask) {
123
                        case 0xFF:
124
                                memory[ad>>3] = dat;
125
                                break;
126
                        case 0x1:
127
                                memory[ad >> 3] &= 0xFFFFFFFFFFFFFF00LL;
128
                                memory[ad >> 3] |= dat & 0xFFLL;
129
                                break;
130
                        case 0x2:
131
                                memory[ad >> 3] &= 0xFFFFFFFFFFFF00FFLL;
132
                                memory[ad >> 3] |= (dat & 0xFFLL) << 8;
133
                                break;
134
                        case 0x4:
135
                                memory[ad >> 3] &= 0xFFFFFFFFFF00FFFFLL;
136
                                memory[ad >> 3] |= (dat & 0xFFLL) << 16;
137
                                break;
138
                        case 0x8:
139
                                memory[ad >> 3] &= 0xFFFFFFFF00FFFFFFLL;
140
                                memory[ad >> 3] |= (dat & 0xFFLL) << 24;
141
                                break;
142
                        case 0x10:
143
                                memory[ad >> 3] &= 0xFFFFFF00FFFFFFFFLL;
144
                                memory[ad >> 3] |= (dat & 0xFFLL) << 32;
145
                                break;
146
                        case 0x20:
147
                                memory[ad >> 3] &= 0xFFFF00FFFFFFFFFFLL;
148
                                memory[ad >> 3] |= (dat & 0xFFLL) << 40;
149
                                break;
150
                        case 0x40:
151
                                memory[ad >> 3] &= 0xFF00FFFFFFFFFFFFLL;
152
                                memory[ad >> 3] |= (dat & 0xFFLL) << 48;
153
                                break;
154
                        case 0x80:
155
                                memory[ad >> 3] &= 0x00FFFFFFFFFFFFFFLL;
156
                                memory[ad >> 3] |= (dat & 0xFFLL) << 56;
157
                                break;
158
                        case 0x3:
159
                                memory[ad >> 3] &= 0xFFFFFFFFFFFF0000;
160
                                memory[ad >> 3] |= dat & 0xFFFFLL;
161
                                break;
162
                        case 0x6:
163
                                memory[ad >> 3] &= 0xFFFFFFFFFF0000FF;
164
                                memory[ad >> 3] |= (dat & 0xFFFFLL) << 8;
165
                                break;
166
                        case 0xC:
167
                                memory[ad >> 3] &= 0xFFFFFFFF0000FFFF;
168
                                memory[ad >> 3] |= (dat & 0xFFFFLL) << 16;
169
                        case 0x18:
170
                                break;
171
                                memory[ad >> 3] &= 0xFFFFFF0000FFFFFF;
172
                                memory[ad >> 3] |= (dat & 0xFFFFLL) << 24;
173
                                break;
174
                        case 0x30:
175
                                memory[ad >> 3] &= 0xFFFF0000FFFFFFFF;
176
                                memory[ad >> 3] |= (dat & 0xFFFFLL) << 32;
177
                                break;
178
                        case 0x60:
179
                                memory[ad >> 3] &= 0xFF0000FFFFFFFFFF;
180
                                memory[ad >> 3] |= (dat & 0xFFFFLL) << 40;
181
                                break;
182
                        case 0xC0:
183
                                memory[ad >> 3] &= 0x0000FFFFFFFFFFFF;
184
                                memory[ad >> 3] |= (dat & 0xFFFFLL) << 48;
185
                                break;
186
                        case 0x0F:
187
                                memory[ad >> 3] &= 0xFFFFFFFF00000000;
188
                                memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 0;
189
                                break;
190
                        case 0x1E:
191
                                memory[ad >> 3] &= 0xFFFFFF00000000FF;
192
                                memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 8;
193
                                break;
194
                        case 0x3C:
195
                                memory[ad >> 3] &= 0xFFFF00000000FFFF;
196
                                memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 16;
197
                                break;
198
                        case 0x78:
199
                                memory[ad >> 3] &= 0xFF00000000FFFFFF;
200
                                memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 24;
201
                                break;
202
                        case 0xF0:
203
                                memory[ad >> 3] &= 0x00000000FFFFFFFF;
204
                                memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 32;
205
                                break;
206
                        case 0xE0:
207
                                memory[ad >> 3] &= 0x000000FFFFFFFFFF;
208
                                memory[ad >> 3] |= (dat & 0xFFFFFFFFLL) << 40;
209
                                break;
210
                        }
211
                }
212
                else if ((ad & 0xFFFFFF00)==0xFFDC0600) {
213
                        leds = dat;
214
                }
215
                else if ((ad & 0xFFFF0000)==0xFFD00000) {
216
                        VideoMem[(ad>>2)& 0xFFF] = dat;
217
                        VideoMemDirty[(ad>>2)&0xfff] = true;
218
                        refscreen = true;
219
                }
220 32 robfinch
                else if ((ad & 0xFFFF0000)==0xFFD10000) {
221
                        DBGVideoMem[(ad>>2)& 0xFFF] = dat;
222
                        DBGVideoMemDirty[(ad>>2)&0xfff] = true;
223
                        refscreen = true;
224
                }
225 30 robfinch
                else if ((ad & 0xFFFC0000)==0xFFFC0000 && WriteROM) {
226
                        rom[(ad&0x3FFFF)>>3] = dat;
227
                }
228
                else if (keybd.IsSelected(ad)) {
229
                        switch(ad & 1) {
230
                        case 1: keybd_status = 0; pic1.irqKeyboard = keybd.GetStatus()==0x80; break;
231
                        }
232
                }
233
                else if (pic1.IsSelected(ad)) {
234
                        pic1.Write(ad,dat,0x3);
235
                }
236 32 robfinch
                else if (uart1.IsSelected(ad)) {
237
                        uart1.Write(ad,dat,0x1);
238
                }
239 35 robfinch
                else if (sevenseg.IsSelected(ad)) {
240
                        sevenseg.Write(ad,dat);
241
                }
242 30 robfinch
                ret = true;
243
j1:
244
                for (nn = 0; nn < numDataBreakpoints; nn++) {
245
                        if (ad==dataBreakpoints[nn]) {
246
                                runstop = true;
247
                        }
248
                }
249
                return ret;
250
        };
251
        int clsSystem::random() {
252
                m_z = 36969 * (m_z & 65535) + (m_z >> 16);
253
                m_w = 18000 * (m_w & 65535) + (m_w >> 16);
254
                return (m_z << 16) + m_w;
255
        };
256
 
257
unsigned __int64 clsSystem::ReadByte(unsigned int ad) {
258
unsigned __int64 dat = Read(ad);
259
        return (dat >> ((ad & 7) * 8)) & 0xFFLL;
260
}
261 32 robfinch
unsigned __int64 clsSystem::ReadChar(unsigned int ad) {
262
unsigned __int64 dat = Read(ad);
263
        return (dat >> ((ad & 7) * 8)) & 0xFFFFLL;
264
}
265
unsigned __int64 clsSystem::ReadHalf(unsigned int ad) {
266
unsigned __int64 dat = Read(ad);
267
        return (dat >> ((ad & 7) * 8)) & 0xFFFFFFFFLL;
268
}
269
 
270
 
271
void clsSystem::Step() {
272
        uart1.Step();
273
        keybd.Step();
274
        pic1.Step();
275
        cpu2.Step();
276
}
277
 
278
void clsSystem::Run() {
279
        int nn,kk;
280
        int xx;
281
 
282
        do {
283
                if (isRunning) {
284
                //                      if (cpu2.pc > 134217727) {
285
                        if (cpu2.pc < 0xFFFC0000LL && cpu2.pc & 0x1000 != 0x1000) {
286
                                isRunning = false;
287
                                continue;
288
                        }
289
                        if (cpu2.pc == stepoverBkpt) {
290
                                stepoverBkpt = 0;
291
                                isRunning = false;
292
                                continue;
293
                        }
294
                        for (kk = 0; kk < 5; kk++) {
295
                                if (cpu2.pc == ibreakpoints[kk] && ib_active[kk]) {
296
                                        isRunning = false;
297
                                        continue;
298
                                }
299
                        }
300
                        if (system1.write_error==true) {
301
                                isRunning = false;
302
                                continue;
303
                        //                              this->lblWriteErr->Visible = true;
304
                        }
305
                        // Runstop becomes active when a data breakpoint is hit.
306
                        if (runstop) {
307
                                isRunning = false;
308
                                runstop = false;
309
                                continue;
310
                        }
311
                        cpu2.Step();
312
                        pic1.Step();
313
                        if (stepout) {
314 35 robfinch
                                if (cpu2.rts && cpu2.sub_depth < step_depth) {
315 32 robfinch
                                        isRunning = false;
316
                                        stepout = false;
317
                                        continue;
318
                                }
319
                        }
320
                        if (stepover) {
321
                                if (cpu2.pc > stepover_pc && cpu2.sub_depth==stepover_depth) {
322
                                        isRunning = false;
323
                                        stepover = false;
324
                                        continue;
325
                                }
326
                        }
327
                                        /*
328
                                if (cpu2.pc == stepoverBkpt) {
329
                                        stepoverBkpt = 0;
330
                                        cpu2.isRunning = false;
331
                                        UpdateListBox(cpu2.pc-32);
332
                                        return;
333
                                }
334
                                for (kk = 0; kk < numBreakpoints; kk++) {
335
                                        if (cpu2.pc == breakpoints[kk]) {
336
                                                cpu2.isRunning = false;
337
                                                        UpdateListBox(cpu2.pc-32);
338
                                                return;
339
                                        }
340
                                }
341
                                        cpu2.Step();
342
                                pic1.Step();
343
                                        UpdateListBox(cpu2.pc-32);
344
                                        */
345
                        //                       UpdateListBox(cpu2.pc-32);
346
                }
347
        } while (false);        // !quit
348
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.