Annotation of nono/vm/test_busio.cpp, revision 1.1.1.8

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.