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

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:        x68kio = GetX68kIODevice();
                     36: 
                     37:        return true;
                     38: }
                     39: 
                     40: // リセット
                     41: void
                     42: ExtAreaDevice::ResetHard(bool poweron)
                     43: {
                     44:        // リセット時はすべて 0 らしい。(X68030 Inside/Out)
                     45:        for (int i = 0; i < 5; i++) {
                     46:                x68kio->SetExtarea(i, 0x00);
                     47:        }
                     48: }
                     49: 
                     50: busdata
1.1.1.2   root       51: ExtAreaDevice::Read(busaddr addr)
1.1       root       52: {
1.1.1.2   root       53:        uint32 reqsize = addr.GetSize();
                     54:        uint32 paddr = addr.Addr();
                     55:        uint32 offset = paddr & 1;
                     56:        uint32 datasize = std::min(2 - offset, reqsize);
                     57: 
                     58:        if (paddr >= 0xeaff80) {
                     59:                // 拡張エリアセット部分は書き込み専用なので読み出しはすべてバスエラー。
                     60:                putlog(2, "Read $%06x.%c (BusErr)",
                     61:                        paddr, (datasize == 1 ? 'B' : 'W'));
                     62:        } else {
                     63:                // それ以外の部分も何もないのでバスエラー。
1.1       root       64:        }
                     65: 
1.1.1.2   root       66:        busdata data = BusData::BusErr;
                     67:        // XXX wait
                     68:        data |= busdata::Size(datasize);
                     69:        return data;
1.1       root       70: }
                     71: 
                     72: busdata
1.1.1.2   root       73: ExtAreaDevice::Write(busaddr addr, uint32 data)
1.1       root       74: {
                     75:        busdata r;
                     76: 
1.1.1.2   root       77:        uint32 reqsize = addr.GetSize();
                     78:        uint32 paddr = addr.Addr();
                     79:        uint32 offset = paddr & 1;
                     80:        uint32 datasize = std::min(2 - offset, reqsize);
1.1       root       81: 
1.1.1.2   root       82:        if (paddr >= 0xeaff80) {
                     83:                // 拡張エリアセット内は16バイト(8ワード)単位でミラー。
1.1       root       84:                // 偶数アドレスはバスエラー。
1.1.1.2   root       85:                if (datasize == 1 && offset == 0) {
                     86:                        r = BusData::BusErr;
                     87:                } else {
                     88:                        uint32 regno = (paddr >> 1) & 7;
                     89:                        if (regno < 6) {
                     90:                                putlog(1, "$%06x [%u] <- $%02x", paddr, regno, data & 0xff);
                     91:                                x68kio->SetExtarea(regno, data);
                     92:                        } else {
                     93:                                r = BusData::BusErr;
                     94:                        }
                     95:                }
                     96:                if (r.IsBusErr()) {
                     97:                        putlog(2, "Write $%06x.%c (BusErr)",
                     98:                                paddr, (datasize == 1 ? 'B' : 'W'));
1.1       root       99:                }
                    100:        } else {
1.1.1.2   root      101:                // それ以外の部分も何もないのでバスエラー。
                    102:                r = BusData::BusErr;
1.1       root      103:        }
                    104: 
1.1.1.2   root      105:        r |= busdata::Size(datasize);
                    106:        return data;
1.1       root      107: }
                    108: 
                    109: busdata
1.1.1.2   root      110: ExtAreaDevice::Peek1(uint32 addr)
1.1       root      111: {
1.1.1.2   root      112:        return BusData::BusErr;
1.1       root      113: }

unix.superglobalmegacorp.com

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