Source to src/gui-sdl/dlgAdvanced.c


Enter a symbol's name here to quickly find it.

/*
  Previous - dlgSystem.c

  This file is distributed under the GNU Public License, version 2 or at
  your option any later version. Read the file gpl.txt for details.

*/
const char DlgAdvanced_fileid[] = "Hatari dlgAdvanced.c : " __DATE__ " " __TIME__;

#include "main.h"
#include "configuration.h"
#include "dialog.h"
#include "sdlgui.h"


#define DLGADV_REALTIME   4
#define DLGADV_16MHZ      5
#define DLGADV_20MHZ      6
#define DLGADV_25MHZ      7
#define DLGADV_33MHZ      8
#define DLGADV_40MHZ      9

#define DLGADV_CUSTOM     12
#define DLGADV_8MB        13
#define DLGADV_16MB       14
#define DLGADV_32MB       15
#define DLGADV_64MB       16
#define DLGADV_128MB      17

#define DLGADV_120NS      20
#define DLGADV_100NS      21
#define DLGADV_80NS       22
#define DLGADV_60NS       23

#define DLGADV_DSPNONE    26
#define DLGADV_DSP56001   27
#define DLGADV_DSPMEM24   29
#define DLGADV_DSPMEM96   30

#define DLGADV_NBIC       33

#define DLGADV_SCSI_OLD   36
#define DLGADV_SCSI_NEW   37

#define DLGADV_RTC_OLD    40
#define DLGADV_RTC_NEW    41

#define DLGADV_EXIT       42

char custom_memory[16] = "Customize";

#define DLG_VAR_Y         16
#define DLG_MEM_Y         16

static SGOBJ advanceddlg[] =
{
    { SGBOX, 0, 0, 0,0, 63,31, NULL },
    { SGTEXT, 0, 0, 20,1, 23,1, "Advanced system options" },
    
    { SGBOX, 0, 0, 2,3, 14,15, NULL },
    { SGTEXT, 0, 0, 3,4, 12,1, "CPU clock" },
	{ SGRADIOBUT, 0, 0, 4,DLG_VAR_Y, 10,1, "Variable" },
    { SGRADIOBUT, 0, 0, 4,6, 8,1, "16 MHz" },
    { SGRADIOBUT, 0, 0, 4,8, 8,1, "20 MHz" },
    { SGRADIOBUT, 0, 0, 4,10, 8,1, "25 MHz" },
    { SGRADIOBUT, 0, 0, 4,12, 8,1, "33 MHz" },
    { SGRADIOBUT, 0, 0, 4,14, 8,1, "40 MHz" },

    { SGBOX, 0, 0, 17,3, 14,15, NULL },
    { SGTEXT, 0, 0, 18,4, 12,1, "Memory size" },
	{ SGRADIOBUT, 0, 0, 19,DLG_MEM_Y, 8,1, custom_memory },
    { SGRADIOBUT, 0, 0, 19,6, 6,1, "8 MB" },
    { SGRADIOBUT, 0, 0, 19,8, 7,1, "16 MB" },
    { SGRADIOBUT, 0, 0, 19,10, 7,1, "32 MB" },
    { SGRADIOBUT, 0, 0, 19,12, 7,1, "64 MB" },
    { SGRADIOBUT, 0, 0, 19,14, 8,1, "128 MB" },

    { SGBOX, 0, 0, 32,3, 14,15, NULL },
    { SGTEXT, 0, 0, 33,4, 12,1, "Memory speed" },
    { SGRADIOBUT, 0, 0, 34,6, 8,1, "120 ns" },
    { SGRADIOBUT, 0, 0, 34,8, 8,1, "100 ns" },
    { SGRADIOBUT, 0, 0, 34,10, 7,1, "80 ns" },
    { SGRADIOBUT, 0, 0, 34,12, 7,1, "60 ns" },

    { SGBOX, 0, 0, 47,3, 14,15, NULL },
    { SGTEXT, 0, 0, 48,4, 12,1, "DSP type" },
    { SGRADIOBUT, 0, 0, 49,6, 6,1, "none" },
    { SGRADIOBUT, 0, 0, 49,8, 7,1, "56001" },
    { SGTEXT, 0, 0, 48,10, 8,1, "DSP memory" },
    { SGRADIOBUT, 0, 0, 49,12, 7,1, "24 kB" },
    { SGRADIOBUT, 0, 0, 49,14, 7,1, "96 kB" },
    
    { SGBOX, 0, 0, 2,19, 19,7, NULL },
    { SGTEXT, 0, 0, 3,20, 14,1, "NBIC" },
    { SGCHECKBOX, 0, 0, 4,22, 10,1, "present" },

    { SGBOX, 0, 0, 22,19, 19,7, NULL },
    { SGTEXT, 0, 0, 23,20, 14,1, "SCSI chip" },
    { SGRADIOBUT, 0, 0, 24,22, 10,1, "NCR53C90" },
    { SGRADIOBUT, 0, 0, 24,24, 11,1, "NCR53C90A" },
    
    { SGBOX, 0, 0, 42,19, 19,7, NULL },
    { SGTEXT, 0, 0, 43,20, 14,1, "RTC chip" },
    { SGRADIOBUT, 0, 0, 44,22, 12,1, "MC68HC68T1" },
    { SGRADIOBUT, 0, 0, 44,24, 10,1, "MCCS1850" },

    { SGBUTTON, SG_DEFAULT, 0, 20,28, 23,1, "Back to system menu" },
    { -1, 0, 0, 0,0, 0,0, NULL }
};


