|
|
1.1.1.2 root 1: //
2: // nono
3: // Copyright (C) 2020 nono project
4: // Licensed under nono-license.txt
5: //
6:
1.1.1.6 root 7: #include "bus.h"
1.1.1.8 ! root 8: #include "nono.h"
1.1 root 9: #include <stdint.h>
10: #include <vector>
11:
12: // "device.h" の IODevice をリンクしてしまうと、芋づる式に依存オブジェクトが
13: // 増えてしまい収拾つかなくなるので、ダミークラスを用意する。
14: // なので、ここの実装は本物の IODevice のそれと同期しないといけない…。
15: class IODevice
16: {
17: public:
1.1.1.7 root 18: enum : uint {
19: Capacity = 8,
20: };
21: public:
22: IODevice()
23: {
24: reg.resize(Capacity);
25: Reset();
26: }
1.1.1.3 root 27: virtual ~IODevice();
1.1 root 28:
1.1.1.7 root 29: virtual busdata Read(busaddr addr) { return 0xdf; }
30: virtual busdata Write(busaddr addr, uint32 data) { return 0; }
31: virtual busdata Peek1(uint32 addr) { return 0xff; }
32: virtual bool Poke1(uint32 addr, uint32 data) { return false; }
33:
34: void Reset() {
35: for (int i = 0; i < Capacity; i++) {
36: reg[i] = i + 0x81;
37: }
38: }
39:
40: // uint32 だがバイトレジスタとして扱う
41: std::vector<uint32> reg {};
1.1 root 42: };
1.1.1.3 root 43: IODevice::~IODevice() { }
1.1 root 44:
45: #define SELFTEST
46: #include "busio.h"
47:
48: class TestByteDev : public IODevice
49: {
50: public:
51: TestByteDev() {}
1.1.1.7 root 52: ~TestByteDev() override;
1.1 root 53:
54: static const uint32 NPORT = 4;
1.1.1.7 root 55: busdata ReadPort(uint32 offset) {
56: if ((int32)reg[offset] < 0)
57: return BusData::BusErr;
58: return reg[offset] | BusData::Size1;
59: }
60: busdata WritePort(uint32 offset, uint32 data) {
61: assert(data <= 0xff);
62: reg[offset] = data;
63: return BusData::Size1;
64: }
65: busdata PeekPort(uint32 offset) {
66: if ((int32)reg[offset] < 0)
67: return BusData::BusErr;
68: return reg[offset];
69: }
70: bool PokePort(uint32 offset, uint32 data) {
71: return false;
1.1 root 72: }
73: };
1.1.1.3 root 74: TestByteDev::~TestByteDev() { }
1.1 root 75:
76: class TestWordDev : public IODevice
77: {
78: public:
79: TestWordDev() {}
1.1.1.7 root 80: ~TestWordDev() override;
1.1 root 81:
82: static const uint32 NPORT = 4;
1.1.1.7 root 83: busdata ReadPort(uint32 offset) {
84: busdata data = PeekPort(offset);
85: data |= BusData::Size2;
86: return data;
87: }
88: busdata WritePort(uint32 offset, uint32 data) {
89: assert(data <= 0xffff);
90: reg[offset * 2 + 0] = (uint8)(data >> 8);
91: reg[offset * 2 + 1] = (uint8)(data & 0xff);
92: return BusData::Size2;
93: }
94: busdata PeekPort(uint32 offset) {
95: if ((int32)reg[offset] < 0)
96: return BusData::BusErr;
97: uint32 data;
98: data = (uint8)reg[offset * 2 + 0] << 8;
99: data |= (uint8)reg[offset * 2 + 1];
100: return data;
1.1 root 101: }
102: };
1.1.1.3 root 103: TestWordDev::~TestWordDev() { }
1.1 root 104:
1.1.1.7 root 105: class TestLongDev : public IODevice
106: {
107: public:
108: TestLongDev() {}
109: ~TestLongDev() override;
110:
111: static const uint32 NPORT = 4;
112: busdata ReadPort(uint32 offset) {
113: busdata data = PeekPort(offset);
114: data |= BusData::Size4;
115: return data;
116: }
117: busdata WritePort(uint32 offset, uint32 data) {
118: reg[offset * 4 + 0] = (uint8)(data >> 24);
119: reg[offset * 4 + 1] = (uint8)(data >> 16);
120: reg[offset * 4 + 2] = (uint8)(data >> 8);
121: reg[offset * 4 + 3] = (uint8)(data & 0xff);
122: return BusData::Size4;
123: }
124: busdata PeekPort(uint32 offset) {
125: if ((int32)reg[offset] < 0)
126: return BusData::BusErr;
127: uint32 data;
128: data = (uint8)reg[offset * 4 + 0] << 24;
129: data |= (uint8)reg[offset * 4 + 1] << 16;
130: data |= (uint8)reg[offset * 4 + 2] << 8;
131: data |= (uint8)reg[offset * 4 + 3];
132: return data;
133: }
1.1 root 134: };
1.1.1.7 root 135: TestLongDev::~TestLongDev() { }
1.1 root 136:
137: void fail(const char *fmt, ...) __printflike(1, 2);
138: void
139: fail(const char *fmt, ...)
140: {
141: va_list ap;
142:
143: printf(" FAIL: ");
144: va_start(ap, fmt);
145: vprintf(fmt, ap);
146: va_end(ap);
147: }
148:
1.1.1.7 root 149: // 入力アドレス(busaddr)と期待値(busdata)を列挙しやすいよう分解したもの。
150: struct TestItemR
151: {
152: busaddr addr; // 入力アドレス
153: busdata exp; // 期待値
154: };
155:
156: struct TestItemW
1.1 root 157: {
1.1.1.7 root 158: busaddr addr; // 入力アドレス
159: uint32 data; // 入力データ
160: busdata expres; // 応答の期待値
161: const char *expmem; // 書き込み後のレジスタの期待値
162:
163: // memexp は表記を圧縮するため、
164: // 0x81, 0x82, ... 0x88 を '1', '2', .. '8'、
165: // 0xfa, 0xfb, 0xfc, 0xfd を 'A', 'B', 'C', 'D'、
166: // 0x00 を '0'
167: // と置き換えた 8文字の文字列で表現する。
168: };
169:
170: struct TestData
171: {
172: const char *name;
173: std::vector<TestItemR> table_read; // Read テスト用データ
174: std::vector<TestItemW> table_write; // Write テスト用データ
175: };
176:
177: static void
178: do_test(IODevice *dev, const TestData& testdata)
179: {
180: int failcount = 0;
181:
182: printf("%s", testdata.name);
183: fflush(stdout);
184:
185: // Read
186: for (const auto& item : testdata.table_read) {
187: busaddr addr = item.addr;
188: busdata exp = item.exp;
189:
190: busdata act = dev->Read(addr);
191: if (act.Get() != exp.Get()) {
192: if (failcount == 0) {
193: printf("\n");
194: }
195: fail("%s::Read($%08x'%08x) expects $%08x'%08x but $%08x'%08x\n",
196: testdata.name, addr.GetH(), addr.GetL(),
197: exp.GetH(), exp.GetL(), act.GetH(), act.GetL());
198: failcount++;
199: } else if (0) {
200: printf(" Read($%08x'%08x) -> $%08x'%08x\n",
201: addr.GetH(), addr.GetL(), act.GetH(), act.GetL());
202: }
203: }
1.1 root 204:
1.1.1.7 root 205: // Write
206: for (const auto& item : testdata.table_write) {
207: busaddr addr = item.addr;
208: uint32 srcdata = item.data;
209: busdata exp = item.expres;
210: const char *expmem_str = item.expmem;
211: int memlen = std::min((int)strlen(expmem_str), (int)dev->Capacity);
212: std::vector<uint32> expmem(memlen);
213:
214: // expmem_str から expmem[] を作成。
215: for (int i = 0; i < memlen; i++) {
216: uint8 ch = expmem_str[i];
217: if (ch == '0') {
218: expmem[i] = 0;
219: } else if ('1' <= ch && ch <= '9') {
220: expmem[i] = 0x80 + (ch - '0');
221: } else if ('A' <= ch && ch <= 'D') {
222: expmem[i] = 0xfa + (ch - 'A');
223: } else {
224: errx(1, "invalid char\n");
225: }
226: }
227:
228: // 実行
229: dev->Reset();
230: busdata act = dev->Write(addr, srcdata);
231:
232: // 応答を照合
233: if (act.Get() != exp.Get()) {
234: if (failcount == 0) {
235: printf("\n");
236: }
237: fail("%s::Write($%08x'%08x, $%08x) "
238: "expects $%08x'%08x but $%08x'%08x\n",
239: testdata.name, addr.GetH(), addr.GetL(), srcdata,
240: exp.GetH(), exp.GetL(), act.GetH(), act.GetL());
241: failcount++;
242: }
243:
244: // 書き込み結果を照合
245: bool ok = true;
246: for (int i = 0; i < memlen; i++) {
247: if (dev->reg[i] != expmem[i]) {
248: ok = false;
249: break;
250: }
251: }
252: if (!ok) {
253: if (failcount == 0) {
254: printf("\n");
255: }
256: fail("%s::Write($%08x'%08x, $%08x) expects "
257: "mem=$%02x%02x'%02x%02x'%02x%02x'%02x%02x but "
258: "mem=$%02x%02x'%02x%02x'%02x%02x'%02x%02x\n",
259: testdata.name, addr.GetH(), addr.GetL(), srcdata,
260: expmem[0], expmem[1], expmem[2], expmem[3],
261: expmem[4], expmem[5], expmem[6], expmem[7],
262: dev->reg[0], dev->reg[1], dev->reg[2], dev->reg[3],
263: dev->reg[4], dev->reg[5], dev->reg[6], dev->reg[7]);
264: failcount++;
1.1 root 265: }
266: }
267:
1.1.1.7 root 268: if (failcount == 0) {
269: printf(" .. OK\n");
270: }
1.1 root 271: }
272:
1.1.1.7 root 273: #define Size1 1U
274: #define Size2 2U
275: #define Size3 3U
276: #define Size4 4U
277: #define BA(addr_, size_) (busaddr(addr_) | busaddr::Size(size_))
278: #define BD(data_, size_) (busdata(data_) | busdata::Size(size_))
279:
280: #define BusErr (BusData::BusErr)
281:
282: // 書き込みパターン (addr::Size と揃えること)
283: #define W1 (0xfa)
284: #define W2 (0xfafb)
285: #define W3 (0xfafbfc)
286: #define W4 (0xfafbfcfd)
287:
288: static TestData
289: table_B = {
290: .name = "BusIO_B",
291: .table_read = {
292: { BA(0, Size1), BD(0x00000081, Size1) },
293: { BA(1, Size1), BD(0x00000082, Size1) },
294: { BA(2, Size1), BD(0x00000083, Size1) },
295: { BA(3, Size1), BD(0x00000084, Size1) },
296:
297: { BA(0, Size2), BD(0x00000081, Size1) },
298: { BA(1, Size2), BD(0x00000082, Size1) },
299: { BA(2, Size2), BD(0x00000083, Size1) },
300: { BA(3, Size2), BD(0x00000084, Size1) },
301:
302: { BA(0, Size3), BD(0x00000081, Size1) },
303: { BA(1, Size3), BD(0x00000082, Size1) },
304: { BA(2, Size3), BD(0x00000083, Size1) },
305: { BA(3, Size3), BD(0x00000084, Size1) },
306:
307: { BA(0, Size4), BD(0x00000081, Size1) },
308: { BA(1, Size4), BD(0x00000082, Size1) },
309: { BA(2, Size4), BD(0x00000083, Size1) },
310: { BA(3, Size4), BD(0x00000084, Size1) },
311: },
312: .table_write = {
313: { BA(0, Size1), W1, BD(0, Size1), "A2345678" },
314: { BA(1, Size1), W1, BD(0, Size1), "1A345678" },
315: { BA(2, Size1), W1, BD(0, Size1), "12A45678" },
316: { BA(3, Size1), W1, BD(0, Size1), "123A5678" },
317:
318: { BA(0, Size2), W2, BD(0, Size1), "A2345678" },
319: { BA(1, Size2), W2, BD(0, Size1), "1A345678" },
320: { BA(2, Size2), W2, BD(0, Size1), "12A45678" },
321: { BA(3, Size2), W2, BD(0, Size1), "123A5678" },
322:
323: { BA(0, Size3), W3, BD(0, Size1), "A2345678" },
324: { BA(1, Size3), W3, BD(0, Size1), "1A345678" },
325: { BA(2, Size3), W3, BD(0, Size1), "12A45678" },
326: { BA(3, Size3), W3, BD(0, Size1), "123A5678" },
327:
328: { BA(0, Size4), W4, BD(0, Size1), "A2345678" },
329: { BA(1, Size4), W4, BD(0, Size1), "1A345678" },
330: { BA(2, Size4), W4, BD(0, Size1), "12A45678" },
331: { BA(3, Size4), W4, BD(0, Size1), "123A5678" },
332: },
333: };
334:
335: static TestData
336: table_BB = {
337: .name = "BusIO_BB",
338: .table_read = {
339: { BA(0, Size1), BD(0x00000081, Size1) },
340: { BA(1, Size1), BD(0x00000081, Size1) },
341: { BA(2, Size1), BD(0x00000082, Size1) },
342: { BA(3, Size1), BD(0x00000082, Size1) },
343:
344: { BA(0, Size2), BD(0x00000081, Size1) },
345: { BA(1, Size2), BD(0x00000081, Size1) },
346: { BA(2, Size2), BD(0x00000082, Size1) },
347: { BA(3, Size2), BD(0x00000082, Size1) },
348:
349: { BA(0, Size3), BD(0x00000081, Size1) },
350: { BA(1, Size3), BD(0x00000081, Size1) },
351: { BA(2, Size3), BD(0x00000082, Size1) },
352: { BA(3, Size3), BD(0x00000082, Size1) },
353:
354: { BA(0, Size4), BD(0x00000081, Size1) },
355: { BA(1, Size4), BD(0x00000081, Size1) },
356: { BA(2, Size4), BD(0x00000082, Size1) },
357: { BA(3, Size4), BD(0x00000082, Size1) },
358: },
359: .table_write = {
360: { BA(0, Size1), W1, BD(0, Size1), "A2345678" },
361: { BA(1, Size1), W1, BD(0, Size1), "A2345678" },
362: { BA(2, Size1), W1, BD(0, Size1), "1A345678" },
363: { BA(3, Size1), W1, BD(0, Size1), "1A345678" },
364:
365: { BA(0, Size2), W2, BD(0, Size1), "A2345678" },
366: { BA(1, Size2), W2, BD(0, Size1), "A2345678" },
367: { BA(2, Size2), W2, BD(0, Size1), "1A345678" },
368: { BA(3, Size2), W2, BD(0, Size1), "1A345678" },
369:
370: { BA(0, Size3), W3, BD(0, Size1), "A2345678" },
371: { BA(1, Size3), W3, BD(0, Size1), "A2345678" },
372: { BA(2, Size3), W3, BD(0, Size1), "1A345678" },
373: { BA(3, Size3), W3, BD(0, Size1), "1A345678" },
374:
375: { BA(0, Size4), W4, BD(0, Size1), "A2345678" },
376: { BA(1, Size4), W4, BD(0, Size1), "A2345678" },
377: { BA(2, Size4), W4, BD(0, Size1), "1A345678" },
378: { BA(3, Size4), W4, BD(0, Size1), "1A345678" },
379: },
380: };
381:
382: static TestData
383: table_BBBB = {
384: .name = "BusIO_BBBB",
385: .table_read = {
386: { BA(0, Size1), BD(0x00000081, Size1) },
387: { BA(1, Size1), BD(0x00000081, Size1) },
388: { BA(2, Size1), BD(0x00000081, Size1) },
389: { BA(3, Size1), BD(0x00000081, Size1) },
390: { BA(4, Size1), BD(0x00000082, Size1) },
391: { BA(5, Size1), BD(0x00000082, Size1) },
392: { BA(6, Size1), BD(0x00000082, Size1) },
393: { BA(7, Size1), BD(0x00000082, Size1) },
394:
395: { BA(0, Size2), BD(0x00000081, Size1) },
396: { BA(1, Size2), BD(0x00000081, Size1) },
397: { BA(2, Size2), BD(0x00000081, Size1) },
398: { BA(3, Size2), BD(0x00000081, Size1) },
399: { BA(4, Size2), BD(0x00000082, Size1) },
400: { BA(5, Size2), BD(0x00000082, Size1) },
401: { BA(6, Size2), BD(0x00000082, Size1) },
402: { BA(7, Size2), BD(0x00000082, Size1) },
403:
404: { BA(0, Size3), BD(0x00000081, Size1) },
405: { BA(1, Size3), BD(0x00000081, Size1) },
406: { BA(2, Size3), BD(0x00000081, Size1) },
407: { BA(3, Size3), BD(0x00000081, Size1) },
408: { BA(4, Size3), BD(0x00000082, Size1) },
409: { BA(5, Size3), BD(0x00000082, Size1) },
410: { BA(6, Size3), BD(0x00000082, Size1) },
411: { BA(7, Size3), BD(0x00000082, Size1) },
412:
413: { BA(0, Size4), BD(0x00000081, Size1) },
414: { BA(1, Size4), BD(0x00000081, Size1) },
415: { BA(2, Size4), BD(0x00000081, Size1) },
416: { BA(3, Size4), BD(0x00000081, Size1) },
417: { BA(4, Size4), BD(0x00000082, Size1) },
418: { BA(5, Size4), BD(0x00000082, Size1) },
419: { BA(6, Size4), BD(0x00000082, Size1) },
420: { BA(7, Size4), BD(0x00000082, Size1) },
421: },
422: .table_write = {
423: { BA(0, Size1), W1, BD(0, Size1), "A2345678" },
424: { BA(1, Size1), W1, BD(0, Size1), "A2345678" },
425: { BA(2, Size1), W1, BD(0, Size1), "A2345678" },
426: { BA(3, Size1), W1, BD(0, Size1), "A2345678" },
427: { BA(4, Size1), W1, BD(0, Size1), "1A345678" },
428: { BA(5, Size1), W1, BD(0, Size1), "1A345678" },
429: { BA(6, Size1), W1, BD(0, Size1), "1A345678" },
430: { BA(7, Size1), W1, BD(0, Size1), "1A345678" },
431:
432: { BA(0, Size2), W2, BD(0, Size1), "A2345678" },
433: { BA(1, Size2), W2, BD(0, Size1), "A2345678" },
434: { BA(2, Size2), W2, BD(0, Size1), "A2345678" },
435: { BA(3, Size2), W2, BD(0, Size1), "A2345678" },
436: { BA(4, Size2), W2, BD(0, Size1), "1A345678" },
437: { BA(5, Size2), W2, BD(0, Size1), "1A345678" },
438: { BA(6, Size2), W2, BD(0, Size1), "1A345678" },
439: { BA(7, Size2), W2, BD(0, Size1), "1A345678" },
440:
441: { BA(0, Size3), W3, BD(0, Size1), "A2345678" },
442: { BA(1, Size3), W3, BD(0, Size1), "A2345678" },
443: { BA(2, Size3), W3, BD(0, Size1), "A2345678" },
444: { BA(3, Size3), W3, BD(0, Size1), "A2345678" },
445: { BA(4, Size3), W3, BD(0, Size1), "1A345678" },
446: { BA(5, Size3), W3, BD(0, Size1), "1A345678" },
447: { BA(6, Size3), W3, BD(0, Size1), "1A345678" },
448: { BA(7, Size3), W3, BD(0, Size1), "1A345678" },
449:
450: { BA(0, Size4), W4, BD(0, Size1), "A2345678" },
451: { BA(1, Size4), W4, BD(0, Size1), "A2345678" },
452: { BA(2, Size4), W4, BD(0, Size1), "A2345678" },
453: { BA(3, Size4), W4, BD(0, Size1), "A2345678" },
454: { BA(4, Size4), W4, BD(0, Size1), "1A345678" },
455: { BA(5, Size4), W4, BD(0, Size1), "1A345678" },
456: { BA(6, Size4), W4, BD(0, Size1), "1A345678" },
457: { BA(7, Size4), W4, BD(0, Size1), "1A345678" },
458: },
459: };
460:
461: static TestData
462: table_BFFF = {
463: .name = "BusIO_BFFF",
464: .table_read = {
465: { BA(0, Size1), BD(0x81ffffff, Size4) },
466: { BA(1, Size1), BD(0x81ffffff, Size4) },
467: { BA(2, Size1), BD(0x81ffffff, Size4) },
468: { BA(3, Size1), BD(0x81ffffff, Size4) },
469: { BA(4, Size1), BD(0x82ffffff, Size4) },
470: { BA(5, Size1), BD(0x82ffffff, Size4) },
471: { BA(6, Size1), BD(0x82ffffff, Size4) },
472: { BA(7, Size1), BD(0x82ffffff, Size4) },
473:
474: { BA(0, Size2), BD(0x81ffffff, Size4) },
475: { BA(1, Size2), BD(0x81ffffff, Size4) },
476: { BA(2, Size2), BD(0x81ffffff, Size4) },
477: { BA(3, Size2), BD(0x81ffffff, Size4) },
478: { BA(4, Size2), BD(0x82ffffff, Size4) },
479: { BA(5, Size2), BD(0x82ffffff, Size4) },
480: { BA(6, Size2), BD(0x82ffffff, Size4) },
481: { BA(7, Size2), BD(0x82ffffff, Size4) },
482:
483: { BA(0, Size3), BD(0x81ffffff, Size4) },
484: { BA(1, Size3), BD(0x81ffffff, Size4) },
485: { BA(2, Size3), BD(0x81ffffff, Size4) },
486: { BA(3, Size3), BD(0x81ffffff, Size4) },
487: { BA(4, Size3), BD(0x82ffffff, Size4) },
488: { BA(5, Size3), BD(0x82ffffff, Size4) },
489: { BA(6, Size3), BD(0x82ffffff, Size4) },
490: { BA(7, Size3), BD(0x82ffffff, Size4) },
491:
492: { BA(0, Size4), BD(0x81ffffff, Size4) },
493: { BA(1, Size4), BD(0x81ffffff, Size4) },
494: { BA(2, Size4), BD(0x81ffffff, Size4) },
495: { BA(3, Size4), BD(0x81ffffff, Size4) },
496: { BA(4, Size4), BD(0x82ffffff, Size4) },
497: { BA(5, Size4), BD(0x82ffffff, Size4) },
498: { BA(6, Size4), BD(0x82ffffff, Size4) },
499: { BA(7, Size4), BD(0x82ffffff, Size4) },
500: },
501: .table_write = {
502: { BA(0, Size1), W1, BD(0, Size4), "A2345678" },
503: { BA(1, Size1), W1, BD(0, Size4), "A2345678" },
504: { BA(2, Size1), W1, BD(0, Size4), "A2345678" },
505: { BA(3, Size1), W1, BD(0, Size4), "A2345678" },
506: { BA(4, Size1), W1, BD(0, Size4), "1A345678" },
507: { BA(5, Size1), W1, BD(0, Size4), "1A345678" },
508: { BA(6, Size1), W1, BD(0, Size4), "1A345678" },
509: { BA(7, Size1), W1, BD(0, Size4), "1A345678" },
510:
511: { BA(0, Size2), W2, BD(0, Size4), "A2345678" },
512: { BA(1, Size2), W2, BD(0, Size4), "A2345678" },
513: { BA(2, Size2), W2, BD(0, Size4), "A2345678" },
514: { BA(3, Size2), W2, BD(0, Size4), "A2345678" },
515: { BA(4, Size2), W2, BD(0, Size4), "1A345678" },
516: { BA(5, Size2), W2, BD(0, Size4), "1A345678" },
517: { BA(6, Size2), W2, BD(0, Size4), "1A345678" },
518: { BA(7, Size2), W2, BD(0, Size4), "1A345678" },
519:
520: { BA(0, Size3), W3, BD(0, Size4), "A2345678" },
521: { BA(1, Size3), W3, BD(0, Size4), "A2345678" },
522: { BA(2, Size3), W3, BD(0, Size4), "A2345678" },
523: { BA(3, Size3), W3, BD(0, Size4), "A2345678" },
524: { BA(4, Size3), W3, BD(0, Size4), "1A345678" },
525: { BA(5, Size3), W3, BD(0, Size4), "1A345678" },
526: { BA(6, Size3), W3, BD(0, Size4), "1A345678" },
527: { BA(7, Size3), W3, BD(0, Size4), "1A345678" },
528:
529: { BA(0, Size4), W4, BD(0, Size4), "A2345678" },
530: { BA(1, Size4), W4, BD(0, Size4), "A2345678" },
531: { BA(2, Size4), W4, BD(0, Size4), "A2345678" },
532: { BA(3, Size4), W4, BD(0, Size4), "A2345678" },
533: { BA(4, Size4), W4, BD(0, Size4), "1A345678" },
534: { BA(5, Size4), W4, BD(0, Size4), "1A345678" },
535: { BA(6, Size4), W4, BD(0, Size4), "1A345678" },
536: { BA(7, Size4), W4, BD(0, Size4), "1A345678" },
537: },
538: };
539:
540: static TestData
541: table_EB = {
542: .name = "BusIO_EB",
543: .table_read = {
544: { BA(0, Size1), BusErr },
545: { BA(1, Size1), BD(0x0000ff81, Size2) },
546: { BA(2, Size1), BusErr },
547: { BA(3, Size1), BD(0x0000ff82, Size2) },
548:
549: { BA(0, Size2), BD(0x0000ff81, Size2) },
550: { BA(1, Size2), BD(0x0000ff81, Size2) },
551: { BA(2, Size2), BD(0x0000ff82, Size2) },
552: { BA(3, Size2), BD(0x0000ff82, Size2) },
553:
554: { BA(0, Size3), BD(0x0000ff81, Size2) },
555: { BA(1, Size3), BD(0x0000ff81, Size2) },
556: { BA(2, Size3), BD(0x0000ff82, Size2) },
557: { BA(3, Size3), BD(0x0000ff82, Size2) },
558:
559: { BA(0, Size4), BD(0x0000ff81, Size2) },
560: { BA(1, Size4), BD(0x0000ff81, Size2) },
561: { BA(2, Size4), BD(0x0000ff82, Size2) },
562: { BA(3, Size4), BD(0x0000ff82, Size2) },
563: },
564: .table_write = {
565: { BA(0, Size1), W1, BusErr, "12345678" },
566: { BA(1, Size1), W1, BD(0, Size2), "A2345678" },
567: { BA(2, Size1), W1, BusErr, "12345678" },
568: { BA(3, Size1), W1, BD(0, Size2), "1A345678" },
569:
570: { BA(0, Size2), W2, BD(0, Size2), "B2345678" },
571: { BA(1, Size2), W2, BD(0, Size2), "A2345678" },
572: { BA(2, Size2), W2, BD(0, Size2), "1B345678" },
573: { BA(3, Size2), W2, BD(0, Size2), "1A345678" },
574:
575: { BA(0, Size3), W3, BD(0, Size2), "B2345678" },
576: { BA(1, Size3), W3, BD(0, Size2), "A2345678" },
577: { BA(2, Size3), W3, BD(0, Size2), "1B345678" },
578: { BA(3, Size3), W3, BD(0, Size2), "1A345678" },
579:
580: { BA(0, Size4), W4, BD(0, Size2), "B2345678" },
581: { BA(1, Size4), W4, BD(0, Size2), "A2345678" },
582: { BA(2, Size4), W4, BD(0, Size2), "1B345678" },
583: { BA(3, Size4), W4, BD(0, Size2), "1A345678" },
584: },
585: };
586:
587: static TestData
588: table_FB = {
589: .name = "BusIO_FB",
590: .table_read = {
591: { BA(0, Size1), BD(0x0000ffff, Size2) },
592: { BA(1, Size1), BD(0x0000ff81, Size2) },
593: { BA(2, Size1), BD(0x0000ffff, Size2) },
594: { BA(3, Size1), BD(0x0000ff82, Size2) },
595:
596: { BA(0, Size2), BD(0x0000ff81, Size2) },
597: { BA(1, Size2), BD(0x0000ff81, Size2) },
598: { BA(2, Size2), BD(0x0000ff82, Size2) },
599: { BA(3, Size2), BD(0x0000ff82, Size2) },
600:
601: { BA(0, Size3), BD(0x0000ff81, Size2) },
602: { BA(1, Size3), BD(0x0000ff81, Size2) },
603: { BA(2, Size3), BD(0x0000ff82, Size2) },
604: { BA(3, Size3), BD(0x0000ff82, Size2) },
605:
606: { BA(0, Size4), BD(0x0000ff81, Size2) },
607: { BA(1, Size4), BD(0x0000ff81, Size2) },
608: { BA(2, Size4), BD(0x0000ff82, Size2) },
609: { BA(3, Size4), BD(0x0000ff82, Size2) },
610: },
611: .table_write = {
612: { BA(0, Size1), W1, BD(0, Size2), "12345678" },
613: { BA(1, Size1), W1, BD(0, Size2), "A2345678" },
614: { BA(2, Size1), W1, BD(0, Size2), "12345678" },
615: { BA(3, Size1), W1, BD(0, Size2), "1A345678" },
616:
617: { BA(0, Size2), W2, BD(0, Size2), "B2345678" },
618: { BA(1, Size2), W2, BD(0, Size2), "A2345678" },
619: { BA(2, Size2), W2, BD(0, Size2), "1B345678" },
620: { BA(3, Size2), W2, BD(0, Size2), "1A345678" },
621:
622: { BA(0, Size3), W3, BD(0, Size2), "B2345678" },
623: { BA(1, Size3), W3, BD(0, Size2), "A2345678" },
624: { BA(2, Size3), W3, BD(0, Size2), "1B345678" },
625: { BA(3, Size3), W3, BD(0, Size2), "1A345678" },
626:
627: { BA(0, Size4), W4, BD(0, Size2), "B2345678" },
628: { BA(1, Size4), W4, BD(0, Size2), "A2345678" },
629: { BA(2, Size4), W4, BD(0, Size2), "1B345678" },
630: { BA(3, Size4), W4, BD(0, Size2), "1A345678" },
631: },
632: };
633:
634: static TestData
635: table_W = {
636: .name = "BusIO_W",
637: .table_read = {
638: { BA(0, Size1), BD(0x00008182, Size2) },
639: { BA(1, Size1), BD(0x00008182, Size2) },
640: { BA(2, Size1), BD(0x00008384, Size2) },
641: { BA(3, Size1), BD(0x00008384, Size2) },
642:
643: { BA(0, Size2), BD(0x00008182, Size2) },
644: { BA(1, Size2), BD(0x00008182, Size2) },
645: { BA(2, Size2), BD(0x00008384, Size2) },
646: { BA(3, Size2), BD(0x00008384, Size2) },
647:
648: { BA(0, Size3), BD(0x00008182, Size2) },
649: { BA(1, Size3), BD(0x00008182, Size2) },
650: { BA(2, Size3), BD(0x00008384, Size2) },
651: { BA(3, Size3), BD(0x00008384, Size2) },
652:
653: { BA(0, Size4), BD(0x00008182, Size2) },
654: { BA(1, Size4), BD(0x00008182, Size2) },
655: { BA(2, Size4), BD(0x00008384, Size2) },
656: { BA(3, Size4), BD(0x00008384, Size2) },
657: },
658: .table_write = {
659: { BA(0, Size1), W1, BD(0, Size2), "AA345678" },
660: { BA(1, Size1), W1, BD(0, Size2), "AA345678" },
661: { BA(2, Size1), W1, BD(0, Size2), "12AA5678" },
662: { BA(3, Size1), W1, BD(0, Size2), "12AA5678" },
663:
664: { BA(0, Size2), W2, BD(0, Size2), "AB345678" },
665: { BA(1, Size2), W2, BD(0, Size2), "AA345678" },
666: { BA(2, Size2), W2, BD(0, Size2), "12AB5678" },
667: { BA(3, Size2), W2, BD(0, Size2), "12AA5678" },
668:
669: { BA(0, Size3), W3, BD(0, Size2), "AB345678" },
670: { BA(1, Size3), W3, BD(0, Size2), "AA345678" },
671: { BA(2, Size3), W3, BD(0, Size2), "12AB5678" },
672: { BA(3, Size3), W3, BD(0, Size2), "12AA5678" },
673:
674: { BA(0, Size4), W4, BD(0, Size2), "AB345678" },
675: { BA(1, Size4), W4, BD(0, Size2), "AA345678" },
676: { BA(2, Size4), W4, BD(0, Size2), "12AB5678" },
677: { BA(3, Size4), W4, BD(0, Size2), "12AA5678" },
678: },
679: };
680:
681: static TestData
682: table_WF = {
683: .name = "BusIO_WF",
684: .table_read = {
685: { BA(0, Size1), BD(0x8182ffff, Size4) },
686: { BA(1, Size1), BD(0x8182ffff, Size4) },
687: { BA(2, Size1), BD(0x8182ffff, Size4) },
688: { BA(3, Size1), BD(0x8182ffff, Size4) },
689: { BA(4, Size1), BD(0x8384ffff, Size4) },
690: { BA(5, Size1), BD(0x8384ffff, Size4) },
691: { BA(6, Size1), BD(0x8384ffff, Size4) },
692: { BA(7, Size1), BD(0x8384ffff, Size4) },
693:
694: { BA(0, Size2), BD(0x8182ffff, Size4) },
695: { BA(1, Size2), BD(0x8182ffff, Size4) },
696: { BA(2, Size2), BD(0x8182ffff, Size4) },
697: { BA(3, Size2), BD(0x8182ffff, Size4) },
698: { BA(4, Size2), BD(0x8384ffff, Size4) },
699: { BA(5, Size2), BD(0x8384ffff, Size4) },
700: { BA(6, Size2), BD(0x8384ffff, Size4) },
701: { BA(7, Size2), BD(0x8384ffff, Size4) },
702:
703: { BA(0, Size3), BD(0x8182ffff, Size4) },
704: { BA(1, Size3), BD(0x8182ffff, Size4) },
705: { BA(2, Size3), BD(0x8182ffff, Size4) },
706: { BA(3, Size3), BD(0x8182ffff, Size4) },
707: { BA(4, Size3), BD(0x8384ffff, Size4) },
708: { BA(5, Size3), BD(0x8384ffff, Size4) },
709: { BA(6, Size3), BD(0x8384ffff, Size4) },
710: { BA(7, Size3), BD(0x8384ffff, Size4) },
711:
712: { BA(0, Size4), BD(0x8182ffff, Size4) },
713: { BA(1, Size4), BD(0x8182ffff, Size4) },
714: { BA(2, Size4), BD(0x8182ffff, Size4) },
715: { BA(3, Size4), BD(0x8182ffff, Size4) },
716: { BA(4, Size4), BD(0x8384ffff, Size4) },
717: { BA(5, Size4), BD(0x8384ffff, Size4) },
718: { BA(6, Size4), BD(0x8384ffff, Size4) },
719: { BA(7, Size4), BD(0x8384ffff, Size4) },
720: },
721: .table_write = {
722: { BA(0, Size1), W1, BD(0, Size4), "AA345678" },
723: { BA(1, Size1), W1, BD(0, Size4), "AA345678" },
724: { BA(2, Size1), W1, BD(0, Size4), "AA345678" },
725: { BA(3, Size1), W1, BD(0, Size4), "AA345678" },
726: { BA(4, Size1), W1, BD(0, Size4), "12AA5678" },
727: { BA(5, Size1), W1, BD(0, Size4), "12AA5678" },
728: { BA(6, Size1), W1, BD(0, Size4), "12AA5678" },
729: { BA(7, Size1), W1, BD(0, Size4), "12AA5678" },
730:
731: { BA(0, Size2), W2, BD(0, Size4), "AB345678" },
732: { BA(1, Size2), W2, BD(0, Size4), "AB345678" },
733: { BA(2, Size2), W2, BD(0, Size4), "AB345678" },
734: { BA(3, Size2), W2, BD(0, Size4), "AB345678" },
735: { BA(4, Size2), W2, BD(0, Size4), "12AB5678" },
736: { BA(5, Size2), W2, BD(0, Size4), "12AB5678" },
737: { BA(6, Size2), W2, BD(0, Size4), "12AB5678" },
738: { BA(7, Size2), W2, BD(0, Size4), "12AB5678" },
739:
740: // 3バイトは来ないはず?
741:
742: { BA(0, Size4), W4, BD(0, Size4), "AB345678" },
743: { BA(1, Size4), W4, BD(0, Size4), "AB345678" },
744: { BA(2, Size4), W4, BD(0, Size4), "AB345678" },
745: { BA(3, Size4), W4, BD(0, Size4), "AB345678" },
746: { BA(4, Size4), W4, BD(0, Size4), "12AB5678" },
747: { BA(5, Size4), W4, BD(0, Size4), "12AB5678" },
748: { BA(6, Size4), W4, BD(0, Size4), "12AB5678" },
749: { BA(7, Size4), W4, BD(0, Size4), "12AB5678" },
750: },
751: };
752:
753: static TestData
754: table_L = {
755: .name = "BusIO_L",
756: .table_read = {
757: { BA(0, Size1), BD(0x81828384, Size4) },
758: { BA(1, Size1), BD(0x81828384, Size4) },
759: { BA(2, Size1), BD(0x81828384, Size4) },
760: { BA(3, Size1), BD(0x81828384, Size4) },
761: { BA(4, Size1), BD(0x85868788, Size4) },
762: { BA(5, Size1), BD(0x85868788, Size4) },
763: { BA(6, Size1), BD(0x85868788, Size4) },
764: { BA(7, Size1), BD(0x85868788, Size4) },
765:
766: { BA(0, Size2), BD(0x81828384, Size4) },
767: { BA(1, Size2), BD(0x81828384, Size4) },
768: { BA(2, Size2), BD(0x81828384, Size4) },
769: { BA(3, Size2), BD(0x81828384, Size4) },
770: { BA(4, Size2), BD(0x85868788, Size4) },
771: { BA(5, Size2), BD(0x85868788, Size4) },
772: { BA(6, Size2), BD(0x85868788, Size4) },
773: { BA(7, Size2), BD(0x85868788, Size4) },
774:
775: { BA(0, Size3), BD(0x81828384, Size4) },
776: { BA(1, Size3), BD(0x81828384, Size4) },
777: { BA(2, Size3), BD(0x81828384, Size4) },
778: { BA(3, Size3), BD(0x81828384, Size4) },
779: { BA(4, Size3), BD(0x85868788, Size4) },
780: { BA(5, Size3), BD(0x85868788, Size4) },
781: { BA(6, Size3), BD(0x85868788, Size4) },
782: { BA(7, Size3), BD(0x85868788, Size4) },
783:
784: { BA(0, Size4), BD(0x81828384, Size4) },
785: { BA(1, Size4), BD(0x81828384, Size4) },
786: { BA(2, Size4), BD(0x81828384, Size4) },
787: { BA(3, Size4), BD(0x81828384, Size4) },
788: { BA(4, Size4), BD(0x85868788, Size4) },
789: { BA(5, Size4), BD(0x85868788, Size4) },
790: { BA(6, Size4), BD(0x85868788, Size4) },
791: { BA(7, Size4), BD(0x85868788, Size4) },
792: },
793: .table_write = {
794: { BA(0, Size1), W1, BD(0, Size4), "AAAA5678" },
795: { BA(1, Size1), W1, BD(0, Size4), "AAAA5678" },
796: { BA(2, Size1), W1, BD(0, Size4), "AAAA5678" },
797: { BA(3, Size1), W1, BD(0, Size4), "AAAA5678" },
798:
799: { BA(0, Size2), W2, BD(0, Size4), "ABAB5678" },
800: { BA(1, Size2), W2, BD(0, Size4), "AABA5678" },
801: { BA(2, Size2), W2, BD(0, Size4), "ABAB5678" },
802: { BA(3, Size2), W2, BD(0, Size4), "AABA5678" },
803:
804: { BA(0, Size3), W3, BD(0, Size4), "ABC05678" },
805: { BA(1, Size3), W3, BD(0, Size4), "AABC5678" },
806: { BA(2, Size3), W3, BD(0, Size4), "ABAB5678" },
807: { BA(3, Size3), W3, BD(0, Size4), "AABA5678" },
808:
809: { BA(0, Size4), W4, BD(0, Size4), "ABCD5678" },
810: { BA(1, Size4), W4, BD(0, Size4), "AABC5678" },
811: { BA(2, Size4), W4, BD(0, Size4), "ABAB5678" },
812: { BA(3, Size4), W4, BD(0, Size4), "AABA5678" },
813: },
814: };
815:
1.1 root 816: int
817: main()
818: {
1.1.1.7 root 819: do_test(new BusIO_B<TestByteDev>(), table_B);
820: do_test(new BusIO_BB<TestByteDev>(), table_BB);
821: do_test(new BusIO_BBBB<TestByteDev>(), table_BBBB);
822: do_test(new BusIO_BFFF<TestByteDev>(), table_BFFF);
823: do_test(new BusIO_EB<TestByteDev>(), table_EB);
824: do_test(new BusIO_FB<TestByteDev>(), table_FB);
825:
826: do_test(new BusIO_W<TestWordDev>(), table_W);
827: do_test(new BusIO_WF<TestWordDev>(), table_WF);
828:
829: do_test(new BusIO_L<TestLongDev>(), table_L);
1.1 root 830:
831: return 0;
832: }
833:
834: // リンカを通すためのダミー
835: void
1.1.1.5 root 836: vmpanic_func(const char *funcname, const char *fmt, ...)
1.1 root 837: {
838: va_list ap;
839:
840: printf("panic: %s: ", funcname);
841: va_start(ap, fmt);
842: vprintf(fmt, ap);
843: va_end(ap);
844: exit(1);
845: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.