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
|
MAJOR = 1
|
||||||
MINOR = 3
|
MINOR = 4
|
||||||
PATCH = 2
|
PATCH = 2
|
||||||
|
|
||||||
|
|
|
@ -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; }
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue