Annotation of nono/vm/rom.cpp, revision 1.1.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.