Adds tape controls, soft reset and freeze button support

This commit is contained in:
Chris Smith 2020-10-26 18:13:21 +00:00
parent a904db525d
commit 45fe94a125
8 changed files with 130 additions and 30 deletions

View file

@ -1,4 +1,4 @@
MAJOR = 1 MAJOR = 1
MINOR = 3 MINOR = 4
PATCH = 2 PATCH = 2

View file

@ -151,7 +151,6 @@ core_start()
static void static void
_configure_video_50hz() _configure_video_50hz()
{ {
ntsc_clks_second = NTSC_FRAME_CLKS * 50; ntsc_clks_second = NTSC_FRAME_CLKS * 50;
pal_clks_second = PAL_FRAME_CLKS * 50; pal_clks_second = PAL_FRAME_CLKS * 50;
@ -229,7 +228,6 @@ emu_sound_scale_enable( int e )
static void static void
set_model_ntsc( emu_screen_t *sc ) set_model_ntsc( emu_screen_t *sc )
{ {
// This will cause a HARD reset // This will cause a HARD reset
resources_set_int("MachineVideoStandard", MACHINE_SYNC_NTSC ); resources_set_int("MachineVideoStandard", MACHINE_SYNC_NTSC );
@ -247,7 +245,6 @@ set_model_ntsc( emu_screen_t *sc )
static void static void
set_model_pal( emu_screen_t *sc ) set_model_pal( emu_screen_t *sc )
{ {
// This will cause a HARD reset // This will cause a HARD reset
resources_set_int("MachineVideoStandard", MACHINE_SYNC_PAL ); 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 ); cartridge_attach_image( CARTRIDGE_CRT, filename );
} }
// -------------------------------------------------------------------------------
//
void core_cartridge_trigger_freeze()
{
cartridge_trigger_freeze();
}
// ------------------------------------------------------------------------------- // -------------------------------------------------------------------------------
// //
int c64ui_init(){ return 0; } int c64ui_init(){ return 0; }

View file

@ -1,6 +1,6 @@
/* /*
* THEC64 * THEC64
* Copyright (C) 2019 Chris Smith * Copyright (C) 2020 Chris Smith
* *
* This confidential and proprietary software may be used only * This confidential and proprietary software may be used only
* as authorised by a licensing agreement from Chris Smith. * as authorised by a licensing agreement from Chris Smith.
@ -72,6 +72,20 @@ typedef enum {
Emu_Media_Count = Emu_Media_Max + 1, Emu_Media_Count = Emu_Media_Max + 1,
} emu_media_type_t; } 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 { typedef struct {
emu_media_type_t media_type; emu_media_type_t media_type;
char filename[1024]; char filename[1024];
@ -83,4 +97,10 @@ typedef struct {
int accurate_loading; int accurate_loading;
} emu_load_params_t; } emu_load_params_t;
typedef enum {
Emu_Reset_Hard = 0,
Emu_Reset_Soft = 1,
Emu_Reset_Freeze = 2,
} emu_reset_type_t;
#endif #endif

View file

@ -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 ) 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", "VIC20",
{ {
// sl sw sh sd pox poy pw ph Display Mode widths Virtual Keyboard shifts // 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_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 }, { -110, -50, 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, -70, 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 }, { -110, -50, 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 }
}, },
1, 1,

View file

@ -16,16 +16,13 @@
#include "sound.h" #include "sound.h"
#include "resources.h" #include "resources.h"
#include "screenshot.h" #include "screenshot.h"
#include "datasette.h"
#include "c64/c64-snapshot.h" #include "c64/c64-snapshot.h"
#include "vicii.h" #include "vicii.h"
// Import emu_load_params_t definition // Import emu_load_params_t definition
#include "emu_bind_decl.h" #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 emu_load( const char *filename, const char *ext ) {
int elen = strlen(ext); int elen = strlen(ext);
@ -77,8 +74,9 @@ emu_load_status_t * emu_load_start( emu_load_params_t *params )
( flen >= 3 && ( flen >= 3 &&
params->file_extension[flen-4] == '.' && params->file_extension[flen-4] == '.' &&
(params->file_extension[flen-3] | 0x20) == 'c' && (params->file_extension[flen-3] | 0x20) == 'c' &&
(params->file_extension[flen-2] | 0x20) == 'r' && (params->file_extension[flen-2] | 0x20) == 'r'
(params->file_extension[flen-1] | 0x20) == 't' ) ) { //&& (params->file_extension[flen-1] | 0x20) == 't' // Allow crt cr2 cr4 cr6 cra crb (ie crx)
) ) {
if( params->title_id > 0 ) { if( params->title_id > 0 ) {
// Set inital RAM memory state so (patched) cartridge knows which // 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. // 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; 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 ); 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 ); 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() { void emu_wait_for_frame() {
@ -238,3 +251,45 @@ ui_display_drive_led(int drive_number, unsigned int pwm1, unsigned int pwm2)
LED = status; 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;
}

View file

@ -60,7 +60,6 @@ extern int maincpu_running;
extern const char const *emu_id; extern const char const *emu_id;
void core_init(); void core_init();
void core_start(); 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 needs_shutdown = 1; // Make sure core_atexit() shuts down the emulator internals
emu_core_reset(); emu_core_reset( Emu_Reset_Hard );
maincpu_running = 1; maincpu_running = 1;

View file

@ -23,6 +23,8 @@
#include "videoarch.h" #include "videoarch.h"
#include "emu_bind_decl.h"
// core.c // core.c
int emu_initialise(); int emu_initialise();
int emu_start(); int emu_start();
@ -33,9 +35,13 @@ void emu_configure_video_60hz();
void emu_configure_video_50hz(); void emu_configure_video_50hz();
void emu_wait_for_frame(); void emu_wait_for_frame();
void emu_start_frame(); void emu_start_frame();
void emu_core_reset( emu_reset_type_t rt );
void emu_set_vertical_shift( int adjust ); 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); void vsyncarch_sync_with_raster(video_canvas_t *c);
int delete_temporary_files(); int delete_temporary_files();

View file

@ -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_control_status(int control)
{ {
} }
void ui_display_tape_counter(int counter)
{
}
void ui_display_tape_current_image(const char *image) void ui_display_tape_current_image(const char *image)
{ {
} }