|
|
1.1 root 1: /*
2: Hatari - dlgHardDisk.c
3:
1.1.1.3 root 4: This file is distributed under the GNU General Public License, version 2
5: or at your option any later version. Read the file gpl.txt for details.
1.1 root 6: */
7: const char DlgHardDisk_fileid[] = "Hatari dlgHardDisk.c : " __DATE__ " " __TIME__;
8:
9: #include <assert.h>
10: #include "main.h"
11: #include "configuration.h"
12: #include "dialog.h"
13: #include "sdlgui.h"
14: #include "file.h"
15:
16:
1.1.1.7 ! root 17: #define DISKDLG_ACSIPREVID 4
! 18: #define DISKDLG_ACSIID 6
! 19: #define DISKDLG_ACSINEXTID 7
! 20: #define DISKDLG_ACSIEJECT 8
! 21: #define DISKDLG_ACSIBROWSE 9
! 22: #define DISKDLG_ACSINAME 10
! 23: #define DISKDLG_SCSIPREVID 13
! 24: #define DISKDLG_SCSIID 15
! 25: #define DISKDLG_SCSINEXTID 16
! 26: #define DISKDLG_SCSIEJECT 17
! 27: #define DISKDLG_SCSIBROWSE 18
! 28: #define DISKDLG_SCSINAME 19
! 29: #define DISKDLG_IDEPREVID 22
! 30: #define DISKDLG_IDEID 24
! 31: #define DISKDLG_IDENEXTID 25
! 32: #define DISKDLG_IDESWAPOFF 27
! 33: #define DISKDLG_IDESWAPON 28
! 34: #define DISKDLG_IDESWAPAUTO 29
! 35: #define DISKDLG_IDEEJECT 30
! 36: #define DISKDLG_IDEBROWSE 31
! 37: #define DISKDLG_IDENAME 32
! 38: #define DISKDLG_GEMDOSEJECT 35
! 39: #define DISKDLG_GEMDOSBROWSE 36
! 40: #define DISKDLG_GEMDOSNAME 37
! 41: #define DISKDLG_GEMDOSCONV 38
! 42: #define DISKDLG_DRIVESKIP 39
! 43: #define DISKDLG_PROTOFF 41
! 44: #define DISKDLG_PROTON 42
! 45: #define DISKDLG_PROTAUTO 43
! 46: #define DISKDLG_BOOTHD 44
! 47: #define DISKDLG_EXIT 45
! 48:
! 49: static char acsi_id_txt[2];
! 50: static char scsi_id_txt[2];
! 51: static char ide_id_txt[2];
! 52: static char dlgname_gdos[64], dlgname_acsi[64];
! 53: static char dlgname_scsi[64], dlgname_ide[64];
1.1 root 54:
55: /* The disks dialog: */
56: static SGOBJ diskdlg[] =
57: {
1.1.1.7 ! root 58: { SGBOX, 0, 0, 0,0, 64,25, NULL },
1.1 root 59: { SGTEXT, 0, 0, 27,1, 10,1, "Hard disks" },
60:
1.1.1.7 ! root 61: { SGBOX, 0, 0, 1,3, 62,2, NULL },
! 62: { SGBOX, 0, 0, 1,3, 62,1, NULL },
! 63: { SGBUTTON, 0, 0, 1,3, 3,1, "\x04" },
! 64: { SGTEXT, 0, 0, 5,3, 7,1, "ACSI HD" },
! 65: { SGTEXT, 0, 0, 13,3, 3,1, acsi_id_txt },
! 66: { SGBUTTON, 0, 0, 15,3, 3,1, "\x03" },
! 67: { SGBUTTON, 0, 0, 47,3, 7,1, "Ejec_t" },
! 68: { SGBUTTON, 0, 0, 55,3, 8,1, "Brow_se" },
! 69: { SGTEXT, 0, 0, 2,4, 60,1, dlgname_acsi },
! 70:
! 71: { SGBOX, 0, 0, 1,6, 62,2, NULL },
! 72: { SGBOX, 0, 0, 1,6, 62,1, NULL },
! 73: { SGBUTTON, 0, 0, 1,6, 3,1, "\x04" },
! 74: { SGTEXT, 0, 0, 5,6, 9,1, "SCSI HD" },
! 75: { SGTEXT, 0, 0, 13,6, 1,1, scsi_id_txt },
! 76: { SGBUTTON, 0, 0, 15,6, 3,1, "\x03" },
! 77: { SGBUTTON, 0, 0, 47,6, 7,1, "Eje_ct" },
! 78: { SGBUTTON, 0, 0, 55,6, 8,1, "Bro_wse" },
! 79: { SGTEXT, 0, 0, 2,7, 60,1, dlgname_scsi },
! 80:
! 81: { SGBOX, 0, 0, 1,9, 62,2, NULL },
! 82: { SGBOX, 0, 0, 1,9, 62,1, NULL },
! 83: { SGBUTTON, 0, 0, 1,9, 3,1, "\x04" },
! 84: { SGTEXT, 0, 0, 5,9, 19,1, "IDE HD" },
! 85: { SGTEXT, 0, 0, 12,9, 1,1, ide_id_txt },
! 86: { SGBUTTON, 0, 0, 15,9, 3,1, "\x03" },
! 87: { SGTEXT, 0, 0, 19,9, 9,1, "Byteswap:" },
! 88: { SGRADIOBUT, 0, 0, 29,9, 5,1, "Off" },
! 89: { SGRADIOBUT, 0, 0, 35,9, 4,1, "On" },
! 90: { SGRADIOBUT, 0, 0, 40,9, 6,1, "Auto" },
! 91: { SGBUTTON, 0, 0, 47,9, 7,1, "E_ject" },
! 92: { SGBUTTON, 0, 0, 55,9, 8,1, "Br_owse" },
! 93: { SGTEXT, 0, 0, 2,10, 60,1, dlgname_ide },
! 94:
! 95: { SGBOX, 0, 0, 1,12, 62,8, NULL },
! 96: { SGTEXT, 0, 0, 2,12, 13,1, "GEMDOS drive:" },
! 97: { SGBUTTON, 0, 0, 47,12, 7,1, "_Eject" },
! 98: { SGBUTTON, 0, 0, 55,12, 8,1, "B_rowse" },
! 99: { SGTEXT, 0, 0, 3,13, 58,1, dlgname_gdos },
! 100:
! 101: { SGCHECKBOX, 0, 0, 8,15, 43,1, "Atari <-> _host 8-bit file name conversion" },
! 102: { SGCHECKBOX, 0, 0, 8,16, 46,1, "Add GEMDOS HD after ACSI/SCSI/IDE _partitions" },
! 103:
! 104: { SGTEXT, 0, 0, 8,18, 31,1, "Write protection:" },
! 105: { SGRADIOBUT, 0, 0, 26,18, 5,1, "O_ff" },
! 106: { SGRADIOBUT, 0, 0, 32,18, 4,1, "O_n" },
! 107: { SGRADIOBUT, 0, 0, 37,18, 6,1, "_Auto" },
1.1.1.2 root 108:
1.1.1.7 ! root 109: { SGCHECKBOX, 0, 0, 2,21, 21,1, "_Boot from hard disk" },
1.1.1.5 root 110:
1.1.1.7 ! root 111: { SGBUTTON, SG_DEFAULT, 0, 22,23, 20,1, "Back to main menu" },
1.1.1.6 root 112: { SGSTOP, 0, 0, 0,0, 0,0, NULL }
1.1 root 113: };
114:
115:
116: /**
117: * Let user browse given directory, set directory if one selected.
118: * return false if none selected, otherwise return true.
119: */
120: static bool DlgDisk_BrowseDir(char *dlgname, char *confname, int maxlen)
121: {
122: char *str, *selname;
123:
1.1.1.5 root 124: selname = SDLGui_FileSelect("GEMDOS drive directory:", confname, NULL, false);
1.1 root 125: if (selname)
126: {
127: strcpy(confname, selname);
128: free(selname);
129:
130: str = strrchr(confname, PATHSEP);
131: if (str != NULL)
132: str[1] = 0;
133: File_CleanFileName(confname);
134: File_ShrinkName(dlgname, confname, maxlen);
135: return true;
136: }
137: return false;
138: }
139:
1.1.1.7 ! root 140: static void DlgHardDisk_PrepAcsi(int id)
! 141: {
! 142: if (ConfigureParams.Acsi[id].bUseDevice)
! 143: {
! 144: File_ShrinkName(dlgname_acsi, ConfigureParams.Acsi[id].sDeviceFile,
! 145: diskdlg[DISKDLG_ACSINAME].w);
! 146: }
! 147: else
! 148: {
! 149: dlgname_acsi[0] = '\0';
! 150: }
! 151:
! 152: acsi_id_txt[0] = '0' + id;
! 153: acsi_id_txt[1] = 0;
! 154: }
! 155:
! 156: static void DlgHardDisk_PrepScsi(int id)
! 157: {
! 158: if (ConfigureParams.Scsi[id].bUseDevice)
! 159: {
! 160: File_ShrinkName(dlgname_scsi, ConfigureParams.Scsi[id].sDeviceFile,
! 161: diskdlg[DISKDLG_SCSINAME].w);
! 162: }
! 163: else
! 164: {
! 165: dlgname_scsi[0] = '\0';
! 166: }
! 167:
! 168: scsi_id_txt[0] = '0' + id;
! 169: scsi_id_txt[1] = 0;
! 170: }
! 171:
! 172: static void DlgHardDisk_PrepIde(int id)
! 173: {
! 174: int idx;
! 175:
! 176: if (ConfigureParams.Ide[id].bUseDevice)
! 177: {
! 178: File_ShrinkName(dlgname_ide, ConfigureParams.Ide[id].sDeviceFile,
! 179: diskdlg[DISKDLG_IDENAME].w);
! 180: }
! 181: else
! 182: {
! 183: dlgname_ide[0] = '\0';
! 184: }
! 185:
! 186: for (idx = DISKDLG_IDESWAPOFF; idx <= DISKDLG_IDESWAPAUTO; idx++)
! 187: diskdlg[idx].state &= ~SG_SELECTED;
! 188: diskdlg[DISKDLG_IDESWAPOFF + ConfigureParams.Ide[id].nByteSwap].state |= SG_SELECTED;
! 189:
! 190: ide_id_txt[0] = '0' + id;
! 191: ide_id_txt[1] = '\0';
! 192: }
! 193:
! 194: static void DlgHardDisk_ReadBackIdeByteSwapSetting(int id)
! 195: {
! 196: int idx;
! 197:
! 198: for (idx = DISKDLG_IDESWAPOFF; idx <= DISKDLG_IDESWAPAUTO; idx++)
! 199: {
! 200: if (diskdlg[idx].state & SG_SELECTED)
! 201: {
! 202: ConfigureParams.Ide[id].nByteSwap = idx - DISKDLG_IDESWAPOFF;
! 203: break;
! 204: }
! 205: }
! 206: }
1.1 root 207:
208: /**
209: * Show and process the hard disk dialog.
210: */
211: void DlgHardDisk_Main(void)
212: {
1.1.1.2 root 213: int but, i;
1.1.1.7 ! root 214: static int a_id, s_id, i_id;
1.1 root 215:
216: SDLGui_CenterDlg(diskdlg);
217:
218: /* Set up dialog to actual values: */
219:
220: /* Boot from harddisk? */
221: if (ConfigureParams.HardDisk.bBootFromHardDisk)
222: diskdlg[DISKDLG_BOOTHD].state |= SG_SELECTED;
223: else
224: diskdlg[DISKDLG_BOOTHD].state &= ~SG_SELECTED;
225:
1.1.1.7 ! root 226: /* Hard disk images: */
! 227: DlgHardDisk_PrepAcsi(a_id);
! 228: DlgHardDisk_PrepScsi(s_id);
! 229: DlgHardDisk_PrepIde(i_id);
1.1 root 230:
231: /* GEMDOS hard disk directory: */
232: if (ConfigureParams.HardDisk.bUseHardDiskDirectories)
233: File_ShrinkName(dlgname_gdos, ConfigureParams.HardDisk.szHardDiskDirectories[0],
234: diskdlg[DISKDLG_GEMDOSNAME].w);
235: else
236: dlgname_gdos[0] = '\0';
237: diskdlg[DISKDLG_GEMDOSNAME].txt = dlgname_gdos;
1.1.1.7 ! root 238: if (ConfigureParams.HardDisk.bFilenameConversion)
! 239: diskdlg[DISKDLG_GEMDOSCONV].state |= SG_SELECTED;
! 240: else
! 241: diskdlg[DISKDLG_GEMDOSCONV].state &= ~SG_SELECTED;
! 242: if (ConfigureParams.HardDisk.nGemdosDrive == DRIVE_SKIP)
! 243: diskdlg[DISKDLG_DRIVESKIP].state |= SG_SELECTED;
! 244: else
! 245: diskdlg[DISKDLG_DRIVESKIP].state &= ~SG_SELECTED;
1.1 root 246:
1.1.1.2 root 247: /* Write protection */
248: for (i = DISKDLG_PROTOFF; i <= DISKDLG_PROTAUTO; i++)
249: {
250: diskdlg[i].state &= ~SG_SELECTED;
251: }
252: diskdlg[DISKDLG_PROTOFF+ConfigureParams.HardDisk.nWriteProtection].state |= SG_SELECTED;
253:
1.1 root 254: /* Draw and process the dialog */
255: do
256: {
1.1.1.5 root 257: but = SDLGui_DoDialog(diskdlg, NULL, false);
1.1 root 258: switch (but)
259: {
1.1.1.7 ! root 260: case DISKDLG_ACSIPREVID:
! 261: if (a_id > 0)
! 262: {
! 263: --a_id;
! 264: DlgHardDisk_PrepAcsi(a_id);
! 265: }
! 266: break;
! 267: case DISKDLG_ACSINEXTID:
! 268: if (a_id < 7)
! 269: {
! 270: ++a_id;
! 271: DlgHardDisk_PrepAcsi(a_id);
! 272: }
! 273: break;
1.1 root 274: case DISKDLG_ACSIEJECT:
1.1.1.7 ! root 275: ConfigureParams.Acsi[a_id].bUseDevice = false;
1.1 root 276: dlgname_acsi[0] = '\0';
277: break;
278: case DISKDLG_ACSIBROWSE:
1.1.1.5 root 279: if (SDLGui_FileConfSelect("ACSI HD image:", dlgname_acsi,
1.1.1.7 ! root 280: ConfigureParams.Acsi[a_id].sDeviceFile,
1.1 root 281: diskdlg[DISKDLG_ACSINAME].w, false))
1.1.1.7 ! root 282: ConfigureParams.Acsi[a_id].bUseDevice = true;
! 283: break;
! 284:
! 285: case DISKDLG_SCSIPREVID:
! 286: if (s_id > 0)
! 287: {
! 288: --s_id;
! 289: DlgHardDisk_PrepScsi(s_id);
! 290: }
! 291: break;
! 292: case DISKDLG_SCSINEXTID:
! 293: if (s_id < 7)
! 294: {
! 295: ++s_id;
! 296: DlgHardDisk_PrepScsi(s_id);
! 297: }
! 298: break;
! 299: case DISKDLG_SCSIEJECT:
! 300: ConfigureParams.Scsi[s_id].bUseDevice = false;
! 301: dlgname_scsi[0] = '\0';
1.1 root 302: break;
1.1.1.7 ! root 303: case DISKDLG_SCSIBROWSE:
! 304: if (SDLGui_FileConfSelect("SCSI HD image:", dlgname_scsi,
! 305: ConfigureParams.Scsi[s_id].sDeviceFile,
! 306: diskdlg[DISKDLG_SCSINAME].w, false))
! 307: ConfigureParams.Scsi[s_id].bUseDevice = true;
! 308: break;
! 309:
! 310: case DISKDLG_IDEPREVID:
! 311: DlgHardDisk_ReadBackIdeByteSwapSetting(i_id);
! 312: if (i_id > 0)
! 313: {
! 314: --i_id;
! 315: DlgHardDisk_PrepIde(i_id);
! 316: }
1.1 root 317: break;
1.1.1.7 ! root 318: case DISKDLG_IDENEXTID:
! 319: DlgHardDisk_ReadBackIdeByteSwapSetting(i_id);
! 320: if (i_id < 1)
! 321: {
! 322: ++i_id;
! 323: DlgHardDisk_PrepIde(i_id);
! 324: }
! 325: break;
! 326: case DISKDLG_IDEEJECT:
! 327: ConfigureParams.Ide[i_id].bUseDevice = false;
! 328: dlgname_ide[0] = '\0';
! 329: break;
! 330: case DISKDLG_IDEBROWSE:
! 331: if (SDLGui_FileConfSelect("IDE HD 0 image:", dlgname_ide,
! 332: ConfigureParams.Ide[i_id].sDeviceFile,
! 333: diskdlg[DISKDLG_IDENAME].w, false))
! 334: ConfigureParams.Ide[i_id].bUseDevice = true;
! 335: break;
! 336:
1.1 root 337: case DISKDLG_GEMDOSEJECT:
338: ConfigureParams.HardDisk.bUseHardDiskDirectories = false;
339: dlgname_gdos[0] = '\0';
340: break;
341: case DISKDLG_GEMDOSBROWSE:
342: if (DlgDisk_BrowseDir(dlgname_gdos,
343: ConfigureParams.HardDisk.szHardDiskDirectories[0],
344: diskdlg[DISKDLG_GEMDOSNAME].w))
345: ConfigureParams.HardDisk.bUseHardDiskDirectories = true;
346: break;
347: }
348: }
349: while (but != DISKDLG_EXIT && but != SDLGUI_QUIT
350: && but != SDLGUI_ERROR && !bQuitProgram);
351:
352: /* Read values from dialog: */
1.1.1.7 ! root 353: DlgHardDisk_ReadBackIdeByteSwapSetting(i_id);
1.1.1.2 root 354: for (i = DISKDLG_PROTOFF; i <= DISKDLG_PROTAUTO; i++)
355: {
356: if (diskdlg[i].state & SG_SELECTED)
357: {
358: ConfigureParams.HardDisk.nWriteProtection = i-DISKDLG_PROTOFF;
359: break;
360: }
361: }
1.1 root 362: ConfigureParams.HardDisk.bBootFromHardDisk = (diskdlg[DISKDLG_BOOTHD].state & SG_SELECTED);
1.1.1.5 root 363:
364: if (diskdlg[DISKDLG_DRIVESKIP].state & SG_SELECTED)
365: ConfigureParams.HardDisk.nGemdosDrive = DRIVE_SKIP;
366: else if (ConfigureParams.HardDisk.nGemdosDrive == DRIVE_SKIP)
367: ConfigureParams.HardDisk.nGemdosDrive = DRIVE_C;
368:
369: if (diskdlg[DISKDLG_GEMDOSCONV].state & SG_SELECTED)
370: ConfigureParams.HardDisk.bFilenameConversion = true;
371: else
372: ConfigureParams.HardDisk.bFilenameConversion = false;
1.1 root 373: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.