comparison vdp.c @ 22:f090a98ccb7e

Sprites fixed, working on bg planes
author Mike Pavone <pavone@retrodev.com>
date Sat, 08 Dec 2012 11:59:50 -0800
parents 72ce60cb1711
children 3e924bb56560
comparison
equal deleted inserted replaced
21:72ce60cb1711 22:f090a98ccb7e
61 uint16_t address = context->sprite_index * 8 + sat_address; 61 uint16_t address = context->sprite_index * 8 + sat_address;
62 int16_t y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) - 128; 62 int16_t y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) - 128;
63 uint8_t height = ((context->vdpmem[address+2] & 0x3) + 1) * 8; 63 uint8_t height = ((context->vdpmem[address+2] & 0x3) + 1) * 8;
64 //printf("Sprite %d | y: %d, height: %d\n", context->sprite_index, y, height); 64 //printf("Sprite %d | y: %d, height: %d\n", context->sprite_index, y, height);
65 if (y <= line && line < (y + height)) { 65 if (y <= line && line < (y + height)) {
66 printf("Sprite %d at y: %d with height %d is on line %d\n", context->sprite_index, y, height, line); 66 //printf("Sprite %d at y: %d with height %d is on line %d\n", context->sprite_index, y, height, line);
67 context->sprite_info_list[--(context->slot_counter)].size = context->vdpmem[address+2]; 67 context->sprite_info_list[--(context->slot_counter)].size = context->vdpmem[address+2];
68 context->sprite_info_list[context->slot_counter].index = context->sprite_index; 68 context->sprite_info_list[context->slot_counter].index = context->sprite_index;
69 context->sprite_info_list[context->slot_counter].y = y; 69 context->sprite_info_list[context->slot_counter].y = y;
70 } 70 }
71 context->sprite_index = context->vdpmem[address+3] & 0x7F; 71 context->sprite_index = context->vdpmem[address+3] & 0x7F;
73 { 73 {
74 address = context->sprite_index * 8 + sat_address; 74 address = context->sprite_index * 8 + sat_address;
75 y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) - 128; 75 y = ((context->vdpmem[address] & 0x3) << 8 | context->vdpmem[address+1]) - 128;
76 height = ((context->vdpmem[address+2] & 0x3) + 1) * 8; 76 height = ((context->vdpmem[address+2] & 0x3) + 1) * 8;
77 if (y <= line && line < (y + height)) { 77 if (y <= line && line < (y + height)) {
78 printf("Sprite %d at y: %d with height %d is on line %d\n", context->sprite_index, y, height, line); 78 //printf("Sprite %d at y: %d with height %d is on line %d\n", context->sprite_index, y, height, line);
79 context->sprite_info_list[--(context->slot_counter)].size = context->vdpmem[address+2]; 79 context->sprite_info_list[--(context->slot_counter)].size = context->vdpmem[address+2];
80 context->sprite_info_list[context->slot_counter].index = context->sprite_index; 80 context->sprite_info_list[context->slot_counter].index = context->sprite_index;
81 context->sprite_info_list[context->slot_counter].y = y; 81 context->sprite_info_list[context->slot_counter].y = y;
82 } 82 }
83 context->sprite_index = context->vdpmem[address+3] & 0x7F; 83 context->sprite_index = context->vdpmem[address+3] & 0x7F;
101 if (tileinfo & MAP_BIT_V_FLIP) { 101 if (tileinfo & MAP_BIT_V_FLIP) {
102 row = (context->sprite_info_list[context->cur_slot].y + height - 1) - line; 102 row = (context->sprite_info_list[context->cur_slot].y + height - 1) - line;
103 } else { 103 } else {
104 row = line-context->sprite_info_list[context->cur_slot].y; 104 row = line-context->sprite_info_list[context->cur_slot].y;
105 } 105 }
106 uint16_t address = ((tileinfo & 0x7FF) << 5) + (row & 0x7) * 4 + (row & 0x18) * width * 4; 106 //uint16_t address = ((tileinfo & 0x7FF) << 5) + (row & 0x7) * 4 + (row & 0x18) * width * 4;
107 uint16_t address = ((tileinfo & 0x7FF) << 5) + row * 4;
107 int16_t x = ((context->vdpmem[att_addr+ 2] & 0x3) << 8) | context->vdpmem[att_addr + 3]; 108 int16_t x = ((context->vdpmem[att_addr+ 2] & 0x3) << 8) | context->vdpmem[att_addr + 3];
108 if (x) { 109 if (x) {
109 x -= 128; 110 x -= 128;
110 printf("Sprite %d | x: %d, y: %d, width: %d, height: %d, pal_priority: %X, row: %d, tile addr: %X\n", context->sprite_info_list[context->cur_slot].index, x, context->sprite_info_list[context->cur_slot].y, width, height, pal_priority, row, address); 111 int16_t base_x = x;
111 for (;width && context->sprite_draws; --width, --context->sprite_draws, address += 32, x += 8) { 112 //printf("Sprite %d | x: %d, y: %d, width: %d, height: %d, pal_priority: %X, row: %d, tile addr: %X\n", context->sprite_info_list[context->cur_slot].index, x, context->sprite_info_list[context->cur_slot].y, width, height, pal_priority, row, address);
112 context->sprite_draw_list[context->sprite_draws].address = address; 113 for (;width && context->sprite_draws; --width, --context->sprite_draws, x += 8) {
114 context->sprite_draw_list[context->sprite_draws].address = address + ((x-base_x) / 8) * height * 4;
113 context->sprite_draw_list[context->sprite_draws].x_pos = x; 115 context->sprite_draw_list[context->sprite_draws].x_pos = x;
114 context->sprite_draw_list[context->sprite_draws].pal_priority = pal_priority; 116 context->sprite_draw_list[context->sprite_draws].pal_priority = pal_priority;
115 context->sprite_draw_list[context->sprite_draws].h_flip = (tileinfo & MAP_BIT_H_FLIP) ? 1 : 0; 117 context->sprite_draw_list[context->sprite_draws].h_flip = (tileinfo & MAP_BIT_H_FLIP) ? 1 : 0;
116 } 118 }
117 context->cur_slot--; 119 context->cur_slot--;
170 case 0x3: 172 case 0x3:
171 hscroll_mask = 0x3F8; 173 hscroll_mask = 0x3F8;
172 v_mul = 256; 174 v_mul = 256;
173 break; 175 break;
174 } 176 }
175 uint16_t hscroll = (hscroll_val + (column-1) * 8) & hscroll_mask; 177 uint16_t hscroll = (hscroll_val + (column-2) * 8) & hscroll_mask;
176 uint16_t offset = address + ((vscroll * v_mul + hscroll/4) & 0x1FFF); 178 uint16_t offset = address + ((vscroll * v_mul + hscroll/4) & 0x1FFF);
177 //printf("A | line: %d, col: %d, x: %d, hs_mask %X, v_mul: %d, scr reg: %X, tbl addr: %X\n", line, column, hscroll, hscroll_mask, v_mul, context->regs[REG_SCROLL], offset); 179 //printf("A | line: %d, col: %d, x: %d, hs_mask %X, v_mul: %d, scr reg: %X, tbl addr: %X\n", line, column, hscroll, hscroll_mask, v_mul, context->regs[REG_SCROLL], offset);
178 context->col_1 = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1]; 180 context->col_1 = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1];
179 hscroll = (hscroll_val + column * 8) & hscroll_mask; 181 hscroll = (hscroll_val + (column-1) * 8) & hscroll_mask;
180 offset = address + ((vscroll * v_mul + hscroll/4) & 0x1FFF); 182 offset = address + ((vscroll * v_mul + hscroll/4) & 0x1FFF);
181 context->col_2 = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1]; 183 context->col_2 = (context->vdpmem[offset] << 8) | context->vdpmem[offset+1];
182 } 184 }
183 185
184 void read_map_scroll_a(uint16_t column, uint32_t line, vdp_context * context) 186 void read_map_scroll_a(uint16_t column, uint32_t line, vdp_context * context)