trunk/src/mame/drivers/popobear.c
| r21838 | r21839 | |
| 238 | 238 | |
| 239 | 239 | /* |
| 240 | 240 | ???? ---- ---- ---- unused? |
| 241 | | ---- xxxx ---- ---- priority? |
| 241 | ---- xxxx ---- ---- priority (against other sprites! used to keep the line of characters following you in order) |
| 242 | 242 | ---- ---- x--- ---- Y direction |
| 243 | 243 | ---- ---- -x-- ---- X direction |
| 244 | 244 | ---- ---- --xx ---- size (height & width) |
| 245 | 245 | ---- ---- ---- xx-- color bank |
| 246 | | ---- ---- ---- --xx ?? |
| 246 | ---- ---- ---- --x- NOT set on the enemy character / characters in your line |
| 247 | ---- ---- ---- ---x set on opposite to above? |
| 247 | 248 | */ |
| 248 | | |
| 249 | | /* 0x106 = 8 x 8 */ |
| 250 | | /* 0x*29 = 32 x 32 */ |
| 251 | | for(i = 0x800-8;i >= 0; i-=8) |
| 249 | |
| 250 | for (int drawpri = 0xf;drawpri>=0x0;drawpri--) |
| 252 | 251 | { |
| 253 | | int y = vram[i+0x7f800+2]|(vram[i+0x7f800+3]<<8); |
| 254 | | int x = vram[i+0x7f800+4]|(vram[i+0x7f800+5]<<8); |
| 255 | | int spr_num = vram[i+0x7f800+6]|(vram[i+0x7f800+7]<<8); |
| 256 | | int param = vram[i+0x7f800+0]|(vram[i+0x7f800+1]<<8); |
| 257 | | int width = 8 << ((param & 0x30)>>4); |
| 258 | | int height = width; // sprites are always square? |
| 252 | /* 0x106 = 8 x 8 */ |
| 253 | /* 0x*29 = 32 x 32 */ |
| 254 | for(i = 0x800-8;i >= 0; i-=8) |
| 255 | { |
| 256 | int y = vram[i+0x7f800+2]|(vram[i+0x7f800+3]<<8); |
| 257 | int x = vram[i+0x7f800+4]|(vram[i+0x7f800+5]<<8); |
| 258 | int spr_num = vram[i+0x7f800+6]|(vram[i+0x7f800+7]<<8); |
| 259 | int param = vram[i+0x7f800+0]|(vram[i+0x7f800+1]<<8); |
| 260 | |
| 261 | int pri = (param & 0x0f00)>>8; |
| 262 | |
| 263 | // we do this because it's sprite<->sprite priority, |
| 264 | if (pri!=drawpri) |
| 265 | continue; |
| 259 | 266 | |
| 260 | | int color_bank = ((param & 0xc)<<4); |
| 261 | | int x_dir = param & 0x40; |
| 262 | | int y_dir = param & 0x80; |
| 267 | int width = 8 << ((param & 0x30)>>4); |
| 268 | int height = width; // sprites are always square? |
| 263 | 269 | |
| 264 | | if (x&0x8000) x-= 0x10000; |
| 265 | | if (y&0x8000) y-= 0x10000; |
| 270 | int color_bank = ((param & 0xc)<<4); |
| 271 | int x_dir = param & 0x40; |
| 272 | int y_dir = param & 0x80; |
| 266 | 273 | |
| 267 | | if(param == 0) |
| 268 | | continue; |
| 274 | if (x&0x8000) x-= 0x10000; |
| 275 | if (y&0x8000) y-= 0x10000; |
| 269 | 276 | |
| 270 | | spr_num <<= 3; |
| 277 | if (param&0xf000) color_bank = (machine().rand() & 0x3); |
| 271 | 278 | |
| 272 | | for(int yi=0;yi<height;yi++) |
| 273 | | { |
| 274 | | int y_draw = (y_dir) ? y+(height - yi) : y+yi; |
| 279 | if(param == 0) |
| 280 | continue; |
| 275 | 281 | |
| 276 | | for(int xi=0;xi<width;xi++) |
| 282 | spr_num <<= 3; |
| 283 | |
| 284 | for(int yi=0;yi<height;yi++) |
| 277 | 285 | { |
| 278 | | UINT8 pix = (vram[spr_num^1] & 0xff); |
| 279 | | int x_draw = (x_dir) ? x+(width - xi) : x+xi; |
| 286 | int y_draw = (y_dir) ? y+((height-1) - yi) : y+yi; |
| 280 | 287 | |
| 281 | | if(cliprect.contains(x_draw, y_draw) && pix) |
| 282 | | bitmap.pix16(y_draw, x_draw) = machine().pens[pix+0x100+color_bank]; |
| 288 | for(int xi=0;xi<width;xi++) |
| 289 | { |
| 290 | UINT8 pix = (vram[spr_num^1] & 0xff); |
| 291 | int x_draw = (x_dir) ? x+((width-1) - xi) : x+xi; |
| 283 | 292 | |
| 284 | | spr_num++; |
| 293 | if(cliprect.contains(x_draw, y_draw) && pix) |
| 294 | bitmap.pix16(y_draw, x_draw) = machine().pens[pix+0x100+color_bank]; |
| 295 | |
| 296 | spr_num++; |
| 297 | } |
| 285 | 298 | } |
| 286 | 299 | } |
| 287 | 300 | } |