From 45fe94a125255d8d66eb075f3ea6eea6ec42e176 Mon Sep 17 00:00:00 2001 From: Chris Smith Date: Mon, 26 Oct 2020 18:13:21 +0000 Subject: [PATCH] Adds tape controls, soft reset and freeze button support --- release.mk.in | 2 +- src/c64emu/c64emu.c | 10 +++-- src/ui/emu_bind_decl.h | 22 ++++++++++- src/vic20emu/vic20emu.c | 34 ++++++++++++++--- src/viceport/bind.c | 75 +++++++++++++++++++++++++++++++++----- src/viceport/core.c | 3 +- src/viceport/emucore.h | 6 +++ src/viceport/uistatusbar.c | 8 ---- 8 files changed, 130 insertions(+), 30 deletions(-) diff --git a/release.mk.in b/release.mk.in index 5f2d34c..296b004 100644 --- a/release.mk.in +++ b/release.mk.in @@ -1,4 +1,4 @@ MAJOR = 1 -MINOR = 3 +MINOR = 4 PATCH = 2 diff --git a/src/c64emu/c64emu.c b/src/c64emu/c64emu.c index f5d4913..54b3939 100644 --- a/src/c64emu/c64emu.c +++ b/src/c64emu/c64emu.c @@ -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; } diff --git a/src/ui/emu_bind_decl.h b/src/ui/emu_bind_decl.h index 5643183..1c1a0c1 100644 --- a/src/ui/emu_bind_decl.h +++ b/src/ui/emu_bind_decl.h @@ -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 diff --git a/src/vic20emu/vic20emu.c b/src/vic20emu/vic20emu.c index 226f55b..e0521a0 100644 --- a/src/vic20emu/vic20emu.c +++ b/src/vic20emu/vic20emu.c @@ -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, diff --git a/src/viceport/bind.c b/src/viceport/bind.c index 33e45dd..0c6cdc1 100644 --- a/src/viceport/bind.c +++ b/src/viceport/bind.c @@ -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; +} diff --git a/src/viceport/core.c b/src/viceport/core.c index 7595f28..0809641 100644 --- a/src/viceport/core.c +++ b/src/viceport/core.c @@ -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; diff --git a/src/viceport/emucore.h b/src/viceport/emucore.h index ba0a1bf..88066b4 100644 --- a/src/viceport/emucore.h +++ b/src/viceport/emucore.h @@ -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(); diff --git a/src/viceport/uistatusbar.c b/src/viceport/uistatusbar.c index 8173709..fbb0426 100644 --- a/src/viceport/uistatusbar.c +++ b/src/viceport/uistatusbar.c @@ -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) { }