11 void load_attribute(unsigned char bank, int tile_index, struct palette *plt);
12 void load_pattern(unsigned char bank, unsigned char ptn_index, struct tile_2* pattern);
13 void load_spr_attribute(struct sprite_attr sa, struct palette *plt);
15 struct tile_rgb15_line {
20 struct tile_rgb15_line l[8];
23 static struct tile_rgb15 *vscreen;
25 static unsigned char bg_pattern_bank;
26 static unsigned char spr_pattern_bank;
27 static unsigned short name_tbl_base;
29 void vscreenn_dot_get(int x, int y, struct rgb15 *col) {
30 int tile_id, tile_id_x, tile_id_y;
32 struct tile_rgb15* tile;
34 tile_id_x = x / TILE_DOT_SIZE;
35 tile_id_y = y / TILE_DOT_SIZE;
36 tile_id = tile_id_x + tile_id_y * H_SCREEN_TILE_SIZE;
37 tile = vscreen + tile_id;
39 inner_x = x % TILE_DOT_SIZE;
40 inner_y = y % TILE_DOT_SIZE;
41 *col = tile->l[inner_y].d[inner_x];
44 void vscreenn_dot_set(int x, int y, struct rgb15 *col) {
45 int tile_id, tile_id_x, tile_id_y;
47 struct tile_rgb15* tile;
49 tile_id_x = x / TILE_DOT_SIZE;
50 tile_id_y = y / TILE_DOT_SIZE;
51 tile_id = tile_id_x + tile_id_y * H_SCREEN_TILE_SIZE;
52 tile = vscreen + tile_id;
54 inner_x = x % TILE_DOT_SIZE;
55 inner_y = y % TILE_DOT_SIZE;
56 tile->l[inner_y].d[inner_x] = *col;
59 static int pal_index(struct tile_2 *ptn, int l, int dot_x) {
62 return ptn->b0.l[l].dot0 * 2 + ptn->b1.l[l].dot0;
64 return ptn->b0.l[l].dot1 * 2 + ptn->b1.l[l].dot1;
66 return ptn->b0.l[l].dot2 * 2 + ptn->b1.l[l].dot2;
68 return ptn->b0.l[l].dot3 * 2 + ptn->b1.l[l].dot3;
70 return ptn->b0.l[l].dot4 * 2 + ptn->b1.l[l].dot4;
72 return ptn->b0.l[l].dot5 * 2 + ptn->b1.l[l].dot5;
74 return ptn->b0.l[l].dot6 * 2 + ptn->b1.l[l].dot6;
77 return ptn->b0.l[l].dot7 * 2 + ptn->b1.l[l].dot7;
81 void set_bgtile(int tile_id) {
84 unsigned char name_index;
85 struct tile_rgb15* set_data;
88 load_attribute(0, tile_id, &plt);
90 name_index = vram_data_get(name_tbl_base + tile_id);
91 load_pattern(bg_pattern_bank, name_index, &ptn);
93 set_data = vscreen + tile_id;
94 for (i = 0; i < TILE_DOT_SIZE; i++) {
95 //display shows left to right with high bit to low bit
96 for (j = 0; j < 8; j++) {
97 int pi = pal_index(&ptn, i, j);
99 //dprint("%d, %d, colind:%d\n", j, i, pi);
100 set_data->l[i].d[7 - j] = plt.col[pi];
107 void set_sprite(int x, int y, int tile_id, struct sprite_attr sa) {
112 load_spr_attribute(sa, &plt);
114 load_pattern(spr_pattern_bank, tile_id, &ptn);
116 //display shows left to right with high bit to low bit
117 for (i = 0; i < TILE_DOT_SIZE; i++) {
120 for (j = 0; j < 8; j++) {
121 int pi = pal_index(&ptn, i, j);
123 vscreenn_dot_set(x + j, y + 7 - i, &plt.col[pi]);
127 for (j = 0; j < 8; j++) {
128 int pi = pal_index(&ptn, i, j);
130 vscreenn_dot_set(x + j, y + i, &plt.col[pi]);
136 for (j = 0; j < 8; j++) {
137 int pi = pal_index(&ptn, i, j);
139 vscreenn_dot_set(x + 7 - j, y + 7 - i, &plt.col[pi]);
143 for (j = 0; j < 8; j++) {
144 int pi = pal_index(&ptn, i, j);
146 vscreenn_dot_set(x + 7 - j, y + i, &plt.col[pi]);
153 void set_bg_pattern_bank(unsigned char bank) {
154 bg_pattern_bank = bank;
156 void set_spr_pattern_bank(unsigned char bank) {
157 spr_pattern_bank = bank;
159 void set_name_tbl_base(unsigned char sw) {
162 name_tbl_base = NAME0_START;
165 name_tbl_base = NAME1_START;
168 name_tbl_base = NAME2_START;
172 name_tbl_base = NAME3_START;
177 int vscreen_init(void) {
179 spr_pattern_bank = 0;
180 name_tbl_base = NAME0_START;
182 vscreen = (struct tile_rgb15 *) malloc(
183 sizeof (struct tile_rgb15) * VIRT_SCREEN_TILE_SIZE * VIRT_SCREEN_TILE_SIZE);
186 memset(vscreen, 0, sizeof (struct tile_rgb15) * VIRT_SCREEN_TILE_SIZE * VIRT_SCREEN_TILE_SIZE);
188 //dprint("tile_1_line:%d tile_2 size:%d\n", sizeof(struct tile_1_line), sizeof(struct tile_2));
193 void clean_vscreen(void) {