/* Variable objects */
SGOBJ disable_128mb_opt = { SGTEXT, 0, 0, 19,14, 0,1, "" };
SGOBJ enable_128mb_opt = { SGRADIOBUT, 0, 0, 19,14, 8,1, "128 MB" };
SGOBJ disable_64mb_opt = { SGTEXT, 0, 0, 19,12, 0,1, "" };
SGOBJ enable_64mb_opt = { SGRADIOBUT, 0, 0, 19,12, 7,1, "64 MB" };
SGOBJ disable_40mhz_opt = { SGTEXT, 0, 0, 4,14, 0,1, "" };
SGOBJ enable_40mhz_opt = { SGRADIOBUT, 0, 0, 4,14, 8,1, "40 MHz" };

/* Default configuration constants */
int defmemsize[9][4] = {
    { 4, 4, 0, 0},  /*  8 MB for monochrome non-turbo */
    { 8, 0, 0, 0},  /*  8 MB for turbo and non-turbo color */
    {16, 0, 0, 0},  /* 16 MB for monochrome non-turbo */
    { 8, 8, 0, 0},  /* 16 MB for turbo and non-turbo color */
    {16,16, 0, 0},  /* 32 MB for monochrome non-turbo */
    { 8, 8, 8, 8},  /* 32 MB for turbo and non-turbo color */
    {16,16,16,16},  /* 64 MB for monochrome non-turbo */
    {32,32, 0, 0},  /* 64 MB for turbo */
    {32,32,32,32}   /* 128 MB for turbo */
};
int defmemsizecount=0; /* Compare defsizes up to this value */

/*-----------------------------------------------------------------------*/
/**
 * Draw the memory options.
 */
static void Dialog_AdvancedDlg_MemDraw(void) {
    int i;
    int memsum, memsize;
    
    sprintf(custom_memory, "Customize");
    
    for (i = DLGADV_CUSTOM; i <= DLGADV_128MB; i++)
    {
        advanceddlg[i].state &= ~SG_SELECTED;
    }
    
    for (i = DLGADV_120NS; i <= DLGADV_60NS; i++)
    {
        advanceddlg[i].state &= ~SG_SELECTED;
    }
    
    /* Check memory configuration and find out if it is one of our default configurations */
    memsum = Configuration_CheckMemory(ConfigureParams.Memory.nMemoryBankSize);
    
    for (i=0; i<defmemsizecount; i++) {
        if (memcmp(ConfigureParams.Memory.nMemoryBankSize, defmemsize[i],
                   sizeof(ConfigureParams.Memory.nMemoryBankSize))) {
            memsize = 0;
        } else {
            memsize = memsum;
            break;
        }
    }
    
    switch (memsize)
    {
        case 8:
            advanceddlg[DLGADV_8MB].state |= SG_SELECTED;
            break;
        case 16:
            advanceddlg[DLGADV_16MB].state |= SG_SELECTED;
            break;
        case 32:
            advanceddlg[DLGADV_32MB].state |= SG_SELECTED;
            break;
        case 64:
            advanceddlg[DLGADV_64MB].state |= SG_SELECTED;
            break;
        case 128:
            advanceddlg[DLGADV_128MB].state |= SG_SELECTED;
            break;
        default:
            advanceddlg[DLGADV_CUSTOM].state |= SG_SELECTED;
            sprintf(custom_memory, "Custom");
            break;
    }
    
    switch (ConfigureParams.Memory.nMemorySpeed) {
        case MEMORY_120NS:
            advanceddlg[DLGADV_120NS].state |= SG_SELECTED;
            break;
        case MEMORY_100NS:
            advanceddlg[DLGADV_100NS].state |= SG_SELECTED;
            break;
        case MEMORY_80NS:
            advanceddlg[DLGADV_80NS].state |= SG_SELECTED;
            break;
        case MEMORY_60NS:
            advanceddlg[DLGADV_60NS].state |= SG_SELECTED;
            break;
            
        default:
            ConfigureParams.Memory.nMemorySpeed = MEMORY_100NS;
            advanceddlg[DLGADV_100NS].state |= SG_SELECTED;
            break;
    }
}


