|
|
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.