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
MINOR = 3
MINOR = 4
PATCH = 2

View file

@ -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; }

View file

@ -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

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 )
{
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,

View file

@ -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() {
resources_set_int("Sound", 1 );
machine_trigger_reset(MACHINE_RESET_MODE_HARD);
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 );
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;
}

View file

@ -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;

View file

@ -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();

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