Added support for IBM AT Fixed Disk Adapter (MFM).
Added ability to configure hard drive controller. Changed XTIDE to be generic device.
This commit is contained in:
parent
7d6028a619
commit
9ddd1fc679
20 changed files with 1206 additions and 133 deletions
142
src/win-hdconf.c
142
src/win-hdconf.c
|
|
@ -8,12 +8,61 @@
|
|||
#include "resources.h"
|
||||
#include "win.h"
|
||||
|
||||
static struct
|
||||
{
|
||||
int cylinders;
|
||||
int heads;
|
||||
} hd_types[] =
|
||||
{
|
||||
{306, 4}, {615, 4}, {615, 6}, {940, 8},
|
||||
{940, 6}, {615, 4}, {462, 8}, {733, 5},
|
||||
{900, 15}, {820, 3}, {855, 5}, {855, 7},
|
||||
{306, 8}, {733, 7}, {0, 0}, {612, 4},
|
||||
{977, 5}, {977, 7}, {1024, 7}, {733, 5},
|
||||
{733, 7}, {733, 5}, {306, 4}, {925, 7},
|
||||
{925, 9}, {754, 7}, {754, 11}, {699, 7},
|
||||
{823, 10}, {918, 7}, {1024, 11}, {1024, 15},
|
||||
{1024, 5}, {612, 2}, {1024, 9}, {1024, 8},
|
||||
{615, 8}, {987, 3}, {462, 7}, {820, 6},
|
||||
{977, 5}, {981, 5}, {830, 7}, {830, 10},
|
||||
{917, 15}, {1224, 15}
|
||||
};
|
||||
|
||||
static int hd_changed = 0;
|
||||
|
||||
static char hd_new_name[512];
|
||||
static int hd_new_spt, hd_new_hpc, hd_new_cyl;
|
||||
static int hd_new_type;
|
||||
static int new_cdrom_channel;
|
||||
|
||||
static void check_hd_type(off64_t sz)
|
||||
{
|
||||
int c;
|
||||
|
||||
hd_new_type = 0;
|
||||
|
||||
if (hdd_controller_current_is_mfm())
|
||||
{
|
||||
for (c = 0; c < 46; c++)
|
||||
{
|
||||
if ((hd_types[c].cylinders * hd_types[c].heads * 17 * 512) == sz)
|
||||
{
|
||||
hd_new_spt = 17;
|
||||
hd_new_hpc = hd_types[c].heads;
|
||||
hd_new_cyl = hd_types[c].cylinders;
|
||||
hd_new_type = c+1;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
hd_new_spt = 63;
|
||||
hd_new_hpc = 16;
|
||||
hd_new_cyl = ((sz / 512) / 16) / 63;
|
||||
}
|
||||
}
|
||||
|
||||
static void update_hdd_cdrom(HWND hdlg)
|
||||
{
|
||||
HWND h;
|
||||
|
|
@ -44,6 +93,8 @@ static BOOL CALLBACK hdnew_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARA
|
|||
PcemHDC hd[4];
|
||||
FILE *f;
|
||||
uint8_t buf[512];
|
||||
int hd_type;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
|
|
@ -64,6 +115,16 @@ static BOOL CALLBACK hdnew_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARA
|
|||
sprintf(s, "Size : %imb", (((511*16*63)*512)/1024)/1024);
|
||||
SendMessage(h, WM_SETTEXT, 0, (LPARAM)s);
|
||||
|
||||
// hd_type = 0;
|
||||
h = GetDlgItem(hdlg, IDC_HDTYPE);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Custom type");
|
||||
for (c = 1; c <= 46; c++)
|
||||
{
|
||||
sprintf(s, "Type %02i : cylinders=%i, heads=%i, size=%iMB", c, hd_types[c-1].cylinders, hd_types[c-1].heads, (hd_types[c-1].cylinders * hd_types[c-1].heads * 17 * 512) / (1024 * 1024));
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
}
|
||||
SendMessage(h, CB_SETCURSEL, 0, 0);
|
||||
|
||||
return TRUE;
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
|
|
@ -132,17 +193,57 @@ static BOOL CALLBACK hdnew_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARA
|
|||
case IDC_EDIT1: case IDC_EDIT2: case IDC_EDIT3:
|
||||
h = GetDlgItem(hdlg, IDC_EDIT1);
|
||||
SendMessage(h, WM_GETTEXT, 255, (LPARAM)s);
|
||||
pclog("EDIT1: %s\n", s);
|
||||
sscanf(s, "%i", &hd[0].spt);
|
||||
h = GetDlgItem(hdlg, IDC_EDIT2);
|
||||
SendMessage(h, WM_GETTEXT, 255, (LPARAM)s);
|
||||
pclog("EDIT2: %s\n", s);
|
||||
sscanf(s, "%i", &hd[0].hpc);
|
||||
h = GetDlgItem(hdlg, IDC_EDIT3);
|
||||
SendMessage(h, WM_GETTEXT, 255, (LPARAM)s);
|
||||
pclog("EDIT3: %s\n", s);
|
||||
sscanf(s, "%i", &hd[0].tracks);
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_TEXT1);
|
||||
sprintf(s, "Size : %imb", (((((uint64_t)hd[0].tracks*(uint64_t)hd[0].hpc)*(uint64_t)hd[0].spt)*512)/1024)/1024);
|
||||
SendMessage(h, WM_SETTEXT, 0, (LPARAM)s);
|
||||
|
||||
hd_type = 0;
|
||||
for (c = 1; c <= 46; c++)
|
||||
{
|
||||
pclog("Compare %i,%i %i,%i %i,%i\n", hd[0].spt,17, hd[0].hpc,hd_types[c-1].heads, hd[0].tracks,hd_types[c-1].cylinders);
|
||||
if (hd[0].spt == 17 && hd[0].hpc == hd_types[c-1].heads && hd[0].tracks == hd_types[c-1].cylinders)
|
||||
{
|
||||
hd_type = c;
|
||||
break;
|
||||
}
|
||||
}
|
||||
h = GetDlgItem(hdlg, IDC_HDTYPE);
|
||||
SendMessage(h, CB_SETCURSEL, hd_type, 0);
|
||||
|
||||
return TRUE;
|
||||
|
||||
case IDC_HDTYPE:
|
||||
if (HIWORD(wParam) == CBN_SELCHANGE)
|
||||
{
|
||||
h = GetDlgItem(hdlg, IDC_HDTYPE);
|
||||
hd_type = SendMessage(h, CB_GETCURSEL, 0, 0);
|
||||
if (hd_type)
|
||||
{
|
||||
h = GetDlgItem(hdlg, IDC_EDIT3);
|
||||
sprintf(s, "%i", hd_types[hd_type-1].cylinders);
|
||||
SendMessage(h, WM_SETTEXT, 0, (LPARAM)s);
|
||||
h = GetDlgItem(hdlg, IDC_EDIT2);
|
||||
sprintf(s, "%i", hd_types[hd_type-1].heads);
|
||||
SendMessage(h, WM_SETTEXT, 0, (LPARAM)s);
|
||||
h = GetDlgItem(hdlg, IDC_EDIT1);
|
||||
SendMessage(h, WM_SETTEXT, 0, (LPARAM)"17");
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_TEXT1);
|
||||
sprintf(s, "Size : %imb", (((uint64_t)hd_types[hd_type-1].cylinders*hd_types[hd_type-1].heads*17*512)/1024)/1024);
|
||||
SendMessage(h, WM_SETTEXT, 0, (LPARAM)s);
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
break;
|
||||
|
|
@ -156,9 +257,20 @@ BOOL CALLBACK hdsize_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lPar
|
|||
char s[260];
|
||||
HWND h;
|
||||
PcemHDC hd[2];
|
||||
int c;
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_INITDIALOG:
|
||||
h = GetDlgItem(hdlg, IDC_HDTYPE);
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)"Custom type");
|
||||
for (c = 1; c <= 46; c++)
|
||||
{
|
||||
sprintf(s, "Type %02i : cylinders=%i, heads=%i, size=%iMB", c, hd_types[c-1].cylinders, hd_types[c-1].heads, (hd_types[c-1].cylinders * hd_types[c-1].heads * 17 * 512) / (1024 * 1024));
|
||||
SendMessage(h, CB_ADDSTRING, 0, (LPARAM)(LPCSTR)s);
|
||||
}
|
||||
SendMessage(h, CB_SETCURSEL, hd_new_type, 0);
|
||||
|
||||
h = GetDlgItem(hdlg, IDC_EDIT1);
|
||||
sprintf(s, "%i", hd_new_spt);
|
||||
SendMessage(h, WM_SETTEXT, 0, (LPARAM)s);
|
||||
|
|
@ -172,6 +284,7 @@ BOOL CALLBACK hdsize_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPARAM lPar
|
|||
h = GetDlgItem(hdlg, IDC_TEXT1);
|
||||
sprintf(s, "Size : %imb", ((((uint64_t)hd_new_spt*(uint64_t)hd_new_hpc*(uint64_t)hd_new_cyl)*512)/1024)/1024);
|
||||
SendMessage(h, WM_SETTEXT, 0, (LPARAM)s);
|
||||
|
||||
return TRUE;
|
||||
case WM_COMMAND:
|
||||
switch (LOWORD(wParam))
|
||||
|
|
@ -436,7 +549,7 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
|
|||
return TRUE;
|
||||
|
||||
case IDC_CNEW:
|
||||
if (DialogBox(hinstance, TEXT("HdNewDlg"), hdlg, hdnew_dlgproc) == 1)
|
||||
if (DialogBox(hinstance, hdd_controller_current_is_mfm() ? TEXT("HdNewDlgMfm") : TEXT("HdNewDlg"), hdlg, hdnew_dlgproc) == 1)
|
||||
{
|
||||
h = GetDlgItem(hdlg, IDC_EDIT_C_SPT);
|
||||
sprintf(s, "%i", hd_new_spt);
|
||||
|
|
@ -470,11 +583,9 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
|
|||
fseeko64(f, -1, SEEK_END);
|
||||
sz = ftello64(f) + 1;
|
||||
fclose(f);
|
||||
hd_new_spt = 63;
|
||||
hd_new_hpc = 16;
|
||||
hd_new_cyl = ((sz / 512) / 16) / 63;
|
||||
check_hd_type(sz);
|
||||
|
||||
if (DialogBox(hinstance, TEXT("HdSizeDlg"), hdlg, hdsize_dlgproc) == 1)
|
||||
if (DialogBox(hinstance, hdd_controller_current_is_mfm() ? TEXT("HdSizeDlgMfm") : TEXT("HdSizeDlg"), hdlg, hdsize_dlgproc) == 1)
|
||||
{
|
||||
h = GetDlgItem(hdlg, IDC_EDIT_C_SPT);
|
||||
sprintf(s, "%i", hd_new_spt);
|
||||
|
|
@ -498,7 +609,7 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
|
|||
return TRUE;
|
||||
|
||||
case IDC_DNEW:
|
||||
if (DialogBox(hinstance, TEXT("HdNewDlg"), hdlg, hdnew_dlgproc) == 1)
|
||||
if (DialogBox(hinstance, hdd_controller_current_is_mfm() ? TEXT("HdNewDlgMfm") : TEXT("HdNewDlg"), hdlg, hdnew_dlgproc) == 1)
|
||||
{
|
||||
h = GetDlgItem(hdlg, IDC_EDIT_D_SPT);
|
||||
sprintf(s, "%i", hd_new_spt);
|
||||
|
|
@ -532,11 +643,9 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
|
|||
fseeko64(f, -1, SEEK_END);
|
||||
sz = ftello64(f) + 1;
|
||||
fclose(f);
|
||||
hd_new_spt = 63;
|
||||
hd_new_hpc = 16;
|
||||
hd_new_cyl = ((sz / 512) / 16) / 63;
|
||||
check_hd_type(sz);
|
||||
|
||||
if (DialogBox(hinstance, TEXT("HdSizeDlg"), hdlg, hdsize_dlgproc) == 1)
|
||||
if (DialogBox(hinstance, hdd_controller_current_is_mfm() ? TEXT("HdSizeDlgMfm") : TEXT("HdSizeDlg"), hdlg, hdsize_dlgproc) == 1)
|
||||
{
|
||||
h = GetDlgItem(hdlg, IDC_EDIT_D_SPT);
|
||||
sprintf(s, "%i", hd_new_spt);
|
||||
|
|
@ -594,9 +703,7 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
|
|||
fseeko64(f, -1, SEEK_END);
|
||||
sz = ftello64(f) + 1;
|
||||
fclose(f);
|
||||
hd_new_spt = 63;
|
||||
hd_new_hpc = 16;
|
||||
hd_new_cyl = ((sz / 512) / 16) / 63;
|
||||
check_hd_type(sz);
|
||||
|
||||
if (DialogBox(hinstance, TEXT("HdSizeDlg"), hdlg, hdsize_dlgproc) == 1)
|
||||
{
|
||||
|
|
@ -656,9 +763,7 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
|
|||
fseeko64(f, -1, SEEK_END);
|
||||
sz = ftello64(f) + 1;
|
||||
fclose(f);
|
||||
hd_new_spt = 63;
|
||||
hd_new_hpc = 16;
|
||||
hd_new_cyl = ((sz / 512) / 16) / 63;
|
||||
check_hd_type(sz);
|
||||
|
||||
if (DialogBox(hinstance, TEXT("HdSizeDlg"), hdlg, hdsize_dlgproc) == 1)
|
||||
{
|
||||
|
|
@ -793,5 +898,8 @@ static BOOL CALLBACK hdconf_dlgproc(HWND hdlg, UINT message, WPARAM wParam, LPAR
|
|||
|
||||
void hdconf_open(HWND hwnd)
|
||||
{
|
||||
DialogBox(hinstance, TEXT("HdConfDlg"), hwnd, hdconf_dlgproc);
|
||||
if (hdd_controller_current_is_mfm())
|
||||
DialogBox(hinstance, TEXT("HdConfDlgMfm"), hwnd, hdconf_dlgproc);
|
||||
else
|
||||
DialogBox(hinstance, TEXT("HdConfDlg"), hwnd, hdconf_dlgproc);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue