A few fixes, CD-ROM ejecting/reloading should no longer cause heap problems because they now allocate prev_image_path with the correct length, and the status bar should now work after a hard reset with no config change.
This commit is contained in:
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Generic CD-ROM drive core.
|
* Generic CD-ROM drive core.
|
||||||
*
|
*
|
||||||
* Version: @(#)cdrom.c 1.0.2 2018/10/17
|
* Version: @(#)cdrom.c 1.0.3 2018/10/21
|
||||||
*
|
*
|
||||||
* Author: Miran Grca, <mgrca8@gmail.com>
|
* Author: Miran Grca, <mgrca8@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -300,7 +300,7 @@ cdrom_eject(uint8_t id)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dev->host_drive == 200) {
|
if (dev->host_drive == 200) {
|
||||||
dev->prev_image_path = (wchar_t *) malloc(1024);
|
dev->prev_image_path = (wchar_t *) malloc(1024 * sizeof(wchar_t));
|
||||||
wcscpy(dev->prev_image_path, dev->image_path);
|
wcscpy(dev->prev_image_path, dev->image_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* CD-ROM image support.
|
* CD-ROM image support.
|
||||||
*
|
*
|
||||||
* Version: @(#)cdrom_image.cc 1.0.5 2018/10/21
|
* Version: @(#)cdrom_image.cc 1.0.6 2018/10/21
|
||||||
*
|
*
|
||||||
* Author: RichardG867,
|
* Author: RichardG867,
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -1084,6 +1084,7 @@ cdrom_image_open(cdrom_t *dev, const wchar_t *fn)
|
|||||||
if (!img->SetDevice(temp, false)) {
|
if (!img->SetDevice(temp, false)) {
|
||||||
cdrom_image_close(dev);
|
cdrom_image_close(dev);
|
||||||
cdrom->ops = NULL;
|
cdrom->ops = NULL;
|
||||||
|
cdrom->host_drive = 0;
|
||||||
cdrom_image_log("[f] image_open(): cdrom[%i]->ops = %08X\n", dev->id, dev->ops);
|
cdrom_image_log("[f] image_open(): cdrom[%i]->ops = %08X\n", dev->id, dev->ops);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|||||||
5
src/pc.c
5
src/pc.c
@@ -712,7 +712,7 @@ pc_send_cae(void)
|
|||||||
void
|
void
|
||||||
pc_reset_hard_close(void)
|
pc_reset_hard_close(void)
|
||||||
{
|
{
|
||||||
ui_sb_set_not_ready();
|
ui_sb_set_ready(0);
|
||||||
|
|
||||||
suppress_overscan = 0;
|
suppress_overscan = 0;
|
||||||
|
|
||||||
@@ -822,7 +822,8 @@ pc_reset_hard_init(void)
|
|||||||
config_save();
|
config_save();
|
||||||
|
|
||||||
config_changed = 0;
|
config_changed = 0;
|
||||||
}
|
} else
|
||||||
|
ui_sb_set_ready(1);
|
||||||
|
|
||||||
/* Needs the status bar... */
|
/* Needs the status bar... */
|
||||||
if (bugger_enabled)
|
if (bugger_enabled)
|
||||||
|
|||||||
2
src/ui.h
2
src/ui.h
@@ -53,7 +53,7 @@ extern void ui_check_menu_item(int id, int checked);
|
|||||||
extern wchar_t *ui_window_title(wchar_t *s);
|
extern wchar_t *ui_window_title(wchar_t *s);
|
||||||
extern void ui_status_update(void);
|
extern void ui_status_update(void);
|
||||||
extern int ui_sb_find_part(int tag);
|
extern int ui_sb_find_part(int tag);
|
||||||
extern void ui_sb_set_not_ready(void);
|
extern void ui_sb_set_ready(int ready);
|
||||||
extern void ui_sb_update_panes(void);
|
extern void ui_sb_update_panes(void);
|
||||||
extern void ui_sb_update_tip(int meaning);
|
extern void ui_sb_update_tip(int meaning);
|
||||||
extern void ui_sb_check_menu_item(int tag, int id, int chk);
|
extern void ui_sb_check_menu_item(int tag, int id, int chk);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
* Handle the platform-side of CDROM drives.
|
* Handle the platform-side of CDROM drives.
|
||||||
*
|
*
|
||||||
* Version: @(#)win_cdrom.c 1.0.10 2018/10/17
|
* Version: @(#)win_cdrom.c 1.0.11 2018/10/21
|
||||||
*
|
*
|
||||||
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
|
||||||
* Miran Grca, <mgrca8@gmail.com>
|
* Miran Grca, <mgrca8@gmail.com>
|
||||||
@@ -45,12 +45,10 @@ plat_cdrom_ui_update(uint8_t id, uint8_t reload)
|
|||||||
|
|
||||||
if (drv->host_drive == 0) {
|
if (drv->host_drive == 0) {
|
||||||
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_CHECKED);
|
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_CHECKED);
|
||||||
drv->host_drive = 0;
|
|
||||||
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_UNCHECKED);
|
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_UNCHECKED);
|
||||||
ui_sb_update_icon_state(SB_CDROM|id, 1);
|
ui_sb_update_icon_state(SB_CDROM|id, 1);
|
||||||
} else {
|
} else {
|
||||||
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
||||||
drv->host_drive = 200;
|
|
||||||
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_CHECKED);
|
ui_sb_check_menu_item(SB_CDROM|id, IDM_CDROM_IMAGE | id, MF_CHECKED);
|
||||||
ui_sb_update_icon_state(SB_CDROM|id, 0);
|
ui_sb_update_icon_state(SB_CDROM|id, 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -470,9 +470,9 @@ StatusBarCreatePopupMenu(int part)
|
|||||||
|
|
||||||
/* API: mark the status bar as not ready. */
|
/* API: mark the status bar as not ready. */
|
||||||
void
|
void
|
||||||
ui_sb_set_not_ready(void)
|
ui_sb_set_ready(int ready)
|
||||||
{
|
{
|
||||||
sb_ready = 0;
|
sb_ready = ready;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -486,8 +486,9 @@ ui_sb_update_panes(void)
|
|||||||
int c_ide, c_scsi;
|
int c_ide, c_scsi;
|
||||||
int do_net;
|
int do_net;
|
||||||
|
|
||||||
if (sb_ready)
|
if (sb_ready) {
|
||||||
sb_ready = 0;
|
sb_ready = 0;
|
||||||
|
}
|
||||||
|
|
||||||
hdint = (machines[machine].flags & MACHINE_HDC) ? 1 : 0;
|
hdint = (machines[machine].flags & MACHINE_HDC) ? 1 : 0;
|
||||||
c_mfm = hdd_count(HDD_BUS_MFM);
|
c_mfm = hdd_count(HDD_BUS_MFM);
|
||||||
@@ -816,6 +817,9 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
case IDM_FLOPPY_IMAGE_NEW:
|
case IDM_FLOPPY_IMAGE_NEW:
|
||||||
id = item_params & 0x0003;
|
id = item_params & 0x0003;
|
||||||
part = sb_map[SB_FLOPPY | id];
|
part = sb_map[SB_FLOPPY | id];
|
||||||
|
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||||
|
break;
|
||||||
|
|
||||||
NewFloppyDialogCreate(hwnd, id, part);
|
NewFloppyDialogCreate(hwnd, id, part);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -875,11 +879,19 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
|
|
||||||
case IDM_CDROM_EMPTY:
|
case IDM_CDROM_EMPTY:
|
||||||
id = item_params & 0x0007;
|
id = item_params & 0x0007;
|
||||||
|
part = sb_map[SB_CDROM | id];
|
||||||
|
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||||
|
break;
|
||||||
|
|
||||||
cdrom_eject(id);
|
cdrom_eject(id);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case IDM_CDROM_RELOAD:
|
case IDM_CDROM_RELOAD:
|
||||||
id = item_params & 0x0007;
|
id = item_params & 0x0007;
|
||||||
|
part = sb_map[SB_CDROM | id];
|
||||||
|
if ((part == 0xff) || (sb_menu_handles == NULL))
|
||||||
|
break;
|
||||||
|
|
||||||
cdrom_reload(id);
|
cdrom_reload(id);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@@ -893,24 +905,24 @@ StatusBarProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|||||||
cdrom[id].prev_host_drive = cdrom[id].host_drive;
|
cdrom[id].prev_host_drive = cdrom[id].host_drive;
|
||||||
wcscpy(temp_path, wopenfilestring);
|
wcscpy(temp_path, wopenfilestring);
|
||||||
if (!cdrom[id].prev_image_path)
|
if (!cdrom[id].prev_image_path)
|
||||||
cdrom[id].prev_image_path = (wchar_t *) malloc(1024);
|
cdrom[id].prev_image_path = (wchar_t *) malloc(1024 * sizeof(wchar_t));
|
||||||
wcscpy(cdrom[id].prev_image_path, cdrom[id].image_path);
|
wcscpy(cdrom[id].prev_image_path, cdrom[id].image_path);
|
||||||
if (cdrom[id].ops && cdrom[id].ops->exit)
|
if (cdrom[id].ops && cdrom[id].ops->exit)
|
||||||
cdrom[id].ops->exit(&(cdrom[id]));
|
cdrom[id].ops->exit(&(cdrom[id]));
|
||||||
cdrom[id].ops = NULL;
|
cdrom[id].ops = NULL;
|
||||||
memset(cdrom[id].image_path, 0, 2048);
|
memset(cdrom[id].image_path, 0, sizeof(cdrom[id].image_path));
|
||||||
cdrom_image_open(&(cdrom[id]), temp_path);
|
cdrom_image_open(&(cdrom[id]), temp_path);
|
||||||
/* Signal media change to the emulated machine. */
|
/* Signal media change to the emulated machine. */
|
||||||
if (cdrom[id].insert)
|
if (cdrom[id].insert)
|
||||||
cdrom[id].insert(cdrom[id].p);
|
cdrom[id].insert(cdrom[id].p);
|
||||||
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
|
||||||
cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200;
|
cdrom[id].host_drive = (wcslen(cdrom[id].image_path) == 0) ? 0 : 200;
|
||||||
if (cdrom[id].host_drive == 200) {
|
if (cdrom[id].host_drive == 200) {
|
||||||
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
||||||
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_CHECKED);
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_CHECKED);
|
||||||
ui_sb_update_icon_state(SB_CDROM | id, 0);
|
ui_sb_update_icon_state(SB_CDROM | id, 0);
|
||||||
} else {
|
} else {
|
||||||
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_UNCHECKED);
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_IMAGE | id, MF_UNCHECKED);
|
||||||
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_UNCHECKED);
|
CheckMenuItem(sb_menu_handles[part], IDM_CDROM_EMPTY | id, MF_CHECKED);
|
||||||
ui_sb_update_icon_state(SB_CDROM | id, 1);
|
ui_sb_update_icon_state(SB_CDROM | id, 1);
|
||||||
}
|
}
|
||||||
EnableMenuItem(sb_menu_handles[part], IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
EnableMenuItem(sb_menu_handles[part], IDM_CDROM_RELOAD | id, MF_BYCOMMAND | MF_GRAYED);
|
||||||
|
|||||||
Reference in New Issue
Block a user