@@ -776,8 +776,10 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi
776776 // TODO: check on real HW
777777 static const int ysizes_table[16 ] = {
778778 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ,
779- // 0x9: speedyd intro dash frame
780- 11 ,
779+ // 0x9: speedyd intro dash frame, speedyd bonus stages, boomzoo intro
780+ // 11 would be more logical for former, except it will break latter and
781+ // is confirmed to "cut" feet anyway.
782+ 10 ,
781783 // 0xa: A'Can logo
782784 12 ,
783785 // 0xb/0xc: jttlaugh stage 1-3 (particularly on the web scrolling jump platforms)
@@ -819,7 +821,7 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi
819821 if (y >= 0x180 ) y -= 0x200 ;
820822 if (x >= 0x180 ) x -= 0x200 ;
821823
822- if ((vram[i + 0 ] & 0x4000 ))
824+ if ((vram[i + 0 ] & 0x4000 ) && sprite_ptr )
823825 {
824826 int xsize = 1 << (vram[i + 1 ] & 7 );
825827 int ysize = ysizes_table[(vram[i + 0 ] & 0x1e00 ) >> 9 ];
@@ -853,6 +855,10 @@ void supracan_state::draw_sprites(bitmap_ind16 &bitmap, bitmap_ind8 &maskmap, bi
853855 for (int xtile = 0 ; xtile < xsize; xtile++)
854856 {
855857 uint16_t data = vram[((sprite_ptr << 1 ) + ytile * xsize + xtile) & VRAM_MASK ];
858+ // magipool will draw garbage during gameplay if we don't skip empty entries.
859+ // NOTE: sets up both main table pointer and sub entries
860+ if (data == 0 )
861+ continue ;
856862 int tile = (bank * bank_size) + (data & 0x03ff );
857863 int palette = (data & 0xf000 ) >> 12 ;
858864
0 commit comments