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