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

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 "mpu.h"
                     19: #include "x68kio.h"
                     20: 
                     21: // コンストラクタ
                     22: ExtAreaDevice::ExtAreaDevice()
                     23:        : inherited(OBJ_EXTAREA)
                     24: {
                     25: }
                     26: 
                     27: // デストラクタ
                     28: ExtAreaDevice::~ExtAreaDevice()
                     29: {
                     30: }
                     31: 
                     32: // 初期化
                     33: bool
                     34: ExtAreaDevice::Init()
                     35: {
                     36:        if (inherited::Init() == false) {
                     37:                return false;
                     38:        }
                     39: 
                     40:        x68kio = GetX68kIODevice();
                     41: 
                     42:        return true;
                     43: }
                     44: 
                     45: // リセット
                     46: void
                     47: ExtAreaDevice::ResetHard(bool poweron)
                     48: {
                     49:        // リセット時はすべて 0 らしい。(X68030 Inside/Out)
                     50:        for (int i = 0; i < 5; i++) {
                     51:                x68kio->SetExtarea(i, 0x00);
                     52:        }
                     53: }
                     54: 
                     55: busdata
                     56: ExtAreaDevice::Read8(uint32 addr)
                     57: {
                     58:        if (addr >= 0xeaff80) {
                     59:                // 拡張エリアセット部分は書き込み専用で読み出しはすべてバスエラー。
                     60:                putlog(2, "Read $%06x.B (BusErr)", addr);
                     61:        }
                     62:        // 他はすべてバスエラー。
                     63:        // XXX wait?
                     64:        return busdata::BusErr;
                     65: }
                     66: 
                     67: busdata
                     68: ExtAreaDevice::Read16(uint32 addr)
                     69: {
                     70:        if (addr >= 0xeaff80) {
                     71:                // 拡張エリアセット部分は書き込み専用で読み出しはすべてバスエラー。
                     72:                putlog(2, "Read $%06x.W (BusErr)", addr);
                     73:        }
                     74:        // 他はすべてバスエラー。
                     75:        // XXX wait?
                     76:        return busdata::BusErr;
                     77: }
                     78: 
                     79: busdata
                     80: ExtAreaDevice::Write8(uint32 addr, uint32 data)
                     81: {
                     82:        busdata r;
                     83: 
                     84:        if (addr >= 0xeaff80) {
                     85:                // 拡張エリアセット内は16バイト単位でミラー。
                     86:                uint32 offset = addr & 0x0f;
                     87: 
                     88:                // 偶数アドレスはバスエラー。
                     89:                // 奇数アドレスはレジスタ部分は書き込み可能。以降はバスエラー。
                     90:                switch (offset) {
                     91:                 case 0x01:
                     92:                 case 0x03:
                     93:                 case 0x05:
                     94:                 case 0x07:
                     95:                 case 0x09:
                     96:                        offset >>= 1;
                     97:                        putlog(1, "$%06x [%d] <- $%02x", addr, offset, data);
                     98:                        x68kio->SetExtarea(offset, data);
                     99:                        r = 0;
                    100:                        break;
                    101:                 default:
                    102:                        putlog(2, "Write $%06x.B (BusErr)", addr);
                    103:                        r.SetBusErr();
                    104:                        break;
                    105:                }
                    106:        } else {
                    107:                // 他はすべてバスエラー。
                    108:                r.SetBusErr();
                    109:        }
                    110: 
                    111:        // XXX wait?
                    112:        return r;
                    113: }
                    114: 
                    115: busdata
                    116: ExtAreaDevice::Write16(uint32 addr, uint32 data)
                    117: {
                    118:        // 拡張エリアセット内は EB 構造。
                    119:        return Write8(addr + 1, data & 0xff);
                    120: }
                    121: 
                    122: busdata
                    123: ExtAreaDevice::Peek8(uint32 addr)
                    124: {
                    125:        return busdata::BusErr;
                    126: }

unix.superglobalmegacorp.com

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