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

1.1       root        1: //
                      2: // nono
                      3: // Copyright (C) 2022 nono project
                      4: // Licensed under nono-license.txt
                      5: //
                      6: 
                      7: //
                      8: // XP プロセッサの物理バス
                      9: //
                     10: 
                     11: // 00000H +-------------------+
                     12: //        | 3Port RAM (128KB) |
                     13: // 20000H +-------------------+
                     14: //        | PROM   (32KB)     | ソケットが空のようだ
                     15: // 28000H +-------------------+
                     16: //        | 3Port RAM (32KB)  |
                     17: // 30000H +-------------------+
                     18: //        |                   |
                     19: // :        無効
                     20: //        |                   |
                     21: // FFE00H +-------------------+
                     22: //        | 内蔵 RAM (512B)   | (実際の位置は I/O で決まる)
                     23: // FFFFFH +-------------------+
                     24: //
                     25: // 3Port RAM (128KB) のほうは vm_luna で確保されている subram、
                     26: // 3Port RAM (32KB)  のほうはこちらで確保する subram2。
                     27: // 内蔵 RAM は XPBusDevice の internal_ram[]。
                     28: 
                     29: #include "xpbus.h"
                     30: #include "subram.h"
                     31: 
                     32: // コンストラクタ
                     33: XPbusDevice::XPbusDevice()
                     34:        : inherited(OBJ_XPBUS)
                     35: {
                     36:        pSubRAM2.reset(new SubRAM2Device(32));
                     37:        pXPRAM.reset(new XPRAMDevice());
                     38: }
                     39: 
                     40: // デストラクタ
                     41: XPbusDevice::~XPbusDevice()
                     42: {
                     43: }
                     44: 
                     45: // 初期化
                     46: bool
                     47: XPbusDevice::Init()
                     48: {
                     49:        if (inherited::Init() == false) {
                     50:                return false;
                     51:        }
                     52: 
                     53:        nopio = GetNopIODevice();
                     54:        subram = GetSubRAMDevice();
                     55:        return true;
                     56: }
                     57: 
                     58: void
                     59: XPbusDevice::ResetHard(bool poweron)
                     60: {
                     61:        // RMCR のリセットは XP 側からされるのでここでは何もしない
                     62: }
                     63: 
                     64: inline IODevice *
                     65: XPbusDevice::SearchDevice(uint32 addr) const
                     66: {
                     67:        // まず内蔵 512 バイトRAM (位置は設定で可変)
                     68:        if (__predict_true((addr & 0xffe00) == ram_addr)) {
                     69:                return pXPRAM.get();
                     70:        }
                     71: 
                     72:        if (__predict_true(addr < 0x20000)) {   // 00000H-20000H: 3Port RAM (128KB)
                     73:                return subram;
                     74:        }
                     75:        if (__predict_false(addr < 0x28000)) {  // 20000H-28000H: PROM 領域 (32KB)
                     76:                return nopio;
                     77:        }
                     78:        if (__predict_true(addr < 0x30000)) {   // 28000H-30000H: 非共有 RAM (32KB)
                     79:                return pSubRAM2.get();
                     80:        }
                     81:        // 30000H 以降は空き。
                     82:        // アクセス特性が NopIO かどうかは未調査。
                     83:        return nopio;
                     84: }
                     85: 
                     86: uint64
                     87: XPbusDevice::Read8(uint32 addr)
                     88: {
                     89:        addr &= 0x000fffff;
                     90:        IODevice *d = SearchDevice(addr);
                     91:        return d->Read8(addr);
                     92: }
                     93: 
                     94: uint64
                     95: XPbusDevice::Read16(uint32 addr)
                     96: {
                     97:        addr &= 0x000fffff;
                     98:        IODevice *d = SearchDevice(addr);
                     99:        return d->Read16(addr);
                    100: }
                    101: 
                    102: uint64
                    103: XPbusDevice::Read32(uint32 addr)
                    104: {
                    105:        addr &= 0x000fffff;
                    106:        IODevice *d = SearchDevice(addr);
                    107:        return d->Read32(addr);
                    108: }
                    109: 
                    110: uint64
                    111: XPbusDevice::Write8(uint32 addr, uint32 data)
                    112: {
                    113:        addr &= 0x000fffff;
                    114:        IODevice *d = SearchDevice(addr);
                    115:        return d->Write8(addr, data);
                    116: }
                    117: 
                    118: uint64
                    119: XPbusDevice::Write16(uint32 addr, uint32 data)
                    120: {
                    121:        addr &= 0x000fffff;
                    122:        IODevice *d = SearchDevice(addr);
                    123:        return d->Write16(addr, data);
                    124: }
                    125: 
                    126: uint64
                    127: XPbusDevice::Write32(uint32 addr, uint32 data)
                    128: {
                    129:        addr &= 0x000fffff;
                    130:        IODevice *d = SearchDevice(addr);
                    131:        return d->Write32(addr, data);
                    132: }
                    133: 
                    134: uint64
                    135: XPbusDevice::Peek8(uint32 addr)
                    136: {
                    137:        addr &= 0x000fffff;
                    138:        IODevice *d = SearchDevice(addr);
                    139:        return d->Peek8(addr);
                    140: }
                    141: 
                    142: // このアドレスを担当する次段の IODevice を返す (IOContainerDevice 用)
                    143: IODevice *
                    144: XPbusDevice::GetDevice(uint32 addr) const
                    145: {
                    146:        return SearchDevice(addr & 0x000fffff);
                    147: }
                    148: 
                    149: // RMCR レジスタを取得する
                    150: uint32
                    151: XPbusDevice::GetRMCR() const
                    152: {
                    153:        return (ram_addr >> 12) & 0xff;
                    154: }
                    155: 
                    156: // RMCR レジスタを設定する
                    157: void
                    158: XPbusDevice::SetRMCR(uint32 data)
                    159: {
                    160:        ram_addr = ((data & 0xf0) << 12) | 0xfe00;
                    161: }
                    162: 
                    163: 
                    164: //
                    165: // XP 内蔵 512 バイト RAM
                    166: //
                    167: // IODevice にしておかないといけない関係で独立して用意する。
                    168: // ここは RAM 実体を持っているだけで、配置場所は XPbusDevice が担当している。
                    169: //
                    170: 
                    171: // コンストラクタ
                    172: XPRAMDevice::XPRAMDevice()
                    173:        : inherited(OBJ_XPRAM)
                    174: {
                    175: }
                    176: 
                    177: // デストラクタ
                    178: XPRAMDevice::~XPRAMDevice()
                    179: {
                    180: }
                    181: 
                    182: uint64
                    183: XPRAMDevice::Read8(uint32 addr)
                    184: {
                    185:        addr &= 0x1ff;
                    186:        return ram[addr];
                    187: }
                    188: 
                    189: uint64
                    190: XPRAMDevice::Read16(uint32 addr)
                    191: {
                    192:        putlog(0, "should not be called?");
                    193:        return (uint64)-1;
                    194: }
                    195: 
                    196: uint64
                    197: XPRAMDevice::Read32(uint32 addr)
                    198: {
                    199:        putlog(0, "should not be called?");
                    200:        return (uint64)-1;
                    201: }
                    202: 
                    203: uint64
                    204: XPRAMDevice::Write8(uint32 addr, uint32 data)
                    205: {
                    206:        addr &= 0x1ff;
                    207:        ram[addr] = data;
                    208:        return 0;
                    209: }
                    210: 
                    211: uint64
                    212: XPRAMDevice::Write16(uint32 addr, uint32 data)
                    213: {
                    214:        putlog(0, "should not be called?");
                    215:        return (uint64)-1;
                    216: }
                    217: 
                    218: uint64
                    219: XPRAMDevice::Write32(uint32 addr, uint32 data)
                    220: {
                    221:        putlog(0, "should not be called?");
                    222:        return (uint64)-1;
                    223: }
                    224: 
                    225: uint64
                    226: XPRAMDevice::Peek8(uint32 addr)
                    227: {
                    228:        addr &= 0x1ff;
                    229:        return ram[addr];
                    230: }
                    231: 
                    232: uint64
                    233: XPRAMDevice::Poke8(uint32 addr, uint32 data)
                    234: {
                    235:        if ((int32)data >= 0) {
                    236:                addr &= 0x1ff;
                    237:                ram[addr] = data;
                    238:        }
                    239:        return 0;
                    240: }

unix.superglobalmegacorp.com

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