diff --git a/src/config.c b/src/config.c index a85be31ca..299bd8dd5 100644 --- a/src/config.c +++ b/src/config.c @@ -808,6 +808,10 @@ load_machine(void) /* Remove this after a while.. */ config_delete_var(cat, "nvr_path"); config_delete_var(cat, "enable_sync"); + + /* Set up the architecture flags. */ + AT = IS_AT(machine); + PCI = IS_ARCH(machine, MACHINE_BUS_PCI); } @@ -1095,17 +1099,22 @@ load_storage_controllers(void) ide_ter_enabled = !!config_get_int(cat, "ide_ter", 0); ide_qua_enabled = !!config_get_int(cat, "ide_qua", 0); - cassette_enable = !!config_get_int(cat, "cassette_enabled", 1); + cassette_enable = !!config_get_int(cat, "cassette_enabled", AT ? 0 : 1); p = config_get_string(cat, "cassette_file", ""); if (strlen(p) > 511) fatal("load_storage_controllers(): strlen(p) > 511\n"); else strncpy(cassette_fname, p, strlen(p) + 1); - cassette_mode = config_get_string(cat, "cassette_mode", "load"); + p = config_get_string(cat, "cassette_mode", ""); + if (strlen(p) > 511) + fatal("load_storage_controllers(): strlen(p) > 511\n"); + else + strncpy(cassette_mode, p, strlen(p) + 1); cassette_pos = config_get_int(cat, "cassette_position", 0); cassette_srate = config_get_int(cat, "cassette_srate", 44100); cassette_append = !!config_get_int(cat, "cassette_append", 0); cassette_pcm = config_get_int(cat, "cassette_pcm", 0); + cassette_ui_writeprot = !!config_get_int(cat, "cassette_writeprot", 0); } @@ -1937,6 +1946,11 @@ config_load(void) kbd_req_capture = 0; scale = 1; machine = machine_get_machine_from_internal_name("ibmpc"); + + /* Set up the architecture flags. */ + AT = IS_AT(machine); + PCI = IS_ARCH(machine, MACHINE_BUS_PCI); + fpu_type = fpu_get_type(cpu_f, cpu, "none"); gfxcard = video_get_video_from_internal_name("cga"); vid_api = plat_vidapi("default"); @@ -1967,13 +1981,14 @@ config_load(void) for (i = 0; i < ISAMEM_MAX; i++) isamem_type[i] = 0; - cassette_enable = 1; + cassette_enable = AT ? 0 : 1; memset(cassette_fname, 0x00, sizeof(cassette_fname)); - cassette_mode = "load"; + memcpy(cassette_mode, "load", strlen("load") + 1); cassette_pos = 0; cassette_srate = 44100; cassette_append = 0; cassette_pcm = 0; + cassette_ui_writeprot = 0; config_log("Config file not present or invalid!\n"); return; @@ -2527,6 +2542,11 @@ save_storage_controllers(void) config_delete_var(cat, "cassette_pcm"); else config_set_int(cat, "cassette_pcm", cassette_pcm); + + if (cassette_ui_writeprot == 0) + config_delete_var(cat, "cassette_writeprot"); + else + config_set_int(cat, "cassette_writeprot", cassette_ui_writeprot); } diff --git a/src/device/cassette.c b/src/device/cassette.c index a849a4fb1..b3cf65029 100644 --- a/src/device/cassette.c +++ b/src/device/cassette.c @@ -47,7 +47,7 @@ pc_cassette_t * cassette; char cassette_fname[512]; -char * cassette_mode; +char cassette_mode[512]; unsigned long cassette_pos, cassette_srate; int cassette_enable; int cassette_append, cassette_pcm; @@ -270,6 +270,12 @@ void pc_cas_set_mode (pc_cassette_t *cas, int save) cas->save = save; + memset(cassette_mode, 0x00, sizeof(cassette_mode)); + if (save) + memcpy(cassette_mode, "save", strlen("save") + 1); + else + memcpy(cassette_mode, "load", strlen("load") + 1); + if (cas->fp != NULL) { fflush (cas->fp); diff --git a/src/include/86box/cassette.h b/src/include/86box/cassette.h index 6f8f92693..a22b4c41f 100644 --- a/src/include/86box/cassette.h +++ b/src/include/86box/cassette.h @@ -161,7 +161,7 @@ void pc_cas_advance (pc_cassette_t *cas); extern pc_cassette_t * cassette; extern char cassette_fname[512]; -extern char * cassette_mode; +extern char cassette_mode[512]; extern unsigned long cassette_pos, cassette_srate; extern int cassette_enable; extern int cassette_append, cassette_pcm; diff --git a/src/include/86box/resource.h b/src/include/86box/resource.h index 03b797fea..50e35ab91 100644 --- a/src/include/86box/resource.h +++ b/src/include/86box/resource.h @@ -383,9 +383,11 @@ #define IDM_CASSETTE_IMAGE_NEW 0x1200 #define IDM_CASSETTE_IMAGE_EXISTING 0x1300 #define IDM_CASSETTE_IMAGE_EXISTING_WP 0x1400 -#define IDM_CASSETTE_REWIND 0x1500 -#define IDM_CASSETTE_FAST_FORWARD 0x1600 -#define IDM_CASSETTE_EJECT 0x1700 +#define IDM_CASSETTE_RECORD 0x1500 +#define IDM_CASSETTE_PLAY 0x1600 +#define IDM_CASSETTE_REWIND 0x1700 +#define IDM_CASSETTE_FAST_FORWARD 0x1800 +#define IDM_CASSETTE_EJECT 0x1900 #define IDM_FLOPPY_IMAGE_NEW 0x2200 #define IDM_FLOPPY_IMAGE_EXISTING 0x2300 diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 683a697eb..601afe4f9 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -196,6 +196,8 @@ BEGIN MENUITEM "&Existing image...", IDM_CASSETTE_IMAGE_EXISTING MENUITEM "Existing image (&Write-protected)...", IDM_CASSETTE_IMAGE_EXISTING_WP MENUITEM SEPARATOR + MENUITEM "&Record", IDM_CASSETTE_RECORD + MENUITEM "&Play", IDM_CASSETTE_PLAY MENUITEM "&Rewind to the beginning", IDM_CASSETTE_REWIND MENUITEM "&Fast forward to the end", IDM_CASSETTE_FAST_FORWARD MENUITEM SEPARATOR diff --git a/src/win/win_media_menu.c b/src/win/win_media_menu.c index b01cf376a..14778e513 100644 --- a/src/win/win_media_menu.c +++ b/src/win/win_media_menu.c @@ -34,7 +34,7 @@ static HMENU media_menu, stbar_menu; -static HMENU menus[FDD_NUM + CDROM_NUM + ZIP_NUM + MO_NUM]; +static HMENU menus[1 + FDD_NUM + CDROM_NUM + ZIP_NUM + MO_NUM]; static char index_map[255]; @@ -216,10 +216,23 @@ media_menu_update_cassette(void) if (strlen(cassette_fname) == 0) { EnableMenuItem(menus[i], IDM_CASSETTE_EJECT, MF_BYCOMMAND | MF_GRAYED); + EnableMenuItem(menus[i], IDM_CASSETTE_RECORD, MF_BYCOMMAND | MF_GRAYED); + EnableMenuItem(menus[i], IDM_CASSETTE_PLAY, MF_BYCOMMAND | MF_GRAYED); + CheckMenuItem(menus[i], IDM_CASSETTE_RECORD, MF_BYCOMMAND | MF_UNCHECKED); + CheckMenuItem(menus[i], IDM_CASSETTE_PLAY, MF_BYCOMMAND | MF_UNCHECKED); EnableMenuItem(menus[i], IDM_CASSETTE_REWIND, MF_BYCOMMAND | MF_GRAYED); EnableMenuItem(menus[i], IDM_CASSETTE_FAST_FORWARD, MF_BYCOMMAND | MF_GRAYED); } else { EnableMenuItem(menus[i], IDM_CASSETTE_EJECT, MF_BYCOMMAND | MF_ENABLED); + EnableMenuItem(menus[i], IDM_CASSETTE_RECORD, MF_BYCOMMAND | MF_ENABLED); + EnableMenuItem(menus[i], IDM_CASSETTE_PLAY, MF_BYCOMMAND | MF_ENABLED); + if (strcmp(cassette_mode, "save") == 0) { + CheckMenuItem(menus[i], IDM_CASSETTE_RECORD, MF_BYCOMMAND | MF_CHECKED); + CheckMenuItem(menus[i], IDM_CASSETTE_PLAY, MF_BYCOMMAND | MF_UNCHECKED); + } else { + CheckMenuItem(menus[i], IDM_CASSETTE_RECORD, MF_BYCOMMAND | MF_UNCHECKED); + CheckMenuItem(menus[i], IDM_CASSETTE_PLAY, MF_BYCOMMAND | MF_CHECKED); + } EnableMenuItem(menus[i], IDM_CASSETTE_REWIND, MF_BYCOMMAND | MF_ENABLED); EnableMenuItem(menus[i], IDM_CASSETTE_FAST_FORWARD, MF_BYCOMMAND | MF_ENABLED); } @@ -501,6 +514,12 @@ media_menu_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) } break; + case IDM_CASSETTE_RECORD: + pc_cas_set_mode(cassette, 1); + break; + case IDM_CASSETTE_PLAY: + pc_cas_set_mode(cassette, 0); + break; case IDM_CASSETTE_REWIND: pc_cas_rewind(cassette); break;