mirror of
https://github.com/0ldsk00l/smsplus.git
synced 2025-04-02 10:32:07 -04:00
183 lines
4.1 KiB
C
183 lines
4.1 KiB
C
/*
|
|
Copyright (C) 1998-2004 Charles MacDonald
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "shared.h"
|
|
|
|
bitmap_t bitmap;
|
|
cart_t cart;
|
|
input_t input;
|
|
|
|
/* Run the virtual console emulation for one frame */
|
|
void system_frame(int skip_render)
|
|
{
|
|
static int iline_table[] = {0xC0, 0xE0, 0xF0};
|
|
int lpf = (sms.display == DISPLAY_NTSC) ? 262 : 313;
|
|
int iline;
|
|
|
|
/* Debounce pause key */
|
|
if(input.system & INPUT_PAUSE)
|
|
{
|
|
if(!sms.paused)
|
|
{
|
|
sms.paused = 1;
|
|
|
|
z80_set_irq_line(IRQ_LINE_NMI, ASSERT_LINE);
|
|
z80_set_irq_line(IRQ_LINE_NMI, CLEAR_LINE);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
sms.paused = 0;
|
|
}
|
|
|
|
text_counter = 0;
|
|
|
|
/* End of frame, parse sprites for line 0 on line 261 (VCount=$FF) */
|
|
if(vdp.mode <= 7)
|
|
parse_line(0);
|
|
|
|
for(vdp.line = 0; vdp.line < lpf;)
|
|
{
|
|
z80_execute(227);
|
|
|
|
iline = iline_table[vdp.extended];
|
|
|
|
if(!skip_render)
|
|
{
|
|
render_line(vdp.line);
|
|
}
|
|
|
|
if(vdp.line <= iline)
|
|
{
|
|
vdp.left -= 1;
|
|
if(vdp.left == -1)
|
|
{
|
|
vdp.left = vdp.reg[0x0A];
|
|
vdp.hint_pending = 1;
|
|
|
|
z80_execute(16);
|
|
|
|
if(vdp.reg[0x00] & 0x10)
|
|
{
|
|
z80_set_irq_line(0, ASSERT_LINE);
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
vdp.left = vdp.reg[0x0A];
|
|
}
|
|
|
|
if(vdp.line == iline)
|
|
{
|
|
vdp.status |= 0x80;
|
|
vdp.vint_pending = 1;
|
|
|
|
z80_execute(16);
|
|
|
|
if(vdp.reg[0x01] & 0x20)
|
|
{
|
|
z80_set_irq_line(0, ASSERT_LINE);
|
|
}
|
|
}
|
|
|
|
sound_update(vdp.line);
|
|
|
|
++vdp.line;
|
|
|
|
if(vdp.mode <= 7)
|
|
parse_line(vdp.line);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
void system_init(void)
|
|
{
|
|
error_init();
|
|
|
|
sms_init();
|
|
pio_init();
|
|
vdp_init();
|
|
render_init();
|
|
sound_init();
|
|
|
|
sms.save = 0;
|
|
}
|
|
|
|
void system_shutdown(void)
|
|
{
|
|
#ifdef DEBUG
|
|
int i;
|
|
|
|
error("PC:%04X\tSP:%04X\n", z80_get_reg(Z80_PC), z80_get_reg(Z80_SP));
|
|
error("AF:%04X\tAF:%04X\n", z80_get_reg(Z80_AF), z80_get_reg(Z80_AF2));
|
|
error("BC:%04X\tBC:%04X\n", z80_get_reg(Z80_BC), z80_get_reg(Z80_BC2));
|
|
error("DE:%04X\tDE:%04X\n", z80_get_reg(Z80_DE), z80_get_reg(Z80_DE2));
|
|
error("HL:%04X\tHL:%04X\n", z80_get_reg(Z80_HL), z80_get_reg(Z80_HL2));
|
|
error("IX:%04X\tIY:%04X\n", z80_get_reg(Z80_IX), z80_get_reg(Z80_IY));
|
|
|
|
for(i = 0; i <= 0x0A; i++)
|
|
error("%02X ", vdp.reg[i]);
|
|
error("\n");
|
|
|
|
error("MODE:%02X\n", vdp.mode & 7);
|
|
error("PN:%04X\n", vdp.pn);
|
|
error("CT:%04X\n", vdp.ct);
|
|
error("PG:%04X\n", vdp.pg);
|
|
error("SA:%04X\n", vdp.sa);
|
|
error("SG:%04X\n", vdp.sg);
|
|
|
|
error("\n");
|
|
|
|
|
|
|
|
#endif
|
|
|
|
sms_shutdown();
|
|
pio_shutdown();
|
|
vdp_shutdown();
|
|
render_shutdown();
|
|
sound_shutdown();
|
|
|
|
error_shutdown();
|
|
}
|
|
|
|
void system_reset(void)
|
|
{
|
|
sms_reset();
|
|
pio_reset();
|
|
vdp_reset();
|
|
render_reset();
|
|
sound_reset();
|
|
system_manage_sram(cart.sram, SLOT_CART, SRAM_LOAD);
|
|
}
|
|
|
|
void system_poweron(void)
|
|
{
|
|
system_reset();
|
|
}
|
|
|
|
void system_poweroff(void)
|
|
{
|
|
system_manage_sram(cart.sram, SLOT_CART, SRAM_SAVE);
|
|
}
|
|
|
|
|
|
|