|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.