Annotation of nono/vm/romimg.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 <sys/stat.h>
        !            10: #include "romimg.h"
        !            11: #include "mainapp.h"
        !            12: 
        !            13: //
        !            14: // ROM 共通部
        !            15: //
        !            16: // ROM はビッグエンディアンのままメモリに置かれるので、
        !            17: // 必要ならアクセス時に都度変換すること。
        !            18: //
        !            19: 
        !            20: ROMDevice::ROMDevice()
        !            21: {
        !            22:        logname = "rom";
        !            23: 
        !            24:        mask = 0xffffffff;
        !            25:        fd = -1;
        !            26: }
        !            27: 
        !            28: ROMDevice::~ROMDevice()
        !            29: {
        !            30:        if (file) {
        !            31:                munmap(file, filesize);
        !            32:                file = NULL;
        !            33:        }
        !            34:        if (fd != 0) {
        !            35:                close(fd);
        !            36:                fd = -1;
        !            37:        }
        !            38: }
        !            39: 
        !            40: // name の ROM を探してロードする。
        !            41: // name はパスを含まないファイル名のみ。パスはこちらで探す。
        !            42: // mem は file をさす。
        !            43: // 失敗した場合はエラーメッセージを表示して false を返す。
        !            44: bool
        !            45: ROMDevice::LoadROM(const char *name, int size)
        !            46: {
        !            47:        struct stat st;
        !            48: 
        !            49:        filename = gMainApp.SearchFile(name);
        !            50:        if (filename.empty()) {
        !            51:                warnx("%s not found", name);
        !            52:                return false;
        !            53:        }
        !            54: 
        !            55:        // オープン
        !            56:        fd = open(filename.c_str(), O_RDONLY);
        !            57:        if (fd == -1) {
        !            58:                warn("ROM \"%s\" open failed", filename.c_str());
        !            59:                return false;
        !            60:        }
        !            61: 
        !            62:        // ファイルサイズをチェック。
        !            63:        // ファイルが短くても mmap はしれっと成功してしまうようだ。
        !            64:        if (fstat(fd, &st) == -1) {
        !            65:                warn("ROM \"%s\" fstat failed", filename.c_str());
        !            66:                close(fd);
        !            67:                return false;
        !            68:        }
        !            69:        if (st.st_size < size) {
        !            70:                warnx("ROM \"%s\" is too short (filesize is expected %d but %d)",
        !            71:                        filename.c_str(), size, (int)st.st_size);
        !            72:                close(fd);
        !            73:                return false;
        !            74:        }
        !            75:        if (st.st_size > size) {
        !            76:                // 大きすぎるほうはワーニングだけでいいか
        !            77:                warnx("ROM \"%s\" is too large (ignore %d bytes)",
        !            78:                        filename.c_str(), (int)st.st_size - size);
        !            79:        }
        !            80: 
        !            81:        // mmap
        !            82:        // ファイルには書き戻さないけど、オンメモリでハックを入れることが
        !            83:        // できるように MAP_PRIVATE を指定する。
        !            84:        filesize = size;
        !            85:        file = (uint8 *)mmap(NULL, filesize, PROT_READ | PROT_WRITE,
        !            86:                MAP_PRIVATE, fd, 0);
        !            87:        if (file == MAP_FAILED) {
        !            88:                warn("ROM \"%s\" mmap failed", filename.c_str());
        !            89:                close(fd);
        !            90:                return false;
        !            91:        }
        !            92: 
        !            93:        mem = file;
        !            94:        return true;
        !            95: }
        !            96: 
        !            97: uint64
        !            98: ROMDevice::Read8(uint32 addr)
        !            99: {
        !           100:        return mem[addr & mask];
        !           101: }
        !           102: 
        !           103: uint64
        !           104: ROMDevice::Read16(uint32 addr)
        !           105: {
        !           106:        uint16 data;
        !           107:        data = *(uint16 *)&mem[addr & mask];
        !           108:        return be16toh(data);
        !           109: }
        !           110: 
        !           111: uint64
        !           112: ROMDevice::Read32(uint32 addr)
        !           113: {
        !           114:        uint32 data;
        !           115:        data = *(uint32 *)&mem[addr & mask];
        !           116:        return be32toh(data);
        !           117: }
        !           118: 
        !           119: uint64
        !           120: ROMDevice::Write8(uint32 addr, uint32 data)
        !           121: {
        !           122:        return (uint64)-1;
        !           123: }
        !           124: 
        !           125: uint64
        !           126: ROMDevice::Write16(uint32 addr, uint32 data)
        !           127: {
        !           128:        return (uint64)-1;
        !           129: }
        !           130: 
        !           131: uint64
        !           132: ROMDevice::Write32(uint32 addr, uint32 data)
        !           133: {
        !           134:        return (uint64)-1;
        !           135: }
        !           136: 
        !           137: uint64
        !           138: ROMDevice::Peek8(uint32 addr)
        !           139: {
        !           140:        return mem[addr & mask];
        !           141: }

unix.superglobalmegacorp.com

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