Mercurial > repos > blastem
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) |