From 68310129fe648dd82d3b48c9ff4fadfeaec7e6b5 Mon Sep 17 00:00:00 2001 From: cebix <> Date: Thu, 24 May 2001 14:31:07 +0000 Subject: [PATCH] - AmigaOS: SCSI buffer memory type can be selected via prefs --- BasiliskII/ChangeLog | 1 + BasiliskII/README | 13 +++ BasiliskII/src/AmigaOS/prefs_amiga.cpp | 2 + BasiliskII/src/AmigaOS/prefs_editor_amiga.cpp | 83 ++++++++++++------- BasiliskII/src/AmigaOS/scsi_amiga.cpp | 20 ++++- BasiliskII/src/AmigaOS/user_strings_amiga.cpp | 9 +- BasiliskII/src/AmigaOS/user_strings_amiga.h | 7 +- 7 files changed, 99 insertions(+), 36 deletions(-) diff --git a/BasiliskII/ChangeLog b/BasiliskII/ChangeLog index 37c65498..d5e74ce3 100644 --- a/BasiliskII/ChangeLog +++ b/BasiliskII/ChangeLog @@ -15,6 +15,7 @@ V0.9 - - Unix: ether_linux.cpp moved and renamed to ether_unix.cpp, now also works with the tap driver under FreeBSD [Michael Alyn Miller] - BeOS: fixed some bugs in the extfs file types handling + - AmigaOS: SCSI buffer type can be selected V0.9 (snapshot) - 17.Feb.2001 - adapted for mon V3.0 which is now the required minimum diff --git a/BasiliskII/README b/BasiliskII/README index e270a8bd..c08d69c2 100644 --- a/BasiliskII/README +++ b/BasiliskII/README @@ -508,6 +508,19 @@ AmigaOS: ahi/ + scsimemtype + + This item controls the type of memory to use for SCSI buffers. Possible + values are: + 0 Chip memory + 1 24-bit DMA capable memory + 2 Any memory + + Be warned that many SCSI host adapters will not work with the "Any memory" + setting. Basilisk II has no way of knowing which memory type is supported + by the host adapter and setting an unsupported type will result in data + corruption. + Windows: noscsi <"true" or "false"> diff --git a/BasiliskII/src/AmigaOS/prefs_amiga.cpp b/BasiliskII/src/AmigaOS/prefs_amiga.cpp index 28e1ab3f..55463432 100644 --- a/BasiliskII/src/AmigaOS/prefs_amiga.cpp +++ b/BasiliskII/src/AmigaOS/prefs_amiga.cpp @@ -27,6 +27,7 @@ // Platform-specific preferences items prefs_desc platform_prefs_items[] = { {"sound", TYPE_STRING, false, "sound output mode description"}, + {"scsimemtype", TYPE_INT32, false, "SCSI buffer memory type"}, {NULL, TYPE_END, false, NULL} // End of list }; @@ -84,4 +85,5 @@ void SavePrefs(void) void AddPlatformPrefsDefaults(void) { PrefsReplaceString("extfs", "WORK:"); + PrefsAddInt32("scsimemtype", 0); } diff --git a/BasiliskII/src/AmigaOS/prefs_editor_amiga.cpp b/BasiliskII/src/AmigaOS/prefs_editor_amiga.cpp index a65a0408..3fc3d5e9 100644 --- a/BasiliskII/src/AmigaOS/prefs_editor_amiga.cpp +++ b/BasiliskII/src/AmigaOS/prefs_editor_amiga.cpp @@ -94,6 +94,7 @@ const int GAD_SCSI3_UNIT = 0x0413; const int GAD_SCSI4_UNIT = 0x0414; const int GAD_SCSI5_UNIT = 0x0415; const int GAD_SCSI6_UNIT = 0x0416; +const int GAD_SCSI_MEMTYPE = 0x0420; const int GAD_VIDEO_TYPE = 0x0500; // "Graphics/Sound" pane const int GAD_DISPLAY_X = 0x0501; @@ -362,6 +363,10 @@ bool PrefsEditor(void) } break; + case GAD_SCSI_MEMTYPE: + PrefsReplaceInt32("scsimemtype", code); + break; + case GAD_VIDEO_TYPE: ghost_graphics_gadgets(h); break; @@ -1087,6 +1092,7 @@ static void create_volumes_pane(struct LayoutHandle *h) static char scsi_dev[6][256]; static LONG scsi_unit[6]; +static LONG scsi_memtype; // Read SCSI preferences static void parse_scsi_prefs(void) @@ -1101,6 +1107,8 @@ static void parse_scsi_prefs(void) if (str) sscanf(str, "%[^/]/%ld", scsi_dev[i], &scsi_unit[i]); } + + scsi_memtype = PrefsFindInt32("scsimemtype"); } // Read settings from gadgets and set preferences @@ -1125,32 +1133,47 @@ static void create_scsi_pane(struct LayoutHandle *h) parse_scsi_prefs(); VGROUP; - for (int i=0; i<7; i++) { - HGROUP; - LT_New(h, LA_Type, TEXT_KIND, - LA_LabelID, STR_SCSI_ID_0 + i, - TAG_END - ); - LT_New(h, LA_Type, STRING_KIND, - LA_LabelID, STR_DEVICE_CTRL, - LA_ID, GAD_SCSI0_DEVICE + i, - LA_Chars, 20, - LA_STRPTR, (ULONG)scsi_dev[i], - GTST_MaxChars, sizeof(scsi_dev[i]) - 1, - LAST_Picker, TRUE, - TAG_END - ); - LT_New(h, LA_Type, INTEGER_KIND, - LA_LabelID, STR_UNIT_CTRL, - LA_ID, GAD_SCSI0_UNIT + i, - LA_Chars, 4, - LA_LONG, (ULONG)&scsi_unit[i], - LAIN_UseIncrementers, TRUE, - GTIN_MaxChars, 8, - TAG_END - ); - ENDGROUP; - } + LT_New(h, LA_Type, VERTICAL_KIND, + LA_LabelID, STR_SCSI_DEVICES_CTRL, + TAG_END + ); + for (int i=0; i<7; i++) { + HGROUP; + LT_New(h, LA_Type, TEXT_KIND, + LA_LabelID, STR_SCSI_ID_0 + i, + TAG_END + ); + LT_New(h, LA_Type, STRING_KIND, + LA_LabelID, STR_DEVICE_CTRL, + LA_ID, GAD_SCSI0_DEVICE + i, + LA_Chars, 20, + LA_STRPTR, (ULONG)scsi_dev[i], + GTST_MaxChars, sizeof(scsi_dev[i]) - 1, + LAST_Picker, TRUE, + TAG_END + ); + LT_New(h, LA_Type, INTEGER_KIND, + LA_LabelID, STR_UNIT_CTRL, + LA_ID, GAD_SCSI0_UNIT + i, + LA_Chars, 4, + LA_LONG, (ULONG)&scsi_unit[i], + LAIN_UseIncrementers, TRUE, + GTIN_MaxChars, 8, + TAG_END + ); + ENDGROUP; + } + ENDGROUP; + VGROUP; + LT_New(h, LA_Type, CYCLE_KIND, + LA_LabelID, STR_SCSI_MEMTYPE_CTRL, + LA_ID, GAD_SCSI_MEMTYPE, + LACY_FirstLabel, STR_MEMTYPE_CHIP_LAB, + LACY_LastLabel, STR_MEMTYPE_ANY_LAB, + LA_LONG, (ULONG)&scsi_memtype, + TAG_END + ); + ENDGROUP; ENDGROUP; } @@ -1166,7 +1189,7 @@ enum { DISPLAY_SCREEN }; -static BYTE display_type; +static LONG display_type; static LONG dis_width, dis_height; static ULONG mode_id; static BYTE frameskip_num; @@ -1210,9 +1233,9 @@ static void parse_graphics_prefs(void) const char *str = PrefsFindString("screen"); if (str) { - if (sscanf(str, "win/%d/%d", &dis_width, &dis_height) == 2) + if (sscanf(str, "win/%ld/%ld", &dis_width, &dis_height) == 2) display_type = DISPLAY_WINDOW; - else if (sscanf(str, "pip/%d/%d", &dis_width, &dis_height) == 2) + else if (sscanf(str, "pip/%ld/%ld", &dis_width, &dis_height) == 2) display_type = DISPLAY_PIP; else if (sscanf(str, "scr/%08lx", &mode_id) == 1) display_type = DISPLAY_SCREEN; @@ -1368,7 +1391,7 @@ static void create_graphics_pane(struct LayoutHandle *h) LA_LabelID, STR_VIDEO_TYPE_CTRL, LA_ID, GAD_VIDEO_TYPE, LACY_LabelTable, (ULONG)labels, - LA_BYTE, (ULONG)&display_type, + LA_LONG, (ULONG)&display_type, TAG_END ); LT_New(h, LA_Type, INTEGER_KIND, diff --git a/BasiliskII/src/AmigaOS/scsi_amiga.cpp b/BasiliskII/src/AmigaOS/scsi_amiga.cpp index fbf0dd32..35ae2ae6 100644 --- a/BasiliskII/src/AmigaOS/scsi_amiga.cpp +++ b/BasiliskII/src/AmigaOS/scsi_amiga.cpp @@ -44,6 +44,7 @@ static struct MsgPort *the_port = NULL; // Message port for device communication static ULONG buffer_size; // Size of data buffer static UBYTE *buffer = NULL; // Pointer to data buffer +static ULONG buffer_memf; // Buffer memory flags static UBYTE cmd_buffer[12]; // Buffer for SCSI command @@ -59,9 +60,22 @@ void SCSIInit(void) { int id, lun; + int memtype = PrefsFindInt32("scsimemtype"); + switch (memtype) { + case 1: + buffer_memf = MEMF_24BITDMA | MEMF_PUBLIC; + break; + case 2: + buffer_memf = MEMF_ANY | MEMF_PUBLIC; + break; + default: + buffer_memf = MEMF_CHIP | MEMF_PUBLIC; + break; + } + // Create port and buffers the_port = CreateMsgPort(); - buffer = (UBYTE *)AllocMem(buffer_size = 0x10000, MEMF_CHIP | MEMF_PUBLIC); + buffer = (UBYTE *)AllocMem(buffer_size = 0x10000, buffer_memf); sense_buffer = (UBYTE *)AllocMem(SENSE_LENGTH, MEMF_CHIP | MEMF_PUBLIC); if (the_port == NULL || buffer == NULL || sense_buffer == NULL) { ErrorAlert(GetString(STR_NO_MEM_ERR)); @@ -142,7 +156,7 @@ static bool try_buffer(int size) if (size <= buffer_size) return true; - UBYTE *new_buffer = (UBYTE *)AllocMem(size, MEMF_CHIP | MEMF_PUBLIC); + UBYTE *new_buffer = (UBYTE *)AllocMem(size, buffer_memf); if (new_buffer == NULL) return false; FreeMem(buffer, buffer_size); @@ -241,7 +255,7 @@ bool scsi_send_cmd(size_t data_length, bool reading, int sg_size, uint8 **sg_ptr } // Process S/G table when reading - if (res == 0) { + if (reading && res == 0) { D(bug(" reading from buffer\n")); uint8 *buffer_ptr = buffer; for (int i=0; i