2018-02-20 21:44:51 -05:00
/*
* VARCem Virtual Archaelogical Computer EMulator .
* An emulator of ( mostly ) x86 - based PC systems and devices ,
* using the ISA , EISA , VLB , MCA and PCI system buses , roughly
* spanning the era between 1981 and 1995.
*
* This file is part of the VARCem Project .
*
* Implementation of the Settings dialog .
*
2018-03-02 18:58:18 -05:00
* Version : @ ( # ) win_settings . c 1.0 .5 2018 / 03 / 01
2018-02-20 21:44:51 -05:00
*
* Authors : Fred N . van Kempen , < decwiz @ yahoo . com >
* Miran Grca , < mgrca8 @ gmail . com >
*
* Copyright 2017 , 2018 Fred N . van Kempen .
* Copyright 2016 - 2018 Miran Grca .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the :
*
* Free Software Foundation , Inc .
* 59 Temple Place - Suite 330
* Boston , MA 02111 - 1307
* USA .
*/
# define UNICODE
# include <windows.h>
# include <windowsx.h>
# include <commctrl.h>
# include <inttypes.h>
# include <stdio.h>
# include <stdint.h>
# include <string.h>
# include <wchar.h>
# include "../emu.h"
# include "../config.h"
# include "../cpu/cpu.h"
# include "../mem.h"
# include "../rom.h"
# include "../device.h"
# include "../nvr.h"
# include "../machine/machine.h"
# include "../game/gameport.h"
# include "../lpt.h"
# include "../mouse.h"
# include "../disk/hdd.h"
# include "../disk/hdc.h"
# include "../disk/hdc_ide.h"
2018-02-25 02:32:19 -05:00
# include "../disk/zip.h"
# include "../cdrom/cdrom.h"
2018-02-20 21:44:51 -05:00
# include "../floppy/fdd.h"
# include "../scsi/scsi.h"
# include "../network/network.h"
# include "../sound/sound.h"
# include "../sound/midi.h"
# include "../sound/snd_dbopl.h"
# include "../sound/snd_mpu401.h"
# include "../video/video.h"
# include "../video/vid_voodoo.h"
# include "../plat.h"
# include "../plat_midi.h"
# include "../ui.h"
# include "win.h"
/* Machine category */
static int temp_machine , temp_cpu_m , temp_cpu , temp_wait_states , temp_mem_size , temp_fpu , temp_sync ;
# ifdef USE_DYNAREC
static int temp_dynarec ;
# endif
/* Video category */
static int temp_gfxcard , temp_video_speed , temp_voodoo ;
/* Input devices category */
static int temp_mouse , temp_joystick ;
/* Sound category */
static int temp_sound_card , temp_midi_device , temp_mpu401 , temp_SSI2001 , temp_GAMEBLASTER , temp_GUS , temp_opl3_type ;
static int temp_float ;
/* Network category */
static int temp_net_type , temp_net_card ;
static char temp_pcap_dev [ 520 ] ;
/* Ports category */
static char temp_lpt_device_names [ 3 ] [ 16 ] ;
static int temp_serial [ 2 ] , temp_lpt ;
/* Other peripherals category */
static int temp_scsi_card , temp_ide_ter , temp_ide_ter_irq , temp_ide_qua , temp_ide_qua_irq ;
static char temp_hdc_name [ 16 ] ;
static char * hdc_names [ 16 ] ;
static int temp_bugger ;
static uint8_t temp_deviceconfig ;
/* Hard disks category */
static hard_disk_t temp_hdd [ HDD_NUM ] ;
/* Floppy drives category */
static int temp_fdd_types [ FDD_NUM ] ;
static int temp_fdd_turbo [ FDD_NUM ] ;
static int temp_fdd_check_bpb [ FDD_NUM ] ;
/* Other removable devices category */
static cdrom_drive_t temp_cdrom_drives [ CDROM_NUM ] ;
static zip_drive_t temp_zip_drives [ ZIP_NUM ] ;
static HWND hwndParentDialog , hwndChildDialog ;
static int displayed_category = 0 ;
2018-03-02 18:58:18 -05:00
static int ask_sure = 0 ;
2018-02-20 21:44:51 -05:00
static int romstolist [ ROM_MAX ] , listtomachine [ ROM_MAX ] , romstomachine [ ROM_MAX ] , machinetolist [ ROM_MAX ] ;
static int settings_sound_to_list [ 20 ] , settings_list_to_sound [ 20 ] ;
static int settings_midi_to_list [ 20 ] , settings_list_to_midi [ 20 ] ;
static int settings_mouse_to_list [ 20 ] , settings_list_to_mouse [ 20 ] ;
static int settings_scsi_to_list [ 20 ] , settings_list_to_scsi [ 20 ] ;
static int settings_network_to_list [ 20 ] , settings_list_to_network [ 20 ] ;
static uint64_t mfm_tracking , esdi_tracking , xtide_tracking , ide_tracking , scsi_tracking [ 16 ] ;
/* Show a MessageBox dialog. This is nasty, I know. --FvK */
static int
settings_msgbox ( int type , void * arg )
{
HWND h ;
int i ;
h = hwndMain ;
hwndMain = hwndParentDialog ;
i = ui_msgbox ( type , arg ) ;
hwndMain = h ;
return ( i ) ;
}
/* This does the initial read of global variables into the temporary ones. */
2018-03-02 18:58:18 -05:00
static void
settings_init ( void )
2018-02-20 21:44:51 -05:00
{
2018-03-02 18:58:18 -05:00
int i = 0 ;
/* Machine category */
temp_machine = machine ;
temp_cpu_m = cpu_manufacturer ;
temp_wait_states = cpu_waitstates ;
temp_cpu = cpu ;
temp_mem_size = mem_size ;
2018-02-20 21:44:51 -05:00
# ifdef USE_DYNAREC
2018-03-02 18:58:18 -05:00
temp_dynarec = cpu_use_dynarec ;
2018-02-20 21:44:51 -05:00
# endif
2018-03-02 18:58:18 -05:00
temp_fpu = enable_external_fpu ;
temp_sync = enable_sync ;
/* Video category */
temp_gfxcard = gfxcard ;
temp_video_speed = video_speed ;
temp_voodoo = voodoo_enabled ;
/* Input devices category */
temp_mouse = mouse_type ;
temp_joystick = joystick_type ;
/* Sound category */
temp_sound_card = sound_card_current ;
temp_midi_device = midi_device_current ;
temp_mpu401 = mpu401_standalone_enable ;
temp_SSI2001 = SSI2001 ;
temp_GAMEBLASTER = GAMEBLASTER ;
temp_GUS = GUS ;
temp_opl3_type = opl3_type ;
temp_float = sound_is_float ;
/* Network category */
temp_net_type = network_type ;
memset ( temp_pcap_dev , 0 , sizeof ( temp_pcap_dev ) ) ;
strcpy ( temp_pcap_dev , network_pcap ) ;
temp_net_card = network_card ;
/* Ports category */
for ( i = 0 ; i < 3 ; i + + )
strncpy ( temp_lpt_device_names [ i ] , lpt_device_names [ i ] , sizeof ( temp_lpt_device_names [ i ] ) - 1 ) ;
temp_serial [ 0 ] = serial_enabled [ 0 ] ;
temp_serial [ 1 ] = serial_enabled [ 1 ] ;
temp_lpt = lpt_enabled ;
/* Other peripherals category */
temp_scsi_card = scsi_card_current ;
strncpy ( temp_hdc_name , hdc_name , sizeof ( temp_hdc_name ) - 1 ) ;
temp_ide_ter = ide_enable [ 2 ] ;
temp_ide_ter_irq = ide_irq [ 2 ] ;
temp_ide_qua = ide_enable [ 3 ] ;
temp_ide_qua_irq = ide_irq [ 3 ] ;
temp_bugger = bugger_enabled ;
mfm_tracking = xtide_tracking = esdi_tracking = ide_tracking = 0 ;
for ( i = 0 ; i < 16 ; i + + )
scsi_tracking [ i ] = 0 ;
/* Hard disks category */
memcpy ( temp_hdd , hdd , HDD_NUM * sizeof ( hard_disk_t ) ) ;
for ( i = 0 ; i < HDD_NUM ; i + + ) {
if ( hdd [ i ] . bus = = HDD_BUS_MFM )
mfm_tracking | = ( 1 < < ( hdd [ i ] . mfm_channel < < 3 ) ) ;
else if ( hdd [ i ] . bus = = HDD_BUS_XTIDE )
xtide_tracking | = ( 1 < < ( hdd [ i ] . xtide_channel < < 3 ) ) ;
else if ( hdd [ i ] . bus = = HDD_BUS_ESDI )
esdi_tracking | = ( 1 < < ( hdd [ i ] . esdi_channel < < 3 ) ) ;
else if ( hdd [ i ] . bus = = HDD_BUS_IDE_PIO_ONLY )
ide_tracking | = ( 1 < < ( hdd [ i ] . ide_channel < < 3 ) ) ;
else if ( hdd [ i ] . bus = = HDD_BUS_IDE_PIO_AND_DMA )
ide_tracking | = ( 1 < < ( hdd [ i ] . ide_channel < < 3 ) ) ;
else if ( hdd [ i ] . bus = = HDD_BUS_SCSI )
scsi_tracking [ hdd [ i ] . scsi_id ] | = ( 1 < < ( hdd [ i ] . scsi_lun < < 3 ) ) ;
else if ( hdd [ i ] . bus = = HDD_BUS_SCSI_REMOVABLE )
scsi_tracking [ hdd [ i ] . scsi_id ] | = ( 1 < < ( hdd [ i ] . scsi_lun < < 3 ) ) ;
}
/* Floppy drives category */
for ( i = 0 ; i < FDD_NUM ; i + + ) {
temp_fdd_types [ i ] = fdd_get_type ( i ) ;
temp_fdd_turbo [ i ] = fdd_get_turbo ( i ) ;
temp_fdd_check_bpb [ i ] = fdd_get_check_bpb ( i ) ;
}
/* Other removable devices category */
memcpy ( temp_cdrom_drives , cdrom_drives , CDROM_NUM * sizeof ( cdrom_drive_t ) ) ;
for ( i = 0 ; i < CDROM_NUM ; i + + ) {
if ( cdrom_drives [ i ] . bus_type = = CDROM_BUS_ATAPI_PIO_ONLY )
ide_tracking | = ( 2 < < ( cdrom_drives [ i ] . ide_channel < < 3 ) ) ;
else if ( cdrom_drives [ i ] . bus_type = = CDROM_BUS_ATAPI_PIO_AND_DMA )
ide_tracking | = ( 2 < < ( cdrom_drives [ i ] . ide_channel < < 3 ) ) ;
else if ( cdrom_drives [ i ] . bus_type = = CDROM_BUS_SCSI )
scsi_tracking [ cdrom_drives [ i ] . scsi_device_id ] | = ( 2 < < ( cdrom_drives [ i ] . scsi_device_lun < < 3 ) ) ;
}
memcpy ( temp_zip_drives , zip_drives , ZIP_NUM * sizeof ( zip_drive_t ) ) ;
for ( i = 0 ; i < ZIP_NUM ; i + + ) {
if ( zip_drives [ i ] . bus_type = = ZIP_BUS_ATAPI_PIO_ONLY )
ide_tracking | = ( 4 < < ( zip_drives [ i ] . ide_channel < < 3 ) ) ;
else if ( zip_drives [ i ] . bus_type = = ZIP_BUS_ATAPI_PIO_AND_DMA )
ide_tracking | = ( 4 < < ( zip_drives [ i ] . ide_channel < < 3 ) ) ;
else if ( zip_drives [ i ] . bus_type = = ZIP_BUS_SCSI )
scsi_tracking [ zip_drives [ i ] . scsi_device_id ] | = ( 4 < < ( zip_drives [ i ] . scsi_device_lun < < 3 ) ) ;
}
temp_deviceconfig = 0 ;
2018-02-20 21:44:51 -05:00
}
/* This returns 1 if any variable has changed, 0 if not. */
2018-03-02 18:58:18 -05:00
static int
settings_changed ( void )
2018-02-20 21:44:51 -05:00
{
2018-03-02 18:58:18 -05:00
int i = 0 ;
int j = 0 ;
/* Machine category */
i = i | | ( machine ! = temp_machine ) ;
i = i | | ( cpu_manufacturer ! = temp_cpu_m ) ;
i = i | | ( cpu_waitstates ! = temp_wait_states ) ;
i = i | | ( cpu ! = temp_cpu ) ;
i = i | | ( mem_size ! = temp_mem_size ) ;
2018-02-20 21:44:51 -05:00
# ifdef USE_DYNAREC
2018-03-02 18:58:18 -05:00
i = i | | ( temp_dynarec ! = cpu_use_dynarec ) ;
2018-02-20 21:44:51 -05:00
# endif
2018-03-02 18:58:18 -05:00
i = i | | ( temp_fpu ! = enable_external_fpu ) ;
i = i | | ( temp_sync ! = enable_sync ) ;
/* Video category */
i = i | | ( gfxcard ! = temp_gfxcard ) ;
i = i | | ( video_speed ! = temp_video_speed ) ;
i = i | | ( voodoo_enabled ! = temp_voodoo ) ;
/* Input devices category */
i = i | | ( mouse_type ! = temp_mouse ) ;
i = i | | ( joystick_type ! = temp_joystick ) ;
/* Sound category */
i = i | | ( sound_card_current ! = temp_sound_card ) ;
i = i | | ( midi_device_current ! = temp_midi_device ) ;
i = i | | ( mpu401_standalone_enable ! = temp_mpu401 ) ;
i = i | | ( SSI2001 ! = temp_SSI2001 ) ;
i = i | | ( GAMEBLASTER ! = temp_GAMEBLASTER ) ;
i = i | | ( GUS ! = temp_GUS ) ;
i = i | | ( opl3_type ! = temp_opl3_type ) ;
i = i | | ( sound_is_float ! = temp_float ) ;
/* Network category */
i = i | | ( network_type ! = temp_net_type ) ;
i = i | | strcmp ( temp_pcap_dev , network_pcap ) ;
i = i | | ( network_card ! = temp_net_card ) ;
/* Ports category */
for ( j = 0 ; j < 3 ; j + + )
i = i | | strncmp ( temp_lpt_device_names [ j ] , lpt_device_names [ j ] , sizeof ( temp_lpt_device_names [ j ] ) - 1 ) ;
i = i | | ( temp_serial [ 0 ] ! = serial_enabled [ 0 ] ) ;
i = i | | ( temp_serial [ 1 ] ! = serial_enabled [ 1 ] ) ;
i = i | | ( temp_lpt ! = lpt_enabled ) ;
/* Peripherals category */
i = i | | ( scsi_card_current ! = temp_scsi_card ) ;
i = i | | strncmp ( temp_hdc_name , hdc_name , sizeof ( temp_hdc_name ) - 1 ) ;
i = i | | ( temp_ide_ter ! = ide_enable [ 2 ] ) ;
i = i | | ( temp_ide_ter_irq ! = ide_irq [ 2 ] ) ;
i = i | | ( temp_ide_qua ! = ide_enable [ 3 ] ) ;
i = i | | ( temp_ide_qua_irq ! = ide_irq [ 3 ] ) ;
i = i | | ( temp_bugger ! = bugger_enabled ) ;
/* Hard disks category */
i = i | | memcmp ( hdd , temp_hdd , HDD_NUM * sizeof ( hard_disk_t ) ) ;
/* Floppy drives category */
for ( j = 0 ; j < FDD_NUM ; j + + ) {
i = i | | ( temp_fdd_types [ j ] ! = fdd_get_type ( j ) ) ;
i = i | | ( temp_fdd_turbo [ j ] ! = fdd_get_turbo ( j ) ) ;
i = i | | ( temp_fdd_check_bpb [ j ] ! = fdd_get_check_bpb ( j ) ) ;
}
/* Other removable devices category */
i = i | | memcmp ( cdrom_drives , temp_cdrom_drives , CDROM_NUM * sizeof ( cdrom_drive_t ) ) ;
i = i | | memcmp ( zip_drives , temp_zip_drives , ZIP_NUM * sizeof ( zip_drive_t ) ) ;
i = i | | ! ! temp_deviceconfig ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
return ( i ) ;
2018-02-20 21:44:51 -05:00
}
2018-03-02 18:58:18 -05:00
static int
msgbox_reset ( void )
2018-02-20 21:44:51 -05:00
{
2018-03-02 18:58:18 -05:00
int i = 0 ;
int changed = 0 ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
changed = settings_changed ( ) ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
if ( changed ) {
i = settings_msgbox ( MBX_QUESTION , ( wchar_t * ) IDS_2051 ) ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
if ( i = = 1 ) return ( 1 ) ; /* no */
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
if ( i < 0 ) return ( 0 ) ; /* cancel */
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
return ( 2 ) ; /* yes */
} else {
return ( 1 ) ;
}
2018-02-20 21:44:51 -05:00
}
/* This saves the settings back to the global variables. */
2018-03-02 18:58:18 -05:00
static void
settings_save ( void )
2018-02-20 21:44:51 -05:00
{
2018-03-02 18:58:18 -05:00
int i = 0 ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
pc_reset_hard_close ( ) ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
/* Machine category */
machine = temp_machine ;
romset = machine_getromset ( ) ;
cpu_manufacturer = temp_cpu_m ;
cpu_waitstates = temp_wait_states ;
cpu = temp_cpu ;
mem_size = temp_mem_size ;
2018-02-20 21:44:51 -05:00
# ifdef USE_DYNAREC
2018-03-02 18:58:18 -05:00
cpu_use_dynarec = temp_dynarec ;
2018-02-20 21:44:51 -05:00
# endif
2018-03-02 18:58:18 -05:00
enable_external_fpu = temp_fpu ;
enable_sync = temp_sync ;
/* Video category */
gfxcard = temp_gfxcard ;
video_speed = temp_video_speed ;
voodoo_enabled = temp_voodoo ;
/* Input devices category */
mouse_type = temp_mouse ;
joystick_type = temp_joystick ;
/* Sound category */
sound_card_current = temp_sound_card ;
midi_device_current = temp_midi_device ;
mpu401_standalone_enable = temp_mpu401 ;
SSI2001 = temp_SSI2001 ;
GAMEBLASTER = temp_GAMEBLASTER ;
GUS = temp_GUS ;
opl3_type = temp_opl3_type ;
sound_is_float = temp_float ;
/* Network category */
network_type = temp_net_type ;
memset ( network_pcap , ' \0 ' , sizeof ( network_pcap ) ) ;
strcpy ( network_pcap , temp_pcap_dev ) ;
network_card = temp_net_card ;
/* Ports category */
for ( i = 0 ; i < 3 ; i + + )
strncpy ( lpt_device_names [ i ] , temp_lpt_device_names [ i ] , sizeof ( temp_lpt_device_names [ i ] ) - 1 ) ;
serial_enabled [ 0 ] = temp_serial [ 0 ] ;
serial_enabled [ 1 ] = temp_serial [ 1 ] ;
lpt_enabled = temp_lpt ;
/* Peripherals category */
scsi_card_current = temp_scsi_card ;
if ( hdc_name ) {
free ( hdc_name ) ;
hdc_name = NULL ;
}
hdc_name = ( char * ) malloc ( sizeof ( temp_hdc_name ) ) ;
strncpy ( hdc_name , temp_hdc_name , sizeof ( temp_hdc_name ) - 1 ) ;
hdc_init ( hdc_name ) ;
ide_enable [ 2 ] = temp_ide_ter ;
ide_irq [ 2 ] = temp_ide_ter_irq ;
ide_enable [ 3 ] = temp_ide_qua ;
ide_irq [ 3 ] = temp_ide_qua_irq ;
bugger_enabled = temp_bugger ;
/* Hard disks category */
memcpy ( hdd , temp_hdd , HDD_NUM * sizeof ( hard_disk_t ) ) ;
/* Floppy drives category */
for ( i = 0 ; i < FDD_NUM ; i + + ) {
fdd_set_type ( i , temp_fdd_types [ i ] ) ;
fdd_set_turbo ( i , temp_fdd_turbo [ i ] ) ;
fdd_set_check_bpb ( i , temp_fdd_check_bpb [ i ] ) ;
}
/* Removable devices category */
memcpy ( cdrom_drives , temp_cdrom_drives , CDROM_NUM * sizeof ( cdrom_drive_t ) ) ;
memcpy ( zip_drives , temp_zip_drives , ZIP_NUM * sizeof ( zip_drive_t ) ) ;
/* Mark configuration as changed. */
config_changed = 1 ;
2018-02-20 21:44:51 -05:00
}
static void win_settings_machine_recalc_cpu ( HWND hdlg )
{
HWND h ;
int temp_romset = 0 ;
# ifdef USE_DYNAREC
int cpu_flags ;
# endif
int cpu_type ;
temp_romset = machine_getromset_ex ( temp_machine ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_WS ) ;
cpu_type = machines [ romstomachine [ temp_romset ] ] . cpu [ temp_cpu_m ] . cpus [ temp_cpu ] . cpu_type ;
if ( ( cpu_type > = CPU_286 ) & & ( cpu_type < = CPU_386DX ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
# ifdef USE_DYNAREC
h = GetDlgItem ( hdlg , IDC_CHECK_DYNAREC ) ;
cpu_flags = machines [ romstomachine [ temp_romset ] ] . cpu [ temp_cpu_m ] . cpus [ temp_cpu ] . cpu_flags ;
if ( ! ( cpu_flags & CPU_SUPPORTS_DYNAREC ) & & ( cpu_flags & CPU_REQUIRES_DYNAREC ) )
{
fatal ( " Attempting to select a CPU that requires the recompiler and does not support it at the same time \n " ) ;
}
if ( ! ( cpu_flags & CPU_SUPPORTS_DYNAREC ) | | ( cpu_flags & CPU_REQUIRES_DYNAREC ) )
{
if ( ! ( cpu_flags & CPU_SUPPORTS_DYNAREC ) )
{
temp_dynarec = 0 ;
}
if ( cpu_flags & CPU_REQUIRES_DYNAREC )
{
temp_dynarec = 1 ;
}
SendMessage ( h , BM_SETCHECK , temp_dynarec , 0 ) ;
EnableWindow ( h , FALSE ) ;
}
else
{
EnableWindow ( h , TRUE ) ;
}
# endif
h = GetDlgItem ( hdlg , IDC_CHECK_FPU ) ;
cpu_type = machines [ romstomachine [ temp_romset ] ] . cpu [ temp_cpu_m ] . cpus [ temp_cpu ] . cpu_type ;
if ( ( cpu_type < CPU_i486DX ) & & ( cpu_type > = CPU_286 ) )
{
EnableWindow ( h , TRUE ) ;
}
else if ( cpu_type < CPU_286 )
{
temp_fpu = 0 ;
EnableWindow ( h , FALSE ) ;
}
else
{
temp_fpu = 1 ;
EnableWindow ( h , FALSE ) ;
}
SendMessage ( h , BM_SETCHECK , temp_fpu , 0 ) ;
}
static void win_settings_machine_recalc_cpu_m ( HWND hdlg )
{
HWND h ;
int c = 0 ;
int temp_romset = 0 ;
LPTSTR lptsTemp ;
char * stransi ;
temp_romset = machine_getromset_ex ( temp_machine ) ;
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_CPU ) ;
SendMessage ( h , CB_RESETCONTENT , 0 , 0 ) ;
c = 0 ;
while ( machines [ romstomachine [ temp_romset ] ] . cpu [ temp_cpu_m ] . cpus [ c ] . cpu_type ! = - 1 )
{
stransi = ( char * ) machines [ romstomachine [ temp_romset ] ] . cpu [ temp_cpu_m ] . cpus [ c ] . name ;
mbstowcs ( lptsTemp , stransi , strlen ( stransi ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) ( LPCSTR ) lptsTemp ) ;
c + + ;
}
EnableWindow ( h , TRUE ) ;
if ( temp_cpu > = c )
{
temp_cpu = ( c - 1 ) ;
}
SendMessage ( h , CB_SETCURSEL , temp_cpu , 0 ) ;
win_settings_machine_recalc_cpu ( hdlg ) ;
free ( lptsTemp ) ;
}
static void win_settings_machine_recalc_machine ( HWND hdlg )
{
HWND h ;
int c = 0 ;
int temp_romset = 0 ;
LPTSTR lptsTemp ;
const char * stransi ;
UDACCEL accel ;
temp_romset = machine_getromset_ex ( temp_machine ) ;
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_MACHINE ) ;
if ( machine_getdevice ( temp_machine ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_CPU_TYPE ) ;
SendMessage ( h , CB_RESETCONTENT , 0 , 0 ) ;
c = 0 ;
while ( machines [ romstomachine [ temp_romset ] ] . cpu [ c ] . cpus ! = NULL & & c < 4 )
{
stransi = machines [ romstomachine [ temp_romset ] ] . cpu [ c ] . name ;
mbstowcs ( lptsTemp , stransi , strlen ( stransi ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) ( LPCSTR ) lptsTemp ) ;
c + + ;
}
EnableWindow ( h , TRUE ) ;
if ( temp_cpu_m > = c )
{
temp_cpu_m = ( c - 1 ) ;
}
SendMessage ( h , CB_SETCURSEL , temp_cpu_m , 0 ) ;
if ( c = = 1 )
{
EnableWindow ( h , FALSE ) ;
}
else
{
EnableWindow ( h , TRUE ) ;
}
win_settings_machine_recalc_cpu_m ( hdlg ) ;
h = GetDlgItem ( hdlg , IDC_MEMSPIN ) ;
SendMessage ( h , UDM_SETRANGE , 0 , ( machines [ romstomachine [ temp_romset ] ] . min_ram < < 16 ) | machines [ romstomachine [ temp_romset ] ] . max_ram ) ;
accel . nSec = 0 ;
accel . nInc = machines [ romstomachine [ temp_romset ] ] . ram_granularity ;
SendMessage ( h , UDM_SETACCEL , 1 , ( LPARAM ) & accel ) ;
if ( ! ( machines [ romstomachine [ temp_romset ] ] . flags & MACHINE_AT ) | | ( machines [ romstomachine [ temp_romset ] ] . ram_granularity > = 128 ) )
{
SendMessage ( h , UDM_SETPOS , 0 , temp_mem_size ) ;
h = GetDlgItem ( hdlg , IDC_TEXT_MB ) ;
SendMessage ( h , WM_SETTEXT , 0 , ( LPARAM ) plat_get_string ( IDS_2094 ) ) ;
}
else
{
SendMessage ( h , UDM_SETPOS , 0 , temp_mem_size / 1024 ) ;
h = GetDlgItem ( hdlg , IDC_TEXT_MB ) ;
SendMessage ( h , WM_SETTEXT , 0 , ( LPARAM ) plat_get_string ( IDS_2087 ) ) ;
}
free ( lptsTemp ) ;
}
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
machine_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
HWND h ;
int c = 0 ;
int d = 0 ;
LPTSTR lptsTemp ;
char * stransi ;
switch ( message )
{
case WM_INITDIALOG :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_MACHINE ) ;
for ( c = 0 ; c < ROM_MAX ; c + + )
{
romstolist [ c ] = 0 ;
}
c = d = 0 ;
while ( machines [ c ] . id ! = - 1 )
{
if ( romspresent [ machines [ c ] . id ] )
{
stransi = ( char * ) machines [ c ] . name ;
mbstowcs ( lptsTemp , stransi , strlen ( stransi ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
machinetolist [ c ] = d ;
listtomachine [ d ] = c ;
romstolist [ machines [ c ] . id ] = d ;
romstomachine [ machines [ c ] . id ] = c ;
d + + ;
}
c + + ;
}
SendMessage ( h , CB_SETCURSEL , machinetolist [ temp_machine ] , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_WS ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2131 ) ) ;
for ( c = 0 ; c < 8 ; c + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( 2132 ) , c ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
SendMessage ( h , CB_SETCURSEL , temp_wait_states , 0 ) ;
# ifdef USE_DYNAREC
h = GetDlgItem ( hdlg , IDC_CHECK_DYNAREC ) ;
SendMessage ( h , BM_SETCHECK , temp_dynarec , 0 ) ;
# endif
h = GetDlgItem ( hdlg , IDC_MEMSPIN ) ;
SendMessage ( h , UDM_SETBUDDY , ( WPARAM ) GetDlgItem ( hdlg , IDC_MEMTEXT ) , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_SYNC ) ;
SendMessage ( h , BM_SETCHECK , temp_sync , 0 ) ;
win_settings_machine_recalc_machine ( hdlg ) ;
free ( lptsTemp ) ;
return TRUE ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_COMBO_MACHINE :
if ( HIWORD ( wParam ) = = CBN_SELCHANGE )
{
h = GetDlgItem ( hdlg , IDC_COMBO_MACHINE ) ;
temp_machine = listtomachine [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
win_settings_machine_recalc_machine ( hdlg ) ;
}
break ;
case IDC_COMBO_CPU_TYPE :
if ( HIWORD ( wParam ) = = CBN_SELCHANGE )
{
h = GetDlgItem ( hdlg , IDC_COMBO_CPU_TYPE ) ;
temp_cpu_m = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
temp_cpu = 0 ;
win_settings_machine_recalc_cpu_m ( hdlg ) ;
}
break ;
case IDC_COMBO_CPU :
if ( HIWORD ( wParam ) = = CBN_SELCHANGE )
{
h = GetDlgItem ( hdlg , IDC_COMBO_CPU ) ;
temp_cpu = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
win_settings_machine_recalc_cpu ( hdlg ) ;
}
break ;
case IDC_CONFIGURE_MACHINE :
h = GetDlgItem ( hdlg , IDC_COMBO_MACHINE ) ;
temp_machine = listtomachine [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
temp_deviceconfig | = deviceconfig_open ( hdlg , ( void * ) machine_getdevice ( temp_machine ) ) ;
break ;
}
return FALSE ;
case WM_SAVESETTINGS :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
stransi = ( char * ) malloc ( 512 ) ;
# ifdef USE_DYNAREC
h = GetDlgItem ( hdlg , IDC_CHECK_DYNAREC ) ;
temp_dynarec = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
# endif
h = GetDlgItem ( hdlg , IDC_CHECK_SYNC ) ;
temp_sync = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_FPU ) ;
temp_fpu = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_WS ) ;
temp_wait_states = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_MEMTEXT ) ;
SendMessage ( h , WM_GETTEXT , 255 , ( LPARAM ) lptsTemp ) ;
wcstombs ( stransi , lptsTemp , 512 ) ;
sscanf ( stransi , " %i " , & temp_mem_size ) ;
temp_mem_size & = ~ ( machines [ temp_machine ] . ram_granularity - 1 ) ;
if ( temp_mem_size < machines [ temp_machine ] . min_ram )
{
temp_mem_size = machines [ temp_machine ] . min_ram ;
}
else if ( temp_mem_size > machines [ temp_machine ] . max_ram )
{
temp_mem_size = machines [ temp_machine ] . max_ram ;
}
if ( ( machines [ temp_machine ] . flags & MACHINE_AT ) & & ( machines [ temp_machine ] . ram_granularity < 128 ) )
{
temp_mem_size * = 1024 ;
}
if ( machines [ temp_machine ] . flags & MACHINE_VIDEO )
{
gfxcard = GFX_INTERNAL ;
}
free ( stransi ) ;
free ( lptsTemp ) ;
default :
return FALSE ;
}
return FALSE ;
}
static void recalc_vid_list ( HWND hdlg )
{
HWND h = GetDlgItem ( hdlg , IDC_COMBO_VIDEO ) ;
int c = 0 , d = 0 ;
int found_card = 0 ;
WCHAR szText [ 512 ] ;
SendMessage ( h , CB_RESETCONTENT , 0 , 0 ) ;
SendMessage ( h , CB_SETCURSEL , 0 , 0 ) ;
while ( 1 )
{
/* Skip "internal" if machine doesn't have it. */
if ( c = = 1 & & ! ( machines [ temp_machine ] . flags & MACHINE_VIDEO ) ) {
c + + ;
continue ;
}
char * s = video_card_getname ( c ) ;
if ( ! s [ 0 ] )
break ;
if ( video_card_available ( c ) & & gfx_present [ video_new_to_old ( c ) ] & &
device_is_valid ( video_card_getdevice ( c ) , machines [ temp_machine ] . flags ) )
{
mbstowcs ( szText , s , strlen ( s ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) szText ) ;
if ( video_new_to_old ( c ) = = temp_gfxcard )
{
SendMessage ( h , CB_SETCURSEL , d , 0 ) ;
found_card = 1 ;
}
d + + ;
}
c + + ;
}
if ( ! found_card )
SendMessage ( h , CB_SETCURSEL , 0 , 0 ) ;
EnableWindow ( h , machines [ temp_machine ] . fixed_gfxcard ? FALSE : TRUE ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_VOODOO ) ;
EnableWindow ( h , ( machines [ temp_machine ] . flags & MACHINE_PCI ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_BUTTON_VOODOO ) ;
EnableWindow ( h , ( ( machines [ temp_machine ] . flags & MACHINE_PCI ) & & temp_voodoo ) ? TRUE : FALSE ) ;
}
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
video_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
HWND h ;
LPTSTR lptsTemp ;
char * stransi ;
int gfx = 0 ;
switch ( message )
{
case WM_INITDIALOG :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
stransi = ( char * ) malloc ( 512 ) ;
recalc_vid_list ( hdlg ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_VIDEO_SPEED ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2131 ) ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2133 ) ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2134 ) ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2135 ) ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2136 ) ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2137 ) ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2138 ) ) ;
SendMessage ( h , CB_SETCURSEL , temp_video_speed + 1 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_VOODOO ) ;
SendMessage ( h , BM_SETCHECK , temp_voodoo , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_VIDEO ) ;
SendMessage ( h , CB_GETLBTEXT , SendMessage ( h , CB_GETCURSEL , 0 , 0 ) , ( LPARAM ) lptsTemp ) ;
wcstombs ( stransi , lptsTemp , 512 ) ;
gfx = video_card_getid ( stransi ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_VID ) ;
if ( video_card_has_config ( gfx ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
free ( stransi ) ;
free ( lptsTemp ) ;
return TRUE ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_COMBO_VIDEO :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
stransi = ( char * ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_VIDEO ) ;
SendMessage ( h , CB_GETLBTEXT , SendMessage ( h , CB_GETCURSEL , 0 , 0 ) , ( LPARAM ) lptsTemp ) ;
wcstombs ( stransi , lptsTemp , 512 ) ;
gfx = video_card_getid ( stransi ) ;
temp_gfxcard = video_new_to_old ( gfx ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_VID ) ;
if ( video_card_has_config ( gfx ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
free ( stransi ) ;
free ( lptsTemp ) ;
break ;
case IDC_CHECK_VOODOO :
h = GetDlgItem ( hdlg , IDC_CHECK_VOODOO ) ;
temp_voodoo = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_BUTTON_VOODOO ) ;
EnableWindow ( h , temp_voodoo ? TRUE : FALSE ) ;
break ;
case IDC_BUTTON_VOODOO :
temp_deviceconfig | = deviceconfig_open ( hdlg , ( void * ) & voodoo_device ) ;
break ;
case IDC_CONFIGURE_VID :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
stransi = ( char * ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_VIDEO ) ;
SendMessage ( h , CB_GETLBTEXT , SendMessage ( h , CB_GETCURSEL , 0 , 0 ) , ( LPARAM ) lptsTemp ) ;
wcstombs ( stransi , lptsTemp , 512 ) ;
temp_deviceconfig | = deviceconfig_open ( hdlg , ( void * ) video_card_getdevice ( video_card_getid ( stransi ) ) ) ;
free ( stransi ) ;
free ( lptsTemp ) ;
break ;
}
return FALSE ;
case WM_SAVESETTINGS :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
stransi = ( char * ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_VIDEO ) ;
SendMessage ( h , CB_GETLBTEXT , SendMessage ( h , CB_GETCURSEL , 0 , 0 ) , ( LPARAM ) lptsTemp ) ;
wcstombs ( stransi , lptsTemp , 512 ) ;
temp_gfxcard = video_new_to_old ( video_card_getid ( stransi ) ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_VIDEO_SPEED ) ;
temp_video_speed = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) - 1 ;
h = GetDlgItem ( hdlg , IDC_CHECK_VOODOO ) ;
temp_voodoo = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
free ( stransi ) ;
free ( lptsTemp ) ;
default :
return FALSE ;
}
return FALSE ;
}
static int mouse_valid ( int num , int m )
{
device_t * dev ;
if ( ( num = = MOUSE_TYPE_INTERNAL ) & &
! ( machines [ m ] . flags & MACHINE_MOUSE ) ) return ( 0 ) ;
dev = mouse_get_device ( num ) ;
return ( device_is_valid ( dev , machines [ m ] . flags ) ) ;
}
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
input_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
wchar_t str [ 128 ] ;
HWND h ;
int c = 0 ;
int d = 0 ;
switch ( message )
{
case WM_INITDIALOG :
h = GetDlgItem ( hdlg , IDC_COMBO_MOUSE ) ;
c = d = 0 ;
for ( c = 0 ; c < mouse_get_ndev ( ) ; c + + )
{
settings_mouse_to_list [ c ] = d ;
if ( mouse_valid ( c , temp_machine ) )
{
mbstowcs ( str , mouse_get_name ( c ) , sizeof_w ( str ) ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) str ) ;
settings_list_to_mouse [ d ] = c ;
d + + ;
}
}
SendMessage ( h , CB_SETCURSEL , settings_mouse_to_list [ temp_mouse ] , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_MOUSE ) ;
if ( mouse_has_config ( temp_mouse ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_JOYSTICK ) ;
c = 0 ;
while ( joystick_get_name ( c ) )
{
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( 2144 + c ) ) ;
c + + ;
}
EnableWindow ( h , TRUE ) ;
SendMessage ( h , CB_SETCURSEL , temp_joystick , 0 ) ;
h = GetDlgItem ( hdlg , IDC_JOY1 ) ;
EnableWindow ( h , ( joystick_get_max_joysticks ( temp_joystick ) > = 1 ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_JOY2 ) ;
EnableWindow ( h , ( joystick_get_max_joysticks ( temp_joystick ) > = 2 ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_JOY3 ) ;
EnableWindow ( h , ( joystick_get_max_joysticks ( temp_joystick ) > = 3 ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_JOY4 ) ;
EnableWindow ( h , ( joystick_get_max_joysticks ( temp_joystick ) > = 4 ) ? TRUE : FALSE ) ;
return TRUE ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_COMBO_MOUSE :
h = GetDlgItem ( hdlg , IDC_COMBO_MOUSE ) ;
temp_mouse = settings_list_to_mouse [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_MOUSE ) ;
if ( mouse_has_config ( temp_mouse ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
break ;
case IDC_CONFIGURE_MOUSE :
h = GetDlgItem ( hdlg , IDC_COMBO_MOUSE ) ;
temp_mouse = settings_list_to_mouse [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
temp_deviceconfig | = deviceconfig_open ( hdlg , ( void * ) mouse_get_device ( temp_mouse ) ) ;
break ;
case IDC_COMBO_JOYSTICK :
h = GetDlgItem ( hdlg , IDC_COMBO_JOYSTICK ) ;
temp_joystick = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_JOY1 ) ;
EnableWindow ( h , ( joystick_get_max_joysticks ( temp_joystick ) > = 1 ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_JOY2 ) ;
EnableWindow ( h , ( joystick_get_max_joysticks ( temp_joystick ) > = 2 ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_JOY3 ) ;
EnableWindow ( h , ( joystick_get_max_joysticks ( temp_joystick ) > = 3 ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_JOY4 ) ;
EnableWindow ( h , ( joystick_get_max_joysticks ( temp_joystick ) > = 4 ) ? TRUE : FALSE ) ;
break ;
case IDC_JOY1 :
h = GetDlgItem ( hdlg , IDC_COMBO_JOYSTICK ) ;
temp_joystick = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
temp_deviceconfig | = joystickconfig_open ( hdlg , 0 , temp_joystick ) ;
break ;
case IDC_JOY2 :
h = GetDlgItem ( hdlg , IDC_COMBO_JOYSTICK ) ;
temp_joystick = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
temp_deviceconfig | = joystickconfig_open ( hdlg , 1 , temp_joystick ) ;
break ;
case IDC_JOY3 :
h = GetDlgItem ( hdlg , IDC_COMBO_JOYSTICK ) ;
temp_joystick = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
temp_deviceconfig | = joystickconfig_open ( hdlg , 2 , temp_joystick ) ;
break ;
case IDC_JOY4 :
h = GetDlgItem ( hdlg , IDC_COMBO_JOYSTICK ) ;
temp_joystick = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
temp_deviceconfig | = joystickconfig_open ( hdlg , 3 , temp_joystick ) ;
break ;
}
return FALSE ;
case WM_SAVESETTINGS :
h = GetDlgItem ( hdlg , IDC_COMBO_MOUSE ) ;
temp_mouse = settings_list_to_mouse [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
h = GetDlgItem ( hdlg , IDC_COMBO_JOYSTICK ) ;
temp_joystick = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
default :
return FALSE ;
}
return FALSE ;
}
int mpu401_present ( void )
{
char * n ;
n = sound_card_get_internal_name ( temp_sound_card ) ;
if ( n ! = NULL )
{
if ( ! strcmp ( n , " sb16 " ) | | ! strcmp ( n , " sbawe32 " ) )
{
return 1 ;
}
}
return temp_mpu401 ? 1 : 0 ;
}
int mpu401_standalone_allow ( void )
{
char * n , * md ;
n = sound_card_get_internal_name ( temp_sound_card ) ;
md = midi_device_get_internal_name ( temp_midi_device ) ;
if ( n ! = NULL )
{
if ( ! strcmp ( n , " sb16 " ) | | ! strcmp ( n , " sbawe32 " ) )
{
return 0 ;
}
}
if ( md ! = NULL )
{
if ( ! strcmp ( md , " none " ) )
{
return 0 ;
}
}
return 1 ;
}
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
sound_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
HWND h ;
int c = 0 ;
int d = 0 ;
LPTSTR lptsTemp ;
device_t * sound_dev /*, *midi_dev*/ ;
char * s ;
switch ( message )
{
case WM_INITDIALOG :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_SOUND ) ;
c = d = 0 ;
while ( 1 )
{
s = sound_card_getname ( c ) ;
if ( ! s [ 0 ] )
{
break ;
}
settings_sound_to_list [ c ] = d ;
if ( sound_card_available ( c ) )
{
sound_dev = sound_card_getdevice ( c ) ;
if ( device_is_valid ( sound_dev , machines [ temp_machine ] . flags ) )
{
if ( c = = 0 )
{
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2152 ) ) ;
}
else
{
mbstowcs ( lptsTemp , s , strlen ( s ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
settings_list_to_sound [ d ] = c ;
d + + ;
}
}
c + + ;
}
SendMessage ( h , CB_SETCURSEL , settings_sound_to_list [ temp_sound_card ] , 0 ) ;
EnableWindow ( h , d ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_SND ) ;
if ( sound_card_has_config ( temp_sound_card ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_MIDI ) ;
c = d = 0 ;
while ( 1 )
{
s = midi_device_getname ( c ) ;
if ( ! s [ 0 ] )
{
break ;
}
settings_midi_to_list [ c ] = d ;
if ( midi_device_available ( c ) )
{
/* midi_dev = midi_device_getdevice(c); */
if ( c = = 0 )
{
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2152 ) ) ;
}
else
{
mbstowcs ( lptsTemp , s , strlen ( s ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
settings_list_to_midi [ d ] = c ;
d + + ;
}
c + + ;
}
SendMessage ( h , CB_SETCURSEL , settings_midi_to_list [ temp_midi_device ] , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_MIDI ) ;
if ( midi_device_has_config ( temp_midi_device ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_CHECK_MPU401 ) ;
SendMessage ( h , BM_SETCHECK , temp_mpu401 , 0 ) ;
EnableWindow ( h , mpu401_standalone_allow ( ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_MPU401 ) ;
EnableWindow ( h , ( mpu401_standalone_allow ( ) & & temp_mpu401 ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_CMS ) ;
SendMessage ( h , BM_SETCHECK , temp_GAMEBLASTER , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_GUS ) ;
SendMessage ( h , BM_SETCHECK , temp_GUS , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_SSI ) ;
SendMessage ( h , BM_SETCHECK , temp_SSI2001 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_NUKEDOPL ) ;
SendMessage ( h , BM_SETCHECK , temp_opl3_type , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_FLOAT ) ;
SendMessage ( h , BM_SETCHECK , temp_float , 0 ) ;
free ( lptsTemp ) ;
return TRUE ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_COMBO_SOUND :
h = GetDlgItem ( hdlg , IDC_COMBO_SOUND ) ;
temp_sound_card = settings_list_to_sound [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_SND ) ;
if ( sound_card_has_config ( temp_sound_card ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_CHECK_MPU401 ) ;
SendMessage ( h , BM_SETCHECK , temp_mpu401 , 0 ) ;
EnableWindow ( h , mpu401_standalone_allow ( ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_MPU401 ) ;
EnableWindow ( h , ( mpu401_standalone_allow ( ) & & temp_mpu401 ) ? TRUE : FALSE ) ;
break ;
case IDC_CONFIGURE_SND :
h = GetDlgItem ( hdlg , IDC_COMBO_SOUND ) ;
temp_sound_card = settings_list_to_sound [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
temp_deviceconfig | = deviceconfig_open ( hdlg , ( void * ) sound_card_getdevice ( temp_sound_card ) ) ;
break ;
case IDC_COMBO_MIDI :
h = GetDlgItem ( hdlg , IDC_COMBO_MIDI ) ;
temp_midi_device = settings_list_to_midi [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_MIDI ) ;
if ( midi_device_has_config ( temp_midi_device ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_CHECK_MPU401 ) ;
SendMessage ( h , BM_SETCHECK , temp_mpu401 , 0 ) ;
EnableWindow ( h , mpu401_standalone_allow ( ) ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_MPU401 ) ;
EnableWindow ( h , ( mpu401_standalone_allow ( ) & & temp_mpu401 ) ? TRUE : FALSE ) ;
break ;
case IDC_CONFIGURE_MIDI :
h = GetDlgItem ( hdlg , IDC_COMBO_MIDI ) ;
temp_midi_device = settings_list_to_midi [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
temp_deviceconfig | = deviceconfig_open ( hdlg , ( void * ) midi_device_getdevice ( temp_midi_device ) ) ;
break ;
case IDC_CHECK_MPU401 :
h = GetDlgItem ( hdlg , IDC_CHECK_MPU401 ) ;
temp_mpu401 = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_MPU401 ) ;
EnableWindow ( h , mpu401_present ( ) ? TRUE : FALSE ) ;
break ;
case IDC_CONFIGURE_MPU401 :
temp_deviceconfig | = deviceconfig_open ( hdlg , ( void * ) & mpu401_device ) ;
break ;
}
return FALSE ;
case WM_SAVESETTINGS :
h = GetDlgItem ( hdlg , IDC_COMBO_SOUND ) ;
temp_sound_card = settings_list_to_sound [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
h = GetDlgItem ( hdlg , IDC_COMBO_MIDI ) ;
temp_midi_device = settings_list_to_midi [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
h = GetDlgItem ( hdlg , IDC_CHECK_MPU401 ) ;
temp_mpu401 = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_CMS ) ;
temp_GAMEBLASTER = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_GUS ) ;
temp_GUS = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_SSI ) ;
temp_SSI2001 = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_NUKEDOPL ) ;
temp_opl3_type = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_FLOAT ) ;
temp_float = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
default :
return FALSE ;
}
return FALSE ;
}
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
ports_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
HWND h ;
int c = 0 ;
int d = 0 ;
char * s ;
LPTSTR lptsTemp ;
int i ;
switch ( message )
{
case WM_INITDIALOG :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
for ( i = 0 ; i < 3 ; i + + ) {
h = GetDlgItem ( hdlg , IDC_COMBO_LPT1 + i ) ;
c = d = 0 ;
while ( 1 ) {
s = lpt_device_get_name ( c ) ;
if ( ! s )
break ;
if ( c = = 0 ) {
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2152 ) ) ;
} else {
mbstowcs ( lptsTemp , s , strlen ( s ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
if ( ! strcmp ( temp_lpt_device_names [ i ] , lpt_device_get_internal_name ( c ) ) )
d = c ;
c + + ;
}
SendMessage ( h , CB_SETCURSEL , d , 0 ) ;
}
h = GetDlgItem ( hdlg , IDC_CHECK_SERIAL1 ) ;
SendMessage ( h , BM_SETCHECK , temp_serial [ 0 ] , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_SERIAL2 ) ;
SendMessage ( h , BM_SETCHECK , temp_serial [ 1 ] , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_PARALLEL ) ;
SendMessage ( h , BM_SETCHECK , temp_lpt , 0 ) ;
free ( lptsTemp ) ;
return TRUE ;
case WM_SAVESETTINGS :
for ( i = 0 ; i < 3 ; i + + ) {
h = GetDlgItem ( hdlg , IDC_COMBO_LPT1 + i ) ;
c = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
strcpy ( temp_lpt_device_names [ i ] , lpt_device_get_internal_name ( c ) ) ;
}
h = GetDlgItem ( hdlg , IDC_CHECK_SERIAL1 ) ;
temp_serial [ 0 ] = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_SERIAL2 ) ;
temp_serial [ 1 ] = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK_PARALLEL ) ;
temp_lpt = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
default :
return FALSE ;
}
return FALSE ;
}
static void recalc_hdc_list ( HWND hdlg , int machine , int use_selected_hdc )
{
HWND h ;
char * s ;
int valid = 0 ;
char old_name [ 16 ] ;
int c , d ;
LPTSTR lptsTemp ;
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HDC ) ;
valid = 0 ;
if ( use_selected_hdc )
{
c = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
if ( c ! = - 1 & & hdc_names [ c ] )
{
strncpy ( old_name , hdc_names [ c ] , sizeof ( old_name ) - 1 ) ;
}
else
{
strcpy ( old_name , " none " ) ;
}
}
else
{
strncpy ( old_name , temp_hdc_name , sizeof ( old_name ) - 1 ) ;
}
SendMessage ( h , CB_RESETCONTENT , 0 , 0 ) ;
c = d = 0 ;
while ( 1 )
{
s = hdc_get_name ( c ) ;
if ( s [ 0 ] = = 0 )
{
break ;
}
if ( c = = 1 & & ! ( machines [ temp_machine ] . flags & MACHINE_HDC ) )
{
/* Skip "Internal" if machine doesn't have one. */
c + + ;
continue ;
}
if ( ! hdc_available ( c ) | | ! device_is_valid ( hdc_get_device ( c ) , machines [ temp_machine ] . flags ) )
{
c + + ;
continue ;
}
mbstowcs ( lptsTemp , s , strlen ( s ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
hdc_names [ d ] = hdc_get_internal_name ( c ) ;
if ( ! strcmp ( old_name , hdc_names [ d ] ) )
{
SendMessage ( h , CB_SETCURSEL , d , 0 ) ;
valid = 1 ;
}
c + + ;
d + + ;
}
if ( ! valid )
{
SendMessage ( h , CB_SETCURSEL , 0 , 0 ) ;
}
EnableWindow ( h , d ? TRUE : FALSE ) ;
free ( lptsTemp ) ;
}
int valid_ide_irqs [ 11 ] = { 2 , 3 , 4 , 5 , 7 , 9 , 10 , 11 , 12 , 14 , 15 } ;
int find_irq_in_array ( int irq , int def )
{
int i = 0 ;
for ( i = 0 ; i < 11 ; i + + )
{
if ( valid_ide_irqs [ i ] = = irq )
{
return i + 1 ;
}
}
return 7 + def ;
}
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
peripherals_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
HWND h ;
int c = 0 ;
int d = 0 ;
LPTSTR lptsTemp ;
device_t * scsi_dev ;
switch ( message )
{
case WM_INITDIALOG :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
/*SCSI config*/
h = GetDlgItem ( hdlg , IDC_COMBO_SCSI ) ;
c = d = 0 ;
while ( 1 )
{
char * s = scsi_card_getname ( c ) ;
if ( ! s [ 0 ] )
{
break ;
}
settings_scsi_to_list [ c ] = d ;
if ( scsi_card_available ( c ) )
{
scsi_dev = scsi_card_getdevice ( c ) ;
if ( device_is_valid ( scsi_dev , machines [ temp_machine ] . flags ) )
{
if ( c = = 0 )
{
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_2152 ) ) ;
}
else
{
mbstowcs ( lptsTemp , s , strlen ( s ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
settings_list_to_scsi [ d ] = c ;
d + + ;
}
}
c + + ;
}
SendMessage ( h , CB_SETCURSEL , settings_scsi_to_list [ temp_scsi_card ] , 0 ) ;
EnableWindow ( h , d ? TRUE : FALSE ) ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_SCSI ) ;
if ( scsi_card_has_config ( temp_scsi_card ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
recalc_hdc_list ( hdlg , temp_machine , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_IDE_TER ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_5376 ) ) ;
for ( c = 0 ; c < 11 ; c + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_2155 ) , valid_ide_irqs [ c ] ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
if ( temp_ide_ter )
{
SendMessage ( h , CB_SETCURSEL , find_irq_in_array ( temp_ide_ter_irq , 0 ) , 0 ) ;
}
else
{
SendMessage ( h , CB_SETCURSEL , 0 , 0 ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_IDE_QUA ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_5376 ) ) ;
for ( c = 0 ; c < 11 ; c + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_2155 ) , valid_ide_irqs [ c ] ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
if ( temp_ide_qua )
{
SendMessage ( h , CB_SETCURSEL , find_irq_in_array ( temp_ide_qua_irq , 1 ) , 0 ) ;
}
else
{
SendMessage ( h , CB_SETCURSEL , 0 , 0 ) ;
}
h = GetDlgItem ( hdlg , IDC_CHECK_BUGGER ) ;
SendMessage ( h , BM_SETCHECK , temp_bugger , 0 ) ;
free ( lptsTemp ) ;
return TRUE ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_CONFIGURE_SCSI :
h = GetDlgItem ( hdlg , IDC_COMBO_SCSI ) ;
temp_scsi_card = settings_list_to_scsi [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
temp_deviceconfig | = deviceconfig_open ( hdlg , ( void * ) scsi_card_getdevice ( temp_scsi_card ) ) ;
break ;
case IDC_COMBO_SCSI :
h = GetDlgItem ( hdlg , IDC_COMBO_SCSI ) ;
temp_scsi_card = settings_list_to_scsi [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
h = GetDlgItem ( hdlg , IDC_CONFIGURE_SCSI ) ;
if ( scsi_card_has_config ( temp_scsi_card ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
break ;
}
return FALSE ;
case WM_SAVESETTINGS :
h = GetDlgItem ( hdlg , IDC_COMBO_HDC ) ;
c = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
if ( hdc_names [ c ] )
{
strncpy ( temp_hdc_name , hdc_names [ c ] , sizeof ( temp_hdc_name ) - 1 ) ;
}
else
{
strcpy ( temp_hdc_name , " none " ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_SCSI ) ;
temp_scsi_card = settings_list_to_scsi [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
h = GetDlgItem ( hdlg , IDC_COMBO_IDE_TER ) ;
temp_ide_ter = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
if ( temp_ide_ter > 1 )
{
temp_ide_ter_irq = valid_ide_irqs [ temp_ide_ter - 1 ] ;
temp_ide_ter = 1 ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_IDE_QUA ) ;
temp_ide_qua = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
if ( temp_ide_qua > 1 )
{
temp_ide_qua_irq = valid_ide_irqs [ temp_ide_qua - 1 ] ;
temp_ide_qua = 1 ;
}
h = GetDlgItem ( hdlg , IDC_CHECK_BUGGER ) ;
temp_bugger = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
default :
return FALSE ;
}
return FALSE ;
}
int net_ignore_message = 0 ;
static void network_recalc_combos ( HWND hdlg )
{
HWND h ;
net_ignore_message = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_PCAP ) ;
if ( temp_net_type = = NET_TYPE_PCAP )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_NET ) ;
if ( temp_net_type = = NET_TYPE_SLIRP )
{
EnableWindow ( h , TRUE ) ;
}
else if ( ( temp_net_type = = NET_TYPE_PCAP ) & &
( network_dev_to_id ( temp_pcap_dev ) > 0 ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_CONFIGURE_NET ) ;
if ( network_card_has_config ( temp_net_card ) & &
( temp_net_type = = NET_TYPE_SLIRP ) )
{
EnableWindow ( h , TRUE ) ;
}
else if ( network_card_has_config ( temp_net_card ) & &
( temp_net_type = = NET_TYPE_PCAP ) & &
( network_dev_to_id ( temp_pcap_dev ) > 0 ) )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
net_ignore_message = 0 ;
}
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
network_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
HWND h ;
int c = 0 ;
int d = 0 ;
LPTSTR lptsTemp ;
switch ( message )
{
case WM_INITDIALOG :
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_NET_TYPE ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) L " None " ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) L " PCap " ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) L " SLiRP " ) ;
SendMessage ( h , CB_SETCURSEL , temp_net_type , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_PCAP ) ;
if ( temp_net_type = = NET_TYPE_PCAP )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_PCAP ) ;
for ( c = 0 ; c < network_ndev ; c + + )
{
mbstowcs ( lptsTemp , network_devs [ c ] . description , strlen ( network_devs [ c ] . description ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
SendMessage ( h , CB_SETCURSEL , network_dev_to_id ( temp_pcap_dev ) , 0 ) ;
/*NIC config*/
h = GetDlgItem ( hdlg , IDC_COMBO_NET ) ;
c = d = 0 ;
while ( 1 )
{
char * s = network_card_getname ( c ) ;
if ( s [ 0 ] = = ' \0 ' )
{
break ;
}
settings_network_to_list [ c ] = d ;
if ( network_card_available ( c ) & & device_is_valid ( network_card_getdevice ( c ) , machines [ temp_machine ] . flags ) )
{
if ( c = = 0 )
{
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( 2152 ) ) ;
}
else
{
mbstowcs ( lptsTemp , s , strlen ( s ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
settings_list_to_network [ d ] = c ;
d + + ;
}
c + + ;
}
SendMessage ( h , CB_SETCURSEL , settings_network_to_list [ temp_net_card ] , 0 ) ;
EnableWindow ( h , d ? TRUE : FALSE ) ;
network_recalc_combos ( hdlg ) ;
free ( lptsTemp ) ;
return TRUE ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_COMBO_NET_TYPE :
if ( net_ignore_message )
{
return FALSE ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_NET_TYPE ) ;
temp_net_type = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
network_recalc_combos ( hdlg ) ;
break ;
case IDC_COMBO_PCAP :
if ( net_ignore_message )
{
return FALSE ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_PCAP ) ;
memset ( temp_pcap_dev , ' \0 ' , sizeof ( temp_pcap_dev ) ) ;
strcpy ( temp_pcap_dev , network_devs [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] . device ) ;
network_recalc_combos ( hdlg ) ;
break ;
case IDC_COMBO_NET :
if ( net_ignore_message )
{
return FALSE ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_NET ) ;
temp_net_card = settings_list_to_network [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
network_recalc_combos ( hdlg ) ;
break ;
case IDC_CONFIGURE_NET :
if ( net_ignore_message )
{
return FALSE ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_NET ) ;
temp_net_card = settings_list_to_network [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
temp_deviceconfig | = deviceconfig_open ( hdlg , ( void * ) network_card_getdevice ( temp_net_card ) ) ;
break ;
}
return FALSE ;
case WM_SAVESETTINGS :
h = GetDlgItem ( hdlg , IDC_COMBO_NET_TYPE ) ;
temp_net_type = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_PCAP ) ;
memset ( temp_pcap_dev , ' \0 ' , sizeof ( temp_pcap_dev ) ) ;
strcpy ( temp_pcap_dev , network_devs [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] . device ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_NET ) ;
temp_net_card = settings_list_to_network [ SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ] ;
default :
return FALSE ;
}
return FALSE ;
}
static BOOL win_settings_hard_disks_image_list_init ( HWND hwndList )
{
HICON hiconItem ;
HIMAGELIST hSmall ;
hSmall = ImageList_Create ( GetSystemMetrics ( SM_CXSMICON ) ,
GetSystemMetrics ( SM_CYSMICON ) ,
ILC_MASK | ILC_COLOR32 , 1 , 1 ) ;
hiconItem = LoadIcon ( hinstance , ( LPCWSTR ) 208 ) ;
ImageList_AddIcon ( hSmall , hiconItem ) ;
DestroyIcon ( hiconItem ) ;
hiconItem = LoadIcon ( hinstance , ( LPCWSTR ) 192 ) ;
ImageList_AddIcon ( hSmall , hiconItem ) ;
DestroyIcon ( hiconItem ) ;
ListView_SetImageList ( hwndList , hSmall , LVSIL_SMALL ) ;
return TRUE ;
}
int next_free_id = 0 ;
static void normalize_hd_list ( )
{
hard_disk_t ihdd [ HDD_NUM ] ;
int i , j ;
j = 0 ;
memset ( ihdd , 0x00 , HDD_NUM * sizeof ( hard_disk_t ) ) ;
for ( i = 0 ; i < HDD_NUM ; i + + )
{
if ( temp_hdd [ i ] . bus ! = HDD_BUS_DISABLED )
{
memcpy ( & ( ihdd [ j ] ) , & ( temp_hdd [ i ] ) , sizeof ( hard_disk_t ) ) ;
j + + ;
}
}
memcpy ( temp_hdd , ihdd , HDD_NUM * sizeof ( hard_disk_t ) ) ;
}
int hdc_id_to_listview_index [ HDD_NUM ] ;
int hd_listview_items ;
hard_disk_t new_hdd ;
int hdlv_current_sel ;
static int get_selected_hard_disk ( HWND hdlg )
{
int hard_disk = - 1 ;
int i , j = 0 ;
HWND h ;
if ( hd_listview_items = = 0 )
{
return 0 ;
}
for ( i = 0 ; i < hd_listview_items ; i + + )
{
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
j = ListView_GetItemState ( h , i , LVIS_SELECTED ) ;
if ( j )
{
hard_disk = i ;
}
}
return hard_disk ;
}
static void add_locations ( HWND hdlg )
{
LPTSTR lptsTemp ;
HWND h ;
int i = 0 ;
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
for ( i = 0 ; i < 7 ; i + + )
{
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_4352 + i ) ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
for ( i = 0 ; i < 8 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4097 ) , i > > 1 , i & 1 ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_HD_ID ) ;
for ( i = 0 ; i < 16 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4098 ) , i ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_HD_LUN ) ;
for ( i = 0 ; i < 8 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4098 ) , i ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL_IDE ) ;
for ( i = 0 ; i < 8 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4097 ) , i > > 1 , i & 1 ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
free ( lptsTemp ) ;
}
static uint8_t next_free_binary_channel ( uint64_t * tracking )
{
int64_t i ;
for ( i = 0 ; i < 2 ; i + + ) {
if ( ! ( * tracking & ( 0xffLL < < ( i < < 3LL ) ) ) )
return i ;
}
return 2 ;
}
static uint8_t next_free_ide_channel ( void )
{
int64_t i ;
for ( i = 0 ; i < 8 ; i + + ) {
if ( ! ( ide_tracking & ( 0xffLL < < ( i < < 3LL ) ) ) )
return i ;
}
return 7 ;
}
static void next_free_scsi_id_and_lun ( uint8_t * id , uint8_t * lun )
{
int64_t i , j ;
for ( j = 0 ; j < 8 ; j + + ) {
for ( i = 0 ; i < 16 ; i + + ) {
if ( ! ( scsi_tracking [ i ] & ( 0xffLL < < ( j < < 3LL ) ) ) ) {
* id = i ;
* lun = j ;
return ;
}
}
}
* id = 6 ;
* lun = 7 ;
}
static void recalc_location_controls ( HWND hdlg , int is_add_dlg , int assign_id )
{
int i = 0 ;
HWND h ;
int bus = 0 ;
for ( i = IDT_1722 ; i < = IDT_1724 ; i + + )
{
h = GetDlgItem ( hdlg , i ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_ID ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_LUN ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL_IDE ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
if ( ( hd_listview_items > 0 ) | | is_add_dlg )
{
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
bus = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
bus + + ;
switch ( bus )
{
case HDD_BUS_MFM : /* MFM */
h = GetDlgItem ( hdlg , IDT_1722 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
if ( assign_id )
temp_hdd [ hdlv_current_sel ] . mfm_channel = next_free_binary_channel ( & mfm_tracking ) ;
SendMessage ( h , CB_SETCURSEL , is_add_dlg ? new_hdd . mfm_channel : temp_hdd [ hdlv_current_sel ] . mfm_channel , 0 ) ;
break ;
case HDD_BUS_XTIDE : /* XT IDE */
h = GetDlgItem ( hdlg , IDT_1722 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
if ( assign_id )
temp_hdd [ hdlv_current_sel ] . xtide_channel = next_free_binary_channel ( & xtide_tracking ) ;
SendMessage ( h , CB_SETCURSEL , is_add_dlg ? new_hdd . xtide_channel : temp_hdd [ hdlv_current_sel ] . xtide_channel , 0 ) ;
break ;
case HDD_BUS_ESDI : /* ESDI */
h = GetDlgItem ( hdlg , IDT_1722 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
if ( assign_id )
temp_hdd [ hdlv_current_sel ] . esdi_channel = next_free_binary_channel ( & esdi_tracking ) ;
SendMessage ( h , CB_SETCURSEL , is_add_dlg ? new_hdd . esdi_channel : temp_hdd [ hdlv_current_sel ] . esdi_channel , 0 ) ;
break ;
case HDD_BUS_IDE_PIO_ONLY : /* IDE (PIO-only) */
case HDD_BUS_IDE_PIO_AND_DMA : /* IDE (PIO and DMA) */
h = GetDlgItem ( hdlg , IDT_1722 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL_IDE ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
if ( assign_id )
temp_hdd [ hdlv_current_sel ] . ide_channel = next_free_ide_channel ( ) ;
SendMessage ( h , CB_SETCURSEL , is_add_dlg ? new_hdd . ide_channel : temp_hdd [ hdlv_current_sel ] . ide_channel , 0 ) ;
break ;
case HDD_BUS_SCSI : /* SCSI */
case HDD_BUS_SCSI_REMOVABLE : /* SCSI (removable) */
h = GetDlgItem ( hdlg , IDT_1723 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDT_1724 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
if ( assign_id )
next_free_scsi_id_and_lun ( ( uint8_t * ) & temp_hdd [ hdlv_current_sel ] . scsi_id , ( uint8_t * ) & temp_hdd [ hdlv_current_sel ] . scsi_lun ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_ID ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
SendMessage ( h , CB_SETCURSEL , is_add_dlg ? new_hdd . scsi_id : temp_hdd [ hdlv_current_sel ] . scsi_id , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_LUN ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
SendMessage ( h , CB_SETCURSEL , is_add_dlg ? new_hdd . scsi_lun : temp_hdd [ hdlv_current_sel ] . scsi_lun , 0 ) ;
break ;
}
}
if ( ( hd_listview_items = = 0 ) & & ! is_add_dlg )
{
h = GetDlgItem ( hdlg , IDT_1721 ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
EnableWindow ( h , FALSE ) ; ShowWindow ( h , SW_HIDE ) ;
}
else
{
h = GetDlgItem ( hdlg , IDT_1721 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
}
}
static int bus_full ( uint64_t * tracking , int count )
{
int full = 0 ;
switch ( count ) {
case 2 :
default :
full = ( * tracking & 0xFF00LL ) ;
full = full & & ( * tracking & 0x00FFLL ) ;
return full ;
case 8 :
full = ( * tracking & 0xFF00000000000000LL ) ;
full = full & & ( * tracking & 0x00FF000000000000LL ) ;
full = full & & ( * tracking & 0x0000FF0000000000LL ) ;
full = full & & ( * tracking & 0x000000FF00000000LL ) ;
full = full & & ( * tracking & 0x00000000FF000000LL ) ;
full = full & & ( * tracking & 0x0000000000FF0000LL ) ;
full = full & & ( * tracking & 0x000000000000FF00LL ) ;
full = full & & ( * tracking & 0x00000000000000FFLL ) ;
return full ;
}
}
static void recalc_next_free_id ( HWND hdlg )
{
HWND h ;
int i ;
int c_mfm = 0 ;
int c_esdi = 0 ;
int c_xtide = 0 ;
int c_ide_pio = 0 ;
int c_ide_dma = 0 ;
int c_scsi = 0 ;
int enable_add = 0 ;
next_free_id = - 1 ;
for ( i = 0 ; i < HDD_NUM ; i + + )
{
if ( temp_hdd [ i ] . bus = = HDD_BUS_MFM )
{
c_mfm + + ;
}
else if ( temp_hdd [ i ] . bus = = HDD_BUS_ESDI )
{
c_esdi + + ;
}
else if ( temp_hdd [ i ] . bus = = HDD_BUS_XTIDE )
{
c_xtide + + ;
}
else if ( temp_hdd [ i ] . bus = = HDD_BUS_IDE_PIO_ONLY )
{
c_ide_pio + + ;
}
else if ( temp_hdd [ i ] . bus = = HDD_BUS_IDE_PIO_AND_DMA )
{
c_ide_dma + + ;
}
else if ( temp_hdd [ i ] . bus = = HDD_BUS_SCSI )
{
c_scsi + + ;
}
else if ( temp_hdd [ i ] . bus = = HDD_BUS_SCSI_REMOVABLE )
{
c_scsi + + ;
}
}
for ( i = 0 ; i < HDD_NUM ; i + + )
{
if ( temp_hdd [ i ] . bus = = HDD_BUS_DISABLED )
{
next_free_id = i ;
break ;
}
}
enable_add = enable_add | | ( next_free_id > = 0 ) ;
enable_add = enable_add & & ( ( c_mfm < MFM_NUM ) | | ( c_esdi < ESDI_NUM ) | | ( c_xtide < XTIDE_NUM ) | | ( c_ide_pio < IDE_NUM ) | | ( c_ide_dma < IDE_NUM ) | | ( c_scsi < SCSI_NUM ) ) ;
enable_add = enable_add & & ! bus_full ( & mfm_tracking , 2 ) ;
enable_add = enable_add & & ! bus_full ( & esdi_tracking , 2 ) ;
enable_add = enable_add & & ! bus_full ( & xtide_tracking , 2 ) ;
enable_add = enable_add & & ! bus_full ( & ide_tracking , 8 ) ;
for ( i = 0 ; i < 16 ; i + + )
enable_add = enable_add & & ! bus_full ( & ( scsi_tracking [ i ] ) , 8 ) ;
h = GetDlgItem ( hdlg , IDC_BUTTON_HDD_ADD_NEW ) ;
if ( enable_add )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_BUTTON_HDD_ADD ) ;
if ( enable_add )
{
EnableWindow ( h , TRUE ) ;
}
else
{
EnableWindow ( h , FALSE ) ;
}
h = GetDlgItem ( hdlg , IDC_BUTTON_HDD_REMOVE ) ;
if ( ( c_mfm = = 0 ) & & ( c_esdi = = 0 ) & & ( c_xtide = = 0 ) & & ( c_ide_pio = = 0 ) & & ( c_ide_dma = = 0 ) & & ( c_scsi = = 0 ) )
{
EnableWindow ( h , FALSE ) ;
}
else
{
EnableWindow ( h , TRUE ) ;
}
}
static void win_settings_hard_disks_update_item ( HWND hwndList , int i , int column )
{
LVITEM lvI ;
WCHAR szText [ 256 ] ;
lvI . mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE ;
lvI . stateMask = lvI . iSubItem = lvI . state = 0 ;
lvI . iSubItem = column ;
lvI . iItem = i ;
if ( column = = 0 )
{
switch ( temp_hdd [ i ] . bus )
{
case HDD_BUS_MFM :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4608 ) , temp_hdd [ i ] . mfm_channel > > 1 , temp_hdd [ i ] . mfm_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_XTIDE :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4609 ) , temp_hdd [ i ] . xtide_channel > > 1 , temp_hdd [ i ] . xtide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_ESDI :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4610 ) , temp_hdd [ i ] . esdi_channel > > 1 , temp_hdd [ i ] . esdi_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_IDE_PIO_ONLY :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4611 ) , temp_hdd [ i ] . ide_channel > > 1 , temp_hdd [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_IDE_PIO_AND_DMA :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4612 ) , temp_hdd [ i ] . ide_channel > > 1 , temp_hdd [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_SCSI :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4613 ) , temp_hdd [ i ] . scsi_id , temp_hdd [ i ] . scsi_lun ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_SCSI_REMOVABLE :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4614 ) , temp_hdd [ i ] . scsi_id , temp_hdd [ i ] . scsi_lun ) ;
2018-02-20 21:44:51 -05:00
break ;
}
lvI . pszText = szText ;
lvI . iImage = ( temp_hdd [ i ] . bus = = HDD_BUS_SCSI_REMOVABLE ) ? 1 : 0 ;
}
else if ( column = = 1 )
{
lvI . pszText = temp_hdd [ i ] . fn ;
lvI . iImage = 0 ;
}
else if ( column = = 2 )
{
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4098 ) , temp_hdd [ i ] . tracks ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 0 ;
}
else if ( column = = 3 )
{
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4098 ) , temp_hdd [ i ] . hpc ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 0 ;
}
else if ( column = = 4 )
{
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4098 ) , temp_hdd [ i ] . spt ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 0 ;
}
else if ( column = = 5 )
{
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4098 ) , ( temp_hdd [ i ] . tracks * temp_hdd [ i ] . hpc * temp_hdd [ i ] . spt ) > > 11 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 0 ;
}
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return ;
}
}
static BOOL win_settings_hard_disks_recalc_list ( HWND hwndList )
{
LVITEM lvI ;
int i = 0 ;
int j = 0 ;
WCHAR szText [ 256 ] ;
hd_listview_items = 0 ;
hdlv_current_sel = - 1 ;
ListView_DeleteAllItems ( hwndList ) ;
lvI . mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE ;
lvI . stateMask = lvI . iSubItem = lvI . state = 0 ;
for ( i = 0 ; i < HDD_NUM ; i + + )
{
if ( temp_hdd [ i ] . bus > 0 )
{
hdc_id_to_listview_index [ i ] = j ;
lvI . iSubItem = 0 ;
switch ( temp_hdd [ i ] . bus )
{
case HDD_BUS_MFM :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4608 ) , temp_hdd [ i ] . mfm_channel > > 1 , temp_hdd [ i ] . mfm_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_XTIDE :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4609 ) , temp_hdd [ i ] . xtide_channel > > 1 , temp_hdd [ i ] . xtide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_ESDI :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4610 ) , temp_hdd [ i ] . esdi_channel > > 1 , temp_hdd [ i ] . esdi_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_IDE_PIO_ONLY :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4611 ) , temp_hdd [ i ] . ide_channel > > 1 , temp_hdd [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_IDE_PIO_AND_DMA :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4612 ) , temp_hdd [ i ] . ide_channel > > 1 , temp_hdd [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_SCSI :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4613 ) , temp_hdd [ i ] . scsi_id , temp_hdd [ i ] . scsi_lun ) ;
2018-02-20 21:44:51 -05:00
break ;
case HDD_BUS_SCSI_REMOVABLE :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4614 ) , temp_hdd [ i ] . scsi_id , temp_hdd [ i ] . scsi_lun ) ;
2018-02-20 21:44:51 -05:00
break ;
}
lvI . pszText = szText ;
lvI . iItem = j ;
lvI . iImage = ( temp_hdd [ i ] . bus = = HDD_BUS_SCSI_REMOVABLE ) ? 1 : 0 ;
if ( ListView_InsertItem ( hwndList , & lvI ) = = - 1 )
{
return FALSE ;
}
lvI . iSubItem = 1 ;
lvI . pszText = temp_hdd [ i ] . fn ;
lvI . iItem = j ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return FALSE ;
}
lvI . iSubItem = 2 ;
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4098 ) , temp_hdd [ i ] . tracks ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iItem = j ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return FALSE ;
}
lvI . iSubItem = 3 ;
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4098 ) , temp_hdd [ i ] . hpc ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iItem = j ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return FALSE ;
}
lvI . iSubItem = 4 ;
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4098 ) , temp_hdd [ i ] . spt ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iItem = j ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return FALSE ;
}
lvI . iSubItem = 5 ;
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_4098 ) , ( temp_hdd [ i ] . tracks * temp_hdd [ i ] . hpc * temp_hdd [ i ] . spt ) > > 11 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iItem = j ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return FALSE ;
}
j + + ;
}
else
{
hdc_id_to_listview_index [ i ] = - 1 ;
}
}
hd_listview_items = j ;
return TRUE ;
}
/* Icon, Bus, File, C, H, S, Size */
# define C_COLUMNS_HARD_DISKS 6
static BOOL win_settings_hard_disks_init_columns ( HWND hwndList )
{
LVCOLUMN lvc ;
int iCol ;
lvc . mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM ;
for ( iCol = 0 ; iCol < C_COLUMNS_HARD_DISKS ; iCol + + )
{
lvc . iSubItem = iCol ;
lvc . pszText = plat_get_string ( 2082 + iCol ) ;
switch ( iCol )
{
case 0 : /* Bus */
lvc . cx = 135 ;
lvc . fmt = LVCFMT_LEFT ;
break ;
case 2 : /* Cylinders */
lvc . cx = 41 ;
lvc . fmt = LVCFMT_RIGHT ;
break ;
case 3 : /* Heads */
case 4 : /* Sectors */
lvc . cx = 25 ;
lvc . fmt = LVCFMT_RIGHT ;
break ;
case 1 : /* File */
lvc . cx = 150 ;
lvc . fmt = LVCFMT_LEFT ;
break ;
case 5 : /* Size (MB) 8 */
lvc . cx = 41 ;
lvc . fmt = LVCFMT_RIGHT ;
break ;
}
if ( ListView_InsertColumn ( hwndList , iCol , & lvc ) = = - 1 )
{
return FALSE ;
}
}
return TRUE ;
}
static void get_edit_box_contents ( HWND hdlg , int id , uint64_t * val )
{
HWND h ;
WCHAR szText [ 256 ] ;
char stransi [ 256 ] ;
h = GetDlgItem ( hdlg , id ) ;
SendMessage ( h , WM_GETTEXT , 255 , ( LPARAM ) szText ) ;
wcstombs ( stransi , szText , 256 ) ;
sscanf ( stransi , " % " PRIu64 , val ) ;
}
static void get_combo_box_selection ( HWND hdlg , int id , uint64_t * val )
{
HWND h ;
h = GetDlgItem ( hdlg , id ) ;
* val = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
}
static void set_edit_box_contents ( HWND hdlg , int id , uint64_t val )
{
HWND h ;
WCHAR szText [ 256 ] ;
h = GetDlgItem ( hdlg , id ) ;
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_2156 ) , val ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , WM_SETTEXT , ( WPARAM ) wcslen ( szText ) , ( LPARAM ) szText ) ;
}
int hard_disk_added = 0 ;
int max_spt = 63 ;
int max_hpc = 255 ;
int max_tracks = 266305 ;
int no_update = 0 ;
int existing = 0 ;
uint64_t selection = 127 ;
uint64_t spt , hpc , tracks , size ;
wchar_t hd_file_name [ 512 ] ;
static hard_disk_t * hdd_ptr ;
static int hdconf_initialize_hdt_combo ( HWND hdlg )
{
HWND h ;
int i = 0 ;
uint64_t temp_size = 0 ;
uint64_t size_mb = 0 ;
WCHAR szText [ 256 ] ;
selection = 127 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_TYPE ) ;
for ( i = 0 ; i < 127 ; i + + )
{
temp_size = hdd_table [ i ] [ 0 ] * hdd_table [ i ] [ 1 ] * hdd_table [ i ] [ 2 ] ;
size_mb = temp_size > > 11 ;
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( IDS_2157 ) , size_mb , hdd_table [ i ] [ 0 ] , hdd_table [ i ] [ 1 ] , hdd_table [ i ] [ 2 ] ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) szText ) ;
if ( ( tracks = = hdd_table [ i ] [ 0 ] ) & & ( hpc = = hdd_table [ i ] [ 1 ] ) & & ( spt = = hdd_table [ i ] [ 2 ] ) )
{
selection = i ;
}
}
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_4100 ) ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_4101 ) ) ;
SendMessage ( h , CB_SETCURSEL , selection , 0 ) ;
return selection ;
}
static void recalc_selection ( HWND hdlg )
{
HWND h ;
int i = 0 ;
selection = 127 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_TYPE ) ;
for ( i = 0 ; i < 127 ; i + + )
{
if ( ( tracks = = hdd_table [ i ] [ 0 ] ) & & ( hpc = = hdd_table [ i ] [ 1 ] ) & & ( spt = = hdd_table [ i ] [ 2 ] ) )
{
selection = i ;
}
}
if ( ( selection = = 127 ) & & ( hpc = = 16 ) & & ( spt = = 63 ) )
{
selection = 128 ;
}
SendMessage ( h , CB_SETCURSEL , selection , 0 ) ;
}
static int chs_enabled = 0 ;
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
hard_disks_add_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
2018-02-22 01:50:46 +01:00
HWND h = INVALID_HANDLE_VALUE ;
2018-02-20 21:44:51 -05:00
int64_t i = 0 ;
uint64_t temp ;
FILE * f ;
uint32_t sector_size = 512 ;
uint32_t zero = 0 ;
uint32_t base = 0x1000 ;
uint64_t signature = 0xD778A82044445459ll ;
char buf [ 512 ] ;
char * big_buf ;
int b = 0 ;
uint64_t r = 0 ;
uint8_t channel = 0 ;
uint8_t id = 0 , lun = 0 ;
switch ( message )
{
case WM_INITDIALOG :
memset ( hd_file_name , 0 , sizeof ( hd_file_name ) ) ;
if ( existing & 2 )
{
next_free_id = ( existing > > 3 ) & 0x1f ;
hdd_ptr = & ( hdd [ next_free_id ] ) ;
}
else
{
hdd_ptr = & ( temp_hdd [ next_free_id ] ) ;
}
SetWindowText ( hdlg , plat_get_string ( ( existing & 1 ) ? IDS_4103 : IDS_4102 ) ) ;
no_update = 1 ;
spt = ( existing & 1 ) ? 0 : 17 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , spt ) ;
hpc = ( existing & 1 ) ? 0 : 15 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , hpc ) ;
tracks = ( existing & 1 ) ? 0 : 1023 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , tracks ) ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , size > > 20 ) ;
hdconf_initialize_hdt_combo ( hdlg ) ;
if ( existing & 1 )
{
h = GetDlgItem ( hdlg , IDC_EDIT_HD_SPT ) ;
EnableWindow ( h , FALSE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_HPC ) ;
EnableWindow ( h , FALSE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_CYL ) ;
EnableWindow ( h , FALSE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_SIZE ) ;
EnableWindow ( h , FALSE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_TYPE ) ;
EnableWindow ( h , FALSE ) ;
chs_enabled = 0 ;
}
else
{
chs_enabled = 1 ;
}
add_locations ( hdlg ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
if ( existing & 2 )
{
hdd_ptr - > bus = HDD_BUS_SCSI_REMOVABLE ;
max_spt = 99 ;
max_hpc = 255 ;
}
else
{
hdd_ptr - > bus = HDD_BUS_IDE_PIO_ONLY ;
max_spt = 63 ;
max_hpc = 255 ;
}
SendMessage ( h , CB_SETCURSEL , hdd_ptr - > bus , 0 ) ;
max_tracks = 266305 ;
recalc_location_controls ( hdlg , 1 , 0 ) ;
if ( existing & 2 )
{
/* We're functioning as a load image dialog for a removable SCSI hard disk,
called from win . c , so let ' s hide the bus selection as we should not
allow it at this point . */
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , 1798 ) ;
ShowWindow ( h , SW_HIDE ) ;
/* Disable and hide the SCSI ID and LUN combo boxes. */
h = GetDlgItem ( hdlg , IDC_COMBO_HD_ID ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_LUN ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
/* Set the file name edit box contents to our existing parameters. */
h = GetDlgItem ( hdlg , IDC_EDIT_HD_FILE_NAME ) ;
SendMessage ( h , WM_SETTEXT , 0 , ( LPARAM ) hdd [ next_free_id ] . fn ) ;
}
else
{
channel = next_free_ide_channel ( ) ;
next_free_scsi_id_and_lun ( & id , & lun ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
SendMessage ( h , CB_SETCURSEL , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_ID ) ;
SendMessage ( h , CB_SETCURSEL , id , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_LUN ) ;
SendMessage ( h , CB_SETCURSEL , lun , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL_IDE ) ;
SendMessage ( h , CB_SETCURSEL , channel , 0 ) ;
new_hdd . mfm_channel = next_free_binary_channel ( & mfm_tracking ) ;
new_hdd . esdi_channel = next_free_binary_channel ( & esdi_tracking ) ;
new_hdd . xtide_channel = next_free_binary_channel ( & xtide_tracking ) ;
new_hdd . ide_channel = channel ;
new_hdd . scsi_id = id ;
new_hdd . scsi_lun = lun ;
}
h = GetDlgItem ( hdlg , IDC_EDIT_HD_FILE_NAME ) ;
EnableWindow ( h , FALSE ) ;
h = GetDlgItem ( hdlg , IDT_1752 ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_PBAR_IMG_CREATE ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
no_update = 0 ;
return TRUE ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDOK :
if ( ! ( existing & 2 ) )
{
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
hdd_ptr - > bus = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) + 1 ;
}
/* Make sure no file name is allowed with removable SCSI hard disks. */
if ( ( wcslen ( hd_file_name ) = = 0 ) & & ( hdd_ptr - > bus ! = HDD_BUS_SCSI_REMOVABLE ) )
{
hdd_ptr - > bus = HDD_BUS_DISABLED ;
settings_msgbox ( MBX_ERROR , ( wchar_t * ) IDS_4112 ) ;
return TRUE ;
}
else if ( ( wcslen ( hd_file_name ) = = 0 ) & & ( hdd_ptr - > bus = = HDD_BUS_SCSI_REMOVABLE ) )
{
/* Mark hard disk added but return empty - it will signify the disk was ejected. */
hdd_ptr - > spt = hdd_ptr - > hpc = hdd_ptr - > tracks = 0 ;
memset ( hdd_ptr - > fn , 0 , sizeof ( hdd_ptr - > fn ) ) ;
goto hd_add_ok_common ;
}
get_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , & ( hdd_ptr - > spt ) ) ;
get_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , & ( hdd_ptr - > hpc ) ) ;
get_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , & ( hdd_ptr - > tracks ) ) ;
spt = hdd_ptr - > spt ;
hpc = hdd_ptr - > hpc ;
tracks = hdd_ptr - > tracks ;
if ( existing & 2 )
{
if ( hdd_ptr - > bus = = HDD_BUS_SCSI_REMOVABLE )
{
memset ( hdd_ptr - > prev_fn , 0 , sizeof ( hdd_ptr - > prev_fn ) ) ;
wcscpy ( hdd_ptr - > prev_fn , hdd_ptr - > fn ) ;
}
}
else
{
switch ( hdd_ptr - > bus )
{
case HDD_BUS_MFM :
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
hdd_ptr - > mfm_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
break ;
case HDD_BUS_ESDI :
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
hdd_ptr - > esdi_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
break ;
case HDD_BUS_XTIDE :
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
hdd_ptr - > xtide_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
break ;
case HDD_BUS_IDE_PIO_ONLY :
case HDD_BUS_IDE_PIO_AND_DMA :
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL_IDE ) ;
hdd_ptr - > ide_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
break ;
case HDD_BUS_SCSI :
case HDD_BUS_SCSI_REMOVABLE :
h = GetDlgItem ( hdlg , IDC_COMBO_HD_ID ) ;
hdd_ptr - > scsi_id = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_LUN ) ;
hdd_ptr - > scsi_lun = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
break ;
}
}
memset ( hdd_ptr - > fn , 0 , sizeof ( hdd_ptr - > fn ) ) ;
wcscpy ( hdd_ptr - > fn , hd_file_name ) ;
sector_size = 512 ;
if ( ! ( existing & 1 ) & & ( wcslen ( hd_file_name ) > 0 ) )
{
f = _wfopen ( hd_file_name , L " wb " ) ;
if ( image_is_hdi ( hd_file_name ) )
{
if ( size > = 0x100000000ll )
{
fclose ( f ) ;
settings_msgbox ( MBX_ERROR , ( wchar_t * ) IDS_4104 ) ;
return TRUE ;
}
fwrite ( & zero , 1 , 4 , f ) ; /* 00000000: Zero/unknown */
fwrite ( & zero , 1 , 4 , f ) ; /* 00000004: Zero/unknown */
fwrite ( & base , 1 , 4 , f ) ; /* 00000008: Offset at which data starts */
fwrite ( & size , 1 , 4 , f ) ; /* 0000000C: Full size of the data (32-bit) */
fwrite ( & sector_size , 1 , 4 , f ) ; /* 00000010: Sector size in bytes */
fwrite ( & spt , 1 , 4 , f ) ; /* 00000014: Sectors per cylinder */
fwrite ( & hpc , 1 , 4 , f ) ; /* 00000018: Heads per cylinder */
fwrite ( & tracks , 1 , 4 , f ) ; /* 0000001C: Cylinders */
for ( i = 0 ; i < 0x3f8 ; i + + )
{
fwrite ( & zero , 1 , 4 , f ) ;
}
}
else if ( image_is_hdx ( hd_file_name , 0 ) )
{
if ( size > 0xffffffffffffffffll )
{
fclose ( f ) ;
settings_msgbox ( MBX_ERROR , ( wchar_t * ) IDS_4105 ) ;
return TRUE ;
}
fwrite ( & signature , 1 , 8 , f ) ; /* 00000000: Signature */
fwrite ( & size , 1 , 8 , f ) ; /* 00000008: Full size of the data (64-bit) */
fwrite ( & sector_size , 1 , 4 , f ) ; /* 00000010: Sector size in bytes */
fwrite ( & spt , 1 , 4 , f ) ; /* 00000014: Sectors per cylinder */
fwrite ( & hpc , 1 , 4 , f ) ; /* 00000018: Heads per cylinder */
fwrite ( & tracks , 1 , 4 , f ) ; /* 0000001C: Cylinders */
fwrite ( & zero , 1 , 4 , f ) ; /* 00000020: [Translation] Sectors per cylinder */
fwrite ( & zero , 1 , 4 , f ) ; /* 00000004: [Translation] Heads per cylinder */
}
memset ( buf , 0 , 512 ) ;
size > > = 9 ;
r = ( size > > 11 ) < < 11 ;
size - = r ;
r > > = 11 ;
if ( size | | r ) {
h = GetDlgItem ( hdlg , IDT_1731 ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_FILE_NAME ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_CFILE ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_PBAR_IMG_CREATE ) ;
SendMessage ( h , PBM_SETRANGE32 , ( WPARAM ) 0 , ( LPARAM ) ( size + r - 1 ) ) ;
SendMessage ( h , PBM_SETPOS , ( WPARAM ) 0 , ( LPARAM ) 0 ) ;
EnableWindow ( h , TRUE ) ;
ShowWindow ( h , SW_SHOW ) ;
h = GetDlgItem ( hdlg , IDT_1752 ) ;
EnableWindow ( h , TRUE ) ;
ShowWindow ( h , SW_SHOW ) ;
}
if ( size )
{
for ( i = 0 ; i < size ; i + + )
{
fwrite ( buf , 1 , 512 , f ) ;
SendMessage ( h , PBM_SETPOS , ( WPARAM ) i , ( LPARAM ) 0 ) ;
}
}
if ( r )
{
big_buf = ( char * ) malloc ( 1048576 ) ;
memset ( big_buf , 0 , 1048576 ) ;
for ( i = 0 ; i < r ; i + + )
{
fwrite ( big_buf , 1 , 1048576 , f ) ;
SendMessage ( h , PBM_SETPOS , ( WPARAM ) ( size + i ) , ( LPARAM ) 0 ) ;
}
free ( big_buf ) ;
}
fclose ( f ) ;
settings_msgbox ( MBX_INFO , ( wchar_t * ) IDS_4113 ) ;
}
hd_add_ok_common :
hard_disk_added = 1 ;
EndDialog ( hdlg , 0 ) ;
return TRUE ;
case IDCANCEL :
hard_disk_added = 0 ;
if ( ! ( existing & 2 ) )
{
hdd_ptr - > bus = HDD_BUS_DISABLED ;
}
EndDialog ( hdlg , 0 ) ;
return TRUE ;
case IDC_CFILE :
if ( ! file_dlg_w ( hdlg , plat_get_string ( IDS_4106 ) , L " " , ! ( existing & 1 ) ) )
{
if ( ! ( existing & 1 ) )
{
f = _wfopen ( wopenfilestring , L " rb " ) ;
if ( f ! = NULL )
{
fclose ( f ) ;
if ( settings_msgbox ( MBX_QUESTION , ( wchar_t * ) IDS_4111 ) ! = 0 ) /* yes */
{
return FALSE ;
}
}
}
f = _wfopen ( wopenfilestring , ( existing & 1 ) ? L " rb " : L " wb " ) ;
if ( f = = NULL )
{
hdd_add_file_open_error :
settings_msgbox ( MBX_ERROR , ( existing & 1 ) ? ( wchar_t * ) IDS_4107 : ( wchar_t * ) IDS_4108 ) ;
return TRUE ;
}
if ( existing & 1 )
{
if ( image_is_hdi ( wopenfilestring ) | | image_is_hdx ( wopenfilestring , 1 ) )
{
fseeko64 ( f , 0x10 , SEEK_SET ) ;
fread ( & sector_size , 1 , 4 , f ) ;
if ( sector_size ! = 512 )
{
settings_msgbox ( MBX_ERROR , ( wchar_t * ) IDS_4109 ) ;
fclose ( f ) ;
return TRUE ;
}
spt = hpc = tracks = 0 ;
fread ( & spt , 1 , 4 , f ) ;
fread ( & hpc , 1 , 4 , f ) ;
fread ( & tracks , 1 , 4 , f ) ;
}
else
{
fseeko64 ( f , 0 , SEEK_END ) ;
size = ftello64 ( f ) ;
fclose ( f ) ;
if ( ( ( size % 17 ) = = 0 ) & & ( size < = 142606336 ) )
{
spt = 17 ;
if ( size < = 26738688 )
{
hpc = 4 ;
}
else if ( ( ( size % 3072 ) = = 0 ) & & ( size < = 53477376 ) )
{
hpc = 6 ;
}
else
{
for ( i = 5 ; i < 16 ; i + + )
{
if ( ( ( size % ( i < < 9 ) ) = = 0 ) & & ( size < = ( ( i * 17 ) < < 19 ) ) )
{
break ;
}
if ( i = = 5 )
{
i + + ;
}
}
hpc = i ;
}
}
else
{
spt = 63 ;
hpc = 16 ;
}
tracks = ( ( size > > 9 ) / hpc ) / spt ;
}
if ( ( spt > max_spt ) | | ( hpc > max_hpc ) | | ( tracks > max_tracks ) )
{
goto hdd_add_file_open_error ;
}
no_update = 1 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , spt ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , hpc ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , tracks ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , size > > 20 ) ;
recalc_selection ( hdlg ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_SPT ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_HPC ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_CYL ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_SIZE ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_TYPE ) ;
EnableWindow ( h , TRUE ) ;
chs_enabled = 1 ;
no_update = 0 ;
}
else
{
fclose ( f ) ;
}
}
h = GetDlgItem ( hdlg , IDC_EDIT_HD_FILE_NAME ) ;
SendMessage ( h , WM_SETTEXT , 0 , ( LPARAM ) wopenfilestring ) ;
memset ( hd_file_name , 0 , sizeof ( hd_file_name ) ) ;
wcscpy ( hd_file_name , wopenfilestring ) ;
return TRUE ;
case IDC_EDIT_HD_CYL :
if ( no_update )
{
return FALSE ;
}
no_update = 1 ;
get_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , & temp ) ;
if ( temp ! = tracks )
{
tracks = temp ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , size > > 20 ) ;
recalc_selection ( hdlg ) ;
}
if ( tracks > max_tracks )
{
tracks = max_tracks ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , tracks ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
no_update = 0 ;
break ;
case IDC_EDIT_HD_HPC :
if ( no_update )
{
return FALSE ;
}
no_update = 1 ;
get_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , & temp ) ;
if ( temp ! = hpc )
{
hpc = temp ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , size > > 20 ) ;
recalc_selection ( hdlg ) ;
}
if ( hpc > max_hpc )
{
hpc = max_hpc ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , hpc ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
no_update = 0 ;
break ;
case IDC_EDIT_HD_SPT :
if ( no_update )
{
return FALSE ;
}
no_update = 1 ;
get_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , & temp ) ;
if ( temp ! = spt )
{
spt = temp ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , size > > 20 ) ;
recalc_selection ( hdlg ) ;
}
if ( spt > max_spt )
{
spt = max_spt ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , spt ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
no_update = 0 ;
break ;
case IDC_EDIT_HD_SIZE :
if ( no_update )
{
return FALSE ;
}
no_update = 1 ;
get_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , & temp ) ;
if ( temp ! = ( size > > 20 ) )
{
size = temp < < 20 ;
tracks = ( ( size > > 9 ) / hpc ) / spt ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , tracks ) ;
recalc_selection ( hdlg ) ;
}
if ( tracks > max_tracks )
{
tracks = max_tracks ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , tracks ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
no_update = 0 ;
break ;
case IDC_COMBO_HD_TYPE :
if ( no_update )
{
return FALSE ;
}
no_update = 1 ;
get_combo_box_selection ( hdlg , IDC_COMBO_HD_TYPE , & temp ) ;
if ( ( temp ! = selection ) & & ( temp ! = 127 ) & & ( temp ! = 128 ) )
{
selection = temp ;
tracks = hdd_table [ selection ] [ 0 ] ;
hpc = hdd_table [ selection ] [ 1 ] ;
spt = hdd_table [ selection ] [ 2 ] ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , tracks ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , hpc ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , spt ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , size > > 20 ) ;
}
else if ( ( temp ! = selection ) & & ( temp = = 127 ) )
{
selection = temp ;
}
else if ( ( temp ! = selection ) & & ( temp = = 128 ) )
{
selection = temp ;
hpc = 16 ;
spt = 63 ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , hpc ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , spt ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , size > > 20 ) ;
}
if ( spt > max_spt )
{
spt = max_spt ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , spt ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
if ( hpc > max_hpc )
{
hpc = max_hpc ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , hpc ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
if ( tracks > max_tracks )
{
tracks = max_tracks ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , tracks ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
no_update = 0 ;
break ;
case IDC_COMBO_HD_BUS :
if ( no_update )
{
return FALSE ;
}
no_update = 1 ;
recalc_location_controls ( hdlg , 1 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
b = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) + 1 ;
if ( b = = hdd_ptr - > bus )
{
goto hd_add_bus_skip ;
}
hdd_ptr - > bus = b ;
switch ( hdd_ptr - > bus )
{
case HDD_BUS_DISABLED :
default :
max_spt = max_hpc = max_tracks = 0 ;
break ;
case HDD_BUS_MFM :
max_spt = 17 ;
max_hpc = 15 ;
max_tracks = 1023 ;
break ;
case HDD_BUS_ESDI :
case HDD_BUS_XTIDE :
max_spt = 63 ;
max_hpc = 16 ;
max_tracks = 1023 ;
break ;
case HDD_BUS_IDE_PIO_ONLY :
case HDD_BUS_IDE_PIO_AND_DMA :
max_spt = 63 ;
max_hpc = 255 ;
max_tracks = 266305 ;
break ;
case HDD_BUS_SCSI_REMOVABLE :
if ( spt = = 0 )
{
spt = 63 ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , spt ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
}
if ( hpc = = 0 )
{
hpc = 16 ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , hpc ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
}
if ( tracks = = 0 )
{
tracks = 1023 ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , tracks ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
}
case HDD_BUS_SCSI :
max_spt = 99 ;
max_hpc = 255 ;
max_tracks = 266305 ;
break ;
}
if ( ( hdd_ptr - > bus = = HDD_BUS_SCSI_REMOVABLE ) & & ! chs_enabled )
{
h = GetDlgItem ( hdlg , IDC_EDIT_HD_SPT ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_HPC ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_CYL ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_SIZE ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_TYPE ) ;
EnableWindow ( h , TRUE ) ;
}
else if ( ( hdd_ptr - > bus ! = HDD_BUS_SCSI_REMOVABLE ) & & ! chs_enabled )
{
h = GetDlgItem ( hdlg , IDC_EDIT_HD_SPT ) ;
EnableWindow ( h , FALSE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_HPC ) ;
EnableWindow ( h , FALSE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_CYL ) ;
EnableWindow ( h , FALSE ) ;
h = GetDlgItem ( hdlg , IDC_EDIT_HD_SIZE ) ;
EnableWindow ( h , FALSE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_TYPE ) ;
EnableWindow ( h , FALSE ) ;
}
if ( spt > max_spt )
{
spt = max_spt ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SPT , spt ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
if ( hpc > max_hpc )
{
hpc = max_hpc ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_HPC , hpc ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
if ( tracks > max_tracks )
{
tracks = max_tracks ;
size = ( tracks * hpc * spt ) < < 9 ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_CYL , tracks ) ;
set_edit_box_contents ( hdlg , IDC_EDIT_HD_SIZE , ( size > > 20 ) ) ;
recalc_selection ( hdlg ) ;
}
hd_add_bus_skip :
no_update = 0 ;
break ;
}
return FALSE ;
}
return FALSE ;
}
int hard_disk_was_added ( void )
{
return hard_disk_added ;
}
void hard_disk_add_open ( HWND hwnd , int is_existing )
{
existing = is_existing ;
hard_disk_added = 0 ;
2018-03-02 18:58:18 -05:00
DialogBox ( hinstance , ( LPCWSTR ) DLG_CFG_HARD_DISKS_ADD , hwnd , hard_disks_add_proc ) ;
2018-02-20 21:44:51 -05:00
}
static void hard_disk_track ( uint8_t id )
{
switch ( temp_hdd [ id ] . bus ) {
case HDD_BUS_MFM :
mfm_tracking | = ( 1 < < ( temp_hdd [ id ] . mfm_channel < < 3 ) ) ;
break ;
case HDD_BUS_ESDI :
esdi_tracking | = ( 1 < < ( temp_hdd [ id ] . esdi_channel < < 3 ) ) ;
break ;
case HDD_BUS_XTIDE :
xtide_tracking | = ( 1 < < ( temp_hdd [ id ] . xtide_channel < < 3 ) ) ;
break ;
case HDD_BUS_IDE_PIO_ONLY :
case HDD_BUS_IDE_PIO_AND_DMA :
ide_tracking | = ( 1 < < ( temp_hdd [ id ] . ide_channel < < 3 ) ) ;
break ;
case HDD_BUS_SCSI :
case HDD_BUS_SCSI_REMOVABLE :
scsi_tracking [ temp_hdd [ id ] . scsi_id ] | = ( 1 < < ( temp_hdd [ id ] . scsi_lun < < 3 ) ) ;
break ;
}
}
static void hard_disk_untrack ( uint8_t id )
{
switch ( temp_hdd [ id ] . bus ) {
case HDD_BUS_MFM :
mfm_tracking & = ~ ( 1 < < ( temp_hdd [ id ] . mfm_channel < < 3 ) ) ;
break ;
case HDD_BUS_ESDI :
esdi_tracking & = ~ ( 1 < < ( temp_hdd [ id ] . esdi_channel < < 3 ) ) ;
break ;
case HDD_BUS_XTIDE :
xtide_tracking & = ~ ( 1 < < ( temp_hdd [ id ] . xtide_channel < < 3 ) ) ;
break ;
case HDD_BUS_IDE_PIO_ONLY :
case HDD_BUS_IDE_PIO_AND_DMA :
ide_tracking & = ~ ( 1 < < ( temp_hdd [ id ] . ide_channel < < 3 ) ) ;
break ;
case HDD_BUS_SCSI :
case HDD_BUS_SCSI_REMOVABLE :
scsi_tracking [ temp_hdd [ id ] . scsi_id ] & = ~ ( 1 < < ( temp_hdd [ id ] . scsi_lun < < 3 ) ) ;
break ;
}
}
static void hard_disk_track_all ( void )
{
int i ;
for ( i = 0 ; i < HDD_NUM ; i + + )
hard_disk_track ( i ) ;
}
int ignore_change = 0 ;
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
hard_disks_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
2018-02-21 22:48:09 +01:00
HWND h = INVALID_HANDLE_VALUE ;
2018-02-20 21:44:51 -05:00
int old_sel = 0 ;
int b = 0 ;
int assign = 0 ;
switch ( message )
{
case WM_INITDIALOG :
ignore_change = 1 ;
normalize_hd_list ( ) ; /* Normalize the hard disks so that non-disabled hard disks start from index 0, and so they are contiguous.
This will cause an emulator reset prompt on the first opening of this category with a messy hard disk list
( which can only happen by manually editing the configuration file ) . */
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
win_settings_hard_disks_init_columns ( h ) ;
win_settings_hard_disks_image_list_init ( h ) ;
win_settings_hard_disks_recalc_list ( h ) ;
recalc_next_free_id ( hdlg ) ;
add_locations ( hdlg ) ;
if ( hd_listview_items > 0 )
{
ListView_SetItemState ( h , 0 , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
hdlv_current_sel = 0 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
SendMessage ( h , CB_SETCURSEL , temp_hdd [ 0 ] . bus - 1 , 0 ) ;
}
else
{
hdlv_current_sel = - 1 ;
}
recalc_location_controls ( hdlg , 0 , 0 ) ;
ignore_change = 0 ;
return TRUE ;
case WM_NOTIFY :
if ( ( hd_listview_items = = 0 ) | | ignore_change )
{
return FALSE ;
}
if ( ( ( ( LPNMHDR ) lParam ) - > code = = LVN_ITEMCHANGED ) & & ( ( ( LPNMHDR ) lParam ) - > idFrom = = IDC_LIST_HARD_DISKS ) )
{
old_sel = hdlv_current_sel ;
hdlv_current_sel = get_selected_hard_disk ( hdlg ) ;
if ( hdlv_current_sel = = old_sel )
{
return FALSE ;
}
else if ( hdlv_current_sel = = - 1 )
{
ignore_change = 1 ;
hdlv_current_sel = old_sel ;
ListView_SetItemState ( h , hdlv_current_sel , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
ignore_change = 0 ;
return FALSE ;
}
ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
SendMessage ( h , CB_SETCURSEL , temp_hdd [ hdlv_current_sel ] . bus - 1 , 0 ) ;
recalc_location_controls ( hdlg , 0 , 0 ) ;
ignore_change = 0 ;
}
break ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_COMBO_HD_BUS :
if ( ignore_change )
{
return FALSE ;
}
ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
b = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) + 1 ;
if ( b = = temp_hdd [ hdlv_current_sel ] . bus )
{
goto hd_bus_skip ;
}
hard_disk_untrack ( hdlv_current_sel ) ;
assign = ( temp_hdd [ hdlv_current_sel ] . bus = = b ) ? 0 : 1 ;
if ( ( b = = HDD_BUS_IDE_PIO_ONLY ) & & ( temp_hdd [ hdlv_current_sel ] . bus = = HDD_BUS_IDE_PIO_AND_DMA ) )
assign = 0 ;
else if ( ( b = = HDD_BUS_IDE_PIO_AND_DMA ) & & ( temp_hdd [ hdlv_current_sel ] . bus = = HDD_BUS_IDE_PIO_ONLY ) )
assign = 0 ;
temp_hdd [ hdlv_current_sel ] . bus = b ;
recalc_location_controls ( hdlg , 0 , assign ) ;
hard_disk_track ( hdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
win_settings_hard_disks_update_item ( h , hdlv_current_sel , 0 ) ;
hd_bus_skip :
ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_HD_CHANNEL :
if ( ignore_change )
{
return FALSE ;
}
ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL ) ;
hard_disk_untrack ( hdlv_current_sel ) ;
if ( temp_hdd [ hdlv_current_sel ] . bus = = HDD_BUS_MFM )
{
temp_hdd [ hdlv_current_sel ] . mfm_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
}
else if ( temp_hdd [ hdlv_current_sel ] . bus = = HDD_BUS_ESDI )
{
temp_hdd [ hdlv_current_sel ] . esdi_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
}
else if ( temp_hdd [ hdlv_current_sel ] . bus = = HDD_BUS_XTIDE )
{
temp_hdd [ hdlv_current_sel ] . xtide_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
}
hard_disk_track ( hdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
win_settings_hard_disks_update_item ( h , hdlv_current_sel , 0 ) ;
ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_HD_CHANNEL_IDE :
if ( ignore_change )
{
return FALSE ;
}
ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_CHANNEL_IDE ) ;
hard_disk_untrack ( hdlv_current_sel ) ;
temp_hdd [ hdlv_current_sel ] . ide_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
hard_disk_track ( hdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
win_settings_hard_disks_update_item ( h , hdlv_current_sel , 0 ) ;
ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_HD_ID :
if ( ignore_change )
{
return FALSE ;
}
ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_ID ) ;
hard_disk_untrack ( hdlv_current_sel ) ;
temp_hdd [ hdlv_current_sel ] . scsi_id = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
hard_disk_track ( hdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
win_settings_hard_disks_update_item ( h , hdlv_current_sel , 0 ) ;
ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_HD_LUN :
if ( ignore_change )
{
return FALSE ;
}
ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_LUN ) ;
hard_disk_untrack ( hdlv_current_sel ) ;
temp_hdd [ hdlv_current_sel ] . scsi_lun = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
hard_disk_track ( hdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
win_settings_hard_disks_update_item ( h , hdlv_current_sel , 0 ) ;
ignore_change = 0 ;
return FALSE ;
case IDC_BUTTON_HDD_ADD :
hard_disk_add_open ( hdlg , 1 ) ;
if ( hard_disk_added )
{
ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
win_settings_hard_disks_recalc_list ( h ) ;
recalc_next_free_id ( hdlg ) ;
hard_disk_track_all ( ) ;
ignore_change = 0 ;
}
return FALSE ;
case IDC_BUTTON_HDD_ADD_NEW :
hard_disk_add_open ( hdlg , 0 ) ;
if ( hard_disk_added )
{
ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
win_settings_hard_disks_recalc_list ( h ) ;
recalc_next_free_id ( hdlg ) ;
hard_disk_track_all ( ) ;
ignore_change = 0 ;
}
return FALSE ;
case IDC_BUTTON_HDD_REMOVE :
memcpy ( temp_hdd [ hdlv_current_sel ] . fn , L " " , 4 ) ;
hard_disk_untrack ( hdlv_current_sel ) ;
temp_hdd [ hdlv_current_sel ] . bus = HDD_BUS_DISABLED ; /* Only set the bus to zero, the list normalize code below will take care of turning this entire entry to a complete zero. */
normalize_hd_list ( ) ; /* Normalize the hard disks so that non-disabled hard disks start from index 0, and so they are contiguous. */
ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_LIST_HARD_DISKS ) ;
win_settings_hard_disks_recalc_list ( h ) ;
recalc_next_free_id ( hdlg ) ;
if ( hd_listview_items > 0 )
{
ListView_SetItemState ( h , 0 , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
hdlv_current_sel = 0 ;
h = GetDlgItem ( hdlg , IDC_COMBO_HD_BUS ) ;
SendMessage ( h , CB_SETCURSEL , temp_hdd [ 0 ] . bus - 1 , 0 ) ;
}
else
{
hdlv_current_sel = - 1 ;
}
recalc_location_controls ( hdlg , 0 , 0 ) ;
ignore_change = 0 ;
return FALSE ;
}
default :
return FALSE ;
}
return FALSE ;
}
static int fdlv_current_sel ;
static int cdlv_current_sel ;
static int zdlv_current_sel ;
static int combo_id_to_string_id ( int combo_id )
{
return IDS_5376 + combo_id ;
}
static int combo_id_to_format_string_id ( int combo_id )
{
return IDS_5632 + combo_id ;
}
static BOOL win_settings_floppy_drives_image_list_init ( HWND hwndList )
{
HICON hiconItem ;
HIMAGELIST hSmall ;
int i = 0 ;
hSmall = ImageList_Create ( GetSystemMetrics ( SM_CXSMICON ) ,
GetSystemMetrics ( SM_CYSMICON ) ,
ILC_MASK | ILC_COLOR32 , 1 , 1 ) ;
for ( i = 0 ; i < 14 ; i + + )
{
hiconItem = LoadIcon ( hinstance , ( LPCWSTR ) fdd_type_to_icon ( i ) ) ;
ImageList_AddIcon ( hSmall , hiconItem ) ;
DestroyIcon ( hiconItem ) ;
}
ListView_SetImageList ( hwndList , hSmall , LVSIL_SMALL ) ;
return TRUE ;
}
static BOOL win_settings_cdrom_drives_image_list_init ( HWND hwndList )
{
HICON hiconItem ;
HIMAGELIST hSmall ;
hSmall = ImageList_Create ( GetSystemMetrics ( SM_CXSMICON ) ,
GetSystemMetrics ( SM_CYSMICON ) ,
ILC_MASK | ILC_COLOR32 , 1 , 1 ) ;
hiconItem = LoadIcon ( hinstance , ( LPCWSTR ) 514 ) ;
ImageList_AddIcon ( hSmall , hiconItem ) ;
DestroyIcon ( hiconItem ) ;
hiconItem = LoadIcon ( hinstance , ( LPCWSTR ) 160 ) ;
ImageList_AddIcon ( hSmall , hiconItem ) ;
DestroyIcon ( hiconItem ) ;
ListView_SetImageList ( hwndList , hSmall , LVSIL_SMALL ) ;
return TRUE ;
}
static BOOL win_settings_zip_drives_image_list_init ( HWND hwndList )
{
HICON hiconItem ;
HIMAGELIST hSmall ;
hSmall = ImageList_Create ( GetSystemMetrics ( SM_CXSMICON ) ,
GetSystemMetrics ( SM_CYSMICON ) ,
ILC_MASK | ILC_COLOR32 , 1 , 1 ) ;
hiconItem = LoadIcon ( hinstance , ( LPCWSTR ) 515 ) ;
ImageList_AddIcon ( hSmall , hiconItem ) ;
DestroyIcon ( hiconItem ) ;
hiconItem = LoadIcon ( hinstance , ( LPCWSTR ) 176 ) ;
ImageList_AddIcon ( hSmall , hiconItem ) ;
DestroyIcon ( hiconItem ) ;
ListView_SetImageList ( hwndList , hSmall , LVSIL_SMALL ) ;
return TRUE ;
}
static BOOL win_settings_floppy_drives_recalc_list ( HWND hwndList )
{
LVITEM lvI ;
int i = 0 ;
char s [ 256 ] ;
WCHAR szText [ 256 ] ;
lvI . mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE ;
lvI . stateMask = lvI . state = 0 ;
for ( i = 0 ; i < 4 ; i + + )
{
lvI . iSubItem = 0 ;
if ( temp_fdd_types [ i ] > 0 )
{
strcpy ( s , fdd_getname ( temp_fdd_types [ i ] ) ) ;
mbstowcs ( szText , s , strlen ( s ) + 1 ) ;
lvI . pszText = szText ;
}
else
{
lvI . pszText = plat_get_string ( IDS_5376 ) ;
}
lvI . iItem = i ;
lvI . iImage = temp_fdd_types [ i ] ;
if ( ListView_InsertItem ( hwndList , & lvI ) = = - 1 )
return FALSE ;
lvI . iSubItem = 1 ;
lvI . pszText = plat_get_string ( temp_fdd_turbo [ i ] ? IDS_2060 : IDS_2061 ) ;
lvI . iItem = i ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return FALSE ;
}
lvI . iSubItem = 2 ;
lvI . pszText = plat_get_string ( temp_fdd_check_bpb [ i ] ? IDS_2060 : IDS_2061 ) ;
lvI . iItem = i ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return FALSE ;
}
}
return TRUE ;
}
static BOOL win_settings_cdrom_drives_recalc_list ( HWND hwndList )
{
LVITEM lvI ;
int i = 0 ;
WCHAR szText [ 256 ] ;
int fsid = 0 ;
lvI . mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE ;
lvI . stateMask = lvI . iSubItem = lvI . state = 0 ;
for ( i = 0 ; i < 4 ; i + + )
{
fsid = combo_id_to_format_string_id ( temp_cdrom_drives [ i ] . bus_type ) ;
switch ( temp_cdrom_drives [ i ] . bus_type )
{
case CDROM_BUS_DISABLED :
default :
lvI . pszText = plat_get_string ( fsid ) ;
lvI . iImage = 0 ;
break ;
case CDROM_BUS_ATAPI_PIO_ONLY :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_cdrom_drives [ i ] . ide_channel > > 1 , temp_cdrom_drives [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
case CDROM_BUS_ATAPI_PIO_AND_DMA :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_cdrom_drives [ i ] . ide_channel > > 1 , temp_cdrom_drives [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
case CDROM_BUS_SCSI :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_cdrom_drives [ i ] . scsi_device_id , temp_cdrom_drives [ i ] . scsi_device_lun ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
}
lvI . iItem = i ;
if ( ListView_InsertItem ( hwndList , & lvI ) = = - 1 )
return FALSE ;
}
return TRUE ;
}
static BOOL win_settings_zip_drives_recalc_list ( HWND hwndList )
{
LVITEM lvI ;
int i = 0 ;
WCHAR szText [ 256 ] ;
int fsid = 0 ;
lvI . mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE ;
lvI . stateMask = lvI . iSubItem = lvI . state = 0 ;
for ( i = 0 ; i < 4 ; i + + )
{
fsid = combo_id_to_format_string_id ( temp_zip_drives [ i ] . bus_type ) ;
lvI . iSubItem = 0 ;
switch ( temp_zip_drives [ i ] . bus_type )
{
case ZIP_BUS_DISABLED :
default :
lvI . pszText = plat_get_string ( fsid ) ;
lvI . iImage = 0 ;
break ;
case ZIP_BUS_ATAPI_PIO_ONLY :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_zip_drives [ i ] . ide_channel > > 1 , temp_zip_drives [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
case ZIP_BUS_ATAPI_PIO_AND_DMA :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_zip_drives [ i ] . ide_channel > > 1 , temp_zip_drives [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
case ZIP_BUS_SCSI :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_zip_drives [ i ] . scsi_device_id , temp_zip_drives [ i ] . scsi_device_lun ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
}
lvI . iItem = i ;
if ( ListView_InsertItem ( hwndList , & lvI ) = = - 1 )
return FALSE ;
lvI . iSubItem = 1 ;
lvI . pszText = plat_get_string ( temp_zip_drives [ i ] . is_250 ? IDS_5901 : IDS_5900 ) ;
lvI . iItem = i ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return FALSE ;
}
}
return TRUE ;
}
static BOOL win_settings_floppy_drives_init_columns ( HWND hwndList )
{
LVCOLUMN lvc ;
lvc . mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM ;
lvc . iSubItem = 0 ;
lvc . pszText = plat_get_string ( IDS_2143 ) ;
lvc . cx = 292 ;
lvc . fmt = LVCFMT_LEFT ;
if ( ListView_InsertColumn ( hwndList , 0 , & lvc ) = = - 1 )
{
return FALSE ;
}
lvc . iSubItem = 1 ;
lvc . pszText = plat_get_string ( IDS_2059 ) ;
lvc . cx = 50 ;
lvc . fmt = LVCFMT_LEFT ;
if ( ListView_InsertColumn ( hwndList , 1 , & lvc ) = = - 1 )
{
return FALSE ;
}
lvc . iSubItem = 2 ;
lvc . pszText = plat_get_string ( IDS_2170 ) ;
lvc . cx = 75 ;
lvc . fmt = LVCFMT_LEFT ;
if ( ListView_InsertColumn ( hwndList , 2 , & lvc ) = = - 1 )
{
return FALSE ;
}
return TRUE ;
}
static BOOL win_settings_cdrom_drives_init_columns ( HWND hwndList )
{
LVCOLUMN lvc ;
lvc . mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM ;
lvc . iSubItem = 0 ;
lvc . pszText = plat_get_string ( IDS_2082 ) ;
lvc . cx = 392 ;
lvc . fmt = LVCFMT_LEFT ;
if ( ListView_InsertColumn ( hwndList , 0 , & lvc ) = = - 1 )
{
return FALSE ;
}
return TRUE ;
}
static BOOL win_settings_zip_drives_init_columns ( HWND hwndList )
{
LVCOLUMN lvc ;
lvc . mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM ;
lvc . iSubItem = 0 ;
lvc . pszText = plat_get_string ( IDS_2082 ) ;
lvc . cx = 342 ;
lvc . fmt = LVCFMT_LEFT ;
if ( ListView_InsertColumn ( hwndList , 0 , & lvc ) = = - 1 )
{
return FALSE ;
}
lvc . iSubItem = 1 ;
lvc . pszText = plat_get_string ( IDS_2143 ) ;
lvc . cx = 50 ;
lvc . fmt = LVCFMT_LEFT ;
if ( ListView_InsertColumn ( hwndList , 1 , & lvc ) = = - 1 )
{
return FALSE ;
}
return TRUE ;
}
static int get_selected_floppy_drive ( HWND hdlg )
{
int floppy_drive = - 1 ;
int i , j = 0 ;
HWND h ;
for ( i = 0 ; i < 6 ; i + + )
{
h = GetDlgItem ( hdlg , IDC_LIST_FLOPPY_DRIVES ) ;
j = ListView_GetItemState ( h , i , LVIS_SELECTED ) ;
if ( j )
{
floppy_drive = i ;
}
}
return floppy_drive ;
}
static int get_selected_cdrom_drive ( HWND hdlg )
{
int cd_drive = - 1 ;
int i , j = 0 ;
HWND h ;
for ( i = 0 ; i < 6 ; i + + )
{
h = GetDlgItem ( hdlg , IDC_LIST_CDROM_DRIVES ) ;
j = ListView_GetItemState ( h , i , LVIS_SELECTED ) ;
if ( j )
{
cd_drive = i ;
}
}
return cd_drive ;
}
static int get_selected_zip_drive ( HWND hdlg )
{
int zip_disk_drive = - 1 ;
int i , j = 0 ;
HWND h ;
for ( i = 0 ; i < 6 ; i + + )
{
h = GetDlgItem ( hdlg , IDC_LIST_ZIP_DRIVES ) ;
j = ListView_GetItemState ( h , i , LVIS_SELECTED ) ;
if ( j )
{
zip_disk_drive = i ;
}
}
return zip_disk_drive ;
}
static void win_settings_floppy_drives_update_item ( HWND hwndList , int i )
{
LVITEM lvI ;
char s [ 256 ] ;
WCHAR szText [ 256 ] ;
lvI . mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE ;
lvI . stateMask = lvI . iSubItem = lvI . state = 0 ;
lvI . iSubItem = 0 ;
lvI . iItem = i ;
if ( temp_fdd_types [ i ] > 0 )
{
strcpy ( s , fdd_getname ( temp_fdd_types [ i ] ) ) ;
mbstowcs ( szText , s , strlen ( s ) + 1 ) ;
lvI . pszText = szText ;
}
else
{
lvI . pszText = plat_get_string ( IDS_5376 ) ;
}
lvI . iImage = temp_fdd_types [ i ] ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return ;
}
lvI . iSubItem = 1 ;
lvI . pszText = plat_get_string ( temp_fdd_turbo [ i ] ? IDS_2060 : IDS_2061 ) ;
lvI . iItem = i ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return ;
}
lvI . iSubItem = 2 ;
lvI . pszText = plat_get_string ( temp_fdd_check_bpb [ i ] ? IDS_2060 : IDS_2061 ) ;
lvI . iItem = i ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return ;
}
}
static void win_settings_cdrom_drives_update_item ( HWND hwndList , int i )
{
LVITEM lvI ;
WCHAR szText [ 256 ] ;
int fsid ;
lvI . mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE ;
lvI . stateMask = lvI . iSubItem = lvI . state = 0 ;
lvI . iSubItem = 0 ;
lvI . iItem = i ;
fsid = combo_id_to_format_string_id ( temp_cdrom_drives [ i ] . bus_type ) ;
switch ( temp_cdrom_drives [ i ] . bus_type )
{
case CDROM_BUS_DISABLED :
default :
lvI . pszText = plat_get_string ( fsid ) ;
lvI . iImage = 0 ;
break ;
case CDROM_BUS_ATAPI_PIO_ONLY :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_cdrom_drives [ i ] . ide_channel > > 1 , temp_cdrom_drives [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
case CDROM_BUS_ATAPI_PIO_AND_DMA :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_cdrom_drives [ i ] . ide_channel > > 1 , temp_cdrom_drives [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
case CDROM_BUS_SCSI :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_cdrom_drives [ i ] . scsi_device_id , temp_cdrom_drives [ i ] . scsi_device_lun ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
}
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return ;
}
}
static void win_settings_zip_drives_update_item ( HWND hwndList , int i )
{
LVITEM lvI ;
WCHAR szText [ 256 ] ;
int fsid ;
lvI . mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE ;
lvI . stateMask = lvI . iSubItem = lvI . state = 0 ;
lvI . iSubItem = 0 ;
lvI . iItem = i ;
fsid = combo_id_to_format_string_id ( temp_zip_drives [ i ] . bus_type ) ;
switch ( temp_zip_drives [ i ] . bus_type )
{
case ZIP_BUS_DISABLED :
default :
lvI . pszText = plat_get_string ( fsid ) ;
lvI . iImage = 0 ;
break ;
case ZIP_BUS_ATAPI_PIO_ONLY :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_zip_drives [ i ] . ide_channel > > 1 , temp_zip_drives [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
case ZIP_BUS_ATAPI_PIO_AND_DMA :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_zip_drives [ i ] . ide_channel > > 1 , temp_zip_drives [ i ] . ide_channel & 1 ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
case ZIP_BUS_SCSI :
2018-02-22 20:19:41 +01:00
swprintf ( szText , 255 , plat_get_string ( fsid ) , temp_zip_drives [ i ] . scsi_device_id , temp_zip_drives [ i ] . scsi_device_lun ) ;
2018-02-20 21:44:51 -05:00
lvI . pszText = szText ;
lvI . iImage = 1 ;
break ;
}
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return ;
}
lvI . iSubItem = 1 ;
lvI . pszText = plat_get_string ( temp_zip_drives [ i ] . is_250 ? IDS_5901 : IDS_5900 ) ;
lvI . iItem = i ;
lvI . iImage = 0 ;
if ( ListView_SetItem ( hwndList , & lvI ) = = - 1 )
{
return ;
}
}
static void cdrom_add_locations ( HWND hdlg )
{
LPTSTR lptsTemp ;
HWND h ;
int i = 0 ;
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_BUS ) ;
for ( i = CDROM_BUS_DISABLED ; i < = CDROM_BUS_SCSI ; i + + )
{
if ( ( i = = CDROM_BUS_DISABLED ) | | ( i > = CDROM_BUS_ATAPI_PIO_ONLY ) )
{
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( combo_id_to_string_id ( i ) ) ) ;
}
}
h = GetDlgItem ( hdlg , IDC_COMBO_CD_ID ) ;
for ( i = 0 ; i < 16 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4098 ) , i ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_CD_LUN ) ;
for ( i = 0 ; i < 8 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4098 ) , i ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_CD_CHANNEL_IDE ) ;
for ( i = 0 ; i < 8 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4097 ) , i > > 1 , i & 1 ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
free ( lptsTemp ) ;
}
static void cdrom_recalc_location_controls ( HWND hdlg , int assign_id )
{
int i = 0 ;
HWND h ;
int bus = temp_cdrom_drives [ cdlv_current_sel ] . bus_type ;
for ( i = IDT_1741 ; i < ( IDT_1743 + 1 ) ; i + + )
{
h = GetDlgItem ( hdlg , i ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_CD_ID ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_LUN ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_CHANNEL_IDE ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
switch ( bus )
{
case CDROM_BUS_ATAPI_PIO_ONLY : /* ATAPI (PIO-only) */
case CDROM_BUS_ATAPI_PIO_AND_DMA : /* ATAPI (PIO and DMA) */
h = GetDlgItem ( hdlg , IDT_1743 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
if ( assign_id )
temp_cdrom_drives [ cdlv_current_sel ] . ide_channel = next_free_ide_channel ( ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_CHANNEL_IDE ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
SendMessage ( h , CB_SETCURSEL , temp_cdrom_drives [ cdlv_current_sel ] . ide_channel , 0 ) ;
break ;
case CDROM_BUS_SCSI : /* SCSI */
h = GetDlgItem ( hdlg , IDT_1741 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDT_1742 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
if ( assign_id )
next_free_scsi_id_and_lun ( ( uint8_t * ) & temp_cdrom_drives [ cdlv_current_sel ] . scsi_device_id , ( uint8_t * ) & temp_cdrom_drives [ cdlv_current_sel ] . scsi_device_lun ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_ID ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
SendMessage ( h , CB_SETCURSEL , temp_cdrom_drives [ cdlv_current_sel ] . scsi_device_id , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_LUN ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
SendMessage ( h , CB_SETCURSEL , temp_cdrom_drives [ cdlv_current_sel ] . scsi_device_lun , 0 ) ;
break ;
}
}
static void zip_add_locations ( HWND hdlg )
{
LPTSTR lptsTemp ;
HWND h ;
int i = 0 ;
lptsTemp = ( LPTSTR ) malloc ( 512 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_BUS ) ;
for ( i = ZIP_BUS_DISABLED ; i < = ZIP_BUS_SCSI ; i + + )
{
if ( ( i = = ZIP_BUS_DISABLED ) | | ( i > = ZIP_BUS_ATAPI_PIO_ONLY ) )
{
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( combo_id_to_string_id ( i ) ) ) ;
}
}
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_ID ) ;
for ( i = 0 ; i < 16 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4098 ) , i ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_LUN ) ;
for ( i = 0 ; i < 8 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4098 ) , i ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_CHANNEL_IDE ) ;
for ( i = 0 ; i < 8 ; i + + )
{
2018-02-22 20:19:41 +01:00
swprintf ( lptsTemp , 511 , plat_get_string ( IDS_4097 ) , i > > 1 , i & 1 ) ;
2018-02-20 21:44:51 -05:00
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) lptsTemp ) ;
}
free ( lptsTemp ) ;
}
static void zip_recalc_location_controls ( HWND hdlg , int assign_id )
{
int i = 0 ;
HWND h ;
int bus = temp_zip_drives [ zdlv_current_sel ] . bus_type ;
for ( i = IDT_1754 ; i < ( IDT_1756 + 1 ) ; i + + )
{
h = GetDlgItem ( hdlg , i ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
}
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_ID ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_LUN ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_CHANNEL_IDE ) ;
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
switch ( bus )
{
case ZIP_BUS_ATAPI_PIO_ONLY : /* ATAPI (PIO-only) */
case ZIP_BUS_ATAPI_PIO_AND_DMA : /* ATAPI (PIO and DMA) */
h = GetDlgItem ( hdlg , IDT_1756 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
if ( assign_id )
temp_zip_drives [ zdlv_current_sel ] . ide_channel = next_free_ide_channel ( ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_CHANNEL_IDE ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
SendMessage ( h , CB_SETCURSEL , temp_zip_drives [ zdlv_current_sel ] . ide_channel , 0 ) ;
break ;
case ZIP_BUS_SCSI : /* SCSI */
h = GetDlgItem ( hdlg , IDT_1754 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
h = GetDlgItem ( hdlg , IDT_1755 ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
if ( assign_id )
next_free_scsi_id_and_lun ( ( uint8_t * ) & temp_zip_drives [ zdlv_current_sel ] . scsi_device_id , ( uint8_t * ) & temp_zip_drives [ zdlv_current_sel ] . scsi_device_lun ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_ID ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
SendMessage ( h , CB_SETCURSEL , temp_zip_drives [ zdlv_current_sel ] . scsi_device_id , 0 ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_LUN ) ;
ShowWindow ( h , SW_SHOW ) ;
EnableWindow ( h , TRUE ) ;
SendMessage ( h , CB_SETCURSEL , temp_zip_drives [ zdlv_current_sel ] . scsi_device_lun , 0 ) ;
break ;
}
}
static void cdrom_track ( uint8_t id )
{
if ( ( temp_cdrom_drives [ id ] . bus_type = = CDROM_BUS_ATAPI_PIO_ONLY ) | | ( temp_cdrom_drives [ id ] . bus_type = = CDROM_BUS_ATAPI_PIO_ONLY ) )
ide_tracking | = ( 2 < < ( temp_cdrom_drives [ id ] . ide_channel < < 3 ) ) ;
else if ( temp_cdrom_drives [ id ] . bus_type = = CDROM_BUS_SCSI )
scsi_tracking [ temp_cdrom_drives [ id ] . scsi_device_id ] | = ( 1 < < temp_cdrom_drives [ id ] . scsi_device_lun ) ;
}
static void cdrom_untrack ( uint8_t id )
{
if ( ( temp_cdrom_drives [ id ] . bus_type = = CDROM_BUS_ATAPI_PIO_ONLY ) | | ( temp_cdrom_drives [ id ] . bus_type = = CDROM_BUS_ATAPI_PIO_ONLY ) )
ide_tracking & = ~ ( 2 < < ( temp_cdrom_drives [ id ] . ide_channel < < 3 ) ) ;
else if ( temp_cdrom_drives [ id ] . bus_type = = CDROM_BUS_SCSI )
scsi_tracking [ temp_cdrom_drives [ id ] . scsi_device_id ] & = ~ ( 1 < < temp_cdrom_drives [ id ] . scsi_device_lun ) ;
}
#if 0
static void cdrom_track_all ( void )
{
int i ;
for ( i = 0 ; i < CDROM_NUM ; i + + )
cdrom_track ( i ) ;
}
# endif
static void zip_track ( uint8_t id )
{
if ( ( temp_zip_drives [ id ] . bus_type = = ZIP_BUS_ATAPI_PIO_ONLY ) | | ( temp_zip_drives [ id ] . bus_type = = ZIP_BUS_ATAPI_PIO_ONLY ) )
ide_tracking | = ( 1 < < temp_zip_drives [ id ] . ide_channel ) ;
else if ( temp_zip_drives [ id ] . bus_type = = ZIP_BUS_SCSI )
scsi_tracking [ temp_zip_drives [ id ] . scsi_device_id ] | = ( 1 < < temp_zip_drives [ id ] . scsi_device_lun ) ;
}
static void zip_untrack ( uint8_t id )
{
if ( ( temp_zip_drives [ id ] . bus_type = = ZIP_BUS_ATAPI_PIO_ONLY ) | | ( temp_zip_drives [ id ] . bus_type = = ZIP_BUS_ATAPI_PIO_ONLY ) )
ide_tracking & = ~ ( 1 < < temp_zip_drives [ id ] . ide_channel ) ;
else if ( temp_zip_drives [ id ] . bus_type = = ZIP_BUS_SCSI )
scsi_tracking [ temp_zip_drives [ id ] . scsi_device_id ] & = ~ ( 1 < < temp_zip_drives [ id ] . scsi_device_lun ) ;
}
#if 0
static void zip_track_all ( void )
{
int i ;
for ( i = 0 ; i < ZIP_NUM ; i + + )
zip_track ( i ) ;
}
# endif
int fd_ignore_change = 0 ;
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
floppy_drives_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
2018-02-21 22:48:09 +01:00
HWND h = INVALID_HANDLE_VALUE ;
2018-02-20 21:44:51 -05:00
int i = 0 ;
int old_sel = 0 ;
WCHAR szText [ 256 ] ;
switch ( message )
{
case WM_INITDIALOG :
fd_ignore_change = 1 ;
fdlv_current_sel = 0 ;
h = GetDlgItem ( hdlg , IDC_LIST_FLOPPY_DRIVES ) ;
win_settings_floppy_drives_init_columns ( h ) ;
win_settings_floppy_drives_image_list_init ( h ) ;
win_settings_floppy_drives_recalc_list ( h ) ;
ListView_SetItemState ( h , 0 , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_FD_TYPE ) ;
for ( i = 0 ; i < 14 ; i + + )
{
if ( i = = 0 )
{
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) plat_get_string ( IDS_5376 ) ) ;
}
else
{
mbstowcs ( szText , fdd_getname ( i ) , strlen ( fdd_getname ( i ) ) + 1 ) ;
SendMessage ( h , CB_ADDSTRING , 0 , ( LPARAM ) szText ) ;
}
}
SendMessage ( h , CB_SETCURSEL , temp_fdd_types [ fdlv_current_sel ] , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECKTURBO ) ;
SendMessage ( h , BM_SETCHECK , temp_fdd_turbo [ fdlv_current_sel ] , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECKBPB ) ;
SendMessage ( h , BM_SETCHECK , temp_fdd_check_bpb [ fdlv_current_sel ] , 0 ) ;
fd_ignore_change = 0 ;
return TRUE ;
case WM_NOTIFY :
if ( fd_ignore_change )
{
return FALSE ;
}
if ( ( ( ( LPNMHDR ) lParam ) - > code = = LVN_ITEMCHANGED ) & & ( ( ( LPNMHDR ) lParam ) - > idFrom = = IDC_LIST_FLOPPY_DRIVES ) )
{
old_sel = fdlv_current_sel ;
fdlv_current_sel = get_selected_floppy_drive ( hdlg ) ;
if ( fdlv_current_sel = = old_sel )
{
return FALSE ;
}
else if ( fdlv_current_sel = = - 1 )
{
fd_ignore_change = 1 ;
fdlv_current_sel = old_sel ;
ListView_SetItemState ( h , fdlv_current_sel , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
fd_ignore_change = 0 ;
return FALSE ;
}
fd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_FD_TYPE ) ;
SendMessage ( h , CB_SETCURSEL , temp_fdd_types [ fdlv_current_sel ] , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECKTURBO ) ;
SendMessage ( h , BM_SETCHECK , temp_fdd_turbo [ fdlv_current_sel ] , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECKBPB ) ;
SendMessage ( h , BM_SETCHECK , temp_fdd_check_bpb [ fdlv_current_sel ] , 0 ) ;
fd_ignore_change = 0 ;
}
break ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_COMBO_FD_TYPE :
if ( fd_ignore_change )
{
return FALSE ;
}
fd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_FD_TYPE ) ;
temp_fdd_types [ fdlv_current_sel ] = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_LIST_FLOPPY_DRIVES ) ;
win_settings_floppy_drives_update_item ( h , fdlv_current_sel ) ;
fd_ignore_change = 0 ;
return FALSE ;
case IDC_CHECKTURBO :
if ( fd_ignore_change )
{
return FALSE ;
}
fd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_CHECKTURBO ) ;
temp_fdd_turbo [ fdlv_current_sel ] = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_LIST_FLOPPY_DRIVES ) ;
win_settings_floppy_drives_update_item ( h , fdlv_current_sel ) ;
fd_ignore_change = 0 ;
return FALSE ;
case IDC_CHECKBPB :
if ( fd_ignore_change )
{
return FALSE ;
}
fd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_CHECKBPB ) ;
temp_fdd_check_bpb [ fdlv_current_sel ] = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_LIST_FLOPPY_DRIVES ) ;
win_settings_floppy_drives_update_item ( h , fdlv_current_sel ) ;
fd_ignore_change = 0 ;
return FALSE ;
}
default :
return FALSE ;
}
return FALSE ;
}
int rd_ignore_change = 0 ;
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
other_removable_devices_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
2018-02-21 22:48:09 +01:00
HWND h = INVALID_HANDLE_VALUE ;
2018-02-20 21:44:51 -05:00
int old_sel = 0 ;
int b = 0 ;
int b2 = 0 ;
int assign = 0 ;
switch ( message )
{
case WM_INITDIALOG :
rd_ignore_change = 1 ;
cdlv_current_sel = 0 ;
h = GetDlgItem ( hdlg , IDC_LIST_CDROM_DRIVES ) ;
win_settings_cdrom_drives_init_columns ( h ) ;
win_settings_cdrom_drives_image_list_init ( h ) ;
win_settings_cdrom_drives_recalc_list ( h ) ;
ListView_SetItemState ( h , 0 , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
cdrom_add_locations ( hdlg ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_BUS ) ;
switch ( temp_cdrom_drives [ cdlv_current_sel ] . bus_type )
{
case CDROM_BUS_DISABLED :
default :
b = 0 ;
break ;
case CDROM_BUS_ATAPI_PIO_ONLY :
b = 1 ;
break ;
case CDROM_BUS_ATAPI_PIO_AND_DMA :
b = 2 ;
break ;
case CDROM_BUS_SCSI :
b = 3 ;
break ;
}
SendMessage ( h , CB_SETCURSEL , b , 0 ) ;
cdrom_recalc_location_controls ( hdlg , 0 ) ;
zdlv_current_sel = 0 ;
h = GetDlgItem ( hdlg , IDC_LIST_ZIP_DRIVES ) ;
win_settings_zip_drives_init_columns ( h ) ;
win_settings_zip_drives_image_list_init ( h ) ;
win_settings_zip_drives_recalc_list ( h ) ;
ListView_SetItemState ( h , 0 , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
zip_add_locations ( hdlg ) ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_BUS ) ;
switch ( temp_zip_drives [ zdlv_current_sel ] . bus_type )
{
case ZIP_BUS_DISABLED :
default :
b = 0 ;
break ;
case ZIP_BUS_ATAPI_PIO_ONLY :
b = 1 ;
break ;
case ZIP_BUS_ATAPI_PIO_AND_DMA :
b = 2 ;
break ;
case ZIP_BUS_SCSI :
b = 3 ;
break ;
}
SendMessage ( h , CB_SETCURSEL , b , 0 ) ;
zip_recalc_location_controls ( hdlg , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK250 ) ;
SendMessage ( h , BM_SETCHECK , temp_zip_drives [ zdlv_current_sel ] . is_250 , 0 ) ;
rd_ignore_change = 0 ;
return TRUE ;
case WM_NOTIFY :
if ( rd_ignore_change )
{
return FALSE ;
}
if ( ( ( ( LPNMHDR ) lParam ) - > code = = LVN_ITEMCHANGED ) & & ( ( ( LPNMHDR ) lParam ) - > idFrom = = IDC_LIST_CDROM_DRIVES ) )
{
old_sel = cdlv_current_sel ;
cdlv_current_sel = get_selected_cdrom_drive ( hdlg ) ;
if ( cdlv_current_sel = = old_sel )
{
return FALSE ;
}
else if ( cdlv_current_sel = = - 1 )
{
rd_ignore_change = 1 ;
cdlv_current_sel = old_sel ;
ListView_SetItemState ( h , cdlv_current_sel , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
rd_ignore_change = 0 ;
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_BUS ) ;
switch ( temp_cdrom_drives [ cdlv_current_sel ] . bus_type )
{
case CDROM_BUS_DISABLED :
default :
b = 0 ;
break ;
case CDROM_BUS_ATAPI_PIO_ONLY :
b = 1 ;
break ;
case CDROM_BUS_ATAPI_PIO_AND_DMA :
b = 2 ;
break ;
case CDROM_BUS_SCSI :
b = 3 ;
break ;
}
SendMessage ( h , CB_SETCURSEL , b , 0 ) ;
cdrom_recalc_location_controls ( hdlg , 0 ) ;
rd_ignore_change = 0 ;
}
else if ( ( ( ( LPNMHDR ) lParam ) - > code = = LVN_ITEMCHANGED ) & & ( ( ( LPNMHDR ) lParam ) - > idFrom = = IDC_LIST_ZIP_DRIVES ) )
{
old_sel = zdlv_current_sel ;
zdlv_current_sel = get_selected_zip_drive ( hdlg ) ;
if ( zdlv_current_sel = = old_sel )
{
return FALSE ;
}
else if ( zdlv_current_sel = = - 1 )
{
rd_ignore_change = 1 ;
zdlv_current_sel = old_sel ;
ListView_SetItemState ( h , zdlv_current_sel , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
rd_ignore_change = 0 ;
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_BUS ) ;
switch ( temp_zip_drives [ zdlv_current_sel ] . bus_type )
{
case ZIP_BUS_DISABLED :
default :
b = 0 ;
break ;
case ZIP_BUS_ATAPI_PIO_ONLY :
b = 1 ;
break ;
case ZIP_BUS_ATAPI_PIO_AND_DMA :
b = 2 ;
break ;
case ZIP_BUS_SCSI :
b = 3 ;
break ;
}
SendMessage ( h , CB_SETCURSEL , b , 0 ) ;
zip_recalc_location_controls ( hdlg , 0 ) ;
h = GetDlgItem ( hdlg , IDC_CHECK250 ) ;
SendMessage ( h , BM_SETCHECK , temp_zip_drives [ zdlv_current_sel ] . is_250 , 0 ) ;
rd_ignore_change = 0 ;
}
break ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) )
{
case IDC_COMBO_CD_BUS :
if ( rd_ignore_change )
{
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_BUS ) ;
b = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
switch ( b )
{
case 0 :
b2 = CDROM_BUS_DISABLED ;
break ;
case 1 :
b2 = CDROM_BUS_ATAPI_PIO_ONLY ;
break ;
case 2 :
b2 = CDROM_BUS_ATAPI_PIO_AND_DMA ;
break ;
case 3 :
b2 = CDROM_BUS_SCSI ;
break ;
}
if ( b2 = = temp_cdrom_drives [ cdlv_current_sel ] . bus_type )
{
goto cdrom_bus_skip ;
}
cdrom_untrack ( cdlv_current_sel ) ;
assign = ( temp_cdrom_drives [ cdlv_current_sel ] . bus_type = = b2 ) ? 0 : 1 ;
if ( ( b2 = = CDROM_BUS_ATAPI_PIO_ONLY ) & & ( temp_cdrom_drives [ cdlv_current_sel ] . bus_type = = CDROM_BUS_ATAPI_PIO_AND_DMA ) )
assign = 0 ;
else if ( ( b2 = = CDROM_BUS_ATAPI_PIO_AND_DMA ) & & ( temp_cdrom_drives [ cdlv_current_sel ] . bus_type = = CDROM_BUS_ATAPI_PIO_ONLY ) )
assign = 0 ;
temp_cdrom_drives [ cdlv_current_sel ] . bus_type = b2 ;
cdrom_recalc_location_controls ( hdlg , assign ) ;
cdrom_track ( cdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_CDROM_DRIVES ) ;
win_settings_cdrom_drives_update_item ( h , cdlv_current_sel ) ;
cdrom_bus_skip :
rd_ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_CD_ID :
if ( rd_ignore_change )
{
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_ID ) ;
cdrom_untrack ( cdlv_current_sel ) ;
temp_cdrom_drives [ cdlv_current_sel ] . scsi_device_id = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
cdrom_track ( cdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_CDROM_DRIVES ) ;
win_settings_cdrom_drives_update_item ( h , cdlv_current_sel ) ;
rd_ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_CD_LUN :
if ( rd_ignore_change )
{
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_LUN ) ;
cdrom_untrack ( cdlv_current_sel ) ;
temp_cdrom_drives [ cdlv_current_sel ] . scsi_device_lun = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
cdrom_track ( cdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_CDROM_DRIVES ) ;
win_settings_cdrom_drives_update_item ( h , cdlv_current_sel ) ;
rd_ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_CD_CHANNEL_IDE :
if ( rd_ignore_change )
{
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_CD_CHANNEL_IDE ) ;
cdrom_untrack ( cdlv_current_sel ) ;
temp_cdrom_drives [ cdlv_current_sel ] . ide_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
cdrom_track ( cdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_CDROM_DRIVES ) ;
win_settings_cdrom_drives_update_item ( h , cdlv_current_sel ) ;
rd_ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_ZIP_BUS :
if ( rd_ignore_change )
{
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_BUS ) ;
b = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
switch ( b )
{
case 0 :
b2 = ZIP_BUS_DISABLED ;
break ;
case 1 :
b2 = ZIP_BUS_ATAPI_PIO_ONLY ;
break ;
case 2 :
b2 = ZIP_BUS_ATAPI_PIO_AND_DMA ;
break ;
case 3 :
b2 = ZIP_BUS_SCSI ;
break ;
}
if ( b2 = = temp_zip_drives [ zdlv_current_sel ] . bus_type )
{
goto zip_bus_skip ;
}
zip_untrack ( zdlv_current_sel ) ;
assign = ( temp_zip_drives [ zdlv_current_sel ] . bus_type = = b2 ) ? 0 : 1 ;
if ( ( b2 = = ZIP_BUS_ATAPI_PIO_ONLY ) & & ( temp_zip_drives [ zdlv_current_sel ] . bus_type = = ZIP_BUS_ATAPI_PIO_AND_DMA ) )
assign = 0 ;
else if ( ( b2 = = ZIP_BUS_ATAPI_PIO_AND_DMA ) & & ( temp_zip_drives [ cdlv_current_sel ] . bus_type = = ZIP_BUS_ATAPI_PIO_ONLY ) )
assign = 0 ;
temp_zip_drives [ zdlv_current_sel ] . bus_type = b2 ;
zip_recalc_location_controls ( hdlg , assign ) ;
zip_track ( zdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_ZIP_DRIVES ) ;
win_settings_zip_drives_update_item ( h , zdlv_current_sel ) ;
zip_bus_skip :
rd_ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_ZIP_ID :
if ( rd_ignore_change )
{
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_ID ) ;
zip_untrack ( zdlv_current_sel ) ;
temp_zip_drives [ zdlv_current_sel ] . scsi_device_id = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
zip_track ( zdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_ZIP_DRIVES ) ;
win_settings_zip_drives_update_item ( h , zdlv_current_sel ) ;
rd_ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_ZIP_LUN :
if ( rd_ignore_change )
{
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_LUN ) ;
zip_untrack ( zdlv_current_sel ) ;
temp_zip_drives [ zdlv_current_sel ] . scsi_device_lun = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
zip_track ( zdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_ZIP_DRIVES ) ;
win_settings_zip_drives_update_item ( h , zdlv_current_sel ) ;
rd_ignore_change = 0 ;
return FALSE ;
case IDC_COMBO_ZIP_CHANNEL_IDE :
if ( rd_ignore_change )
{
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_COMBO_ZIP_CHANNEL_IDE ) ;
zip_untrack ( zdlv_current_sel ) ;
temp_zip_drives [ zdlv_current_sel ] . ide_channel = SendMessage ( h , CB_GETCURSEL , 0 , 0 ) ;
zip_track ( zdlv_current_sel ) ;
h = GetDlgItem ( hdlg , IDC_LIST_ZIP_DRIVES ) ;
win_settings_zip_drives_update_item ( h , zdlv_current_sel ) ;
rd_ignore_change = 0 ;
return FALSE ;
case IDC_CHECK250 :
if ( rd_ignore_change )
{
return FALSE ;
}
rd_ignore_change = 1 ;
h = GetDlgItem ( hdlg , IDC_CHECK250 ) ;
temp_zip_drives [ zdlv_current_sel ] . is_250 = SendMessage ( h , BM_GETCHECK , 0 , 0 ) ;
h = GetDlgItem ( hdlg , IDC_LIST_ZIP_DRIVES ) ;
win_settings_zip_drives_update_item ( h , zdlv_current_sel ) ;
rd_ignore_change = 0 ;
return FALSE ;
}
default :
return FALSE ;
}
return FALSE ;
}
2018-03-02 18:58:18 -05:00
# define PAGE_MACHINE 0
# define PAGE_VIDEO 1
# define PAGE_INPUT 2
# define PAGE_SOUND 3
# define PAGE_NETWORK 4
# define PAGE_PORTS 5
# define PAGE_PERIPHERALS 6
# define PAGE_HARD_DISKS 7
# define PAGE_FLOPPY_DRIVES 8
# define PAGE_OTHER_REMOVABLE_DEVICES 9
static void
show_child ( HWND hwndParent , DWORD child_id )
2018-02-20 21:44:51 -05:00
{
2018-03-02 18:58:18 -05:00
if ( child_id = = displayed_category ) return ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
displayed_category = child_id ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
SendMessage ( hwndChildDialog , WM_SAVESETTINGS , 0 , 0 ) ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
DestroyWindow ( hwndChildDialog ) ;
switch ( child_id ) {
case PAGE_MACHINE :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_MACHINE , hwndParent , machine_proc ) ;
break ;
case PAGE_VIDEO :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_VIDEO , hwndParent , video_proc ) ;
break ;
case PAGE_INPUT :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_INPUT , hwndParent , input_proc ) ;
break ;
case PAGE_SOUND :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_SOUND , hwndParent , sound_proc ) ;
break ;
case PAGE_NETWORK :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_NETWORK , hwndParent , network_proc ) ;
break ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
case PAGE_PORTS :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_PORTS , hwndParent , ports_proc ) ;
break ;
case PAGE_PERIPHERALS :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_PERIPHERALS , hwndParent , peripherals_proc ) ;
break ;
case PAGE_HARD_DISKS :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_HARD_DISKS , hwndParent , hard_disks_proc ) ;
break ;
case PAGE_FLOPPY_DRIVES :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_FLOPPY_DRIVES , hwndParent , floppy_drives_proc ) ;
break ;
case PAGE_OTHER_REMOVABLE_DEVICES :
hwndChildDialog = CreateDialog ( hinstance , ( LPCWSTR ) DLG_CFG_OTHER_REMOVABLE_DEVICES , hwndParent , other_removable_devices_proc ) ;
break ;
default :
fatal ( " Invalid child dialog ID \n " ) ;
return ;
}
ShowWindow ( hwndChildDialog , SW_SHOWNORMAL ) ;
2018-02-20 21:44:51 -05:00
}
2018-03-02 18:58:18 -05:00
static BOOL
image_list_init ( HWND hwndList )
{
HICON hiconItem ;
HIMAGELIST hSmall ;
int i = 0 ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
hSmall = ImageList_Create ( GetSystemMetrics ( SM_CXSMICON ) ,
GetSystemMetrics ( SM_CYSMICON ) ,
ILC_MASK | ILC_COLOR32 , 1 , 1 ) ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
for ( i = 0 ; i < 10 ; i + + ) {
hiconItem = LoadIcon ( hinstance , ( LPCWSTR ) ( 256 + ( uintptr_t ) i ) ) ;
ImageList_AddIcon ( hSmall , hiconItem ) ;
DestroyIcon ( hiconItem ) ;
}
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
ListView_SetImageList ( hwndList , hSmall , LVSIL_SMALL ) ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
return ( TRUE ) ;
2018-02-20 21:44:51 -05:00
}
2018-03-02 18:58:18 -05:00
static BOOL
insert_categories ( HWND hwndList )
2018-02-20 21:44:51 -05:00
{
2018-03-02 18:58:18 -05:00
LVITEM lvI ;
int i = 0 ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
lvI . mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE ;
lvI . stateMask = lvI . iSubItem = lvI . state = 0 ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
for ( i = 0 ; i < 10 ; i + + ) {
lvI . pszText = plat_get_string ( IDS_2065 + i ) ;
lvI . iItem = i ;
lvI . iImage = i ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
if ( ListView_InsertItem ( hwndList , & lvI ) = = - 1 )
return ( FALSE ) ;
}
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
return ( TRUE ) ;
2018-02-20 21:44:51 -05:00
}
2018-03-02 18:58:18 -05:00
2018-02-20 21:44:51 -05:00
# ifdef __amd64__
static LRESULT CALLBACK
# else
static BOOL CALLBACK
# endif
2018-03-02 18:58:18 -05:00
main_proc ( HWND hdlg , UINT message , WPARAM wParam , LPARAM lParam )
2018-02-20 21:44:51 -05:00
{
2018-03-02 18:58:18 -05:00
HWND h ;
int category ;
int i = 0 ;
int j = 0 ;
hwndParentDialog = hdlg ;
switch ( message ) {
case WM_INITDIALOG :
settings_init ( ) ;
displayed_category = - 1 ;
h = GetDlgItem ( hdlg , IDC_SETTINGSCATLIST ) ;
image_list_init ( h ) ;
insert_categories ( h ) ;
ListView_SetItemState ( h , 0 , LVIS_FOCUSED | LVIS_SELECTED , 0x000F ) ;
2018-02-20 21:44:51 -05:00
#if 0
2018-03-02 18:58:18 -05:00
/*Leave this commented out until we do localization. */
h = GetDlgItem ( hdlg , IDC_COMBO_LANG ) ; /* This is currently disabled, I am going to add localization options in the future. */
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
h = GetDlgItem ( hdlg , IDS_LANG_ENUS ) ; /*was:2047 !*/
EnableWindow ( h , FALSE ) ;
ShowWindow ( h , SW_HIDE ) ;
2018-02-20 21:44:51 -05:00
# endif
2018-03-02 18:58:18 -05:00
return ( TRUE ) ;
case WM_NOTIFY :
if ( ( ( ( LPNMHDR ) lParam ) - > code = = LVN_ITEMCHANGED ) & & ( ( ( LPNMHDR ) lParam ) - > idFrom = = IDC_SETTINGSCATLIST ) ) {
category = - 1 ;
for ( i = 0 ; i < 10 ; i + + ) {
h = GetDlgItem ( hdlg , IDC_SETTINGSCATLIST ) ;
j = ListView_GetItemState ( h , i , LVIS_SELECTED ) ;
if ( j ) category = i ;
}
if ( category ! = - 1 )
show_child ( hdlg , category ) ;
}
break ;
case WM_COMMAND :
switch ( LOWORD ( wParam ) ) {
case IDOK :
SendMessage ( hwndChildDialog , WM_SAVESETTINGS , 0 , 0 ) ;
if ( ask_sure ) {
i = msgbox_reset ( ) ;
if ( i = = 0 ) {
/* CANCEL, just kidding! */
return ( FALSE ) ;
2018-02-20 21:44:51 -05:00
}
2018-03-02 18:58:18 -05:00
} else {
i = 2 ;
2018-02-20 21:44:51 -05:00
}
2018-03-02 18:58:18 -05:00
if ( i = = 2 ) {
/* YES, reset system. */
settings_save ( ) ;
2018-02-20 21:44:51 -05:00
}
2018-03-02 18:58:18 -05:00
DestroyWindow ( hwndChildDialog ) ;
EndDialog ( hdlg , i ) ;
return ( TRUE ) ;
2018-02-20 21:44:51 -05:00
2018-03-02 18:58:18 -05:00
case IDCANCEL :
DestroyWindow ( hwndChildDialog ) ;
EndDialog ( hdlg , 0 ) ;
return ( TRUE ) ;
}
break ;
default :
return ( FALSE ) ;
}
return ( FALSE ) ;
2018-02-20 21:44:51 -05:00
}
2018-03-02 18:58:18 -05:00
int
win_settings_open ( HWND hwnd , int ask )
2018-02-20 21:44:51 -05:00
{
2018-03-02 18:58:18 -05:00
int i , m , v ;
/* Enumerate the available machines. */
m = machine_detect ( ) ;
/* Enumerate the available video cards. */
v = video_detect ( ) ;
if ( m = = 0 | | v = = 0 ) {
ui_msgbox ( MBX_ERROR | MBX_FATAL , ( wchar_t * ) IDS_2056 ) ;
return ( 0 ) ;
}
ask_sure = ask ;
i = DialogBox ( hinstance , ( LPCWSTR ) DLG_CONFIG , hwnd , main_proc ) ;
return ( i ) ;
2018-02-20 21:44:51 -05:00
}