Annotation of nono/vm/sram.cpp, revision 1.1.1.9

1.1       root        1: //
                      2: // nono
1.1.1.4   root        3: // Copyright (C) 2020 nono project
                      4: // Licensed under nono-license.txt
1.1       root        5: //
                      6: 
                      7: //
                      8: // SRAM
                      9: //
1.1.1.9 ! root       10: 
1.1       root       11: // SRAM はビッグエンディアンのままメモリに置かれるので、
                     12: // 必要ならアクセス時に都度変換すること。
                     13: 
1.1.1.9 ! root       14: #include "sram.h"
        !            15: #include "mainapp.h"
        !            16: 
        !            17: // グローバル参照用
        !            18: SRAMDevice *gSRAM;
1.1       root       19: 
1.1.1.9 ! root       20: // コンストラクタ
1.1       root       21: SRAMDevice::SRAMDevice()
1.1.1.7   root       22:        : inherited("SRAM")
1.1       root       23: {
                     24:        devaddr = baseaddr;
1.1.1.4   root       25:        devlen  = 0x4000;
1.1       root       26: }
                     27: 
1.1.1.9 ! root       28: // デストラクタ
1.1       root       29: SRAMDevice::~SRAMDevice()
                     30: {
1.1.1.9 ! root       31:        gSRAM = NULL;
1.1       root       32: }
                     33: 
                     34: bool
                     35: SRAMDevice::Init()
                     36: {
1.1.1.3   root       37:        filename = gMainApp.GetVMDir() + "SRAM030.DAT";
1.1.1.4   root       38:        file.SetFilename(filename);
                     39:        file.SetDispname(string_format("SRAM \"%s\"", filename.c_str()));
                     40:        mem = file.OpenCreate(16 * 1024);
                     41:        if (mem == NULL) {
1.1       root       42:                return false;
                     43:        }
                     44: 
                     45:        return true;
                     46: }
                     47: 
1.1.1.9 ! root       48: // リセット
1.1.1.6   root       49: void
1.1.1.9 ! root       50: SRAMDevice::ResetHard(bool poweron)
1.1.1.6   root       51: {
                     52:        // XXX 未調査
                     53:        writeable = false;
                     54: }
                     55: 
1.1.1.3   root       56: // アドレスデコーダ
                     57: inline uint64
                     58: SRAMDevice::Decoder(uint32 addr) const
                     59: {
1.1.1.4   root       60:        uint32 offset = addr - baseaddr;
                     61:        assertmsg(offset < file.GetMemSize(),
                     62:                "offset=%x memlen=%x", offset, (int)file.GetMemSize());
                     63:        return offset;
1.1.1.3   root       64: }
                     65: 
