OSDN Git Service

cc1bc12a8f395f81df306cc502fed61fc3d7cfda
[motonesemu/motonesemu.git] / emulator / ppucore / vram.c
1 #include <stddef.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 #include "tools.h"
6 #include "ppucore.h"
7 #include "vram.h"
8
9 void palette_index_to_rgb15(int bank, unsigned char index, struct rgb15* rgb);
10
11 #define PATTERN_TBL_SIZE    0x1000
12 #define NAME_TBL_SIZE       V_SCREEN_TILE_SIZE * H_SCREEN_TILE_SIZE
13 #define ATTR_TBL_SIZE       (VIRT_SCREEN_TILE_SIZE * VIRT_SCREEN_TILE_SIZE \
14                             / ATTR_GROUP_UNIT / ATTR_UNIT_PER_BYTE)
15 #define PALETTE_TBL_SIZE    16
16 #define SPRITE_RAM_SIZE     0xff
17
18 #define PATTERN_ADDR_MASK       (PATTERN_TBL_SIZE - 1)
19 #define NAME_TBL_ADDR_MASK      (NAME_TBL_SIZE - 1)
20 #define ATTR_TBL_ADDR_MASK      (ATTR_TBL_SIZE - 1)
21 #define PALETTE_TBL_ADDR_MASK   (PALETTE_TBL_SIZE - 1)
22 #define SPR_RAM_ADDR_MASK       (SPRITE_RAM_SIZE - 1)
23
24 /*vram definition*/
25 static unsigned char * sprite_ram;
26
27 static unsigned char * img_palette_tbl;
28 static unsigned char * spr_palette_tbl;
29
30 static unsigned char * name_tbl0;
31 static unsigned char * name_tbl1;
32 static unsigned char * name_tbl2;
33 static unsigned char * name_tbl3;
34
35 static unsigned char * attr_tbl0;
36 static unsigned char * attr_tbl1;
37 static unsigned char * attr_tbl2;
38 static unsigned char * attr_tbl3;
39
40 static unsigned char * pattern_tbl0;
41 static unsigned char * pattern_tbl1;
42
43 /*
44  * VRAM get/set functions....
45  *
46  * */
47
48 unsigned char pattern_tbl_get(unsigned char bank, unsigned short addr) {
49     addr = addr & PATTERN_ADDR_MASK;
50     if (bank == 0)
51         return pattern_tbl0[addr];
52     else
53         return pattern_tbl1[addr];
54 }
55
56 unsigned char name_tbl_get(unsigned char bank, unsigned short addr) {
57     addr = addr & NAME_TBL_ADDR_MASK;
58     if (bank == 0)
59         return name_tbl0[addr];
60     else if (bank == 1)
61         return name_tbl1[addr];
62     else if (bank == 2)
63         return name_tbl2[addr];
64     else
65         return name_tbl3[addr];
66 }
67
68 void name_tbl_set(unsigned char bank, unsigned short addr, unsigned char data) {
69     addr = addr & NAME_TBL_ADDR_MASK;
70     if (bank == 0)
71         name_tbl0[addr] = data;
72     else if (bank == 1)
73         name_tbl1[addr] = data;
74     else if (bank == 2)
75         name_tbl2[addr] = data;
76     else
77         name_tbl3[addr] = data;
78 }
79
80
81 unsigned char attr_tbl_get(unsigned char bank, unsigned short addr) {
82     addr = addr & ATTR_TBL_ADDR_MASK;
83     if (bank == 0)
84         return attr_tbl0[addr];
85     else if (bank == 1)
86         return attr_tbl1[addr];
87     else if (bank == 2)
88         return attr_tbl2[addr];
89     else
90         return attr_tbl3[addr];
91 }
92
93 void attr_tbl_set(unsigned char bank, unsigned short addr, unsigned char data) {
94     addr = addr & ATTR_TBL_ADDR_MASK;
95     if (bank == 0)
96         attr_tbl0[addr] = data;
97     else if (bank == 1)
98         attr_tbl1[addr] = data;
99     else if (bank == 2)
100         attr_tbl2[addr] = data;
101     else
102         attr_tbl3[addr] = data;
103 }
104
105
106 unsigned char spr_palette_tbl_get(unsigned short addr) {
107     addr = addr & PALETTE_TBL_ADDR_MASK;
108     return spr_palette_tbl[addr];
109 }
110
111 void spr_palette_tbl_set(unsigned short addr, unsigned char data) {
112     addr = addr & PALETTE_TBL_ADDR_MASK;
113     spr_palette_tbl[addr] = data;
114 }
115
116 unsigned char img_palette_tbl_get(unsigned short addr) {
117     addr = addr & PALETTE_TBL_ADDR_MASK;
118     return img_palette_tbl[addr];
119 }
120
121 void img_palette_tbl_set(unsigned short addr, unsigned char data) {
122     addr = addr & PALETTE_TBL_ADDR_MASK;
123     img_palette_tbl[addr] = data;
124 }
125
126
127 unsigned char spr_ram_tbl_get(unsigned short addr) {
128     addr = addr & SPR_RAM_ADDR_MASK;
129     return sprite_ram[addr];
130 }
131
132 void spr_ram_tbl_set(unsigned short addr, unsigned char data) {
133     addr = addr & SPR_RAM_ADDR_MASK;
134     sprite_ram[addr] = data;
135 }
136
137 /* VRAM manipulation... */
138
139 void load_attribute(unsigned char bank, int tile_index, struct palette *plt) {
140     int gp_index;
141     int unit_index;
142     unsigned char data;
143     struct palette_unit pu;
144     int palette_group;
145     unsigned short palette_addr;
146     unsigned char pi;
147
148     gp_index = tile_index / ATTR_GROUP_UNIT / ATTR_UNIT_PER_BYTE;
149     unit_index = tile_index / ATTR_GROUP_UNIT;
150     data = attr_tbl_get(bank, gp_index);
151     pu = *(struct palette_unit*)&data;
152
153     switch(unit_index) {
154         case 0:
155             palette_group = pu.bit01;
156             break;
157         case 1:
158             palette_group = pu.bit23;
159             break;
160         case 2:
161             palette_group = pu.bit45;
162             break;
163         default:
164             palette_group = pu.bit67;
165             break;
166     }
167
168     /*load bg rgb palette color*/
169     palette_addr = palette_group * 4;
170     pi = img_palette_tbl_get(palette_addr++);
171     palette_index_to_rgb15(0, pi, &plt->col[0]);
172     pi = img_palette_tbl_get(palette_addr++);
173     palette_index_to_rgb15(0, pi, &plt->col[1]);
174     pi = img_palette_tbl_get(palette_addr++);
175     palette_index_to_rgb15(0, pi, &plt->col[2]);
176     pi = img_palette_tbl_get(palette_addr);
177     palette_index_to_rgb15(0, pi, &plt->col[3]);
178
179 }
180
181 /*
182  * pattern index: 0 - 255
183  * */
184 void load_pattern(unsigned char bank, unsigned char ptn_index, struct tile_2* pattern) {
185     int i;
186     unsigned char data;
187     unsigned char *p;
188     unsigned short addr;
189
190     //load character pattern
191     p = (unsigned char*)pattern;
192     addr = ptn_index * sizeof(struct tile_2);
193     for (i = 0; i < sizeof(struct tile_2); i++) {
194         data = pattern_tbl_get(bank, addr);
195         *p = data;
196         p++;
197     }
198 }
199
200
201 int load_chr_rom(FILE* cartridge, int num_rom_bank) {
202     int len;
203
204     len = fread(pattern_tbl0, 1, PATTERN_TBL_SIZE, cartridge);
205     if (len != PATTERN_TBL_SIZE)
206         return FALSE;
207
208     len = fread(pattern_tbl1, 1, PATTERN_TBL_SIZE, cartridge);
209     if (len != PATTERN_TBL_SIZE)
210         return FALSE;
211
212     return TRUE;
213 }
214
215 int vram_init(void) {
216     name_tbl2 = NULL;
217     name_tbl3 = NULL;
218
219     attr_tbl2 = NULL;
220     attr_tbl3 = NULL;
221     
222
223     pattern_tbl0 = malloc(PATTERN_TBL_SIZE);
224     if (pattern_tbl0 == NULL)
225         return FALSE;
226
227     pattern_tbl1 = malloc(PATTERN_TBL_SIZE);
228     if (pattern_tbl1 == NULL)
229         return FALSE;
230
231     sprite_ram = malloc(SPRITE_RAM_SIZE);
232     if (sprite_ram == NULL)
233         return FALSE;
234
235     name_tbl0 = malloc(NAME_TBL_SIZE);
236     if (name_tbl0 == NULL)
237         return FALSE;
238
239     name_tbl1 = malloc(NAME_TBL_SIZE);
240     if (name_tbl1 == NULL)
241         return FALSE;
242
243     attr_tbl0 = malloc(ATTR_TBL_SIZE);
244     if (attr_tbl0 == NULL)
245         return FALSE;
246
247     attr_tbl1 = malloc(ATTR_TBL_SIZE);
248     if (attr_tbl1 == NULL)
249         return FALSE;
250
251     img_palette_tbl = malloc(PALETTE_TBL_SIZE);
252     if (img_palette_tbl == NULL)
253         return FALSE;
254
255     spr_palette_tbl = malloc(PALETTE_TBL_SIZE);
256     if (spr_palette_tbl == NULL)
257         return FALSE;
258
259     return TRUE;
260 }
261
262 void clean_vram(void) {
263
264     free(pattern_tbl0);
265     free(pattern_tbl1);
266
267     free(sprite_ram);
268
269     free(name_tbl0);
270     free(name_tbl1);
271
272     free(attr_tbl0);
273     free(attr_tbl1);
274
275     free(img_palette_tbl);
276     free(spr_palette_tbl);
277
278 }
279
280