Annotation of nono/vm/extarea.cpp, revision 1.1.1.2

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2023 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // 拡張エリアセット
                      9: //
                     10: 
                     11: // 拡張エリアセットの範囲は $eaff80 〜 $eaffff までの 128バイトで、
                     12: // 他は (現状デバイスがないので) バスエラーになる。
                     13: // X68kIODevice の構造の都合上、$eae000 〜 $eaffff までの 8KB のアクセスが
                     14: // すべてここに来るので、BusIO を使わず自前でさばく必要がある。
                     15: // (本来は MuxDevice で分離すべき)
                     16: 
                     17: #include "extarea.h"
                     18: #include "x68kio.h"
                     19: 
                     20: // コンストラクタ
                     21: ExtAreaDevice::ExtAreaDevice()
                     22:        : inherited(OBJ_EXTAREA)
                     23: {
                     24: }
                     25: 
                     26: // デストラクタ
                     27: ExtAreaDevice::~ExtAreaDevice()
                     28: {
                     29: }
                     30: 
                     31: // 初期化
                     32: bool
                     33: ExtAreaDevice::Init()
                     34: {
                     35:        if (inherited::Init() == false) {
                     36:                return false;
                     37:        }
                     38: 
                     39:        x68kio = GetX68kIODevice();
                     40: 
                     41:        return true;
                     42: }
                     43: 
                     44: // リセット
                     45: void
                     46: ExtAreaDevice::ResetHard(bool poweron)
                     47: {
                     48:        // リセット時はすべて 0 らしい。(X68030 Inside/Out)
                     49:        for (int i = 0; i < 5; i++) {
                     50:                x68kio->SetExtarea(i, 0x00);
                     51:        }
                     52: }
                     53: 
                     54: busdata
1.1.1.2 ! root       55: ExtAreaDevice::Read(busaddr addr)
1.1       root       56: {
1.1.1.2 ! root       57:        uint32 reqsize = addr.GetSize();
        !            58:        uint32 paddr = addr.Addr();
        !            59:        uint32 offset = paddr & 1;
        !            60:        uint32 datasize = std::min(2 - offset, reqsize);
        !            61: 
        !            62:        if (paddr >= 0xeaff80) {
        !            63:                // 拡張エリアセット部分は書き込み専用なので読み出しはすべてバスエラー。
        !            64:                putlog(2, "Read $%06x.%c (BusErr)",
        !            65:                        paddr, (datasize == 1 ? 'B' : 'W'));
        !            66:        } else {
        !            67:                // それ以外の部分も何もないのでバスエラー。
1.1       root       68:        }
                     69: 
1.1.1.2 ! root       70:        busdata data = BusData::BusErr;
        !            71:        // XXX wait
        !            72:        data |= busdata::Size(datasize);
        !            73:        return data;
1.1       root       74: }
                     75: 
                     76: busdata
1.1.1.2 ! root       77: ExtAreaDevice::Write(busaddr addr, uint32 data)
1.1       root       78: {
                     79:        busdata r;
                     80: 
1.1.1.2 ! root       81:        uint32 reqsize = addr.GetSize();
        !            82:        uint32 paddr = addr.Addr();
        !            83:        uint32 offset = paddr & 1;
        !            84:        uint32 datasize = std::min(2 - offset, reqsize);
1.1       root       85: 
1.1.1.2 ! root       86:        if (paddr >= 0xeaff80) {
        !            87:                // 拡張エリアセット内は16バイト(8ワード)単位でミラー。
1.1       root       88:                // 偶数アドレスはバスエラー。
1.1.1.2 ! root       89:                if (datasize == 1 && offset == 0) {
        !            90:                        r = BusData::BusErr;
        !            91:                } else {
        !            92:                        uint32 regno = (paddr >> 1) & 7;
        !            93:                        if (regno < 6) {
        !            94:                                putlog(1, "$%06x [%u] <- $%02x", paddr, regno, data & 0xff);
        !            95:                                x68kio->SetExtarea(regno, data);
        !            96:                        } else {
        !            97:                                r = BusData::BusErr;
        !            98:                        }
        !            99:                }
        !           100:                if (r.IsBusErr()) {
        !           101:                        putlog(2, "Write $%06x.%c (BusErr)",
        !           102:                                paddr, (datasize == 1 ? 'B' : 'W'));
1.1       root      103:                }
                    104:        } else {
1.1.1.2 ! root      105:                // それ以外の部分も何もないのでバスエラー。
        !           106:                r = BusData::BusErr;
1.1       root      107:        }
                    108: 
1.1.1.2 ! root      109:        r |= busdata::Size(datasize);
        !           110:        return data;
1.1       root      111: }
                    112: 
                    113: busdata
1.1.1.2 ! root      114: ExtAreaDevice::Peek1(uint32 addr)
1.1       root      115: {
1.1.1.2 ! root      116:        return BusData::BusErr;
1.1       root      117: }

unix.superglobalmegacorp.com

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