diff options
author | 2008-09-18 15:17:42 +0000 | |
---|---|---|
committer | 2008-09-18 15:17:42 +0000 | |
commit | 1eb3c2d964342aef09a08d854bdab6716a6792bd (patch) | |
tree | ac364ed9466a0556e178770d87855ed21ce113ea /src/ldplayer | |
parent | 8e4ed692473ee31f5fdeee460526357ee4440392 (diff) |
Changed requirements for laserdisc CHDs to require a new chunk of
metadata with pre-decoded frame information. Modified chdman to
automatically produce this for CHDs that are of the appropriate
parameters. To fix up existing CHDs, use chdman -fixavdata on the
CHD.
Modified the laserdisc core to leverage the pre-decoded frame
metadata, which is now required. This improves seek times when
searching and allows the player-specific emulation access to the
VBI data as soon as it would really be available. Changed update
callback timing to fire just before the first line of VBI data
would be read; at that point, the frame selection is assumed to
be committed.
Converted PR-8210 emulation over to using the actual MCU from the
laserdisc player. This MCU controls low-level functions such as
slider position and laser on/off, and receives decoded vertical
blanking data in order to make decisions. Removed old HLE behavior.
Note that the overlay text is displayed via the UI; this is
temporary and will be fixed shortly.
Converted Simutrek-hacked laserdisc emulation to using the actual
MCU from the game, which in turn hands off commands to the PR-8210
MCU. This is still not 100% but is pretty close at this point and
achieves the correct behaviors in most cases.
Fixed Cube Quest overlay scaling to cover the whole screen.
Changed laserdisc video parameters to position the screen area at
the bottom rather than the top, since this corresponds more closely
to standard line numbering.
Extended the vbiparse code to support pack/unpack, and to more
fully document all the meanings of the VBI codes.
Updated ldplayer to support slow/fast forward movement, frame/chapter
display, and separate controls for scanning/stepping.
Added new built-in variable "frame" to the debugger.
Fixed device-based ROM loading to support loading ROMs from the
game's ZIP as well.
Diffstat (limited to 'src/ldplayer')
-rw-r--r-- | src/ldplayer/ldplayer.c | 190 |
1 files changed, 126 insertions, 64 deletions
diff --git a/src/ldplayer/ldplayer.c b/src/ldplayer/ldplayer.c index e533ee485ae..4cd172ab23b 100644 --- a/src/ldplayer/ldplayer.c +++ b/src/ldplayer/ldplayer.c @@ -29,12 +29,18 @@ enum { CMD_SCAN_REVERSE, CMD_STEP_REVERSE, + CMD_SLOW_REVERSE, + CMD_FAST_REVERSE, CMD_SCAN_FORWARD, CMD_STEP_FORWARD, + CMD_SLOW_FORWARD, + CMD_FAST_FORWARD, CMD_PLAY, CMD_PAUSE, - CMD_DISPLAY_ON, - CMD_DISPLAY_OFF, + CMD_FRAME_TOGGLE, + CMD_CHAPTER_TOGGLE, + CMD_CH1_TOGGLE, + CMD_CH2_TOGGLE, CMD_0, CMD_1, CMD_2, @@ -60,7 +66,6 @@ static astring *filename; static input_port_value last_controls; static UINT8 playing; -static UINT8 displaying; static emu_timer *pr8210_bit_timer; static UINT32 pr8210_command_buffer_in, pr8210_command_buffer_out; @@ -81,51 +86,68 @@ static void process_commands(const device_config *laserdisc) input_port_value controls = input_port_read(laserdisc->machine, "controls"); int number; - /* scan/step backwards */ - if (playing) - { - if (controls & 0x01) - (*execute_command)(laserdisc, CMD_SCAN_REVERSE); - } - else - { - if (!(last_controls & 0x01) && (controls & 0x01)) - (*execute_command)(laserdisc, CMD_STEP_REVERSE); - } + /* step backwards */ + if (!(last_controls & 0x01) && (controls & 0x01)) + (*execute_command)(laserdisc, CMD_STEP_REVERSE); - /* scan/step forwards */ - if (playing) - { - if (controls & 0x02) - (*execute_command)(laserdisc, CMD_SCAN_FORWARD); - } - else - { - if (!(last_controls & 0x02) && (controls & 0x02)) - (*execute_command)(laserdisc, CMD_STEP_FORWARD); - } + /* step forwards */ + if (!(last_controls & 0x02) && (controls & 0x02)) + (*execute_command)(laserdisc, CMD_STEP_FORWARD); - /* play/pause */ + /* scan backwards */ + if (controls & 0x04) + (*execute_command)(laserdisc, CMD_SCAN_REVERSE); + + /* scan forwards */ + if (controls & 0x08) + (*execute_command)(laserdisc, CMD_SCAN_FORWARD); + + /* slow backwards */ if (!(last_controls & 0x10) && (controls & 0x10)) + (*execute_command)(laserdisc, CMD_SLOW_REVERSE); + + /* slow forwards */ + if (!(last_controls & 0x20) && (controls & 0x20)) + (*execute_command)(laserdisc, CMD_SLOW_FORWARD); + + /* fast backwards */ + if (controls & 0x40) + (*execute_command)(laserdisc, CMD_FAST_REVERSE); + + /* fast forwards */ + if (controls & 0x80) + (*execute_command)(laserdisc, CMD_FAST_FORWARD); + + /* play/pause */ + if (!(last_controls & 0x100) && (controls & 0x100)) { playing = !playing; (*execute_command)(laserdisc, playing ? CMD_PLAY : CMD_PAUSE); } - /* toggle display */ - if (!(last_controls & 0x20) && (controls & 0x20)) - { - displaying = !displaying; - (*execute_command)(laserdisc, displaying ? CMD_DISPLAY_ON : CMD_DISPLAY_OFF); - } + /* toggle frame display */ + if (!(last_controls & 0x200) && (controls & 0x200)) + (*execute_command)(laserdisc, CMD_FRAME_TOGGLE); + + /* toggle chapter display */ + if (!(last_controls & 0x400) && (controls & 0x400)) + (*execute_command)(laserdisc, CMD_CHAPTER_TOGGLE); + + /* toggle left channel */ + if (!(last_controls & 0x800) && (controls & 0x800)) + (*execute_command)(laserdisc, CMD_CH1_TOGGLE); + + /* toggle right channel */ + if (!(last_controls & 0x1000) && (controls & 0x1000)) + (*execute_command)(laserdisc, CMD_CH2_TOGGLE); /* numbers */ for (number = 0; number < 10; number++) - if (!(last_controls & (0x100 << number)) && (controls & (0x100 << number))) + if (!(last_controls & (0x10000 << number)) && (controls & (0x10000 << number))) (*execute_command)(laserdisc, CMD_0 + number); /* enter */ - if (!(last_controls & 0x40000) && (controls & 0x40000)) + if (!(last_controls & 0x4000000) && (controls & 0x4000000)) (*execute_command)(laserdisc, CMD_SEARCH); last_controls = controls; @@ -162,7 +184,6 @@ static TIMER_CALLBACK( autoplay ) /* start playing */ (*execute_command)(laserdisc, CMD_PLAY); playing = TRUE; - displaying = FALSE; } @@ -186,7 +207,6 @@ static MACHINE_RESET( ldplayer ) INLINE void pr8210_add_command(UINT8 command) { pr8210_command_buffer[pr8210_command_buffer_in++ % ARRAY_LENGTH(pr8210_command_buffer)] = (command & 0x1f) | 0x20; - pr8210_command_buffer[pr8210_command_buffer_in++ % ARRAY_LENGTH(pr8210_command_buffer)] = (command & 0x1f) | 0x20; pr8210_command_buffer[pr8210_command_buffer_in++ % ARRAY_LENGTH(pr8210_command_buffer)] = 0x00 | 0x20; } @@ -252,7 +272,8 @@ static void pr8210_execute(const device_config *laserdisc, int command) switch (command) { case CMD_SCAN_REVERSE: - if (pr8210_command_buffer_in == pr8210_command_buffer_out) + if (pr8210_command_buffer_in == pr8210_command_buffer_out || + pr8210_command_buffer_in == (pr8210_command_buffer_out + 1) % ARRAY_LENGTH(pr8210_command_buffer)) { pr8210_add_command(0x1c); playing = TRUE; @@ -264,8 +285,23 @@ static void pr8210_execute(const device_config *laserdisc, int command) playing = FALSE; break; + case CMD_SLOW_REVERSE: + pr8210_add_command(0x02); + playing = TRUE; + break; + + case CMD_FAST_REVERSE: + if (pr8210_command_buffer_in == pr8210_command_buffer_out || + pr8210_command_buffer_in == (pr8210_command_buffer_out + 1) % ARRAY_LENGTH(pr8210_command_buffer)) + { + pr8210_add_command(0x0c); + playing = TRUE; + } + break; + case CMD_SCAN_FORWARD: - if (pr8210_command_buffer_in == pr8210_command_buffer_out) + if (pr8210_command_buffer_in == pr8210_command_buffer_out || + pr8210_command_buffer_in == (pr8210_command_buffer_out + 1) % ARRAY_LENGTH(pr8210_command_buffer)) { pr8210_add_command(0x08); playing = TRUE; @@ -277,6 +313,20 @@ static void pr8210_execute(const device_config *laserdisc, int command) playing = FALSE; break; + case CMD_SLOW_FORWARD: + pr8210_add_command(0x18); + playing = TRUE; + break; + + case CMD_FAST_FORWARD: + if (pr8210_command_buffer_in == pr8210_command_buffer_out || + pr8210_command_buffer_in == (pr8210_command_buffer_out + 1) % ARRAY_LENGTH(pr8210_command_buffer)) + { + pr8210_add_command(0x10); + playing = TRUE; + } + break; + case CMD_PLAY: pr8210_add_command(0x14); playing = TRUE; @@ -287,11 +337,22 @@ static void pr8210_execute(const device_config *laserdisc, int command) playing = FALSE; break; - case CMD_DISPLAY_ON: - case CMD_DISPLAY_OFF: + case CMD_FRAME_TOGGLE: pr8210_add_command(0x0b); break; + case CMD_CHAPTER_TOGGLE: + pr8210_add_command(0x06); + break; + + case CMD_CH1_TOGGLE: + pr8210_add_command(0x0e); + break; + + case CMD_CH2_TOGGLE: + pr8210_add_command(0x16); + break; + case CMD_0: case CMD_1: case CMD_2: @@ -355,13 +416,7 @@ static void ldv1000_execute(const device_config *laserdisc, int command) playing = FALSE; break; - case CMD_DISPLAY_ON: - laserdisc_data_w(laserdisc, digits[1]); - laserdisc_data_w(laserdisc, 0xf1); - break; - - case CMD_DISPLAY_OFF: - laserdisc_data_w(laserdisc, digits[0]); + case CMD_FRAME_TOGGLE: laserdisc_data_w(laserdisc, 0xf1); break; @@ -395,23 +450,30 @@ static void ldv1000_execute(const device_config *laserdisc, int command) static INPUT_PORTS_START( ldplayer ) PORT_START("controls") - PORT_BIT( 0x00001, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) - PORT_BIT( 0x00002, IP_ACTIVE_HIGH, IPT_JOYSTICK_RIGHT ) - PORT_BIT( 0x00004, IP_ACTIVE_HIGH, IPT_JOYSTICK_UP ) - PORT_BIT( 0x00008, IP_ACTIVE_HIGH, IPT_JOYSTICK_DOWN ) - PORT_BIT( 0x00010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_CODE(KEYCODE_SPACE) - PORT_BIT( 0x00020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) - PORT_BIT( 0x00100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_0) - PORT_BIT( 0x00200, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_1) - PORT_BIT( 0x00400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_2) - PORT_BIT( 0x00800, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_3) - PORT_BIT( 0x01000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_4) - PORT_BIT( 0x02000, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_5) - PORT_BIT( 0x04000, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_6) - PORT_BIT( 0x08000, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_7) - PORT_BIT( 0x10000, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_8) - PORT_BIT( 0x20000, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_9) - PORT_BIT( 0x40000, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_PLAYER(2) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_ENTER) + PORT_BIT( 0x0000001, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Step reverse") PORT_CODE(KEYCODE_LEFT) + PORT_BIT( 0x0000002, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Step forward") PORT_CODE(KEYCODE_RIGHT) + PORT_BIT( 0x0000004, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Scan reverse") PORT_CODE(KEYCODE_UP) + PORT_BIT( 0x0000008, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Scan forward") PORT_CODE(KEYCODE_DOWN) + PORT_BIT( 0x0000010, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Slow reverse") PORT_CODE(KEYCODE_OPENBRACE) + PORT_BIT( 0x0000020, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Slow forward") PORT_CODE(KEYCODE_CLOSEBRACE) + PORT_BIT( 0x0000040, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Fast reverse") PORT_CODE(KEYCODE_COMMA) + PORT_BIT( 0x0000080, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("Fast forward") PORT_CODE(KEYCODE_STOP) + PORT_BIT( 0x0000100, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("Play/Pause") PORT_CODE(KEYCODE_SPACE) + PORT_BIT( 0x0000200, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("Toggle frame display") PORT_CODE(KEYCODE_F) + PORT_BIT( 0x0000400, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Toggle chapter display") PORT_CODE(KEYCODE_C) + PORT_BIT( 0x0000800, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Toggle left channel") PORT_CODE(KEYCODE_L) + PORT_BIT( 0x0001000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("Toggle right channel") PORT_CODE(KEYCODE_R) + PORT_BIT( 0x0010000, IP_ACTIVE_HIGH, IPT_BUTTON1 ) PORT_NAME("0") PORT_PLAYER(2) PORT_CODE(KEYCODE_0_PAD) PORT_CODE(KEYCODE_0) + PORT_BIT( 0x0020000, IP_ACTIVE_HIGH, IPT_BUTTON2 ) PORT_NAME("1") PORT_PLAYER(2) PORT_CODE(KEYCODE_1_PAD) PORT_CODE(KEYCODE_1) + PORT_BIT( 0x0040000, IP_ACTIVE_HIGH, IPT_BUTTON3 ) PORT_NAME("2") PORT_PLAYER(2) PORT_CODE(KEYCODE_2_PAD) PORT_CODE(KEYCODE_2) + PORT_BIT( 0x0080000, IP_ACTIVE_HIGH, IPT_BUTTON4 ) PORT_NAME("3") PORT_PLAYER(2) PORT_CODE(KEYCODE_3_PAD) PORT_CODE(KEYCODE_3) + PORT_BIT( 0x0100000, IP_ACTIVE_HIGH, IPT_BUTTON5 ) PORT_NAME("4") PORT_PLAYER(2) PORT_CODE(KEYCODE_4_PAD) PORT_CODE(KEYCODE_4) + PORT_BIT( 0x0200000, IP_ACTIVE_HIGH, IPT_BUTTON6 ) PORT_NAME("5") PORT_PLAYER(2) PORT_CODE(KEYCODE_5_PAD) PORT_CODE(KEYCODE_5) + PORT_BIT( 0x0400000, IP_ACTIVE_HIGH, IPT_BUTTON7 ) PORT_NAME("6") PORT_PLAYER(2) PORT_CODE(KEYCODE_6_PAD) PORT_CODE(KEYCODE_6) + PORT_BIT( 0x0800000, IP_ACTIVE_HIGH, IPT_BUTTON8 ) PORT_NAME("7") PORT_PLAYER(2) PORT_CODE(KEYCODE_7_PAD) PORT_CODE(KEYCODE_7) + PORT_BIT( 0x1000000, IP_ACTIVE_HIGH, IPT_BUTTON9 ) PORT_NAME("8") PORT_PLAYER(2) PORT_CODE(KEYCODE_8_PAD) PORT_CODE(KEYCODE_8) + PORT_BIT( 0x2000000, IP_ACTIVE_HIGH, IPT_BUTTON10 ) PORT_NAME("9") PORT_PLAYER(2) PORT_CODE(KEYCODE_9_PAD) PORT_CODE(KEYCODE_9) + PORT_BIT( 0x4000000, IP_ACTIVE_HIGH, IPT_BUTTON11 ) PORT_NAME("Enter") PORT_PLAYER(2) PORT_CODE(KEYCODE_ENTER_PAD) PORT_CODE(KEYCODE_ENTER) INPUT_PORTS_END |