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