Annotation of nono/vm/rom.cpp, revision 1.1

1.1     ! root        1: //
        !             2: // nono
        !             3: // Copyright (C) 2018 [email protected]
        !             4: //
        !             5: 
        !             6: #include <fcntl.h>
        !             7: #include <unistd.h>
        !             8: #include <sys/mman.h>
        !             9: #include "rom.h"
        !            10: #include "configfile.h"
        !            11: 
        !            12: //
        !            13: // ROM 共通部
        !            14: //
        !            15: // ROM はビッグエンディアンのままメモリに置かれるので、
        !            16: // 必要ならアクセス時に都度変換すること。
        !            17: //
        !            18: 
        !            19: ROMDevice::ROMDevice()
        !            20: {
        !            21:        logname = "rom";
        !            22: 
        !            23:        mask = 0xffffffff;
        !            24: }
        !            25: 
        !            26: ROMDevice::~ROMDevice()
        !            27: {
        !            28:        if (file) {
        !            29:                free(file);
        !            30:                file = NULL;
        !            31:        }
        !            32: }
        !            33: 
        !            34: // name の ROM を探してロードする。
        !            35: // name はパスを含まないファイル名のみ。パスはこちらで探す。
        !            36: // mem は file をさす。
        !            37: // 失敗した場合はエラーメッセージを表示して false を返す。
        !            38: bool
        !            39: ROMDevice::LoadROM(const char *name, int size)
        !            40: {
        !            41:        filename = gConfig->SearchFile(name);
        !            42:        if (filename.empty()) {
        !            43:                warn("%s: cannot find %s", devname, filename.c_str());
        !            44:                return false;
        !            45:        }
        !            46: 
        !            47:        // オープン
        !            48:        fd = open(filename.c_str(), O_RDONLY);
        !            49:        if (fd == -1) {
        !            50:                warn("%s: cannot open %s", devname, filename.c_str());
        !            51:                return false;
        !            52:        }
        !            53: 
        !            54:        // mmap
        !            55:        // ファイルには書き戻さないけど、オンメモリでハックを入れることが
        !            56:        // できるように MAP_PRIVATE を指定する。
        !            57:        filesize = size;
        !            58:        file = (uint8 *)mmap(NULL, filesize, PROT_READ | PROT_WRITE,
        !            59:                MAP_PRIVATE, fd, 0);
        !            60:        if (file == MAP_FAILED) {
        !            61:                warn("%s: cannot mmap %s", devname, filename.c_str());
        !            62:                close(fd);
        !            63:                return false;
        !            64:        }
        !            65: 
        !            66:        mem = file;
        !            67:        return true;
        !            68: }
        !            69: 
        !            70: uint64
        !            71: ROMDevice::Read8(uint32 addr)
        !            72: {
        !            73:        return mem[addr & mask];
        !            74: }
        !            75: 
        !            76: uint64
        !            77: ROMDevice::Read16(uint32 addr)
        !            78: {
        !            79:        uint16 data;
        !            80:        data = *(uint16 *)&mem[addr & mask];
        !            81:        return be16toh(data);
        !            82: }
        !            83: 
        !            84: uint64
        !            85: ROMDevice::Read32(uint32 addr)
        !            86: {
        !            87:        uint32 data;
        !            88:        data = *(uint32 *)&mem[addr & mask];
        !            89:        return be32toh(data);
        !            90: }
        !            91: 
        !            92: uint64
        !            93: ROMDevice::Write8(uint32 addr, uint32 data)
        !            94: {
        !            95:        return (uint64)-1;
        !            96: }
        !            97: 
        !            98: uint64
        !            99: ROMDevice::Write16(uint32 addr, uint32 data)
        !           100: {
        !           101:        return (uint64)-1;
        !           102: }
        !           103: 
        !           104: uint64
        !           105: ROMDevice::Write32(uint32 addr, uint32 data)
        !           106: {
        !           107:        return (uint64)-1;
        !           108: }
        !           109: 
        !           110: uint64
        !           111: ROMDevice::Peek8(uint32 addr)
        !           112: {
        !           113:        return mem[addr & mask];
        !           114: }

unix.superglobalmegacorp.com

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