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

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

unix.superglobalmegacorp.com

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