/*-----------------------------------------------------------------------*/
/**
  * Show and process the "Advanced" dialog.
  */
void Dialog_AdvancedDlg(void) {

 	int i;
    int but;
 
 	SDLGui_CenterDlg(advanceddlg);
 
 	/* Set up dialog from actual values: */
    
    for (i = DLGADV_16MHZ; i <= DLGADV_40MHZ; i++)
	{
		advanceddlg[i].state &= ~SG_SELECTED;
	}
	
	/* Remove 40 MHz option if system is non-Turbo */
	if (ConfigureParams.System.bTurbo) {
		advanceddlg[DLGADV_40MHZ] = enable_40mhz_opt;
		advanceddlg[DLGADV_REALTIME].y = DLG_VAR_Y;
	} else {
		advanceddlg[DLGADV_40MHZ] = disable_40mhz_opt;
		advanceddlg[DLGADV_REALTIME].y = DLG_VAR_Y-2;
	}

	if (ConfigureParams.System.bRealtime) {
        advanceddlg[DLGADV_REALTIME].state |= SG_SELECTED;
	} else {
        advanceddlg[DLGADV_REALTIME].state &= ~SG_SELECTED;
		switch (ConfigureParams.System.nCpuFreq)
		{
			case 16:
				advanceddlg[DLGADV_16MHZ].state |= SG_SELECTED;
				break;
			case 20:
				advanceddlg[DLGADV_20MHZ].state |= SG_SELECTED;
				break;
			case 25:
				advanceddlg[DLGADV_25MHZ].state |= SG_SELECTED;
				break;
			case 33:
				advanceddlg[DLGADV_33MHZ].state |= SG_SELECTED;
				break;
			case 40:
				advanceddlg[DLGADV_40MHZ].state |= SG_SELECTED;
				break;
			default:
				break;
		}
	}
	
    /* Remove 64 and 128MB option if system is non-Turbo Slab,
     * remove 128MB option if system is not Turbo */
    if (ConfigureParams.System.bTurbo) {
        advanceddlg[DLGADV_64MB] = enable_64mb_opt;
        advanceddlg[DLGADV_128MB] = enable_128mb_opt;
		advanceddlg[DLGADV_CUSTOM].y = DLG_MEM_Y;
        defmemsizecount = 9;
    } else if (ConfigureParams.System.bColor ||
               ConfigureParams.System.nMachineType == NEXT_STATION) {
        advanceddlg[DLGADV_64MB] = disable_64mb_opt;
        advanceddlg[DLGADV_128MB] = disable_128mb_opt;
		advanceddlg[DLGADV_CUSTOM].y = DLG_MEM_Y-4;
        defmemsizecount = 6;
    } else {
        advanceddlg[DLGADV_64MB] = enable_64mb_opt;
        advanceddlg[DLGADV_128MB] = disable_128mb_opt;
		advanceddlg[DLGADV_CUSTOM].y = DLG_MEM_Y-2;
        defmemsizecount = 8;
    }
    
    /* Display memory speed options depending on system type */
    if (ConfigureParams.System.bTurbo) {
        advanceddlg[DLGADV_120NS].txt = "60 ns";
        advanceddlg[DLGADV_100NS].txt = "70 ns";
        advanceddlg[DLGADV_80NS].txt = "80 ns";
        advanceddlg[DLGADV_60NS].txt = "100 ns";
    } else {
        advanceddlg[DLGADV_120NS].txt = "120 ns";
        advanceddlg[DLGADV_100NS].txt = "100 ns";
        advanceddlg[DLGADV_80NS].txt = "80 ns";
        advanceddlg[DLGADV_60NS].txt = "60 ns";
    }
    Dialog_AdvancedDlg_MemDraw();
    
    advanceddlg[DLGADV_DSPNONE].state &= ~SG_SELECTED;
    advanceddlg[DLGADV_DSP56001].state &= ~SG_SELECTED;
    switch (ConfigureParams.System.nDSPType) {
        case DSP_TYPE_NONE:
        case DSP_TYPE_DUMMY:
            advanceddlg[DLGADV_DSPNONE].state |= SG_SELECTED;
            break;
        case DSP_TYPE_EMU:
            advanceddlg[DLGADV_DSP56001].state |= SG_SELECTED;
            break;
        default:
            break;
    }
    
    advanceddlg[DLGADV_DSPMEM24].state &= ~SG_SELECTED;
    advanceddlg[DLGADV_DSPMEM96].state &= ~SG_SELECTED;
    if (ConfigureParams.System.bDSPMemoryExpansion) {
        advanceddlg[DLGADV_DSPMEM96].state |= SG_SELECTED;
    } else {
        advanceddlg[DLGADV_DSPMEM24].state |= SG_SELECTED;
    }
    
    advanceddlg[DLGADV_NBIC].state &= ~SG_SELECTED;
    if (ConfigureParams.System.bNBIC) {
        advanceddlg[DLGADV_NBIC].state |= SG_SELECTED;
    }
    
    for (i = DLGADV_SCSI_OLD; i <= DLGADV_SCSI_NEW; i++)
	{
		advanceddlg[i].state &= ~SG_SELECTED;
	}
    switch (ConfigureParams.System.nSCSI)
	{
        case NCR53C90:
            advanceddlg[DLGADV_SCSI_OLD].state |= SG_SELECTED;
            break;
        case NCR53C90A:
            advanceddlg[DLGADV_SCSI_NEW].state |= SG_SELECTED;
            break;
        default:
            break;
	}

    for (i = DLGADV_RTC_OLD; i <= DLGADV_RTC_NEW; i++)
	{
		advanceddlg[i].state &= ~SG_SELECTED;
	}
    switch (ConfigureParams.System.nRTC)
	{
        case MC68HC68T1:
            advanceddlg[DLGADV_RTC_OLD].state |= SG_SELECTED;
            break;
        case MCCS1850:
            advanceddlg[DLGADV_RTC_NEW].state |= SG_SELECTED;
            break;
        default:
            break;
	}
    
 		
 	/* Draw and process the dialog: */

    do
	{
        but = SDLGui_DoDialog(advanceddlg, NULL);

        switch (but) {
            case DLGADV_8MB:
                if (ConfigureParams.System.bColor || ConfigureParams.System.bTurbo) {
                    memcpy(ConfigureParams.Memory.nMemoryBankSize, defmemsize[1],
                           sizeof(ConfigureParams.Memory.nMemoryBankSize));
                } else {
                    memcpy(ConfigureParams.Memory.nMemoryBankSize, defmemsize[0],
                           sizeof(ConfigureParams.Memory.nMemoryBankSize));
                }
                sprintf(custom_memory, "Customize");
                break;
            case DLGADV_16MB:
                if (ConfigureParams.System.bColor || ConfigureParams.System.bTurbo) {
                    memcpy(ConfigureParams.Memory.nMemoryBankSize, defmemsize[3],
                           sizeof(ConfigureParams.Memory.nMemoryBankSize));
                } else {
                    memcpy(ConfigureParams.Memory.nMemoryBankSize, defmemsize[2],
                           sizeof(ConfigureParams.Memory.nMemoryBankSize));
                }
                sprintf(custom_memory, "Customize");
                break;
            case DLGADV_32MB:
                if (ConfigureParams.System.bColor || ConfigureParams.System.bTurbo) {
                    memcpy(ConfigureParams.Memory.nMemoryBankSize, defmemsize[5],
                           sizeof(ConfigureParams.Memory.nMemoryBankSize));
                } else {
                    memcpy(ConfigureParams.Memory.nMemoryBankSize, defmemsize[4],
                           sizeof(ConfigureParams.Memory.nMemoryBankSize));
                }
                sprintf(custom_memory, "Customize");
                break;
            case DLGADV_64MB:
                if (ConfigureParams.System.bTurbo) {
                    memcpy(ConfigureParams.Memory.nMemoryBankSize, defmemsize[7],
                           sizeof(ConfigureParams.Memory.nMemoryBankSize));
                } else {
                    memcpy(ConfigureParams.Memory.nMemoryBankSize, defmemsize[6],
                           sizeof(ConfigureParams.Memory.nMemoryBankSize));
                }
                sprintf(custom_memory, "Customize");
                break;
            case DLGADV_128MB:
                memcpy(ConfigureParams.Memory.nMemoryBankSize, defmemsize[8],
                       sizeof(ConfigureParams.Memory.nMemoryBankSize));
                sprintf(custom_memory, "Customize");
                break;
            case DLGADV_CUSTOM:
                Dialog_MemAdvancedDlg(ConfigureParams.Memory.nMemoryBankSize);
                Dialog_AdvancedDlg_MemDraw();
                break;

            default:
                break;
        }
    }
    while (but != DLGADV_EXIT && but != SDLGUI_QUIT
           && but != SDLGUI_ERROR && !bQuitProgram);
    
 
 	/* Read values from dialog: */
	
	if (advanceddlg[DLGADV_REALTIME].state & SG_SELECTED) {
		ConfigureParams.System.bRealtime = true;
		ConfigureParams.System.nCpuFreq = ConfigureParams.System.bTurbo ? 33 : 25;
	} else {
		ConfigureParams.System.bRealtime = false;
		
		if (advanceddlg[DLGADV_16MHZ].state & SG_SELECTED)
			ConfigureParams.System.nCpuFreq = 16;
		else if (advanceddlg[DLGADV_20MHZ].state & SG_SELECTED)
			ConfigureParams.System.nCpuFreq = 20;
		else if (advanceddlg[DLGADV_25MHZ].state & SG_SELECTED)
			ConfigureParams.System.nCpuFreq = 25;
		else if (advanceddlg[DLGADV_33MHZ].state & SG_SELECTED)
			ConfigureParams.System.nCpuFreq = 33;
		else
			ConfigureParams.System.nCpuFreq = 40;
	}

    if (advanceddlg[DLGADV_120NS].state & SG_SELECTED)
        ConfigureParams.Memory.nMemorySpeed = MEMORY_120NS;
    else if (advanceddlg[DLGADV_100NS].state & SG_SELECTED)
        ConfigureParams.Memory.nMemorySpeed = MEMORY_100NS;
    else if (advanceddlg[DLGADV_80NS].state & SG_SELECTED)
        ConfigureParams.Memory.nMemorySpeed = MEMORY_80NS;
    else
        ConfigureParams.Memory.nMemorySpeed = MEMORY_60NS;

    if (advanceddlg[DLGADV_DSP56001].state & SG_SELECTED) {
        ConfigureParams.System.nDSPType = DSP_TYPE_EMU;
    } else {
        ConfigureParams.System.nDSPType = DSP_TYPE_NONE;
    }
    
    if (advanceddlg[DLGADV_DSPMEM96].state & SG_SELECTED) {
        ConfigureParams.System.bDSPMemoryExpansion = true;
    } else {
        ConfigureParams.System.bDSPMemoryExpansion = false;
    }
    
    if (advanceddlg[DLGADV_NBIC].state & SG_SELECTED)
        ConfigureParams.System.bNBIC = true;
    else
        ConfigureParams.System.bNBIC = false;
        
    if (advanceddlg[DLGADV_SCSI_OLD].state & SG_SELECTED)
        ConfigureParams.System.nSCSI = NCR53C90;
    else
        ConfigureParams.System.nSCSI = NCR53C90A;

    if (advanceddlg[DLGADV_RTC_OLD].state & SG_SELECTED)
        ConfigureParams.System.nRTC = MC68HC68T1;
    else
        ConfigureParams.System.nRTC = MCCS1850;
}