Annotation of nono/vm/bankram.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: // Nereid バンクメモリ
                      9: //
                     10: 
                     11: // バンクメモリはロングワード単位でホストバイトオーダ配置なので、
                     12: // バイトアクセス、ワードアクセス時は HLB(), HLW() マクロを使用のこと。
                     13: 
                     14: #include "bankram.h"
                     15: #include "config.h"
                     16: 
                     17: // コンストラクタ
                     18: BankRAMDevice::BankRAMDevice(int objid_, int ram_size_MB)
                     19:        : inherited(objid_)
                     20: {
                     21:        // ram_size_MB は正数のみ。負数は親側で処理する。
                     22:        assert(ram_size_MB >= 0);
                     23: 
                     24:        ram_size = ram_size_MB * 1024 * 1024;
                     25:        // 初期化は Init() で行う
                     26: }
                     27: 
                     28: // デストラクタ
                     29: BankRAMDevice::~BankRAMDevice()
                     30: {
                     31: }
                     32: 
                     33: // 初期化
                     34: bool
                     35: BankRAMDevice::Init()
                     36: {
                     37:        if (inherited::Init() == false) {
                     38:                return false;
                     39:        }
                     40: 
                     41:        ram.reset(new uint8[ram_size]);
                     42: 
                     43:        return true;
                     44: }
                     45: 
                     46: // 電源オン/リセット
                     47: void
                     48: BankRAMDevice::ResetHard(bool poweron)
                     49: {
                     50:        if (poweron) {
                     51:                // ノイズで埋めたいがとりあえず。
                     52:                memset(&ram[0], 0, ram_size);
                     53:        }
                     54: 
                     55:        // リセットでクリアされる。
                     56:        SetPage(0);
                     57: }
                     58: 
                     59: inline uint32
                     60: BankRAMDevice::Decoder(uint32 addr) const
                     61: {
                     62:        return pageaddr + (addr & 0xffff);
                     63: }
                     64: 
                     65: uint64
                     66: BankRAMDevice::Read8(uint32 addr)
                     67: {
                     68:        uint32 offset = Decoder(addr);
                     69:        uint32 data = ram[HLB(offset)];
                     70:        putlog(4, "$%08x.B -> $%02x", addr, data);
                     71:        return data;
                     72: }
                     73: 
                     74: uint64
                     75: BankRAMDevice::Read16(uint32 addr)
                     76: {
                     77:        uint32 offset = Decoder(addr);
                     78:        uint32 data = *(uint16 *)&ram[HLW(offset)];
                     79:        putlog(4, "$%08x.W -> $%04x", addr, data);
                     80:        return data;
                     81: }
                     82: 
                     83: uint64
                     84: BankRAMDevice::Read32(uint32 addr)
                     85: {
                     86:        uint32 offset = Decoder(addr);
                     87:        uint32 data = *(uint32 *)&ram[offset];
                     88:        putlog(4, "$%08x.L -> $%08x", addr, data);
                     89:        return data;
                     90: }
                     91: 
                     92: uint64
                     93: BankRAMDevice::Write8(uint32 addr, uint32 data)
                     94: {
                     95:        uint32 offset = Decoder(addr);
                     96:        ram[HLB(offset)] = data;
                     97:        putlog(3, "$%08x.B <- $%02x", addr, data);
                     98:        return 0;
                     99: }
                    100: 
                    101: uint64
                    102: BankRAMDevice::Write16(uint32 addr, uint32 data)
                    103: {
                    104:        uint32 offset = Decoder(addr);
                    105:        *(uint16 *)&ram[HLW(offset)] = data;
                    106:        putlog(3, "$%08x.W <- $%04x", addr, data);
                    107:        return 0;
                    108: }
                    109: 
                    110: uint64
                    111: BankRAMDevice::Write32(uint32 addr, uint32 data)
                    112: {
                    113:        uint32 offset = Decoder(addr);
                    114:        *(uint32 *)&ram[offset] = data;
                    115:        putlog(3, "$%08x.L <- $%08x", addr, data);
                    116:        return 0;
                    117: }
                    118: 
                    119: uint64
                    120: BankRAMDevice::Peek8(uint32 addr)
                    121: {
                    122:        uint32 offset = Decoder(addr);
                    123:        return ram[HLB(offset)];
                    124: }
                    125: 
                    126: uint64
                    127: BankRAMDevice::Poke8(uint32 addr, uint32 data)
                    128: {
                    129:        if ((int32)data >= 0) {
                    130:                uint32 offset = Decoder(addr);
                    131:                ram[HLB(offset)] = data;
                    132:        }
                    133:        return 0;
                    134: }
                    135: 
                    136: void
                    137: BankRAMDevice::SetPage(uint32 page_)
                    138: {
                    139:        page = page_;
                    140:        // XXX 4MB の時の折返し確認
                    141:        pageaddr = (page << 16) & (ram_size - 1);
                    142: 
                    143:        putlog(2, "Page <- $%02x", page);
                    144: }

unix.superglobalmegacorp.com

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