mirror of
https://github.com/holub/mame
synced 2025-06-05 20:33:45 +03:00
fmtowns: draw sprites at end of sprite drawing time
This commit is contained in:
parent
597461aef8
commit
f4db018d8e
@ -412,19 +412,19 @@ private:
|
||||
u8 m_vram_mask_addr;
|
||||
|
||||
TIMER_CALLBACK_MEMBER(towns_cdrom_read_byte);
|
||||
TIMER_CALLBACK_MEMBER(towns_sprite_done);
|
||||
TIMER_CALLBACK_MEMBER(towns_vblank_end);
|
||||
TIMER_CALLBACK_MEMBER(draw_sprites);
|
||||
DECLARE_WRITE_LINE_MEMBER(towns_pit_out0_changed);
|
||||
DECLARE_WRITE_LINE_MEMBER(towns_pit_out1_changed);
|
||||
DECLARE_WRITE_LINE_MEMBER(pit2_out1_changed);
|
||||
uint8_t get_slave_ack(offs_t offset);
|
||||
DECLARE_WRITE_LINE_MEMBER(towns_fm_irq);
|
||||
void towns_sprite_start();
|
||||
void towns_crtc_refresh_mode();
|
||||
void towns_update_kanji_offset();
|
||||
void towns_update_palette();
|
||||
void render_sprite_4(uint32_t poffset, uint32_t coffset, uint16_t x, uint16_t y, bool xflip, bool yflip, bool xhalfsize, bool yhalfsize, bool rotation, const rectangle* rect);
|
||||
void render_sprite_16(uint32_t poffset, uint16_t x, uint16_t y, bool xflip, bool yflip, bool xhalfsize, bool yhalfsize, bool rotation, const rectangle* rect);
|
||||
void draw_sprites(const rectangle* rect);
|
||||
void towns_crtc_draw_scan_layer_hicolour(bitmap_rgb32 &bitmap,const rectangle* rect,int layer,int line,int scanline);
|
||||
void towns_crtc_draw_scan_layer_256(bitmap_rgb32 &bitmap,const rectangle* rect,int line,int scanline);
|
||||
void towns_crtc_draw_scan_layer_16(bitmap_rgb32 &bitmap,const rectangle* rect,int layer,int line,int scanline);
|
||||
|
@ -972,12 +972,13 @@ void towns_state::render_sprite_16(uint32_t poffset, uint16_t x, uint16_t y, boo
|
||||
}
|
||||
}
|
||||
|
||||
void towns_state::draw_sprites(const rectangle* rect)
|
||||
TIMER_CALLBACK_MEMBER(towns_state::draw_sprites)
|
||||
{
|
||||
uint16_t sprite_limit = (m_video.towns_sprite_reg[0] | (m_video.towns_sprite_reg[1] << 8)) & 0x3ff;
|
||||
uint16_t xoff = (m_video.towns_sprite_reg[2] | (m_video.towns_sprite_reg[3] << 8)) & 0x1ff;
|
||||
uint16_t yoff = (m_video.towns_sprite_reg[4] | (m_video.towns_sprite_reg[5] << 8)) & 0x1ff;
|
||||
uint32_t poffset,coffset;
|
||||
const rectangle *rect = &m_video.towns_crtc_layerscr[1];
|
||||
int linesize = m_video.towns_crtc_reg[24] * 4;
|
||||
|
||||
if(!(m_video.towns_sprite_reg[1] & 0x80))
|
||||
@ -1039,12 +1040,16 @@ void towns_state::draw_sprites(const rectangle* rect)
|
||||
}
|
||||
|
||||
if(m_video.towns_sprite_page == 0) // flip VRAM page
|
||||
{
|
||||
m_video.towns_sprite_page = 1;
|
||||
m_video.towns_crtc_reg[21] &= ~0x8000;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_video.towns_sprite_page = 0;
|
||||
|
||||
m_video.towns_sprite_flag = 1; // we are now drawing
|
||||
m_video.sprite_timer->adjust(m_maincpu->cycles_to_attotime(128 * (1025-sprite_limit)));
|
||||
m_video.towns_crtc_reg[21] |= 0x8000;
|
||||
}
|
||||
m_video.towns_sprite_flag = 0;
|
||||
}
|
||||
|
||||
void towns_state::towns_crtc_draw_scan_layer_hicolour(bitmap_rgb32 &bitmap,const rectangle* rect,int layer,int line,int scanline)
|
||||
@ -1465,14 +1470,11 @@ void towns_state::draw_text_layer()
|
||||
}
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(towns_state::towns_sprite_done)
|
||||
void towns_state::towns_sprite_start()
|
||||
{
|
||||
// sprite drawing is complete, lower flag
|
||||
m_video.towns_sprite_flag = 0;
|
||||
if(m_video.towns_sprite_page != 0)
|
||||
m_video.towns_crtc_reg[21] |= 0x8000;
|
||||
else
|
||||
m_video.towns_crtc_reg[21] &= ~0x8000;
|
||||
uint16_t sprite_limit = (m_video.towns_sprite_reg[0] | (m_video.towns_sprite_reg[1] << 8)) & 0x3ff;
|
||||
m_video.towns_sprite_flag = 1; // we are now drawing
|
||||
m_video.sprite_timer->adjust(m_maincpu->cycles_to_attotime(128 * (1025-sprite_limit)));
|
||||
}
|
||||
|
||||
TIMER_CALLBACK_MEMBER(towns_state::towns_vblank_end)
|
||||
@ -1492,14 +1494,14 @@ INTERRUPT_GEN_MEMBER(towns_state::towns_vsync_irq)
|
||||
if(m_video.towns_tvram_enable)
|
||||
draw_text_layer();
|
||||
if(m_video.towns_sprite_reg[1] & 0x80)
|
||||
draw_sprites(&m_video.towns_crtc_layerscr[1]);
|
||||
towns_sprite_start();
|
||||
}
|
||||
|
||||
void towns_state::video_start()
|
||||
{
|
||||
m_video.towns_vram_wplane = 0x00;
|
||||
m_video.towns_sprite_page = 0;
|
||||
m_video.sprite_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(towns_state::towns_sprite_done),this));
|
||||
m_video.sprite_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(towns_state::draw_sprites),this));
|
||||
}
|
||||
|
||||
uint32_t towns_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
|
||||
|
Loading…
Reference in New Issue
Block a user