Annotation of uae/src/od-win32/win32gui.c, revision 1.1.1.1

1.1       root        1: /*==========================================================================
                      2:  *
                      3:  *  Copyright (C) 1996 Brian King
                      4:  *
                      5:  *  File:       wingui.c
                      6:  *  Content:    Win32-specific gui features for UAE port.
                      7:  *
                      8: -U 4 -c 4 -F 8 -n i3 -w 2 -m system3.1:d:\amiga\hd0 -m work:d:\amiga\hd1
                      9:  ***************************************************************************/
                     10: #ifdef __GNUC__
                     11: #define NONAMELESSUNION
                     12: #define __int64 long long
                     13: #include "machdep/winstuff.h"
                     14: #else
                     15: #include <stdio.h>
                     16: #include <stdlib.h>
                     17: #include <io.h>
                     18: #include <windows.h>
                     19: #include <windowsx.h>
                     20: #include <mmsystem.h>
                     21: #include <commctrl.h>
                     22: #include <commdlg.h>
                     23: #include <dlgs.h>
                     24: #include <winuser.h>
                     25: #include <ddraw.h>
                     26: #include <process.h>
                     27: #include <shlobj.h>
                     28: #include <prsht.h>
                     29: #include <richedit.h>
                     30: #endif
                     31: #include "config.h"
                     32: #include "resource.h"
                     33: #include "sysconfig.h"
                     34: #include "sysdeps.h"
                     35: #include "gui.h"
                     36: #include "options.h"
                     37: #include "memory.h"
                     38: #ifdef __GNUC__
                     39: #include "machdep/memory.h"
                     40: #endif
                     41: #include "custom.h"
                     42: #include "readcpu.h"
                     43: #include "newcpu.h"
                     44: #include "disk.h"
                     45: #include "uae.h"
                     46: #include "autoconf.h"
                     47: 
                     48: #include "picasso96.h"
                     49: #include "osdep/win32.h"
                     50: #include "osdep/win32gui.h"
                     51: 
                     52: extern LONG GetDisplayModeLogicalNumber( int w, int h );
                     53: extern LONG GetDisplayModeNumber( LONG logical );
                     54: 
                     55: extern HANDLE hEmuThread;
                     56: extern BOOL viewing_child;
                     57: extern BOOL                    allow_quit_from_property_sheet;
                     58: extern BOOL                    viewing_child;
                     59: extern HDC hBackDC;
                     60: extern HBITMAP hBackBM;
                     61: extern HINSTANCE hInst;
                     62: extern HWND hMainWnd, hAmigaWnd;
                     63: extern uae_u32 fastmem_size, chipmem_size, bogomem_size, gfxmem_size, z3fastmem_size; // BDK
                     64: extern int new_fullscreen_flag;
                     65: extern int mouseactive;
                     66: extern char *start_path;
                     67: HANDLE win32uae_key = NULL;
                     68: 
                     69: #define Error(x) MessageBox( NULL, (x), "WinUAE Error", MB_OK )
                     70: 
                     71: #ifdef __GNUC__
                     72: #define DUN DUMMYUNIONNAME ## .
                     73: #define DUN2 DUMMYUNIONNAME2 ## .
                     74: #define DUN3 DUMMYUNIONNAME3 ## .
                     75: #else
                     76: #define DUN
                     77: #define DUN2
                     78: #define DUN3
                     79: #endif
                     80: BOOL GetSettings(void)
                     81: {
                     82:     BOOL rc = TRUE;
                     83:     PROPSHEETPAGE pages[C_PAGES];
                     84:     PROPSHEETHEADER pHeader;
                     85: 
                     86:     pages[ LOADSAVE_ID ].dwSize      = sizeof(PROPSHEETPAGE);
                     87:     pages[ LOADSAVE_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
                     88:     pages[ LOADSAVE_ID ].hInstance   = hInst;
                     89:     pages[ LOADSAVE_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_LOADSAVE);
                     90:     pages[ LOADSAVE_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_LOADSAVE);
                     91:     pages[ LOADSAVE_ID ].pszTitle    = MAKEINTRESOURCE(IDS_LOADSAVE);
                     92:     pages[ LOADSAVE_ID ].pfnDlgProc  = (LPFNPSPCALLBACK) LoadSaveDlgProc;
                     93:     pages[ LOADSAVE_ID ].lParam      = 0;
                     94:     pages[ LOADSAVE_ID ].pfnCallback = NULL;
                     95:     pages[ LOADSAVE_ID ].pcRefParent = NULL;
                     96: 
                     97:     pages[ STARTUP_ID ].dwSize      = sizeof(PROPSHEETPAGE);
                     98:     pages[ STARTUP_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
                     99:     pages[ STARTUP_ID ].hInstance   = hInst;
                    100:     pages[ STARTUP_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_STARTUP);
                    101:     pages[ STARTUP_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_STARTUP);
                    102:     pages[ STARTUP_ID ].pszTitle    = MAKEINTRESOURCE(IDS_STARTUP);
                    103:     pages[ STARTUP_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)StartupDlgProc;
                    104:     pages[ STARTUP_ID ].lParam      = 0;
                    105:     pages[ STARTUP_ID ].pfnCallback = NULL;
                    106:     pages[ STARTUP_ID ].pcRefParent = NULL;
                    107: 
                    108:     pages[ SOUND_ID ].dwSize      = sizeof(PROPSHEETPAGE);
                    109:     pages[ SOUND_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
                    110:     pages[ SOUND_ID ].hInstance   = hInst;
                    111:     pages[ SOUND_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_SOUND);
                    112:     pages[ SOUND_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_SOUND);
                    113:     pages[ SOUND_ID ].pszTitle    = MAKEINTRESOURCE(IDS_SOUND);
                    114:     pages[ SOUND_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)SoundDlgProc;
                    115:     pages[ SOUND_ID ].lParam      = 0;
                    116:     pages[ SOUND_ID ].pfnCallback = NULL;
                    117:     pages[ SOUND_ID ].pcRefParent = NULL;
                    118: 
                    119:     pages[ DISPLAY_ID ].dwSize      = sizeof(PROPSHEETPAGE);
                    120:     pages[ DISPLAY_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
                    121:     pages[ DISPLAY_ID ].hInstance   = hInst;
                    122:     pages[ DISPLAY_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_DISPLAY);
                    123:     pages[ DISPLAY_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_DISPLAY);
                    124:     pages[ DISPLAY_ID ].pszTitle    = MAKEINTRESOURCE(IDS_DISPLAY);
                    125:     pages[ DISPLAY_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)DisplayDlgProc;
                    126:     pages[ DISPLAY_ID ].lParam      = 0;
                    127:     pages[ DISPLAY_ID ].pfnCallback = NULL;
                    128:     pages[ DISPLAY_ID ].pcRefParent = NULL;
                    129: 
                    130:     pages[ HARDDISK_ID ].dwSize      = sizeof(PROPSHEETPAGE);
                    131:     pages[ HARDDISK_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
                    132:     pages[ HARDDISK_ID ].hInstance   = hInst;
                    133:     pages[ HARDDISK_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_HARDDISK);
                    134:     pages[ HARDDISK_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_HARDDRIVE);
                    135:     pages[ HARDDISK_ID ].pszTitle    = MAKEINTRESOURCE(IDS_HARDDRIVES);
                    136:     pages[ HARDDISK_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)HarddiskDlgProc;
                    137:     pages[ HARDDISK_ID ].lParam      = 0;
                    138:     pages[ HARDDISK_ID ].pfnCallback = NULL;
                    139:     pages[ HARDDISK_ID ].pcRefParent = NULL;
                    140: 
                    141:     pages[ FLOPPY_ID ].dwSize      = sizeof(PROPSHEETPAGE);
                    142:     pages[ FLOPPY_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
                    143:     pages[ FLOPPY_ID ].hInstance   = hInst;
                    144:     pages[ FLOPPY_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_FLOPPIES);
                    145:     pages[ FLOPPY_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_FLOPPYDRIVE);
                    146:     pages[ FLOPPY_ID ].pszTitle    = MAKEINTRESOURCE(IDS_FLOPPIES);
                    147:     pages[ FLOPPY_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)FloppiesDlgProc;
                    148:     pages[ FLOPPY_ID ].lParam      = 0;
                    149:     pages[ FLOPPY_ID ].pfnCallback = NULL;
                    150:     pages[ FLOPPY_ID ].pcRefParent = NULL;
                    151: 
                    152:     pages[ PORTS_ID ].dwSize      = sizeof(PROPSHEETPAGE);
                    153:     pages[ PORTS_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
                    154:     pages[ PORTS_ID ].hInstance   = hInst;
                    155:     pages[ PORTS_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_PORTS);
                    156:     pages[ PORTS_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_PORTS);
                    157:     pages[ PORTS_ID ].pszTitle    = MAKEINTRESOURCE(IDS_PORTS);
                    158:     pages[ PORTS_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)PortsDlgProc;
                    159:     pages[ PORTS_ID ].lParam      = 0;
                    160:     pages[ PORTS_ID ].pfnCallback = NULL;
                    161:     pages[ PORTS_ID ].pcRefParent = NULL;
                    162: 
                    163:     pages[ ADVANCED_ID ].dwSize      = sizeof(PROPSHEETPAGE);
                    164:     pages[ ADVANCED_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
                    165:     pages[ ADVANCED_ID ].hInstance   = hInst;
                    166:     pages[ ADVANCED_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_ADVANCED);
                    167:     pages[ ADVANCED_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_ADVANCED);
                    168:     pages[ ADVANCED_ID ].pszTitle    = MAKEINTRESOURCE(IDS_ADVANCED);
                    169:     pages[ ADVANCED_ID ].pfnDlgProc  = (LPFNPSPCALLBACK)AdvancedDlgProc;
                    170:     pages[ ADVANCED_ID ].lParam      = 0;
                    171:     pages[ ADVANCED_ID ].pfnCallback = NULL;
                    172:     pages[ ADVANCED_ID ].pcRefParent = NULL;
                    173: 
                    174:     pages[ ABOUT_ID ].dwSize      = sizeof(PROPSHEETPAGE);
                    175:     pages[ ABOUT_ID ].dwFlags     = PSP_USETITLE | PSP_USEICONID;
                    176:     pages[ ABOUT_ID ].hInstance   = hInst;
                    177:     pages[ ABOUT_ID ].DUN pszTemplate = MAKEINTRESOURCE(IDD_ABOUTME);
                    178:     pages[ ABOUT_ID ].DUN2 pszIcon     = MAKEINTRESOURCE(IDI_UAEINFO);
                    179:     pages[ ABOUT_ID ].pszTitle    = MAKEINTRESOURCE(IDS_ABOUTME);
                    180:     pages[ ABOUT_ID ].pfnDlgProc  = (LPFNPSPCALLBACK) AboutDlgProc;
                    181:     pages[ ABOUT_ID ].lParam      = 0;
                    182:     pages[ ABOUT_ID ].pfnCallback = NULL;
                    183:     pages[ ABOUT_ID ].pcRefParent = NULL;
                    184: 
                    185:     pHeader.dwSize     = sizeof(PROPSHEETHEADER);
                    186:     pHeader.dwFlags    = PSH_PROPSHEETPAGE | PSH_PROPTITLE | PSH_USEICONID | PSH_USECALLBACK | PSH_NOAPPLYNOW;
                    187:     pHeader.hwndParent = hAmigaWnd;
                    188:     pHeader.hInstance  = hInst;
                    189:     pHeader.DUN pszIcon    = MAKEINTRESOURCE(IDI_UAEICON);
                    190:     pHeader.pszCaption = "WinUAE";
                    191:     pHeader.nPages     = C_PAGES;
                    192:     pHeader.DUN2 nStartPage = 0;
                    193:     pHeader.DUN3 ppsp       = (LPCPROPSHEETPAGE)pages;
                    194:     pHeader.pfnCallback= (PFNPROPSHEETCALLBACK)InitPropertySheet;
                    195:     if(PropertySheet(&pHeader)==-1 || quit_program)
                    196:         rc = FALSE;
                    197:     return rc;
                    198: }
                    199: 
                    200: void SetupVolumes( void )
                    201: {
                    202:     int loop;
                    203:     for( loop = 0; loop < 4; loop++ )
                    204:     {
                    205:         if( *drives[loop].name && *drives[loop].path )
                    206:             add_filesys_unit( drives[loop].name, drives[loop].path, !drives[loop].rw, 0, 0, 0 );
                    207:     }
                    208: }
                    209: 
                    210: HWND pages[C_PAGES];
                    211: 
                    212: void CALLBACK InitPropertySheet( HWND hDlg, UINT msg, LPARAM lParam )
                    213: {
                    214:     int i;
                    215:     static BOOL first_time = TRUE;
                    216: 
                    217:     if( __argc != 1 )
                    218:     {
                    219:         first_time = FALSE;
                    220:     }
                    221: 
                    222:     if( !first_time )
                    223:     {
                    224:         // Remove the configurations page
                    225:         PropSheet_RemovePage( hDlg, 0, NULL );
                    226: 
                    227:         // Remove the startup property-sheet page
                    228:         PropSheet_RemovePage(hDlg,0,NULL);
                    229: 
                    230:         // Remove the sound property-sheet page
                    231:         PropSheet_RemovePage(hDlg,0,NULL);
                    232: 
                    233:                // Remove the harddrives property-sheet page
                    234:                PropSheet_RemovePage(hDlg,2,NULL);
                    235: 
                    236:         // Remove the advanced property-sheet page
                    237:         PropSheet_RemovePage(hDlg,3,NULL);
                    238: 
                    239:         allow_quit_from_property_sheet = FALSE;
                    240:     }
                    241: 
                    242:     switch(msg)
                    243:     {
                    244:         case PSCB_INITIALIZED:
                    245:             if( first_time )
                    246:             {
                    247:                 first_time = FALSE;
                    248:                 for( i=0;i<C_PAGES;pages[i++]=NULL);
                    249:             }
                    250:         break;
                    251:    }
                    252: }
                    253: 
                    254: void CalculateFPS( DWORD setting, char *buffer )
                    255: {
                    256:     char nth[10];
                    257:     switch( setting )
                    258:     {
                    259:     case 1:
                    260:         strcpy( nth, "" );
                    261:         break;
                    262:     case 2:
                    263:         strcpy( nth, "second " );
                    264:         break;
                    265:     case 3:
                    266:         strcpy( nth, "third " );
                    267:         break;
                    268:     case 4:
                    269:         strcpy( nth, "fourth " );
                    270:         break;
                    271:     case 5:
                    272:         strcpy( nth, "fifth " );
                    273:         break;
                    274:     case 6:
                    275:         strcpy( nth, "sixth " );
                    276:         break;
                    277:     case 7:
                    278:         strcpy( nth, "seventh " );
                    279:         break;
                    280:     case 8:
                    281:         strcpy( nth, "eighth " );
                    282:         break;
                    283:     case 9:
                    284:         strcpy( nth, "ninth " );
                    285:         break;
                    286:     default:
                    287:         strcpy( nth, "tenth " );
                    288:         break;
                    289:     }
                    290:      
                    291:     sprintf( buffer, "Every %sFrame", nth );
                    292: }
                    293: 
                    294: void CalculateSpeed( DWORD setting, char *buffer )
                    295: {
                    296:     sprintf( buffer, "%d", setting );
                    297:     currprefs.m68k_speed = setting;
                    298: }
                    299: 
                    300: void CalculateRealMem(DWORD setting, int *size, char *buffer, int memtype)
                    301: {
                    302:     if( memtype == 0 )
                    303:     {
                    304:         switch(setting)
                    305:         {
                    306:         case 0:
                    307:             if( buffer )
                    308:                 strcpy(buffer,"512 K");
                    309:             if( size )
                    310:                 *size = 0x00080000;
                    311:             break;
                    312:         case 1:
                    313:             if( buffer )
                    314:                 strcpy(buffer,"1 Meg");
                    315:             if( size )
                    316:                 *size = 0x00100000;
                    317:             break;
                    318:         case 2:
                    319:             if( buffer )
                    320:                 strcpy(buffer,"2 Megs");
                    321:             if( size )
                    322:                 *size = 0x00200000;
                    323:             break;
                    324:         case 3:
                    325:             if( buffer )
                    326:                 strcpy(buffer,"4 Megs");
                    327:             if( size )
                    328:                 *size = 0x00400000;
                    329:             break;
                    330:         default:
                    331:             if( buffer )
                    332:                 strcpy(buffer,"8 Megs");
                    333:             if( size )
                    334:                 *size = 0x00800000;
                    335:             break;
                    336:         }
                    337:     }
                    338:     else
                    339:     {
                    340:         switch(setting)
                    341:         {
                    342:         case 0:
                    343:             if( buffer )
                    344:                 strcpy(buffer,"None");
                    345:             if( size )
                    346:                 *size = 0x00000000;
                    347:             break;
                    348:         case 1:
                    349:             if( buffer )
                    350:                 strcpy(buffer,"1 Meg");
                    351:             if( size )
                    352:                 *size = 0x00100000;
                    353:             break;
                    354:         case 2:
                    355:             if( buffer )
                    356:                 strcpy(buffer,"2 Megs");
                    357:             if( size )
                    358:                 *size = 0x00200000;
                    359:             break;
                    360:         case 3:
                    361:             if( buffer )
                    362:                 strcpy(buffer,"4 Megs");
                    363:             if( size )
                    364:                 *size = 0x00400000;
                    365:             break;
                    366:         case 4:
                    367:             if( buffer )
                    368:                 strcpy(buffer,"8 Megs");
                    369:             if( size )
                    370:                 *size = 0x00800000;
                    371:             break;
                    372:         case 5:
                    373:             if( memtype == 3 )
                    374:             {
                    375:                 if( buffer )
                    376:                     strcpy( buffer, "16 Megs" );
                    377:                 if( size )
                    378:                     *size = 0x01000000;
                    379:             }
                    380:             break;
                    381:         case 6:
                    382:             if( memtype == 3 )
                    383:             {
                    384:                 if( buffer )
                    385:                     strcpy( buffer, "32 Megs" );
                    386:                 if( size )
                    387:                     *size = 0x02000000;
                    388:             }
                    389:             break;
                    390:         }
                    391:     }
                    392: }
                    393: 
                    394: void UpdateRadioButtons( HWND hDlg, HWND lParam )
                    395: {
                    396:     int which_button;
                    397: 
                    398:     if( GetDlgItem( hDlg, IDC_FREQUENCY ) == lParam )
                    399:     {
                    400:         switch( currprefs.sound_freq )
                    401:         {
                    402:         case 11025:
                    403:             which_button = IDC_11KHZ;
                    404:             break;
                    405:         case 44100:
                    406:             which_button = IDC_44KHZ;
                    407:             break;
                    408:         case 48000:
                    409:             which_button = IDC_48KHZ;
                    410:             break;
                    411:         default:
                    412:             which_button = IDC_22KHZ;
                    413:             break;
                    414:         }
                    415:         CheckRadioButton( hDlg, IDC_11KHZ, IDC_48KHZ, which_button );
                    416:     }
                    417:     else if( GetDlgItem( hDlg, IDC_SOUNDSIZE ) == lParam )
                    418:     {
                    419:         switch( currprefs.sound_bits )
                    420:         {
                    421:         case 16:
                    422:             which_button = IDC_16BIT;
                    423:             break;
                    424:         default:
                    425:             which_button = IDC_8BIT;
                    426:             break;
                    427:         }
                    428:         CheckRadioButton( hDlg, IDC_8BIT, IDC_16BIT, which_button );
                    429:     }
                    430:     else if( GetDlgItem( hDlg, IDC_SOUND ) == lParam )
                    431:     {
                    432:         switch( currprefs.produce_sound )
                    433:         {
                    434:         case -1:
                    435:             which_button = IDC_SOUND0;
                    436:             break;
                    437:         case 1:
                    438:             which_button = IDC_SOUND2;
                    439:             break;
                    440:         case 2:
                    441:             which_button = IDC_SOUND3;
                    442:             break;
                    443:         case 3:
                    444:             which_button = IDC_SOUND4;
                    445:             break;
                    446:         default:
                    447:             which_button = IDC_SOUND1;
                    448:             break;
                    449:         }
                    450:         if( CheckRadioButton( hDlg, IDC_SOUND0, IDC_SOUND4, which_button ) == 0 )
                    451:             which_button = 0;
                    452:     }
                    453:     else if( GetDlgItem( hDlg, IDC_PORT0 ) == lParam )
                    454:     {
                    455:         switch( currprefs.fake_joystick & 0x00FF )
                    456:         {
                    457:         case 0:
                    458:             which_button = IDC_PORT0_JOY0;
                    459:             break;
                    460:         case 1:
                    461:             which_button = IDC_PORT0_JOY1;
                    462:             break;
                    463:         case 2:
                    464:             which_button = IDC_PORT0_MOUSE;
                    465:             break;
                    466:         case 3:
                    467:             which_button = IDC_PORT0_KBDA;
                    468:             break;
                    469:         case 4:
                    470:             which_button = IDC_PORT0_KBDB;
                    471:             break;
                    472:         default:
                    473:             which_button = IDC_PORT0_KBDC;
                    474:             break;
                    475:         }
                    476:         if( CheckRadioButton( hDlg, IDC_PORT0_JOY0, IDC_PORT0_KBDC, which_button ) == 0 )
                    477:             which_button = 0;
                    478:     }
                    479:     else if( GetDlgItem( hDlg, IDC_PORT1 ) == lParam )
                    480:     {
                    481:         switch( ( currprefs.fake_joystick & 0xFF00 ) >> 8 )
                    482:         {
                    483:         case 0:
                    484:             which_button = IDC_PORT1_JOY0;
                    485:             break;
                    486:         case 1:
                    487:             which_button = IDC_PORT1_JOY1;
                    488:             break;
                    489:         case 2:
                    490:             which_button = IDC_PORT1_MOUSE;
                    491:             break;
                    492:         case 3:
                    493:             which_button = IDC_PORT1_KBDA;
                    494:             break;
                    495:         case 4:
                    496:             which_button = IDC_PORT1_KBDB;
                    497:             break;
                    498:         default:
                    499:             which_button = IDC_PORT1_KBDC;
                    500:             break;
                    501:         }
                    502:         if( CheckRadioButton( hDlg, IDC_PORT1_JOY0, IDC_PORT1_KBDC, which_button ) == 0 )
                    503:             which_button = 0;
                    504:     }
                    505: }
                    506: 
                    507: void UpdateScroller(HWND hDlg, HWND lParam)
                    508: {
                    509:     char buffer[32];
                    510:     DWORD dwPos = SendMessage( (HWND)lParam, TBM_GETPOS, 0 ,0 ), dwPos2;
                    511: 
                    512:     if( GetDlgItem( hDlg, IDC_CHIPMEM ) == lParam )
                    513:     {
                    514:         CalculateRealMem( dwPos, NULL, buffer, 0 );
                    515:         SetDlgItemText( hDlg, IDC_CHIPRAM, buffer );
                    516: 
                    517:         dwPos2 = SendDlgItemMessage( hDlg, IDC_FASTMEM, TBM_GETPOS, 0, 0 );
                    518:         if( ( dwPos > 2 ) &&
                    519:             ( dwPos2 > 0 ) )
                    520:         {
                    521:             SendDlgItemMessage( hDlg, IDC_FASTMEM, TBM_SETPOS, TRUE, 0 );
                    522:             UpdateScroller( hDlg, GetDlgItem( hDlg, IDC_FASTMEM ) );
                    523:         }
                    524:     }
                    525:     else if( GetDlgItem( hDlg, IDC_FASTMEM ) == lParam )
                    526:     {
                    527:         CalculateRealMem( dwPos, NULL, buffer, 1 );
                    528:         SetDlgItemText( hDlg, IDC_FASTRAM, buffer );
                    529: 
                    530:         dwPos2 = SendDlgItemMessage( hDlg, IDC_CHIPMEM, TBM_GETPOS, 0, 0 );
                    531:         if( ( dwPos > 0 ) &&
                    532:             ( dwPos2 > 2 ) )
                    533:         {
                    534:             SendDlgItemMessage( hDlg, IDC_CHIPMEM, TBM_SETPOS, TRUE, 2 );
                    535:             UpdateScroller( hDlg, GetDlgItem( hDlg, IDC_CHIPMEM ) );
                    536:         }
                    537:     }
                    538:     else if( GetDlgItem( hDlg, IDC_FRAMERATE ) == lParam )
                    539:     {
                    540:         CalculateFPS( dwPos, buffer );
                    541:         SetDlgItemText(hDlg,IDC_RATETEXT,buffer);
                    542:     }
                    543:     else if( GetDlgItem( hDlg, IDC_SPEED ) == lParam )
                    544:     {
                    545:         CalculateSpeed( dwPos, buffer );
                    546:         SetDlgItemText( hDlg, IDC_SPEEDBOX, buffer );
                    547:     }
                    548:     else if( GetDlgItem( hDlg, IDC_P96MEM ) == lParam )
                    549:     {
                    550:         CalculateRealMem( dwPos, NULL, buffer, 2 );
                    551:         SetDlgItemText( hDlg, IDC_P96RAM, buffer );
                    552:     }
                    553:     else if( GetDlgItem( hDlg, IDC_Z3FASTMEM ) == lParam )
                    554:     {
                    555:         CalculateRealMem( dwPos, NULL, buffer, 3 );
                    556:         SetDlgItemText( hDlg, IDC_Z3FASTRAM, buffer );
                    557:     }
                    558: }
                    559: 
                    560: ConfigStructPtr AllocateConfigStruct( void )
                    561: {
                    562:     ConfigStructPtr ptr = NULL;
                    563:     if( ptr = malloc( sizeof( ConfigStruct ) ) )
                    564:     {
                    565:         ptr->Size = sizeof( ConfigStruct );
                    566:         ptr->VersionMajor = CONFIG_VERSION_MAJOR;
                    567:         ptr->VersionMinor = CONFIG_VERSION_MINOR;
                    568:     }
                    569:     return ptr;
                    570: }
                    571: 
                    572: void FreeConfigStruct( ConfigStructPtr cfgptr )
                    573: {
                    574:     free( cfgptr );
                    575: }
                    576: 
                    577: // Get a ptr to a ConfigStruct based on entry-number
                    578: // Return NULL if invalid entry-number
                    579: ConfigStructPtr GetFirstConfigEntry( HANDLE *file_handle, LPWIN32_FIND_DATA find_data )
                    580: {
                    581:     HANDLE cfg_file;
                    582:     ConfigStructPtr config = NULL;
                    583:     DWORD num_bytes = 0;
                    584:     char init_path[MAX_PATH] = "", *posn;
                    585: 
                    586:     if( start_path )
                    587:     {
                    588:         strncpy( init_path, start_path, MAX_PATH );
                    589:         strncat( init_path, "\\Configurations\\*.CFG", MAX_PATH );
                    590:     }
                    591: 
                    592:     if( ( *file_handle = FindFirstFile( init_path, find_data ) ) != INVALID_HANDLE_VALUE )
                    593:     {
                    594:         config = AllocateConfigStruct();
                    595:         sprintf( init_path, "%s\\Configurations\\%s", start_path, find_data->cFileName );
                    596:         cfg_file = CreateFile( init_path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
                    597:         ReadFile( cfg_file, config, config->Size, &num_bytes, NULL );
                    598:         if( num_bytes == config->Size )
                    599:         {
                    600:             if( posn = strrchr( find_data->cFileName, '.' ) )
                    601:                 *posn = '\0';
                    602:             strcpy( config->Name, find_data->cFileName );
                    603:         }
                    604:         else
                    605:         {
                    606:             FreeConfigStruct( config );
                    607:             config = NULL;
                    608:         }
                    609:         CloseHandle( cfg_file );
                    610:     }
                    611:     else
                    612:     {
                    613: 
                    614:     }
                    615:     return config;
                    616: }
                    617: 
                    618: ConfigStructPtr GetNextConfigEntry( HANDLE *file_handle, LPWIN32_FIND_DATA find_data )
                    619: {
                    620:     HANDLE cfg_file;
                    621:     ConfigStructPtr config = NULL;
                    622:     DWORD num_bytes = 0;
                    623:     char init_path[MAX_PATH] = "", *posn;
                    624: 
                    625:     if( FindNextFile( *file_handle, find_data ) == 0 )
                    626:     {
                    627:         FindClose( *file_handle );
                    628:     }
                    629:     else
                    630:     {
                    631:         config = AllocateConfigStruct();
                    632:         sprintf( init_path, "%s\\Configurations\\%s", start_path, find_data->cFileName );
                    633:         cfg_file = CreateFile( init_path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
                    634:         ReadFile( cfg_file, config, config->Size, &num_bytes, NULL );
                    635:         if( posn = strrchr( find_data->cFileName, '.' ) )
                    636:             *posn = '\0';
                    637:         strcpy( config->Name, find_data->cFileName );
                    638:         CloseHandle( cfg_file );
                    639:     }
                    640:     return config;
                    641: }
                    642: 
                    643: // This function basically sets up the defaults in our ConfigStruct... it follows the same
                    644: // procedure as each DlgProc() does for a WM_INITDIALOG msg...
                    645: void GetDefaultsForPage( ConfigStructPtr cfgptr, int page )
                    646: {
                    647:     int i;
                    648: 
                    649:     switch( page )
                    650:     {
                    651:     case ADVANCED_ID:
                    652:         cfgptr->NoAutoConfig         = !currprefs.automount_uaedev;
                    653:         cfgptr->CopperHack           = currprefs.copper_pos;
                    654:         //cfgptr->DebuggerEnabled      = use_debugger;
                    655:         cfgptr->InvalidAddresses     = currprefs.illegal_mem;
                    656:         cfgptr->M68KSpeed = currprefs.m68k_speed;
                    657:         cfgptr->AddressingIs24Bit    = address_space_24;
                    658:         break;
                    659:     case STARTUP_ID:
                    660:         cfgptr->ChipMem              = chipmem_size;
                    661:         cfgptr->FastMem              = fastmem_size;
                    662:         cfgptr->P96Mem               = gfxmem_size;
                    663:         cfgptr->Z3Mem                = z3fastmem_size;
                    664:         strncpy( cfgptr->KickstartName, romfile, CFG_ROM_LENGTH );
                    665:         strncpy( cfgptr->KeyFileName, keyfile, CFG_KEY_LENGTH );
                    666:         break;
                    667:     case DISPLAY_ID:
                    668:         cfgptr->FrameRate     = currprefs.framerate;
                    669:         cfgptr->LineDouble    = currprefs.gfx_linedbl;
                    670:         cfgptr->FullScreen    = amiga_fullscreen;
                    671:         cfgptr->CorrectAspect = currprefs.gfx_correct_aspect;
                    672:         cfgptr->CenterY       = currprefs.gfx_ycenter;
                    673:         cfgptr->CenterX       = currprefs.gfx_xcenter;
                    674:         cfgptr->Blit32        = currprefs.blits_32bit_enabled;
                    675:         cfgptr->BlitImmediate = currprefs.immediate_blits;
                    676:         cfgptr->Lores         = currprefs.gfx_lores;
                    677:         cfgptr->CustomSize    = customsize;
                    678:         cfgptr->ScreenWidth   = currprefs.gfx_width;
                    679:         cfgptr->ScreenHeight  = currprefs.gfx_height;
                    680:         break;
                    681:     case HARDDISK_ID:
                    682:         for( i = 0; i < NUM_DRIVES; i++ )
                    683:         {
                    684:             memcpy( &(cfgptr->drives[i]), &drives[i], sizeof( drive_specs ) );
                    685:         }
                    686:         cfgptr->HardFileBootPri = hf_bootpri;
                    687:         break;
                    688:     case FLOPPY_ID:
                    689:         for( i = 0; i < NUM_DRIVES; i++ )
                    690:         {
                    691:             memcpy( cfgptr->df[i], currprefs.df[i], 256 );
                    692:         }
                    693:         break;
                    694:     case SOUND_ID:
                    695:         cfgptr->SoundSupport = currprefs.produce_sound;
                    696:         cfgptr->SoundBits    = currprefs.sound_bits;
                    697:         cfgptr->SoundFreq    = currprefs.sound_freq;
                    698:         cfgptr->SoundStereo  = currprefs.stereo;
                    699:         break;
                    700:     case PORTS_ID:
                    701:         cfgptr->FakeJoystick = currprefs.fake_joystick;
                    702:         cfgptr->SerialPort   = currprefs.use_serial;
                    703:         strncpy( cfgptr->SerialName,  sername, CFG_SER_LENGTH );
                    704:         strncpy( cfgptr->PrinterName, prtname, CFG_PAR_LENGTH );
                    705:         break;
                    706:     case LOADSAVE_ID:
                    707:     case ABOUT_ID:
                    708:     default:
                    709:         break;
                    710:     }
                    711: }
                    712: 
                    713: // flag = 0 - save
                    714: //      = 1 - load
                    715: //      = 2 - delete
                    716: //      = 3 - import
                    717: void ConfigurationFile( HWND hDlg, ConfigStructPtr cfgptr, int flag )
                    718: {
                    719:     HANDLE file_handle;
                    720:     DWORD byte_count;
                    721:     OPENFILENAME openFileName;
                    722:     char full_path[MAX_PATH] = "";
                    723:     char file_name[MAX_PATH] = "";
                    724:     char init_path[MAX_PATH] = "";
                    725: 
                    726:     if( start_path )
                    727:     {
                    728:         strncpy( init_path, start_path, MAX_PATH );
                    729:         strncat( init_path, "\\Configurations\\", MAX_PATH );
                    730:         strcpy( full_path, cfgptr->Name );
                    731:     }
                    732: 
                    733:     if( flag == 3 )
                    734:     {
                    735:         openFileName.lStructSize       = sizeof(OPENFILENAME);
                    736:         openFileName.hwndOwner         = hDlg;
                    737:         openFileName.hInstance         = hInst;
                    738:         openFileName.lpstrFilter       = "WinUAE Configuration Files (*.ACF)\0*.ACF\0\0";
                    739:         openFileName.lpstrTitle        = "Choose the configuration file to import...";
                    740:         openFileName.Flags             = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
                    741:         openFileName.lpstrDefExt       = "ACF";
                    742:         openFileName.lpstrCustomFilter = NULL;
                    743:         openFileName.nMaxCustFilter    = 0;
                    744:         openFileName.nFilterIndex      = 0;
                    745:         openFileName.lpstrFile         = full_path;
                    746:         openFileName.nMaxFile          = MAX_PATH;
                    747:         openFileName.lpstrFileTitle    = file_name;
                    748:         openFileName.nMaxFileTitle     = MAX_PATH;
                    749:         if( start_path )
                    750:             openFileName.lpstrInitialDir   = init_path;
                    751:         else
                    752:             openFileName.lpstrInitialDir   = NULL;
                    753:         openFileName.lpfnHook          = NULL;
                    754:         openFileName.lpTemplateName    = NULL;
                    755:         openFileName.lCustData         = 0;
                    756: 
                    757:         if( GetOpenFileName( &openFileName ) )
                    758:         {
                    759:             // Do the import stuff here...
                    760:         }
                    761:     }
                    762:     if( flag == 1 )
                    763:     {
                    764:         SetCursor( LoadCursor( NULL, IDC_WAIT ) );
                    765: 
                    766:         // full_path is our path to load the file from...
                    767:         sprintf( full_path, "%s%s.CFG", init_path, cfgptr->Name );
                    768:         if( ( file_handle = CreateFile( full_path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ) ) == INVALID_HANDLE_VALUE )
                    769:         {
                    770:             // handle error
                    771:         }
                    772:         else
                    773:         {
                    774:             if( ReadFile( file_handle, cfgptr, cfgptr->Size, &byte_count, NULL ) == FALSE )
                    775:             {
                    776:                 // handle error
                    777:             }
                    778:             CloseHandle( file_handle );
                    779:         }
                    780:         SetCursor( LoadCursor( NULL, IDC_ARROW ) );
                    781:     }
                    782:     else if( flag == 0 )
                    783:     {
                    784:         SetCursor( LoadCursor( NULL, IDC_WAIT ) );
                    785: 
                    786:         // full_path is our path to save the file into...
                    787:         sprintf( full_path, "%s%s.CFG", init_path, cfgptr->Name );
                    788:         if( ( file_handle = CreateFile( full_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL ) ) == INVALID_HANDLE_VALUE )
                    789:         {
                    790:             // handle error
                    791:         }
                    792:         else
                    793:         {
                    794:             if( WriteFile( file_handle, cfgptr, cfgptr->Size, &byte_count, NULL ) == FALSE )
                    795:             {
                    796:                 // handle error
                    797:             }
                    798:             CloseHandle( file_handle );
                    799:         }
                    800:         SetCursor( LoadCursor( NULL, IDC_ARROW ) );
                    801:     }
                    802:     else
                    803:     {
                    804:         // full_path is our file to delete...
                    805:         sprintf( full_path, "%s%s.CFG", init_path, cfgptr->Name );
                    806:         DeleteFile( full_path );
                    807:     }
                    808: }
                    809: 
                    810: // the flag is a 1 if we're transferring from a cfgptr to the dialog stuff, or a 0 if the other way...
                    811: void TransferConfiguration( HWND hDlg, int flag )
                    812: {
                    813:     int i;
                    814:     ConfigStructPtr cfgptr;
                    815: 
                    816:     if( cfgptr = AllocateConfigStruct() )
                    817:     {
                    818:         switch( flag )
                    819:         {
                    820:         case 0: // we're doing a save...
                    821:             GetDlgItemText( hDlg, IDC_EDITNAME, cfgptr->Name, MAX_PATH );
                    822:             if( cfgptr->Name[0] == '\0' )
                    823:             {
                    824:                 MessageBox( hDlg, "You must enter a name for your configuration...", "Save Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND );
                    825:             }
                    826:             else
                    827:             {
                    828:                 GetDlgItemText( hDlg, IDC_EDITDESCRIPTION, cfgptr->Description, CFG_DESCRIPTION_LENGTH );
                    829: 
                    830:                 // The for() loop below handles the other pages that were never viewed...
                    831:                 for( i = 0; i < C_PAGES; i++ )
                    832:                 {
                    833:                     if( pages[i] == NULL )
                    834:                         GetDefaultsForPage( cfgptr, i );
                    835:                     else
                    836:                         SendMessage( pages[i], PSM_QUERYSIBLINGS, 0, (LPARAM)cfgptr );
                    837:                 }
                    838:                 ConfigurationFile( hDlg, cfgptr, flag );
                    839:             }
                    840:             break;
                    841: 
                    842:         case 1: // we're doing a load...
                    843:             GetDlgItemText( hDlg, IDC_EDITNAME, cfgptr->Name, MAX_PATH );
                    844:             if( cfgptr->Name[0] == '\0' )
                    845:             {
                    846:                 MessageBox( hDlg, "You must select a configuration...", "Load Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND );
                    847:             }
                    848:             else
                    849:             {
                    850:                 ConfigurationFile( hDlg, cfgptr, flag );
                    851: 
                    852:                 // Do a sanity-test on the loaded config file:
                    853:                 // - check its Size member
                    854:                 // - check its VersionMajor
                    855:                 // - check its VersionMinor
                    856:                 if( ( cfgptr->Size != sizeof( ConfigStruct ) ) ||
                    857:                     ( cfgptr->VersionMajor != CONFIG_VERSION_MAJOR ) ||
                    858:                     ( cfgptr->VersionMinor != CONFIG_VERSION_MINOR ) )
                    859:                 {
                    860:                     // Dire error situation...
                    861:                     MessageBox( hDlg, "This configuration is of the wrong version... automatic conversion is not yet available, sorry!", "Config-File Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND );
                    862:                 }
                    863:                 else
                    864:                 {
                    865:                     // Insert stuff here to take the cfgptr contents and put them into the right configuration variables (currprefs, etc).
                    866: 
                    867:                     // Basically ripped from GetDefaultsForPage() function above... and reversed direction
                    868:                     currprefs.automount_uaedev    = !cfgptr->NoAutoConfig;
                    869:                     currprefs.fake_joystick       = cfgptr->FakeJoystick;
                    870:                     currprefs.illegal_mem         = cfgptr->InvalidAddresses;
                    871:                     currprefs.use_serial          = cfgptr->SerialPort;
                    872:                     currprefs.gfx_correct_aspect  = cfgptr->CorrectAspect;
                    873:                     currprefs.gfx_ycenter         = cfgptr->CenterY;
                    874:                     currprefs.gfx_xcenter         = cfgptr->CenterX;
                    875:                     currprefs.copper_pos          = cfgptr->CopperHack;
                    876:                     currprefs.blits_32bit_enabled = cfgptr->Blit32;
                    877:                     currprefs.immediate_blits     = cfgptr->BlitImmediate;
                    878:                     currprefs.gfx_lores           = cfgptr->Lores;
                    879:                     currprefs.framerate           = cfgptr->FrameRate;
                    880:                     currprefs.gfx_linedbl         = cfgptr->LineDouble;
                    881:                     currprefs.gfx_width           = cfgptr->ScreenWidth;
                    882:                     currprefs.gfx_height          = cfgptr->ScreenHeight;
                    883:                     currprefs.produce_sound       = (int)(cfgptr->SoundSupport);
                    884:                     currprefs.sound_bits          = cfgptr->SoundBits;
                    885:                     currprefs.sound_freq          = cfgptr->SoundFreq;
                    886:                     currprefs.stereo              = cfgptr->SoundStereo;
                    887: 
                    888:                     //use_debugger           = cfgptr->DebuggerEnabled;
                    889:                     amiga_fullscreen       = cfgptr->FullScreen;
                    890:                     chipmem_size           = cfgptr->ChipMem;
                    891:                     fastmem_size           = cfgptr->FastMem;
                    892:                     gfxmem_size            = cfgptr->P96Mem;
                    893:                     z3fastmem_size         = cfgptr->Z3Mem;
                    894:                     currprefs.m68k_speed   = cfgptr->M68KSpeed;
                    895:                     hf_bootpri             = cfgptr->HardFileBootPri;
                    896:                     customsize             = cfgptr->CustomSize;
                    897:                     address_space_24       = cfgptr->AddressingIs24Bit;
                    898: 
                    899:                     strncpy( sername, cfgptr->SerialName, CFG_SER_LENGTH );
                    900:                     strncpy( prtname, cfgptr->PrinterName, CFG_PAR_LENGTH );
                    901:                     strncpy( romfile, cfgptr->KickstartName, CFG_ROM_LENGTH );
                    902:                     strncpy( keyfile, cfgptr->KeyFileName, CFG_KEY_LENGTH );
                    903: 
                    904:                     for( i = 0; i < NUM_DRIVES; i++ )
                    905:                     {
                    906:                         memcpy( &drives[i], &(cfgptr->drives[i]), sizeof( drive_specs ) );
                    907:                     }
                    908: 
                    909:                     for( i = 0; i < NUM_DRIVES; i++ )
                    910:                     {
                    911:                         memcpy( currprefs.df[i], cfgptr->df[i], 256 );
                    912:                     }
                    913: 
                    914:                     // Now, re-init the pages to have the right visual state...  not done when a page is viewed
                    915:                     // Only needs to be sent to those pages which have been viewed so far.
                    916:                     for( i = 0; i < C_PAGES; i++ )
                    917:                     {
                    918:                         if( pages[i] != NULL )
                    919:                             SendMessage( pages[i], WM_USER, 0, 0 );
                    920:                     }
                    921:                 }
                    922:             }
                    923:             break;
                    924: 
                    925:         case 2: // we're doing a delete...
                    926:             GetDlgItemText( hDlg, IDC_EDITNAME, cfgptr->Name, MAX_PATH );
                    927:             if( cfgptr->Name[0] == '\0' )
                    928:             {
                    929:                 MessageBox( hDlg, "You must select a configuration to delete...", "Delete Error", MB_OK | MB_ICONERROR | MB_APPLMODAL | MB_SETFOREGROUND );
                    930:             }
                    931:             else
                    932:             {
                    933:                 ConfigurationFile( hDlg, cfgptr, flag );
                    934:             }
                    935:             break;
                    936: 
                    937:         case 3: // we're doing an import...
                    938:         default:
                    939:             ConfigurationFile( hDlg, cfgptr, flag );
                    940:             break;
                    941:         }
                    942:         FreeConfigStruct( cfgptr );
                    943:     }
                    944: }
                    945: 
                    946: void InitializeListView( HWND hDlg )
                    947: {
                    948: #define NUM_COLUMNS 2
                    949:     HANDLE file_handle = NULL;
                    950:     WIN32_FIND_DATA find_data;
                    951:     BOOL rc = TRUE;
                    952:     HWND list;
                    953:     LV_ITEM lvstruct;
                    954:     LV_COLUMN lvcolumn;
                    955:     RECT rect;
                    956:     char *column_heading[ NUM_COLUMNS ] = { "Name", "Description" };
                    957:     int width = 0, column_width[ NUM_COLUMNS ] = { 0, 0 };
                    958:     int items = 0, result = 0, i, entry = 0, temp = 0;
                    959:     ConfigStructPtr config = NULL;
                    960: 
                    961:     list = GetDlgItem( hDlg, IDC_CONFIGLIST );
                    962:     ListView_DeleteAllItems( list );
                    963: 
                    964:     for( i = 0; i < NUM_COLUMNS; i++ )
                    965:         column_width[i] = ListView_GetStringWidth( list, column_heading[i] ) + 15;
                    966: 
                    967:     // If there are no columns, then insert some
                    968:     lvcolumn.mask = LVCF_WIDTH;
                    969:     if( ListView_GetColumn( list, 1, &lvcolumn ) == FALSE )
                    970:     {
                    971:         for( i = 0; i < NUM_COLUMNS; i++ )
                    972:         {
                    973:             lvcolumn.mask     = LVCF_FMT | LVCF_TEXT | LVCF_WIDTH | LVCF_SUBITEM;
                    974:             lvcolumn.iSubItem = i;
                    975:             lvcolumn.fmt      = LVCFMT_CENTER;
                    976:             lvcolumn.pszText  = column_heading[i];
                    977:             lvcolumn.cx       = column_width[i];
                    978:             ListView_InsertColumn( list, i, &lvcolumn );
                    979:         }
                    980:     }
                    981:     if( config = GetFirstConfigEntry( &file_handle, &find_data ) )
                    982:     {
                    983:         do
                    984:         {
                    985:             lvstruct.mask     = LVIF_TEXT | LVIF_PARAM;
                    986:             lvstruct.pszText  = config->Name;
                    987:             lvstruct.lParam   = 0;
                    988:             lvstruct.iItem    = entry;
                    989:             lvstruct.iSubItem = 0;
                    990:             result = ListView_InsertItem( list, &lvstruct );
                    991:             if( result != -1 )
                    992:             {
                    993:                 width = ListView_GetStringWidth( list, lvstruct.pszText ) + 15;
                    994:                 if( width > column_width[ lvstruct.iSubItem ] )
                    995:                     column_width[ lvstruct.iSubItem ] = width;
                    996: 
                    997:                 ListView_SetItemText( list, result, 1, config->Description );
                    998:                 width = ListView_GetStringWidth( list, config->Description ) + 15;
                    999:                 if( width > column_width[ 1 ] )
                   1000:                     column_width[ 1 ] = width;
                   1001: 
                   1002:                 entry++;
                   1003:             }
                   1004:             FreeConfigStruct( config );
                   1005:         }
                   1006:         while( config = GetNextConfigEntry( &file_handle, &find_data ) );
                   1007:     }
                   1008:     if( rc == FALSE )
                   1009:     {
                   1010:         FreeConfigStruct( config );
                   1011:     }
                   1012: 
                   1013:     if( result != -1 )
                   1014:     {
                   1015:         if( GetWindowRect( list, &rect ) )
                   1016:         {
                   1017:             ScreenToClient( hDlg, (LPPOINT)&rect );
                   1018:             ScreenToClient( hDlg, (LPPOINT)&rect.right );
                   1019:             if( ( temp = rect.right - rect.left - column_width[ 0 ] - 4 ) > column_width[1] )
                   1020:                 column_width[1] = temp;
                   1021:         }
                   1022: 
                   1023:         // Adjust our column widths so that we can see the contents...
                   1024:         for( i = 0; i < NUM_COLUMNS; i++ )
                   1025:         {
                   1026:             ListView_SetColumnWidth( list, i, column_width[i] );
                   1027:         }
                   1028: 
                   1029:         // Redraw the items in the list...
                   1030:         items = ListView_GetItemCount( list );
                   1031:         ListView_RedrawItems( list, 0, items );
                   1032:     }
                   1033: }
                   1034: 
                   1035: BOOL CALLBACK LoadSaveDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                   1036: {
                   1037: #define NUM_COLUMNS 2
                   1038:     char name_buf[ MAX_PATH ] = "", desc_buf[ 128 ] = "";
                   1039:     int found = 0;
                   1040:     BOOL rc = TRUE;
                   1041:     RECT rect;
                   1042:     DWORD pos;
                   1043:     POINT point;
                   1044:     HWND list;
                   1045:     UINT flag, dblclick = 0;
                   1046:     NM_LISTVIEW *nmlistview;
                   1047:     int items = 0, result = 0, entry = 0;
                   1048:     ConfigStructPtr config = NULL;
                   1049: 
                   1050:     switch(msg)
                   1051:     {
                   1052:         case WM_INITDIALOG:
                   1053:             InitializeListView( hDlg );
                   1054:             if( hEmuThread )
                   1055:             {
                   1056:                 EnableWindow( GetDlgItem( hDlg, IDC_SAVE ), FALSE );
                   1057:                 EnableWindow( GetDlgItem( hDlg, IDC_IMPORT ), FALSE );
                   1058:             }
                   1059:             return(TRUE);
                   1060:             break;
                   1061: 
                   1062:         case WM_COMMAND:
                   1063:             switch( wParam )
                   1064:             {
                   1065:             case IDC_SAVE:
                   1066:                 TransferConfiguration( hDlg, 0 );
                   1067:                 InitializeListView( hDlg );
                   1068:                 break;
                   1069:             case IDC_LOAD:
                   1070:                 TransferConfiguration( hDlg, 1 );
                   1071:                 break;
                   1072:             case IDC_DELETE:
                   1073:                 TransferConfiguration( hDlg, 2 );
                   1074:                 InitializeListView( hDlg );
                   1075:                 break;
                   1076:             case IDC_IMPORT:
                   1077:                 TransferConfiguration( hDlg, 3 );
                   1078:                 break;
                   1079:             }
                   1080:             break;
                   1081:         case WM_NOTIFY:
                   1082:             if( ((LPNMHDR)lParam)->idFrom == IDC_CONFIGLIST )
                   1083:             {
                   1084:                 nmlistview = (NM_LISTVIEW *)lParam;
                   1085:                 list = nmlistview->hdr.hwndFrom;
                   1086: 
                   1087:                 switch( nmlistview->hdr.code )
                   1088:                 {
                   1089:                 case NM_DBLCLK:
                   1090:                     dblclick = 1;
                   1091:                     // fall-through
                   1092:                 case NM_CLICK:
                   1093:                     pos = GetMessagePos();
                   1094:                     point.x = LOWORD( pos );
                   1095:                     point.y = HIWORD( pos );
                   1096:                     ScreenToClient( list, &point );
                   1097:                     entry = ListView_GetTopIndex( list );
                   1098:                     items = entry + ListView_GetCountPerPage( list );
                   1099:                     if( items > ListView_GetItemCount( list ) )
                   1100:                         items = ListView_GetItemCount( list );
                   1101: 
                   1102:                     while( entry <= items )
                   1103:                     {
                   1104:                         // Get the bounding rectangle of an item. If the mouse
                   1105:                         // location is within the bounding rectangle of the item,
                   1106:                         // you know you have found the item that was being clicked.
                   1107:                         ListView_GetItemRect( list, entry, &rect, LVIR_BOUNDS);
                   1108:                         if( PtInRect( &rect, point ) )
                   1109:                         {
                   1110:                             flag = LVIS_SELECTED | LVIS_FOCUSED;
                   1111:                             ListView_SetItemState( list, entry, flag, flag);
                   1112:                             found = 1;
                   1113:                             break;
                   1114:                         }
                   1115: 
                   1116:                         // Get the next item in listview control.
                   1117:                         entry++;
                   1118:                     }
                   1119: 
                   1120:                     // Copy the item's name and description to the gadgets at the bottom...
                   1121:                     if( entry >= 0 && found)
                   1122:                     {
                   1123:                         ListView_GetItemText( list, entry, 0, name_buf, MAX_PATH );
                   1124:                         ListView_GetItemText( list, entry, 1, desc_buf, 128 );
                   1125:                         SetDlgItemText( hDlg, IDC_EDITNAME, name_buf );
                   1126:                         SetDlgItemText( hDlg, IDC_EDITDESCRIPTION, desc_buf );
                   1127:                         ListView_RedrawItems( list, 0, items );
                   1128: 
                   1129:                         if( dblclick )
                   1130:                         {
                   1131:                             // do the config-loading
                   1132:                             TransferConfiguration( hDlg, 1 );
                   1133: 
                   1134:                             // start the emulation...
                   1135:                         }
                   1136:                     }
                   1137:                     break;
                   1138:                 }
                   1139:             }
                   1140:             else
                   1141:             {
                   1142:                 switch(((NMHDR *)lParam)->code)
                   1143:                 {
                   1144:                     case PSN_RESET:
                   1145:                         if(allow_quit_from_property_sheet)
                   1146:                         {
                   1147:                             quit_program = 1;
                   1148:                             regs.spcflags |= SPCFLAG_BRK;
                   1149:                         }
                   1150:                         break;
                   1151:                 }
                   1152:             }
                   1153:             break;
                   1154:     }
                   1155: 
                   1156:     return(FALSE);
                   1157: }
                   1158: 
                   1159: int CALLBACK ContributorsProc( HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam )
                   1160: {
                   1161:     CHARFORMAT CharFormat;
                   1162: 
                   1163:     switch( msg )
                   1164:     {
                   1165:     case WM_COMMAND:
                   1166:         if( wParam == IDC_GREATWORK )
                   1167:         {
                   1168:             EndDialog( hDlg, 1 );
                   1169:             return TRUE;
                   1170:         }
                   1171:         break;
                   1172:     case WM_INITDIALOG:
                   1173:         CharFormat.cbSize = sizeof( CharFormat );
                   1174: 
                   1175:         SetDlgItemText( hDlg, IDC_CONTRIBUTORS, 
                   1176:             "Bernd Schmidt - The Grand-Master\n"
                   1177:             "Mathias Ortmann - WinUAE Main Guy\n"
                   1178:             "Brian King - Picasso96 Support, Integrated GUI for WinUAE, AHI (Working on it)\n"
                   1179:             "Gustavo Goedert/Peter Remmers/Michael Sontheimer/Tomi Hakala/Tim Gunn/Nemo Pohle - DOS Port Stuff\n"
                   1180:             "Samuel Devulder/Olaf Barthel - Amiga Port\n"
                   1181:             "Krister Bergman - XFree86 and OS/2 Port\n"
                   1182:             "A. Blanchard/Ernesto Corvi - MacOS Port\n"
                   1183:             "Christian Bauer - BeOS Port\n"
                   1184:             "Ian Stephenson - NextStep Port\n"
                   1185:             "Peter Teichmann - Acorn/RiscOS Port\n"
                   1186:             "Stefan Reinauer - ZorroII/III AutoConfig, Serial Support\n"
                   1187:             "Christian Schmitt/Chris Hames - Serial Support\n"
                   1188:             "Herman ten Brugge - 68020/68881 Emulation Code\n"
                   1189:             "Tauno Taipaleenmaki - Various UAE-Control/UAE-Library Support\n"
                   1190:             "Brett Eden/Tim Gunn/Paolo Besser/Nemo Pohle - Various Docs and Web-Sites\n"
                   1191:             "Special thanks to Alexander Kneer and Tobias Abt (The Picasso96 Team)"
                   1192:             );
                   1193:         SendDlgItemMessage(hDlg, IDC_CONTRIBUTORS, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
                   1194:         CharFormat.dwMask |= CFM_SIZE | CFM_FACE;
                   1195:         CharFormat.yHeight = 10*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
                   1196:         strcpy( CharFormat.szFaceName, "Times New Roman" );
                   1197:         SendDlgItemMessage(hDlg, IDC_CONTRIBUTORS, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
                   1198:         //SendDlgItemMessage(hDlg, IDC_CONTRIBUTORS, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
                   1199: 
                   1200:         return TRUE;
                   1201:         break;
                   1202:     }
                   1203:     return FALSE;
                   1204: }
                   1205: 
                   1206: void DisplayContributors( HWND hDlg )
                   1207: {
                   1208:     DialogBox( hInst, MAKEINTRESOURCE( IDD_CONTRIBUTORS ), hDlg, ContributorsProc );
                   1209: }
                   1210: 
                   1211: BOOL CALLBACK AboutDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                   1212: {
                   1213:     POINT point;
                   1214:     RECT rect;
                   1215:     CHARFORMAT CharFormat;
                   1216:     switch(msg)
                   1217:     {
                   1218:         case WM_INITDIALOG:
                   1219:             CharFormat.cbSize = sizeof( CharFormat );
                   1220: 
                   1221:             SetDlgItemText( hDlg, IDC_RICHEDIT1, "UAE for Win32/DirectX" );
                   1222:             SendDlgItemMessage(hDlg, IDC_RICHEDIT1, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
                   1223:             CharFormat.dwMask |= CFM_BOLD | CFM_SIZE | CFM_FACE;
                   1224:             CharFormat.dwEffects = CFE_BOLD;
                   1225:             CharFormat.yHeight = 18*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
                   1226:             strcpy( CharFormat.szFaceName, "Times New Roman" );
                   1227:             SendDlgItemMessage(hDlg, IDC_RICHEDIT1, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
                   1228:             SendDlgItemMessage(hDlg, IDC_RICHEDIT1, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
                   1229: 
                   1230:             SetDlgItemText( hDlg, IDC_RICHEDIT2, PROGNAME );
                   1231:             SendDlgItemMessage(hDlg, IDC_RICHEDIT2, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
                   1232:             CharFormat.dwMask |= CFM_SIZE | CFM_FACE;
                   1233:             CharFormat.yHeight = 10*20;
                   1234:             strcpy( CharFormat.szFaceName, "Times New Roman" );
                   1235:             SendDlgItemMessage(hDlg, IDC_RICHEDIT2, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
                   1236:             SendDlgItemMessage(hDlg, IDC_RICHEDIT2, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
                   1237: 
                   1238:             SetDlgItemText( hDlg, IDC_AMIGAHOME, "Amiga" );
                   1239:             SendDlgItemMessage(hDlg, IDC_AMIGAHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
                   1240:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
                   1241:             CharFormat.dwEffects = CFE_UNDERLINE;
                   1242:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
                   1243:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
                   1244:             strcpy( CharFormat.szFaceName, "Times New Roman" );
                   1245:             SendDlgItemMessage(hDlg, IDC_AMIGAHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
                   1246:             SendDlgItemMessage(hDlg, IDC_AMIGAHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
                   1247: 
                   1248:             SetDlgItemText( hDlg, IDC_CLOANTOHOME, "Cloanto" );
                   1249:             SendDlgItemMessage(hDlg, IDC_CLOANTOHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
                   1250:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
                   1251:             CharFormat.dwEffects = CFE_UNDERLINE;
                   1252:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
                   1253:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
                   1254:             strcpy( CharFormat.szFaceName, "Times New Roman" );
                   1255:             SendDlgItemMessage(hDlg, IDC_CLOANTOHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
                   1256:             SendDlgItemMessage(hDlg, IDC_CLOANTOHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
                   1257: 
                   1258:             SetDlgItemText( hDlg, IDC_WINUAEHOME, "WinUAE" );
                   1259:             SendDlgItemMessage(hDlg, IDC_WINUAEHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
                   1260:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
                   1261:             CharFormat.dwEffects = CFE_UNDERLINE;
                   1262:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
                   1263:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
                   1264:             strcpy( CharFormat.szFaceName, "Times New Roman" );
                   1265:             SendDlgItemMessage(hDlg, IDC_WINUAEHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
                   1266:             SendDlgItemMessage(hDlg, IDC_WINUAEHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
                   1267: 
                   1268:             SetDlgItemText( hDlg, IDC_UAEHOME, "UAE" );
                   1269:             SendDlgItemMessage(hDlg, IDC_UAEHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
                   1270:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
                   1271:             CharFormat.dwEffects = CFE_UNDERLINE;
                   1272:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
                   1273:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
                   1274:             strcpy( CharFormat.szFaceName, "Times New Roman" );
                   1275:             SendDlgItemMessage(hDlg, IDC_UAEHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
                   1276:             SendDlgItemMessage(hDlg, IDC_UAEHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
                   1277: 
                   1278:             SetDlgItemText( hDlg, IDC_PICASSOHOME, "Picasso96" );
                   1279:             SendDlgItemMessage(hDlg, IDC_PICASSOHOME, EM_GETCHARFORMAT,0,(LPARAM)&CharFormat);
                   1280:             CharFormat.dwMask |= CFM_UNDERLINE | CFM_SIZE | CFM_FACE | CFM_COLOR;
                   1281:             CharFormat.dwEffects = CFE_UNDERLINE;
                   1282:             CharFormat.yHeight = 12*20; // height in twips, where a twip is 1/20th of a point - for a pt.size of 18
                   1283:             CharFormat.crTextColor = GetSysColor( COLOR_ACTIVECAPTION );
                   1284:             strcpy( CharFormat.szFaceName, "Times New Roman" );
                   1285:             SendDlgItemMessage(hDlg, IDC_PICASSOHOME, EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&CharFormat);
                   1286:             SendDlgItemMessage(hDlg, IDC_PICASSOHOME, EM_SETBKGNDCOLOR,0,GetSysColor( COLOR_3DFACE ) );
                   1287:             break;
                   1288: 
                   1289:         case WM_COMMAND:
                   1290:             if( wParam == IDC_CONTRIBUTORS )
                   1291:             {
                   1292:                 DisplayContributors( hDlg );
                   1293:             }
                   1294:             break;
                   1295:         case WM_LBUTTONDOWN:
                   1296:             point.x = LOWORD( lParam );
                   1297:             point.y = HIWORD( lParam );
                   1298:             GetWindowRect( GetDlgItem( hDlg, IDC_CLOANTOHOME ), &rect );
                   1299:             ScreenToClient( hDlg, (POINT *)&rect );
                   1300:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
                   1301:             if( PtInRect( &rect, point ) )
                   1302:             {
                   1303:                 ShellExecute( NULL, NULL, "http://www.cloanto.com/amiga/forever", NULL, NULL, SW_SHOWNORMAL );
                   1304:                 break;
                   1305:             }
                   1306:             
                   1307:             GetWindowRect( GetDlgItem( hDlg, IDC_AMIGAHOME ), &rect );
                   1308:             ScreenToClient( hDlg, (POINT *)&rect );
                   1309:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
                   1310:             if( PtInRect( &rect, point ) )
                   1311:             {
                   1312:                 ShellExecute( NULL, NULL, "http://www.amiga.de", NULL, NULL, SW_SHOWNORMAL );
                   1313:                 break;
                   1314:             }
                   1315: 
                   1316:             GetWindowRect( GetDlgItem( hDlg, IDC_PICASSOHOME ), &rect );
                   1317:             ScreenToClient( hDlg, (POINT *)&rect );
                   1318:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
                   1319:             if( PtInRect( &rect, point ) )
                   1320:             {
                   1321:                 ShellExecute( NULL, NULL, "http://www.villagetronic.com/amiga/support/ftp96.html", NULL, NULL, SW_SHOWNORMAL );
                   1322:                 break;
                   1323:             }
                   1324:             
                   1325:             GetWindowRect( GetDlgItem( hDlg, IDC_UAEHOME ), &rect );
                   1326:             ScreenToClient( hDlg, (POINT *)&rect );
                   1327:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
                   1328:             if( PtInRect( &rect, point ) )
                   1329:             {
                   1330:                 ShellExecute( NULL, NULL, "http://www.freiburg.linux.de/~uae/", NULL, NULL, SW_SHOWNORMAL );
                   1331:                 break;
                   1332:             }
                   1333: 
                   1334:             GetWindowRect( GetDlgItem( hDlg, IDC_WINUAEHOME ), &rect );
                   1335:             ScreenToClient( hDlg, (POINT *)&rect );
                   1336:             ScreenToClient( hDlg, (POINT *)&(rect.right) );
                   1337:             if( PtInRect( &rect, point ) )
                   1338:             {
                   1339:                 ShellExecute( NULL, NULL, "http://www.informatik.tu-muenchen.de/~ortmann/uae/", NULL, NULL, SW_SHOWNORMAL );
                   1340:                 break;
                   1341:             }
                   1342: 
                   1343:             break;
                   1344:         case WM_NOTIFY:
                   1345:             switch(((NMHDR *)lParam)->code)
                   1346:             {
                   1347:             case PSN_RESET:
                   1348:                 if(allow_quit_from_property_sheet)
                   1349:                 {
                   1350:                     quit_program = 1;
                   1351:                     regs.spcflags |= SPCFLAG_BRK;
                   1352:                 }
                   1353:                 break;
                   1354:             }
                   1355:             break;
                   1356:     }
                   1357: 
                   1358:     return(FALSE);
                   1359: }
                   1360: 
                   1361: // Handle messages for the Display Settings page of our property-sheet
                   1362: BOOL CALLBACK DisplayDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                   1363: {
                   1364:     int i, item_height;
                   1365:     RECT rect;
                   1366:     LONG posn;
                   1367:     ConfigStructPtr cfgptr;
                   1368: 
                   1369:     switch(msg)
                   1370:     {
                   1371:         case PSM_QUERYSIBLINGS:
                   1372:             cfgptr = (ConfigStructPtr)lParam;
                   1373:             cfgptr->FrameRate     = SendDlgItemMessage(hDlg,IDC_FRAMERATE,TBM_GETPOS,0,0);
                   1374:             cfgptr->LineDouble    = IsDlgButtonChecked(hDlg, IDC_LINEDBL);
                   1375:             cfgptr->FullScreen    = IsDlgButtonChecked( hDlg, IDC_FULLSCREEN );
                   1376:             cfgptr->CorrectAspect = IsDlgButtonChecked(hDlg, IDC_ASPECT);
                   1377:             cfgptr->CenterY       = IsDlgButtonChecked(hDlg, IDC_YCENTER);
                   1378:             cfgptr->CenterX       = IsDlgButtonChecked(hDlg, IDC_XCENTER);
                   1379:             cfgptr->Blit32        = IsDlgButtonChecked(hDlg, IDC_BLIT32);
                   1380:             cfgptr->BlitImmediate = IsDlgButtonChecked(hDlg, IDC_BLITIMM);
                   1381:             cfgptr->Lores         = IsDlgButtonChecked(hDlg, IDC_LORES);
                   1382:             cfgptr->CustomSize    = 0;
                   1383:             if( IsDlgButtonChecked( hDlg, IDC_CUSTOMSIZE ) && !cfgptr->FullScreen )
                   1384:             {
                   1385:                 cfgptr->ScreenWidth  = SendDlgItemMessage( hDlg, IDC_XSPIN, UDM_GETPOS, 0, 0 );
                   1386:                 cfgptr->ScreenHeight = SendDlgItemMessage( hDlg, IDC_YSPIN, UDM_GETPOS, 0, 0 );
                   1387:                 cfgptr->CustomSize = 1;
                   1388:             }
                   1389:             else if( ( posn = SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_GETCURSEL, 0, 0 ) ) != CB_ERR )
                   1390:             {
                   1391:                 posn = GetDisplayModeNumber( posn );
                   1392:                 cfgptr->ScreenWidth  = DisplayModes[posn].res.width;
                   1393:                 cfgptr->ScreenHeight = DisplayModes[posn].res.height;
                   1394:             }
                   1395:             else
                   1396:             {
                   1397:                 cfgptr->ScreenWidth  = currprefs.gfx_width;
                   1398:                 cfgptr->ScreenHeight = currprefs.gfx_height;
                   1399:             }
                   1400:             break;
                   1401: 
                   1402:         case WM_INITDIALOG:
                   1403:             pages[ DISPLAY_ID ] = hDlg;
                   1404:         case WM_USER:
                   1405:             SendDlgItemMessage(hDlg, IDC_FRAMERATE, TBM_SETRANGE,TRUE,MAKELONG(MIN_REFRESH_RATE,MAX_REFRESH_RATE));
                   1406:             SendDlgItemMessage(hDlg,IDC_FRAMERATE,TBM_SETPOS,TRUE,currprefs.framerate);
                   1407:             SendDlgItemMessage( hDlg, IDC_FRAMERATE, TBM_SETPAGESIZE, 0, 1 );
                   1408:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_FRAMERATE) );
                   1409:             CheckDlgButton(hDlg, IDC_LINEDBL, currprefs.gfx_linedbl);
                   1410:             CheckDlgButton( hDlg, IDC_FULLSCREEN, amiga_fullscreen );
                   1411:             CheckDlgButton( hDlg, IDC_CUSTOMSIZE, customsize );
                   1412: 
                   1413:             if( pages[ STARTUP_ID ] && wParam == 1 )
                   1414:             {
                   1415:                 if( SendDlgItemMessage( pages[ STARTUP_ID ], IDC_P96MEM, TBM_GETPOS, 0, 0 ) > 0 )
                   1416:                 {
                   1417:                     CheckDlgButton( hDlg, IDC_FULLSCREEN, TRUE );
                   1418:                     EnableWindow( GetDlgItem( hDlg, IDC_FULLSCREEN ), FALSE );
                   1419:                 }
                   1420:                 else
                   1421:                 {
                   1422:                     EnableWindow( GetDlgItem( hDlg, IDC_FULLSCREEN ), TRUE );
                   1423:                 }
                   1424:             }
                   1425:             else
                   1426:             {
                   1427:                 if( gfxmem_size )
                   1428:                 {
                   1429:                     CheckDlgButton( hDlg, IDC_FULLSCREEN, TRUE );
                   1430:                     EnableWindow( GetDlgItem( hDlg, IDC_FULLSCREEN ), FALSE );
                   1431:                 }
                   1432:             }
                   1433: 
                   1434:             SendDlgItemMessage(hDlg,IDC_RESOLUTION,CB_RESETCONTENT,0,0);
                   1435:             for(i=0;i<mode_count;i++)
                   1436:             {
                   1437:                 if( DisplayModes[i].depth == 2 &&
                   1438:                     DisplayModes[i].res.width <= 800 &&
                   1439:                     DisplayModes[i].res.height <= 600 )
                   1440:                     SendDlgItemMessage(hDlg,IDC_RESOLUTION,CB_ADDSTRING,0,(LPARAM)(LPCTSTR)DisplayModes[i].name);
                   1441:             }
                   1442: 
                   1443:             SendDlgItemMessage( hDlg, IDC_XSPIN, UDM_SETRANGE, 0, MAKELONG( 800, 320 ) );
                   1444:             SendDlgItemMessage( hDlg, IDC_XSPIN, UDM_SETPOS, TRUE, currprefs.gfx_width );
                   1445:             SendDlgItemMessage( hDlg, IDC_YSPIN, UDM_SETRANGE, 0, MAKELONG( 600, 200 ) );
                   1446:             SendDlgItemMessage( hDlg, IDC_YSPIN, UDM_SETPOS, TRUE, currprefs.gfx_height );
                   1447: 
                   1448:             CheckDlgButton( hDlg, IDC_CUSTOMSIZE, customsize );
                   1449: 
                   1450:             if( !amiga_fullscreen )
                   1451:             {
                   1452:                 EnableWindow( GetDlgItem( hDlg, IDC_CUSTOMSIZE ), TRUE );
                   1453:                 EnableWindow( GetDlgItem( hDlg, IDC_XSPIN ), TRUE );
                   1454:                 EnableWindow( GetDlgItem( hDlg, IDC_YSPIN ), TRUE );
                   1455:                 SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_SETCURSEL, GetDisplayModeLogicalNumber( 800, 600 ), 0 );
                   1456:             }
                   1457:             else
                   1458:             {
                   1459:                 EnableWindow( GetDlgItem( hDlg, IDC_CUSTOMSIZE ), FALSE );
                   1460:                 EnableWindow( GetDlgItem( hDlg, IDC_XSPIN ), FALSE );
                   1461:                 EnableWindow( GetDlgItem( hDlg, IDC_YSPIN ), FALSE );
                   1462:                 SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_SETCURSEL, GetDisplayModeLogicalNumber( currprefs.gfx_width, currprefs.gfx_height ), 0 );
                   1463:             }
                   1464: 
                   1465:             // Retrieve the height, in pixels, of a list item.
                   1466:             item_height = SendDlgItemMessage(hDlg,IDC_RESOLUTION,CB_GETITEMHEIGHT,0,0);
                   1467:             if( item_height != CB_ERR )
                   1468:             {
                   1469:                 // Get actual box position and size
                   1470:                 GetWindowRect( GetDlgItem(hDlg,IDC_RESOLUTION), &rect);
                   1471:                 rect.bottom = rect.top + item_height*mode_count + SendDlgItemMessage(hDlg,IDC_RESOLUTION,CB_GETITEMHEIGHT,(WPARAM)-1,0) + item_height;
                   1472:                 SetWindowPos( GetDlgItem(hDlg,IDC_RESOLUTION), 0, 0, 0, rect.right - rect.left, rect.bottom - rect.top, SWP_NOMOVE|SWP_NOZORDER);
                   1473:             }
                   1474: 
                   1475:             CheckDlgButton(hDlg, IDC_ASPECT, currprefs.gfx_correct_aspect);
                   1476:             CheckDlgButton(hDlg, IDC_YCENTER, currprefs.gfx_ycenter);
                   1477:             CheckDlgButton(hDlg, IDC_XCENTER, currprefs.gfx_xcenter);
                   1478:             CheckDlgButton(hDlg, IDC_BLIT32, currprefs.blits_32bit_enabled);
                   1479:             CheckDlgButton(hDlg, IDC_BLITIMM, currprefs.immediate_blits);
                   1480:             CheckDlgButton(hDlg, IDC_LORES, currprefs.gfx_lores);
                   1481:             if(hEmuThread)
                   1482:             {   // Disable certain controls which are only to be set once at start-up...
                   1483:                 EnableWindow(GetDlgItem(hDlg, IDC_LORES), FALSE);
                   1484:                 EnableWindow(GetDlgItem(hDlg, IDC_XCENTER), FALSE);
                   1485:                 EnableWindow(GetDlgItem(hDlg, IDC_YCENTER), FALSE);
                   1486:                 EnableWindow(GetDlgItem(hDlg, IDC_ASPECT), FALSE);
                   1487:                 EnableWindow(GetDlgItem(hDlg, IDC_LINEDBL), FALSE);
                   1488:                 EnableWindow(GetDlgItem(hDlg, IDC_RESOLUTION), FALSE);
                   1489:                 EnableWindow( GetDlgItem( hDlg, IDC_CUSTOMSIZE ), FALSE );
                   1490:                 EnableWindow( GetDlgItem( hDlg, IDC_XSPIN ), FALSE );
                   1491:                 EnableWindow( GetDlgItem( hDlg, IDC_YSPIN ), FALSE );
                   1492:                 EnableWindow( GetDlgItem( hDlg, IDC_XSIZE ), FALSE );
                   1493:                 EnableWindow( GetDlgItem( hDlg, IDC_YSIZE ), FALSE );
                   1494:             }
                   1495:             break;
                   1496:         case WM_HSCROLL:
                   1497:             UpdateScroller( hDlg, (HWND)lParam );
                   1498:             break;
                   1499:         case WM_COMMAND:
                   1500:             if( LOWORD(wParam) == IDC_FULLSCREEN )
                   1501:             {
                   1502:                 if( hEmuThread == NULL )
                   1503:                 {
                   1504:                     EnableWindow( GetDlgItem( hDlg, IDC_CUSTOMSIZE ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
                   1505:                     EnableWindow( GetDlgItem( hDlg, IDC_XSPIN ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
                   1506:                     EnableWindow( GetDlgItem( hDlg, IDC_YSPIN ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
                   1507:                     EnableWindow( GetDlgItem( hDlg, IDC_XSIZE ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
                   1508:                     EnableWindow( GetDlgItem( hDlg, IDC_YSIZE ), !IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) );
                   1509:                 }
                   1510:             }
                   1511:             break;
                   1512: 
                   1513:         case WM_NOTIFY:
                   1514:             switch(((NMHDR *)lParam)->code)
                   1515:             {
                   1516:                 case PSN_APPLY:
                   1517:                     if( amiga_fullscreen != IsDlgButtonChecked( hDlg, IDC_FULLSCREEN ) )
                   1518:                     {
                   1519:                         if( hEmuThread )
                   1520:                             new_fullscreen_flag = 1;
                   1521:                         else
                   1522:                             amiga_fullscreen = IsDlgButtonChecked( hDlg, IDC_FULLSCREEN );
                   1523:                     }
                   1524: 
                   1525:                     customsize = IsDlgButtonChecked( hDlg, IDC_CUSTOMSIZE );
                   1526:                     if( customsize && !amiga_fullscreen )
                   1527:                     {
                   1528:                         currprefs.gfx_width  = SendDlgItemMessage( hDlg, IDC_XSPIN, UDM_GETPOS, 0, 0 );
                   1529:                         currprefs.gfx_height = SendDlgItemMessage( hDlg, IDC_YSPIN, UDM_GETPOS, 0, 0 );
                   1530:                     }
                   1531:                     else if( ( posn = SendDlgItemMessage( hDlg, IDC_RESOLUTION, CB_GETCURSEL, 0, 0 ) ) != CB_ERR )
                   1532:                     {
                   1533:                         posn = GetDisplayModeNumber( posn );
                   1534:                         currprefs.gfx_width           = DisplayModes[posn].res.width;
                   1535:                         currprefs.gfx_height          = DisplayModes[posn].res.height;
                   1536:                     }
                   1537:                     currprefs.gfx_ycenter         = IsDlgButtonChecked(hDlg, IDC_YCENTER);
                   1538:                     currprefs.gfx_xcenter         = IsDlgButtonChecked(hDlg, IDC_XCENTER);
                   1539:                     currprefs.blits_32bit_enabled = IsDlgButtonChecked(hDlg, IDC_BLIT32);
                   1540:                     currprefs.immediate_blits     = IsDlgButtonChecked(hDlg, IDC_BLITIMM);
                   1541:                     currprefs.gfx_lores           = IsDlgButtonChecked(hDlg, IDC_LORES);
                   1542:                     currprefs.framerate           = SendDlgItemMessage(hDlg,IDC_FRAMERATE,TBM_GETPOS,0,0);
                   1543:                     currprefs.gfx_correct_aspect  = IsDlgButtonChecked(hDlg, IDC_ASPECT);
                   1544:                     currprefs.gfx_linedbl         = IsDlgButtonChecked(hDlg, IDC_LINEDBL);
                   1545:                     break;
                   1546: 
                   1547:                 case PSN_RESET:
                   1548:                     if(allow_quit_from_property_sheet)
                   1549:                     {
                   1550:                         quit_program = 1;
                   1551:                         regs.spcflags |= SPCFLAG_BRK;
                   1552:                     }
                   1553:                     break;
                   1554:             }
                   1555:     }
                   1556:     return(FALSE);
                   1557: }
                   1558: 
                   1559: BOOL CALLBACK StartupDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                   1560: {
                   1561:     ConfigStructPtr cfgptr;
                   1562:     LONG mem_size;
                   1563: 
                   1564:     switch(msg)
                   1565:     {
                   1566:         case PSM_QUERYSIBLINGS:
                   1567:             cfgptr = (ConfigStructPtr)lParam;
                   1568: 
                   1569:             CalculateRealMem( SendMessage(GetDlgItem(hDlg, IDC_CHIPMEM),TBM_GETPOS,0,0), &cfgptr->ChipMem, NULL, 0 );
                   1570:             CalculateRealMem( SendMessage(GetDlgItem(hDlg, IDC_FASTMEM),TBM_GETPOS,0,0), &cfgptr->FastMem, NULL, 1 );
                   1571: #if CPU_LEVEL > 1
                   1572:             CalculateRealMem( SendMessage(GetDlgItem(hDlg, IDC_P96MEM), TBM_GETPOS, 0, 0 ), &cfgptr->P96Mem, NULL, 2 );
                   1573:             CalculateRealMem( SendMessage(GetDlgItem(hDlg, IDC_Z3FASTMEM), TBM_GETPOS, 0, 0 ), &cfgptr->Z3Mem, NULL, 3 );
                   1574: #endif
                   1575:             GetDlgItemText( hDlg, IDC_ROMFILE, cfgptr->KickstartName, CFG_ROM_LENGTH );
                   1576:             GetDlgItemText( hDlg, IDC_KEYFILE, cfgptr->KeyFileName, CFG_KEY_LENGTH );
                   1577:             break;
                   1578: 
                   1579:         case WM_INITDIALOG:
                   1580:             pages[ STARTUP_ID ] = hDlg;
                   1581:         case WM_USER:
                   1582:             SetDlgItemText( hDlg, IDC_ROMFILE, romfile );
                   1583:             SetDlgItemText( hDlg, IDC_KEYFILE, keyfile );
                   1584:             SendDlgItemMessage(hDlg, IDC_CHIPMEM, TBM_SETRANGE,TRUE,MAKELONG(MIN_CHIP_MEM,MAX_CHIP_MEM));
                   1585:             SendDlgItemMessage(hDlg, IDC_FASTMEM, TBM_SETRANGE,TRUE,MAKELONG(MIN_FAST_MEM,MAX_FAST_MEM));
                   1586: #if CPU_LEVEL > 1
                   1587:             SendDlgItemMessage(hDlg, IDC_P96MEM, TBM_SETRANGE,TRUE,MAKELONG(MIN_P96_MEM,MAX_P96_MEM));
                   1588:             SendDlgItemMessage(hDlg, IDC_Z3FASTMEM, TBM_SETRANGE, TRUE,MAKELONG(MIN_Z3_MEM, MAX_Z3_MEM ));
                   1589: #else
                   1590:             EnableWindow( GetDlgItem( hDlg, IDC_P96MEM ), FALSE );
                   1591:             EnableWindow( GetDlgItem( hDlg, IDC_Z3FASTMEM ), FALSE );
                   1592: #endif
                   1593:             switch( chipmem_size )
                   1594:             {
                   1595:             case 0x00080000:
                   1596:                 mem_size = 0;
                   1597:                 break;
                   1598:             case 0x00100000:
                   1599:                 mem_size = 1;
                   1600:                 break;
                   1601:             case 0x00200000:
                   1602:                 mem_size = 2;
                   1603:                 break;
                   1604:             case 0x00400000:
                   1605:                 mem_size = 3;
                   1606:                 break;
                   1607:             case 0x00800000:
                   1608:                 mem_size = 4;
                   1609:                 break;
                   1610:             }
                   1611:             SendDlgItemMessage(hDlg, IDC_CHIPMEM, TBM_SETPOS, TRUE, mem_size );
                   1612: 
                   1613:             switch( fastmem_size )
                   1614:             {
                   1615:             case 0x00000000:
                   1616:                 mem_size = 0;
                   1617:                 break;
                   1618:             case 0x00100000:
                   1619:                 mem_size = 1;
                   1620:                 break;
                   1621:             case 0x00200000:
                   1622:                 mem_size = 2;
                   1623:                 break;
                   1624:             case 0x00400000:
                   1625:                 mem_size = 3;
                   1626:                 break;
                   1627:             case 0x00800000:
                   1628:                 mem_size = 4;
                   1629:                 break;
                   1630:             case 0x01000000:
                   1631:                 mem_size = 5;
                   1632:                 break;
                   1633:             }
                   1634:             SendDlgItemMessage(hDlg, IDC_FASTMEM, TBM_SETPOS, TRUE, mem_size );
                   1635: 
                   1636:             switch( gfxmem_size )
                   1637:             {
                   1638:             case 0x00000000:
                   1639:                 mem_size = 0;
                   1640:                 break;
                   1641:             case 0x00100000:
                   1642:                 mem_size = 1;
                   1643:                 break;
                   1644:             case 0x00200000:
                   1645:                 mem_size = 2;
                   1646:                 break;
                   1647:             case 0x00400000:
                   1648:                 mem_size = 3;
                   1649:                 break;
                   1650:             case 0x00800000:
                   1651:                 mem_size = 4;
                   1652:                 break;
                   1653:             }
                   1654:             SendDlgItemMessage(hDlg, IDC_P96MEM, TBM_SETPOS, TRUE, mem_size );
                   1655: #if CPU_LEVEL > 1
                   1656:             switch( z3fastmem_size )
                   1657:             {
                   1658:             case 0x00000000:
                   1659:                 mem_size = 0;
                   1660:                 break;
                   1661:             case 0x00100000:
                   1662:                 mem_size = 1;
                   1663:                 break;
                   1664:             case 0x00200000:
                   1665:                 mem_size = 2;
                   1666:                 break;
                   1667:             case 0x00400000:
                   1668:                 mem_size = 3;
                   1669:                 break;
                   1670:             case 0x00800000:
                   1671:                 mem_size = 4;
                   1672:                 break;
                   1673:             case 0x01000000:
                   1674:                 mem_size = 5;
                   1675:                 break;
                   1676:             case 0x02000000:
                   1677:                 mem_size = 6;
                   1678:                 break;
                   1679:             }
                   1680:             SendDlgItemMessage(hDlg, IDC_Z3FASTMEM, TBM_SETPOS, TRUE, mem_size );
                   1681:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_P96MEM));
                   1682:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_Z3FASTMEM));
                   1683: #endif
                   1684:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_CHIPMEM));
                   1685:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_FASTMEM));
                   1686: 
                   1687:             return(TRUE);
                   1688: 
                   1689:     case WM_COMMAND:
                   1690:         switch( wParam )
                   1691:         {
                   1692:         case IDC_KICKCHOOSER:
                   1693:             KickStuffSelection( hDlg, 1 );
                   1694:             break;
                   1695:         case IDC_KEYCHOOSER:
                   1696:             KickStuffSelection( hDlg, 0 );
                   1697:             break;
                   1698:         }
                   1699:         break;
                   1700: 
                   1701:     case WM_HSCROLL:
                   1702:         UpdateScroller(hDlg, (HWND)lParam);
                   1703: #if CPU_LEVEL > 1
                   1704:         if( ( GetDlgItem( hDlg, IDC_P96MEM) == lParam ) && pages[ DISPLAY_ID ] )
                   1705:         {
                   1706:             SendMessage( pages[ DISPLAY_ID ], WM_USER, 1, 0 );
                   1707:         }
                   1708: #endif
                   1709:         break;
                   1710: 
                   1711:     case WM_NOTIFY:
                   1712:         switch(((NMHDR *)lParam)->code)
                   1713:         {
                   1714:             case PSN_APPLY:
                   1715:                 // OK or Apply has been pressed
                   1716:                 GetDlgItemText( hDlg, IDC_ROMFILE, romfile, CFG_ROM_LENGTH );
                   1717:                 GetDlgItemText( hDlg, IDC_KEYFILE, keyfile, CFG_KEY_LENGTH );
                   1718:                 break;
                   1719:             case PSN_RESET:
                   1720:                 if(allow_quit_from_property_sheet)
                   1721:                 {
                   1722:                     quit_program = 1;
                   1723:                     regs.spcflags |= SPCFLAG_BRK;
                   1724:                 }
                   1725:                 break;
                   1726:         }
                   1727:     }
                   1728:     return(FALSE);
                   1729: }
                   1730: 
                   1731: BOOL CALLBACK AdvancedDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                   1732: {
                   1733:     ConfigStructPtr cfgptr;
                   1734:     DWORD dwPos;
                   1735: 
                   1736:     switch(msg)
                   1737:     {
                   1738:         case PSM_QUERYSIBLINGS:
                   1739:             cfgptr = (ConfigStructPtr)lParam;
                   1740: 
                   1741:             cfgptr->NoAutoConfig         = IsDlgButtonChecked( hDlg, IDC_NOAUTOCONFIG );
                   1742:             cfgptr->CopperHack           = (int)(short)(SendDlgItemMessage( hDlg, IDC_COPPERSPIN, UDM_GETPOS, 0, 0 ));
                   1743:             cfgptr->DebugLogging         = IsDlgButtonChecked( hDlg, IDC_LOGGING );
                   1744:             cfgptr->InvalidAddresses     = IsDlgButtonChecked( hDlg, IDC_ILLEGAL);
                   1745: //            cfgptr->DebuggerEnabled      = IsDlgButtonChecked( hDlg, IDC_DEBUGGER );
                   1746: #if CPU_LEVEL > 1
                   1747:             cfgptr->AddressingIs24Bit    = IsDlgButtonChecked( hDlg, IDC_24BIT );
                   1748: #endif
                   1749:             cfgptr->M68KSpeed = (char)SendDlgItemMessage(hDlg, IDC_SPEED,TBM_GETPOS,0,0);
                   1750:             break;
                   1751: 
                   1752:         case WM_INITDIALOG:
                   1753:             pages[ ADVANCED_ID ] = hDlg;
                   1754:         case WM_USER:
                   1755: #if CPU_LEVEL > 1
                   1756:             CheckDlgButton( hDlg, IDC_24BIT, address_space_24 );
                   1757: #else
                   1758:             CheckDlgButton( hDlg, IDC_24BIT, TRUE );
                   1759:             EnableWindow( GetDlgItem( hDlg, IDC_24BIT ), FALSE );
                   1760: #endif
                   1761:             //CheckDlgButton( hDlg, IDC_DEBUGGER, use_debugger );
                   1762:             CheckDlgButton( hDlg, IDC_ILLEGAL, currprefs.illegal_mem );
                   1763:             CheckDlgButton( hDlg, IDC_NOAUTOCONFIG, !currprefs.automount_uaedev );
                   1764:             SendDlgItemMessage(hDlg, IDC_SPEED, TBM_SETRANGE, TRUE, MAKELONG(MIN_M68K_PRIORITY,MAX_M68K_PRIORITY));
                   1765:             SendDlgItemMessage(hDlg, IDC_SPEED, TBM_SETPOS, TRUE, currprefs.m68k_speed );
                   1766:             SendDlgItemMessage( hDlg, IDC_SPEED, TBM_SETPAGESIZE, 0, 1 );
                   1767:             UpdateScroller(hDlg, GetDlgItem(hDlg, IDC_SPEED));
                   1768:             SendDlgItemMessage( hDlg, IDC_COPPERSPIN, UDM_SETRANGE, 0, MAKELONG( 224, -1 ) );
                   1769:             SendDlgItemMessage( hDlg, IDC_COPPERSPIN, UDM_SETPOS, TRUE, currprefs.copper_pos );
                   1770: 
                   1771:             return(TRUE);
                   1772: 
                   1773:     case WM_HSCROLL:
                   1774:         UpdateScroller(hDlg, (HWND)lParam);
                   1775:         break;
                   1776: 
                   1777:     case WM_NOTIFY:
                   1778:         switch(((NMHDR *)lParam)->code)
                   1779:         {
                   1780:             case PSN_APPLY:
                   1781:                 // OK or Apply has been pressed
                   1782:                 currprefs.illegal_mem      = IsDlgButtonChecked( hDlg, IDC_ILLEGAL);
                   1783:                 currprefs.automount_uaedev = !IsDlgButtonChecked( hDlg, IDC_NOAUTOCONFIG );
                   1784:                 currprefs.m68k_speed       = SendMessage( GetDlgItem( hDlg, IDC_SPEED),TBM_GETPOS,0,0);
                   1785:                 currprefs.copper_pos       = (int)(short)( SendDlgItemMessage( hDlg, IDC_COPPERSPIN, UDM_GETPOS, 0, 0 ));
                   1786: #if CPU_LEVEL > 1
                   1787:                 address_space_24           = IsDlgButtonChecked( hDlg, IDC_24BIT );
                   1788: #endif
                   1789:                 break;
                   1790:             case PSN_RESET:
                   1791:                 if(allow_quit_from_property_sheet)
                   1792:                 {
                   1793:                     quit_program = 1;
                   1794:                     regs.spcflags |= SPCFLAG_BRK;
                   1795:                 }
                   1796:                 break;
                   1797:         }
                   1798:     }
                   1799:     return(FALSE);
                   1800: }
                   1801: 
                   1802: BOOL CALLBACK SoundDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                   1803: {
                   1804:     ConfigStructPtr cfgptr;
                   1805: 
                   1806:     switch(msg)
                   1807:     {
                   1808:     case PSM_QUERYSIBLINGS:
                   1809:         cfgptr = (ConfigStructPtr)lParam;
                   1810:         if( IsDlgButtonChecked( hDlg, IDC_8BIT ) )
                   1811:             cfgptr->SoundBits = 8;
                   1812:         if( IsDlgButtonChecked( hDlg, IDC_16BIT ) )
                   1813:             cfgptr->SoundBits = 16;
                   1814:         if( IsDlgButtonChecked( hDlg, IDC_11KHZ ) )
                   1815:             cfgptr->SoundFreq = 11025;
                   1816:         if( IsDlgButtonChecked( hDlg, IDC_22KHZ ) )
                   1817:             cfgptr->SoundFreq = 22050;
                   1818:         if( IsDlgButtonChecked( hDlg, IDC_44KHZ ) )
                   1819:             cfgptr->SoundFreq = 44100;
                   1820:         if( IsDlgButtonChecked( hDlg, IDC_48KHZ ) )
                   1821:             cfgptr->SoundFreq = 48000;
                   1822:         if( IsDlgButtonChecked( hDlg, IDC_SOUND0 ) )
                   1823:             cfgptr->SoundSupport = -1;
                   1824:         if( IsDlgButtonChecked( hDlg, IDC_SOUND1 ) )
                   1825:             cfgptr->SoundSupport = 0;
                   1826:         if( IsDlgButtonChecked( hDlg, IDC_SOUND2 ) )
                   1827:             cfgptr->SoundSupport = 1;
                   1828:         if( IsDlgButtonChecked( hDlg, IDC_SOUND3 ) )
                   1829:             cfgptr->SoundSupport = 2;
                   1830:         if( IsDlgButtonChecked( hDlg, IDC_SOUND4 ) )
                   1831:             cfgptr->SoundSupport = 3;
                   1832:         if( IsDlgButtonChecked( hDlg, IDC_STEREO ) )
                   1833:             cfgptr->SoundStereo = 1;
                   1834:         break;
                   1835: 
                   1836:     case WM_INITDIALOG:
                   1837:         pages[ SOUND_ID ] = hDlg;
                   1838:     case WM_USER:
                   1839:         UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_SOUND ) );
                   1840:         UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_FREQUENCY ) );
                   1841:         UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_SOUNDSIZE ) );
                   1842:         CheckDlgButton( hDlg, IDC_STEREO, currprefs.stereo );
                   1843:         return(TRUE);
                   1844: 
                   1845:     case WM_NOTIFY:
                   1846:         switch(((NMHDR *)lParam)->code)
                   1847:         {
                   1848:         case PSN_APPLY:
                   1849:             // OK or Apply has been pressed
                   1850:             if( IsDlgButtonChecked( hDlg, IDC_8BIT ) )
                   1851:                 currprefs.sound_bits = 8;
                   1852:             if( IsDlgButtonChecked( hDlg, IDC_16BIT ) )
                   1853:                 currprefs.sound_bits = 16;
                   1854:             if( IsDlgButtonChecked( hDlg, IDC_11KHZ ) )
                   1855:                 currprefs.sound_freq = 11025;
                   1856:             if( IsDlgButtonChecked( hDlg, IDC_22KHZ ) )
                   1857:                 currprefs.sound_freq = 22050;
                   1858:             if( IsDlgButtonChecked( hDlg, IDC_44KHZ ) )
                   1859:                 currprefs.sound_freq = 44100;
                   1860:             if( IsDlgButtonChecked( hDlg, IDC_48KHZ ) )
                   1861:                 currprefs.sound_freq = 48000;
                   1862:             if( IsDlgButtonChecked( hDlg, IDC_SOUND0 ) )
                   1863:                 currprefs.produce_sound = -1;
                   1864:             if( IsDlgButtonChecked( hDlg, IDC_SOUND1 ) )
                   1865:                 currprefs.produce_sound = 0;
                   1866:             if( IsDlgButtonChecked( hDlg, IDC_SOUND2 ) )
                   1867:                 currprefs.produce_sound = 1;
                   1868:             if( IsDlgButtonChecked( hDlg, IDC_SOUND3 ) )
                   1869:                 currprefs.produce_sound = 2;
                   1870:             if( IsDlgButtonChecked( hDlg, IDC_SOUND4 ) )
                   1871:                 currprefs.produce_sound = 3;
                   1872:             if( IsDlgButtonChecked( hDlg, IDC_STEREO ) )
                   1873:                 currprefs.stereo = 1;
                   1874:             break;
                   1875:         case PSN_RESET:
                   1876:             if(allow_quit_from_property_sheet)
                   1877:             {
                   1878:                 quit_program = 1;
                   1879:                 regs.spcflags |= SPCFLAG_BRK;
                   1880:             }
                   1881:             break;
                   1882:         }
                   1883:         break;
                   1884:     }
                   1885:     return(FALSE);
                   1886: }
                   1887: 
                   1888: void KickStuffSelection( HWND hDlg, int which )
                   1889: {
                   1890:     OPENFILENAME openFileName;
                   1891:     char full_path[MAX_PATH] = "";
                   1892:     char file_name[MAX_PATH] = "";
                   1893:     char init_path[MAX_PATH] = "";
                   1894:     char *amiga_path = NULL;
                   1895: 
                   1896:     if( amiga_path = getenv( "AmigaPath" ) )
                   1897:     {
                   1898:         strncpy( init_path, amiga_path, MAX_PATH );
                   1899:         strncat( init_path, "\\ROMs\\", MAX_PATH );
                   1900:     }
                   1901:     else if( start_path )
                   1902:     {
                   1903:         strncpy( init_path, start_path, MAX_PATH );
                   1904:         strncat( init_path, "..\\ROMs\\", MAX_PATH );
                   1905:     }
                   1906: 
                   1907:     openFileName.lStructSize       = sizeof(OPENFILENAME);
                   1908:     openFileName.hwndOwner         = hDlg;
                   1909:     openFileName.hInstance         = hInst;
                   1910:     if( which )
                   1911:     {
                   1912:         openFileName.lpstrFilter   = "Amiga Kickstart Files (*.ROM)\0*.ROM\0\0";
                   1913:         openFileName.lpstrTitle    = "Select an Amiga ROM file...";
                   1914:         openFileName.lpstrDefExt   = "ROM";
                   1915:     }
                   1916:     else
                   1917:     {
                   1918:         openFileName.lpstrFilter   = "Amiga Kickstart Key-Files (*.KEY)\0*.KEY\0\0";
                   1919:         openFileName.lpstrTitle    = "Select an Amiga Key-File...";
                   1920:         openFileName.lpstrDefExt   = "KEY";
                   1921:     }
                   1922:     openFileName.Flags             = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
                   1923:     openFileName.lpstrCustomFilter = NULL;
                   1924:     openFileName.nMaxCustFilter    = 0;
                   1925:     openFileName.nFilterIndex      = 0;
                   1926:     openFileName.lpstrFile         = full_path;
                   1927:     openFileName.nMaxFile          = MAX_PATH;
                   1928:     openFileName.lpstrFileTitle    = file_name;
                   1929:     openFileName.nMaxFileTitle     = MAX_PATH;
                   1930:     if( start_path )
                   1931:         openFileName.lpstrInitialDir   = init_path;
                   1932:     else
                   1933:         openFileName.lpstrInitialDir   = NULL;
                   1934:     openFileName.lpfnHook          = NULL;
                   1935:     openFileName.lpTemplateName    = NULL;
                   1936:     openFileName.lCustData         = 0;
                   1937:     if(GetOpenFileName(&openFileName)==FALSE)
                   1938:         MyOutputDebugString("GetOpenFileName() failed.\n");
                   1939:     else
                   1940:     {
                   1941:         if( which )
                   1942:             SetDlgItemText(hDlg,IDC_ROMFILE,full_path);
                   1943:         else
                   1944:             SetDlgItemText(hDlg,IDC_KEYFILE,full_path);
                   1945:     }
                   1946: }
                   1947: 
                   1948: void DiskSelection( HWND hDlg, WPARAM wParam, int flag )
                   1949: {
                   1950:     OPENFILENAME openFileName;
                   1951:     char full_path[MAX_PATH] = "";
                   1952:     char file_name[MAX_PATH] = "";
                   1953:     char init_path[MAX_PATH] = "";
                   1954:     BOOL result = FALSE;
                   1955:     char *amiga_path = NULL;
                   1956: 
                   1957:     if( amiga_path = getenv( "AmigaPath" ) )
                   1958:     {
                   1959:         strncpy( init_path, amiga_path, MAX_PATH );
                   1960:         strncat( init_path, "\\DiskFiles\\", MAX_PATH );
                   1961:     }
                   1962:     else if( start_path )
                   1963:     {
                   1964:         strncpy( init_path, start_path, MAX_PATH );
                   1965:         strncat( init_path, "..\\DiskFiles\\", MAX_PATH );
                   1966:     }
                   1967: 
                   1968:     openFileName.lStructSize       = sizeof(OPENFILENAME);
                   1969:     openFileName.hwndOwner         = hDlg;
                   1970:     openFileName.hInstance         = hInst;
                   1971:     openFileName.lpstrFilter       = "Amiga Disk Files (*.ADF;*.ADZ)\0*.ADF;*.ADZ\0";
                   1972:     if( flag )
                   1973:         openFileName.lpstrTitle    = "Choose your blank Amiga Disk File...";
                   1974:     else
                   1975:         openFileName.lpstrTitle    = "Select an Amiga Disk File image...";
                   1976:     openFileName.Flags             = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_LONGNAMES | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;
                   1977:     openFileName.lpstrDefExt       = "ADF";
                   1978:     openFileName.lpstrCustomFilter = NULL;
                   1979:     openFileName.nMaxCustFilter    = 0;
                   1980:     openFileName.nFilterIndex      = 0;
                   1981:     openFileName.lpstrFile         = full_path;
                   1982:     openFileName.nMaxFile          = MAX_PATH;
                   1983:     openFileName.lpstrFileTitle    = file_name;
                   1984:     openFileName.nMaxFileTitle     = MAX_PATH;
                   1985:     if( start_path )
                   1986:         openFileName.lpstrInitialDir   = init_path;
                   1987:     else
                   1988:         openFileName.lpstrInitialDir   = NULL;
                   1989:     openFileName.lpfnHook          = NULL;
                   1990:     openFileName.lpTemplateName    = NULL;
                   1991:     openFileName.lCustData         = 0;
                   1992:     if( flag )
                   1993:         result = GetSaveFileName( &openFileName );
                   1994:     else
                   1995:         result = GetOpenFileName( &openFileName );
                   1996: 
                   1997:     if( result == FALSE )
                   1998:         MyOutputDebugString("GetOpenFileName() failed.\n");
                   1999:     else
                   2000:     {
                   2001:         switch(wParam)
                   2002:         {
                   2003:         case IDC_DF0:
                   2004:             SetDlgItemText(hDlg,IDC_DF0TEXT,full_path);
                   2005:             break;
                   2006:         case IDC_DF1:
                   2007:             SetDlgItemText(hDlg,IDC_DF1TEXT,full_path);
                   2008:             break;
                   2009:         case IDC_DF2:
                   2010:             SetDlgItemText(hDlg,IDC_DF2TEXT,full_path);
                   2011:             break;
                   2012:         case IDC_DF3:
                   2013:             SetDlgItemText(hDlg,IDC_DF3TEXT,full_path);
                   2014:             break;
                   2015:         case IDC_CREATE:
                   2016:             CreateDiskFile( full_path );
                   2017:             break;
                   2018:         }
                   2019:     }
                   2020: }
                   2021: 
                   2022: void GetSetDriveValues( HWND hDlg, DWORD drive_id, BOOL set )
                   2023: {
                   2024:     int dlg_item1, dlg_item2, dlg_item3;
                   2025: 
                   2026:     switch(drive_id)
                   2027:     {
                   2028:     case 0:
                   2029:         dlg_item1 = IDC_UAE0PATH;
                   2030:         dlg_item2 = IDC_UAE0NAME;
                   2031:         dlg_item3 = IDC_RW0;
                   2032:         break;
                   2033:     case 1:
                   2034:         dlg_item1 = IDC_UAE1PATH;
                   2035:         dlg_item2 = IDC_UAE1NAME;
                   2036:         dlg_item3 = IDC_RW1;
                   2037:         break;
                   2038:     case 2:
                   2039:         dlg_item1 = IDC_UAE2PATH;
                   2040:         dlg_item2 = IDC_UAE2NAME;
                   2041:         dlg_item3 = IDC_RW2;
                   2042:         break;
                   2043:     case 3:
                   2044:         dlg_item1 = IDC_UAE3PATH;
                   2045:         dlg_item2 = IDC_UAE3NAME;
                   2046:         dlg_item3 = IDC_RW3;
                   2047:         break;
                   2048:     }
                   2049:     if(set)
                   2050:     {
                   2051:         GetDlgItemText(hDlg, dlg_item1, drives[drive_id].path, MAX_PATH);
                   2052:         GetDlgItemText(hDlg, dlg_item2, drives[drive_id].name, MAX_PATH);
                   2053:         drives[drive_id].rw = IsDlgButtonChecked(hDlg, dlg_item3);
                   2054:     }
                   2055:     else
                   2056:     {
                   2057:         SetDlgItemText(hDlg, dlg_item1, drives[drive_id].path);
                   2058:         SetDlgItemText(hDlg, dlg_item2, drives[drive_id].name);
                   2059:         CheckDlgButton(hDlg, dlg_item3, drives[drive_id].rw);
                   2060:     }
                   2061: }
                   2062: 
                   2063: void CreateDiskFile( char *name )
                   2064: {
                   2065:     HANDLE adf;
                   2066:     int i, file_size = 880 * 1024; // size in bytes
                   2067:     char *chunk = NULL;
                   2068:     DWORD count;
                   2069: 
                   2070:     SetCursor( LoadCursor( NULL, IDC_WAIT ) );
                   2071:     adf = CreateFile( name, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
                   2072:     if( adf != INVALID_HANDLE_VALUE )
                   2073:     {
                   2074:         if( chunk = malloc( 10240 ) )
                   2075:         {
                   2076:             for( i = 0; i < file_size; i += 10240 )
                   2077:             {
                   2078:                 WriteFile( adf, chunk, 10240, &count, NULL );
                   2079:             }
                   2080:         }
                   2081:         CloseHandle( adf );
                   2082:     }
                   2083:     SetCursor( LoadCursor( NULL, IDC_ARROW ) );
                   2084: }
                   2085: 
                   2086: long CreateHardFile( LONG hfsize )
                   2087: {
                   2088:     HANDLE hf;
                   2089:     long result = 0;
                   2090:     int i, file_size = hfsize * 1024 * 1024; // size in bytes
                   2091:     char init_path[MAX_PATH] = "";
                   2092:     char *chunk = NULL;
                   2093:     DWORD count;
                   2094: 
                   2095:     SetCursor( LoadCursor( NULL, IDC_WAIT ) );
                   2096: 
                   2097:     if( start_path )
                   2098:     {
                   2099:         strncpy( init_path, start_path, MAX_PATH );
                   2100:         strncat( init_path, "\\HardFile", MAX_PATH );
                   2101:     }
                   2102:     else
                   2103:         strcpy( init_path, "HardFile" );
                   2104: 
                   2105:     if( file_size == 0 )
                   2106:         DeleteFile( init_path );
                   2107:     else
                   2108:     {
                   2109:         hf = CreateFile( init_path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL );
                   2110:         if( hf != INVALID_HANDLE_VALUE )
                   2111:         {
                   2112:             if( chunk = malloc( 16384 ) )
                   2113:             {
                   2114:                 for( i = 0; i < file_size; i += 16384 )
                   2115:                 {
                   2116:                     WriteFile( hf, chunk, 16384, &count, NULL );
                   2117:                 }
                   2118:             }
                   2119:             CloseHandle( hf );
                   2120:             result = i;
                   2121:         }
                   2122:     }
                   2123:     SetCursor( LoadCursor( NULL, IDC_ARROW ) );
                   2124:     return result;
                   2125: }
                   2126: 
                   2127: BOOL CALLBACK HarddiskDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                   2128: {
                   2129:     UDACCEL accel[2] = { { 1, 1 }, { 3, 5 } };
                   2130:     char hfsize[9] = "";
                   2131:     ConfigStructPtr cfgptr;
                   2132:     int i, result = IDYES;
                   2133:     static BROWSEINFO browse_info;
                   2134:     char directory_path[MAX_PATH];
                   2135:     LPITEMIDLIST browse;
                   2136:     LONG setting;
                   2137: 
                   2138:     switch(msg)
                   2139:     {
                   2140:         case PSM_QUERYSIBLINGS:
                   2141:             cfgptr = (ConfigStructPtr)lParam;
                   2142:             for( i = 0; i < NUM_DRIVES; i++ )
                   2143:             {
                   2144:                 GetSetDriveValues( hDlg, i, TRUE );
                   2145:                 memcpy( &(cfgptr->drives[i]), &drives[i], sizeof( drive_specs ) );
                   2146:             }
                   2147:             cfgptr->HardFileBootPri = IsDlgButtonChecked( hDlg, IDC_BOOTPRI );
                   2148:             break;
                   2149: 
                   2150:         case WM_INITDIALOG:
                   2151:             pages[ HARDDISK_ID ] = hDlg;
                   2152:         case WM_USER:
                   2153:             browse_info.hwndOwner = hDlg;
                   2154:             browse_info.pidlRoot  = NULL;
                   2155:             browse_info.pszDisplayName = directory_path;
                   2156:             browse_info.lpszTitle = "Please select your file-system root directory...";
                   2157:             browse_info.ulFlags   = BIF_DONTGOBELOWDOMAIN | BIF_RETURNONLYFSDIRS;
                   2158:             browse_info.lpfn      = NULL;
                   2159:             browse_info.iImage    = 0;
                   2160:             for(i=0;i<NUM_DRIVES;i++)
                   2161:                 GetSetDriveValues(hDlg, i, FALSE); // FALSE indicates Getting
                   2162: 
                   2163:             CheckDlgButton(hDlg, IDC_BOOTPRI, hf_bootpri);
                   2164:             SendDlgItemMessage( hDlg, IDC_HFSPIN, UDM_SETRANGE, 0, MAKELONG( 256, 0 ) );
                   2165:             SendDlgItemMessage( hDlg, IDC_HFSPIN, UDM_SETPOS, 0, hardfile_size / 1048576 );
                   2166: 
                   2167:             if( hardfile_size == 0)
                   2168:             {
                   2169:                 // hardfile does not exist, so disable the "Hardfile priority" check-box
                   2170:                 EnableWindow( GetDlgItem( hDlg, IDC_BOOTPRI ), FALSE );
                   2171:             }
                   2172:             break;
                   2173: 
                   2174:         case WM_COMMAND:
                   2175:             switch(wParam)
                   2176:             {
                   2177:             case IDC_CREATEHF:
                   2178:                 setting = SendDlgItemMessage( hDlg, IDC_HFSPIN, UDM_GETPOS, 0, 0 );
                   2179:                 if( hardfile_size != 0 )
                   2180:                 {
                   2181:                     result = MessageBox( hDlg, "You already have a hardfile.  Creating a new one will destroy the old one.  Proceed?", "HardFile Warning...", MB_YESNO | MB_ICONWARNING | MB_DEFBUTTON2 | MB_APPLMODAL | MB_SETFOREGROUND );
                   2182:                 }
                   2183:                 if( result == IDYES )
                   2184:                 {
                   2185:                     hardfile_size = CreateHardFile( setting );
                   2186:                     EnableWindow( GetDlgItem( hDlg, IDC_BOOTPRI ), hardfile_size ? TRUE:FALSE );
                   2187:                 }
                   2188:                 break;
                   2189:             case IDC_UAE0:
                   2190:             case IDC_UAE1:
                   2191:             case IDC_UAE2:
                   2192:             case IDC_UAE3:
                   2193:                 if((browse=SHBrowseForFolder(&browse_info))!=NULL)
                   2194:                 {
                   2195:                     SHGetPathFromIDList( browse, directory_path );
                   2196:                     if( directory_path[ strlen( directory_path ) - 1 ] == '\\' )
                   2197:                         directory_path[ strlen( directory_path ) - 1 ] = 0;
                   2198:                     if( wParam == IDC_UAE0 )
                   2199:                         SetDlgItemText( hDlg, IDC_UAE0PATH, directory_path );
                   2200:                     else if( wParam == IDC_UAE1 )
                   2201:                         SetDlgItemText( hDlg, IDC_UAE1PATH, directory_path );
                   2202:                     else if( wParam == IDC_UAE2 )
                   2203:                         SetDlgItemText( hDlg, IDC_UAE2PATH, directory_path );
                   2204:                     else
                   2205:                         SetDlgItemText( hDlg, IDC_UAE3PATH, directory_path );
                   2206:                 }
                   2207:                 break;
                   2208:             }
                   2209:             break;
                   2210: 
                   2211:         case WM_NOTIFY:
                   2212:             switch(((NMHDR *)lParam)->code)
                   2213:             {
                   2214:                 case PSN_APPLY:
                   2215:                     for(i=0;i<NUM_DRIVES;i++)
                   2216:                         GetSetDriveValues( hDlg, i, TRUE); // TRUE indicates Setting
                   2217:                     hf_bootpri = IsDlgButtonChecked( hDlg, IDC_BOOTPRI );
                   2218:                     break;
                   2219:                 case PSN_RESET:
                   2220:                     if(allow_quit_from_property_sheet)
                   2221:                     {
                   2222:                         quit_program = 1;
                   2223:                         regs.spcflags |= SPCFLAG_BRK;
                   2224:                     }
                   2225:                     break;
                   2226:             }
                   2227:             return(TRUE);
                   2228:         default:
                   2229:             return(FALSE);
                   2230:     }
                   2231: 
                   2232:     return(FALSE);
                   2233: }
                   2234: 
                   2235: BOOL CALLBACK FloppiesDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                   2236: {
                   2237:     ConfigStructPtr cfgptr;
                   2238: 
                   2239:     switch(msg)
                   2240:     {
                   2241:         case PSM_QUERYSIBLINGS:
                   2242:             cfgptr = (ConfigStructPtr)lParam;
                   2243:             GetDlgItemText(hDlg, IDC_DF0TEXT, cfgptr->df[0], MAX_PATH);
                   2244:             GetDlgItemText(hDlg, IDC_DF1TEXT, cfgptr->df[1], MAX_PATH);
                   2245:             GetDlgItemText(hDlg, IDC_DF2TEXT, cfgptr->df[2], MAX_PATH);
                   2246:             GetDlgItemText(hDlg, IDC_DF3TEXT, cfgptr->df[3], MAX_PATH);
                   2247:             break;
                   2248: 
                   2249:         case WM_INITDIALOG:
                   2250:             pages[ FLOPPY_ID ] = hDlg;
                   2251:         case WM_USER:
                   2252:             SetDlgItemText(hDlg, IDC_DF0TEXT, currprefs.df[0]);
                   2253:             SetDlgItemText(hDlg, IDC_DF1TEXT, currprefs.df[1]);
                   2254:             SetDlgItemText(hDlg, IDC_DF2TEXT, currprefs.df[2]);
                   2255:             SetDlgItemText(hDlg, IDC_DF3TEXT, currprefs.df[3]);
                   2256:             break;
                   2257: 
                   2258:         case WM_COMMAND:
                   2259:             switch(wParam)
                   2260:             {
                   2261:             case IDC_DF0:
                   2262:                 DiskSelection(hDlg,wParam,0);
                   2263:                 break;
                   2264:             case IDC_DF1:
                   2265:                 DiskSelection(hDlg,wParam,0);
                   2266:                 break;
                   2267:             case IDC_DF2:
                   2268:                 DiskSelection(hDlg,wParam,0);
                   2269:                 break;
                   2270:             case IDC_DF3:
                   2271:                 DiskSelection(hDlg,wParam,0);
                   2272:                 break;
                   2273:             case IDC_EJECT0:
                   2274:                 SetDlgItemText( hDlg, IDC_DF0TEXT, "" );
                   2275:                 disk_eject( 0 );
                   2276:                 break;
                   2277:             case IDC_EJECT1:
                   2278:                 SetDlgItemText( hDlg, IDC_DF1TEXT, "" );
                   2279:                 disk_eject( 1 );
                   2280:                 break;
                   2281:             case IDC_EJECT2:
                   2282:                 SetDlgItemText( hDlg, IDC_DF2TEXT, "" );
                   2283:                 disk_eject( 2 );
                   2284:                 break;
                   2285:             case IDC_EJECT3:
                   2286:                 SetDlgItemText( hDlg, IDC_DF3TEXT, "" );
                   2287:                 disk_eject( 3 );
                   2288:                 break;
                   2289:             case IDC_CREATE:
                   2290:                 DiskSelection( hDlg, wParam, 1 );
                   2291:                 break;
                   2292:             }
                   2293:             break;
                   2294: 
                   2295:         case WM_NOTIFY:
                   2296:             switch(((NMHDR *)lParam)->code)
                   2297:             {
                   2298:                 case PSN_APPLY:
                   2299:                     GetDlgItemText(hDlg, IDC_DF0TEXT, currprefs.df[0], MAX_PATH);
                   2300:                     if( currprefs.df[0][0] )
                   2301:                     {
                   2302:                         disk_insert(0,currprefs.df[0]);
                   2303:                     }
                   2304:                     GetDlgItemText(hDlg, IDC_DF1TEXT, currprefs.df[1], MAX_PATH);
                   2305:                     if( currprefs.df[1][0] )
                   2306:                     {
                   2307:                         disk_insert(1,currprefs.df[1]);
                   2308:                     }
                   2309:                     GetDlgItemText(hDlg, IDC_DF2TEXT, currprefs.df[2], MAX_PATH);
                   2310:                     if( currprefs.df[2][0] )
                   2311:                     {
                   2312:                         disk_insert(2,currprefs.df[2]);
                   2313:                     }
                   2314:                     GetDlgItemText(hDlg, IDC_DF3TEXT, currprefs.df[3], MAX_PATH);
                   2315:                     if( currprefs.df[3][0] )
                   2316:                     {
                   2317:                         disk_insert(3,currprefs.df[3]);
                   2318:                     }
                   2319:                     break;
                   2320:                 case PSN_RESET:
                   2321:                     if(allow_quit_from_property_sheet)
                   2322:                     {
                   2323:                         quit_program = 1;
                   2324:                         regs.spcflags |= SPCFLAG_BRK;
                   2325:                     }
                   2326:                     break;
                   2327:             }
                   2328:             return(TRUE);
                   2329:         default:
                   2330:             return(FALSE);
                   2331:     }
                   2332: 
                   2333:     return(FALSE);
                   2334: }
                   2335: 
                   2336: // Handle messages for the Joystick Settings page of our property-sheet
                   2337: BOOL CALLBACK PortsDlgProc(HWND hDlg, UINT msg, WPARAM wParam, LPARAM lParam)
                   2338: {
                   2339:     ConfigStructPtr cfgptr;
                   2340:     char joyspec[3] = "MA";
                   2341:     LONG ser_port, item_height;
                   2342:     RECT rect;
                   2343: 
                   2344:     switch(msg)
                   2345:     {
                   2346:         case PSM_QUERYSIBLINGS:
                   2347:             cfgptr = (ConfigStructPtr)lParam;
                   2348:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_JOY0 ) )
                   2349:                 joyspec[0] = '0';
                   2350:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_JOY1 ) )
                   2351:                 joyspec[0] = '1';
                   2352:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_MOUSE ) )
                   2353:                 joyspec[0] = 'M';
                   2354:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDA ) )
                   2355:                 joyspec[0] = 'A';
                   2356:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDB ) )
                   2357:                 joyspec[0] = 'B';
                   2358:             if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDC ) )
                   2359:                 joyspec[0] = 'C';
                   2360: 
                   2361:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_JOY0 ) )
                   2362:                 joyspec[1] = '0';
                   2363:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_JOY1 ) )
                   2364:                 joyspec[1] = '1';
                   2365:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_MOUSE ) )
                   2366:                 joyspec[1] = 'M';
                   2367:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDA ) )
                   2368:                 joyspec[1] = 'A';
                   2369:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDB ) )
                   2370:                 joyspec[1] = 'B';
                   2371:             if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDC ) )
                   2372:                 joyspec[1] = 'C';
                   2373: 
                   2374:             cfgptr->FakeJoystick = parse_joy_spec( joyspec );
                   2375: 
                   2376:             GetDlgItemText( hDlg, IDC_PARALLEL, cfgptr->PrinterName, CFG_PAR_LENGTH );
                   2377: 
                   2378:             switch( ser_port = SendDlgItemMessage( hDlg, IDC_SERIAL, CB_GETCURSEL, 0, 0L) )
                   2379:             {
                   2380:             case 1:
                   2381:             case 2:
                   2382:             case 3:
                   2383:             case 4:
                   2384:                 cfgptr->SerialPort = 1;
                   2385: #ifdef __GNUC__
                   2386:                 sprintf( cfgptr->SerialName, "COM%d", ser_port );
                   2387: #else
                   2388:                 _snprintf( cfgptr->SerialName, CFG_SER_LENGTH, "COM%d", ser_port );
                   2389: #endif
                   2390:                 break;
                   2391:             default:
                   2392:                 cfgptr->SerialPort = 0;
                   2393:                 break;
                   2394:             }
                   2395: 
                   2396:             break;
                   2397: 
                   2398:         case WM_INITDIALOG:
                   2399:             pages[ PORTS_ID ] = hDlg;
                   2400:         case WM_USER:
                   2401:             UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_PORT0 ) );
                   2402:             UpdateRadioButtons( hDlg, GetDlgItem( hDlg, IDC_PORT1 ) );
                   2403:             SetDlgItemText( hDlg, IDC_PARALLEL, prtname );
                   2404:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_RESETCONTENT, 0, 0L);
                   2405:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"None" );
                   2406:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"COM1" );
                   2407:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"COM2" );
                   2408:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"COM3" );
                   2409:             SendDlgItemMessage( hDlg, IDC_SERIAL, CB_ADDSTRING, 0, (LPARAM)"COM4" );
                   2410:             if( currprefs.use_serial == 0 )
                   2411:                 SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 0, 0L );
                   2412:             else
                   2413:             {
                   2414:                 switch( sername[ strlen( sername ) - 1 ] )
                   2415:                 {
                   2416:                 case '2':
                   2417:                     SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 2, 0L );
                   2418:                     break;
                   2419:                 case '3':
                   2420:                     SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 3, 0L );
                   2421:                     break;
                   2422:                 case '4':
                   2423:                     SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 4, 0L );
                   2424:                     break;
                   2425:                 default:
                   2426:                     SendDlgItemMessage( hDlg, IDC_SERIAL, CB_SETCURSEL, 1, 0L );
                   2427:                     break;
                   2428:                 }
                   2429:             }
                   2430: 
                   2431:             // Retrieve the height, in pixels, of a list item.
                   2432:             item_height = SendDlgItemMessage( hDlg, IDC_SERIAL, CB_GETITEMHEIGHT, 0, 0L);
                   2433:             if (item_height != CB_ERR) 
                   2434:             {
                   2435:                 // Get actual box position and size.
                   2436:                 GetWindowRect( GetDlgItem( hDlg, IDC_SERIAL ), &rect);
                   2437:                 rect.bottom = rect.top + item_height * 5
                   2438:                                   + SendDlgItemMessage( hDlg, IDC_SERIAL, CB_GETITEMHEIGHT, (WPARAM)-1, 0L)
                   2439:                                   + item_height;
                   2440:                 SetWindowPos( GetDlgItem( hDlg, IDC_SERIAL ), 0, 0, 0, rect.right - rect.left,
                   2441:                              rect.bottom - rect.top, SWP_NOMOVE | SWP_NOZORDER);
                   2442:             }
                   2443:             if( hEmuThread )
                   2444:             {
                   2445:                 EnableWindow( GetDlgItem( hDlg, IDC_SERIAL ), FALSE );
                   2446:                 EnableWindow( GetDlgItem( hDlg, IDC_PARALLEL ), FALSE );
                   2447:             }
                   2448:             return(TRUE);
                   2449: 
                   2450:         case WM_NOTIFY:
                   2451:             switch(((NMHDR *)lParam)->code)
                   2452:             {
                   2453:             case PSN_APPLY:
                   2454:                 // OK or Apply has been pressed
                   2455:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_JOY0 ) )
                   2456:                     joyspec[0] = '0';
                   2457:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_JOY1 ) )
                   2458:                     joyspec[0] = '1';
                   2459:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_MOUSE ) )
                   2460:                     joyspec[0] = 'M';
                   2461:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDA ) )
                   2462:                     joyspec[0] = 'A';
                   2463:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDB ) )
                   2464:                     joyspec[0] = 'B';
                   2465:                 if( IsDlgButtonChecked( hDlg, IDC_PORT0_KBDC ) )
                   2466:                     joyspec[0] = 'C';
                   2467: 
                   2468:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_JOY0 ) )
                   2469:                     joyspec[1] = '0';
                   2470:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_JOY1 ) )
                   2471:                     joyspec[1] = '1';
                   2472:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_MOUSE ) )
                   2473:                     joyspec[1] = 'M';
                   2474:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDA ) )
                   2475:                     joyspec[1] = 'A';
                   2476:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDB ) )
                   2477:                     joyspec[1] = 'B';
                   2478:                 if( IsDlgButtonChecked( hDlg, IDC_PORT1_KBDC ) )
                   2479:                     joyspec[1] = 'C';
                   2480: 
                   2481:                 currprefs.fake_joystick = parse_joy_spec( joyspec );
                   2482: 
                   2483:                 GetDlgItemText( hDlg, IDC_PARALLEL, prtname, CFG_PAR_LENGTH );
                   2484: 
                   2485:                 switch( item_height = SendDlgItemMessage( hDlg, IDC_SERIAL, CB_GETCURSEL, 0, 0L) )
                   2486:                 {
                   2487:                 case 1:
                   2488:                 case 2:
                   2489:                 case 3:
                   2490:                 case 4:
                   2491:                     currprefs.use_serial = 1;
                   2492: #ifdef __GNUC__
                   2493:                     sprintf( sername, "COM%d", item_height );
                   2494: #else
                   2495:                     _snprintf( sername, CFG_SER_LENGTH, "COM%d", item_height );
                   2496: #endif
                   2497:                     break;
                   2498:                 default:
                   2499:                     currprefs.use_serial = 0;
                   2500:                     break;
                   2501:                 }
                   2502: 
                   2503: 
                   2504:                     break;
                   2505:                 case PSN_RESET:
                   2506:                     if(allow_quit_from_property_sheet)
                   2507:                     {
                   2508:                         quit_program = 1;
                   2509:                         regs.spcflags |= SPCFLAG_BRK;
                   2510:                     }
                   2511:                     break;
                   2512:             }
                   2513:             return(FALSE);
                   2514:     }
                   2515:     return(FALSE);
                   2516: }
                   2517: 
                   2518: HWND AddStatusWindow(void)
                   2519: {
                   2520:     HWND hwndStatus; 
                   2521:     RECT rcClient; 
                   2522:     HLOCAL hloc; 
                   2523:     LPINT lpParts; 
                   2524:  
                   2525:     // Create the status window. 
                   2526:     hwndStatus = CreateWindowEx( 
                   2527:         0,                       // no extended styles 
                   2528:         STATUSCLASSNAME,         // name of status window class 
                   2529:         (LPCTSTR) NULL,          // no text when first created 
                   2530:         WS_CHILD | WS_VISIBLE,   // creates a child window 
                   2531:         0, 0, 0, 0,              // ignores size and position 
                   2532:         hMainWnd,                // handle to parent window 
                   2533:         (HMENU) 0,               // child window identifier 
                   2534:         hInst,                   // handle to application instance 
                   2535:         NULL);                   // no window creation data 
                   2536:  
                   2537:     // Get the coordinates of the parent window's client area. 
                   2538:     GetClientRect(hMainWnd, &rcClient); 
                   2539:  
                   2540:     // Allocate an array for holding the right edge coordinates. 
                   2541:     hloc = LocalAlloc(LHND, sizeof(int) * 6); // six parts for status-window
                   2542:     lpParts = LocalLock(hloc); 
                   2543:  
                   2544:     // Calculate the right edge coordinate for each part, and 
                   2545:     // copy the coordinates to the array. 
                   2546:     lpParts[0] = rcClient.right - 120;
                   2547:     lpParts[1] = rcClient.right - 105;
                   2548:     lpParts[2] = rcClient.right - 90;
                   2549:     lpParts[3] = rcClient.right - 75;
                   2550:     lpParts[4] = rcClient.right - 60;
                   2551:     lpParts[5] = rcClient.right;
                   2552:  
                   2553:     // Tell the status window to create the six window parts. 
                   2554:     SendMessage(hwndStatus, SB_SETPARTS, (WPARAM) 6, 
                   2555:         (LPARAM) lpParts); 
                   2556:  
                   2557:     // Free the array, and return. 
                   2558:     LocalUnlock(hloc); 
                   2559:     LocalFree(hloc); 
                   2560:     return hwndStatus; 
                   2561: } 
                   2562: 
                   2563: /*
                   2564: void SetStatusText(char *text, int part)
                   2565: {
                   2566:     if(status_window)
                   2567:     {
                   2568:         PostMessage(status_window, SB_SETTEXT, (WPARAM) part, (LPARAM) text);
                   2569:     }
                   2570: }
                   2571: */
                   2572: 
                   2573: int gui_init (void)
                   2574: {
                   2575: #ifndef _WIN32
                   2576:     if (!GetSettings ()) {
                   2577:        MyOutputDebugString ("GetSettings() trying to quit...\n");
                   2578:        return 0;
                   2579:     }
                   2580:     fprintf (stderr, "%lx %lx\n", gfxmem_size, z3fastmem_size);
                   2581: #endif
                   2582:     return 1;
                   2583: }
                   2584: 
                   2585: int gui_update (void)
                   2586: {
                   2587: }
                   2588: 
                   2589: void gui_exit (void)
                   2590: {
                   2591: }
                   2592: 
                   2593: void gui_led (int led, int on)
                   2594: {
                   2595: 
                   2596: }
                   2597: 
                   2598: void gui_filename (int num, const char *name)
                   2599: {
                   2600: }
                   2601: 
                   2602: LONG GetDisplayModeLogicalNumber( int x, int y )
                   2603: {
                   2604:     LONG modenum = 0;
                   2605:     int i;
                   2606:     for( i = 0; i < mode_count; i++ )
                   2607:     {
                   2608:         if( DisplayModes[i].depth == 2 )
                   2609:         {
                   2610:             if( ( DisplayModes[i].res.width == x ) &&
                   2611:                 ( DisplayModes[i].res.height == y ) )
                   2612:                 return modenum;
                   2613:             modenum++;
                   2614:         }
                   2615:     }
                   2616:     return 0;
                   2617: }
                   2618: 
                   2619: LONG GetDisplayModeNumber( LONG logical_number )
                   2620: {
                   2621:     LONG modenum = 0;
                   2622:     int i;
                   2623:     for( i = 0; i < mode_count; i++ )
                   2624:     {
                   2625:         if( DisplayModes[i].depth == 2 && DisplayModes[i].res.width <= 800 && DisplayModes[i].res.height <= 600)
                   2626:         {
                   2627:             if( modenum == logical_number )
                   2628:                 return i;
                   2629:             modenum++;
                   2630:         }
                   2631:     }
                   2632:     return 0;
                   2633: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.