|
|
1.1 root 1: //
2: // nono
3: // Copyright (C) 2017 [email protected]
4: //
5:
6: #include "sprite.h"
7: #include <sys/time.h>
8:
9: SpriteDevice::SpriteDevice()
10: {
11: logname = "sprite";
12: devname = "Sprite";
13: devaddr = baseaddr;
14: devlen = 0x010000;
15:
1.1.1.2 ! root 16: mem.reset(new uint8[4 * 8192]);
1.1 root 17: }
18:
19: SpriteDevice::~SpriteDevice()
20: {
21: }
22:
23: uint64
24: SpriteDevice::Read8(uint32 addr)
25: {
26: if (addr >= 0xeb8000) {
27: return mem[HB(addr - 0xeb8000)];
28: }
29: PANIC("not impl");
30: }
31:
32: uint64
33: SpriteDevice::Read16(uint32 addr)
34: {
35: if (addr >= 0xeb8000) {
36: return *(uint16 *)&mem[addr - 0xeb8000];
37: }
38: if (addr < 0xeb0400) {
39: int n = (addr - 0xeb0000) / 8;
40: switch (addr % 8) {
41: case 0:
42: return reg.sprite[n].xpos;
43: case 2:
44: return reg.sprite[n].ypos;
45: case 4:
46: return reg.sprite[n].col;
47: case 6:
48: return reg.sprite[n].prw;
49: }
50: }
51: if (0xeb0800 <= addr && addr < 0xeb0812) {
52: switch (addr) {
53: case 0xeb0800:
54: return reg.bg0x;
55: case 0xeb0802:
56: return reg.bg0y;
57: case 0xeb0804:
58: return reg.bg1x;
59: case 0xeb0806:
60: return reg.bg1y;
61: case 0xeb0808:
62: return reg.bgctrl;
63: case 0xeb080a:
64: return reg.htotal;
65: case 0xeb080c:
66: return reg.hdisp;
67: case 0xeb080e:
68: return reg.vdisp;
69: case 0xeb0810:
70: return reg.res;
71: }
72: }
73:
74: return (uint64)-1;
75: }
76:
77: uint64
78: SpriteDevice::Write8(uint32 addr, uint32 data)
79: {
80: if (addr >= 0xeb8000) {
81: mem[HB(addr - 0xeb8000)] = data;
82: return 0;
83: }
84: PANIC("not impl");
85: }
86:
87: uint64
88: SpriteDevice::Write16(uint32 addr, uint32 data)
89: {
90: putlog(2, "Write16 $%06x <- $%04x", addr, data);
91: if (addr >= 0xeb8000) {
92: *(uint16 *)&mem[addr - 0xeb8000] = data;
93: return 0;
94: }
95: if (addr < 0xeb0400) {
96: int n = (addr - 0xeb0000) / 8;
97: switch (addr % 8) {
98: case 0:
99: reg.sprite[n].xpos = data & 0x3ff;
100: break;
101: case 2:
102: reg.sprite[n].ypos = data & 0x3ff;
103: break;
104: case 4:
105: reg.sprite[n].col = data & 0xcfff;
106: break;
107: case 6:
108: reg.sprite[n].prw = data & 0x3;
109: break;
110: }
111: return 0;
112: }
113: if (0xeb0800 <= addr && addr < 0xeb0812) {
114: switch (addr) {
115: case 0xeb0800:
116: reg.bg0x = data & 0x3ff;
117: break;
118: case 0xeb0802:
119: reg.bg0y = data & 0x3ff;
120: break;
121: case 0xeb0804:
122: reg.bg1x = data & 0x3ff;
123: break;
124: case 0xeb0806:
125: reg.bg1y = data & 0x3ff;
126: break;
127: case 0xeb0808:
128: reg.bgctrl = data & 0x23f;
129: break;
130: case 0xeb080a:
131: reg.htotal = data & 0xff;
132: break;
133: case 0xeb080c:
134: reg.hdisp = data & 0x3f;
135: break;
136: case 0xeb080e:
137: reg.vdisp = data & 0xff;
138: break;
139: case 0xeb0810:
140: reg.res = data & 0x1f;
141: break;
142: }
143: return 0;
144: }
145:
146: return (uint64)-1;
147: }
148:
149: uint64
150: SpriteDevice::Peek8(uint32 addr)
151: {
152: if (addr >= 0xeb8000) {
153: return mem[HB(addr - 0xeb8000)];
154: }
155: if (addr < 0xeb0400) {
156: int n = (addr - 0xeb0000) / 8;
157: switch (addr % 8) {
158: case 0:
159: return reg.sprite[n].xpos;
160: case 2:
161: return reg.sprite[n].ypos;
162: case 4:
163: return reg.sprite[n].col;
164: case 6:
165: return reg.sprite[n].prw;
166: }
167: }
168: if (0xeb0800 <= addr && addr < 0xeb0812) {
169: switch (addr) {
170: case 0xeb0800:
171: return reg.bg0x;
172: case 0xeb0802:
173: return reg.bg0y;
174: case 0xeb0804:
175: return reg.bg1x;
176: case 0xeb0806:
177: return reg.bg1y;
178: case 0xeb0808:
179: return reg.bgctrl;
180: case 0xeb080a:
181: return reg.htotal;
182: case 0xeb080c:
183: return reg.hdisp;
184: case 0xeb080e:
185: return reg.vdisp;
186: case 0xeb0810:
187: return reg.res;
188: }
189: }
190:
191: return (uint64)-1;
192: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.