1.1       root       66: uint64
                     67: SRAMDevice::Read8(uint32 addr)
                     68: {
1.1.1.3   root       69:        uint32 offset = Decoder(addr);
1.1.1.4   root       70:        uint32 data;
                     71: 
                     72:        // ホストファイル起動モードなら起動アドレスとして Pluto-X を見せる。
1.1.1.8   root       73:        if (gMainApp.exec_file) {
1.1.1.4   root       74:                data = PeekHostBoot(offset);
                     75:                if ((int32)data >= 0) {
                     76:                        if ((offset & 1) == 0) {
                     77:                                data = data >> 8;
                     78:                        } else {
                     79:                                data = data & 0xff;
                     80:                        }
                     81:                        return data;
                     82:                }
                     83:        }
                     84: 
                     85:        data = mem[offset];
                     86:        return data;
1.1       root       87: }
                     88: 
                     89: uint64
                     90: SRAMDevice::Read16(uint32 addr)
                     91: {
1.1.1.3   root       92:        uint32 offset = Decoder(addr);
1.1.1.4   root       93:        uint32 data;
                     94: 
                     95:        // ホストファイル起動モードなら起動アドレスとして Pluto-X を見せる。
1.1.1.8   root       96:        if (gMainApp.exec_file) {
1.1.1.4   root       97:                data = PeekHostBoot(offset);
                     98:                if ((int32)data >= 0) {
                     99:                        return data;
                    100:                }
                    101:        }
                    102: 
                    103:        data = be16toh(*(uint16 *)&mem[offset]);
                    104:        return data;
1.1       root      105: }
                    106: 
                    107: uint64
                    108: SRAMDevice::Write8(uint32 addr, uint32 data)
                    109: {
1.1.1.3   root      110:        uint32 offset = Decoder(addr);
                    111: 
1.1       root      112:        if (writeable) {
1.1.1.3   root      113:                if (offset < 0x100) {
1.1       root      114:                        putlog(1, "更新 $%06x <- $%02x", addr, data);
                    115:                }
1.1.1.3   root      116:                mem[offset] = data;
1.1       root      117:        } else {
                    118:                putlog(1, "書き込み禁止 $%06x <- $%02x", addr, data);
                    119:        }
                    120:        return 0;
                    121: }
                    122: 
                    123: uint64
                    124: SRAMDevice::Write16(uint32 addr, uint32 data)
                    125: {
1.1.1.3   root      126:        uint32 offset = Decoder(addr);
                    127: 
1.1       root      128:        if (writeable) {
1.1.1.3   root      129:                if (offset < 0x100) {
1.1       root      130:                        putlog(1, "更新 $%06x <- $%04x", addr, data);
                    131:                }
1.1.1.3   root      132:                *(uint16 *)&mem[offset] = htobe16(data);
1.1       root      133:        } else {
                    134:                putlog(1, "書き込み禁止 $%06x <- $%04x", addr, data);
                    135:        }
                    136:        return 0;
                    137: }
                    138: 
                    139: uint64
                    140: SRAMDevice::Peek8(uint32 addr)
                    141: {
1.1.1.3   root      142:        uint32 offset = Decoder(addr);
1.1.1.4   root      143: 
                    144:        // ホストファイル起動モードなら起動アドレスとして Pluto-X を見せる。
1.1.1.8   root      145:        if (gMainApp.exec_file) {
1.1.1.4   root      146:                uint32 data = PeekHostBoot(offset);
                    147:                if ((int32)data >= 0) {
                    148:                        if ((offset & 1) == 0) {
                    149:                                data = data >> 8;
                    150:                        } else {
                    151:                                data = data & 0xff;
                    152:                        }
                    153:                        return data;
                    154:                }
                    155:        }
                    156: 
1.1.1.3   root      157:        return mem[offset];
1.1       root      158: }
                    159: 
                    160: void
                    161: SRAMDevice::write_enable(bool value)
                    162: {
                    163:        if (writeable == false && value == true) {
                    164:                putlog(1, "書き込み許可");
                    165:        } else if (writeable == true && value == false) {
                    166:                putlog(1, "書き込み禁止");
                    167:        }
                    168: 
                    169:        writeable = value;
                    170: }
1.1.1.4   root      171: 
                    172: // ホストファイル起動用の読み出し値を返す。
                    173: // offset はワード境界であること。戻り値はホストバイトオーダのワード値。
                    174: // 本来の SRAM の値を読み出してよいところについては (uint32)-1 を返す。
                    175: //
                    176: // mem[] は SRAM.DAT を直接 mmap(2) しており書き換えておくことは出来ないため、
                    177: // ホストファイル起動モードなら読み出し時に動的に値を返す。
                    178: uint32
                    179: SRAMDevice::PeekHostBoot(uint32 offset) const
                    180: {
                    181:        switch (offset) {
                    182:         case 0x0c:                     // ROM 起動アドレス(H)
                    183:                return (plutoaddr >> 16);
                    184:         case 0x0e:                     // ROM 起動アドレス(L)
                    185:                return (plutoaddr & 0xffff);
                    186:         case 0x18:                     // 起動デバイスを ROM にする
                    187:                return 0xa000;
                    188:         default:
                    189:                break;
                    190:        }
                    191:        return (uint32)-1;
                    192: }

unix.superglobalmegacorp.com

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