Adds tape controls, soft reset and freeze button support
This commit is contained in:
parent
a904db525d
commit
45fe94a125
8 changed files with 130 additions and 30 deletions
|
@ -1,4 +1,4 @@
|
|||
MAJOR = 1
|
||||
MINOR = 3
|
||||
MINOR = 4
|
||||
PATCH = 2
|
||||
|
||||
|
|
|
@ -151,7 +151,6 @@ core_start()
|
|||
static void
|
||||
_configure_video_50hz()
|
||||
{
|
||||
|
||||
ntsc_clks_second = NTSC_FRAME_CLKS * 50;
|
||||
pal_clks_second = PAL_FRAME_CLKS * 50;
|
||||
|
||||
|
@ -229,7 +228,6 @@ emu_sound_scale_enable( int e )
|
|||
static void
|
||||
set_model_ntsc( emu_screen_t *sc )
|
||||
{
|
||||
|
||||
// This will cause a HARD reset
|
||||
resources_set_int("MachineVideoStandard", MACHINE_SYNC_NTSC );
|
||||
|
||||
|
@ -247,7 +245,6 @@ set_model_ntsc( emu_screen_t *sc )
|
|||
static void
|
||||
set_model_pal( emu_screen_t *sc )
|
||||
{
|
||||
|
||||
// This will cause a HARD reset
|
||||
resources_set_int("MachineVideoStandard", MACHINE_SYNC_PAL );
|
||||
|
||||
|
@ -585,6 +582,13 @@ void core_cartridge_attach_image( const char * filename )
|
|||
cartridge_attach_image( CARTRIDGE_CRT, filename );
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------
|
||||
//
|
||||
void core_cartridge_trigger_freeze()
|
||||
{
|
||||
cartridge_trigger_freeze();
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------
|
||||
//
|
||||
int c64ui_init(){ return 0; }
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* THEC64
|
||||
* Copyright (C) 2019 Chris Smith
|
||||
* Copyright (C) 2020 Chris Smith
|
||||
*
|
||||
* This confidential and proprietary software may be used only
|
||||
* as authorised by a licensing agreement from Chris Smith.
|
||||
|
@ -72,6 +72,20 @@ typedef enum {
|
|||
Emu_Media_Count = Emu_Media_Max + 1,
|
||||
} emu_media_type_t;
|
||||
|
||||
typedef enum {
|
||||
Emu_Media_Cassette_Stop = 0,
|
||||
Emu_Media_Cassette_Start = 1,
|
||||
Emu_Media_Cassette_Forward = 2,
|
||||
Emu_Media_Cassette_Rewind = 3,
|
||||
Emu_Media_Cassette_Reset = 4,
|
||||
Emu_Media_Cassette_Counter = 5,
|
||||
Emu_Media_Cassette_Motor = 6,
|
||||
Emu_Media_Cassette_Advance = 7,
|
||||
Emu_Media_Cassette_Command = 8,
|
||||
Emu_Media_Cassette_None = 98,
|
||||
Emu_Media_Cassette_Unknown = 99,
|
||||
} emu_media_cassette_command_t;
|
||||
|
||||
typedef struct {
|
||||
emu_media_type_t media_type;
|
||||
char filename[1024];
|
||||
|
@ -83,4 +97,10 @@ typedef struct {
|
|||
int accurate_loading;
|
||||
} emu_load_params_t;
|
||||
|
||||
typedef enum {
|
||||
Emu_Reset_Hard = 0,
|
||||
Emu_Reset_Soft = 1,
|
||||
Emu_Reset_Freeze = 2,
|
||||
} emu_reset_type_t;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -639,10 +639,34 @@ emu_attach_default_storage( int has_external_storage, const char **fname )
|
|||
}
|
||||
|
||||
// -------------------------------------------------------------------------------
|
||||
// Expects a .cr[1245ABMFPT] extension
|
||||
//
|
||||
void core_cartridge_attach_image( const char * filename )
|
||||
{
|
||||
cartridge_attach_image( CARTRIDGE_VIC20_DETECT, filename );
|
||||
int type = CARTRIDGE_VIC20_GENERIC;
|
||||
char t = filename[ strlen(filename) - 1 ];
|
||||
|
||||
if(t >= 'a' && t <= 'z' ) t -= ('a' - 'A'); // Make Upper case
|
||||
|
||||
switch( t ) {
|
||||
case 'T' : type = CARTRIDGE_VIC20_GENERIC; break;
|
||||
case '2' : type = CARTRIDGE_VIC20_16KB_2000; break;
|
||||
case '4' : type = CARTRIDGE_VIC20_16KB_4000; break;
|
||||
case '6' : type = CARTRIDGE_VIC20_16KB_6000; break;
|
||||
case 'A' : type = CARTRIDGE_VIC20_8KB_A000; break;
|
||||
case 'B' : type = CARTRIDGE_VIC20_4KB_B000; break;
|
||||
case 'M' : type = CARTRIDGE_VIC20_MEGACART; break;
|
||||
case 'F' : type = CARTRIDGE_VIC20_FINAL_EXPANSION; break;
|
||||
case 'P' : type = CARTRIDGE_VIC20_FP; break; // Flash Pllugin
|
||||
}
|
||||
|
||||
cartridge_attach_image( type, filename );
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------
|
||||
//
|
||||
void core_cartridge_trigger_freeze()
|
||||
{
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------
|
||||
|
@ -680,10 +704,10 @@ static emu_capabilities_t capabilities = {
|
|||
"VIC20",
|
||||
{
|
||||
// sl sw sh sd pox poy pw ph Display Mode widths Virtual Keyboard shifts
|
||||
{ 0, Model_VIC20_PAL, PNS,224,PNH,32, 48, 48, 176, 184, { P_PP_W, P_EU_W, P_US_W }, { -130, -70, 0 } },
|
||||
{ 0, Model_VIC20_NTSC, NNS,200,NNH,32, 20, 42, 176, 184, { N_PP_W, N_EU_W, N_US_W }, { -110, -50, 0 } },
|
||||
{ 0, Model_VIC20_PALF, PFS,224,PFH,32, 48, 48, 176, 184, { P_PP_W, P_EU_W, P_US_W }, { -130, -70, 0 } },
|
||||
{ 0, Model_VIC20_NTSCF, NFS,200,NFH,32, 20, 42, 176, 184, { N_PP_W, N_EU_W, N_US_W }, { -110, -50, 0 } },
|
||||
{ 0, Model_VIC20_PAL, PNS,224,PNH,32, 48, 48, 176, 184, { P_PP_W, P_EU_W, P_US_W }, { -130, -75, 0 } },
|
||||
{ 0, Model_VIC20_NTSC, NNS,200,NNH,32, 20, 42, 176, 184, { N_PP_W, N_EU_W, N_US_W }, { -90, -75, 0 } },
|
||||
{ 0, Model_VIC20_PALF, PFS,224,PFH,32, 48, 48, 176, 184, { P_PP_W, P_EU_W, P_US_W }, { -130, -75, 0 } },
|
||||
{ 0, Model_VIC20_NTSCF, NFS,200,NFH,32, 20, 42, 176, 184, { N_PP_W, N_EU_W, N_US_W }, { -90, -75, 0 } },
|
||||
{ -1 }
|
||||
},
|
||||
1,
|
||||
|
|
|
@ -16,16 +16,13 @@
|
|||
#include "sound.h"
|
||||
#include "resources.h"
|
||||
#include "screenshot.h"
|
||||
#include "datasette.h"
|
||||
#include "c64/c64-snapshot.h"
|
||||
#include "vicii.h"
|
||||
|
||||
// Import emu_load_params_t definition
|
||||
#include "emu_bind_decl.h"
|
||||
|
||||
extern void core_cartridge_attach_image( const char *filename ); // Per-core specific cartridge insert - Handles different cart types
|
||||
|
||||
void emu_core_reset();
|
||||
|
||||
int emu_load( const char *filename, const char *ext ) {
|
||||
|
||||
int elen = strlen(ext);
|
||||
|
@ -77,8 +74,9 @@ emu_load_status_t * emu_load_start( emu_load_params_t *params )
|
|||
( flen >= 3 &&
|
||||
params->file_extension[flen-4] == '.' &&
|
||||
(params->file_extension[flen-3] | 0x20) == 'c' &&
|
||||
(params->file_extension[flen-2] | 0x20) == 'r' &&
|
||||
(params->file_extension[flen-1] | 0x20) == 't' ) ) {
|
||||
(params->file_extension[flen-2] | 0x20) == 'r'
|
||||
//&& (params->file_extension[flen-1] | 0x20) == 't' // Allow crt cr2 cr4 cr6 cra crb (ie crx)
|
||||
) ) {
|
||||
|
||||
if( params->title_id > 0 ) {
|
||||
// Set inital RAM memory state so (patched) cartridge knows which
|
||||
|
@ -117,7 +115,7 @@ emu_load_status_t * emu_load_start( emu_load_params_t *params )
|
|||
}
|
||||
|
||||
// We're not autoloading, so reset machine to start. This invokes "BASIC", or a cartridge program.
|
||||
if( do_reset ) emu_core_reset();
|
||||
if( do_reset ) emu_core_reset( Emu_Reset_Hard );
|
||||
|
||||
return &load_status;
|
||||
}
|
||||
|
@ -152,9 +150,24 @@ int emu_create_blank_disk_image( char *fullpath, char *diskname ) {
|
|||
return vdrive_internal_create_format_disk_image( fullpath, diskname, DISK_IMAGE_TYPE_D64 );
|
||||
}
|
||||
|
||||
void emu_core_reset() {
|
||||
void emu_core_reset( emu_reset_type_t rt ) {
|
||||
|
||||
switch( rt )
|
||||
{
|
||||
case Emu_Reset_Hard:
|
||||
resources_set_int("Sound", 1 );
|
||||
machine_trigger_reset(MACHINE_RESET_MODE_HARD);
|
||||
machine_trigger_reset( MACHINE_RESET_MODE_HARD );
|
||||
break;
|
||||
|
||||
case Emu_Reset_Soft:
|
||||
resources_set_int("Sound", 1 );
|
||||
machine_trigger_reset( MACHINE_RESET_MODE_SOFT );
|
||||
break;
|
||||
|
||||
case Emu_Reset_Freeze:
|
||||
core_cartridge_trigger_freeze();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void emu_wait_for_frame() {
|
||||
|
@ -238,3 +251,45 @@ ui_display_drive_led(int drive_number, unsigned int pwm1, unsigned int pwm2)
|
|||
|
||||
LED = status;
|
||||
}
|
||||
|
||||
static int tape_counter = 0;
|
||||
static int tape_running = 0;
|
||||
|
||||
void ui_display_tape_counter(int counter)
|
||||
{
|
||||
tape_counter = counter;
|
||||
}
|
||||
|
||||
void ui_display_tape_motor_status(int motor)
|
||||
{
|
||||
tape_running = motor ? 1 : 0;
|
||||
}
|
||||
|
||||
int
|
||||
emu_cassette_control( emu_media_cassette_command_t command )
|
||||
{
|
||||
int r = 0;
|
||||
switch( command ) {
|
||||
case Emu_Media_Cassette_Stop: r = datasette_control( DATASETTE_CONTROL_STOP ); break;
|
||||
case Emu_Media_Cassette_Start: r = datasette_control( DATASETTE_CONTROL_START ); break;
|
||||
case Emu_Media_Cassette_Forward: r = datasette_control( DATASETTE_CONTROL_FORWARD ); break;
|
||||
case Emu_Media_Cassette_Rewind: r = datasette_control( DATASETTE_CONTROL_REWIND ); break;
|
||||
case Emu_Media_Cassette_Advance: r = datasette_control( DATASETTE_CONTROL_ADVANCE ); break;
|
||||
|
||||
case Emu_Media_Cassette_Reset: r = datasette_control( DATASETTE_CONTROL_RESET_COUNTER ); break;
|
||||
case Emu_Media_Cassette_Counter: r = tape_counter; break;
|
||||
case Emu_Media_Cassette_Motor: r = tape_running; break;
|
||||
case Emu_Media_Cassette_Command:
|
||||
{
|
||||
switch( datasette_control( DATASETTE_CONTROL_GET_CMD ) ) {
|
||||
case DATASETTE_CONTROL_STOP: r = Emu_Media_Cassette_Stop; break;
|
||||
case DATASETTE_CONTROL_START: r = Emu_Media_Cassette_Start; break;
|
||||
case DATASETTE_CONTROL_FORWARD: r = Emu_Media_Cassette_Forward; break;
|
||||
case DATASETTE_CONTROL_REWIND: r = Emu_Media_Cassette_Rewind; break;
|
||||
default: r = Emu_Media_Cassette_Unknown; break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
|
|
@ -60,7 +60,6 @@ extern int maincpu_running;
|
|||
extern const char const *emu_id;
|
||||
void core_init();
|
||||
void core_start();
|
||||
void emu_core_reset(); // in bind.c
|
||||
|
||||
// -------------------------------------------------------------------------------
|
||||
//
|
||||
|
@ -142,7 +141,7 @@ emulator_loop( void *p )
|
|||
|
||||
needs_shutdown = 1; // Make sure core_atexit() shuts down the emulator internals
|
||||
|
||||
emu_core_reset();
|
||||
emu_core_reset( Emu_Reset_Hard );
|
||||
|
||||
maincpu_running = 1;
|
||||
|
||||
|
|
|
@ -23,6 +23,8 @@
|
|||
|
||||
#include "videoarch.h"
|
||||
|
||||
#include "emu_bind_decl.h"
|
||||
|
||||
// core.c
|
||||
int emu_initialise();
|
||||
int emu_start();
|
||||
|
@ -33,9 +35,13 @@ void emu_configure_video_60hz();
|
|||
void emu_configure_video_50hz();
|
||||
void emu_wait_for_frame();
|
||||
void emu_start_frame();
|
||||
void emu_core_reset( emu_reset_type_t rt );
|
||||
|
||||
void emu_set_vertical_shift( int adjust );
|
||||
|
||||
void core_cartridge_attach_image( const char *filename );
|
||||
void core_cartridge_trigger_freeze();
|
||||
|
||||
void vsyncarch_sync_with_raster(video_canvas_t *c);
|
||||
int delete_temporary_files();
|
||||
|
||||
|
|
|
@ -66,18 +66,10 @@ void ui_set_tape_status(int tape_status)
|
|||
{
|
||||
}
|
||||
|
||||
void ui_display_tape_motor_status(int motor)
|
||||
{
|
||||
}
|
||||
|
||||
void ui_display_tape_control_status(int control)
|
||||
{
|
||||
}
|
||||
|
||||
void ui_display_tape_counter(int counter)
|
||||
{
|
||||
}
|
||||
|
||||
void ui_display_tape_current_image(const char *image)
|
||||
{
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue