diff --git a/.ci/AppImageBuilder.yml b/.ci/AppImageBuilder.yml index 08d7be1ae..61bbcba95 100644 --- a/.ci/AppImageBuilder.yml +++ b/.ci/AppImageBuilder.yml @@ -46,11 +46,6 @@ AppDir: - libedit2 # if (CLI:BOOL=ON|QT:BOOL=OFF) - libevdev2 # if QT:BOOL=ON - libfreetype6 - - libgbm1 # if QT:BOOL=ON - - libgl1 # if QT:BOOL=ON - - libgles2 # if QT:BOOL=ON - - libglvnd0 # if QT:BOOL=ON - - libglx0 # if QT:BOOL=ON - libgomp1 - libgs9 - libpng16-16 diff --git a/README.md b/README.md index 736e66779..4a2487829 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,14 @@ We operate an IRC channel and a Discord server for discussing 86Box, its develop [![Visit our Discord server](https://discordapp.com/api/guilds/262614059009048590/embed.png)](https://discord.gg/QXK9XTv) +[Forum: SoftHistory](https://forum.softhistory.org/) + +[Wiki: SoftHistory](https://wiki.softhistory.org/) + +[Twitter: @86BoxEmulator](https://twitter.com/86BoxEmulator) + +[YouTube: 86Box](https://youtube.com/c/86Box) + Contributions ------------- @@ -77,6 +85,5 @@ Donations We do not charge you for the emulator but donations are still welcome: . - You can also support the project on Patreon: . diff --git a/src/86box.c b/src/86box.c index 16f4851ad..036893d48 100644 --- a/src/86box.c +++ b/src/86box.c @@ -272,9 +272,29 @@ struct accelKey def_acc_keys[NUM_ACCELS] = { }, { .name="screenshot", - .desc="Screenshot", + .desc="Take screenshot", .seq="Ctrl+F11" }, + { + .name="raw_screenshot", + .desc="Take raw screenshot", + .seq="" + }, + { + .name="copy_screenshot", + .desc="Copy screenshot", + .seq="" + }, + { + .name="copy_raw_screenshot", + .desc="Copy raw screenshot", + .seq="" + }, + { + .name="fast_forward", + .desc="Fast forward", + .seq="Ctrl+Alt+F" + }, { .name="release_mouse", .desc="Release mouse pointer", @@ -1579,12 +1599,22 @@ pc_send_cae(void) extern void softresetx86(void); extern void hardresetx86(void); + extern void biu_set_bus_cycle(int bus_cycle); + extern void biu_set_bus_state(int bus_state); + extern void biu_set_bus_next_state(int bus_next_state); + extern void biu_set_cycle_t1(void); + extern void biu_set_next_cycle(void); + extern int biu_get_bus_cycle(void); + extern int biu_get_bus_state(void); + extern int biu_get_bus_next_state(void); extern void prefetch_queue_set_pos(int pos); extern void prefetch_queue_set_ip(uint16_t ip); - extern void prefetch_queue_set_prefetching(int p); + extern void prefetch_queue_set_in(uint16_t in); + extern void prefetch_queue_set_suspended(int p); extern int prefetch_queue_get_pos(void); extern uint16_t prefetch_queue_get_ip(void); - extern int prefetch_queue_get_prefetching(void); + extern uint16_t prefetch_queue_get_in(void); + extern int prefetch_queue_get_suspended(void); extern int prefetch_queue_get_size(void); */ static void diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 7c389c368..4b50879eb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -134,6 +134,7 @@ target_link_libraries(86Box scsi sio snd + mdsx_dll utils vid voodoo diff --git a/src/cdrom/cdrom_image.c b/src/cdrom/cdrom_image.c index 6452868ab..fdde47251 100644 --- a/src/cdrom/cdrom_image.c +++ b/src/cdrom/cdrom_image.c @@ -27,12 +27,14 @@ #include #include #include +#include #include #ifndef _WIN32 # include #endif #include <86box/86box.h> #include <86box/log.h> +#include <86box/nvr.h> #include <86box/path.h> #include <86box/plat.h> #include <86box/cdrom.h> @@ -41,11 +43,21 @@ #include +#ifdef ENABLE_IMAGE_LOG +#define LOG_VAR(a) size_t a = +#else +#define LOG_VAR(a) +#endif + +#define NO_CHIPHER_IDS_ENUM +#include "../utils/mds.h" + #define MAX_LINE_LENGTH 512 #define MAX_FILENAME_LENGTH 256 #define CROSS_LEN 512 static char temp_keyword[1024]; +static char temp_file[260] = { 0 }; #define INDEX_SPECIAL -2 /* Track A0h onwards. */ #define INDEX_NONE -1 /* Empty block. */ @@ -138,12 +150,6 @@ typedef enum MODE2_FORM2 = 0xad /* sector size = 2324 (+4) */ } mds_trk_mode_t; -typedef enum -{ - NONE = 0x00, /* no subchannel */ - PW_INTERLEAVED = 0x08 /* 96-byte PW subchannel, interleaved */ -} mds_subch_mode_t; - #pragma pack(push, 1) typedef struct { @@ -175,6 +181,20 @@ typedef struct uint32_t trk_blocks_offs; } mds_sess_block_t; /* 24 bytes */ +/* MDF v2.01 session block. */ +typedef struct +{ + int64_t sess_start; + uint16_t sess_id; + uint8_t all_blocks_num; + uint8_t non_track_blocks_num; + uint16_t first_trk; + uint16_t last_trk; + uint32_t pad; + uint32_t trk_blocks_offs; + int64_t sess_end; +} mds_v2_sess_block_t; /* 24 bytes */ + typedef struct { uint8_t trk_mode; @@ -199,7 +219,13 @@ typedef struct uint64_t start_offs; uint32_t files_num; uint32_t footer_offs; - uint8_t pad1[24]; + union { + uint8_t pad1[24]; + struct { + uint64_t start_sect_v2; + uint8_t pad2[16]; + }; + }; } mds_trk_block_t; /* 80 bytes */ /* @@ -220,6 +246,17 @@ typedef struct uint32_t pad0; } mds_footer_t; /* 16 bytes */ +/* MDF v2.01 track footer block. */ +typedef struct +{ + uint32_t fn_offs; + uint32_t pad; /* Always wide */ + uint32_t pad0; + uint32_t pad1; + uint64_t trk_sectors; + uint64_t pad2; +} mds_v2_footer_t; /* 16 bytes */ + typedef struct { uint32_t type; @@ -1942,6 +1979,191 @@ long int utf16_to_utf8(const uint16_t *u16_str, size_t u16_str_len, return (long int)j; } +int +mds_decrypt_track_data(cd_image_t *img, const char *mdsfile, FILE **fp) +{ + int is_mdx = 0; + + uint64_t mdx_offset = 0ULL; + uint64_t mdx_size_1 = 0ULL; + + if (*fp == NULL) { +#ifdef ENABLE_IMAGE_LOG + log_warning(img->log, " [MDS ] \"%s\" is not open\n", + mdsfile); +#else + warning("\"%s\" is not open\n", mdsfile); +#endif + return 0; + } + + image_log(img->log, "mds_decrypt_track_data(): Decrypting MDS...\n"); + /* + If we are here, them we have already determined in + image_load_mds() that the version is 2.x. + */ + fseek(*fp, 0x2c, SEEK_SET); + + uint64_t offset = 0ULL; + fread(&offset, 1, 4, *fp); + image_log(img->log, "mds_decrypt_track_data(): Offset is %016" PRIX64 "\n", offset); + + if (offset == 0xffffffff) { + image_log(img->log, "mds_decrypt_track_data(): File is MDX\n"); + is_mdx = 1; + + fread(&mdx_offset, 1, 8, *fp); + fread(&mdx_size_1, 1, 8, *fp); + image_log(img->log, "mds_decrypt_track_data(): MDX footer is %" PRIi64 " bytes at offset %016" PRIX64 "\n", mdx_size_1, mdx_offset); + + offset = mdx_offset + (mdx_size_1 - 0x40); + image_log(img->log, "mds_decrypt_track_data(): MDX offset is %016" PRIX64 "\n", offset); + } + + fseek(*fp, offset, SEEK_SET); + + uint8_t data1[0x200]; + + fread(data1, 0x200, 1, *fp); + image_log(img->log, "mds_decrypt_track_data(): Read the first data buffer\n"); + + PCRYPTO_INFO ci; + decode1(data1, NULL, &ci); + image_log(img->log, "data1: %02X %02X %02X %02X\n", data1[0], data1[1], data1[2], data1[3]); + FILE *d1f = fopen("data1.tmp", "wb"); + fwrite(data1, 1, 0x200, d1f); + fclose(d1f); + image_log(img->log, "mds_decrypt_track_data(): Decoded the first data buffer\n"); + + /* Compressed size at 0x150? */ + uint32_t decSize = getU32(data1 + 0x154); /* Decompressed size? */ + image_log(img->log, "mds_decrypt_track_data(): Decompressed size is %i bytes\n", decSize); + + uint64_t data2Offset = 0x30; /* For MDS v2. */ + uint64_t data2Size = offset - 0x30; /* For MDS v2. */ + + if (is_mdx) { + data2Offset = mdx_offset; + data2Size = mdx_size_1 - 0x40; + } + image_log(img->log, "mds_decrypt_track_data(): Second data buffer is %" PRIi64 " bytes at offset %016" PRIX64 "\n", data2Size, data2Offset); + + fseek(*fp, data2Offset, SEEK_SET); + + u8 *data2 = (u8 *)malloc(data2Size); + fread(data2, 1, data2Size, *fp); + image_log(img->log, "mds_decrypt_track_data(): Read the second data buffer\n"); + + DecryptBlock(data2, data2Size, 0, 0, 4, ci); + image_log(img->log, "mds_decrypt_track_data(): Decoded the second data buffer\n"); + + u8 *mdxHeader = (u8 *)malloc(decSize + 0x12); + + z_stream infstream; + infstream.zalloc = Z_NULL; + infstream.zfree = Z_NULL; + infstream.opaque = Z_NULL; + infstream.avail_in = data2Size; + infstream.next_in = data2; + infstream.avail_out = decSize; + infstream.next_out = mdxHeader + 0x12; + + inflateInit(&infstream); + + inflate(&infstream, Z_NO_FLUSH); + inflateEnd(&infstream); + + fseek(*fp, 0, SEEK_SET); + fread(mdxHeader, 1, 0x12, *fp); + + u8 medium_type = getU8(mdxHeader + offsetof(MDX_Header, medium_type)); + int isDVD = 1; + + if (medium_type < 3) // 0, 1, 2 + isDVD = 0; + + Decoder encryptInfo; + encryptInfo.mode = -1; + encryptInfo.ctr = 1; + + u32 keyBlockOff = getU32(mdxHeader + offsetof(MDX_Header, encryption_block_offset)); + + if (keyBlockOff) { + image_log(img->log, "Encryption detected\n"); + + const char *password = NULL; + + image_log(img->log, "Trying without password\n"); + + PCRYPTO_INFO ci2; +#ifdef ENABLE_IMAGE_LOG + if (decode1(mdxHeader + keyBlockOff, password, &ci2) == 0) { + if (password) + image_log(img->log, "Password \"%s\": OK\n", password); + else + image_log(img->log, "It's encrypted with NULL password. OK!\n"); + } else { + if (password) + image_log(img->log, "Password \"%s\": WRONG\n", password); + else + image_log(img->log, "Please specify password. Seems it's necessery.\n"); + + image_log(img->log, "But we save header_not_decrypted.out with encrypted key block\n"); +#else + if (decode1(mdxHeader + keyBlockOff, password, &ci2) != 0) { +#endif + +#if 0 + FILE *b = fopen("header_not_decrypted.out", "wb"); + fwrite(mdxHeader, 1, decSize + 0x12, b); + fclose(b); +#else +#ifdef ENABLE_IMAGE_LOG + log_warning(img->log, " [MDS ] \"%s\" is an unsupported password-protected file\n", + mdsfile); +#else + warning("\"%s\" is an unsupported password-protected file\n", mdsfile); +#endif + fclose(*fp); + *fp = NULL; +#endif + + return 0; + } + + /* + Seems it's always use one mode AES 256 with GF. */ + encryptInfo.bsize = 32; + encryptInfo.mode = 2; + + u8 *keyblock = mdxHeader + keyBlockOff; + memcpy(encryptInfo.dg, keyblock + 0x50, 0x20); + Gf128Tab64Init(keyblock + 0x50, &encryptInfo.gf_ctx); + aes_encrypt_key(keyblock + 0x70, encryptInfo.bsize, &encryptInfo.encr); + aes_decrypt_key(keyblock + 0x70, encryptInfo.bsize, &encryptInfo.decr); + } else + image_log(img->log, "No encryption detected\n"); + + fclose(*fp); + *fp = NULL; + + /* Dump mdxHeader */ + plat_tempfile(temp_file, "mds_v2", ".tmp"); + image_log(img->log, "\nDumping header into %s... ", nvr_path(temp_file)); + + *fp = plat_fopen64(nvr_path(temp_file), "wb"); + fwrite(mdxHeader, 1, decSize + 0x12, *fp); + fclose(*fp); + + fclose(*fp); + *fp = NULL; + + *fp = plat_fopen64(nvr_path(temp_file), "rb"); + + image_log(img->log, "Done\n"); + return isDVD + 1; +} + static int image_load_mds(cd_image_t *img, const char *mdsfile) { @@ -1949,6 +2171,7 @@ image_load_mds(cd_image_t *img, const char *mdsfile) track_index_t *ci = NULL; track_file_t *tf = NULL; int is_viso = 0; + int version = 1; int last_t = -1; int error; char pathname[MAX_FILENAME_LENGTH]; @@ -1956,9 +2179,11 @@ image_load_mds(cd_image_t *img, const char *mdsfile) mds_hdr_t mds_hdr = { 0 }; mds_sess_block_t mds_sess_block = { 0 }; + mds_v2_sess_block_t mds_v2_sess_block = { 0 }; mds_trk_block_t mds_trk_block = { 0 }; mds_trk_ex_block_t mds_trk_ex_block = { 0 }; mds_footer_t mds_footer = { 0 }; + mds_v2_footer_t mds_v2_footer = { 0 }; mds_dpm_block_t mds_dpm_block = { 0 }; uint32_t mds_dpm_blocks_num = 0x00000000; uint32_t mds_dpm_block_offs = 0x00000000; @@ -1990,27 +2215,56 @@ image_load_mds(cd_image_t *img, const char *mdsfile) if (memcmp(mds_hdr.file_sig, "MEDIA DESCRIPTOR", 16)) { #ifdef ENABLE_IMAGE_LOG - log_warning(img->log, " [MDS ] \"%s\"\n is not an actual MDF file", + log_warning(img->log, " [MDS ] \"%s\" is not an actual MDF file\n", mdsfile); #else - warning("\"%s\"\n is not an actual MDF file", mdsfile); + warning("\"%s\" is not an actual MDF file\n", mdsfile); #endif fclose(fp); return 0; } if (mds_hdr.file_ver[0] == 0x02) { + int mdsx = mdsx_init(); + if (!mdsx) { #ifdef ENABLE_IMAGE_LOG - log_warning(img->log, " [MDS ] \"%s\" is a Daemon Tools encrypted MDS which is not supported\n", - mdsfile); + log_warning(img->log, " [MDS ] Error initializing dynamic library %s\n", mdsfile); #else - warning("\"%s\" is a Daemon Tools encrypted MDS which is not supported\n", mdsfile); + warning("Error initializing dynamic library %s\n", mdsfile); #endif - fclose(fp); - return 0; - } + if (fp != NULL) + fclose(fp); + return 0; + } - img->is_dvd = (mds_hdr.medium_type >= 0x10); + image_log(img->log, "Pass 1.5 (decrypting the Media Descriptor Sheet)...\n"); + + fseek(fp, 0, SEEK_SET); + int ret = mds_decrypt_track_data(img, mdsfile, &fp); + + mdsx_close(); + + if (ret == 0) { +#ifdef ENABLE_IMAGE_LOG + log_warning(img->log, " [MDS ] Error decrypting \"%s\"\n", + mdsfile); +#else + warning("Error decrypting \"%s\"\n", mdsfile); +#endif + if (fp != NULL) + fclose(fp); + return 0; + } else { + img->is_dvd = ret - 1; + version = 2; + + fseek(fp, 0, SEEK_SET); + if (fread(&mds_hdr, 1, sizeof(mds_hdr_t), fp) != sizeof(mds_hdr_t)) + return 0; + } + image_log(img->log, "ret = %i\n", ret); + } else + img->is_dvd = (mds_hdr.medium_type >= 0x10); if (img->is_dvd) { if (mds_hdr.disc_struct_offs != 0x00) { @@ -2056,17 +2310,23 @@ image_load_mds(cd_image_t *img, const char *mdsfile) if (mds_hdr.dpm_blocks_offs != 0x00) { fseek(fp, mds_hdr.dpm_blocks_offs, SEEK_SET); - if (fread(&mds_dpm_blocks_num, 1, sizeof(uint32_t), fp) != sizeof(uint32_t)) + if (LOG_VAR(dbnret) fread(&mds_dpm_blocks_num, 1, sizeof(uint32_t), fp) != sizeof(uint32_t)) { + image_log(img->log, "dbnret = %i (expected: %i)\n", (int) dbnret, (int) sizeof(uint32_t)); return 0; + } if (mds_dpm_blocks_num > 0) for (int b = 0; b < mds_dpm_blocks_num; b++) { fseek(fp, mds_hdr.dpm_blocks_offs + 4 + (b * 4), SEEK_SET); - if (fread(&mds_dpm_block_offs, 1, sizeof(uint32_t), fp) != sizeof(uint32_t)) + if (LOG_VAR(dboret) fread(&mds_dpm_block_offs, 1, sizeof(uint32_t), fp) != sizeof(uint32_t)) { + image_log(img->log, "dboret = %i (expected: %i)\n", (int) dboret, (int) sizeof(uint32_t)); return 0; + } fseek(fp, mds_dpm_block_offs, SEEK_SET); - if (fread(&mds_dpm_block, 1, sizeof(mds_dpm_block_t), fp) != sizeof(mds_dpm_block_t)) + if (LOG_VAR(dbret) fread(&mds_dpm_block, 1, sizeof(mds_dpm_block_t), fp) != sizeof(mds_dpm_block_t)) { + image_log(img->log, "dbret = %i (expected: %i)\n", (int) dbret, (int) sizeof(mds_dpm_block_t)); return 0; + } /* We currently only support the bad sectors block and not (yet) actual DPM. */ if (mds_dpm_block.type == 0x00000002) { @@ -2075,22 +2335,44 @@ image_load_mds(cd_image_t *img, const char *mdsfile) img->bad_sectors = (uint32_t *) malloc(img->bad_sectors_num * sizeof(uint32_t)); fseek(fp, mds_dpm_block_offs + sizeof(mds_dpm_block_t), SEEK_SET); int read_size = img->bad_sectors_num * sizeof(uint32_t); - if (fread(img->bad_sectors, 1, read_size, fp) != read_size) + if (LOG_VAR(dbtret) fread(img->bad_sectors, 1, read_size, fp) != read_size) { + image_log(img->log, "dbtret = %i (expected: %i)\n", (int) dbtret, (int) read_size); return 0; + } break; } } } for (int s = 0; s < mds_hdr.sess_num; s++) { - fseek(fp, mds_hdr.sess_blocks_offs + (s * sizeof(mds_sess_block_t)), SEEK_SET); - if (fread(&mds_sess_block, 1, sizeof(mds_sess_block_t), fp) != sizeof(mds_sess_block_t)) - return 0; + if (version == 2) { + fseek(fp, mds_hdr.sess_blocks_offs + (s * sizeof(mds_v2_sess_block_t)), SEEK_SET); + if (LOG_VAR(hret) fread(&mds_v2_sess_block, 1, sizeof(mds_v2_sess_block_t), fp) != sizeof(mds_v2_sess_block_t)) { + image_log(img->log, "hret = %i (expected: %i)\n", (int) hret, (int) sizeof(mds_v2_sess_block_t)); + return 0; + } + memcpy(&mds_sess_block, &mds_v2_sess_block, sizeof(mds_sess_block_t)); + mds_sess_block.sess_start = (int32_t) mds_v2_sess_block.sess_start; + mds_sess_block.sess_end = (int32_t) mds_v2_sess_block.sess_end; + } else { + fseek(fp, mds_hdr.sess_blocks_offs + (s * sizeof(mds_sess_block_t)), SEEK_SET); + if (LOG_VAR(hret2) fread(&mds_sess_block, 1, sizeof(mds_sess_block_t), fp) != sizeof(mds_sess_block_t)) { + image_log(img->log, "hret2 = %i (expected: %i)\n", (int) hret2, (int) sizeof(mds_sess_block_t)); + return 0; + } + } for (int t = 0; t < mds_sess_block.all_blocks_num; t++) { fseek(fp, mds_sess_block.trk_blocks_offs + (t * sizeof(mds_trk_block_t)), SEEK_SET); - if (fread(&mds_trk_block, 1, sizeof(mds_trk_block_t), fp) != sizeof(mds_trk_block_t)) + if (LOG_VAR(tbret) fread(&mds_trk_block, 1, sizeof(mds_trk_block_t), fp) != sizeof(mds_trk_block_t)) { + image_log(img->log, "tbret = %i (expected: %i)\n", (int) tbret, (int) sizeof(mds_trk_block)); return 0; + } + + if (version == 2) { + image_log(img->log, "Start sector V2: %016" PRIX64 "\n", mds_trk_block.start_sect_v2); + mds_trk_block.start_sect = (uint32_t) mds_trk_block.start_sect_v2; + } if (last_t != -1) { /* @@ -2117,8 +2399,10 @@ image_load_mds(cd_image_t *img, const char *mdsfile) mds_trk_ex_block.trk_sectors = mds_trk_block.ex_offs; } else if (mds_trk_block.ex_offs != 0ULL) { fseek(fp, mds_trk_block.ex_offs, SEEK_SET); - if (fread(&mds_trk_ex_block, 1, sizeof(mds_trk_ex_block), fp) != sizeof(mds_trk_ex_block)) + if (LOG_VAR(tret) fread(&mds_trk_ex_block, 1, sizeof(mds_trk_ex_block), fp) != sizeof(mds_trk_ex_block)) { + image_log(img->log, "tret = %i (expected: %i)\n", (int) tret, (int) sizeof(mds_trk_ex_block)); return 0; + } } uint32_t astart = mds_trk_block.start_sect - mds_trk_ex_block.pregap; @@ -2126,35 +2410,61 @@ image_load_mds(cd_image_t *img, const char *mdsfile) uint32_t aend2 = aend + mds_trk_ex_block.trk_sectors; uint32_t astart2 = mds_trk_block.start_sect + mds_trk_ex_block.trk_sectors; + ct->skip = 0; + if (mds_trk_block.footer_offs != 0ULL) for (uint32_t ff = 0; ff < mds_trk_block.files_num; ff++) { - fseek(fp, mds_trk_block.footer_offs + (ff * sizeof(mds_footer_t)), SEEK_SET); - if (fread(&mds_footer, 1, sizeof(mds_footer_t), fp) != sizeof(mds_footer_t)) - return 0; + if (version == 2) { + fseek(fp, mds_trk_block.footer_offs + (ff * sizeof(mds_v2_footer_t)), SEEK_SET); + if (LOG_VAR(fret) fread(&mds_v2_footer, 1, sizeof(mds_v2_footer_t), fp) != sizeof(mds_v2_footer_t)) { + image_log(img->log, "fret = %i (expected: %i)\n", (int) fret, (int) sizeof(mds_v2_footer_t)); + return 0; + } + memcpy(&mds_footer, &mds_v2_footer, sizeof(mds_footer)); + mds_footer.fn_is_wide = 1; + } else { + fseek(fp, mds_trk_block.footer_offs + (ff * sizeof(mds_footer_t)), SEEK_SET); + if (LOG_VAR(fret2) fread(&mds_footer, 1, sizeof(mds_footer_t), fp) != sizeof(mds_footer_t)) { + image_log(img->log, "fret2 = %i (expected: %i)\n", (int) fret2, (int) sizeof(mds_footer_t)); + return 0; + } + } uint16_t wfn[2048] = { 0 }; char fn[2048] = { 0 }; - fseek(fp, mds_footer.fn_offs, SEEK_SET); - if (mds_footer.fn_is_wide) { - for (int i = 0; i < 256; i++) { - if (fread(&(wfn[i]), 1, 2, fp) != 2) + + if (mds_footer.fn_offs == 0x00000000) { + /* This is in MDX files - the file name string is empty. */ + strcpy(fn, mdsfile); + ct->skip = 0x40; + } else { + fseek(fp, mds_footer.fn_offs, SEEK_SET); + if (mds_footer.fn_is_wide) { + for (int i = 0; i < 256; i++) { + if (LOG_VAR(fnret) fread(&(wfn[i]), 1, 2, fp) != 2) { + image_log(img->log, "fnret = %i (expected: %i)\n", (int) fnret, (int) 2); + return 0; + } + if (wfn[i] == 0x0000) + break; + } + (void) utf16_to_utf8(wfn, 2048, (uint8_t *) fn, 2048); + } else for (int i = 0; i < 512; i++) { + if (LOG_VAR(fnret2) fread(&fn[i], 1, 1, fp) != 1) { + image_log(img->log, "fnret2 = %i (expected: %i)\n", (int) fnret2, (int) 1); return 0; - if (wfn[i] == 0x0000) + } + if (fn[i] == 0x00) break; } - (void) utf16_to_utf8(wfn, 2048, (uint8_t *) fn, 2048); - } else for (int i = 0; i < 512; i++) { - if (fread(&fn[i], 1, 1, fp) != 1) - return 0; - if (fn[i] == 0x00) - break; - } - if (!stricmp(fn, "*.mdf")) { - strcpy(fn, mdsfile); - fn[strlen(mdsfile) - 3] = 'm'; - fn[strlen(mdsfile) - 2] = 'd'; - fn[strlen(mdsfile) - 1] = 'f'; + if (!stricmp(fn, "*.mdf")) { + strcpy(fn, mdsfile); + fn[strlen(mdsfile) - 3] = 'm'; + fn[strlen(mdsfile) - 2] = 'd'; + fn[strlen(mdsfile) - 1] = 'f'; + } } + image_log(img->log, "fn = \"%s\"\n", fn); char filename[2048] = { 0 }; if (!path_abs(fn)) @@ -2200,7 +2510,7 @@ image_load_mds(cd_image_t *img, const char *mdsfile) success = 1; if (((ct->sector_size == 2336) || (ct->sector_size == 2332)) && (ct->mode == 2) && (ct->form == 1)) - ct->skip = 8; + ct->skip += 8; ci = &(ct->idx[0]); if (ct->point < 0xa0) { @@ -2217,7 +2527,7 @@ image_load_mds(cd_image_t *img, const char *mdsfile) ci->start = aend + 150; ci->length = mds_trk_ex_block.trk_sectors; ci->type = INDEX_NORMAL; - ci->file_start = mds_trk_block.start_offs / ct->sector_size; + ci->file_start = (mds_trk_block.start_offs - (ct->skip & 0x40)) / ct->sector_size; ci->file_length = ci->length; ci->file = tf; } else { @@ -2653,6 +2963,11 @@ image_close(void *local) free(img->bad_sectors); free(img); + + if (temp_file[0] != 0x00) { + remove(temp_file); + temp_file[0] = 0x00; + } } } @@ -2681,7 +2996,8 @@ image_open(cdrom_t *dev, const char *path) if (img != NULL) { int ret; const int is_cue = ((ext == 4) && !stricmp(path + strlen(path) - ext + 1, "CUE")); - const int is_mds = ((ext == 4) && !stricmp(path + strlen(path) - ext + 1, "MDS")); + const int is_mds = ((ext == 4) && (!stricmp(path + strlen(path) - ext + 1, "MDS") || + !stricmp(path + strlen(path) - ext + 1, "MDX"))); char n[1024] = { 0 }; sprintf(n, "CD-ROM %i Image", dev->id + 1); diff --git a/src/chipset/intel_piix.c b/src/chipset/intel_piix.c index 32df44098..c6f6486d1 100644 --- a/src/chipset/intel_piix.c +++ b/src/chipset/intel_piix.c @@ -1580,7 +1580,10 @@ piix_init(const device_t *info) dev->usb = device_add(&usb_device); if (dev->type > 3) { - dev->nvr = device_add(&piix4_nvr_device); + if (!strcmp(machine_get_internal_name(), "ms5156")) + dev->nvr = device_add(&piix4_ami_1995_nvr_device); + else + dev->nvr = device_add(&piix4_nvr_device); dev->smbus = device_add(&piix4_smbus_device); dev->acpi = device_add(&acpi_intel_device); diff --git a/src/chipset/vl82c480.c b/src/chipset/vl82c480.c index 8015137e0..2ab17eadd 100644 --- a/src/chipset/vl82c480.c +++ b/src/chipset/vl82c480.c @@ -28,8 +28,6 @@ #include <86box/port_92.h> #include <86box/chipset.h> -#define machine_at_prolineamt_init NULL /* checks for a removed machine */ - typedef struct vl82c480_t { uint8_t idx; uint8_t regs[256]; @@ -133,7 +131,7 @@ vl82c480_write(uint16_t addr, uint8_t val, void *priv) case 0x02: case 0x03: dev->regs[dev->idx] = val; if ((machines[machine].init == machine_at_martin_init) || - (machines[machine].init == machine_at_prolineamt_init)) + (machines[machine].init == machine_at_monsoon_init)) vl82c480_recalc_banks(dev); break; case 0x04: @@ -220,9 +218,10 @@ vl82c480_init(const device_t *info) vl82c480_t *dev = (vl82c480_t *) calloc(1, sizeof(vl82c480_t)); uint32_t sizes[8] = { 0, 0, 1024, 2048, 4096, 8192, 16384, 32768 }; uint32_t ms = mem_size; - uint8_t min_i = (machines[machine].init == machine_at_prolineamt_init) ? 1 : 0; - uint8_t min_j = (machines[machine].init == machine_at_prolineamt_init) ? 4 : 2; - uint8_t max_j = (machines[machine].init == machine_at_prolineamt_init) ? 8 : 7; + uint8_t min_i = (machines[machine].init == machine_at_monsoon_init) ? 1 : 0; + uint8_t max_i = (machines[machine].init == machine_at_monsoon_init) ? 2 : 4; + uint8_t min_j = (machines[machine].init == machine_at_monsoon_init) ? 2 : 2; + uint8_t max_j = (machines[machine].init == machine_at_monsoon_init) ? 7 : 7; dev->regs[0x00] = info->local; dev->regs[0x01] = 0xff; @@ -233,15 +232,15 @@ vl82c480_init(const device_t *info) dev->regs[0x07] = 0x21; dev->regs[0x08] = 0x38; - if (machines[machine].init == machine_at_prolineamt_init) { - dev->banks[0] = 4096; - - /* Bank 0 is ignored if 64 MB is installed. */ - if (ms != 65536) - ms -= 4096; + if (machines[machine].init == machine_at_monsoon_init) { + if (ms >= 16384) { + dev->banks[0] = 0; + min_i = 0; + } else + dev->banks[0] = 4096; } - if (ms > 0) for (uint8_t i = min_i; i < 4; i++) { + if (ms > 0) for (uint8_t i = min_i; i < max_i; i++) { for (uint8_t j = min_j; j < max_j; j++) { if (ms >= sizes[j]) dev->banks[i] = sizes[j]; diff --git a/src/cpu/386.c b/src/cpu/386.c index ed4b40ab2..7c352ea19 100644 --- a/src/cpu/386.c +++ b/src/cpu/386.c @@ -237,7 +237,7 @@ exec386_2386(int32_t cycs) cycles += cycs; while (cycles > 0) { - cycle_period = (timer_target - (uint32_t) tsc) + 1; + cycle_period = (timer_target - (uint64_t) tsc) + 1; x86_was_reset = 0; cycdiff = 0; @@ -411,7 +411,7 @@ block_ended: fatal("Life expired\n"); } - if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t) tsc)) + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint64_t) tsc)) timer_process(); #ifdef USE_GDBSTUB diff --git a/src/cpu/386_dynarec.c b/src/cpu/386_dynarec.c index 260346572..25babbb79 100644 --- a/src/cpu/386_dynarec.c +++ b/src/cpu/386_dynarec.c @@ -280,7 +280,7 @@ update_tsc(void) tsc += cycdiff; if (cycdiff > 0) { - if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t) tsc)) + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint64_t) tsc)) timer_process(); } } @@ -879,7 +879,7 @@ exec386_dynarec(int32_t cycs) } if (cycdiff > 0) { - if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t) tsc)) + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint64_t) tsc)) timer_process(); } @@ -908,7 +908,7 @@ exec386(int32_t cycs) cycles += cycs; while (cycles > 0) { - cycle_period = (timer_target - (uint32_t) tsc) + 1; + cycle_period = (timer_target - (uint64_t) tsc) + 1; x86_was_reset = 0; cycdiff = 0; @@ -1092,7 +1092,7 @@ block_ended: fatal("Life expired\n"); } - if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t) tsc)) + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint64_t) tsc)) timer_process(); #ifdef USE_GDBSTUB diff --git a/src/cpu/808x.c b/src/cpu/808x.c index 14e56f23a..4e2e830d0 100644 --- a/src/cpu/808x.c +++ b/src/cpu/808x.c @@ -272,7 +272,7 @@ clock_end(void) /* On 808x systems, clock speed is usually crystal frequency divided by an integer. */ tsc += (uint64_t) diff * ((uint64_t) xt_cpu_multi >> 32ULL); /* Shift xt_cpu_multi by 32 bits to the right and then multiply. */ - if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint32_t) tsc)) + if (TIMER_VAL_LESS_THAN_VAL(timer_target, (uint64_t) tsc)) timer_process(); } diff --git a/src/device.c b/src/device.c index 98d4794cf..3ce49ee78 100644 --- a/src/device.c +++ b/src/device.c @@ -483,6 +483,61 @@ device_has_config(const device_t *dev) return (c > 0) ? 1 : 0; } +const char * +device_get_bus_name(const device_t *dev) +{ + const char *sbus = NULL; + + if ((dev->flags & (DEVICE_SIDECAR | DEVICE_ISA)) == (DEVICE_SIDECAR | DEVICE_ISA)) + sbus = "ISA/Sidecar"; + else if (dev->flags & DEVICE_SIDECAR) + sbus = "Sidecar"; + else if (dev->flags & DEVICE_XT_KBC) + sbus = "XT KBC"; + else if (dev->flags & DEVICE_ISA16) + sbus = "ISA16"; + else if (dev->flags & DEVICE_AT_KBC) + sbus = "AT KBC"; + else if (dev->flags & DEVICE_PS2_KBC) + sbus = "PS/2 KBC"; + else if (dev->flags & DEVICE_ISA) + sbus = "ISA"; + else if (dev->flags & DEVICE_CBUS) + sbus = "C-BUS"; + else if (dev->flags & DEVICE_PCMCIA) + sbus = "PCMCIA"; + else if (dev->flags & DEVICE_MCA) + sbus = "MCA"; + else if (dev->flags & DEVICE_MCA32) + sbus = "MCA32"; + else if (dev->flags & DEVICE_HIL) + sbus = "HP HIL"; + else if (dev->flags & DEVICE_EISA) + sbus = "EISA"; + else if (dev->flags & DEVICE_AT32) + sbus = "AT/32"; + else if (dev->flags & DEVICE_OLB) + sbus = "OLB"; + else if (dev->flags & DEVICE_VLB) + sbus = "VLB"; + else if (dev->flags & DEVICE_PCI) + sbus = "PCI"; + else if (dev->flags & DEVICE_CARDBUS) + sbus = "CardBus"; + else if (dev->flags & DEVICE_USB) + sbus = "USB"; + else if (dev->flags & DEVICE_AGP) + sbus = "AGP"; + else if (dev->flags & DEVICE_AC97) + sbus = "AMR"; + else if (dev->flags & DEVICE_COM) + sbus = "COM"; + else if (dev->flags & DEVICE_LPT) + sbus = "LPT"; + + return sbus; +} + void device_get_name(const device_t *dev, int bus, char *name) { @@ -497,59 +552,15 @@ device_get_name(const device_t *dev, int bus, char *name) name[0] = 0x00; if (bus) { - if ((dev->flags & (DEVICE_SIDECAR | DEVICE_ISA)) == - (DEVICE_SIDECAR | DEVICE_ISA)) - sbus = "ISA/Sidecar"; - else if (dev->flags & DEVICE_SIDECAR) - sbus = "Sidecar"; - else if (dev->flags & DEVICE_XT_KBC) - sbus = "XT KBC"; - else if (dev->flags & DEVICE_ISA16) - sbus = "ISA16"; - else if (dev->flags & DEVICE_AT_KBC) - sbus = "AT KBC"; - else if (dev->flags & DEVICE_PS2_KBC) - sbus = "PS/2 KBC"; - else if (dev->flags & DEVICE_ISA) - sbus = "ISA"; - else if (dev->flags & DEVICE_CBUS) - sbus = "C-BUS"; - else if (dev->flags & DEVICE_PCMCIA) - sbus = "PCMCIA"; - else if (dev->flags & DEVICE_MCA) - sbus = "MCA"; - else if (dev->flags & DEVICE_MCA32) - sbus = "MCA32"; - else if (dev->flags & DEVICE_HIL) - sbus = "HP HIL"; - else if (dev->flags & DEVICE_EISA) - sbus = "EISA"; - else if (dev->flags & DEVICE_AT32) - sbus = "AT/32"; - else if (dev->flags & DEVICE_OLB) - sbus = "OLB"; - else if (dev->flags & DEVICE_VLB) - sbus = "VLB"; - else if (dev->flags & DEVICE_PCI) - sbus = "PCI"; - else if (dev->flags & DEVICE_CARDBUS) - sbus = "CardBus"; - else if (dev->flags & DEVICE_USB) - sbus = "USB"; - else if (dev->flags & DEVICE_AGP) - sbus = "AGP"; - else if (dev->flags & DEVICE_AC97) - sbus = "AMR"; - else if (dev->flags & DEVICE_COM) - sbus = "COM"; - else if (dev->flags & DEVICE_LPT) - sbus = "LPT"; + sbus = device_get_bus_name(dev); if (sbus != NULL) { /* First concatenate [] before the device's name. */ - strcat(name, "["); - strcat(name, sbus); - strcat(name, "] "); + if (bus > 0) { + strcat(name, "["); + strcat(name, sbus); + strcat(name, "] "); + } /* Then change string from ISA16 to ISA if applicable. */ if (!strcmp(sbus, "ISA16")) diff --git a/src/device/keyboard_at.c b/src/device/keyboard_at.c index fd8d11503..21f06df03 100644 --- a/src/device/keyboard_at.c +++ b/src/device/keyboard_at.c @@ -305,7 +305,7 @@ const scancode scancode_set1_at[512] = { { .mk = { 0 }, .brk = { 0 } }, /* 0de */ { .mk = { 0 }, .brk = { 0 } }, /* 0df */ { .mk = { 0 }, .brk = { 0 } }, /* 0e0 */ - { .mk = { 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0xE1, 0 }, .brk = { 0 } }, /* 0e1 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e2 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e3 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e4 */ @@ -822,7 +822,7 @@ const scancode scancode_set2_at[512] = { { .mk = { 0 }, .brk = { 0 } }, /* 0de */ { .mk = { 0 }, .brk = { 0 } }, /* 0df */ { .mk = { 0 }, .brk = { 0 } }, /* 0e0 */ - { .mk = { 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0xE1, 0 }, .brk = { 0 } }, /* 0e1 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e2 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e3 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e4 */ @@ -1339,7 +1339,7 @@ const scancode scancode_set1_ax[512] = { { .mk = { 0 }, .brk = { 0 } }, /* 0de */ { .mk = { 0 }, .brk = { 0 } }, /* 0df */ { .mk = { 0 }, .brk = { 0 } }, /* 0e0 */ - { .mk = { 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0xE1, 0 }, .brk = { 0 } }, /* 0e1 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e2 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e3 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e4 */ @@ -1856,7 +1856,7 @@ const scancode scancode_set2_ax[512] = { { .mk = { 0 }, .brk = { 0 } }, /* 0de */ { .mk = { 0 }, .brk = { 0 } }, /* 0df */ { .mk = { 0 }, .brk = { 0 } }, /* 0e0 */ - { .mk = { 0 }, .brk = { 0 } }, /* 0e1 */ + { .mk = { 0xE1, 0 }, .brk = { 0 } }, /* 0e1 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e2 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e3 */ { .mk = { 0 }, .brk = { 0 } }, /* 0e4 */ diff --git a/src/device/mouse.c b/src/device/mouse.c index d4ef4c873..5cc94d116 100644 --- a/src/device/mouse.c +++ b/src/device/mouse.c @@ -34,6 +34,12 @@ #include <86box/plat.h> #include <86box/plat_unused.h> +#ifdef _WIN32 +#define WHEEL_DELTA 120 +#else +#define WHEEL_DELTA 1 +#endif + typedef struct mouse_t { const device_t *device; } mouse_t; @@ -510,16 +516,28 @@ mouse_subtract_z(int *delta_z, int min, int max, int invert) { int z = ATOMIC_LOAD(mouse_z); int real_z = invert ? -z : z; + min *= WHEEL_DELTA; + max *= WHEEL_DELTA; +#if WHEEL_DELTA > 1 + if ((real_z > -WHEEL_DELTA) && (real_z < WHEEL_DELTA)) { + *delta_z = 0; + return; + } else +#endif if (real_z > max) { - *delta_z = max; + *delta_z = max / WHEEL_DELTA; real_z -= max; } else if (real_z < min) { - *delta_z = min; + *delta_z = min / WHEEL_DELTA; real_z += ABS(min); } else { - *delta_z = real_z; + *delta_z = real_z / WHEEL_DELTA; +#if WHEEL_DELTA > 1 + real_z -= ((real_z / WHEEL_DELTA) * WHEEL_DELTA); +#else real_z = 0; +#endif } ATOMIC_STORE(mouse_z, invert ? -real_z : real_z); @@ -530,16 +548,28 @@ mouse_subtract_w(int *delta_w, int min, int max, int invert) { int w = ATOMIC_LOAD(mouse_w); int real_w = invert ? -w : w; + min *= WHEEL_DELTA; + max *= WHEEL_DELTA; +#if WHEEL_DELTA > 1 + if ((real_w > -WHEEL_DELTA) && (real_w < WHEEL_DELTA)) { + *delta_w = 0; + return; + } else +#endif if (real_w > max) { - *delta_w = max; + *delta_w = max / WHEEL_DELTA; real_w -= max; } else if (real_w < min) { - *delta_w = min; + *delta_w = min / WHEEL_DELTA; real_w += ABS(min); } else { - *delta_w = real_w; + *delta_w = real_w / WHEEL_DELTA; +#if WHEEL_DELTA > 1 + real_w -= ((real_w / WHEEL_DELTA) * WHEEL_DELTA); +#else real_w = 0; +#endif } ATOMIC_STORE(mouse_w, invert ? -real_w : real_w); diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index fb844da8f..7b2b76816 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -552,8 +552,8 @@ ide_hd_identify(const ide_t *ide) /* Serial Number */ ide_padstr((char *) (ide->buffer + 10), "", 20); /* Firmware */ - if (hdd[ide->hdd_num].version_ex) - ide_padstr((char *) (ide->buffer + 23), hdd[ide->hdd_num].version_ex, 8); + if (hdd[ide->hdd_num].version) + ide_padstr((char *) (ide->buffer + 23), hdd[ide->hdd_num].version, 8); else ide_padstr((char *) (ide->buffer + 23), EMU_VERSION_EX, 8); /* Model */ diff --git a/src/disk/hdd.c b/src/disk/hdd.c index bbbec0865..da4d703d8 100644 --- a/src/disk/hdd.c +++ b/src/disk/hdd.c @@ -313,7 +313,7 @@ hdd_timing_write(hard_disk_t *hdd, uint32_t addr, uint32_t len) } } - hdd->cache.write_start_time = tsc + (uint32_t) (seek_time * cpuclock / 1000000.0); + hdd->cache.write_start_time = tsc + (uint64_t) (seek_time * cpuclock / 1000000.0); return seek_time; } @@ -383,7 +383,7 @@ update_lru: cache->ra_ongoing = 1; cache->ra_segment = active_seg->id; - cache->ra_start_time = tsc + (uint32_t) (seek_time * cpuclock / 1000000.0); + cache->ra_start_time = tsc + (uint64_t) (seek_time * cpuclock / 1000000.0); return seek_time; } @@ -429,145 +429,145 @@ hdd_zones_init(hard_disk_t *hdd) static hdd_preset_t hdd_speed_presets[] = { // clang-format off - { .name = "[Generic] RAM Disk (max. speed)", .internal_name = "ramdisk", .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 }, - { .name = "[Generic] 1989 (3500 RPM)", .internal_name = "1989_3500rpm", .zones = 1, .avg_spt = 35, .heads = 2, .rpm = 3500, .full_stroke_ms = 40, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 16, .max_multiple = 8 }, - { .name = "[Generic] 1992 (3600 RPM)", .internal_name = "1992_3600rpm", .zones = 1, .avg_spt = 45, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 6, .rcache_num_seg = 4, .rcache_seg_size = 16, .max_multiple = 8 }, - { .name = "[Generic] 1994 (4500 RPM)", .internal_name = "1994_4500rpm", .zones = 8, .avg_spt = 80, .heads = 4, .rpm = 4500, .full_stroke_ms = 26, .track_seek_ms = 5, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 16 }, - { .name = "[Generic] 1996 (5400 RPM)", .internal_name = "1996_5400rpm", .zones = 16, .avg_spt = 135, .heads = 4, .rpm = 5400, .full_stroke_ms = 24, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, - { .name = "[Generic] 1997 (5400 RPM)", .internal_name = "1997_5400rpm", .zones = 16, .avg_spt = 185, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 32 }, - { .name = "[Generic] 1998 (5400 RPM)", .internal_name = "1998_5400rpm", .zones = 16, .avg_spt = 300, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 32 }, - { .name = "[Generic] 2000 (7200 RPM)", .internal_name = "2000_7200rpm", .zones = 16, .avg_spt = 350, .heads = 6, .rpm = 7200, .full_stroke_ms = 15, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 }, - { .name = "[PIO IDE] IBM WDA-L42", .internal_name = "WDAL42", .model = "WDA-L42", .zones = 1, .avg_spt = 85, .heads = 2, .rpm = 3600, .full_stroke_ms = 33, .track_seek_ms = 2.5, .rcache_num_seg = 1, .rcache_seg_size = 32, .max_multiple = 1 }, - { .name = "[PIO-2] IBM DSAA-3270", .internal_name = "DSAA3270", .model = "DSAA-3270", .zones = 8, .avg_spt = 268, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 2.1, .rcache_num_seg = 3, .rcache_seg_size = 32, .max_multiple = 8, .version_ex = "25505120" }, - { .name = "[ATA-1] Conner CP3024", .internal_name = "CP3024", .model = "Conner Peripherals 20MB - CP3024", .zones = 1, .avg_spt = 33, .heads = 2, .rpm = 3500, .full_stroke_ms = 50, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work - { .name = "[ATA-1] Conner CP3044", .internal_name = "CP3044", .model = "Conner Peripherals 40MB - CP3044", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3500, .full_stroke_ms = 50, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work - { .name = "[ATA-1] Conner CP3104", .internal_name = "CP3104", .model = "Conner Peripherals 104MB - CP3104", .zones = 1, .avg_spt = 33, .heads = 8, .rpm = 3500, .full_stroke_ms = 45, .track_seek_ms = 8, .rcache_num_seg = 4, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work - { .name = "[ATA-1] Conner CFS420A", .internal_name = "CFS420A", .model = "Conner Peripherals 420MB - CFS420A", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3600, .full_stroke_ms = 33, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 8 }, - { .name = "[ATA-1] HP Kittyhawk", .internal_name = "C3014A", .model = "HP C3014A", .zones = 6, .avg_spt = 80, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 16, .max_multiple = 8 }, - { .name = "[ATA-1] IBM H3256-A3", .internal_name = "H3256A3", .model = "H3256-A3", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3600, .full_stroke_ms = 32, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 8 }, - { .name = "[ATA-1] IBM H3342-A4", .internal_name = "H3342A4", .model = "H3342-A4", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 8 }, - { .name = "[ATA-1] Kalok KL343", .internal_name = "KL343", .model = "KALOK KL-343", .zones = 1, .avg_spt = 80, .heads = 6, .rpm = 3600, .full_stroke_ms = 50, .track_seek_ms = 2, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, - { .name = "[ATA-1] Kalok KL3100", .internal_name = "KL3100", .model = "KALOK KL-3100", .zones = 1, .avg_spt = 100, .heads = 6, .rpm = 3662, .full_stroke_ms = 50, .track_seek_ms = 2, .rcache_num_seg = 1, .rcache_seg_size = 32, .max_multiple = 8 }, - { .name = "[ATA-1] Maxtor 7060AT", .internal_name = "7060AT", .model = "Maxtor 7060 AT", .zones = 1, .avg_spt = 62, .heads = 2, .rpm = 3524, .full_stroke_ms = 30, .track_seek_ms = 3.6, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-1] Maxtor 7131AT", .internal_name = "7131AT", .model = "Maxtor 7131 AT", .zones = 2, .avg_spt = 54, .heads = 2, .rpm = 3551, .full_stroke_ms = 27, .track_seek_ms = 4.5, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-1] Maxtor 7213AT", .internal_name = "7213AT", .model = "Maxtor 7213 AT", .zones = 4, .avg_spt = 55, .heads = 4, .rpm = 3551, .full_stroke_ms = 28, .track_seek_ms = 6.5, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-1] Maxtor 7245AT", .internal_name = "7245AT", .model = "Maxtor 7245 AT", .zones = 4, .avg_spt = 49, .heads = 4, .rpm = 3551, .full_stroke_ms = 27, .track_seek_ms = 4.4, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-1] Quantum ProDrive LPS 105", .internal_name = "LPS105AT", .model = "QUANTUM PRODRIVE 105", .zones = 1, .avg_spt = 70, .heads = 2, .rpm = 3662, .full_stroke_ms = 45, .track_seek_ms = 5, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-1] Quantum ProDrive LPS 120AT", .internal_name = "GM12A012", .model = "QUANTUM PRODRIVE 120AT", .zones = 1, .avg_spt = 50, .heads = 2, .rpm = 3605, .full_stroke_ms = 45, .track_seek_ms = 4, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-1] Seagate ST3243A", .internal_name = "ST3243A", .model = "ST3243A", .zones = 1, .avg_spt = 40, .heads = 4, .rpm = 3811, .full_stroke_ms = 32, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 8 }, - { .name = "[ATA-1] Western Digital Caviar 140", .internal_name = "AC140", .model = "WDC AC140", .zones = 4, .avg_spt = 70, .heads = 2, .rpm = 3551, .full_stroke_ms = 28, .track_seek_ms = 6, .rcache_num_seg = 8, .rcache_seg_size = 8, .max_multiple = 8 }, - { .name = "[ATA-1] Western Digital Caviar 280", .internal_name = "AC280", .model = "WDC AC280", .zones = 4, .avg_spt = 70, .heads = 4, .rpm = 3595, .full_stroke_ms = 28, .track_seek_ms = 6, .rcache_num_seg = 8, .rcache_seg_size = 32, .max_multiple = 8 }, - { .name = "[ATA-1] Western Digital Caviar 1210", .internal_name = "AC1210", .model = "WDC AC1210F", .zones = 4, .avg_spt = 30, .heads = 2, .rpm = 3314, .full_stroke_ms = 33, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-1] Western Digital Caviar 2120", .internal_name = "AC2120", .model = "WDC AC2120M", .zones = 4, .avg_spt = 40, .heads = 2, .rpm = 3605, .full_stroke_ms = 28, .track_seek_ms = 2.8, .rcache_num_seg = 8, .rcache_seg_size = 32, .max_multiple = 8 }, - { .name = "[ATA-2] IBM DBOA-2720", .internal_name = "DBOA2720", .model = "DBOA-2720", .zones = 2, .avg_spt = 135, .heads = 2, .rpm = 4000, .full_stroke_ms = 30, .track_seek_ms = 5, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-2] IBM DeskStar 4 (DCAA-32880)", .internal_name = "DCAA32880", .model = "IBM-DCAA-32880", .zones = 8, .avg_spt = 185, .heads = 2, .rpm = 5400, .full_stroke_ms = 19, .track_seek_ms = 1.7, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 16 }, - { .name = "[ATA-2] IBM DeskStar 4 (DCAA-33610)", .internal_name = "DCAA33610", .model = "IBM-DCAA-33610", .zones = 8, .avg_spt = 185, .heads = 3, .rpm = 5400, .full_stroke_ms = 19, .track_seek_ms = 1.7, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 16 }, - { .name = "[ATA-2] IBM DeskStar 4 (DCAA-34330)", .internal_name = "DCAA34330", .model = "IBM-DCAA-34330", .zones = 8, .avg_spt = 185, .heads = 3, .rpm = 5400, .full_stroke_ms = 19, .track_seek_ms = 1.7, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 16 }, - { .name = "[ATA-2] Maxtor 7540AV", .internal_name = "7540AV", .model = "Maxtor 7540 AV", .zones = 2, .avg_spt = 120, .heads = 4, .rpm = 3551, .full_stroke_ms = 31, .track_seek_ms = 4.3, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 8 }, - { .name = "[ATA-2] Maxtor 7546AT", .internal_name = "7546AT", .model = "Maxtor 7546 AT", .zones = 2, .avg_spt = 100, .heads = 4, .rpm = 4500, .full_stroke_ms = 28, .track_seek_ms = 2.3, .rcache_num_seg = 4, .rcache_seg_size = 256, .max_multiple = 8 }, - { .name = "[ATA-2] Maxtor 7850AV", .internal_name = "7850AV", .model = "Maxtor 7850 AV", .zones = 4, .avg_spt = 120, .heads = 4, .rpm = 3551, .full_stroke_ms = 31, .track_seek_ms = 3.7, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-2] Maxtor 71336AP", .internal_name = "71336AP", .model = "Maxtor 71336 AP", .zones = 4, .avg_spt = 105, .heads = 4, .rpm = 4480, .full_stroke_ms = 12, .track_seek_ms = 3.4, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-2] Quantum Bigfoot 1.2AT", .internal_name = "BF12A011", .model = "QUANTUM BIGFOOT BF1.2A", .zones = 2, .avg_spt = 155, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-2] Quantum Bigfoot (CY4320A)", .internal_name = "CY4320A", .model = "QUANTUM BIGFOOT_CY4320A", .zones = 2, .avg_spt = 130, .heads = 2, .rpm = 4000, .full_stroke_ms = 29, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, // from Hardcore Windows NT Final Segment by Kugee - { .name = "[ATA-2] Quantum Fireball 640AT", .internal_name = "FB64A341", .model = "QUANTUM FIREBALL 640AT", .zones = 2, .avg_spt = 120, .heads = 2, .rpm = 5400, .full_stroke_ms = 24, .track_seek_ms = 3.1, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-2] Quantum Fireball TM1080AT", .internal_name = "TM10A462", .model = "QUANTUM FIREBALL TM1.0A", .zones = 2, .avg_spt = 120, .heads = 2, .rpm = 4500, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-2] Quantum Fireball TM1.2AT", .internal_name = "TM12A012", .model = "QUANTUM FIREBALL TM1.2A", .zones = 4, .avg_spt = 120, .heads = 2, .rpm = 4500, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-2] Samsung PLS-31274A", .internal_name = "PLS31274A", .model = "SAMSUNG PLS-31274A", .zones = 4, .avg_spt = 110, .heads = 4, .rpm = 4500, .full_stroke_ms = 45, .track_seek_ms = 4.5, .rcache_num_seg = 4, .rcache_seg_size = 256, .max_multiple = 8 }, - { .name = "[ATA-2] Samsung Winner-1", .internal_name = "WNR31601A", .model = "SAMSUNG WNR-31601A", .zones = 8, .avg_spt = 110, .heads = 4, .rpm = 5400, .full_stroke_ms = 22, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-2] Seagate Medalist (ST3780A)", .internal_name = "ST3780A", .model = "ST3780A", .zones = 8, .avg_spt = 120, .heads = 4, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 256, .max_multiple = 16 }, - { .name = "[ATA-2] Seagate Medalist (ST31220A)", .internal_name = "ST31220A", .model = "ST31220A", .zones = 8, .avg_spt = 140, .heads = 6, .rpm = 4500, .full_stroke_ms = 27, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 256, .max_multiple = 16 }, - { .name = "[ATA-2] Seagate Medalist 210xe", .internal_name = "ST3250A", .model = "ST3250A", .zones = 4, .avg_spt = 148, .heads = 2, .rpm = 3811, .full_stroke_ms = 30, .track_seek_ms = 4.1, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 8 }, - { .name = "[ATA-2] Seagate Medalist 275xe", .internal_name = "ST3295A", .model = "ST3295A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 3811, .full_stroke_ms = 30, .track_seek_ms = 3.4, .rcache_num_seg = 3, .rcache_seg_size = 120, .max_multiple = 8 }, - { .name = "[ATA-2] Seagate Medalist 545xe", .internal_name = "ST3660A", .model = "ST3660A", .zones = 4, .avg_spt = 130, .heads = 4, .rpm = 3811, .full_stroke_ms = 34, .track_seek_ms = 3.4, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 8 }, - { .name = "[ATA-2] Seagate Medalist 640xe", .internal_name = "ST3630A", .model = "ST3630A", .zones = 4, .avg_spt = 130, .heads = 4, .rpm = 3811, .full_stroke_ms = 34, .track_seek_ms = 3.5, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 8 }, - { .name = "[ATA-2] Seagate Medalist 850xe", .internal_name = "ST3850A", .model = "ST3850A", .zones = 8, .avg_spt = 150, .heads = 4, .rpm = 3811, .full_stroke_ms = 34, .track_seek_ms = 3.8, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 8 }, - { .name = "[ATA-2] Seagate Medalist 1270SL", .internal_name = "ST51270A", .model = "ST51270A", .zones = 8, .avg_spt = 205, .heads = 3, .rpm = 5736, .full_stroke_ms = 25, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-2] Seagate Medalist 3240", .internal_name = "ST33240A", .model = "ST33240A", .zones = 16, .avg_spt = 225, .heads = 8, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-2] Toshiba MK2101MAN (HDD2616)", .internal_name = "HDD2616", .model = "TOSHIBA MK2101MAN", .zones = 8, .avg_spt = 130, .heads = 10, .rpm = 4200, .full_stroke_ms = 36, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-2] Western Digital Caviar 2540", .internal_name = "AC2540", .model = "WDC AC2540H", .zones = 4, .avg_spt = 150, .heads = 2, .rpm = 4500, .full_stroke_ms = 12, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-2] Western Digital Caviar 2850", .internal_name = "AC2850", .model = "WDC AC2850F", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 5200, .full_stroke_ms = 12, .track_seek_ms = 4, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-2] Western Digital Caviar 11000", .internal_name = "AC11000", .model = "WDC AC11000H", .zones = 4, .avg_spt = 120, .heads = 2, .rpm = 5200, .full_stroke_ms = 12, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-2] Western Digital Caviar 21200", .internal_name = "AC21200", .model = "WDC AC21200H", .zones = 4, .avg_spt = 110, .heads = 4, .rpm = 5200, .full_stroke_ms = 39, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-2] Western Digital Caviar 21600", .internal_name = "AC21600", .model = "WDC AC21600H", .zones = 8, .avg_spt = 140, .heads = 4, .rpm = 5200, .full_stroke_ms = 30, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-2] Western Digital Caviar 22000", .internal_name = "AC22000", .model = "WDC AC22000LA", .zones = 8, .avg_spt = 130, .heads = 3, .rpm = 5200, .full_stroke_ms = 33, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, - { .name = "[ATA-2] Western Digital Caviar 22100", .internal_name = "AC22100", .model = "WDC AC22100H", .zones = 8, .avg_spt = 140, .heads = 4, .rpm = 5200, .full_stroke_ms = 30, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-2] Western Digital Caviar 31200", .internal_name = "AC31200", .model = "WDC AC31200F", .zones = 8, .avg_spt = 210, .heads = 4, .rpm = 4500, .full_stroke_ms = 12, .track_seek_ms = 4, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 16 }, - { .name = "[ATA-3] Conner CFS1275A", .internal_name = "CFS1275A", .model = "Conner Peripherals 1275MB - CFS1275A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, // Either ATA-2 or ATA-3 - { .name = "[ATA-3] Fujitsu MPA3017AT", .internal_name = "MPA3017AT", .model = "FUJITSU MPA3017AT", .zones = 5, .avg_spt = 195, .heads = 2, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-3] Fujitsu MPA3026AT", .internal_name = "MPA3026AT", .model = "FUJITSU MPA3026AT", .zones = 8, .avg_spt = 195, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-3] Fujitsu MPA3035AT", .internal_name = "MPA3035AT", .model = "FUJITSU MPA3035AT", .zones = 11, .avg_spt = 195, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-3] Fujitsu MPA3043AT", .internal_name = "MPA3043AT", .model = "FUJITSU MPA3043AT", .zones = 15, .avg_spt = 195, .heads = 5, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-3] Fujitsu MPA3052AT", .internal_name = "MPA3052AT", .model = "FUJITSU MPA3052AT", .zones = 16, .avg_spt = 195, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-3] Samsung Voyager 6", .internal_name = "SV0844A", .model = "SAMSUNG SV0844A", .zones = 8, .avg_spt = 205, .heads = 4, .rpm = 5400, .full_stroke_ms = 22, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-3] Samsung Winner 5X", .internal_name = "WU33205A", .model = "SAMSUNG WU33205A", .zones = 16, .avg_spt = 200, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-3] Seagate Medalist 636", .internal_name = "ST3636A", .model = "Seagate Technology 636MB - ST3636A", .zones = 2, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-3] Seagate Medalist 1082", .internal_name = "ST31082A", .model = "Seagate Technology 1082MB - ST31082A", .zones = 4, .avg_spt = 130, .heads = 3, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 8 }, - { .name = "[ATA-3] Seagate Medalist 1276", .internal_name = "ST31276A", .model = "Seagate Technology 1275MB - ST31276A", .zones = 4, .avg_spt = 130, .heads = 3, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, - { .name = "[ATA-3] Seagate Medalist 1720", .internal_name = "ST31720A", .model = "ST31720A", .zones = 4, .avg_spt = 120, .heads = 4, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 2, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-3] Seagate Medalist 2132", .internal_name = "ST32132A", .model = "ST32132A", .zones = 8, .avg_spt = 125, .heads = 6, .rpm = 4500, .full_stroke_ms = 30, .track_seek_ms = 2.3, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 16 }, - { .name = "[ATA-3] Western Digital Caviar 21700", .internal_name = "AC21700", .model = "WDC AC21700H", .zones = 8, .avg_spt = 185, .heads = 3, .rpm = 5200, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, // Apple Computer OEM only, not retail version - { .name = "[ATA-4] Fujitsu MPB3021AT", .internal_name = "MPB3021AT", .model = "FUJITSU MPB3021AT", .zones = 7, .avg_spt = 200, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 256, .max_multiple = 16 }, - { .name = "[ATA-4] Fujitsu MPD3043AT", .internal_name = "MPD3043AT", .model = "FUJITSU MPD3043AT", .zones = 5, .avg_spt = 195, .heads = 2, .rpm = 5400, .full_stroke_ms = 29, .track_seek_ms = 1.5, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-4] Fujitsu MPD3064AT", .internal_name = "MPD3064AT", .model = "FUJITSU MPD3064AT", .zones = 7, .avg_spt = 195, .heads = 3, .rpm = 5400, .full_stroke_ms = 30, .track_seek_ms = 1.5, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-4] Fujitsu MPD3084AT", .internal_name = "MPD3084AT", .model = "FUJITSU MPD3084AT", .zones = 7, .avg_spt = 195, .heads = 4, .rpm = 5400, .full_stroke_ms = 19, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-4] Fujitsu MPE3064AT", .internal_name = "MPE3064AT", .model = "FUJITSU MPE3064AT", .zones = 7, .avg_spt = 295, .heads = 2, .rpm = 5400, .full_stroke_ms = 30, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax 2160", .internal_name = "86480D6", .model = "Maxtor 86480D6", .zones = 8, .avg_spt = 197, .heads = 4, .rpm = 5200, .full_stroke_ms = 18, .track_seek_ms = 1, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax 2880", .internal_name = "90432D3", .model = "Maxtor 90432D3", .zones = 16, .avg_spt = 190, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1, .rcache_num_seg = 8, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax 3400", .internal_name = "90644D3", .model = "Maxtor 90644D3", .zones = 16, .avg_spt = 290, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 0.9, .rcache_num_seg = 8, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax 4320 (90432D2)", .internal_name = "90432D2", .model = "Maxtor 90432D2", .zones = 16, .avg_spt = 290, .heads = 2, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 0.9, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax 4320 (90845D4)", .internal_name = "90845D4", .model = "Maxtor 90845D4", .zones = 16, .avg_spt = 290, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 0.9, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (90683U2)", .internal_name = "90683U2", .model = "Maxtor 90683U2", .zones = 16, .avg_spt = 290, .heads = 2, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (91024U3)", .internal_name = "91024U3", .model = "Maxtor 91024U3", .zones = 16, .avg_spt = 290, .heads = 3, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (91366U4)", .internal_name = "91366U4", .model = "Maxtor 91366U4", .zones = 16, .avg_spt = 290, .heads = 4, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (92049U6)", .internal_name = "92049U6", .model = "Maxtor 92049U6", .zones = 16, .avg_spt = 290, .heads = 6, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (92732U8)", .internal_name = "92732U8", .model = "Maxtor 92732U8", .zones = 16, .avg_spt = 290, .heads = 8, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Quantum Bigfoot TX4.3AT", .internal_name = "TX043A011", .model = "QUANTUM BIGFOOT TX4.3A", .zones = 2, .avg_spt = 220, .heads = 2, .rpm = 4000, .full_stroke_ms = 30, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 32 }, - { .name = "[ATA-4] Quantum Fireball ST3.2AT", .internal_name = "ST32A461", .model = "QUANTUM FIREBALL ST3.2A", .zones = 4, .avg_spt = 200, .heads = 4, .rpm = 5400, .full_stroke_ms = 21, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-4] Quantum Fireball SE4.3A", .internal_name = "SE43A011", .model = "QUANTUM FIREBALL SE4.3A", .zones = 2, .avg_spt = 200, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-4] Quantum Fireball SE6.4A", .internal_name = "SE64A011", .model = "QUANTUM FIREBALL SE6.4A", .zones = 3, .avg_spt = 200, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-4] Quantum Fireball SE8.4A", .internal_name = "SE84A011", .model = "QUANTUM FIREBALL SE8.4A", .zones = 4, .avg_spt = 200, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-4] Quantum Fireball EX12.7A", .internal_name = "EX12A012", .model = "QUANTUM FIREBALL EX12.7A", .zones = 4, .avg_spt = 200, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16, .version_ex = "A0A.0D00" }, - { .name = "[ATA-4] Quantum Fireball LCT-08 (LA04A011)", .internal_name = "LA04A011", .model = "QUANTUM FIREBALLlct08 04", .zones = 8, .avg_spt = 280, .heads = 6, .rpm = 5400, .full_stroke_ms = 40, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16, .version_ex = "A05.0X00" }, - { .name = "[ATA-4] Seagate Medalist 2122", .internal_name = "ST32122A", .model = "ST32122A", .zones = 16, .avg_spt = 215, .heads = 2, .rpm = 4500, .full_stroke_ms = 23, .track_seek_ms = 3.8, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-4] Seagate Medalist 3321", .internal_name = "ST33221A", .model = "ST33221A", .zones = 16, .avg_spt = 210, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1.7, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-4] Seagate Medalist 4321", .internal_name = "ST34321A", .model = "ST34321A", .zones = 16, .avg_spt = 210, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.2, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-4] Seagate Medalist 6531", .internal_name = "ST36531A", .model = "ST36531A", .zones = 16, .avg_spt = 215, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1.7, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 16 }, - { .name = "[ATA-4] Seagate Medalist 8420", .internal_name = "ST38420A", .model = "ST38420A", .zones = 16, .avg_spt = 290, .heads = 4, .rpm = 5400, .full_stroke_ms = 16, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-4] Seagate Medalist 13030", .internal_name = "ST313030A", .model = "ST313030A", .zones = 16, .avg_spt = 290, .heads = 6, .rpm = 5400, .full_stroke_ms = 16, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-4] Seagate Medalist 17240", .internal_name = "ST317240A", .model = "ST317240A", .zones = 16, .avg_spt = 290, .heads = 8, .rpm = 5400, .full_stroke_ms = 16, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-4] Toshiba MK4006MAV", .internal_name = "MK4006MAV", .model = "TOSHIBA MK4006MAV", .zones = 8, .avg_spt = 230, .heads = 6, .rpm = 4200, .full_stroke_ms = 25, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-4] Western Digital Caviar 14300", .internal_name = "AC14300", .model = "WDC AC14300RT", .zones = 16, .avg_spt = 195, .heads = 2, .rpm = 5400, .full_stroke_ms = 21, .track_seek_ms = 5.5, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-4] Western Digital Caviar 23200", .internal_name = "AC23200", .model = "WDC AC23200LB", .zones = 16, .avg_spt = 210, .heads = 4, .rpm = 5400, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Western Digital Caviar 26400", .internal_name = "AC26400", .model = "WDC AC26400RN", .zones = 16, .avg_spt = 295, .heads = 5, .rpm = 5400, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-4] Western Digital Caviar 33200", .internal_name = "AC33200", .model = "WDC AC33200LA", .zones = 16, .avg_spt = 310, .heads = 5, .rpm = 5200, .full_stroke_ms = 40, .track_seek_ms = 3, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-4] Western Digital Caviar 35100", .internal_name = "AC35100", .model = "WDC AC35100L", .zones = 16, .avg_spt = 315, .heads = 5, .rpm = 5400, .full_stroke_ms = 40, .track_seek_ms = 3, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32, .version_ex = "09.09M08" }, - { .name = "[ATA-5] IBM Travelstar 6GN", .internal_name = "DARA206000", .model = "IBM-DARA-206000", .zones = 12, .avg_spt = 292, .heads = 2, .rpm = 4200, .full_stroke_ms = 31, .track_seek_ms = 4, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] IBM Travelstar 9GN", .internal_name = "DARA209000", .model = "IBM-DARA-209000", .zones = 12, .avg_spt = 292, .heads = 3, .rpm = 4200, .full_stroke_ms = 31, .track_seek_ms = 4, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] IBM/Hitachi Travelstar 12GN", .internal_name = "DARA212000", .model = "IBM-DARA-212000", .zones = 12, .avg_spt = 292, .heads = 4, .rpm = 4200, .full_stroke_ms = 31, .track_seek_ms = 4, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, // Either Hitachi or IBM OEM - { .name = "[ATA-5] Maxtor DiamondMax VL 17", .internal_name = "90871U2", .model = "Maxtor 90871U2", .zones = 16, .avg_spt = 290, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 0.9, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, - { .name = "[ATA-5] Maxtor DiamondMax VL 20 (91021U2)", .internal_name = "91021U2", .model = "Maxtor 91021U2", .zones = 16, .avg_spt = 295, .heads = 2, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Maxtor DiamondMax VL 20 (91531U3)", .internal_name = "91531U3", .model = "Maxtor 91531U3", .zones = 16, .avg_spt = 295, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Maxtor DiamondMax VL 20 (92041U4)", .internal_name = "92041U4", .model = "Maxtor 92041U4", .zones = 16, .avg_spt = 295, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Quantum Fireball EX3.2A", .internal_name = "EX32A012", .model = "QUANTUM FIREBALL EX3.2A", .zones = 1, .avg_spt = 210, .heads = 2, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-5] Quantum Fireball EX5.1A", .internal_name = "EX51A012", .model = "QUANTUM FIREBALL EX5.1A", .zones = 2, .avg_spt = 210, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-5] Quantum Fireball EX6.4A", .internal_name = "EX64A012", .model = "QUANTUM FIREBALL EX6.4A", .zones = 2, .avg_spt = 210, .heads = 4, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-5] Quantum Fireball EX10.2A", .internal_name = "EX10A011", .model = "QUANTUM FIREBALL EX10.2A", .zones = 3, .avg_spt = 210, .heads = 6, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-5] Quantum Fireball EX12.7A", .internal_name = "EX12A011", .model = "QUANTUM FIREBALL EX12.7A", .zones = 4, .avg_spt = 210, .heads = 8, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-5] Quantum Fireball CR4.3A", .internal_name = "CR43A013", .model = "QUANTUM FIREBALL CR4.3A", .zones = 2, .avg_spt = 310, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-5] Quantum Fireball CR6.4A", .internal_name = "CR64A011", .model = "QUANTUM FIREBALL CR6.4A", .zones = 2, .avg_spt = 310, .heads = 4, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-5] Quantum Fireball CR8.4A", .internal_name = "CR84A011", .model = "QUANTUM FIREBALL CR8.4A", .zones = 3, .avg_spt = 310, .heads = 6, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-5] Quantum Fireball CR13.0A", .internal_name = "CR13A011", .model = "QUANTUM FIREBALL CR13.0A", .zones = 4, .avg_spt = 310, .heads = 8, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, - { .name = "[ATA-5] Samsung SpinPoint V6800 (SV0682D)", .internal_name = "SV0682D", .model = "SAMSUNG SV0682D", .zones = 8, .avg_spt = 295, .heads = 2, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Samsung SpinPoint V6800 (SV1023D)", .internal_name = "SV1023D", .model = "SAMSUNG SV1023D", .zones = 8, .avg_spt = 295, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Samsung SpinPoint V6800 (SV1364D)", .internal_name = "SV1364D", .model = "SAMSUNG SV1364D", .zones = 8, .avg_spt = 295, .heads = 4, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Samsung SpinPoint V6800 (SV1705D)", .internal_name = "SV1705D", .model = "SAMSUNG SV1705D", .zones = 8, .avg_spt = 295, .heads = 5, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Samsung SpinPoint V6800 (SV2046D)", .internal_name = "SV2046D", .model = "SAMSUNG SV2046D", .zones = 8, .avg_spt = 295, .heads = 6, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Seagate U8 - 4.3gb", .internal_name = "ST34313A", .model = "ST34313A", .zones = 16, .avg_spt = 289, .heads = 1, .rpm = 5400, .full_stroke_ms = 25, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Seagate U8 - 8.4gb", .internal_name = "ST38410A", .model = "ST38410A", .zones = 16, .avg_spt = 289, .heads = 2, .rpm = 5400, .full_stroke_ms = 25, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Seagate U8 - 13gb", .internal_name = "ST313021A", .model = "ST313021A", .zones = 16, .avg_spt = 289, .heads = 4, .rpm = 5400, .full_stroke_ms = 25, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Seagate U8 - 17.2gb", .internal_name = "ST317221A", .model = "ST317221A", .zones = 16, .avg_spt = 289, .heads = 3, .rpm = 5400, .full_stroke_ms = 25, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Western Digital Caviar 102AA", .internal_name = "WD102AA", .model = "WDC WD102AA-00ANA0", .zones = 16, .avg_spt = 295, .heads = 8, .rpm = 5400, .full_stroke_ms = 12, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, - { .name = "[ATA-5] Western Digital Expert", .internal_name = "WD135BA", .model = "WDC WD135BA-60AK", .zones = 16, .avg_spt = 350, .heads = 6, .rpm = 7200, .full_stroke_ms = 15, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 1920, .max_multiple = 32 }, + { .name = "[Generic] RAM Disk (max. speed)", .internal_name = "ramdisk", .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 }, + { .name = "[Generic] 1989 (3500 RPM)", .internal_name = "1989_3500rpm", .zones = 1, .avg_spt = 35, .heads = 2, .rpm = 3500, .full_stroke_ms = 40, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 16, .max_multiple = 8 }, + { .name = "[Generic] 1992 (3600 RPM)", .internal_name = "1992_3600rpm", .zones = 1, .avg_spt = 45, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 6, .rcache_num_seg = 4, .rcache_seg_size = 16, .max_multiple = 8 }, + { .name = "[Generic] 1994 (4500 RPM)", .internal_name = "1994_4500rpm", .zones = 8, .avg_spt = 80, .heads = 4, .rpm = 4500, .full_stroke_ms = 26, .track_seek_ms = 5, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 16 }, + { .name = "[Generic] 1996 (5400 RPM)", .internal_name = "1996_5400rpm", .zones = 16, .avg_spt = 135, .heads = 4, .rpm = 5400, .full_stroke_ms = 24, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, + { .name = "[Generic] 1997 (5400 RPM)", .internal_name = "1997_5400rpm", .zones = 16, .avg_spt = 185, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 32 }, + { .name = "[Generic] 1998 (5400 RPM)", .internal_name = "1998_5400rpm", .zones = 16, .avg_spt = 300, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 32 }, + { .name = "[Generic] 2000 (7200 RPM)", .internal_name = "2000_7200rpm", .zones = 16, .avg_spt = 350, .heads = 6, .rpm = 7200, .full_stroke_ms = 15, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 32 }, + { .name = "[PIO IDE] IBM WDA-L42", .internal_name = "WDAL42", .model = "WDA-L42", .zones = 1, .avg_spt = 85, .heads = 2, .rpm = 3600, .full_stroke_ms = 33, .track_seek_ms = 2.5, .rcache_num_seg = 1, .rcache_seg_size = 32, .max_multiple = 1 }, + { .name = "[PIO-2] IBM DSAA-3270", .internal_name = "DSAA3270", .model = "DSAA-3270", .version = "25505120", .zones = 8, .avg_spt = 268, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 2.1, .rcache_num_seg = 3, .rcache_seg_size = 32, .max_multiple = 8 }, + { .name = "[ATA-1] Conner CP3024", .internal_name = "CP3024", .model = "Conner Peripherals 20MB - CP3024", .zones = 1, .avg_spt = 33, .heads = 2, .rpm = 3500, .full_stroke_ms = 50, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work + { .name = "[ATA-1] Conner CP3044", .internal_name = "CP3044", .model = "Conner Peripherals 40MB - CP3044", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3500, .full_stroke_ms = 50, .track_seek_ms = 8, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work + { .name = "[ATA-1] Conner CP3104", .internal_name = "CP3104", .model = "Conner Peripherals 104MB - CP3104", .zones = 1, .avg_spt = 33, .heads = 8, .rpm = 3500, .full_stroke_ms = 45, .track_seek_ms = 8, .rcache_num_seg = 4, .rcache_seg_size = 8, .max_multiple = 8 }, // Needed for GRiDcase 1520 to work + { .name = "[ATA-1] Conner CFS420A", .internal_name = "CFS420A", .model = "Conner Peripherals 420MB - CFS420A", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3600, .full_stroke_ms = 33, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 8 }, + { .name = "[ATA-1] HP Kittyhawk", .internal_name = "C3014A", .model = "HP C3014A", .zones = 6, .avg_spt = 80, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 16, .max_multiple = 8 }, + { .name = "[ATA-1] IBM H3256-A3", .internal_name = "H3256A3", .model = "H3256-A3", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3600, .full_stroke_ms = 32, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 8 }, + { .name = "[ATA-1] IBM H3342-A4", .internal_name = "H3342A4", .model = "H3342-A4", .zones = 1, .avg_spt = 40, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 8 }, + { .name = "[ATA-1] Kalok KL343", .internal_name = "KL343", .model = "KALOK KL-343", .zones = 1, .avg_spt = 80, .heads = 6, .rpm = 3600, .full_stroke_ms = 50, .track_seek_ms = 2, .rcache_num_seg = 1, .rcache_seg_size = 8, .max_multiple = 8 }, + { .name = "[ATA-1] Kalok KL3100", .internal_name = "KL3100", .model = "KALOK KL-3100", .zones = 1, .avg_spt = 100, .heads = 6, .rpm = 3662, .full_stroke_ms = 50, .track_seek_ms = 2, .rcache_num_seg = 1, .rcache_seg_size = 32, .max_multiple = 8 }, + { .name = "[ATA-1] Maxtor 7060AT", .internal_name = "7060AT", .model = "Maxtor 7060 AT", .zones = 1, .avg_spt = 62, .heads = 2, .rpm = 3524, .full_stroke_ms = 30, .track_seek_ms = 3.6, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-1] Maxtor 7131AT", .internal_name = "7131AT", .model = "Maxtor 7131 AT", .zones = 2, .avg_spt = 54, .heads = 2, .rpm = 3551, .full_stroke_ms = 27, .track_seek_ms = 4.5, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-1] Maxtor 7213AT", .internal_name = "7213AT", .model = "Maxtor 7213 AT", .zones = 4, .avg_spt = 55, .heads = 4, .rpm = 3551, .full_stroke_ms = 28, .track_seek_ms = 6.5, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-1] Maxtor 7245AT", .internal_name = "7245AT", .model = "Maxtor 7245 AT", .zones = 4, .avg_spt = 49, .heads = 4, .rpm = 3551, .full_stroke_ms = 27, .track_seek_ms = 4.4, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-1] Quantum ProDrive LPS 105", .internal_name = "LPS105AT", .model = "QUANTUM PRODRIVE 105", .zones = 1, .avg_spt = 70, .heads = 2, .rpm = 3662, .full_stroke_ms = 45, .track_seek_ms = 5, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-1] Quantum ProDrive LPS 120AT", .internal_name = "GM12A012", .model = "QUANTUM PRODRIVE 120AT", .zones = 1, .avg_spt = 50, .heads = 2, .rpm = 3605, .full_stroke_ms = 45, .track_seek_ms = 4, .rcache_num_seg = 1, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-1] Seagate ST3243A", .internal_name = "ST3243A", .model = "ST3243A", .zones = 1, .avg_spt = 40, .heads = 4, .rpm = 3811, .full_stroke_ms = 32, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 8 }, + { .name = "[ATA-1] Western Digital Caviar 140", .internal_name = "AC140", .model = "WDC AC140", .zones = 4, .avg_spt = 70, .heads = 2, .rpm = 3551, .full_stroke_ms = 28, .track_seek_ms = 6, .rcache_num_seg = 8, .rcache_seg_size = 8, .max_multiple = 8 }, + { .name = "[ATA-1] Western Digital Caviar 280", .internal_name = "AC280", .model = "WDC AC280", .zones = 4, .avg_spt = 70, .heads = 4, .rpm = 3595, .full_stroke_ms = 28, .track_seek_ms = 6, .rcache_num_seg = 8, .rcache_seg_size = 32, .max_multiple = 8 }, + { .name = "[ATA-1] Western Digital Caviar 1210", .internal_name = "AC1210", .model = "WDC AC1210F", .zones = 4, .avg_spt = 30, .heads = 2, .rpm = 3314, .full_stroke_ms = 33, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-1] Western Digital Caviar 2120", .internal_name = "AC2120", .model = "WDC AC2120M", .zones = 4, .avg_spt = 40, .heads = 2, .rpm = 3605, .full_stroke_ms = 28, .track_seek_ms = 2.8, .rcache_num_seg = 8, .rcache_seg_size = 32, .max_multiple = 8 }, + { .name = "[ATA-2] IBM DBOA-2720", .internal_name = "DBOA2720", .model = "DBOA-2720", .zones = 2, .avg_spt = 135, .heads = 2, .rpm = 4000, .full_stroke_ms = 30, .track_seek_ms = 5, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-2] IBM DeskStar 4 (DCAA-32880)", .internal_name = "DCAA32880", .model = "IBM-DCAA-32880", .zones = 8, .avg_spt = 185, .heads = 2, .rpm = 5400, .full_stroke_ms = 19, .track_seek_ms = 1.7, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 16 }, + { .name = "[ATA-2] IBM DeskStar 4 (DCAA-33610)", .internal_name = "DCAA33610", .model = "IBM-DCAA-33610", .zones = 8, .avg_spt = 185, .heads = 3, .rpm = 5400, .full_stroke_ms = 19, .track_seek_ms = 1.7, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 16 }, + { .name = "[ATA-2] IBM DeskStar 4 (DCAA-34330)", .internal_name = "DCAA34330", .model = "IBM-DCAA-34330", .zones = 8, .avg_spt = 185, .heads = 3, .rpm = 5400, .full_stroke_ms = 19, .track_seek_ms = 1.7, .rcache_num_seg = 4, .rcache_seg_size = 96, .max_multiple = 16 }, + { .name = "[ATA-2] Maxtor 7540AV", .internal_name = "7540AV", .model = "Maxtor 7540 AV", .zones = 2, .avg_spt = 120, .heads = 4, .rpm = 3551, .full_stroke_ms = 31, .track_seek_ms = 4.3, .rcache_num_seg = 4, .rcache_seg_size = 32, .max_multiple = 8 }, + { .name = "[ATA-2] Maxtor 7546AT", .internal_name = "7546AT", .model = "Maxtor 7546 AT", .zones = 2, .avg_spt = 100, .heads = 4, .rpm = 4500, .full_stroke_ms = 28, .track_seek_ms = 2.3, .rcache_num_seg = 4, .rcache_seg_size = 256, .max_multiple = 8 }, + { .name = "[ATA-2] Maxtor 7850AV", .internal_name = "7850AV", .model = "Maxtor 7850 AV", .zones = 4, .avg_spt = 120, .heads = 4, .rpm = 3551, .full_stroke_ms = 31, .track_seek_ms = 3.7, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-2] Maxtor 71336AP", .internal_name = "71336AP", .model = "Maxtor 71336 AP", .zones = 4, .avg_spt = 105, .heads = 4, .rpm = 4480, .full_stroke_ms = 12, .track_seek_ms = 3.4, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-2] Quantum Bigfoot 1.2AT", .internal_name = "BF12A011", .model = "QUANTUM BIGFOOT BF1.2A", .zones = 2, .avg_spt = 155, .heads = 2, .rpm = 3600, .full_stroke_ms = 30, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-2] Quantum Bigfoot (CY4320A)", .internal_name = "CY4320A", .model = "QUANTUM BIGFOOT_CY4320A", .zones = 2, .avg_spt = 130, .heads = 2, .rpm = 4000, .full_stroke_ms = 29, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, // from Hardcore Windows NT Final Segment by Kugee + { .name = "[ATA-2] Quantum Fireball 640AT", .internal_name = "FB64A341", .model = "QUANTUM FIREBALL 640AT", .zones = 2, .avg_spt = 120, .heads = 2, .rpm = 5400, .full_stroke_ms = 24, .track_seek_ms = 3.1, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-2] Quantum Fireball TM1080AT", .internal_name = "TM10A462", .model = "QUANTUM FIREBALL TM1.0A", .zones = 2, .avg_spt = 120, .heads = 2, .rpm = 4500, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-2] Quantum Fireball TM1.2AT", .internal_name = "TM12A012", .model = "QUANTUM FIREBALL TM1.2A", .zones = 4, .avg_spt = 120, .heads = 2, .rpm = 4500, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-2] Samsung PLS-31274A", .internal_name = "PLS31274A", .model = "SAMSUNG PLS-31274A", .zones = 4, .avg_spt = 110, .heads = 4, .rpm = 4500, .full_stroke_ms = 45, .track_seek_ms = 4.5, .rcache_num_seg = 4, .rcache_seg_size = 256, .max_multiple = 8 }, + { .name = "[ATA-2] Samsung Winner-1", .internal_name = "WNR31601A", .model = "SAMSUNG WNR-31601A", .zones = 8, .avg_spt = 110, .heads = 4, .rpm = 5400, .full_stroke_ms = 22, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-2] Seagate Medalist (ST3780A)", .internal_name = "ST3780A", .model = "ST3780A", .zones = 8, .avg_spt = 120, .heads = 4, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 256, .max_multiple = 16 }, + { .name = "[ATA-2] Seagate Medalist (ST31220A)", .internal_name = "ST31220A", .model = "ST31220A", .zones = 8, .avg_spt = 140, .heads = 6, .rpm = 4500, .full_stroke_ms = 27, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 256, .max_multiple = 16 }, + { .name = "[ATA-2] Seagate Medalist 210xe", .internal_name = "ST3250A", .model = "ST3250A", .zones = 4, .avg_spt = 148, .heads = 2, .rpm = 3811, .full_stroke_ms = 30, .track_seek_ms = 4.1, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 8 }, + { .name = "[ATA-2] Seagate Medalist 275xe", .internal_name = "ST3295A", .model = "ST3295A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 3811, .full_stroke_ms = 30, .track_seek_ms = 3.4, .rcache_num_seg = 3, .rcache_seg_size = 120, .max_multiple = 8 }, + { .name = "[ATA-2] Seagate Medalist 545xe", .internal_name = "ST3660A", .model = "ST3660A", .zones = 4, .avg_spt = 130, .heads = 4, .rpm = 3811, .full_stroke_ms = 34, .track_seek_ms = 3.4, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 8 }, + { .name = "[ATA-2] Seagate Medalist 640xe", .internal_name = "ST3630A", .model = "ST3630A", .zones = 4, .avg_spt = 130, .heads = 4, .rpm = 3811, .full_stroke_ms = 34, .track_seek_ms = 3.5, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 8 }, + { .name = "[ATA-2] Seagate Medalist 850xe", .internal_name = "ST3850A", .model = "ST3850A", .zones = 8, .avg_spt = 150, .heads = 4, .rpm = 3811, .full_stroke_ms = 34, .track_seek_ms = 3.8, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 8 }, + { .name = "[ATA-2] Seagate Medalist 1270SL", .internal_name = "ST51270A", .model = "ST51270A", .zones = 8, .avg_spt = 205, .heads = 3, .rpm = 5736, .full_stroke_ms = 25, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-2] Seagate Medalist 3240", .internal_name = "ST33240A", .model = "ST33240A", .zones = 16, .avg_spt = 225, .heads = 8, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-2] Toshiba MK2101MAN (HDD2616)", .internal_name = "HDD2616", .model = "TOSHIBA MK2101MAN", .zones = 8, .avg_spt = 130, .heads = 10, .rpm = 4200, .full_stroke_ms = 36, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-2] Western Digital Caviar 2540", .internal_name = "AC2540", .model = "WDC AC2540H", .zones = 4, .avg_spt = 150, .heads = 2, .rpm = 4500, .full_stroke_ms = 12, .track_seek_ms = 4, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-2] Western Digital Caviar 2850", .internal_name = "AC2850", .model = "WDC AC2850F", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 5200, .full_stroke_ms = 12, .track_seek_ms = 4, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-2] Western Digital Caviar 11000", .internal_name = "AC11000", .model = "WDC AC11000H", .zones = 4, .avg_spt = 120, .heads = 2, .rpm = 5200, .full_stroke_ms = 12, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-2] Western Digital Caviar 21200", .internal_name = "AC21200", .model = "WDC AC21200H", .zones = 4, .avg_spt = 110, .heads = 4, .rpm = 5200, .full_stroke_ms = 39, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-2] Western Digital Caviar 21600", .internal_name = "AC21600", .model = "WDC AC21600H", .zones = 8, .avg_spt = 140, .heads = 4, .rpm = 5200, .full_stroke_ms = 30, .track_seek_ms = 3, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-2] Western Digital Caviar 22000", .internal_name = "AC22000", .model = "WDC AC22000LA", .zones = 8, .avg_spt = 130, .heads = 3, .rpm = 5200, .full_stroke_ms = 33, .track_seek_ms = 3.5, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 8 }, + { .name = "[ATA-2] Western Digital Caviar 22100", .internal_name = "AC22100", .model = "WDC AC22100H", .zones = 8, .avg_spt = 140, .heads = 4, .rpm = 5200, .full_stroke_ms = 30, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-2] Western Digital Caviar 31200", .internal_name = "AC31200", .model = "WDC AC31200F", .zones = 8, .avg_spt = 210, .heads = 4, .rpm = 4500, .full_stroke_ms = 12, .track_seek_ms = 4, .rcache_num_seg = 8, .rcache_seg_size = 64, .max_multiple = 16 }, + { .name = "[ATA-3] Conner CFS1275A", .internal_name = "CFS1275A", .model = "Conner Peripherals 1275MB - CFS1275A", .zones = 4, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, // Either ATA-2 or ATA-3 + { .name = "[ATA-3] Fujitsu MPA3017AT", .internal_name = "MPA3017AT", .model = "FUJITSU MPA3017AT", .zones = 5, .avg_spt = 195, .heads = 2, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-3] Fujitsu MPA3026AT", .internal_name = "MPA3026AT", .model = "FUJITSU MPA3026AT", .zones = 8, .avg_spt = 195, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-3] Fujitsu MPA3035AT", .internal_name = "MPA3035AT", .model = "FUJITSU MPA3035AT", .zones = 11, .avg_spt = 195, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-3] Fujitsu MPA3043AT", .internal_name = "MPA3043AT", .model = "FUJITSU MPA3043AT", .zones = 15, .avg_spt = 195, .heads = 5, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-3] Fujitsu MPA3052AT", .internal_name = "MPA3052AT", .model = "FUJITSU MPA3052AT", .zones = 16, .avg_spt = 195, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3.2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-3] Samsung Voyager 6", .internal_name = "SV0844A", .model = "SAMSUNG SV0844A", .zones = 8, .avg_spt = 205, .heads = 4, .rpm = 5400, .full_stroke_ms = 22, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-3] Samsung Winner 5X", .internal_name = "WU33205A", .model = "SAMSUNG WU33205A", .zones = 6, .avg_spt = 200, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-3] Seagate Medalist 636", .internal_name = "ST3636A", .model = "Seagate Technology 636MB - ST3636A", .zones = 2, .avg_spt = 130, .heads = 2, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-3] Seagate Medalist 1082", .internal_name = "ST31082A", .model = "Seagate Technology 1082MB - ST31082A", .zones = 4, .avg_spt = 130, .heads = 3, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 8 }, + { .name = "[ATA-3] Seagate Medalist 1276", .internal_name = "ST31276A", .model = "Seagate Technology 1275MB - ST31276A", .zones = 4, .avg_spt = 130, .heads = 3, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 3.8, .rcache_num_seg = 4, .rcache_seg_size = 64, .max_multiple = 16 }, + { .name = "[ATA-3] Seagate Medalist 1720", .internal_name = "ST31720A", .model = "ST31720A", .zones = 4, .avg_spt = 120, .heads = 4, .rpm = 4500, .full_stroke_ms = 25, .track_seek_ms = 2, .rcache_num_seg = 4, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-3] Seagate Medalist 2132", .internal_name = "ST32132A", .model = "ST32132A", .zones = 8, .avg_spt = 125, .heads = 6, .rpm = 4500, .full_stroke_ms = 30, .track_seek_ms = 2.3, .rcache_num_seg = 8, .rcache_seg_size = 120, .max_multiple = 16 }, + { .name = "[ATA-3] Western Digital Caviar 21700", .internal_name = "AC21700", .model = "WDC AC21700H", .zones = 8, .avg_spt = 185, .heads = 3, .rpm = 5200, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, // Apple Computer OEM only, not retail version + { .name = "[ATA-4] Fujitsu MPB3021AT", .internal_name = "MPB3021AT", .model = "FUJITSU MPB3021AT", .zones = 7, .avg_spt = 200, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 256, .max_multiple = 16 }, + { .name = "[ATA-4] Fujitsu MPD3043AT", .internal_name = "MPD3043AT", .model = "FUJITSU MPD3043AT", .zones = 5, .avg_spt = 195, .heads = 2, .rpm = 5400, .full_stroke_ms = 29, .track_seek_ms = 1.5, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-4] Fujitsu MPD3064AT", .internal_name = "MPD3064AT", .model = "FUJITSU MPD3064AT", .zones = 7, .avg_spt = 195, .heads = 3, .rpm = 5400, .full_stroke_ms = 30, .track_seek_ms = 1.5, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-4] Fujitsu MPD3084AT", .internal_name = "MPD3084AT", .model = "FUJITSU MPD3084AT", .zones = 7, .avg_spt = 195, .heads = 4, .rpm = 5400, .full_stroke_ms = 19, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-4] Fujitsu MPE3064AT", .internal_name = "MPE3064AT", .model = "FUJITSU MPE3064AT", .zones = 7, .avg_spt = 295, .heads = 2, .rpm = 5400, .full_stroke_ms = 30, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax 2160", .internal_name = "86480D6", .model = "Maxtor 86480D6", .zones = 8, .avg_spt = 197, .heads = 4, .rpm = 5200, .full_stroke_ms = 18, .track_seek_ms = 1, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax 2880", .internal_name = "90432D3", .model = "Maxtor 90432D3", .zones = 16, .avg_spt = 190, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1, .rcache_num_seg = 8, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax 3400", .internal_name = "90644D3", .model = "Maxtor 90644D3", .zones = 16, .avg_spt = 290, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 0.9, .rcache_num_seg = 8, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax 4320 (90432D2)", .internal_name = "90432D2", .model = "Maxtor 90432D2", .zones = 16, .avg_spt = 290, .heads = 2, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 0.9, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax 4320 (90845D4)", .internal_name = "90845D4", .model = "Maxtor 90845D4", .zones = 16, .avg_spt = 290, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 0.9, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (90683U2)", .internal_name = "90683U2", .model = "Maxtor 90683U2", .zones = 16, .avg_spt = 290, .heads = 2, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (91024U3)", .internal_name = "91024U3", .model = "Maxtor 91024U3", .zones = 16, .avg_spt = 290, .heads = 3, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (91366U4)", .internal_name = "91366U4", .model = "Maxtor 91366U4", .zones = 16, .avg_spt = 290, .heads = 4, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (92049U6)", .internal_name = "92049U6", .model = "Maxtor 92049U6", .zones = 16, .avg_spt = 290, .heads = 6, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Maxtor DiamondMax Plus 6800 (92732U8)", .internal_name = "92732U8", .model = "Maxtor 92732U8", .zones = 16, .avg_spt = 290, .heads = 8, .rpm = 7200, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Quantum Bigfoot TX4.3AT", .internal_name = "TX043A011", .model = "QUANTUM BIGFOOT TX4.3A", .zones = 2, .avg_spt = 220, .heads = 2, .rpm = 4000, .full_stroke_ms = 30, .track_seek_ms = 2.5, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 32 }, + { .name = "[ATA-4] Quantum Fireball ST3.2AT", .internal_name = "ST32A461", .model = "QUANTUM FIREBALL ST3.2A", .zones = 4, .avg_spt = 200, .heads = 4, .rpm = 5400, .full_stroke_ms = 21, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-4] Quantum Fireball SE4.3A", .internal_name = "SE43A011", .model = "QUANTUM FIREBALL SE4.3A", .zones = 2, .avg_spt = 200, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-4] Quantum Fireball SE6.4A", .internal_name = "SE64A011", .model = "QUANTUM FIREBALL SE6.4A", .zones = 3, .avg_spt = 200, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-4] Quantum Fireball SE8.4A", .internal_name = "SE84A011", .model = "QUANTUM FIREBALL SE8.4A", .zones = 4, .avg_spt = 200, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-4] Quantum Fireball EX12.7A", .internal_name = "EX12A012", .model = "QUANTUM FIREBALL EX12.7A", .version = "A0A.0D00", .zones = 4, .avg_spt = 200, .heads = 8, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-4] Quantum Fireball LCT-08 (LA04A011)", .internal_name = "LA04A011", .model = "QUANTUM FIREBALLlct08 04", .version = "A05.0X00", .zones = 8, .avg_spt = 280, .heads = 6, .rpm = 5400, .full_stroke_ms = 40, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-4] Seagate Medalist 2122", .internal_name = "ST32122A", .model = "ST32122A", .zones = 16, .avg_spt = 215, .heads = 2, .rpm = 4500, .full_stroke_ms = 23, .track_seek_ms = 3.8, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-4] Seagate Medalist 3321", .internal_name = "ST33221A", .model = "ST33221A", .zones = 16, .avg_spt = 210, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1.7, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-4] Seagate Medalist 4321", .internal_name = "ST34321A", .model = "ST34321A", .zones = 16, .avg_spt = 210, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 2.2, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-4] Seagate Medalist 6531", .internal_name = "ST36531A", .model = "ST36531A", .zones = 16, .avg_spt = 215, .heads = 6, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1.7, .rcache_num_seg = 16, .rcache_seg_size = 128, .max_multiple = 16 }, + { .name = "[ATA-4] Seagate Medalist 8420", .internal_name = "ST38420A", .model = "ST38420A", .zones = 16, .avg_spt = 290, .heads = 4, .rpm = 5400, .full_stroke_ms = 16, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-4] Seagate Medalist 13030", .internal_name = "ST313030A", .model = "ST313030A", .zones = 16, .avg_spt = 290, .heads = 6, .rpm = 5400, .full_stroke_ms = 16, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-4] Seagate Medalist 17240", .internal_name = "ST317240A", .model = "ST317240A", .zones = 16, .avg_spt = 290, .heads = 8, .rpm = 5400, .full_stroke_ms = 16, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-4] Toshiba MK4006MAV", .internal_name = "MK4006MAV", .model = "TOSHIBA MK4006MAV", .zones = 8, .avg_spt = 230, .heads = 6, .rpm = 4200, .full_stroke_ms = 25, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-4] Western Digital Caviar 14300", .internal_name = "AC14300", .model = "WDC AC14300RT", .zones = 16, .avg_spt = 195, .heads = 2, .rpm = 5400, .full_stroke_ms = 21, .track_seek_ms = 5.5, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-4] Western Digital Caviar 23200", .internal_name = "AC23200", .model = "WDC AC23200LB", .zones = 16, .avg_spt = 210, .heads = 4, .rpm = 5400, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Western Digital Caviar 26400", .internal_name = "AC26400", .model = "WDC AC26400RN", .zones = 16, .avg_spt = 295, .heads = 5, .rpm = 5400, .full_stroke_ms = 21, .track_seek_ms = 3, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-4] Western Digital Caviar 33200", .internal_name = "AC33200", .model = "WDC AC33200LA", .zones = 16, .avg_spt = 310, .heads = 5, .rpm = 5200, .full_stroke_ms = 40, .track_seek_ms = 3, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-4] Western Digital Caviar 35100", .internal_name = "AC35100", .model = "WDC AC35100L", .version = "09.09M08", .zones = 16, .avg_spt = 315, .heads = 5, .rpm = 5400, .full_stroke_ms = 40, .track_seek_ms = 3, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-5] IBM Travelstar 6GN", .internal_name = "DARA206000", .model = "IBM-DARA-206000", .zones = 12, .avg_spt = 292, .heads = 2, .rpm = 4200, .full_stroke_ms = 31, .track_seek_ms = 4, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] IBM Travelstar 9GN", .internal_name = "DARA209000", .model = "IBM-DARA-209000", .zones = 12, .avg_spt = 292, .heads = 3, .rpm = 4200, .full_stroke_ms = 31, .track_seek_ms = 4, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] IBM/Hitachi Travelstar 12GN", .internal_name = "DARA212000", .model = "IBM-DARA-212000", .zones = 12, .avg_spt = 292, .heads = 4, .rpm = 4200, .full_stroke_ms = 31, .track_seek_ms = 4, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, // Either Hitachi or IBM OEM + { .name = "[ATA-5] Maxtor DiamondMax VL 17", .internal_name = "90871U2", .model = "Maxtor 90871U2", .zones = 16, .avg_spt = 290, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 0.9, .rcache_num_seg = 16, .rcache_seg_size = 256, .max_multiple = 32 }, + { .name = "[ATA-5] Maxtor DiamondMax VL 20 (91021U2)", .internal_name = "91021U2", .model = "Maxtor 91021U2", .zones = 16, .avg_spt = 295, .heads = 2, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Maxtor DiamondMax VL 20 (91531U3)", .internal_name = "91531U3", .model = "Maxtor 91531U3", .zones = 16, .avg_spt = 295, .heads = 3, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Maxtor DiamondMax VL 20 (92041U4)", .internal_name = "92041U4", .model = "Maxtor 92041U4", .zones = 16, .avg_spt = 295, .heads = 4, .rpm = 5400, .full_stroke_ms = 20, .track_seek_ms = 1, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Quantum Fireball EX3.2A", .internal_name = "EX32A012", .model = "QUANTUM FIREBALL EX3.2A", .zones = 1, .avg_spt = 210, .heads = 2, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-5] Quantum Fireball EX5.1A", .internal_name = "EX51A012", .model = "QUANTUM FIREBALL EX5.1A", .zones = 2, .avg_spt = 210, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-5] Quantum Fireball EX6.4A", .internal_name = "EX64A012", .model = "QUANTUM FIREBALL EX6.4A", .zones = 2, .avg_spt = 210, .heads = 4, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-5] Quantum Fireball EX10.2A", .internal_name = "EX10A011", .model = "QUANTUM FIREBALL EX10.2A", .zones = 3, .avg_spt = 210, .heads = 6, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-5] Quantum Fireball EX12.7A", .internal_name = "EX12A011", .model = "QUANTUM FIREBALL EX12.7A", .zones = 4, .avg_spt = 210, .heads = 8, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-5] Quantum Fireball CR4.3A", .internal_name = "CR43A013", .model = "QUANTUM FIREBALL CR4.3A", .zones = 2, .avg_spt = 310, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-5] Quantum Fireball CR6.4A", .internal_name = "CR64A011", .model = "QUANTUM FIREBALL CR6.4A", .zones = 2, .avg_spt = 310, .heads = 4, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-5] Quantum Fireball CR8.4A", .internal_name = "CR84A011", .model = "QUANTUM FIREBALL CR8.4A", .zones = 3, .avg_spt = 310, .heads = 6, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-5] Quantum Fireball CR13.0A", .internal_name = "CR13A011", .model = "QUANTUM FIREBALL CR13.0A", .zones = 4, .avg_spt = 310, .heads = 8, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 2, .rcache_num_seg = 8, .rcache_seg_size = 512, .max_multiple = 16 }, + { .name = "[ATA-5] Samsung SpinPoint V6800 (SV0682D)", .internal_name = "SV0682D", .model = "SAMSUNG SV0682D", .zones = 8, .avg_spt = 295, .heads = 2, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Samsung SpinPoint V6800 (SV1023D)", .internal_name = "SV1023D", .model = "SAMSUNG SV1023D", .zones = 8, .avg_spt = 295, .heads = 3, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Samsung SpinPoint V6800 (SV1364D)", .internal_name = "SV1364D", .model = "SAMSUNG SV1364D", .zones = 8, .avg_spt = 295, .heads = 4, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Samsung SpinPoint V6800 (SV1705D)", .internal_name = "SV1705D", .model = "SAMSUNG SV1705D", .zones = 8, .avg_spt = 295, .heads = 5, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Samsung SpinPoint V6800 (SV2046D)", .internal_name = "SV2046D", .model = "SAMSUNG SV2046D", .zones = 8, .avg_spt = 295, .heads = 6, .rpm = 5400, .full_stroke_ms = 18, .track_seek_ms = 1.3, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Seagate U8 - 4.3gb", .internal_name = "ST34313A", .model = "ST34313A", .zones = 16, .avg_spt = 289, .heads = 1, .rpm = 5400, .full_stroke_ms = 25, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Seagate U8 - 8.4gb", .internal_name = "ST38410A", .model = "ST38410A", .zones = 16, .avg_spt = 289, .heads = 2, .rpm = 5400, .full_stroke_ms = 25, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Seagate U8 - 13gb", .internal_name = "ST313021A", .model = "ST313021A", .zones = 16, .avg_spt = 289, .heads = 4, .rpm = 5400, .full_stroke_ms = 25, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Seagate U8 - 17.2gb", .internal_name = "ST317221A", .model = "ST317221A", .zones = 16, .avg_spt = 289, .heads = 3, .rpm = 5400, .full_stroke_ms = 25, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Western Digital Caviar 102AA", .internal_name = "WD102AA", .model = "WDC WD102AA-00ANA0", .zones = 16, .avg_spt = 295, .heads = 8, .rpm = 5400, .full_stroke_ms = 12, .track_seek_ms = 1.5, .rcache_num_seg = 16, .rcache_seg_size = 512, .max_multiple = 32 }, + { .name = "[ATA-5] Western Digital Expert", .internal_name = "WD135BA", .model = "WDC WD135BA-60AK", .zones = 16, .avg_spt = 350, .heads = 6, .rpm = 7200, .full_stroke_ms = 15, .track_seek_ms = 2, .rcache_num_seg = 16, .rcache_seg_size = 1920, .max_multiple = 32 }, // clang-format on }; @@ -636,8 +636,8 @@ hdd_preset_apply(int hdd_id) if (preset->model) hd->model = preset->model; - if (preset->version_ex) - hd->version_ex = preset->version_ex; + if (preset->version) + hd->version = preset->version; if (!hd->speed_preset) return; diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index fb1b0c31e..d6d27da3b 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -77,7 +77,7 @@ int lastbyte = 0; int floppymodified[4]; int floppyrate[4]; -int fdc_current[FDC_MAX] = { 0, 0 }; +int fdc_current[FDC_MAX] = { FDC_INTERNAL, 0 }; volatile int fdcinited = 0; @@ -2882,4 +2882,4 @@ const device_t fdc_ps2_mca_device = { .speed_changed = NULL, .force_redraw = NULL, .config = NULL -}; \ No newline at end of file +}; diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index c10ed6e4a..6b033fc18 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -332,7 +332,7 @@ struct accelKey { char desc[64]; char seq[64]; }; -#define NUM_ACCELS 10 +#define NUM_ACCELS 14 extern struct accelKey acc_keys[NUM_ACCELS]; extern struct accelKey def_acc_keys[NUM_ACCELS]; extern int FindAccelerator(const char *name); diff --git a/src/include/86box/device.h b/src/include/86box/device.h index b6e78f41c..58edab35c 100644 --- a/src/include/86box/device.h +++ b/src/include/86box/device.h @@ -206,6 +206,7 @@ extern void *device_get_priv(const device_t *dev); extern int device_available(const device_t *dev); extern void device_speed_changed(void); extern void device_force_redraw(void); +extern const char *device_get_bus_name(const device_t *dev); extern void device_get_name(const device_t *dev, int bus, char *name); extern int device_has_config(const device_t *dev); diff --git a/src/include/86box/hdd.h b/src/include/86box/hdd.h index d8f275de3..dc45bb9ec 100644 --- a/src/include/86box/hdd.h +++ b/src/include/86box/hdd.h @@ -90,6 +90,7 @@ typedef struct hdd_preset_t { const char *name; const char *internal_name; const char *model; + const char *version; uint32_t zones; uint32_t avg_spt; uint32_t heads; @@ -99,7 +100,6 @@ typedef struct hdd_preset_t { uint32_t max_multiple; double full_stroke_ms; double track_seek_ms; - const char *version_ex; } hdd_preset_t; typedef struct hdd_cache_seg_t { @@ -188,7 +188,7 @@ typedef struct hard_disk_t { const char *model; - const char *version_ex; + const char *version; hdd_zone_t zones[HDD_MAX_ZONES]; diff --git a/src/include/86box/machine.h b/src/include/86box/machine.h index c648ea4f4..92b448eeb 100644 --- a/src/include/86box/machine.h +++ b/src/include/86box/machine.h @@ -734,6 +734,7 @@ extern int machine_at_dell466np_init(const machine_t *); extern int machine_at_valuepoint433_init(const machine_t *); /* VLSI 82C480 */ +extern int machine_at_monsoon_init(const machine_t *); extern int machine_at_martin_init(const machine_t *); /* m_at_socket3.c */ @@ -1205,6 +1206,7 @@ extern int machine_at_ma30d_init(const machine_t *); /* i440EX */ extern int machine_at_brio83xx_init(const machine_t *); extern int machine_at_p6i440e2_init(const machine_t *); +extern int machine_at_como_init(const machine_t *); /* i440BX */ extern int machine_at_bf6_init(const machine_t *); @@ -1223,6 +1225,10 @@ extern const device_t ga686_device; #endif extern int machine_at_ga686_init(const machine_t *); #ifdef EMU_DEVICE_H +extern const device_t ms6117_device; +#endif +extern int machine_at_ms6117_init(const machine_t *); +#ifdef EMU_DEVICE_H extern const device_t ms6119_device; #endif extern int machine_at_ms6119_init(const machine_t *); diff --git a/src/include/86box/nvr.h b/src/include/86box/nvr.h index 9485c7dcb..4d187b785 100644 --- a/src/include/86box/nvr.h +++ b/src/include/86box/nvr.h @@ -95,6 +95,7 @@ extern const device_t ami_1992_nvr_device; extern const device_t ami_1994_nvr_device; extern const device_t ami_1995_nvr_device; extern const device_t via_nvr_device; +extern const device_t piix4_ami_1995_nvr_device; extern const device_t p6rp4_nvr_device; extern const device_t martin_nvr_device; extern const device_t elt_nvr_device; diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index 316825f10..efbd06898 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -151,6 +151,9 @@ extern void plat_resize_request(int x, int y, int monitor_index); extern int plat_language_code(char *langcode); extern void plat_language_code_r(int id, char *outbuf, int len); extern void plat_get_cpu_string(char *outbuf, uint8_t len); +#ifdef _WIN32 +extern void plat_get_system_directory(char *outbuf); +#endif extern void plat_set_thread_name(void *thread, const char *name); extern void plat_break(void); extern void plat_send_to_clipboard(unsigned char *rgb, int width, int height); diff --git a/src/include/86box/sound.h b/src/include/86box/sound.h index 9dec03231..71cd65e5a 100644 --- a/src/include/86box/sound.h +++ b/src/include/86box/sound.h @@ -131,8 +131,6 @@ extern const device_t ad1816_device; /* Aztech Sound Galaxy 16 */ extern const device_t azt2316a_device; -extern const device_t acermagic_s20_device; -extern const device_t mirosound_pcm10_device; extern const device_t azt1605_device; extern const device_t aztpr16_device; @@ -231,6 +229,8 @@ extern const device_t entertainer_device; extern const device_t mmb_device; /* OPTi 82c93x */ +extern const device_t acermagic_s20_device; +extern const device_t mirosound_pcm10_device; extern const device_t opti_82c930_device; extern const device_t opti_82c931_device; diff --git a/src/include/86box/timer.h b/src/include/86box/timer.h index 37a03d9ca..38784e154 100644 --- a/src/include/86box/timer.h +++ b/src/include/86box/timer.h @@ -1,6 +1,14 @@ #ifndef _TIMER_H_ #define _TIMER_H_ +#ifndef int128_t +#define int128_t __int128 +#endif + +#ifndef uint128_t +#define uint128_t unsigned __int128 +#endif + extern uint64_t tsc; /* Maximum period, currently 1 second. */ @@ -11,18 +19,6 @@ extern uint64_t tsc; #define TIMER_SPLIT 2 #define TIMER_ENABLED 1 -#pragma pack(push, 1) -typedef struct ts_struct_t { - uint32_t frac; - uint32_t integer; -} ts_struct_t; -#pragma pack(pop) - -typedef union ts_t { - uint64_t ts64; - ts_struct_t ts32; -} ts_t; - /*Timers are based on the CPU Time Stamp Counter. Timer timestamps are in a 32:32 fixed point format, with the integer part compared against the TSC. The fractional part is used when advancing the timestamp to ensure a more accurate @@ -36,12 +32,8 @@ typedef union ts_t { to repeat, the callback must call timer_advance_u64(). This is a change from the old timer API.*/ typedef struct pc_timer_t { -#ifdef USE_PCEM_TIMER - uint32_t ts_integer; + uint64_t ts_integer; uint32_t ts_frac; -#else - ts_t ts; -#endif int flags; /* The flags are defined above. */ int in_callback; double period; /* This is used for large period timers to count @@ -60,7 +52,7 @@ extern "C" { /*Timestamp of nearest enabled timer. CPU emulation must call timer_process() when TSC matches or exceeds this.*/ -extern uint32_t timer_target; +extern uint64_t timer_target; /*Enable timer, without updating timestamp*/ extern void timer_enable(pc_timer_t *timer); @@ -82,18 +74,31 @@ extern void timer_add(pc_timer_t *timer, void (*callback)(void *priv), void *pri extern uint64_t TIMER_USEC; /*True if timer a expires before timer b*/ -#define TIMER_LESS_THAN(a, b) ((int64_t) ((a)->ts.ts64 - (b)->ts.ts64) <= 0) +#define TIMER_LESS_THAN(a, b) ((int64_t) ((a)->ts_integer - (b)->ts_integer) <= 0) /*True if timer a expires before 32 bit integer timestamp b*/ -#define TIMER_LESS_THAN_VAL(a, b) ((int32_t) ((a)->ts.ts32.integer - (b)) <= 0) +#define TIMER_LESS_THAN_VAL(a, b) ((int64_t) ((a)->ts_integer - (b)) <= 0) /*True if 32 bit integer timestamp a expires before 32 bit integer timestamp b*/ -#define TIMER_VAL_LESS_THAN_VAL(a, b) ((int32_t) ((a) - (b)) <= 0) +#define TIMER_VAL_LESS_THAN_VAL(a, b) ((int64_t) ((a) - (b)) <= 0) + +#ifndef printf +#include +#endif /*Advance timer by delay, specified in 32:32 format. This should be used to resume a recurring timer in a callback routine*/ static __inline void timer_advance_u64(pc_timer_t *timer, uint64_t delay) { - timer->ts.ts64 += delay; + uint64_t int_delay = delay >> 32; + uint32_t frac_delay = delay & 0xffffffff; + + if (int_delay & 0x0000000080000000ULL) + int_delay |= 0xffffffff00000000ULL; + + if ((frac_delay + timer->ts_frac) < frac_delay) + timer->ts_integer++; + timer->ts_frac += frac_delay; + timer->ts_integer += int_delay; timer_enable(timer); } @@ -103,9 +108,14 @@ timer_advance_u64(pc_timer_t *timer, uint64_t delay) static __inline void timer_set_delay_u64(pc_timer_t *timer, uint64_t delay) { - timer->ts.ts64 = 0ULL; - timer->ts.ts32.integer = tsc; - timer->ts.ts64 += delay; + uint64_t int_delay = delay >> 32; + uint32_t frac_delay = delay & 0xffffffff; + + if (int_delay & 0x0000000080000000ULL) + int_delay |= 0xffffffff00000000ULL; + + timer->ts_frac = frac_delay; + timer->ts_integer = int_delay + (uint64_t)tsc; timer_enable(timer); } @@ -125,21 +135,19 @@ timer_is_on(pc_timer_t *timer) } /*Return integer timestamp of timer*/ -static __inline uint32_t +static __inline uint64_t timer_get_ts_int(pc_timer_t *timer) { - return timer->ts.ts32.integer; + return timer->ts_integer; } /*Return remaining time before timer expires, in us. If the timer has already expired then return 0*/ -static __inline uint32_t +static __inline uint64_t timer_get_remaining_us(pc_timer_t *timer) { - int64_t remaining; - if (timer->flags & TIMER_ENABLED) { - remaining = (int64_t) (timer->ts.ts64 - (uint64_t) (tsc << 32)); + int128_t remaining = (((uint128_t)timer->ts_integer << 32) | timer->ts_frac) - ((uint128_t)tsc << 32); if (remaining < 0) return 0; @@ -151,13 +159,11 @@ timer_get_remaining_us(pc_timer_t *timer) /*Return remaining time before timer expires, in 32:32 timestamp format. If the timer has already expired then return 0*/ -static __inline uint64_t +static __inline uint128_t timer_get_remaining_u64(pc_timer_t *timer) { - int64_t remaining; - if (timer->flags & TIMER_ENABLED) { - remaining = (int64_t) (timer->ts.ts64 - (uint64_t) (tsc << 32)); + int128_t remaining = (((uint128_t)timer->ts_integer << 32) | timer->ts_frac) - ((uint128_t)tsc << 32); if (remaining < 0) return 0; diff --git a/src/include/86box/vid_voodoo_common.h b/src/include/86box/vid_voodoo_common.h index 2870f09ea..a6174e1cd 100644 --- a/src/include/86box/vid_voodoo_common.h +++ b/src/include/86box/vid_voodoo_common.h @@ -74,6 +74,13 @@ typedef union rgba_u { #define FIFO_FULL ((voodoo->fifo_write_idx - voodoo->fifo_read_idx) >= FIFO_SIZE - 4) #define FIFO_EMPTY (voodoo->fifo_read_idx == voodoo->fifo_write_idx) +#define VOODOO_BUF_FRONT 0 +#define VOODOO_BUF_BACK 1 +#define VOODOO_BUF_AUX 2 +#define VOODOO_BUF_UNKNOWN 3 +#define VOODOO_BUF_COUNT 4 +#define VOODOO_BUF_NONE 0xff + #define FIFO_TYPE 0xff000000 #define FIFO_ADDR 0x00ffffff @@ -98,6 +105,8 @@ typedef struct { uint32_t addr_type; uint32_t val; + uint8_t target_buf; + uint8_t pad[3]; } fifo_entry_t; typedef struct voodoo_params_t { @@ -356,6 +365,8 @@ typedef struct voodoo_t { event_t *wake_fifo_thread; event_t *wake_main_thread; event_t *fifo_not_full_event; + event_t *fifo_empty_event; + ATOMIC_INT fifo_empty_signaled; event_t *render_not_full_event[4]; event_t *wake_render_thread[4]; @@ -399,6 +410,8 @@ typedef struct voodoo_t { ATOMIC_INT cmd_written; ATOMIC_INT cmd_written_fifo; ATOMIC_INT cmd_written_fifo_2; + ATOMIC_INT pending_fb_writes_buf[VOODOO_BUF_COUNT]; + ATOMIC_INT pending_draw_cmds_buf[VOODOO_BUF_COUNT]; voodoo_params_t params_buffer[PARAM_SIZE]; ATOMIC_INT params_read_idx[4]; @@ -627,6 +640,12 @@ typedef struct voodoo_t { int fb_write_buffer; int fb_draw_buffer; int buffer_cutoff; + int queued_disp_buffer; + int queued_draw_buffer; + int queued_fb_write_buffer; + int queued_fb_draw_buffer; + uint32_t queued_lfbMode; + uint32_t queued_fbzMode; uint32_t tile_base; uint32_t tile_stride; @@ -657,6 +676,32 @@ typedef struct voodoo_t { uint64_t time; int render_time[4]; + uint64_t fifo_full_waits; + uint64_t fifo_full_wait_ticks; + uint64_t fifo_full_spin_checks; + uint64_t fifo_empty_waits; + uint64_t fifo_empty_wait_ticks; + uint64_t fifo_empty_spin_checks; + uint64_t render_waits; + uint64_t render_wait_ticks; + uint64_t render_wait_spin_checks; + uint64_t readl_fb_count; + uint64_t readl_fb_sync_count; + uint64_t readl_fb_nosync_count; + uint64_t readl_fb_relaxed_count; + uint64_t readl_fb_sync_buf[3]; + uint64_t readl_fb_nosync_buf[3]; + uint64_t readl_fb_relaxed_buf[3]; + uint64_t readl_reg_count; + uint64_t readl_tex_count; + int wait_stats_enabled; + int wait_stats_explicit; + int lfb_relax_enabled; + int lfb_relax_full; + int lfb_relax_ignore_cmdfifo; + int lfb_relax_ignore_draw; + int lfb_relax_ignore_fb_writes; + int lfb_relax_front_sync; int force_blit_count; int can_blit; diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index f056397a1..8e4a16c60 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -784,7 +784,7 @@ const device_config_t vid_1512_config[] = { }; const device_t vid_1512_device = { - .name = "Amstrad PC1512 (video)", + .name = "Amstrad PC1512 (Video)", .internal_name = "vid_1512", .flags = 0, .local = 0, @@ -985,7 +985,7 @@ const device_config_t vid_1640_config[] = { }; const device_t vid_1640_device = { - .name = "Amstrad PC1640 (video)", + .name = "Amstrad PC1640 (Video)", .internal_name = "vid_1640", .flags = 0, .local = 0, @@ -1911,7 +1911,7 @@ const device_config_t vid_200_config[] = { }; const device_t vid_200_device = { - .name = "Amstrad PC200 (video)", + .name = "Amstrad PC200 (Video)", .internal_name = "vid_200", .flags = 0, .local = 0, @@ -2019,7 +2019,7 @@ const device_config_t vid_ppc512_config[] = { }; const device_t vid_ppc512_device = { - .name = "Amstrad PPC512 (video)", + .name = "Amstrad PPC512 (Video)", .internal_name = "vid_ppc512", .flags = 0, .local = 0, @@ -2036,7 +2036,7 @@ const device_config_t vid_pc2086_config[] = { // clang-format off { .name = "language", - .description = "BIOS language", + .description = "BIOS Language", .type = CONFIG_SELECTION, .default_string = NULL, .default_int = 7, @@ -2054,7 +2054,7 @@ const device_config_t vid_pc2086_config[] = { }; const device_t vid_pc2086_device = { - .name = "Amstrad PC2086", + .name = "Amstrad PC2086 (Video)", .internal_name = "vid_pc2086", .flags = 0, .local = 0, @@ -2071,7 +2071,7 @@ const device_config_t vid_pc3086_config[] = { // clang-format off { .name = "language", - .description = "BIOS language", + .description = "BIOS Language", .type = CONFIG_SELECTION, .default_string = NULL, .default_int = 7, @@ -2089,7 +2089,7 @@ const device_config_t vid_pc3086_config[] = { }; const device_t vid_pc3086_device = { - .name = "Amstrad PC3086", + .name = "Amstrad PC3086 (Video)", .internal_name = "vid_pc3086", .flags = 0, .local = 0, diff --git a/src/machine/m_at_286.c b/src/machine/m_at_286.c index 499f0653a..ad36e3245 100644 --- a/src/machine/m_at_286.c +++ b/src/machine/m_at_286.c @@ -938,7 +938,7 @@ machine_at_pc7286_init(const machine_t *model) machine_at_common_init_ex(model, 2); if (gfxcard[0] == VID_INTERNAL) - device_add(&gd5401_onboard_device); + device_add(machine_get_vid_device(machine)); device_add_params(&dw90c50_device, (void *) DW90C50_IDE); device_add(&vl82c113_device); /* The keyboard controller is part of the VL82c113. */ @@ -1161,7 +1161,7 @@ machine_at_spc4620p_init(const machine_t *model) return ret; if (gfxcard[0] == VID_INTERNAL) - device_add(&ati28800k_spc4620p_device); + device_add(machine_get_vid_device(machine)); machine_at_scat_init(model, 1, 1); diff --git a/src/machine/m_at_386sx.c b/src/machine/m_at_386sx.c index ae9870c77..9ad29e2e8 100644 --- a/src/machine/m_at_386sx.c +++ b/src/machine/m_at_386sx.c @@ -750,7 +750,7 @@ machine_at_wd76c10_init(const machine_t *model) machine_at_common_init_ex(model, 2); if (gfxcard[0] == VID_INTERNAL) - device_add(¶dise_wd90c11_megapc_device); + device_add(machine_get_vid_device(machine)); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); diff --git a/src/machine/m_at_slot1.c b/src/machine/m_at_slot1.c index 578814a8f..713ab09c0 100644 --- a/src/machine/m_at_slot1.c +++ b/src/machine/m_at_slot1.c @@ -307,6 +307,167 @@ machine_at_spitfire_init(const machine_t *model) return ret; } +static const device_config_t ms6117_config[] = { + // clang-format off + { + .name = "bios", + .description = "BIOS Version", + .type = CONFIG_BIOS, + .default_string = "ms6117a", + .default_int = 0, + .file_filter = NULL, + .spinner = { 0 }, + .selection = { { 0 } }, + .bios = { + { + .name = "AMIBIOS 6 (071595) - Revision 2.0", + .internal_name = "ms6117a", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ms6117/A617MS20.ROM", "" } + }, + { + .name = "AMIBIOS 6 (071595) - Revision 1.10j (Japanese)", + .internal_name = "ms6117aj", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ms6117/A617J110.ROM", "" } + }, + { + .name = "AMIBIOS 6 (071595) - Revision 3.11sc (Simplified Chinese)", + .internal_name = "ms6117asc", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ms6117/A617C311.ROM", "" } + }, + { + .name = "AMIBIOS 6 (071595) - Revision 4.10tc (Traditional Chinese)", + .internal_name = "ms6117atc", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ms6117/A617C410.ROM", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 3.2", + .internal_name = "ms6117w", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/ms6117/W617MS32.BIN", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 3.2 [Patched for larger drives]", + .internal_name = "ms6117wp", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/ms6117/611732x_patched.BIN", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 1.4 (Fujitsu-Siemens OEM)", + .internal_name = "ms6117wfs", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ms6117/AWARD 1.04 .BIN", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 1.02 (LG IBM Multinet x7E)", + .internal_name = "ms6117wlg", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/ms6117/BIOS.BIN", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision 1.5 (Viglen Vig67M)", + .internal_name = "ms6117wvi", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 131072, + .files = { "roms/machines/ms6117/w617v115.BIN", "" } + }, + { .files_no = 0 } + } + }, + { .name = "", .description = "", .type = CONFIG_END } + // clang-format on +}; + +const device_t ms6117_device = { + .name = "MSI MS-6117", + .internal_name = "ms6117", + .flags = 0, + .local = 0, + .init = NULL, + .close = NULL, + .reset = NULL, + .available = NULL, + .speed_changed = NULL, + .force_redraw = NULL, + .config = ms6117_config +}; + +int +machine_at_ms6117_init(const machine_t *model) +{ + int ret = 0; + const char *fn; + + /* No ROMs available */ + if (!device_available(model->device)) + return ret; + + device_context(model->device); + fn = device_get_bios_file(machine_get_device(machine), device_get_config_bios("bios"), 0); + if (!strcmp(fn, "roms/machines/ms6117/W617MS32.BIN") || !strcmp(fn, "roms/machines/ms6117/611732x_patched.BIN") || !strcmp(fn, "roms/machines/ms6117/BIOS.BIN")) + ret = bios_load_linear(fn, 0x000c0000, 262144, 0); + else + ret = bios_load_linear(fn, 0x000e0000, 131072, 0); + device_context_restore(); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x0E, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x0F, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x10, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x11, PCI_CARD_NORMAL, 4, 1, 2, 3); + pci_register_slot(0x12, PCI_CARD_NORMAL, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + + device_add(&i440lx_device); + device_add(&piix4e_device); + device_add_params(&w83977_device, (void *) (W83977TF | W83977_AMI | W83977_NO_NVR)); + + if (!strcmp(fn, "roms/machines/ms6117/W617MS32.BIN") || !strcmp(fn, "roms/machines/ms6117/611732x_patched.BIN") || !strcmp(fn, "roms/machines/ms6117/BIOS.BIN")) + device_add(&winbond_flash_w29c020_device); /* assumed */ + else + device_add(&winbond_flash_w29c011a_device); + + spd_register(SPD_TYPE_SDRAM, 0xF, 256); + + return ret; +} + int machine_at_ma30d_init(const machine_t *model) { @@ -383,6 +544,39 @@ machine_at_brio83xx_init(const machine_t *model) return ret; } +int +machine_at_como_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear("roms/machines/como/COMO.ROM", + 0x000c0000, 262144, 0); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + pci_init(PCI_CONFIG_TYPE_1); + pci_register_slot(0x00, PCI_CARD_NORTHBRIDGE, 0, 0, 0, 0); + pci_register_slot(0x01, PCI_CARD_AGPBRIDGE, 1, 2, 3, 4); + pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 4); + pci_register_slot(0x0B, PCI_CARD_NORMAL, 3, 4, 1, 2); + pci_register_slot(0x12, PCI_CARD_NORMAL, 2, 3, 4, 1); + pci_register_slot(0x13, PCI_CARD_NORMAL, 1, 2, 3, 4); + + device_add(&i440ex_device); + device_add(&piix4e_device); + device_add_params(&fdc37m60x_device, (void*)(FDC37XXX2 | FDC37C93X_NO_NVR | FDC37XXXX_370)); + device_add(&intel_flash_bxt_device); + device_add(&lm78_device); + + if (sound_card_current[0] == SOUND_INTERNAL) + device_add(&cs4235_onboard_device); + + return ret; +} + int machine_at_p6i440e2_init(const machine_t *model) { @@ -757,7 +951,16 @@ static const device_config_t ga686_config[] = { .files = { "roms/machines/686bx/31nologo.bin", "" } }, { - .name = "Award Modular BIOS v4.51PG - Revision F2a", + .name = "Award Modular BIOS v4.51PG - Revision F1", + .internal_name = "686bx_f1", + .bios_type = BIOS_NORMAL, + .files_no = 1, + .local = 0, + .size = 262144, + .files = { "roms/machines/686bx/6BX.F1", "" } + }, + { + .name = "Award Modular BIOS v4.51PG - Revision F2a (Beta)", .internal_name = "686bx", .bios_type = BIOS_NORMAL, .files_no = 1, @@ -876,7 +1079,7 @@ static const device_config_t ms6119_config[] = { .files = { "roms/machines/ms6119/vig69m.212", "" } }, { - .name = "Award Modular BIOS v4.51PG - Revision 3.30b1 (LG IBM Multinet i x7G)", + .name = "Award Modular BIOS v4.51PG - Revision 3.30b1 (LG IBM Multinet x7G)", .internal_name = "lgibmx7g", .bios_type = BIOS_NORMAL, .files_no = 1, @@ -1496,7 +1699,7 @@ static const device_config_t ms6199va_config[] = { .files = { "roms/machines/ms6199va/w6199vms.350", "" } }, { - .name = "Award Modular BIOS v4.51PG - Revision 2.0 (Compaq OEM)", + .name = "Award Modular BIOS v4.51PG - Revision 2.0 (Compaq ProSignia/Deskpro 693A)", .internal_name = "ms6199va_200", .bios_type = BIOS_NORMAL, .files_no = 1, @@ -1505,7 +1708,7 @@ static const device_config_t ms6199va_config[] = { .files = { "roms/machines/ms6199va/W6199VC8.BIN", "" } }, { - .name = "Award Modular BIOS v4.51PG - Revision 2.0 (Compaq OEM) [patched for large drives]", + .name = "Award Modular BIOS v4.51PG - Revision 2.0 (Compaq ProSignia/Deskpro 693A) [Patched for larger drives]", .internal_name = "ms6199va_200p", .bios_type = BIOS_NORMAL, .files_no = 1, @@ -1514,7 +1717,7 @@ static const device_config_t ms6199va_config[] = { .files = { "roms/machines/ms6199va/W6199VC8.PCD", "" } }, { - .name = "Award Modular BIOS v4.51PG - Revision 3.7 (Packard Bell OEM)", + .name = "Award Modular BIOS v4.51PG - Revision 3.7 (Packard Bell Phoenix)", .internal_name = "ms6199va_370", .bios_type = BIOS_NORMAL, .files_no = 1, diff --git a/src/machine/m_at_socket2.c b/src/machine/m_at_socket2.c index 8ea151f53..d8fdd79f1 100644 --- a/src/machine/m_at_socket2.c +++ b/src/machine/m_at_socket2.c @@ -92,7 +92,7 @@ machine_at_acera1g_init(const machine_t *model) device_add(&ali1429g_device); if (gfxcard[0] == VID_INTERNAL) - device_add(&gd5428_onboard_device); + device_add(machine_get_vid_device(machine)); device_add_params(machine_get_kbc_device(machine), (void *) model->kbc_params); @@ -343,6 +343,7 @@ machine_at_valuepoint433_init(const machine_t *model) // hangs without the PS/2 machine_at_common_ide_init(model); device_add(&sis_85c461_device); + if (gfxcard[0] == VID_INTERNAL) device_add(&et4000w32_onboard_device); @@ -364,6 +365,33 @@ machine_at_valuepoint433_init(const machine_t *model) // hangs without the PS/2 } /* VLSI 82C480 */ +int +machine_at_monsoon_init(const machine_t *model) +{ + int ret; + + ret = bios_load_linear_combined("roms/machines/monsoon/1009AC0_.BIO", + "roms/machines/monsoon/1009AC0_.BI1", 0x1c000, 128); + + if (bios_only || !ret) + return ret; + + machine_at_common_init_ex(model, 2); + + device_add(&vl82c480_device); + device_add(&vl82c113_device); + + device_add(&ide_vlb_device); + device_add_params(&fdc37c6xx_device, (void *) (FDC37C651 | FDC37C6XX_IDE_PRI)); + + device_add(&intel_flash_bxt_device); + + if (gfxcard[0] == VID_INTERNAL) + device_add(machine_get_vid_device(machine)); + + return ret; +} + int machine_at_martin_init(const machine_t *model) { diff --git a/src/machine/m_at_socket370.c b/src/machine/m_at_socket370.c index a1ec1a30c..6627c7097 100644 --- a/src/machine/m_at_socket370.c +++ b/src/machine/m_at_socket370.c @@ -512,7 +512,7 @@ static const device_config_t ms6318_config[] = { .files = { "roms/machines/ms6318/ms-6318-ver5.bin", "" } }, { - .name = "Award Modular BIOS v6.00PG - Revision 1.8 (HP OEM)", + .name = "Award Modular BIOS v6.00PG - Revision 1.8 (HP Pavilion A7xx)", .internal_name = "ms6318_180", .bios_type = BIOS_NORMAL, .files_no = 1, @@ -521,7 +521,7 @@ static const device_config_t ms6318_config[] = { .files = { "roms/machines/ms6318/med2000v2.bin", "" } }, { - .name = "Award Modular BIOS v6.00PG - Revision 1.9 (HP OEM)", + .name = "Award Modular BIOS v6.00PG - Revision 1.9 (HP Pavilion A8xx)", .internal_name = "ms6318_190", .bios_type = BIOS_NORMAL, .files_no = 1, @@ -530,7 +530,7 @@ static const device_config_t ms6318_config[] = { .files = { "roms/machines/ms6318/med2000.bin", "" } }, { - .name = "Award Modular BIOS v6.00PG - Revision 2.02 (HP OEM)", + .name = "Award Modular BIOS v6.00PG - Revision 2.02 (HP Medion 2000A)", .internal_name = "ms6318_202", .bios_type = BIOS_NORMAL, .files_no = 1, @@ -539,7 +539,7 @@ static const device_config_t ms6318_config[] = { .files = { "roms/machines/ms6318/ms6318hp.bin", "" } }, { - .name = "Award Modular BIOS v6.00PG - Revision 1.3 (Medion OEM)", + .name = "Award Modular BIOS v6.00PG - Revision 1.3 (Medion MED 2000)", .internal_name = "ms6318_130", .bios_type = BIOS_NORMAL, .files_no = 1, @@ -548,7 +548,7 @@ static const device_config_t ms6318_config[] = { .files = { "roms/machines/ms6318/ms6318.bin", "" } }, { - .name = "Award Modular BIOS v6.00PG - Revision 7.51 (Medion OEM)", + .name = "Award Modular BIOS v6.00PG - Revision 7.51 (Medion MD6318)", .internal_name = "ms6318_751", .bios_type = BIOS_NORMAL, .files_no = 1, diff --git a/src/machine/m_at_socket7.c b/src/machine/m_at_socket7.c index 31580e6e3..7261e2616 100644 --- a/src/machine/m_at_socket7.c +++ b/src/machine/m_at_socket7.c @@ -1211,7 +1211,7 @@ machine_at_pb810_init(const machine_t *model) pci_register_slot(0x07, PCI_CARD_SOUTHBRIDGE, 0, 0, 0, 0); if (sound_card_current[0] == SOUND_INTERNAL) - device_add(&cs4237b_device); + machine_snd = device_add(machine_get_snd_device(machine)); device_add(&i430vx_device); device_add(&piix3_device); diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 10d2d0c7b..d26dae71f 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -848,7 +848,7 @@ static const device_config_t pcjr_config[] = { }; const device_t pcjr_device = { - .name = "IBM PCjr", + .name = "IBM PCjr (Video)", .internal_name = "pcjr", .flags = 0, .local = 0, diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index e6c64cf95..d8cb81956 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -2119,7 +2119,7 @@ const device_config_t m19_vid_config[] = { }; const device_t m19_vid_device = { - .name = "Olivetti M19 graphics card", + .name = "Olivetti M19 (Video)", .internal_name = "m19_vid", .flags = 0, .local = 0, diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 86729cd66..2cd3db8a5 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -49,7 +49,7 @@ const machine_filter_t machine_types[] = { { "[1992] 486SLC", MACHINE_TYPE_486SLC }, { "[1985] i386DX", MACHINE_TYPE_386DX }, { "[1989] i386DX/i486", MACHINE_TYPE_386DX_486 }, - { "[1992] i486 (Socket 168 and 1)", MACHINE_TYPE_486 }, + { "[1989] i486 (Socket 168 and 1)", MACHINE_TYPE_486 }, { "[1992] i486 (Socket 2)", MACHINE_TYPE_486_S2 }, { "[1994] i486 (Socket 3)", MACHINE_TYPE_486_S3 }, { "[1994] i486 (Socket 3 PCI)", MACHINE_TYPE_486_S3_PCI }, @@ -2685,7 +2685,7 @@ const machine_t machines[] = { .kbd_device = &keyboard_pc_xt_device, .fdc_device = NULL, .sio_device = NULL, - .vid_device = NULL, + .vid_device = NULL, /* Discrete onboard video card? */ .snd_device = NULL, .net_device = NULL }, @@ -4442,7 +4442,7 @@ const machine_t machines[] = { .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, - .vid_device = NULL, + .vid_device = &gd5401_onboard_device, .snd_device = NULL, .net_device = NULL }, @@ -4884,7 +4884,7 @@ const machine_t machines[] = { .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, - .vid_device = NULL, + .vid_device = &ati28800k_spc4620p_device, .snd_device = NULL, .net_device = NULL }, @@ -5373,7 +5373,7 @@ const machine_t machines[] = { .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, - .vid_device = &tvga8900d_device, + .vid_device = &tvga8900d_device, /* Onboard variant not yet emulated */ .snd_device = NULL, .net_device = NULL }, @@ -5684,7 +5684,7 @@ const machine_t machines[] = { .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, - .vid_device = NULL, + .vid_device = &if386jega_device, .snd_device = NULL, .net_device = NULL }, @@ -6043,7 +6043,7 @@ const machine_t machines[] = { .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, - .vid_device = NULL, + .vid_device = ¶dise_wd90c11_megapc_device, .snd_device = NULL, .net_device = NULL }, @@ -8445,7 +8445,51 @@ const machine_t machines[] = { .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, - .vid_device = NULL, + .vid_device = &et4000w32_onboard_device, + .snd_device = NULL, + .net_device = NULL + }, + /* Has a VLSI VL82C113A SCAMP Combination I/O which holds the KBC. */ + { + .name = "[VLSI 82C480] Intel Classic R/R Plus (Monsoon)", + .internal_name = "monsoon", + .type = MACHINE_TYPE_486_S2, + .chipset = MACHINE_CHIPSET_VLSI_VL82C480, + .init = machine_at_monsoon_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SOCKET3, + .block = CPU_BLOCK_NONE, + .min_bus = 0, + .max_bus = 0, + .min_voltage = 0, + .max_voltage = 0, + .min_multi = 0, + .max_multi = 0 + }, + .bus_flags = MACHINE_PS2, + .flags = MACHINE_IDE | MACHINE_VIDEO | MACHINE_APM, + .ram = { + .min = 2048, + .max = 32768, + .step = 2048 + }, + .nvrmask = 127, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x00000ce0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = &gd5428_vlb_onboard_device, .snd_device = NULL, .net_device = NULL }, @@ -10632,7 +10676,7 @@ const machine_t machines[] = { .fdc_device = NULL, .sio_device = NULL, .vid_device = &gd5430_onboard_pci_device, - .snd_device = &ess_1688_device, + .snd_device = &ess_1688_device, /* Onboard variant not yet emulated */ .net_device = NULL }, /* This has an AMIKey-2, which is an updated version of type 'H'. */ @@ -12069,7 +12113,7 @@ const machine_t machines[] = { .kbd_device = NULL, .fdc_device = NULL, .sio_device = NULL, - .vid_device = &s3_phoenix_vision864_pci_device, + .vid_device = &s3_phoenix_vision864_pci_device, /* Onboard variant not yet emulated */ .snd_device = NULL, .net_device = NULL }, @@ -15721,7 +15765,7 @@ const machine_t machines[] = { .fdc_device = NULL, .sio_device = NULL, .vid_device = NULL, - .snd_device = NULL, + .snd_device = &cs4237b_device, .net_device = NULL }, /* This has the AMIKey 'H' firmware, possibly AMIKey-2. Photos show it with a BestKey, so it @@ -16044,7 +16088,7 @@ const machine_t machines[] = { .fdc_device = NULL, .sio_device = NULL, .vid_device = &s3_trio64v2_dx_onboard_pci_device, - .snd_device = &cs4236b_device, + .snd_device = &cs4236b_onboard_device, .net_device = &pcnet_am79c973_onboard_device }, /* This has the Phoenix MultiKey KBC firmware on the NSC Super I/O chip. */ @@ -18218,6 +18262,51 @@ const machine_t machines[] = { .snd_device = NULL, .net_device = NULL }, + /* Has a Winbond W83977TF Super I/O chip with on-chip KBC with AMIKey-2 KBC + firmware. */ + { + .name = "[i440LX] MSI MS-6117", + .internal_name = "ms6117", + .type = MACHINE_TYPE_SLOT1, + .chipset = MACHINE_CHIPSET_INTEL_440LX, + .init = machine_at_ms6117_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = NULL, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SLOT1, + .block = CPU_BLOCK_NONE, + .min_bus = 66666667, + .max_bus = 75000000, + .min_voltage = 1800, + .max_voltage = 3500, + .min_multi = 2.0, + .max_multi = 8.0 + }, + .bus_flags = MACHINE_PS2_AGP | MACHINE_BUS_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_USB, + .ram = { + .min = 8192, + .max = 786432, /* Manual thinks the maximum memory is 1024MB (256x4MB), but there is no 4th memory slot */ + .step = 8192 + }, + .nvrmask = 255, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = &ms6117_device, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = NULL, + .net_device = NULL + }, /* Has a SM(S)C FDC37C67x Super I/O chip with on-chip KBC with Phoenix or AMIKey-2 KBC firmware. */ { @@ -18360,6 +18449,52 @@ const machine_t machines[] = { .net_device = NULL }, + /* Has a SMC FDC37M60x Super I/O chip with on-chip KBC with AMIKey-2 KBC + firmware. */ + { + .name = "[i440EX] TriGem Como", + .internal_name = "como", + .type = MACHINE_TYPE_SLOT1, + .chipset = MACHINE_CHIPSET_INTEL_440EX, + .init = machine_at_como_init, + .p1_handler = machine_generic_p1_handler, + .gpio_handler = machine_ap440fx_vs440fx_gpio_handler, + .available_flag = MACHINE_AVAILABLE, + .gpio_acpi_handler = NULL, + .cpu = { + .package = CPU_PKG_SLOT1, + .block = CPU_BLOCK(CPU_CYRIX3S), + .min_bus = 66666667, + .max_bus = 83333333, + .min_voltage = 2050, + .max_voltage = 3100, + .min_multi = 3.5, + .max_multi = 5.0 + }, + .bus_flags = MACHINE_PS2_PCI | MACHINE_BUS_USB, + .flags = MACHINE_IDE_DUAL | MACHINE_APM | MACHINE_ACPI | MACHINE_USB, + .ram = { + .min = 8192, + .max = 262144, + .step = 8192 + }, + .nvrmask = 255, + .jumpered_ecp_dma = 0, + .default_jumpered_ecp_dma = -1, + .kbc_device = NULL, + .kbc_params = 0x00000000, + .kbc_p1 = 0x00000cf0, + .gpio = 0xffffffff, + .gpio_acpi = 0xffffffff, + .device = NULL, + .kbd_device = NULL, + .fdc_device = NULL, + .sio_device = NULL, + .vid_device = NULL, + .snd_device = &cs4235_onboard_device, + .net_device = NULL + }, + /* 440BX */ /* Has a Winbond W83977EF Super I/O chip with on-chip KBC with AMIKey-2 KBC firmware. */ diff --git a/src/mem/mem.c b/src/mem/mem.c index 80803e6a2..91fa277be 100644 --- a/src/mem/mem.c +++ b/src/mem/mem.c @@ -668,7 +668,6 @@ read_mem_b(uint32_t addr) { mem_mapping_t *map; uint8_t ret = 0xff; - int old_cycles = cycles; mem_logical_addr = addr; addr &= rammask; @@ -677,8 +676,6 @@ read_mem_b(uint32_t addr) if (map && map->read_b) ret = map->read_b(addr, map->priv); - resub_cycles(old_cycles); - return ret; } @@ -687,7 +684,6 @@ read_mem_w(uint32_t addr) { mem_mapping_t *map; uint16_t ret = 0xffff; - int old_cycles = cycles; mem_logical_addr = addr; addr &= rammask; @@ -703,8 +699,6 @@ read_mem_w(uint32_t addr) ret = map->read_b(addr, map->priv) | (map->read_b(addr + 1, map->priv) << 8); } - resub_cycles(old_cycles); - return ret; } @@ -712,7 +706,6 @@ void write_mem_b(uint32_t addr, uint8_t val) { mem_mapping_t *map; - int old_cycles = cycles; mem_logical_addr = addr; addr &= rammask; @@ -720,15 +713,12 @@ write_mem_b(uint32_t addr, uint8_t val) map = write_mapping[addr >> MEM_GRANULARITY_BITS]; if (map && map->write_b) map->write_b(addr, val, map->priv); - - resub_cycles(old_cycles); } void write_mem_w(uint32_t addr, uint16_t val) { mem_mapping_t *map; - int old_cycles = cycles; mem_logical_addr = addr; addr &= rammask; @@ -747,8 +737,6 @@ write_mem_w(uint32_t addr, uint16_t val) } } } - - resub_cycles(old_cycles); } uint8_t diff --git a/src/network/net_pcnet.c b/src/network/net_pcnet.c index 0c97d1078..2d9aa88bb 100644 --- a/src/network/net_pcnet.c +++ b/src/network/net_pcnet.c @@ -3317,7 +3317,7 @@ const device_t pcnet_am79c973_device = { }; const device_t pcnet_am79c973_onboard_device = { - .name = "AMD PCnet-FAST III", + .name = "AMD PCnet-FAST III (On-Board)", .internal_name = "pcnetfast_onboard", .flags = DEVICE_PCI, .local = DEV_AM79C973 | 0x0100, diff --git a/src/nvr_at.c b/src/nvr_at.c index 38a97560b..07588fb01 100644 --- a/src/nvr_at.c +++ b/src/nvr_at.c @@ -1173,8 +1173,15 @@ nvr_at_init(const device_t *info) local->cent = RTC_CENTURY_VIA; break; case 8: /* Epson Equity LT */ - nvr->irq = -1; - local->cent = RTC_CENTURY_ELT; + if ((info->local & 0x1f) == 0x18) { + local->flags |= (FLAG_PIIX4 | FLAG_AMI_1995_HACK); + local->def = 0x00; + nvr->irq = 8; + local->cent = RTC_CENTURY_AT; + } else { + nvr->irq = -1; + local->cent = RTC_CENTURY_ELT; + } break; default: @@ -1184,6 +1191,9 @@ nvr_at_init(const device_t *info) if (info->local & 0x20) local->def = 0x00; + if (machines[machine].init == machine_at_monsoon_init) + local->def = 0xff; + if (info->local & 0x40) local->flags |= FLAG_MULTI_BANK; @@ -1219,7 +1229,8 @@ nvr_at_init(const device_t *info) io_sethandler(0x0070, 2, nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } - if (((info->local & 0x1f) == 0x11) || ((info->local & 0x1f) == 0x17)) { + if (((info->local & 0x1f) == 0x11) || ((info->local & 0x1f) == 0x17) || + ((info->local & 0x1f) == 0x18)) { io_sethandler(0x0072, 2, nvr_read, NULL, NULL, nvr_write, NULL, NULL, nvr); } @@ -1445,6 +1456,20 @@ const device_t via_nvr_device = { .config = NULL }; +const device_t piix4_ami_1995_nvr_device = { + .name = "Intel PIIX4 AMI WinBIOS 1995 PC/AT NVRAM", + .internal_name = "piix4_ami_1995_nvr", + .flags = DEVICE_ISA16, + .local = 0x10 | 8, + .init = nvr_at_init, + .close = nvr_at_close, + .reset = nvr_at_reset, + .available = NULL, + .speed_changed = nvr_at_speed_changed, + .force_redraw = NULL, + .config = NULL +}; + const device_t p6rp4_nvr_device = { .name = "ASUS P/I-P6RP4 PC/AT NVRAM", .internal_name = "p6rp4_nvr", diff --git a/src/printer/prt_ps.c b/src/printer/prt_ps.c index 3a3230394..adf57a523 100644 --- a/src/printer/prt_ps.c +++ b/src/printer/prt_ps.c @@ -77,8 +77,12 @@ typedef struct ps_t { bool error; bool autofeed; bool pcl; - bool pcl_escape; + bool pending; + bool pjl; + bool pjl_command; uint8_t ctrl; + uint8_t pcl_escape; + uint16_t pjl_command_start; char printer_path[260]; @@ -116,21 +120,6 @@ static dllimp_t ghostscript_imports[] = { static void *ghostscript_handle = NULL; -static void -reset_ps(ps_t *dev) -{ - if (dev == NULL) - return; - - dev->ack = false; - - dev->buffer[0] = 0; - dev->buffer_pos = 0; - - timer_disable(&dev->pulse_timer); - timer_stop(&dev->timeout_timer); -} - static void pulse_timer(void *priv) { @@ -198,13 +187,37 @@ convert_to_pdf(ps_t *dev) return code; } +static void +reset_ps(ps_t *dev) +{ + if (dev == NULL) + return; + + dev->ack = false; + + if (dev->pending) { + if (ghostscript_handle != NULL) + convert_to_pdf(dev); + + dev->filename[0] = 0; + + dev->pending = false; + } + + dev->buffer[0] = 0; + dev->buffer_pos = 0; + + timer_disable(&dev->pulse_timer); + timer_stop(&dev->timeout_timer); +} + static void write_buffer(ps_t *dev, bool finish) { char path[1024]; FILE *fp; - if (dev->buffer[0] == 0) + if (dev->buffer_pos == 0) return; if (dev->filename[0] == 0) @@ -235,7 +248,10 @@ write_buffer(ps_t *dev, bool finish) convert_to_pdf(dev); dev->filename[0] = 0; - } + + dev->pending = false; + } else + dev->pending = true; } static void @@ -243,7 +259,16 @@ timeout_timer(void *priv) { ps_t *dev = (ps_t *) priv; - write_buffer(dev, true); + if (dev->buffer_pos != 0) + write_buffer(dev, true); + else if (dev->pending) { + if (ghostscript_handle != NULL) + convert_to_pdf(dev); + + dev->filename[0] = 0; + + dev->pending = false; + } timer_stop(&dev->timeout_timer); } @@ -264,23 +289,65 @@ process_data(ps_t *dev) { /* On PCL, check for escape sequences. */ if (dev->pcl) { - if (dev->data == 0x1B) - dev->pcl_escape = true; - else if (dev->pcl_escape) { - dev->pcl_escape = false; - if (dev->data == 0xE) { - dev->buffer[dev->buffer_pos++] = dev->data; - dev->buffer[dev->buffer_pos] = 0; + if (dev->pjl) { + dev->buffer[dev->buffer_pos++] = dev->data; - if (dev->buffer_pos > 2) - write_buffer(dev, true); - - return; + /* Filter out any PJL commands. */ + if (dev->pjl_command && (dev->data == '\n')) { + dev->pjl_command = false; + if (!memcmp(&(dev->buffer[dev->pjl_command_start]), "@PJL ENTER LANGUAGE=PCL", 0x17)) + dev->pjl = false; + else if (!memcmp(&(dev->buffer[dev->pjl_command_start]), "@PJL ENTER LANGUAGE=POSTSCRIPT", 0x1e)) + fatal("Printing PostScript using the PCL printer is not (yet) supported!\n"); + dev->buffer_pos = dev->pjl_command_start; + } else if (!dev->pjl_command && (dev->buffer_pos >= 0x05) && !memcmp(&(dev->buffer[dev->buffer_pos - 0x5]), "@PJL ", 0x05)) { + dev->pjl_command = true; + dev->pjl_command_start = dev->buffer_pos - 0x05; } + + dev->buffer[dev->buffer_pos] = 0; + return; + } else if (dev->data == 0x1b) + dev->pcl_escape = 1; + else switch (dev->pcl_escape) { + case 1: + dev->pcl_escape = (dev->data == 0x25) ? 2 : 0; + if (dev->data == 0x0e) { + dev->buffer[dev->buffer_pos++] = dev->data; + dev->buffer[dev->buffer_pos] = 0; + + if (dev->buffer_pos > 2) + write_buffer(dev, true); + + return; + } + break; + case 2: + dev->pcl_escape = (dev->data == 0x2d) ? 3 : 0; + break; + case 3: + dev->pcl_escape = (dev->data == 0x31) ? 4 : 0; + break; + case 4: + dev->pcl_escape = (dev->data == 0x32) ? 5 : 0; + break; + case 5: + dev->pcl_escape = (dev->data == 0x33) ? 6 : 0; + break; + case 6: + dev->pcl_escape = (dev->data == 0x34) ? 7 : 0; + break; + case 7: + dev->pcl_escape = (dev->data == 0x35) ? 8 : 0; + break; + case 8: + dev->pcl_escape = 0; + if (dev->data == 0x58) + dev->pjl = true; + break; } - } - /* On PostScript, check for non-printable characters. */ - else if ((dev->data < 0x20) || (dev->data == 0x7f)) { + } else if ((dev->data < 0x20) || (dev->data == 0x7f)) { + /* On PostScript, check for non-printable characters. */ switch (dev->data) { /* The following characters are considered white-space by the PostScript specification */ diff --git a/src/qt/languages/86box.pot b/src/qt/languages/86box.pot index cbf086210..c5d1d2514 100644 --- a/src/qt/languages/86box.pot +++ b/src/qt/languages/86box.pot @@ -204,15 +204,27 @@ msgstr "" msgid "Take s&creenshot" msgstr "" +msgid "Take screenshot" +msgstr "" + msgid "Take &raw screenshot" msgstr "" +msgid "Take raw screenshot" +msgstr "" + msgid "C&opy screenshot" msgstr "" +msgid "Copy screenshot" +msgstr "" + msgid "Copy r&aw screenshot" msgstr "" +msgid "Copy raw screenshot" +msgstr "" + msgid "S&ound" msgstr "" @@ -531,10 +543,10 @@ msgstr "" msgid "CD-ROM controller:" msgstr "" -msgid "[ISA16] Tertiary IDE Controller" +msgid "Tertiary IDE Controller" msgstr "" -msgid "[ISA16] Quaternary IDE Controller" +msgid "Quaternary IDE Controller" msgstr "" msgid "Hard disk controllers" @@ -1137,7 +1149,7 @@ msgstr "" msgid "Use regular expressions in search box" msgstr "" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" msgstr "" msgid "Add new system wizard" @@ -1221,9 +1233,6 @@ msgstr "" msgid "Change &display name…" msgstr "" -msgid "Context Menu" -msgstr "" - msgid "&Open folder…" msgstr "" @@ -1845,7 +1854,7 @@ msgstr "" msgid "Default Baud rate" msgstr "" -msgid "[COM] Standard Hayes-compliant Modem" +msgid "Standard Hayes-compliant Modem" msgstr "" msgid "Roland MT-32 Emulation" @@ -2799,9 +2808,6 @@ msgstr "" msgid "Toggle UI in fullscreen" msgstr "" -msgid "Screenshot" -msgstr "" - msgid "Release mouse pointer" msgstr "" @@ -3005,3 +3011,9 @@ msgstr "" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po index d7e279110..ad9dd6eb1 100644 --- a/src/qt/languages/ca-ES.po +++ b/src/qt/languages/ca-ES.po @@ -210,15 +210,27 @@ msgstr "&Actualitza icones a la barra d'estat" msgid "Take s&creenshot" msgstr "Desa captura de &pantalla" +msgid "Take screenshot" +msgstr "Desa captura de pantalla" + msgid "Take &raw screenshot" msgstr "Desa captura en &brut de pantalla" +msgid "Take raw screenshot" +msgstr "Desa captura en brut de pantalla" + msgid "C&opy screenshot" msgstr "C&opia captura de pantalla" +msgid "Copy screenshot" +msgstr "Copia captura de pantalla" + msgid "Copy r&aw screenshot" msgstr "Copy captura en b&rut de pantalla" +msgid "Copy raw screenshot" +msgstr "Copy captura en brut de pantalla" + msgid "S&ound" msgstr "S&o" @@ -537,11 +549,11 @@ msgstr "Controladora de disquets:" msgid "CD-ROM controller:" msgstr "Controladora de CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Controlador IDE terciari" +msgid "Tertiary IDE Controller" +msgstr "Controlador IDE terciari" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Controlador IDE quaternari" +msgid "Quaternary IDE Controller" +msgstr "Controlador IDE quaternari" msgid "Hard disk controllers" msgstr "Controladores de disc dur" @@ -1143,8 +1155,8 @@ msgstr "No fou possible obrir el fitxer de configuració seleccionat per llegir: msgid "Use regular expressions in search box" msgstr "Utilitzeu expressions regulars a la caixa de cerca" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 màquina(es) són actives en aquest moment. Segur que voleu sortir de l'administrador de MV?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n màquina(es) són actives en aquest moment. Segur que voleu sortir de l'administrador de MV?" msgid "Add new system wizard" msgstr "Auxiliar d'addició de un nou sistema" @@ -1227,9 +1239,6 @@ msgstr "Escriviu el nou nom mostrat (buit per restablir)" msgid "Change &display name…" msgstr "Canvia nom &mostrat…" -msgid "Context Menu" -msgstr "Menú de context" - msgid "&Open folder…" msgstr "&Obre carpeta…" @@ -1851,8 +1860,8 @@ msgstr "3M MicroTouch (sèrie)" msgid "Default Baud rate" msgstr "Velocitat de transmissió per defecte" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Mòdem estàndard compatible amb Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Mòdem estàndard compatible amb Hayes" msgid "Roland MT-32 Emulation" msgstr "Emulació Roland MT-32" @@ -2805,9 +2814,6 @@ msgstr "Alternar pantalla completa" msgid "Toggle UI in fullscreen" msgstr "Alternar interfície d'usuari en modalitat de pantalla completa" -msgid "Screenshot" -msgstr "Captura de pantalla" - msgid "Release mouse pointer" msgstr "Allibera el punter del ratolí" @@ -3011,3 +3017,9 @@ msgstr "&Permetre recompilació" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/cs-CZ.po b/src/qt/languages/cs-CZ.po index e82f95f26..bed51f261 100644 --- a/src/qt/languages/cs-CZ.po +++ b/src/qt/languages/cs-CZ.po @@ -210,15 +210,27 @@ msgstr "&Aktualizovat ikony stavového řádku" msgid "Take s&creenshot" msgstr "Pořídit &screenshot" +msgid "Take screenshot" +msgstr "Pořídit screenshot" + msgid "Take &raw screenshot" msgstr "Pořídit n&ezpracovaný screenshot" +msgid "Take raw screenshot" +msgstr "Pořídit nezpracovaný screenshot" + msgid "C&opy screenshot" msgstr "&Zkopírovat screenshot" +msgid "Copy screenshot" +msgstr "Zkopírovat screenshot" + msgid "Copy r&aw screenshot" msgstr "Zkopírovat nez&pracovaný screenshot" +msgid "Copy raw screenshot" +msgstr "Zkopírovat nezpracovaný screenshot" + msgid "S&ound" msgstr "&Zvuk" @@ -537,11 +549,11 @@ msgstr "Disketový řadič:" msgid "CD-ROM controller:" msgstr "Řadič CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Třetí řadič IDE" +msgid "Tertiary IDE Controller" +msgstr "Třetí řadič IDE" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Čtvrtý řadič IDE" +msgid "Quaternary IDE Controller" +msgstr "Čtvrtý řadič IDE" msgid "Hard disk controllers" msgstr "Řadiče pevných disků" @@ -1143,8 +1155,8 @@ msgstr "Nebylo možné otevřít vybraný konfigurační soubor pro čtení: %1" msgid "Use regular expressions in search box" msgstr "Použít ve vyhledávacím poli regulární výrazy" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 počítač(ů) je stále aktivních. Opravdu chcete ukončit správce virtuálních počítačů?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n počítač(ů) je stále aktivních. Opravdu chcete ukončit správce virtuálních počítačů?" msgid "Add new system wizard" msgstr "Průvodce přidáním nového systému" @@ -1227,9 +1239,6 @@ msgstr "Zadejte nové zobrazované jméno (prázdné pole pro vymazání)" msgid "Change &display name…" msgstr "Změnit &zobrazované jméno…" -msgid "Context Menu" -msgstr "Kontextová nabídka" - msgid "&Open folder…" msgstr "&Otevřít složku…" @@ -1851,8 +1860,8 @@ msgstr "3M MicroTouch (sériová)" msgid "Default Baud rate" msgstr "Výchozí přenosová rychlost" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Modem kompatibilní se standardem Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Modem kompatibilní se standardem Hayes" msgid "Roland MT-32 Emulation" msgstr "Emulace Roland MT-32" @@ -2805,9 +2814,6 @@ msgstr "Přepnout režim celé obrazovky" msgid "Toggle UI in fullscreen" msgstr "Přepnout rozhraní při celé obrazovce" -msgid "Screenshot" -msgstr "Pořídit snímek obrazovky" - msgid "Release mouse pointer" msgstr "Uvolnit kurzor myši" @@ -3011,3 +3017,9 @@ msgstr "&Povolit rekompilaci" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/de-DE.po b/src/qt/languages/de-DE.po index ad7e66b08..38e829861 100644 --- a/src/qt/languages/de-DE.po +++ b/src/qt/languages/de-DE.po @@ -210,15 +210,27 @@ msgstr "&Statusleistenicons aktualisieren" msgid "Take s&creenshot" msgstr "S&creenshot aufnehmen" +msgid "Take screenshot" +msgstr "Screenshot aufnehmen" + msgid "Take &raw screenshot" msgstr "&Roh-Screenshot aufnehmen" +msgid "Take raw screenshot" +msgstr "Roh-Screenshot aufnehmen" + msgid "C&opy screenshot" msgstr "Screenshot k&opieren" +msgid "Copy screenshot" +msgstr "Screenshot kopieren" + msgid "Copy r&aw screenshot" msgstr "R&oh-Screenshot kopieren" +msgid "Copy raw screenshot" +msgstr "Roh-Screenshot kopieren" + msgid "S&ound" msgstr "&Ton" @@ -537,11 +549,11 @@ msgstr "Disketten-Controller:" msgid "CD-ROM controller:" msgstr "CD-ROM-Controller:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Tertiärer IDE-Controller" +msgid "Tertiary IDE Controller" +msgstr "Tertiärer IDE-Controller" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Quartärer IDE-Controller" +msgid "Quaternary IDE Controller" +msgstr "Quartärer IDE-Controller" msgid "Hard disk controllers" msgstr "Festplattencontroller" @@ -1143,8 +1155,8 @@ msgstr "Die ausgewählte Konfigurationsdatei konnte nicht eingelesen werden: %1" msgid "Use regular expressions in search box" msgstr "Benutze reguläre Ausdrücke in der Suche" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 Maschinen sind aktuell aktiv. Bist du sicher, dass du den VM Manager trotzdem schließen möchtest?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n Maschinen sind aktuell aktiv. Bist du sicher, dass du den VM Manager trotzdem schließen möchtest?" msgid "Add new system wizard" msgstr "Assistent für ein neues System" @@ -1227,9 +1239,6 @@ msgstr "Gebe den neuen Anzeigenamen ein (leer lassen zum Zurücksetzen)" msgid "Change &display name…" msgstr "&Anzeigename ändern…" -msgid "Context Menu" -msgstr "Kontextmenü" - msgid "&Open folder…" msgstr "&Ordner öffnen…" @@ -1851,8 +1860,8 @@ msgstr "3M MicroTouch (Seriell)" msgid "Default Baud rate" msgstr "Standard-Baudrate" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Standard Hayes-kompatibles Modem" +msgid "Standard Hayes-compliant Modem" +msgstr "Standard Hayes-kompatibles Modem" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32-Emulation" @@ -2805,9 +2814,6 @@ msgstr "Vollbild umschalten" msgid "Toggle UI in fullscreen" msgstr "UI im Vollbildmodus umschalten" -msgid "Screenshot" -msgstr "Bildschirmaufnahme" - msgid "Release mouse pointer" msgstr "Mauszeiger freigeben" @@ -3011,3 +3017,9 @@ msgstr "Recompilierung &zulassen" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/el-GR.po b/src/qt/languages/el-GR.po index db28daa81..9243c24fb 100644 --- a/src/qt/languages/el-GR.po +++ b/src/qt/languages/el-GR.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2026-01-07 16:56+0000\n" +"PO-Revision-Date: 2026-01-10 12:56+0000\n" "Last-Translator: DimMan88 \n" "Language-Team: Greek \n" "Language: el-GR\n" @@ -127,7 +127,7 @@ msgid "&Fullscreen" msgstr "&Πλήρης οθόνη" msgid "Fullscreen &stretch mode" -msgstr "Πλήρης οθόνη &σε τύπο τεντώματος" +msgstr "Πλήρης οθόνη &σε λειτουργία τεντώματος" msgid "&Full screen stretch" msgstr "&Τέντωμα πλήρους οθόνης" @@ -210,15 +210,27 @@ msgstr "&Ανανέωση εικονιδίων γραμμής κατάσταση msgid "Take s&creenshot" msgstr "Λήψη σ&τιγμιότυπου" +msgid "Take screenshot" +msgstr "Λήψη στιγμιότυπου" + msgid "Take &raw screenshot" msgstr "Λήψη &αρχικού στιγμιότυπου" +msgid "Take raw screenshot" +msgstr "Λήψη αρχικού στιγμιότυπου" + msgid "C&opy screenshot" msgstr "&Αντιγραφή στιγμιότυπου" +msgid "Copy screenshot" +msgstr "Αντιγραφή στιγμιότυπου" + msgid "Copy r&aw screenshot" msgstr "Αντιγραφή α&ρχικού στιγμιότυπου" +msgid "Copy raw screenshot" +msgstr "Αντιγραφή αρχικού στιγμιότυπου" + msgid "S&ound" msgstr "Ή&χος" @@ -325,7 +337,7 @@ msgid "Disk size:" msgstr "Μέγεθος δίσκου:" msgid "RPM mode:" -msgstr "Τύπος RPM:" +msgstr "Λειτουργία RPM:" msgid "Progress:" msgstr "Πρόοδος:" @@ -537,11 +549,11 @@ msgstr "Ελεγκτής δισκέτας:" msgid "CD-ROM controller:" msgstr "Ελεγκτής CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Τριτογενής Ελεγκτής IDE" +msgid "Tertiary IDE Controller" +msgstr "Τριτογενής Ελεγκτής IDE" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Τεταρτογενής Ελεγκτής IDE" +msgid "Quaternary IDE Controller" +msgstr "Τεταρτογενής Ελεγκτής IDE" msgid "Hard disk controllers" msgstr "Ελεγκτές σκληρού δίσκου" @@ -1032,7 +1044,7 @@ msgid "%1 Device Configuration" msgstr "%1 Προσαρμογή Συσκευής" msgid "Monitor in sleep mode" -msgstr "Οθόνη σε sleep mode" +msgstr "Οθόνη σε λειτουργία αναμονής" msgid "GLSL shaders" msgstr "GLSL shaders" @@ -1154,8 +1166,8 @@ msgstr "Αδυναμία ανοίγματος επιλεγμένου αρχεί msgid "Use regular expressions in search box" msgstr "Χρήση συχνών εκφράσεων στην αναζήτηση" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 μηχανής(ών) είναι εν ενεργεία. Είστε σίγουγος για την έξοδο απο το VM manager;" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n μηχανής(ών) είναι εν ενεργεία. Είστε σίγουγος για την έξοδο απο το VM manager;" msgid "Add new system wizard" msgstr "Οδηγός προσθήκης νέο συστήματος" @@ -1238,9 +1250,6 @@ msgstr "Εισάγετε το νέο όνομα εμφάνισης (κενό γ msgid "Change &display name…" msgstr "Αλλαγή &ονόματος εμφάνισης…" -msgid "Context Menu" -msgstr "Μενού επιλογών" - msgid "&Open folder…" msgstr "&Άνοιγμα φακέλου…" @@ -1604,7 +1613,7 @@ msgid "Select media images from program working directory" msgstr "Επιλέξτε αρχεία πολυμέσων απο τον ενεργό κατάλογο προγράμματος" msgid "PIT mode:" -msgstr "PIT mode:" +msgstr "Λειτουργία PIT:" msgid "Auto" msgstr "Αυτόματο" @@ -1674,7 +1683,7 @@ msgid "Open screenshots &folder…" msgstr "Άνοιγμα &φακέλου στιγμιότυπων…" msgid "Appl&y fullscreen stretch mode when maximized" -msgstr "Εφαρμο&γή πλήρους οθόνης σε τέντωμα κατα την μεγιστοποίηση" +msgstr "&Εφαρμογή πλήρους οθόνης σε τέντωμα κατα την μεγιστοποίηση" msgid "&Cursor/Puck" msgstr "&Cursor/Puck" @@ -1801,7 +1810,7 @@ msgid "Network Card #4" msgstr "Κάρτα δικτύου #4" msgid "Mode:" -msgstr "Τύπος:" +msgstr "Λειτουργία:" msgid "Interface:" msgstr "Διασύνδεση:" @@ -1887,8 +1896,8 @@ msgstr "3M MicroTouch (Σειριακό)" msgid "Default Baud rate" msgstr "Προεπιλεγμένος ρυθμός Baud" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Τυπικό μόντεμ συμβατό με Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Τυπικό μόντεμ συμβατό με Hayes" msgid "Roland MT-32 Emulation" msgstr "Εξομοίωση Roland MT-32" @@ -2344,7 +2353,7 @@ msgid "Transfer Speed" msgstr "Ταχύτητα Μεταφοράς" msgid "EMS mode" -msgstr "Τύπος EMS" +msgstr "Λειτουργία EMS" msgid "EMS Address" msgstr "Διεύθυνση EMS" @@ -2558,10 +2567,10 @@ msgid "Color 80x25 (5153/CGA)" msgstr "Έγχρωμο 80x25 (5153/CGA)" msgid "Enhanced Color - Normal Mode (5154/ECD)" -msgstr "Ενισχυμένο Έγχρωμο - Κανονικός Τύπος (5154/ECD)" +msgstr "Ενισχυμένο Έγχρωμο - Κανονική Λειτουργία (5154/ECD)" msgid "Enhanced Color - Enhanced Mode (5154/ECD)" -msgstr "Ενισχυμένο Έγχρωμο - Ενισχυμένος Τύπος (5154/ECD)" +msgstr "Ενισχυμένο Έγχρωμο - Ενισχυμένη Λειτουργία (5154/ECD)" msgid "Green" msgstr "Πράσινο" @@ -2660,7 +2669,7 @@ msgid "Serial Passthrough Device" msgstr "Συσκευή Σειριακής Διέλευσης" msgid "Passthrough Mode" -msgstr "Τύπος Διέλευσης" +msgstr "Λειτουργία Διέλευσης" msgid "Host Serial Device" msgstr "Σειριακή Συσκευή Οικοδεσπότη" @@ -2850,9 +2859,6 @@ msgstr "Εναλλαγή σε πλήρη οθόνη" msgid "Toggle UI in fullscreen" msgstr "Εναλλαγή ΠΧ σε πλήρη οθόνη" -msgid "Screenshot" -msgstr "Λήψη στιγμιότυπου" - msgid "Release mouse pointer" msgstr "Απελευθέρωση δείκτη ποντικιού" @@ -3040,7 +3046,7 @@ msgid "OpenGL input scale" msgstr "Κλίμακα OpenGL input" msgid "OpenGL input stretch mode" -msgstr "OpenGL input σε τύπο τεντώματος" +msgstr "OpenGL input σε λειτουργία τεντώματος" msgid "Color scheme" msgstr "Συνδυασμός χρωμάτων" @@ -3068,3 +3074,9 @@ msgstr "&Να επιτρέπεται ανασύνταξη" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/en-GB.po b/src/qt/languages/en-GB.po index ba9f30421..fdc71fcb1 100644 --- a/src/qt/languages/en-GB.po +++ b/src/qt/languages/en-GB.po @@ -12,6 +12,9 @@ msgstr "RGB &Colour" msgid "&RGB Grayscale" msgstr "&RGB Greyscale" +msgid "Generic RGBI color monitor" +msgstr "Generic RGBI colour monitor" + msgid "Time synchronization" msgstr "Time synchronisation" @@ -21,15 +24,15 @@ msgstr "Unable to initialise Ghostscript" msgid "Unable to initialize GhostPCL" msgstr "Unable to initialise GhostPCL" +msgid "Failed to initialize network driver" +msgstr "Failed to initialise network driver" + msgid "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behavior will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." msgstr "Development of the WinBox manager stopped in 2022 due to a lack of maintainers. As we direct our efforts towards making 86Box even better, we have made the decision to no longer support WinBox as a manager.\n\nNo further updates will be provided through WinBox, and you may encounter incorrect behavior should you continue using it with newer versions of 86Box. Any bug reports related to WinBox behaviour will be closed as invalid.\n\nGo to 86box.net for a list of other managers you can use." msgid "Appl&y fullscreen stretch mode when maximized" msgstr "Appl&y fullscreen stretch mode when maximised" -msgid "Failed to initialize network driver" -msgstr "Failed to initialise network driver" - msgid "Render behavior" msgstr "Render behaviour" @@ -42,6 +45,12 @@ msgstr "Error initialising OpenGL" msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" msgstr "

When selecting media images (CD-ROM, floppy, etc.) the open dialogue will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" +msgid "Invert colors" +msgstr "Invert colours" + +msgid "True color" +msgstr "True colour" + msgid "Color (generic)" msgstr "Colour (generic)" @@ -75,5 +84,5 @@ msgstr "Colour" msgid "Failed to initialize Vulkan renderer." msgstr "Failed to initialise Vulkan renderer." -msgid "True color" -msgstr "True colour" +msgid "Color scheme" +msgstr "Colour scheme" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index f64574e71..3d339efd0 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -210,15 +210,27 @@ msgstr "&Actualizar iconos en barra de estado" msgid "Take s&creenshot" msgstr "Tomar cap&tura" +msgid "Take screenshot" +msgstr "Tomar captura" + msgid "Take &raw screenshot" msgstr "Tomar captura &plana" +msgid "Take raw screenshot" +msgstr "Tomar captura plana" + msgid "C&opy screenshot" msgstr "C&opiar captura" +msgid "Copy screenshot" +msgstr "Copiar captura" + msgid "Copy r&aw screenshot" msgstr "Copiar captura p&lana" +msgid "Copy raw screenshot" +msgstr "Copiar captura plana" + msgid "S&ound" msgstr "S&onido" @@ -537,11 +549,11 @@ msgstr "Controladora de disquetes:" msgid "CD-ROM controller:" msgstr "Controladora CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Tercera controladora IDE" +msgid "Tertiary IDE Controller" +msgstr "Tercera controladora IDE" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Cuarta controladora IDE" +msgid "Quaternary IDE Controller" +msgstr "Cuarta controladora IDE" msgid "Hard disk controllers" msgstr "Controladores de disco duro" @@ -1143,8 +1155,8 @@ msgstr "No fúe posible abrir el archivo de configuración seleccionado para lee msgid "Use regular expressions in search box" msgstr "Utilizar expresiones regulares en la caja de búsqueda" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 máquina(s) son activas en este momento. ¿Está seguro de que quiere salir del administrador de MV?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n máquina(s) son activas en este momento. ¿Está seguro de que quiere salir del administrador de MV?" msgid "Add new system wizard" msgstr "Asistente para la adición de un nuevo sistema" @@ -1227,9 +1239,6 @@ msgstr "Escribir el nuevo nombre mostrado (vacío para restablecer)" msgid "Change &display name…" msgstr "Cambiar nombre &mostrado…" -msgid "Context Menu" -msgstr "Menú de contexto" - msgid "&Open folder…" msgstr "&Abrir carpeta…" @@ -1851,8 +1860,8 @@ msgstr "3M MicroTouch (serie)" msgid "Default Baud rate" msgstr "Velocidad de transmisión pretederminada" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Módem estándar compatible con Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Módem estándar compatible con Hayes" msgid "Roland MT-32 Emulation" msgstr "Emulación Roland MT-32" @@ -2805,9 +2814,6 @@ msgstr "Alternar pantalla completa" msgid "Toggle UI in fullscreen" msgstr "Alternar interfaz de usuario en modo de pantalla completa" -msgid "Screenshot" -msgstr "Captura de pantalla" - msgid "Release mouse pointer" msgstr "Soltar el puntero del ratón" @@ -3011,3 +3017,9 @@ msgstr "&Permitir recompilación" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/fi-FI.po b/src/qt/languages/fi-FI.po index 987e73529..fd6add696 100644 --- a/src/qt/languages/fi-FI.po +++ b/src/qt/languages/fi-FI.po @@ -210,15 +210,27 @@ msgstr "&Päivitä tilapalkin kuvakkeita" msgid "Take s&creenshot" msgstr "Ota &kuvakaappaus" +msgid "Take screenshot" +msgstr "Ota kuvakaappaus" + msgid "Take &raw screenshot" msgstr "Ota &raaka kuvakaappaus" +msgid "Take raw screenshot" +msgstr "Ota raaka kuvakaappaus" + msgid "C&opy screenshot" msgstr "K&opioi kuvakaappaus" +msgid "Copy screenshot" +msgstr "Kopioi kuvakaappaus" + msgid "Copy r&aw screenshot" msgstr "Kopioi r&aaka kuvakaappaus" +msgid "Copy raw screenshot" +msgstr "Kopioi raaka kuvakaappaus" + msgid "S&ound" msgstr "&Ääni" @@ -537,11 +549,11 @@ msgstr "Levykeohjain:" msgid "CD-ROM controller:" msgstr "CD-ohjain:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Kolmas IDE-ohjain" +msgid "Tertiary IDE Controller" +msgstr "Kolmas IDE-ohjain" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Neljäs IDE-ohjain" +msgid "Quaternary IDE Controller" +msgstr "Neljäs IDE-ohjain" msgid "Hard disk controllers" msgstr "Kiintolevyohjaimet" @@ -1143,8 +1155,8 @@ msgstr "Valittua määritystä ei voitu avata: %1" msgid "Use regular expressions in search box" msgstr "Käytä säännöllisiä lausekkeita (regex) hakukentässä" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 konetta on tällä hetkellä aktiivisena. Haluatko silti sulkea virtuaalikoneiden hallinnan?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n konetta on tällä hetkellä aktiivisena. Haluatko silti sulkea virtuaalikoneiden hallinnan?" msgid "Add new system wizard" msgstr "Koneenlisäysohjelma" @@ -1227,9 +1239,6 @@ msgstr "Anna uusi näyttönimi tai poista se" msgid "Change &display name…" msgstr "Vaihda &näyttönimi…" -msgid "Context Menu" -msgstr "Kontekstivalikko" - msgid "&Open folder…" msgstr "&Avaa kansio…" @@ -1851,8 +1860,8 @@ msgstr "3M MicroTouch (sarja)" msgid "Default Baud rate" msgstr "Oletussiirtonopeus" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Tavallinen Hayes-yhteensopiva modeemi" +msgid "Standard Hayes-compliant Modem" +msgstr "Tavallinen Hayes-yhteensopiva modeemi" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32-emulointi" @@ -2805,9 +2814,6 @@ msgstr "Koko näyttö" msgid "Toggle UI in fullscreen" msgstr "Käyttöliittymä koko näyttö-tilassa" -msgid "Screenshot" -msgstr "Kuvakaappaus" - msgid "Release mouse pointer" msgstr "Vapauta hiiren osoitin" @@ -3011,3 +3017,9 @@ msgstr "&Salli uudelleenkääntäminen" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po index 976d9afb0..2e1422a08 100644 --- a/src/qt/languages/fr-FR.po +++ b/src/qt/languages/fr-FR.po @@ -210,15 +210,27 @@ msgstr "Mettre à jour la barre de stat&us" msgid "Take s&creenshot" msgstr "Faire copie d'é&cran" +msgid "Take screenshot" +msgstr "Faire copie d'écran" + msgid "Take &raw screenshot" msgstr "Faire copie &brute d'écran" +msgid "Take raw screenshot" +msgstr "Faire copie brute d'écran" + msgid "C&opy screenshot" msgstr "C&opier copie d'écran" +msgid "Copy screenshot" +msgstr "Copier copie d'écran" + msgid "Copy r&aw screenshot" msgstr "Copier copie b&rute d'écran" +msgid "Copy raw screenshot" +msgstr "Copier copie brute d'écran" + msgid "S&ound" msgstr "S&on" @@ -537,11 +549,11 @@ msgstr "Contrôleur de disquette :" msgid "CD-ROM controller:" msgstr "Contrôleur CD-ROM :" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Troisième contrôleur IDE" +msgid "Tertiary IDE Controller" +msgstr "Troisième contrôleur IDE" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Quatrième contrôleur IDE" +msgid "Quaternary IDE Controller" +msgstr "Quatrième contrôleur IDE" msgid "Hard disk controllers" msgstr "Contrôleurs de disque dur" @@ -1143,8 +1155,8 @@ msgstr "Impossible d'ouvrir le fichier de configuration sélectionné pour lectu msgid "Use regular expressions in search box" msgstr "Utilisez des expressions régulières dans le champ de recherche" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 machine(s) sont actuellement actives. Êtes-vous sûr de vouloir quitter le gestionnaire de machines virtuelles malgré tout ?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n machine(s) sont actuellement actives. Êtes-vous sûr de vouloir quitter le gestionnaire de machines virtuelles malgré tout ?" msgid "Add new system wizard" msgstr "Assistant pour ajouter un nouveau système" @@ -1227,9 +1239,6 @@ msgstr "Entrez le nouveau nom d'affichage (laissez vide pour réinitialiser)" msgid "Change &display name…" msgstr "Modifier le nom &d'affichage…" -msgid "Context Menu" -msgstr "Menu contextuel" - msgid "&Open folder…" msgstr "&Ouvrir le dossier…" @@ -1851,8 +1860,8 @@ msgstr "3M MicroTouch (série)" msgid "Default Baud rate" msgstr "Vitesse de transmission par défaut" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Modem standard conforme à la norme Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Modem standard conforme à la norme Hayes" msgid "Roland MT-32 Emulation" msgstr "Émulation Roland MT-32" @@ -2805,9 +2814,6 @@ msgstr "Activer/désactiver le mode plein écran" msgid "Toggle UI in fullscreen" msgstr "Basculer l'interface utilisateur en mode plein écran" -msgid "Screenshot" -msgstr "Capture d'écran" - msgid "Release mouse pointer" msgstr "Relâcher le pointeur de la souris" @@ -3011,3 +3017,9 @@ msgstr "&Permettre la recompilation" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/hr-HR.po b/src/qt/languages/hr-HR.po index 15c2b39cb..b3d9a68f1 100644 --- a/src/qt/languages/hr-HR.po +++ b/src/qt/languages/hr-HR.po @@ -212,15 +212,27 @@ msgstr "&Ažuriraj ikone statusnog redka" msgid "Take s&creenshot" msgstr "Napravi &snimku zaslona" +msgid "Take screenshot" +msgstr "Napravi snimku zaslona" + msgid "Take &raw screenshot" msgstr "Napravi &neobrađenu snimku zaslona" +msgid "Take raw screenshot" +msgstr "Napravi neobrađenu snimku zaslona" + msgid "C&opy screenshot" -msgstr "K&opiraj snimku zalsona" +msgstr "K&opiraj snimku zaslona" + +msgid "Copy screenshot" +msgstr "Kopiraj snimku zaslona" msgid "Copy r&aw screenshot" msgstr "Kopiraj n&eobrađenu snimku zaslona" +msgid "Copy raw screenshot" +msgstr "Kopiraj neobrađenu snimku zaslona" + msgid "S&ound" msgstr "&Zvuk" @@ -539,11 +551,11 @@ msgstr "Kontroler diskete:" msgid "CD-ROM controller:" msgstr "Kontroler CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Tercijarni IDE kontroler" +msgid "Tertiary IDE Controller" +msgstr "Tercijarni IDE kontroler" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Kvaternarni IDE kontroler" +msgid "Quaternary IDE Controller" +msgstr "Kvaternarni IDE kontroler" msgid "Hard disk controllers" msgstr "Kontroleri tvrdih diskova" @@ -1145,8 +1157,8 @@ msgstr "Nije moguće otvoriti odabranu konfiguracijsku datoteku za čitanje: %1" msgid "Use regular expressions in search box" msgstr "U polju za pretraživanje koristite regularne izraze" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "Broj trenutno aktivnih računala je %1. Jeste li sigurni da ipak želite izaći iz upravitelja virtualnih sistema?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "Broj trenutno aktivnih računala je %n. Jeste li sigurni da ipak želite izaći iz upravitelja virtualnih sistema?" msgid "Add new system wizard" msgstr "Čarobnjak za dodavanje novog sistema" @@ -1229,9 +1241,6 @@ msgstr "Unesite novo prikazno ime (prazno za ponovo postaviti)" msgid "Change &display name…" msgstr "Promijeni &prikazno ime…" -msgid "Context Menu" -msgstr "Kontekstni izbornik" - msgid "&Open folder…" msgstr "&Otvori mapu…" @@ -1853,8 +1862,8 @@ msgstr "3M MicroTouch (serijski)" msgid "Default Baud rate" msgstr "Zadana brzina prijenosa podataka" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Standardni modem, usklađen s standardom Hayesom" +msgid "Standard Hayes-compliant Modem" +msgstr "Standardni modem, usklađen s standardom Hayesom" msgid "Roland MT-32 Emulation" msgstr "Emulacija Rolanda MT-32" @@ -2807,9 +2816,6 @@ msgstr "Uključi/isključi cijelozaslonski način" msgid "Toggle UI in fullscreen" msgstr "Prebaci korisničko sučelje u načinu cijelog zaslona" -msgid "Screenshot" -msgstr "Snimka zaslona" - msgid "Release mouse pointer" msgstr "Otpusti pokazivač miša" @@ -3013,3 +3019,9 @@ msgstr "&Omogući rekompilaciju" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/it-IT.po b/src/qt/languages/it-IT.po index 0a675ac1a..f4d16bf86 100644 --- a/src/qt/languages/it-IT.po +++ b/src/qt/languages/it-IT.po @@ -210,15 +210,27 @@ msgstr "&Aggiorna icone della barra di stato" msgid "Take s&creenshot" msgstr "&Cattura schermata" +msgid "Take screenshot" +msgstr "Cattura schermata" + msgid "Take &raw screenshot" msgstr "Cattura &grezza della schermata" +msgid "Take raw screenshot" +msgstr "Cattura grezza della schermata" + msgid "C&opy screenshot" msgstr "C&opia cattura della schermata" +msgid "Copy screenshot" +msgstr "Copia cattura della schermata" + msgid "Copy r&aw screenshot" msgstr "Copia cattura g&rezza della schermata" +msgid "Copy raw screenshot" +msgstr "Copia cattura grezza della schermata" + msgid "S&ound" msgstr "A&udio" @@ -537,11 +549,11 @@ msgstr "Controller del floppy disk:" msgid "CD-ROM controller:" msgstr "Controller CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Controller IDE terziario" +msgid "Tertiary IDE Controller" +msgstr "Controller IDE terziario" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Controller IDE quaternario" +msgid "Quaternary IDE Controller" +msgstr "Controller IDE quaternario" msgid "Hard disk controllers" msgstr "Controller del disco rigido" @@ -1143,8 +1155,8 @@ msgstr "Impossibile aprire il file di configurazione selezionato per la lettura: msgid "Use regular expressions in search box" msgstr "Utilizza espressioni regolari nella casella di ricerca" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "Sono attualmente attive %1 macchina/e. Vuoi comunque uscire dal gestore delle macchine virtuali?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "Sono attualmente attive %n macchina/e. Vuoi comunque uscire dal gestore delle macchine virtuali?" msgid "Add new system wizard" msgstr "Procedura guidata nuovo sistema" @@ -1227,9 +1239,6 @@ msgstr "Inserisci il nuovo nome da visualizzare (vuoto per reimpostarlo)" msgid "Change &display name…" msgstr "Modifica &nome visualizzato…" -msgid "Context Menu" -msgstr "Menu contestuale" - msgid "&Open folder…" msgstr "&Apri cartella…" @@ -1851,8 +1860,8 @@ msgstr "3M MicroTouch (seriale)" msgid "Default Baud rate" msgstr "Velocità di trasmissione predefinita" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Modem standard conforme a Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Modem standard conforme a Hayes" msgid "Roland MT-32 Emulation" msgstr "Emulazione Roland MT-32" @@ -2805,9 +2814,6 @@ msgstr "Attiva/disattiva schermo intero" msgid "Toggle UI in fullscreen" msgstr "Attivare/disattivare interfaccia utente in modalità a schermo intero" -msgid "Screenshot" -msgstr "Istantanea dello schermo" - msgid "Release mouse pointer" msgstr "Rilascia il puntatore del mouse" @@ -3011,3 +3017,9 @@ msgstr "&Permetti ricompilazione" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/ja-JP.po b/src/qt/languages/ja-JP.po index 8371ac36e..2a7809a47 100644 --- a/src/qt/languages/ja-JP.po +++ b/src/qt/languages/ja-JP.po @@ -211,15 +211,27 @@ msgstr "ステータスバーのアイコンを更新(&U)" msgid "Take s&creenshot" msgstr "スクリーンショットを撮る(&C)" +msgid "Take screenshot" +msgstr "スクリーンショットを撮る" + msgid "Take &raw screenshot" msgstr "生のスクリーンショットを撮る(&R)" +msgid "Take raw screenshot" +msgstr "生のスクリーンショットを撮る" + msgid "C&opy screenshot" msgstr "スクリーンショットをコピーする(&O)" +msgid "Copy screenshot" +msgstr "スクリーンショットをコピーする" + msgid "Copy r&aw screenshot" msgstr "生のスクリーンショットをコピーする(&A)" +msgid "Copy raw screenshot" +msgstr "生のスクリーンショットをコピーする" + msgid "S&ound" msgstr "サウンド(&O)" @@ -538,11 +550,11 @@ msgstr "FDDコントローラー:" msgid "CD-ROM controller:" msgstr "CD-ROMコントローラー:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] 第三IDEコントローラー" +msgid "Tertiary IDE Controller" +msgstr "第三IDEコントローラー" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] 第四IDEコントローラー" +msgid "Quaternary IDE Controller" +msgstr "第四IDEコントローラー" msgid "Hard disk controllers" msgstr "ハードディスクコントローラー" @@ -1144,8 +1156,8 @@ msgstr "選択した設定ファイルを読み込むことができませんで msgid "Use regular expressions in search box" msgstr "検索ボックスで正規表現を使用する" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "現在、%1台の仮想マシンがアクティブです。それでもVMマネージャーを終了しますか?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "現在、%n台の仮想マシンがアクティブです。それでもVMマネージャーを終了しますか?" msgid "Add new system wizard" msgstr "新しいシステムを追加するためのウィザード" @@ -1228,9 +1240,6 @@ msgstr "新しい表示名を入力してください(空白にするとリセ msgid "Change &display name…" msgstr "表示名を変更(&D)…" -msgid "Context Menu" -msgstr "コンテキストメニュー" - msgid "&Open folder…" msgstr "フォルダーを開く(&O)…" @@ -1852,8 +1861,8 @@ msgstr "3Mマイクロタッチ(シリアル)" msgid "Default Baud rate" msgstr "デフォルトのボーレート" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] 標準ヘイズ準拠モデム" +msgid "Standard Hayes-compliant Modem" +msgstr "標準ヘイズ準拠モデム" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32エミュレーション" @@ -2806,9 +2815,6 @@ msgstr "フルスクリーン表示を切り替える" msgid "Toggle UI in fullscreen" msgstr "全画面表示時にUIを切り替える" -msgid "Screenshot" -msgstr "スクリーンショット" - msgid "Release mouse pointer" msgstr "マウスポインターを解放する" @@ -3012,3 +3018,9 @@ msgstr "再コンパイルを許可する(&A)" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/ko-KR.po b/src/qt/languages/ko-KR.po index 12f67f14f..0318e85f3 100644 --- a/src/qt/languages/ko-KR.po +++ b/src/qt/languages/ko-KR.po @@ -204,15 +204,27 @@ msgstr "상태 바 아이콘 갱신하기(&U)" msgid "Take s&creenshot" msgstr "스크린샷 찍기(&C)" +msgid "Take screenshot" +msgstr "스크린샷 찍기" + msgid "Take &raw screenshot" msgstr "원본 스크린샷 찍기(&R)" +msgid "Take raw screenshot" +msgstr "원본 스크린샷 찍기" + msgid "C&opy screenshot" msgstr "스크린샷 복사하세요(&O)" +msgid "Copy screenshot" +msgstr "스크린샷 복사하세요" + msgid "Copy r&aw screenshot" msgstr "원본 스크린샷 복사하세요(&A)" +msgid "Copy raw screenshot" +msgstr "원본 스크린샷 복사하세요" + msgid "S&ound" msgstr "사운드(&O)" @@ -531,11 +543,11 @@ msgstr "플로피 디스크 컨트롤러:" msgid "CD-ROM controller:" msgstr "CD-ROM 컨트롤러:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] 제3의 IDE 컨트롤러" +msgid "Tertiary IDE Controller" +msgstr "제3의 IDE 컨트롤러" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] 제4의 IDE 컨트롤러" +msgid "Quaternary IDE Controller" +msgstr "제4의 IDE 컨트롤러" msgid "Hard disk controllers" msgstr "하드 디스크 컨트롤러" @@ -1137,8 +1149,8 @@ msgstr "선택한 구성 파일을 읽기 위해 열 수 없습니다: %1" msgid "Use regular expressions in search box" msgstr "검색 상자에 정규 표현식 사용" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "현재 %1대의 머신이 활성화되어 있습니다. 가상 머신 관리자를 종료하시겠습니까?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "현재 %n대의 머신이 활성화되어 있습니다. 가상 머신 관리자를 종료하시겠습니까?" msgid "Add new system wizard" msgstr "새로운 시스템을 추가하는 마법사" @@ -1221,9 +1233,6 @@ msgstr "새 표시 이름을 입력하세요 (비워두면 초기화됩니다)" msgid "Change &display name…" msgstr "표시 이름 변경(&D)…" -msgid "Context Menu" -msgstr "컨텍스트 메뉴" - msgid "&Open folder…" msgstr "폴더 열기(&O)…" @@ -1845,8 +1854,8 @@ msgstr "3M 마이크로터치(직렬)" msgid "Default Baud rate" msgstr "기본 보드 속도" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] 표준 헤이즈 호환 모뎀" +msgid "Standard Hayes-compliant Modem" +msgstr "표준 헤이즈 호환 모뎀" msgid "Roland MT-32 Emulation" msgstr "롤랜드 MT-32 에뮬레이션" @@ -2799,9 +2808,6 @@ msgstr "전체 화면 모드 전환" msgid "Toggle UI in fullscreen" msgstr "" -msgid "Screenshot" -msgstr "스크린샷" - msgid "Release mouse pointer" msgstr "마우스 포인터를 해제합니다" @@ -3005,3 +3011,9 @@ msgstr "재컴파일 허용(&A)" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/nb-NO.po b/src/qt/languages/nb-NO.po index c6c27836b..e31768305 100644 --- a/src/qt/languages/nb-NO.po +++ b/src/qt/languages/nb-NO.po @@ -204,15 +204,27 @@ msgstr "&Oppdater statuslinjeikoner" msgid "Take s&creenshot" msgstr "Ta s&kjermbilde" +msgid "Take screenshot" +msgstr "Ta skjermbilde" + msgid "Take &raw screenshot" msgstr "Ta &rå skjermbilde" +msgid "Take raw screenshot" +msgstr "Ta rå skjermbilde" + msgid "C&opy screenshot" msgstr "K&opiera skjermbilde" +msgid "Copy screenshot" +msgstr "Kopiera skjermbilde" + msgid "Copy r&aw screenshot" msgstr "Kopiera r&å skjermbilde" +msgid "Copy raw screenshot" +msgstr "Kopiera rå skjermbilde" + msgid "S&ound" msgstr "L&yd" @@ -531,11 +543,11 @@ msgstr "Diskettkontroller:" msgid "CD-ROM controller:" msgstr "CD-ROM-kontroller:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Tertiær IDE-kontroller" +msgid "Tertiary IDE Controller" +msgstr "Tertiær IDE-kontroller" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Kvartær IDE-kontroller" +msgid "Quaternary IDE Controller" +msgstr "Kvartær IDE-kontroller" msgid "Hard disk controllers" msgstr "Harddiskkontrollere" @@ -1137,8 +1149,8 @@ msgstr "Kan ikke åpne valgt konfigurasjonsfil for lesing: %1" msgid "Use regular expressions in search box" msgstr "Bruk regulære uttrykk i søkeboksen" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 maskin(er) er for øyeblikket aktive. Er du sikker på at du vil avslutte VM-administratoren uansett?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n maskin(er) er for øyeblikket aktive. Er du sikker på at du vil avslutte VM-administratoren uansett?" msgid "Add new system wizard" msgstr "Legg til ny system-veiviser" @@ -1221,9 +1233,6 @@ msgstr "Skriv inn nytt visningsnavn (tomt for å tilbakestille)" msgid "Change &display name…" msgstr "Endre &visningsnavn…" -msgid "Context Menu" -msgstr "Kontekstmeny" - msgid "&Open folder…" msgstr "&Åpne mappe…" @@ -1845,8 +1854,8 @@ msgstr "3M MicroTouch (seriell)" msgid "Default Baud rate" msgstr "Standard baudrate" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Standard Hayes-kompatibelt modem" +msgid "Standard Hayes-compliant Modem" +msgstr "Standard Hayes-kompatibelt modem" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32-emulering" @@ -2799,9 +2808,6 @@ msgstr "Veksle fullskjerm" msgid "Toggle UI in fullscreen" msgstr "" -msgid "Screenshot" -msgstr "Skjermbilde" - msgid "Release mouse pointer" msgstr "Frigi musepeker" @@ -3005,3 +3011,9 @@ msgstr "&Tillat rekompilering" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/nl-NL.po b/src/qt/languages/nl-NL.po index 3b10383f7..3d056a2ea 100644 --- a/src/qt/languages/nl-NL.po +++ b/src/qt/languages/nl-NL.po @@ -204,15 +204,27 @@ msgstr "&Statusbalkpictogrammen bijwerken" msgid "Take s&creenshot" msgstr "Maak een s&chermafbeelding" +msgid "Take screenshot" +msgstr "Maak een schermafbeelding" + msgid "Take &raw screenshot" msgstr "Maak een &ruw schermafbeelding" +msgid "Take raw screenshot" +msgstr "Maak een ruw schermafbeelding" + msgid "C&opy screenshot" msgstr "K&opieer een schermafbeelding" +msgid "Copy screenshot" +msgstr "Kopieer een schermafbeelding" + msgid "Copy r&aw screenshot" msgstr "Kopieer een r&uw schermafbeelding" +msgid "Copy raw screenshot" +msgstr "Kopieer een ruw schermafbeelding" + msgid "S&ound" msgstr "&Geluid" @@ -531,11 +543,11 @@ msgstr "Floppy disk controller:" msgid "CD-ROM controller:" msgstr "CD-ROM controller:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Tertiaire IDE-controller" +msgid "Tertiary IDE Controller" +msgstr "Tertiaire IDE-controller" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Quaternaire IDE-controller" +msgid "Quaternary IDE Controller" +msgstr "Quaternaire IDE-controller" msgid "Hard disk controllers" msgstr "Harde schijfcontrollers" @@ -1137,8 +1149,8 @@ msgstr "Openen van geselecteerd configuratiebestand voor lezen niet mogelijk: %1 msgid "Use regular expressions in search box" msgstr "Gebruik reguliere expressies in zoekveld" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 machine(s) zijn nu actief. Weet je zeker dat je de VM manager wil afsluiten?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n machine(s) zijn nu actief. Weet je zeker dat je de VM manager wil afsluiten?" msgid "Add new system wizard" msgstr "Wizard toevoegen van nieuw systeem" @@ -1221,9 +1233,6 @@ msgstr "Voer een nieuwe weergavenaam in (laat leeg om te herstellen)" msgid "Change &display name…" msgstr "Pas &weergavenaam aan…" -msgid "Context Menu" -msgstr "Contextmenu" - msgid "&Open folder…" msgstr "&Open map…" @@ -1845,8 +1854,8 @@ msgstr "3M MicroTouch (serieel)" msgid "Default Baud rate" msgstr "Standaard baudrate" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Standaard Hayes-compatibele modem" +msgid "Standard Hayes-compliant Modem" +msgstr "Standaard Hayes-compatibele modem" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32-emulatie" @@ -2799,9 +2808,6 @@ msgstr "Volledig scherm omschakelen" msgid "Toggle UI in fullscreen" msgstr "" -msgid "Screenshot" -msgstr "Schermafbeelding" - msgid "Release mouse pointer" msgstr "Geef muis vrij" @@ -3005,3 +3011,9 @@ msgstr "Recompilatie &toestaan" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/pl-PL.po b/src/qt/languages/pl-PL.po index 2b9610084..20317c9ec 100644 --- a/src/qt/languages/pl-PL.po +++ b/src/qt/languages/pl-PL.po @@ -211,15 +211,27 @@ msgstr "&Aktualizuj ikony na pasku statusu" msgid "Take s&creenshot" msgstr "Zrób &zrzut ekranu" +msgid "Take screenshot" +msgstr "Zrób zrzut ekranu" + msgid "Take &raw screenshot" msgstr "Zrób &surowy zrzut ekranu" +msgid "Take raw screenshot" +msgstr "Zrób surowy zrzut ekranu" + msgid "C&opy screenshot" msgstr "S&kopiuj zrzut ekranu" +msgid "Copy screenshot" +msgstr "Skopiuj zrzut ekranu" + msgid "Copy r&aw screenshot" msgstr "Skopiuj s&urowy zrzut ekranu" +msgid "Copy raw screenshot" +msgstr "Skopiuj surowy zrzut ekranu" + msgid "S&ound" msgstr "Dź&więk" @@ -538,11 +550,11 @@ msgstr "Kontroler dyskietek:" msgid "CD-ROM controller:" msgstr "Kontroler CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Trzeciorzędny kontroler IDE" +msgid "Tertiary IDE Controller" +msgstr "Trzeciorzędny kontroler IDE" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Czwartorzędny kontroler IDE" +msgid "Quaternary IDE Controller" +msgstr "Czwartorzędny kontroler IDE" msgid "Hard disk controllers" msgstr "Kontrolery dysków twardych" @@ -1144,8 +1156,8 @@ msgstr "Nie udało się otworzyć wybranego pliku konfiguracyjnego do odczytu: % msgid "Use regular expressions in search box" msgstr "Użyj wyrażeń regularnych w polu wyszukiwania" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "Liczba obecnie aktywnych maszyn: %1. Czy na pewno chcesz, mimo to, wyjść z menedżera maszyn wirtualnych?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "Liczba obecnie aktywnych maszyn: %n. Czy na pewno chcesz, mimo to, wyjść z menedżera maszyn wirtualnych?" msgid "Add new system wizard" msgstr "Kreator dodawania nowego systemu" @@ -1228,9 +1240,6 @@ msgstr "Podaj nową nazwę wyświetlaną (wyczyść, by zresetować)" msgid "Change &display name…" msgstr "Zmień wyświetlaną &nazwę…" -msgid "Context Menu" -msgstr "Menu kontekstowe" - msgid "&Open folder…" msgstr "&Otwórz folder…" @@ -1852,8 +1861,8 @@ msgstr "3M MicroTouch (szeregowy)" msgid "Default Baud rate" msgstr "Domyślna szybkość transmisji" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Standardowy modem zgodny z Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Standardowy modem zgodny z Hayes" msgid "Roland MT-32 Emulation" msgstr "Emulacja Roland MT-32" @@ -2806,9 +2815,6 @@ msgstr "Przełącz pełny ekran" msgid "Toggle UI in fullscreen" msgstr "Przełącz UI w pełnym ekranie" -msgid "Screenshot" -msgstr "Zrzut ekranu" - msgid "Release mouse pointer" msgstr "Wypuść wskaźnik myszy" @@ -3012,3 +3018,9 @@ msgstr "&Zezwól na rekompilację" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/pt-BR.po b/src/qt/languages/pt-BR.po index b82c1a7c9..31875d7ba 100644 --- a/src/qt/languages/pt-BR.po +++ b/src/qt/languages/pt-BR.po @@ -204,15 +204,27 @@ msgstr "&Atualizar ícones da barra de status" msgid "Take s&creenshot" msgstr "Capturar &tela" +msgid "Take screenshot" +msgstr "Capturar tela" + msgid "Take &raw screenshot" msgstr "Fazer captura &bruta da tela" +msgid "Take raw screenshot" +msgstr "Fazer captura bruta da tela" + msgid "C&opy screenshot" msgstr "C&opiar captura da tela" +msgid "Copy screenshot" +msgstr "Copiar captura da tela" + msgid "Copy r&aw screenshot" msgstr "Copiar captura b&ruta da tela" +msgid "Copy raw screenshot" +msgstr "Copiar captura bruta da tela" + msgid "S&ound" msgstr "&Som" @@ -531,11 +543,11 @@ msgstr "Controlador de disquete:" msgid "CD-ROM controller:" msgstr "Controlador de CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Controlador IDE terciário" +msgid "Tertiary IDE Controller" +msgstr "Controlador IDE terciário" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Controlador IDE quaternário" +msgid "Quaternary IDE Controller" +msgstr "Controlador IDE quaternário" msgid "Hard disk controllers" msgstr "Controladores de disco rígido" @@ -1137,8 +1149,8 @@ msgstr "Não foi possível abrir o arquivo de configuração selecionado para le msgid "Use regular expressions in search box" msgstr "Usar expressões regulares na caixa de pesquisa" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 máquina(s) está(ão) ativa(s) no momento. Tem certeza de que deseja sair do gerenciador de MVs mesmo assim?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n máquina(s) está(ão) ativa(s) no momento. Tem certeza de que deseja sair do gerenciador de MVs mesmo assim?" msgid "Add new system wizard" msgstr "Assistente para novo sistema" @@ -1221,9 +1233,6 @@ msgstr "Digite o novo nome de exibição (em branco para restaurar)" msgid "Change &display name…" msgstr "Mudar o &nome de exibição…" -msgid "Context Menu" -msgstr "Menu de contexto" - msgid "&Open folder…" msgstr "Abrir &pasta…" @@ -1845,8 +1854,8 @@ msgstr "3M MicroTouch (serial)" msgid "Default Baud rate" msgstr "Taxa de transmissão padrão" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Modem padrão compatível com Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Modem padrão compatível com Hayes" msgid "Roland MT-32 Emulation" msgstr "Emulação do Roland MT-32" @@ -2799,9 +2808,6 @@ msgstr "Alternar tela cheia" msgid "Toggle UI in fullscreen" msgstr "Alternar interface em tela cheia" -msgid "Screenshot" -msgstr "Captura de tela" - msgid "Release mouse pointer" msgstr "Liberar ponteiro do mouse" @@ -3005,3 +3011,9 @@ msgstr "&Permitir recompilação" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/pt-PT.po b/src/qt/languages/pt-PT.po index b68b91a8b..f18eb8f1a 100644 --- a/src/qt/languages/pt-PT.po +++ b/src/qt/languages/pt-PT.po @@ -211,15 +211,27 @@ msgstr "&Atualizar ícones da barra de estado" msgid "Take s&creenshot" msgstr "Gravar imagem de &ecrã" +msgid "Take screenshot" +msgstr "Gravar imagem de ecrã" + msgid "Take &raw screenshot" msgstr "Gravar imagem &bruta de ecrã" +msgid "Take raw screenshot" +msgstr "Gravar imagem bruta de ecrã" + msgid "C&opy screenshot" +msgstr "&Copiar imagem de ecrã" + +msgid "Copy screenshot" msgstr "Copiar imagem de ecrã" msgid "Copy r&aw screenshot" msgstr "Copiar imagem b&ruta de ecrã" +msgid "Copy raw screenshot" +msgstr "Copiar imagem bruta de ecrã" + msgid "S&ound" msgstr "&Som" @@ -538,11 +550,11 @@ msgstr "Controlador de disquetes:" msgid "CD-ROM controller:" msgstr "Controlador CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Controlador IDE terciário" +msgid "Tertiary IDE Controller" +msgstr "Controlador IDE terciário" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Controlador IDE quaternário" +msgid "Quaternary IDE Controller" +msgstr "Controlador IDE quaternário" msgid "Hard disk controllers" msgstr "Controladores de disco rígido" @@ -1144,8 +1156,8 @@ msgstr "Não foi possível abrir o ficheir de configurção seleccionado para le msgid "Use regular expressions in search box" msgstr "Usa expressões regulares na caixa de procura" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 máquina(s) estão actualmente activas. Quer mesmo sair do gerenciador de MVs?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n máquina(s) estão actualmente activas. Quer mesmo sair do gerenciador de MVs?" msgid "Add new system wizard" msgstr "Assistende de adicionamento do novo sistema" @@ -1228,9 +1240,6 @@ msgstr "Escreve o nome apresentado (vazio para repor)" msgid "Change &display name…" msgstr "Alterar o nome &apresentado…" -msgid "Context Menu" -msgstr "Menu de contexto" - msgid "&Open folder…" msgstr "&Abrir pasta…" @@ -1852,8 +1861,8 @@ msgstr "3M MicroTouch (série)" msgid "Default Baud rate" msgstr "Velocidade de transmissão padrão" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Modem padrão compatível com Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Modem padrão compatível com Hayes" msgid "Roland MT-32 Emulation" msgstr "Emulação do Roland MT-32" @@ -2806,9 +2815,6 @@ msgstr "Alternar o modo em ecrã cheio" msgid "Toggle UI in fullscreen" msgstr "Alternar interface do utilizador em ecrã inteiro" -msgid "Screenshot" -msgstr "Captura de ecrã" - msgid "Release mouse pointer" msgstr "Soltar o ponteiro do rato" @@ -3012,3 +3018,9 @@ msgstr "&Permitir recompilação" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/ru-RU.po b/src/qt/languages/ru-RU.po index b39d0d84c..6102dceed 100644 --- a/src/qt/languages/ru-RU.po +++ b/src/qt/languages/ru-RU.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"PO-Revision-Date: 2025-12-30 13:56+0000\n" +"PO-Revision-Date: 2026-01-10 12:56+0000\n" "Last-Translator: Alexander Babikov \n" "Language-Team: Russian \n" "Language: ru-RU\n" @@ -20,7 +20,7 @@ msgid "&Keyboard requires capture" msgstr "&Клавиатура требует захвата" msgid "&Right CTRL is left ALT" -msgstr "&Правый CTRL - это левый ALT" +msgstr "П&равый CTRL - это левый ALT" msgid "&Hard reset" msgstr "&Холодная перезагрузка" @@ -211,15 +211,27 @@ msgstr "&Обновление значков строки состояния" msgid "Take s&creenshot" msgstr "Сделать с&криншот" +msgid "Take screenshot" +msgstr "Сделать скриншот" + msgid "Take &raw screenshot" msgstr "Сделать н&еобработанный скриншот" +msgid "Take raw screenshot" +msgstr "Сделать необработанный скриншот" + msgid "C&opy screenshot" msgstr "Ско&пировать скриншот" +msgid "Copy screenshot" +msgstr "Скопировать скриншот" + msgid "Copy r&aw screenshot" msgstr "Скопировать необработанный скрин&шот" +msgid "Copy raw screenshot" +msgstr "Скопировать необработанный скриншот" + msgid "S&ound" msgstr "&Звук" @@ -538,11 +550,11 @@ msgstr "Контроллер гибких дисков:" msgid "CD-ROM controller:" msgstr "Контроллер CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Третичный контроллер IDE" +msgid "Tertiary IDE Controller" +msgstr "Третичный контроллер IDE" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Четвертичный контроллер IDE" +msgid "Quaternary IDE Controller" +msgstr "Четвертичный контроллер IDE" msgid "Hard disk controllers" msgstr "Контроллеры жёстких дисков" @@ -1156,8 +1168,8 @@ msgstr "Невозможно открыть выбранный файл конф msgid "Use regular expressions in search box" msgstr "Использовать регулярные выражения в поле поиска" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 машина(ы) в настоящее время активна(ы). Вы уверены, что всё равно хотите выйти из менеджера виртуальной машины?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n машина(ы) в настоящее время активна(ы). Вы уверены, что всё равно хотите выйти из менеджера виртуальной машины?" msgid "Add new system wizard" msgstr "Мастер добавления новой системы" @@ -1240,9 +1252,6 @@ msgstr "Введите новое отображаемое имя (оставь msgid "Change &display name…" msgstr "Изменить &отображаемое имя…" -msgid "Context Menu" -msgstr "Контекстное меню" - msgid "&Open folder…" msgstr "&Открыть папку…" @@ -1864,8 +1873,8 @@ msgstr "3M MicroTouch (последовательный)" msgid "Default Baud rate" msgstr "Скорость передачи данных по умолчанию" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Стандартный Hayes-совместимый модем" +msgid "Standard Hayes-compliant Modem" +msgstr "Стандартный Hayes-совместимый модем" msgid "Roland MT-32 Emulation" msgstr "Эмуляция Roland MT-32" @@ -2818,9 +2827,6 @@ msgstr "Переключить полноэкранный режим" msgid "Toggle UI in fullscreen" msgstr "Переключить UI в полноэкранном режиме" -msgid "Screenshot" -msgstr "Скриншот" - msgid "Release mouse pointer" msgstr "Отпустить указатель мыши" @@ -3017,10 +3023,16 @@ msgid "Allow recompilation" msgstr "Разрешить рекомпиляцию" msgid "&Force interpretation" -msgstr "&Принудительная интерпретация" +msgstr "Пр&инудительная интерпретация" msgid "&Allow recompilation" -msgstr "&Разрешить рекомпиляцию" +msgstr "Разреш&ить рекомпиляцию" msgid "&Fast forward" -msgstr "" +msgstr "П&еремотка вперёд" + +msgid "Fast forward" +msgstr "Перемотка вперёд" + +msgid "To change the system directory, stop all running machines." +msgstr "Чтобы изменить системную папку, остановите все запущенные машины." diff --git a/src/qt/languages/sk-SK.po b/src/qt/languages/sk-SK.po index 3586f6c12..a112005da 100644 --- a/src/qt/languages/sk-SK.po +++ b/src/qt/languages/sk-SK.po @@ -210,15 +210,27 @@ msgstr "&Aktualizovať ikony na stavovom riadku" msgid "Take s&creenshot" msgstr "Urobiť snímku &obrazovky" +msgid "Take screenshot" +msgstr "Urobiť snímku obrazovky" + msgid "Take &raw screenshot" msgstr "Urobiť &surovú snímku obrazovky" +msgid "Take raw screenshot" +msgstr "Urobiť surovú snímku obrazovky" + msgid "C&opy screenshot" msgstr "S&kopírovať snímku obrazovky" +msgid "Copy screenshot" +msgstr "Skopírovať snímku obrazovky" + msgid "Copy r&aw screenshot" msgstr "Skopírovať s&urovú snímku obrazovky" +msgid "Copy raw screenshot" +msgstr "Skopírovať surovú snímku obrazovky" + msgid "S&ound" msgstr "&Zvuk" @@ -537,11 +549,11 @@ msgstr "Disketový radič:" msgid "CD-ROM controller:" msgstr "Radič CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Tretí radič IDE" +msgid "Tertiary IDE Controller" +msgstr "Tretí radič IDE" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Štvrtý radič IDE" +msgid "Quaternary IDE Controller" +msgstr "Štvrtý radič IDE" msgid "Hard disk controllers" msgstr "Radiče pevných diskov" @@ -1143,8 +1155,8 @@ msgstr "Nie je možné otvoriť vybraný konfiguračný súbor na čítanie: %1" msgid "Use regular expressions in search box" msgstr "Použiť v poli vyhľadávania regulárne výrazy" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 počítač(ov) je stále aktívnych. Naozaj chcete ukončiť správcu virtuálnych počítačov?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n počítač(ov) je stále aktívnych. Naozaj chcete ukončiť správcu virtuálnych počítačov?" msgid "Add new system wizard" msgstr "Sprievodca pridávaním nového systému" @@ -1227,9 +1239,6 @@ msgstr "Zadajte nové zobrazené meno (prázdne pole pre vymazanie)" msgid "Change &display name…" msgstr "Zmeniť &zobrazené meno…" -msgid "Context Menu" -msgstr "Kontextové menu" - msgid "&Open folder…" msgstr "&Otvoriť priečinok…" @@ -1851,8 +1860,8 @@ msgstr "3M MicroTouch (sériová)" msgid "Default Baud rate" msgstr "Východná prenosová rýchlosť" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Štandardný modem kompatibilný s Hayesom" +msgid "Standard Hayes-compliant Modem" +msgstr "Štandardný modem kompatibilný s Hayesom" msgid "Roland MT-32 Emulation" msgstr "Emulácia Roland MT-32" @@ -2805,9 +2814,6 @@ msgstr "Prepnúť režim celej obrazovky" msgid "Toggle UI in fullscreen" msgstr "Prepnúť používateľské rozhranie v režime celej obrazovky" -msgid "Screenshot" -msgstr "Zhotoviť snímku obrazovky" - msgid "Release mouse pointer" msgstr "Uvoľniť kurzor myši" @@ -3011,3 +3017,9 @@ msgstr "&Povoliť rekompiláciu" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/sl-SI.po b/src/qt/languages/sl-SI.po index a7cf7dc29..64cc6e7eb 100644 --- a/src/qt/languages/sl-SI.po +++ b/src/qt/languages/sl-SI.po @@ -212,15 +212,27 @@ msgstr "&Posodabljaj ikone statusne vrstice" msgid "Take s&creenshot" msgstr "&Zajemi posnetek zaslona" +msgid "Take screenshot" +msgstr "Zajemi posnetek zaslona" + msgid "Take &raw screenshot" msgstr "Zajemi &neobdelan posnetek zaslona" +msgid "Take raw screenshot" +msgstr "Zajemi neobdelan posnetek zaslona" + msgid "C&opy screenshot" msgstr "K&opiraj posnetek zaslona" +msgid "Copy screenshot" +msgstr "Kopiraj posnetek zaslona" + msgid "Copy r&aw screenshot" msgstr "Kopriaj n&eobdelan posenetk zaslona" +msgid "Copy raw screenshot" +msgstr "Kopriaj neobdelan posenetk zaslona" + msgid "S&ound" msgstr "Z&vok" @@ -539,11 +551,11 @@ msgstr "Disketni krmilnik:" msgid "CD-ROM controller:" msgstr "Krmilnik CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Terciarni krmilnik IDE" +msgid "Tertiary IDE Controller" +msgstr "Terciarni krmilnik IDE" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Kvartarni krmilnik IDE" +msgid "Quaternary IDE Controller" +msgstr "Kvartarni krmilnik IDE" msgid "Hard disk controllers" msgstr "Krmilniki trdih diskov" @@ -1145,8 +1157,8 @@ msgstr "Ni bilo mogože odpreti izbrane datoteke z nastavitvami za branje: %1" msgid "Use regular expressions in search box" msgstr "V iskalnem polju uporabi regularne ekspresije" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "Št. trenutno dejavnih naprav je %1. Ali vseeno želite izstopiti iz upravitelja navideznih naprav?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "Št. trenutno dejavnih naprav je %n. Ali vseeno želite izstopiti iz upravitelja navideznih naprav?" msgid "Add new system wizard" msgstr "Čarovnik za dodajanje novega sistema" @@ -1229,9 +1241,6 @@ msgstr "Vstavi novo prikazano ime (prazno za ponastavitev)" msgid "Change &display name…" msgstr "Spremeni &prikazano ime…" -msgid "Context Menu" -msgstr "Kontekstni meni" - msgid "&Open folder…" msgstr "&Odpri mapo…" @@ -1853,8 +1862,8 @@ msgstr "3M MicroTouch (serijska)" msgid "Default Baud rate" msgstr "Privzeta baudna hitrost" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Standardni modem v skladen s Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Standardni modem v skladen s Hayes" msgid "Roland MT-32 Emulation" msgstr "Emulacija Roland MT-32" @@ -2807,9 +2816,6 @@ msgstr "Preklopi celozaslonski način" msgid "Toggle UI in fullscreen" msgstr "Preklopi uporabniški vmesnik v načinu polnega zaslona" -msgid "Screenshot" -msgstr "Zajem zaslona" - msgid "Release mouse pointer" msgstr "Izpusti kazalec miške" @@ -3013,3 +3019,9 @@ msgstr "&Dovoli prevajanje" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/sv-SE.po b/src/qt/languages/sv-SE.po index 3cac62eaf..f49235919 100644 --- a/src/qt/languages/sv-SE.po +++ b/src/qt/languages/sv-SE.po @@ -204,15 +204,27 @@ msgstr "&Uppdatera statusfältets ikoner" msgid "Take s&creenshot" msgstr "Tag s&kärmbild" +msgid "Take screenshot" +msgstr "Tag skärmbild" + msgid "Take &raw screenshot" msgstr "Tag &rå skärmbild" +msgid "Take raw screenshot" +msgstr "Tag rå skärmbild" + msgid "C&opy screenshot" +msgstr "&Kopiera skärmbild" + +msgid "Copy screenshot" msgstr "Kopiera skärmbild" msgid "Copy r&aw screenshot" msgstr "Kopera r&å skärmbild" +msgid "Copy raw screenshot" +msgstr "Kopera rå skärmbild" + msgid "S&ound" msgstr "L&jud" @@ -531,11 +543,11 @@ msgstr "Styrenhet för diskett:" msgid "CD-ROM controller:" msgstr "Styrenhet för CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Tertiär IDE-kontroller" +msgid "Tertiary IDE Controller" +msgstr "Tertiär IDE-kontroller" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Kvartär IDE-kontroller" +msgid "Quaternary IDE Controller" +msgstr "Kvartär IDE-kontroller" msgid "Hard disk controllers" msgstr "Hårddiskkontroller" @@ -1137,8 +1149,8 @@ msgstr "Kunde inte läsa den valda konfigurationsfilen: %1" msgid "Use regular expressions in search box" msgstr "Använd vanliga uttryck i sökfältet" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 maskin(er) är aktiva. Är du säker på att du vill avsluta VM-hanteraren ändå?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n maskin(er) är aktiva. Är du säker på att du vill avsluta VM-hanteraren ändå?" msgid "Add new system wizard" msgstr "Guiden Lägg till nytt system" @@ -1221,9 +1233,6 @@ msgstr "Ange nytt visningsnamn (tom för att återställa)" msgid "Change &display name…" msgstr "Ändra &visningsnamn…" -msgid "Context Menu" -msgstr "Innehållsmeny" - msgid "&Open folder…" msgstr "&Öppna mapp…" @@ -1845,8 +1854,8 @@ msgstr "3M MicroTouch (serie)" msgid "Default Baud rate" msgstr "Standard Baudhastighet" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Standard Hayes-kompatibelt modem" +msgid "Standard Hayes-compliant Modem" +msgstr "Standard Hayes-kompatibelt modem" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32 emulering" @@ -2799,9 +2808,6 @@ msgstr "Helskärm" msgid "Toggle UI in fullscreen" msgstr "" -msgid "Screenshot" -msgstr "Skärmbild" - msgid "Release mouse pointer" msgstr "Släpp muspekare" @@ -3005,3 +3011,9 @@ msgstr "&Tillåt omkompilering" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/tr-TR.po b/src/qt/languages/tr-TR.po index 22ccc4910..aad11ffda 100644 --- a/src/qt/languages/tr-TR.po +++ b/src/qt/languages/tr-TR.po @@ -210,15 +210,27 @@ msgstr "Durum &çubuğu simgelerini güncelle" msgid "Take s&creenshot" msgstr "&Ekran görüntüsü al" +msgid "Take screenshot" +msgstr "Ekran görüntüsü al" + msgid "Take &raw screenshot" msgstr "Ekran &ham görüntüsü al" +msgid "Take raw screenshot" +msgstr "Ekran ham görüntüsü al" + msgid "C&opy screenshot" msgstr "Ekran görüntüsü k&opyala" +msgid "Copy screenshot" +msgstr "Ekran görüntüsü kopyala" + msgid "Copy r&aw screenshot" msgstr "Ekran h&am görüntüsü kopyala" +msgid "Copy raw screenshot" +msgstr "Ekran ham görüntüsü kopyala" + msgid "S&ound" msgstr "&Ses" @@ -537,11 +549,11 @@ msgstr "Disket denetleyicisi:" msgid "CD-ROM controller:" msgstr "CD-ROM denetleyicisi:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Üçüncül IDE denetleyicisi" +msgid "Tertiary IDE Controller" +msgstr "Üçüncül IDE denetleyicisi" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Dördüncül IDE denetleyicisi" +msgid "Quaternary IDE Controller" +msgstr "Dördüncül IDE denetleyicisi" msgid "Hard disk controllers" msgstr "Sabit disk denetleyicileri" @@ -1143,8 +1155,8 @@ msgstr "Seçili yapılandırma dosyası okunmak için açılamıyor: %1" msgid "Use regular expressions in search box" msgstr "Arama kutusunda düzenli ifadeler kullan" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 makine şu anda aktif. Yine de VM yöneticisinden çıkmak istediğinize emin misiniz?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n makine şu anda aktif. Yine de VM yöneticisinden çıkmak istediğinize emin misiniz?" msgid "Add new system wizard" msgstr "Yeni sistem ekleme sihirbazı" @@ -1227,9 +1239,6 @@ msgstr "Yeni görünü adını girin (sıfırlamak için boş bırakın)" msgid "Change &display name…" msgstr "Görüntü adını &değiştirin…" -msgid "Context Menu" -msgstr "Bağlam Menüsü" - msgid "&Open folder…" msgstr "Klas&örü aç…" @@ -1851,8 +1860,8 @@ msgstr "3M MicroTouch (seri)" msgid "Default Baud rate" msgstr "Varsayılan Baud hızı" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Standart Hayes Uyumlu Modem" +msgid "Standard Hayes-compliant Modem" +msgstr "Standart Hayes Uyumlu Modem" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32 Emülasyonu" @@ -2805,9 +2814,6 @@ msgstr "Tam ekran modunu ayarla" msgid "Toggle UI in fullscreen" msgstr "Arayüzü tam ekranda ayarla" -msgid "Screenshot" -msgstr "Ekran görüntüsü" - msgid "Release mouse pointer" msgstr "Fare imlecini serbest bırak" @@ -3011,3 +3017,9 @@ msgstr "&Derlenmesine izin ver" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/uk-UA.po b/src/qt/languages/uk-UA.po index 0fb2c8033..7fd0d0b33 100644 --- a/src/qt/languages/uk-UA.po +++ b/src/qt/languages/uk-UA.po @@ -210,16 +210,28 @@ msgid "&Update status bar icons" msgstr "&Обновлення значків рядка стану" msgid "Take s&creenshot" -msgstr "Зробити &знімок" +msgstr "&Зробити скріншот" + +msgid "Take screenshot" +msgstr "Зробити скріншот" msgid "Take &raw screenshot" -msgstr "Зробити &сирий знімок" +msgstr "Зробити &сирий скріншот" + +msgid "Take raw screenshot" +msgstr "Зробити сирий скріншот" msgid "C&opy screenshot" -msgstr "С&копійовати знімок" +msgstr "С&копійовати скріншот" + +msgid "Copy screenshot" +msgstr "Скопійовати скріншот" msgid "Copy r&aw screenshot" -msgstr "Скопійовати с&ирий знімок" +msgstr "Скопійовати с&ирий скріншот" + +msgid "Copy raw screenshot" +msgstr "Скопійовати сирий скріншот" msgid "S&ound" msgstr "&Звук" @@ -539,11 +551,11 @@ msgstr "Контролер гнучких дисків:" msgid "CD-ROM controller:" msgstr "Контролер CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Третинний контролер IDE" +msgid "Tertiary IDE Controller" +msgstr "Третинний контролер IDE" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Четвертинний контролер IDE" +msgid "Quaternary IDE Controller" +msgstr "Четвертинний контролер IDE" msgid "Hard disk controllers" msgstr "Контролери жорстких дисків" @@ -1145,8 +1157,8 @@ msgstr "Неможливо відкрити вибраний файл конфі msgid "Use regular expressions in search box" msgstr "Використовувати регулярні вирази в полі пошуку" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 машина(и) наразі активна(і). Ви впевнені, що все одно хочете вийти з менеджера віртуальної машини?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n машина(и) наразі активна(і). Ви впевнені, що все одно хочете вийти з менеджера віртуальної машини?" msgid "Add new system wizard" msgstr "Майстер додавання нової системи" @@ -1229,9 +1241,6 @@ msgstr "Введіть нове відображуване ім'я (порожн msgid "Change &display name…" msgstr "Змінити &відображуване ім'я…" -msgid "Context Menu" -msgstr "Контекстне меню" - msgid "&Open folder…" msgstr "&Відкрити папку…" @@ -1853,8 +1862,8 @@ msgstr "3M MicroTouch (послідовна)" msgid "Default Baud rate" msgstr "Швидкість передачі даних за замовчуванням" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Стандартний модем, сумісний зі стандартом Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Стандартний модем, сумісний зі стандартом Hayes" msgid "Roland MT-32 Emulation" msgstr "Емуляція Roland MT-32" @@ -2807,9 +2816,6 @@ msgstr "Переключити повноекранний режим" msgid "Toggle UI in fullscreen" msgstr "Переключити UI в повноекранному режимі" -msgid "Screenshot" -msgstr "Скріншот" - msgid "Release mouse pointer" msgstr "Відпустити вказівник миші" @@ -3013,3 +3019,9 @@ msgstr "&Дозволити рекомпіляцію" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/vi-VN.po b/src/qt/languages/vi-VN.po index 35782e86d..b2c7491a1 100644 --- a/src/qt/languages/vi-VN.po +++ b/src/qt/languages/vi-VN.po @@ -204,15 +204,27 @@ msgstr "Cậ&p nhật biểu tượng thanh trạng thái" msgid "Take s&creenshot" msgstr "Chụp &màn hình" +msgid "Take screenshot" +msgstr "Chụp màn hình" + msgid "Take &raw screenshot" msgstr "Chụp màn hình &thô" +msgid "Take raw screenshot" +msgstr "Chụp màn hình thô" + msgid "C&opy screenshot" msgstr "S&ao chép ảnh chụp màn hình" +msgid "Copy screenshot" +msgstr "Sao chép ảnh chụp màn hình" + msgid "Copy r&aw screenshot" msgstr "Sao chép ảnh chụp màn hình t&hô" +msgid "Copy raw screenshot" +msgstr "Sao chép ảnh chụp màn hình thô" + msgid "S&ound" msgstr "&Âm thanh" @@ -531,11 +543,11 @@ msgstr "Bộ điều khiển ổ mềm:" msgid "CD-ROM controller:" msgstr "Bộ điều khiển CD-ROM:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] Bộ điều khiển IDE thứ ba" +msgid "Tertiary IDE Controller" +msgstr "Bộ điều khiển IDE thứ ba" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] Bộ điều khiển IDE thứ tư" +msgid "Quaternary IDE Controller" +msgstr "Bộ điều khiển IDE thứ tư" msgid "Hard disk controllers" msgstr "Bộ điều khiển ổ cứng" @@ -1137,8 +1149,8 @@ msgstr "Không thể mở cấu hình đã chọn để đọc: %1" msgid "Use regular expressions in search box" msgstr "Dùng regex trong hộp tìm kiếm" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 máy hiện vẫn đang chạy. Bạn có muốn thoát trình quản lý máy ảo không?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n máy hiện vẫn đang chạy. Bạn có muốn thoát trình quản lý máy ảo không?" msgid "Add new system wizard" msgstr "Thêm trình thuật sĩ hệ thống mới" @@ -1221,9 +1233,6 @@ msgstr "Điền tên hiển thị mới (để trống để đặt lại)" msgid "Change &display name…" msgstr "Thay đổi tên hiển thị…" -msgid "Context Menu" -msgstr "Menu ngữ cảnh" - msgid "&Open folder…" msgstr "Mở thư mục…" @@ -1845,8 +1854,8 @@ msgstr "3M MicroTouch (Serial)" msgid "Default Baud rate" msgstr "Tốc độ baud mặc định" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] Modem tuân thủ tiêu chuẩn Hayes" +msgid "Standard Hayes-compliant Modem" +msgstr "Modem tuân thủ tiêu chuẩn Hayes" msgid "Roland MT-32 Emulation" msgstr "Mô phỏng Roland MT-32" @@ -2799,9 +2808,6 @@ msgstr "Bật/tắt toàn màn hình" msgid "Toggle UI in fullscreen" msgstr "" -msgid "Screenshot" -msgstr "Chụp màn hình" - msgid "Release mouse pointer" msgstr "Thả con trỏ chuột" @@ -3005,3 +3011,9 @@ msgstr "&Cho phép biên dịch lại" msgid "&Fast forward" msgstr "" + +msgid "Fast forward" +msgstr "" + +msgid "To change the system directory, stop all running machines." +msgstr "" diff --git a/src/qt/languages/zh-CN.po b/src/qt/languages/zh-CN.po index d99fb54d5..a960d8b2d 100644 --- a/src/qt/languages/zh-CN.po +++ b/src/qt/languages/zh-CN.po @@ -1,8 +1,15 @@ msgid "" msgstr "" +"PO-Revision-Date: 2026-01-18 19:18+0000\n" +"Last-Translator: BlueRain-debug \n" +"Language-Team: Chinese (Simplified Han script) \n" +"Language: zh-CN\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 5.12.2\n" "X-Language: zh_CN\n" "X-Source-Language: en_US\n" @@ -204,15 +211,27 @@ msgstr "更新状态栏图标(&U)" msgid "Take s&creenshot" msgstr "截图(&C)" +msgid "Take screenshot" +msgstr "截图" + msgid "Take &raw screenshot" msgstr "原始截图(&R)" +msgid "Take raw screenshot" +msgstr "原始截图" + msgid "C&opy screenshot" msgstr "复制截图(&O)" +msgid "Copy screenshot" +msgstr "复制截图" + msgid "Copy r&aw screenshot" msgstr "复制原始截图(&A)" +msgid "Copy raw screenshot" +msgstr "复制原始截图" + msgid "S&ound" msgstr "声音(&O)" @@ -531,11 +550,11 @@ msgstr "软盘控制器:" msgid "CD-ROM controller:" msgstr "CD-ROM 控制器:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] 第三 IDE 控制器" +msgid "Tertiary IDE Controller" +msgstr "第三 IDE 控制器" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] 第四 IDE 控制器" +msgid "Quaternary IDE Controller" +msgstr "第四 IDE 控制器" msgid "Hard disk controllers" msgstr "硬盘控制器" @@ -1137,8 +1156,8 @@ msgstr "无法打开选定的配置文件进行读取:%1" msgid "Use regular expressions in search box" msgstr "在搜索框中使用正则表达式" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 个计算机当前处于活动状态。您确定要退出虚拟机管理器吗?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n 个计算机当前处于活动状态。您确定要退出虚拟机管理器吗?" msgid "Add new system wizard" msgstr "添加新系统向导" @@ -1221,9 +1240,6 @@ msgstr "输入新的显示名称 (留空以重置)" msgid "Change &display name…" msgstr "更改显示名称(&D)…" -msgid "Context Menu" -msgstr "上下文菜单" - msgid "&Open folder…" msgstr "打开文件夹(&O)…" @@ -1657,7 +1673,7 @@ msgid "&Connected" msgstr "已连接(&C)" msgid "Clear image &history" -msgstr "清除映像历史记录(&H)" +msgstr "清除镜像文件历史记录(&H)" msgid "Create…" msgstr "创建…" @@ -1720,7 +1736,7 @@ msgid "\nFalling back to software rendering." msgstr "\n回到软件渲染。" msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" -msgstr "

选择媒体图像(光盘、软盘等)时,打开对话框将从与 86Box 配置文件相同的目录开始。这一设置可能只会在 macOS 上产生影响。

" +msgstr "

选择媒体镜像(光盘、软盘等)时,打开对话框将从与 86Box 配置文件相同的目录开始。这一设置可能只会在 macOS 上产生影响。

" msgid "This machine might have been moved or copied." msgstr "这台机器可能被移动或复制过。" @@ -1762,7 +1778,7 @@ msgid "Mode:" msgstr "模式:" msgid "Interface:" -msgstr "界面:" +msgstr "接口:" msgid "Adapter:" msgstr "适配器:" @@ -1845,8 +1861,8 @@ msgstr "3M MicroTouch (串口)" msgid "Default Baud rate" msgstr "默认波特率" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] 标准 Hayes 兼容调制解调器" +msgid "Standard Hayes-compliant Modem" +msgstr "标准 Hayes 兼容调制解调器" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32 仿真" @@ -2569,7 +2585,7 @@ msgid "3Dfx Voodoo 2" msgstr "3Dfx Voodoo 2" msgid "Obsidian SB50 + Amethyst (2 TMUs)" -msgstr "Obsidian SB50 + Amethyst(2 个 TMU)" +msgstr "Obsidian SB50 + Amethyst(双TMU)" msgid "8-bit" msgstr "8 位" @@ -2799,9 +2815,6 @@ msgstr "切换全屏" msgid "Toggle UI in fullscreen" msgstr "在全屏模式下激活菜单栏" -msgid "Screenshot" -msgstr "截图" - msgid "Release mouse pointer" msgstr "释放鼠标" @@ -2923,7 +2936,7 @@ msgid "86Box Update" msgstr "86Box 更新" msgid "Release notes:" -msgstr "发行版说明:" +msgstr "发行说明:" msgid "%1 Hz" msgstr "%1 Hz" @@ -3004,4 +3017,10 @@ msgid "&Allow recompilation" msgstr "允许重编译(&A)" msgid "&Fast forward" -msgstr "" +msgstr "快进(&F)" + +msgid "Fast forward" +msgstr "快进" + +msgid "To change the system directory, stop all running machines." +msgstr "请在变更系统目录前关闭所有正在运行的虚拟机。" diff --git a/src/qt/languages/zh-TW.po b/src/qt/languages/zh-TW.po index 299e68b70..0bdcd215a 100644 --- a/src/qt/languages/zh-TW.po +++ b/src/qt/languages/zh-TW.po @@ -211,15 +211,27 @@ msgstr "更新狀態列圖示(&U)" msgid "Take s&creenshot" msgstr "擷取螢幕畫面(&C)" +msgid "Take screenshot" +msgstr "擷取螢幕畫面" + msgid "Take &raw screenshot" msgstr "擷取原始螢幕畫面(&R)" +msgid "Take raw screenshot" +msgstr "擷取原始螢幕畫面" + msgid "C&opy screenshot" msgstr "擷取螢幕畫面至剪貼簿(&O)" +msgid "Copy screenshot" +msgstr "擷取螢幕畫面至剪貼簿" + msgid "Copy r&aw screenshot" msgstr "擷取原始螢幕畫面至剪貼薄(&A)" +msgid "Copy raw screenshot" +msgstr "擷取原始螢幕畫面至剪貼薄" + msgid "S&ound" msgstr "聲音(&O)" @@ -263,10 +275,10 @@ msgid "&Play" msgstr "播放(&P)" msgid "&Rewind to the beginning" -msgstr "倒帶至起點(&R)" +msgstr "倒轉至起點(&R)" msgid "&Fast forward to the end" -msgstr "快進至終點(&F)" +msgstr "快轉至終點(&F)" msgid "E&ject" msgstr "退出(&J)" @@ -538,11 +550,11 @@ msgstr "軟碟控制器:" msgid "CD-ROM controller:" msgstr "CD-ROM 控制器:" -msgid "[ISA16] Tertiary IDE Controller" -msgstr "[ISA16] 第三 IDE 控制器" +msgid "Tertiary IDE Controller" +msgstr "第三 IDE 控制器" -msgid "[ISA16] Quaternary IDE Controller" -msgstr "[ISA16] 第四 IDE 控制器" +msgid "Quaternary IDE Controller" +msgstr "第四 IDE 控制器" msgid "Hard disk controllers" msgstr "硬碟控制器" @@ -872,16 +884,16 @@ msgid "4-axis, 4-button joystick" msgstr "4 軸, 4 鍵搖桿" msgid "2-button gamepad(s)" -msgstr "2 鍵遊戲手柄" +msgstr "2 鍵遊戲手把" msgid "3-button gamepad" -msgstr "3 鍵遊戲手柄" +msgstr "3 鍵遊戲手把" msgid "4-button gamepad" -msgstr "4 鍵遊戲手柄" +msgstr "4 鍵遊戲手把" msgid "6-button gamepad" -msgstr "6 鍵遊戲手柄" +msgstr "6 鍵遊戲手把" msgid "2-button flight yoke" msgstr "2 按鈕飛行搖桿" @@ -902,13 +914,13 @@ msgid "4-button flight yoke with throttle" msgstr "4 按鈕帶油門飛行搖桿" msgid "Steering wheel (3-axis, 2-button)" -msgstr "方向盤 (3 軸, 2 鍵搖桿)" +msgstr "方向盤 (3 軸, 2 鍵)" msgid "Steering wheel (3-axis, 3-button)" -msgstr "方向盤 (3 軸, 3 鍵搖桿)" +msgstr "方向盤 (3 軸, 3 鍵)" msgid "Steering wheel (3-axis, 4-button)" -msgstr "方向盤 (3 軸, 4 鍵搖桿)" +msgstr "方向盤 (3 軸, 4 鍵)" msgid "Thrustmaster Formula T1/T2 with adapter" msgstr "Thrustmaster Formula T1/T2 附轉接器" @@ -1142,10 +1154,10 @@ msgid "Unable to open the selected configuration file for reading: %1" msgstr "無法開啟選取的組態檔進行讀取: %1" msgid "Use regular expressions in search box" -msgstr "在搜尋方塊中使用正規表示式" +msgstr "在搜尋欄中使用正規表示式" -msgid "%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" -msgstr "%1 台機器目前處於活動狀態。您確定要退出虛擬機器管理員嗎?" +msgid "%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?" +msgstr "%n 台機器目前處於活動狀態。您確定要退出虛擬機器管理員嗎?" msgid "Add new system wizard" msgstr "新增系統精靈" @@ -1172,7 +1184,7 @@ msgid "Type some notes here" msgstr "在此輸入備註" msgid "Paste the contents of the existing configuration file into the box below." -msgstr "將現有組態檔的內容貼到下面的方塊中。" +msgstr "將現有組態檔的內容貼到下面的輸入欄中。" msgid "Load configuration from file" msgstr "從檔案載入組態" @@ -1228,9 +1240,6 @@ msgstr "輸入新的顯示名稱 (留空以重設)" msgid "Change &display name…" msgstr "變更顯示名稱(&D)…" -msgid "Context Menu" -msgstr "內容選單" - msgid "&Open folder…" msgstr "開啟資料夾(&O)…" @@ -1313,7 +1322,7 @@ msgid "&Kill" msgstr "強制終止(&K)" msgid "Killing a virtual machine can cause data loss. Only do this if the 86Box process gets stuck.\n\nDo you really wish to kill the virtual machine \"%1\"?" -msgstr "強行終止虛擬機器可能會導致資料遺失。只有在 86Box 過程卡住時才執行此操作。\n\n您真的希望強制終止虛擬機器 \"%1\"?" +msgstr "強制終止虛擬機器可能會導致資料遺失。只有在 86Box 過程卡住時才執行此操作。\n\n您真的希望強制終止虛擬機器 \"%1\"?" msgid "&Delete" msgstr "刪除(&D)" @@ -1415,7 +1424,7 @@ msgid "Disk image too large" msgstr "磁碟影像太大" msgid "Remember to partition and format the newly-created drive." -msgstr "請記得為新創建的影像分區並格式化。" +msgstr "請記得為新創建的影像建立分割區並格式化。" msgid "The selected file will be overwritten. Are you sure you want to use it?" msgstr "選定的檔案將被覆蓋。確定繼續使用此檔案嗎?" @@ -1424,10 +1433,10 @@ msgid "Unsupported disk image" msgstr "不支援的磁碟影像" msgid "Overwrite" -msgstr "覆蓋" +msgstr "覆寫" msgid "Don't overwrite" -msgstr "不覆蓋" +msgstr "不覆寫" msgid "Raw image" msgstr "原始影像" @@ -1721,13 +1730,13 @@ msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" msgstr "需要 OpenGL 版本 3.0 或更高版本。目前版本為 %1.%2" msgid "Error initializing OpenGL" -msgstr "初始化 OpenGL 出錯" +msgstr "初始化 OpenGL 錯誤" msgid "\nFalling back to software rendering." -msgstr "\n回退到軟體渲染。" +msgstr "\n退回到軟體渲染。" msgid "

When selecting media images (CD-ROM, floppy, etc.) the open dialog will start in the same directory as the 86Box configuration file. This setting will likely only make a difference on macOS.

" -msgstr "

當選擇媒體影像 (CD-ROM、軟碟等) 時,開啟對話方塊會在與 86Box 組態檔相同的目錄中開始。此設定可能只會在 macOS 上有所影響。

" +msgstr "

當選擇媒體影像 (CD-ROM、軟碟等) 時,開啟對話框會在與 86Box 組態檔相同的目錄中開始。此設定可能只會在 macOS 上有所影響。

" msgid "This machine might have been moved or copied." msgstr "這台機器可能已被移動或複製。" @@ -1852,8 +1861,8 @@ msgstr "3M MicroTouch (序列埠)" msgid "Default Baud rate" msgstr "預設鮑率" -msgid "[COM] Standard Hayes-compliant Modem" -msgstr "[COM] 標準 Hayes 相容的數據機" +msgid "Standard Hayes-compliant Modem" +msgstr "標準 Hayes 相容的數據機" msgid "Roland MT-32 Emulation" msgstr "Roland MT-32 模擬" @@ -1970,7 +1979,7 @@ msgid "BIOS size" msgstr "BIOS 大小" msgid "BIOS size (ROM #1)" -msgstr "BIOS 大小 (ROM )" +msgstr "BIOS 大小 (ROM 1)" msgid "BIOS size (ROM #2)" msgstr "BIOS 大小 (ROM 2)" @@ -2012,7 +2021,7 @@ msgid "MIDI Thru" msgstr "MIDI 輸入直通" msgid "MIDI Clockout" -msgstr "MIDI 時鐘輸出" +msgstr "MIDI 時脈輸出" msgid "Output Gain" msgstr "輸出增益" @@ -2036,19 +2045,19 @@ msgid "Chorus Waveform" msgstr "合唱波形" msgid "Reverb" -msgstr "混響" +msgstr "殘響" msgid "Reverb Room Size" -msgstr "混響室的大小" +msgstr "殘響室的大小" msgid "Reverb Damping" -msgstr "混響阻尼" +msgstr "殘響阻尼" msgid "Reverb Width" -msgstr "混響寬度" +msgstr "殘響寬度" msgid "Reverb Level" -msgstr "混響位準" +msgstr "殘響位準" msgid "Interpolation Method" msgstr "插值方法" @@ -2057,7 +2066,7 @@ msgid "Dynamic Sample Loading" msgstr "動態取樣載入" msgid "Reverb Output Gain" -msgstr "迴響輸出增益" +msgstr "殘響輸出增益" msgid "Reversed stereo" msgstr "左右互換立體聲" @@ -2192,7 +2201,7 @@ msgid "SB low DMA" msgstr "SB 低 DMA" msgid "6CH variant (6-channel)" -msgstr "6CH 變數 (6 通道)" +msgstr "6CH 變體 (6 通道)" msgid "Enable CMS" msgstr "啟用 CMS" @@ -2378,7 +2387,7 @@ msgid "7th Order" msgstr "七階" msgid "Non-timed (original)" -msgstr "非定時 (原始)" +msgstr "無計時 (原始)" msgid "45 Hz (JMP2 not populated)" msgstr "45 Hz (JMP2 未安插)" @@ -2501,7 +2510,7 @@ msgid "Has Quadcolor II daughter board" msgstr "具有 Quadcolor II 子板" msgid "Alternate monochrome contrast" -msgstr "交替單色對比" +msgstr "反轉單色對比" msgid "128 KB" msgstr "128 KB" @@ -2522,10 +2531,10 @@ msgid "Color 80x25 (5153/CGA)" msgstr "彩色 80x25 (5153/CGA)" msgid "Enhanced Color - Normal Mode (5154/ECD)" -msgstr "增強彩色 - 一般模式 (5154/ECD)" +msgstr "增強色彩 - 一般模式 (5154/ECD)" msgid "Enhanced Color - Enhanced Mode (5154/ECD)" -msgstr "增強彩色 - 增強模式 (5154/ECD)" +msgstr "增強色彩 - 增強模式 (5154/ECD)" msgid "Green" msgstr "綠色" @@ -2660,7 +2669,7 @@ msgid "Softfloat FPU" msgstr "Softfloat 浮點運算器模擬" msgid "High performance impact" -msgstr "對效能影響大" +msgstr "對效能影響高" msgid "[Generic] RAM Disk (max. speed)" msgstr "[通用] RAM 磁碟 (最大速度)" @@ -2806,9 +2815,6 @@ msgstr "切換全螢幕" msgid "Toggle UI in fullscreen" msgstr "全螢幕模式下切換使用者介面顯示" -msgid "Screenshot" -msgstr "螢幕畫面擷取" - msgid "Release mouse pointer" msgstr "放開滑鼠游標" @@ -2882,7 +2888,7 @@ msgid "Unable to determine release information" msgstr "無法確定版本發佈資訊" msgid "There was an error checking for updates:\n\n%1\n\nPlease try again later." -msgstr "檢查更新時出錯:\n\n%1\n\n請稍後再試。" +msgstr "檢查更新時錯誤:\n\n%1\n\n請稍後再試。" msgid "Update check complete" msgstr "更新檢查完成" @@ -2930,7 +2936,7 @@ msgid "86Box Update" msgstr "86Box 更新" msgid "Release notes:" -msgstr "版本發佈說明:" +msgstr "版本發佈備註:" msgid "%1 Hz" msgstr "%1 Hz" @@ -2987,7 +2993,7 @@ msgid "OpenGL input stretch mode" msgstr "OpenGL 的輸入延展模式" msgid "Color scheme" -msgstr "配色方案" +msgstr "色彩配置" msgid "Light" msgstr "亮色" @@ -3011,4 +3017,10 @@ msgid "&Allow recompilation" msgstr "允許重編譯(&A)" msgid "&Fast forward" -msgstr "" +msgstr "快轉(&F)" + +msgid "Fast forward" +msgstr "快轉" + +msgid "To change the system directory, stop all running machines." +msgstr "欲變更系統目錄,請先停止全部運行中的機器。" diff --git a/src/qt/qt_deviceconfig.cpp b/src/qt/qt_deviceconfig.cpp index 7cc398988..42d63243d 100644 --- a/src/qt/qt_deviceconfig.cpp +++ b/src/qt/qt_deviceconfig.cpp @@ -492,8 +492,18 @@ DeviceConfig::DeviceName(const _device_ *device, const char *internalName, const else if (device == nullptr) return ""; else { - char temp[512]; - device_get_name(device, bus, temp); - return tr((const char *) temp); + char temp[512]; + const char *tempbus; + if (bus == 1) { + device_get_name(device, -1, temp); + tempbus = device_get_bus_name(device); + if (tempbus != nullptr) + return QString("[%1] %2").arg(tr(tempbus), tr((const char *) temp)); + else + return tr((const char *) temp); + } else { + device_get_name(device, bus, temp); + return tr((const char *) temp); + } } } diff --git a/src/qt/qt_mainwindow.cpp b/src/qt/qt_mainwindow.cpp index 231d49112..229e9f788 100644 --- a/src/qt/qt_mainwindow.cpp +++ b/src/qt/qt_mainwindow.cpp @@ -1018,6 +1018,18 @@ MainWindow::updateShortcuts() seq = QKeySequence::fromString(acc_keys[accID].seq); ui->actionTake_screenshot->setShortcut(seq); + accID = FindAccelerator("raw_screenshot"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionTake_raw_screenshot->setShortcut(seq); + + accID = FindAccelerator("copy_screenshot"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionCopy_screenshot->setShortcut(seq); + + accID = FindAccelerator("copy_raw_screenshot"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionCopy_raw_screenshot->setShortcut(seq); + accID = FindAccelerator("send_ctrl_alt_del"); seq = QKeySequence::fromString(acc_keys[accID].seq); ui->actionCtrl_Alt_Del->setShortcut(seq); @@ -1030,6 +1042,10 @@ MainWindow::updateShortcuts() seq = QKeySequence::fromString(acc_keys[accID].seq); ui->actionHard_Reset->setShortcut(seq); + accID = FindAccelerator("fast_forward"); + seq = QKeySequence::fromString(acc_keys[accID].seq); + ui->actionFast_forward->setShortcut(seq); + accID = FindAccelerator("fullscreen"); seq = QKeySequence::fromString(acc_keys[accID].seq); ui->actionFullscreen->setShortcut(seq); @@ -1550,6 +1566,18 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) || (QKeySequence) (ke->key() | ke->modifiers()) == FindAcceleratorSeq("screenshot")) { ui->actionTake_screenshot->trigger(); } + if ((QKeySequence) (ke->key() | (ke->modifiers() & ~Qt::KeypadModifier)) == FindAcceleratorSeq("raw_screenshot") + || (QKeySequence) (ke->key() | ke->modifiers()) == FindAcceleratorSeq("raw_screenshot")) { + ui->actionTake_raw_screenshot->trigger(); + } + if ((QKeySequence) (ke->key() | (ke->modifiers() & ~Qt::KeypadModifier)) == FindAcceleratorSeq("copy_screenshot") + || (QKeySequence) (ke->key() | ke->modifiers()) == FindAcceleratorSeq("copy_screenshot")) { + ui->actionCopy_screenshot->trigger(); + } + if ((QKeySequence) (ke->key() | (ke->modifiers() & ~Qt::KeypadModifier)) == FindAcceleratorSeq("copy_raw_screenshot") + || (QKeySequence) (ke->key() | ke->modifiers()) == FindAcceleratorSeq("copy_raw_screenshot")) { + ui->actionCopy_raw_screenshot->trigger(); + } if ((QKeySequence) (ke->key() | (ke->modifiers() & ~Qt::KeypadModifier)) == FindAcceleratorSeq("fullscreen") || (QKeySequence) (ke->key() | ke->modifiers()) == FindAcceleratorSeq("fullscreen")) { ui->actionFullscreen->trigger(); @@ -1558,6 +1586,10 @@ MainWindow::eventFilter(QObject *receiver, QEvent *event) || (QKeySequence) (ke->key() | ke->modifiers()) == FindAcceleratorSeq("hard_reset")) { ui->actionHard_Reset->trigger(); } + if ((QKeySequence) (ke->key() | (ke->modifiers() & ~Qt::KeypadModifier)) == FindAcceleratorSeq("fast_forward") + || (QKeySequence) (ke->key() | ke->modifiers()) == FindAcceleratorSeq("fast_forward")) { + ui->actionFast_forward->trigger(); + } if ((QKeySequence) (ke->key() | (ke->modifiers() & ~Qt::KeypadModifier)) == FindAcceleratorSeq("send_ctrl_alt_del") || (QKeySequence) (ke->key() | ke->modifiers()) == FindAcceleratorSeq("send_ctrl_alt_del")) { ui->actionCtrl_Alt_Del->trigger(); diff --git a/src/qt/qt_mainwindow.ui b/src/qt/qt_mainwindow.ui index ec5d245cb..2dead393b 100644 --- a/src/qt/qt_mainwindow.ui +++ b/src/qt/qt_mainwindow.ui @@ -744,6 +744,9 @@ Take s&creenshot + + Take screenshot + :/menuicons/qt/icons/take_screenshot.ico:/menuicons/qt/icons/take_screenshot.ico @@ -753,6 +756,9 @@ Take &raw screenshot + + Take raw screenshot + :/menuicons/qt/icons/take_raw_screenshot.ico:/menuicons/qt/icons/take_raw_screenshot.ico @@ -762,6 +768,9 @@ C&opy screenshot + + Copy screenshot + :/menuicons/qt/icons/copy_screenshot.ico:/menuicons/qt/icons/copy_screenshot.ico @@ -771,6 +780,9 @@ Copy r&aw screenshot + + Copy raw screenshot + :/menuicons/qt/icons/copy_raw_screenshot.ico:/menuicons/qt/icons/copy_raw_screenshot.ico @@ -1082,6 +1094,9 @@ &Fast forward + + Fast forward + diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp index c9defba96..968858dd2 100644 --- a/src/qt/qt_mediamenu.cpp +++ b/src/qt/qt_mediamenu.cpp @@ -596,7 +596,7 @@ MediaMenu::cdromMount(int i, int dir, const QString &arg) else { filename = QFileDialog::getOpenFileName(parentWidget, QString(), QString(), - tr("CD-ROM images") % util::DlgFilter({ "iso", "cue", "mds" }) % tr("All files") % util::DlgFilter({ "*" }, true)); + tr("CD-ROM images") % util::DlgFilter({ "iso", "cue", "mds", "mdx" }) % tr("All files") % util::DlgFilter({ "*" }, true)); } if (filename.isEmpty()) diff --git a/src/qt/qt_openglrenderer.cpp b/src/qt/qt_openglrenderer.cpp index 22e400c65..788a74744 100644 --- a/src/qt/qt_openglrenderer.cpp +++ b/src/qt/qt_openglrenderer.cpp @@ -600,7 +600,7 @@ load_texture(const char *f, struct shader_texture *tex) const GLubyte *rgb = img.constBits(); - int bpp = 4; + int bpp = 3; GLubyte *data = (GLubyte *) malloc((size_t) width * height * bpp); @@ -611,7 +611,6 @@ load_texture(const char *f, struct shader_texture *tex) data[(y * width + x) * bpp + 0] = rgb[(Y * width + x) * 3 + 0]; data[(y * width + x) * bpp + 1] = rgb[(Y * width + x) * 3 + 1]; data[(y * width + x) * bpp + 2] = rgb[(Y * width + x) * 3 + 2]; - data[(y * width + x) * bpp + 3] = rgb[(Y * width + x) * 3 + 3]; } } diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index 9fd16d3f1..3ecff875a 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -752,6 +752,16 @@ plat_chdir(char *path) return QDir::setCurrent(QString(path)) ? 0 : -1; } +#ifdef _WIN32 +void plat_get_system_directory(char *outbuf) +{ + wchar_t wc[512]; + GetSystemWindowsDirectoryW(wc, 512); + QString str = QString::fromWCharArray(wc); + strcpy(outbuf, str.toUtf8()); +} +#endif + void plat_get_global_config_dir(char *outbuf, const size_t len) { diff --git a/src/qt/qt_vmmanager_details.cpp b/src/qt/qt_vmmanager_details.cpp index 396997e7d..40d0fb185 100644 --- a/src/qt/qt_vmmanager_details.cpp +++ b/src/qt/qt_vmmanager_details.cpp @@ -93,21 +93,12 @@ VMManagerDetails::VMManagerDetails(QWidget *parent) // Set the icons for the screenshot navigation buttons ui->screenshotNext->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowRight)); ui->screenshotPrevious->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowLeft)); - ui->screenshotNextTB->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowRight)); - ui->screenshotPreviousTB->setIcon(QApplication::style()->standardIcon(QStyle::SP_ArrowLeft)); // Disabled by default ui->screenshotNext->setEnabled(false); ui->screenshotPrevious->setEnabled(false); - ui->screenshotNextTB->setEnabled(false); - ui->screenshotPreviousTB->setEnabled(false); // Connect their signals - connect(ui->screenshotNext, &QPushButton::clicked, this, &VMManagerDetails::nextScreenshot); - connect(ui->screenshotNextTB, &QToolButton::clicked, this, &VMManagerDetails::nextScreenshot); - connect(ui->screenshotPreviousTB, &QToolButton::clicked, this, &VMManagerDetails::previousScreenshot); - connect(ui->screenshotPrevious, &QPushButton::clicked, this, &VMManagerDetails::previousScreenshot); - // These push buttons can be taken out if the tool buttons stay - ui->screenshotNext->setVisible(false); - ui->screenshotPrevious->setVisible(false); + connect(ui->screenshotNext, &QToolButton::clicked, this, &VMManagerDetails::nextScreenshot); + connect(ui->screenshotPrevious, &QToolButton::clicked, this, &VMManagerDetails::previousScreenshot); QString toolButtonStyleSheet; // Simple method to try and determine if light mode is enabled #ifdef Q_OS_WINDOWS @@ -122,6 +113,13 @@ VMManagerDetails::VMManagerDetails(QWidget *parent) } ui->ssNavTBHolder->setStyleSheet(toolButtonStyleSheet); + // Margins are a little different on macos +#ifdef Q_OS_MACOS + ui->systemLabel->setMargin(15); +#else + ui->systemLabel->setMargin(10); +#endif + pauseIcon = QIcon(":/menuicons/qt/icons/pause.ico"); runIcon = QIcon(":/menuicons/qt/icons/run.ico"); @@ -178,6 +176,59 @@ VMManagerDetails::~VMManagerDetails() delete ui; } +void +VMManagerDetails::reset() +{ + systemSection->clear(); + videoSection->clear(); + storageSection->clear(); + audioSection->clear(); + networkSection->clear(); + inputSection->clear(); + portsSection->clear(); + otherSection->clear(); + systemSection->setSections(); + videoSection->setSections(); + storageSection->setSections(); + audioSection->setSections(); + networkSection->setSections(); + inputSection->setSections(); + portsSection->setSections(); + otherSection->setSections(); + + ui->screenshotNext->setEnabled(false); + ui->screenshotPrevious->setEnabled(false); + ui->screenshot->setPixmap(QString()); + ui->screenshot->setFixedSize(240, 160); + ui->screenshot->setFrameStyle(QFrame::Box | QFrame::Sunken); + ui->screenshot->setText(tr("No screenshot")); + ui->screenshot->setEnabled(false); + ui->screenshot->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); +#ifdef Q_OS_WINDOWS + if (!util::isWindowsLightTheme()) { + ui->screenshot->setStyleSheet(SCREENSHOTBORDER_STYLESHEET_DARK); + } else { + ui->screenshot->setStyleSheet(""); + } +#endif + + startPauseButton->setEnabled(false); + resetButton->setEnabled(false); + stopButton->setEnabled(false); + configureButton->setEnabled(false); + cadButton->setEnabled(false); + + ui->systemLabel->setText(tr("No Machines Found!")); + ui->systemLabel->setStyleSheet(""); + ui->statusLabel->setText(""); + ui->scrollArea->setStyleSheet(""); + + ui->notesTextEdit->setPlainText(""); + ui->notesTextEdit->setEnabled(false); + + sysconfig = new VMManagerSystem(); +} + void VMManagerDetails::updateData(VMManagerSystem *passed_sysconfig) { @@ -191,12 +242,6 @@ VMManagerDetails::updateData(VMManagerSystem *passed_sysconfig) ui->scrollArea->setStyleSheet(SCROLLAREA_STYLESHEET_LIGHT); ui->systemLabel->setStyleSheet(SYSTEMLABEL_STYLESHEET_LIGHT); } - // Margins are a little different on macos -#ifdef Q_OS_MACOS - ui->systemLabel->setMargin(15); -#else - ui->systemLabel->setMargin(10); -#endif // disconnect old signals before assigning the passed systemconfig object disconnect(startPauseButton, &QToolButton::clicked, sysconfig, &VMManagerSystem::startButtonPressed); @@ -328,8 +373,6 @@ VMManagerDetails::updateScreenshots(VMManagerSystem *passed_sysconfig) // Disable screenshot navigation buttons by default ui->screenshotNext->setEnabled(false); ui->screenshotPrevious->setEnabled(false); - ui->screenshotNextTB->setEnabled(false); - ui->screenshotPreviousTB->setEnabled(false); // Different actions are taken depending on the existence and number of screenshots screenshots = passed_sysconfig->getScreenshots(); @@ -339,8 +382,6 @@ VMManagerDetails::updateScreenshots(VMManagerSystem *passed_sysconfig) if (screenshots.size() > 1) { ui->screenshotNext->setEnabled(true); ui->screenshotPrevious->setEnabled(true); - ui->screenshotNextTB->setEnabled(true); - ui->screenshotPreviousTB->setEnabled(true); } #ifdef Q_OS_WINDOWS ui->screenshot->setStyleSheet(""); @@ -353,8 +394,6 @@ VMManagerDetails::updateScreenshots(VMManagerSystem *passed_sysconfig) } else { ui->screenshotNext->setEnabled(false); ui->screenshotPrevious->setEnabled(false); - ui->screenshotNextTB->setEnabled(false); - ui->screenshotPreviousTB->setEnabled(false); ui->screenshot->setPixmap(QString()); ui->screenshot->setFixedSize(240, 160); ui->screenshot->setFrameStyle(QFrame::Box | QFrame::Sunken); diff --git a/src/qt/qt_vmmanager_details.hpp b/src/qt/qt_vmmanager_details.hpp index efd2ec6cd..489f74a25 100644 --- a/src/qt/qt_vmmanager_details.hpp +++ b/src/qt/qt_vmmanager_details.hpp @@ -35,6 +35,8 @@ public: ~VMManagerDetails() override; + void reset(); + void updateData(VMManagerSystem *passed_sysconfig); void updateProcessStatus(); diff --git a/src/qt/qt_vmmanager_details.ui b/src/qt/qt_vmmanager_details.ui index 162fb20ee..0722dd3f5 100644 --- a/src/qt/qt_vmmanager_details.ui +++ b/src/qt/qt_vmmanager_details.ui @@ -146,22 +146,6 @@ - - - - - 0 - 0 - - - - - - - false - - - @@ -178,14 +162,14 @@ 0 - + - + @@ -197,19 +181,6 @@ - - - - - 0 - 0 - - - - - - - diff --git a/src/qt/qt_vmmanager_main.cpp b/src/qt/qt_vmmanager_main.cpp index 25e6e3775..317bd0f2b 100644 --- a/src/qt/qt_vmmanager_main.cpp +++ b/src/qt/qt_vmmanager_main.cpp @@ -98,7 +98,7 @@ VMManagerMain::VMManagerMain(QWidget *parent) connect(ui->listView, &QListView::customContextMenuRequested, [this, parent](const QPoint &pos) { const auto indexAt = ui->listView->indexAt(pos); if (indexAt.isValid()) { - QMenu contextMenu(tr("Context Menu"), ui->listView); + QMenu contextMenu("", ui->listView); QAction startAction(tr("&Start")); contextMenu.addAction(&startAction); @@ -288,6 +288,7 @@ illegal_chars: // Get the index of the newly-created system and select it const QModelIndex mapped_index = proxy_model->mapFromSource(created_object); ui->listView->setCurrentIndex(mapped_index); + modelDataChange(); } else { QDir(dstPath).removeRecursively(); QMessageBox::critical(this, tr("Clone"), tr("Failed to clone VM."), QMessageBox::Ok); @@ -378,7 +379,7 @@ illegal_chars: contextMenu.exec(ui->listView->viewport()->mapToGlobal(pos)); } else { - QMenu contextMenu(tr("Context Menu"), ui->listView); + QMenu contextMenu("", ui->listView); QAction newMachineAction(tr("&New machine…")); contextMenu.addAction(&newMachineAction); @@ -451,6 +452,56 @@ VMManagerMain::~VMManagerMain() delete vm_model; } +void +VMManagerMain::reload() +{ + // Disconnect and save the old selection mdoel to be deleted later + QItemSelectionModel *old_selection_model = ui->listView->selectionModel(); + disconnect(old_selection_model, &QItemSelectionModel::currentChanged, this, &VMManagerMain::currentSelectionChanged); + // Disconnect and delete the model and proxy model + disconnect(vm_model, &VMManagerModel::systemDataChanged, this, &VMManagerMain::modelDataChange); + disconnect(vm_model, &VMManagerModel::globalConfigurationChanged, this, nullptr); + delete proxy_model; + delete vm_model; + + // Reset the details view and toolbar to initial state + selected_sysconfig = new VMManagerSystem(); + vm_details->reset(); + emit selectionOrStateChanged(nullptr); + + // Create the new model and proxy model + vm_model = new VMManagerModel; + proxy_model = new StringListProxyModel(this); + proxy_model->setSourceModel(vm_model); + ui->listView->setModel(proxy_model); + // Delete the old selection model + delete old_selection_model; + + // Set up the new models + proxy_model->setSortCaseSensitivity(Qt::CaseInsensitive); + ui->listView->model()->sort(0, Qt::AscendingOrder); + connect(vm_model, &VMManagerModel::systemDataChanged, this, &VMManagerMain::modelDataChange); + connect(vm_model, &VMManagerModel::globalConfigurationChanged, this, []() { + vmm_main_window->updateSettings(); + }); + const QItemSelectionModel *selection_model = ui->listView->selectionModel(); + connect(selection_model, &QItemSelectionModel::currentChanged, this, &VMManagerMain::currentSelectionChanged); + + // Update the search completer + auto *completerModel = new QStringListModel(getSearchCompletionList(), ui->searchBar->completer()); + ui->searchBar->completer()->setModel(completerModel); + + // If machines are found, set the selection to the first one + if (proxy_model->rowCount(QModelIndex()) > 0) { + const QModelIndex first_index = proxy_model->index(0, 0); + ui->listView->setCurrentIndex(first_index); + emit selectionOrStateChanged(selected_sysconfig); + } + + // Notify the status bar + emit updateStatusRight(machineCountString()); +} + void VMManagerMain::updateGlobalSettings() { @@ -714,6 +765,7 @@ VMManagerMain::addNewSystem(const QString &name, const QString &dir, const QStri const QModelIndex mapped_index = proxy_model->mapFromSource(created_object); ui->listView->setCurrentIndex(mapped_index); delete new_system; + modelDataChange(); }); } @@ -734,12 +786,9 @@ VMManagerMain::deleteSystem(VMManagerSystem *sysconfig) delete sysconfig; if (vm_model->rowCount(QModelIndex()) <= 0) { - selected_sysconfig = new VMManagerSystem(); /* no machines left - get rid of the last machine's leftovers */ - ui->detailsArea->layout()->removeWidget(vm_details); - delete vm_details; - vm_details = new VMManagerDetails(); - ui->detailsArea->layout()->addWidget(vm_details); + selected_sysconfig = new VMManagerSystem(); + vm_details->reset(); /* tell the mainwindow to disable the toolbar buttons */ emit selectionOrStateChanged(nullptr); } diff --git a/src/qt/qt_vmmanager_main.hpp b/src/qt/qt_vmmanager_main.hpp index c8e8822ad..f313fbb04 100644 --- a/src/qt/qt_vmmanager_main.hpp +++ b/src/qt/qt_vmmanager_main.hpp @@ -61,6 +61,7 @@ signals: void updateStatusRight(const QString &text); public slots: + void reload(); void startButtonPressed() const; void settingsButtonPressed(); void restartButtonPressed() const; diff --git a/src/qt/qt_vmmanager_mainwindow.cpp b/src/qt/qt_vmmanager_mainwindow.cpp index 3418519e5..17bd898bd 100644 --- a/src/qt/qt_vmmanager_mainwindow.cpp +++ b/src/qt/qt_vmmanager_mainwindow.cpp @@ -202,10 +202,19 @@ VMManagerMainWindow::vmmStateChanged(const VMManagerSystem *sysconfig) const void VMManagerMainWindow::preferencesTriggered() { - const auto prefs = new VMManagerPreferences(); + bool machinesRunning = (vmm->getActiveMachineCount() > 0); + auto old_vmm_path = QString(vmm_path_cfg); + const auto prefs = new VMManagerPreferences(this, machinesRunning); if (prefs->exec() == QDialog::Accepted) { emit preferencesUpdated(); updateLanguage(); + + auto new_vmm_path = QString(vmm_path_cfg); + if (!machinesRunning && (new_vmm_path != old_vmm_path)) { + qDebug() << "Machine path changed: old path " << old_vmm_path << ", new path " << new_vmm_path; + strncpy(vmm_path, vmm_path_cfg, sizeof(vmm_path)); + vmm->reload(); + } } } @@ -271,7 +280,7 @@ VMManagerMainWindow::closeEvent(QCloseEvent *event) { int running = vmm->getActiveMachineCount(); if (running > 0) { - QMessageBox warningbox(QMessageBox::Icon::Warning, tr("%1 VM Manager").arg(EMU_NAME), tr("%1 machine(s) are currently active. Are you sure you want to exit the VM manager anyway?").arg(running), QMessageBox::Yes | QMessageBox::No, this); + QMessageBox warningbox(QMessageBox::Icon::Warning, tr("%1 VM Manager").arg(EMU_NAME), tr("%n machine(s) are currently active. Are you sure you want to exit the VM manager anyway?", "", running), QMessageBox::Yes | QMessageBox::No, this); warningbox.exec(); if (warningbox.result() == QMessageBox::No) { event->ignore(); diff --git a/src/qt/qt_vmmanager_preferences.cpp b/src/qt/qt_vmmanager_preferences.cpp index 2de133254..df30aec6c 100644 --- a/src/qt/qt_vmmanager_preferences.cpp +++ b/src/qt/qt_vmmanager_preferences.cpp @@ -29,11 +29,12 @@ extern WindowsDarkModeFilter *vmm_dark_mode_filter; extern "C" { #include <86box/86box.h> #include <86box/config.h> +#include <86box/plat.h> #include <86box/version.h> } VMManagerPreferences:: - VMManagerPreferences(QWidget *parent) + VMManagerPreferences(QWidget *parent, bool machinesRunning) : ui(new Ui::VMManagerPreferences) { ui->setupUi(this); @@ -50,6 +51,13 @@ VMManagerPreferences:: ui->systemDirectory->setText(QDir::toNativeSeparators(QDir(vmm_path).path())); } + if (machinesRunning) { + ui->systemDirectory->setEnabled(false); + ui->dirSelectButton->setEnabled(false); + ui->pushButtonDefaultSystemDir->setEnabled(false); + ui->dirSelectButton->setToolTip(tr("To change the system directory, stop all running machines.")); + } + ui->comboBoxLanguage->setItemData(0, 0); for (int i = 1; i < ProgSettings::languages.length(); i++) { ui->comboBoxLanguage->addItem(ProgSettings::languages[i].second, i); @@ -91,6 +99,14 @@ VMManagerPreferences::chooseDirectoryLocation() ui->systemDirectory->setText(QDir::toNativeSeparators(directory)); } +void +VMManagerPreferences::on_pushButtonDefaultSystemDir_released() +{ + char temp[1024]; + plat_get_vmm_dir(temp, sizeof(temp)); + ui->systemDirectory->setText(QDir::toNativeSeparators(QDir(temp).path())); +} + void VMManagerPreferences::on_pushButtonLanguage_released() { diff --git a/src/qt/qt_vmmanager_preferences.hpp b/src/qt/qt_vmmanager_preferences.hpp index 4215eb768..cbb7c5f61 100644 --- a/src/qt/qt_vmmanager_preferences.hpp +++ b/src/qt/qt_vmmanager_preferences.hpp @@ -26,7 +26,7 @@ QT_END_NAMESPACE class VMManagerPreferences final : public QDialog { Q_OBJECT public: - explicit VMManagerPreferences(QWidget *parent = nullptr); + explicit VMManagerPreferences(QWidget *parent = nullptr, bool machinesRunning = false); ~VMManagerPreferences() override; private: @@ -34,6 +34,7 @@ private: QString settingsFile; private slots: void chooseDirectoryLocation(); + void on_pushButtonDefaultSystemDir_released(); void on_pushButtonLanguage_released(); protected: diff --git a/src/qt/qt_vmmanager_preferences.ui b/src/qt/qt_vmmanager_preferences.ui index 7206b79bf..a4d526f8c 100644 --- a/src/qt/qt_vmmanager_preferences.ui +++ b/src/qt/qt_vmmanager_preferences.ui @@ -56,6 +56,36 @@ + + + + 0 + + + 0 + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Default + + + + + @@ -170,6 +200,7 @@ dirSelectButton + pushButtonDefaultSystemDir comboBoxLanguage pushButtonLanguage rememberSizePositionCheckBox diff --git a/src/qt/qt_winrawinputfilter.cpp b/src/qt/qt_winrawinputfilter.cpp index d40f4cdd6..5332cacbb 100644 --- a/src/qt/qt_winrawinputfilter.cpp +++ b/src/qt/qt_winrawinputfilter.cpp @@ -526,13 +526,13 @@ WindowsRawInputFilter::mouse_handle(RAWMOUSE *raw) mouse_set_buttons_ex(b); if (state.usButtonFlags & RI_MOUSE_WHEEL) { - delta_z = (SHORT) state.usButtonData / 120; + delta_z = (SHORT) state.usButtonData; mouse_set_z(delta_z); } else delta_z = 0; if (state.usButtonFlags & RI_MOUSE_HWHEEL) { - delta_w = (SHORT) state.usButtonData / 120; + delta_w = (SHORT) state.usButtonData; mouse_set_w(delta_w); } else delta_w = 0; diff --git a/src/sound/midi_fluidsynth.c b/src/sound/midi_fluidsynth.c index 1afefd905..577c05367 100644 --- a/src/sound/midi_fluidsynth.c +++ b/src/sound/midi_fluidsynth.c @@ -16,6 +16,7 @@ #include <86box/thread.h> #include <86box/sound.h> #include <86box/plat_unused.h> +#include <86box/plat.h> #define RENDER_RATE 100 #define BUFFER_SEGMENTS 10 @@ -154,6 +155,9 @@ fluidsynth_init(UNUSED(const device_t *info)) { fluidsynth_t *data = &fsdev; midi_device_t *dev; +#ifdef _WIN32 + char path[4096] = { 0 }; +#endif memset(data, 0, sizeof(fluidsynth_t)); @@ -170,6 +174,17 @@ fluidsynth_init(UNUSED(const device_t *info)) if (!sound_font || sound_font[0] == 0) sound_font = (access("/usr/share/sounds/sf2/FluidR3_GM.sf2", F_OK) == 0 ? "/usr/share/sounds/sf2/FluidR3_GM.sf2" : (access("/usr/share/soundfonts/default.sf2", F_OK) == 0 ? "/usr/share/soundfonts/default.sf2" : "")); +#elif defined _WIN32 + if (!sound_font || sound_font[0] == 0) { + // FluidSynth 2.5.x and later supports DLS without libinstpatch. + int major, minor, patch; + fluid_version(&major, &minor, &patch); + if ((major == 2 && minor >= 5) || (major >= 3)) { + plat_get_system_directory(path); + strcat(path, "\\system32\\drivers\\gm.dls"); + sound_font = plat_file_check(path) ? path : ""; + } + } #endif data->sound_font = fluid_synth_sfload(data->synth, sound_font, 1); diff --git a/src/sound/snd_cs423x.c b/src/sound/snd_cs423x.c index 4fd630e07..b9004454e 100644 --- a/src/sound/snd_cs423x.c +++ b/src/sound/snd_cs423x.c @@ -1203,7 +1203,7 @@ const device_t cs4236b_device = { }; const device_t cs4236b_onboard_device = { - .name = "Crystal CS4236B", + .name = "Crystal CS4236B (On-Board)", .internal_name = "cs4236b", .flags = DEVICE_ISA16, .local = CRYSTAL_CS4236B | CRYSTAL_NOEEPROM, diff --git a/src/sound/sound.c b/src/sound/sound.c index cbf358327..c7aefc746 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -123,12 +123,10 @@ static const SOUND_CARD sound_cards[] = { { &ess_ess0968_pnp_device }, { &ssi2001_device }, { &mmb_device }, +#ifdef USE_LIBSERIALPORT /*The following devices required LIBSERIALPORT*/ + { &opl2board_device }, +#endif { &pasplus_device }, - { &voicemasterkey_device }, - { &soundmasterplus_device }, - { &soundman_device }, - { &isadacr0_device }, - { &isadacr1_device }, { &sb_1_device }, { &sb_15_device }, { &sb_2_device }, @@ -137,11 +135,13 @@ static const SOUND_CARD sound_cards[] = { { &entertainer_device }, { &pssj_isa_device }, { &tndy_device }, -#ifdef USE_LIBSERIALPORT /*The following devices required LIBSERIALPORT*/ - { &opl2board_device }, -#endif /* ISA/Sidecar */ { &adlib_device }, + { &soundmasterplus_device }, + { &voicemasterkey_device }, + { &isadacr0_device }, + { &isadacr1_device }, + { &soundman_device }, /* ISA16 */ { &acermagic_s20_device }, { &ad1816_device }, diff --git a/src/timer.c b/src/timer.c index 03908890f..34c1e74f5 100644 --- a/src/timer.c +++ b/src/timer.c @@ -8,7 +8,7 @@ #include <86box/nv/vid_nv_rivatimer.h> uint64_t TIMER_USEC; -uint32_t timer_target; +uint64_t timer_target; /*Enabled timers are stored in a linked list, with the first timer to expire at the head.*/ @@ -23,68 +23,55 @@ void timer_enable(pc_timer_t *timer) { pc_timer_t *timer_node = timer_head; - int ret = 0; - - if (!timer_inited || (timer == NULL)) - return; if (timer->flags & TIMER_ENABLED) timer_disable(timer); if (timer->next || timer->prev) - fatal("timer_disable(): Attempting to enable a non-isolated " - "timer incorrectly marked as disabled\n"); + fatal("timer_enable - timer->next\n"); + + timer->flags |= TIMER_ENABLED; /*List currently empty - add to head*/ if (!timer_head) { - timer_head = timer; + timer_head = timer; timer->next = timer->prev = NULL; - timer_target = timer_head->ts.ts32.integer; - ret = 1; - } else if (TIMER_LESS_THAN(timer, timer_head)) { - timer->next = timer_head; - timer->prev = NULL; - timer_head->prev = timer; - timer_head = timer; - timer_target = timer_head->ts.ts32.integer; - ret = 1; - } else if (!timer_head->next) { - timer_head->next = timer; - timer->prev = timer_head; - ret = 1; + timer_target = timer_head->ts_integer; + return; } - if (ret == 0) { - pc_timer_t *prev = timer_head; - timer_node = timer_head->next; + timer_node = timer_head; - while (1) { - /*Timer expires before timer_node. Add to list in front of timer_node*/ - if (TIMER_LESS_THAN(timer, timer_node)) { - timer->next = timer_node; - timer->prev = prev; - timer_node->prev = timer; - prev->next = timer; - ret = 1; - break; + while (1) { + /* + Timer expires before timer_node. + Add to list in front of timer_node + */ + if (TIMER_LESS_THAN(timer, timer_node)) { + timer->next = timer_node; + timer->prev = timer_node->prev; + timer_node->prev = timer; + if (timer->prev) + timer->prev->next = timer; + else { + timer_head = timer; + timer_target = timer_head->ts_integer; } - - /*timer_node is last in the list. Add timer to end of list*/ - if (!timer_node->next) { - timer_node->next = timer; - timer->prev = timer_node; - ret = 1; - break; - } - - prev = timer_node; - timer_node = timer_node->next; + return; } - } - /* Do not mark it as enabled if it has failed every single condition. */ - if (ret == 1) - timer->flags |= TIMER_ENABLED; + /* + timer_node is last in the list. + Add timer to end of list + */ + if (!timer_node->next) { + timer_node->next = timer; + timer->prev = timer_node; + return; + } + + timer_node = timer_node->next; + } } void @@ -93,9 +80,12 @@ timer_disable(pc_timer_t *timer) if (!timer_inited || (timer == NULL) || !(timer->flags & TIMER_ENABLED)) return; - if (!timer->next && !timer->prev && timer != timer_head) + if (!timer->next && !timer->prev && timer != timer_head) { + uint32_t *p = NULL; + *p = 5; /* Crash deliberately. */ fatal("timer_disable(): Attempting to disable an isolated " "non-head timer incorrectly marked as enabled\n"); + } timer->flags &= ~TIMER_ENABLED; timer->in_callback = 0; @@ -109,41 +99,52 @@ timer_disable(pc_timer_t *timer) timer->prev = timer->next = NULL; } +static void +timer_remove_head(void) +{ + if (timer_head) { + pc_timer_t *timer = timer_head; + timer_head = timer->next; + timer_head->prev = NULL; + timer->next = timer->prev = NULL; + timer->flags &= ~TIMER_ENABLED; + } +} + void timer_process(void) { - pc_timer_t *timer; + int num = 0; if (!timer_head) return; while (1) { - timer = timer_head; + pc_timer_t *timer = timer_head; - if (!TIMER_LESS_THAN_VAL(timer, (uint32_t) tsc)) + if (!TIMER_LESS_THAN_VAL(timer, (uint64_t) tsc)) break; - timer_head = timer->next; - if (timer_head) - timer_head->prev = NULL; - - timer->next = timer->prev = NULL; - timer->flags &= ~TIMER_ENABLED; + timer_remove_head(); if (timer->flags & TIMER_SPLIT) timer_advance_ex(timer, 0); /* We're splitting a > 1 s period into - multiple <= 1 s periods. */ + multiple <= 1 s periods. */ else if (timer->callback != NULL) { - /* Make sure it's not NULL, so that we can + /* + Make sure it's not NULL, so that we can have a NULL callback when no operation - is needed. */ + is needed. + */ timer->in_callback = 1; timer->callback(timer->priv); timer->in_callback = 0; } + + num++; } - timer_target = timer_head->ts.ts32.integer; + timer_target = timer_head->ts_integer; } void @@ -200,7 +201,8 @@ timer_stop(pc_timer_t *timer) return; timer->period = 0.0; - timer_disable(timer); + if (timer->flags & TIMER_ENABLED) + timer_disable(timer); timer->flags &= ~TIMER_SPLIT; timer->in_callback = 0; } @@ -277,11 +279,11 @@ timer_set_new_tsc(uint64_t new_tsc) } timer = timer_head; - timer_target = new_tsc + (int32_t)(timer_get_ts_int(timer_head) - (uint32_t)tsc); + timer_target = new_tsc + (int64_t)(timer_get_ts_int(timer_head) - (uint64_t)tsc); while (timer) { - int32_t offset_from_current_tsc = (int32_t)(timer_get_ts_int(timer) - (uint32_t)tsc); - timer->ts.ts32.integer = new_tsc + offset_from_current_tsc; + int64_t offset_from_current_tsc = (int64_t)(timer_get_ts_int(timer) - (uint64_t)tsc); + timer->ts_integer = new_tsc + offset_from_current_tsc; timer = timer->next; } diff --git a/src/unix/unix.c b/src/unix/unix.c index ed16c20c6..50b7f0f98 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -63,7 +63,7 @@ int update_icons; int kbd_req_capture; int hide_status_bar; int hide_tool_bar; -bool fast_forward = false; // Technically unused. +bool fast_forward = false; int fixed_size_x = 640; int fixed_size_y = 480; extern int title_set; @@ -1105,6 +1105,7 @@ unix_executeLine(char *line) "moeject - eject image from MO drive .\n\n" "hardreset - hard reset the emulated system.\n" "pause - pause the the emulated system.\n" + "fastfwd - toggle fast forward.\n" "screenshot - save a screenshot.\n" "fullscreen - toggle fullscreen.\n" "version - print version and license information.\n" @@ -1154,6 +1155,9 @@ unix_executeLine(char *line) } else if (strncasecmp(xargv[0], "pause", 5) == 0) { plat_pause(dopause ^ 1); printf("%s", dopause ? "Paused.\n" : "Unpaused.\n"); + } else if (strncasecmp(xargv[0], "fastfwd", 7) == 0) { + fast_forward ^= 1; + printf("%s", fast_forward ? "Fast forward on.\n" : "Fast forward off.\n"); } else if (strncasecmp(xargv[0], "hardreset", 9) == 0) { pc_reset_hard(); } else if (strncasecmp(xargv[0], "cdload", 6) == 0 && cmdargc >= 3) { diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt index bcbc7aafd..27be335af 100644 --- a/src/utils/CMakeLists.txt +++ b/src/utils/CMakeLists.txt @@ -16,6 +16,8 @@ # add_library(utils OBJECT + + # Core cJSON.c crc.c crc32.c @@ -24,4 +26,12 @@ add_library(utils OBJECT ini.c log.c random.c + +) + +add_library(mdsx_dll OBJECT + + # MDSX DLL Core + mdsx_dll.c + ) diff --git a/src/utils/defines.h b/src/utils/defines.h new file mode 100644 index 000000000..fb8f5c79c --- /dev/null +++ b/src/utils/defines.h @@ -0,0 +1,13 @@ +#ifndef DEFINES_H +#define DEFINES_H + +#include + +typedef uint64_t u64; +typedef int64_t s64; +typedef uint32_t u32; +typedef int32_t s32; +typedef uint8_t u8; +typedef int BOOL; + +#endif diff --git a/src/utils/mds.h b/src/utils/mds.h new file mode 100644 index 000000000..eb1a0beb7 --- /dev/null +++ b/src/utils/mds.h @@ -0,0 +1,284 @@ +#ifndef MDS_H +#define MDS_H + +#include +#include +#include + +#include "defines.h" +// #include "common/crypto.h" + +#if defined( AES_VAR ) || defined( AES_256 ) +#define KS_LENGTH 60 +#elif defined( AES_192 ) +#define KS_LENGTH 52 +#else +#define KS_LENGTH 44 +#endif + +#define AES_RETURN int +#define TC_LARGEST_COMPILER_UINT uint64_t + +#define u16 uint16_t + +typedef union +{ + uint32_t l; + uint8_t b[4]; +} aes_inf; + +typedef struct +{ + uint32_t ks[KS_LENGTH]; + aes_inf inf; +} aes_encrypt_ctx; + +typedef struct +{ + uint32_t ks[KS_LENGTH]; + aes_inf inf; +} aes_decrypt_ctx; + +#ifndef u4byte +#define u4byte uint32_t +#endif + +typedef struct +{ + u4byte l_key[40]; + u4byte s_key[4]; +#if !defined (TC_MINIMIZE_CODE_SIZE) || defined (TC_WINDOWS_BOOT_TWOFISH) + u4byte mk_tab[4 * 256]; +#endif + u4byte k_len; +} TwofishInstance; + +#define AES_KS (sizeof(aes_encrypt_ctx) + sizeof(aes_decrypt_ctx)) +#define SERPENT_KS (140 * 4) +#define TWOFISH_KS sizeof(TwofishInstance) +#define MAX_EXPANDED_KEY (AES_KS + SERPENT_KS + TWOFISH_KS) +#define MASTER_KEYDATA_SIZE 256 +#define PKCS5_SALT_SIZE 64 +/* Encryption block length */ +#define CBLK_LEN 16 +#define CBLK_LEN8 8 + +typedef struct +{ + /* Union not used to support faster mounting */ + uint32_t gf_t128[CBLK_LEN * 2 / 2][16][CBLK_LEN / 4]; + uint32_t gf_t64[CBLK_LEN8 * 2][16][CBLK_LEN8 / 4]; +} GfCtx; + +typedef struct CRYPTO_INFO_t +{ + int ea; + int mode; + uint8_t ks[MAX_EXPANDED_KEY]; + uint8_t ks2[MAX_EXPANDED_KEY]; + + GfCtx gf_ctx; + + uint8_t master_keydata[MASTER_KEYDATA_SIZE]; + uint8_t k2[MASTER_KEYDATA_SIZE]; + uint8_t salt[PKCS5_SALT_SIZE]; + int noIterations; + int pkcs5; +} CRYPTO_INFO, *PCRYPTO_INFO; + +typedef struct Decoder_t +{ + u8 dg[32]; + GfCtx gf_ctx; + aes_encrypt_ctx encr; + aes_decrypt_ctx decr; + u8 bsize; + + int mode; + int ctr; +} Decoder; + + + +enum TRACK_TYPE +{ + TRK_T_MAINTENANCE = 0, + TRK_T_AUDIO = 1, + TRK_T_MODE1 = 2, + TRK_T_MODE2 = 3, + TRK_T_MODE2_FORM1 = 4, + TRK_T_MODE2_FORM2 = 5 +}; + +enum TRACK_FLAG +{ + TRK_F_TYPE_MASK = 7, + TRK_F_EDC = 8, + TRK_F_10 = 0x10, + TRK_F_HEADER = 0x20, + TRK_F_SUBHEADER = 0x40, + TRK_F_SYNC = 0x80 +}; + + +typedef struct __attribute__((packed)) +{ + u32 f0; + u32 f1; + u64 f3; //or two u32? +} UNK4; + +typedef struct __attribute__((packed)) +{ + char signature[16]; + u8 major; // 0x10 + u8 minor; + u16 medium_type; // 0x12 + u16 num_sessions; // 0x14 + u16 _unk1_; + u16 _unk2_size_; // 0x18 + u16 bca_len; + u16 _unk3_size_; // 0x1c + u16 _unk4_size_; // 0x1e + u32 _unk2_offset_; // 0x20 + u32 bca_data_offset; // 0x24 + u32 _unk3_offset_; // 0x28 + u32 _unk4_offset_; // 0x2c 0x10 byte elements UNK4 + u8 _unk5_; // 0x30 + u32 _unk6_; // 0x31 + u8 _unk7_; // 0x35 + u64 _unk8_; // 0x36 + u16 _unk9_; // 0x3e + u32 disc_structures_offset; // 0x40 + u32 _unk10_offset_; // 0x44 + u16 _unk10_size_; // 0x48 + u8 _dummy1_[6]; // 0x4a not used by DT + u32 sessions_blocks_offset; // 0x50 + u32 dpm_blocks_offset; // 0x54 + u32 encryption_block_offset; // 0x58 + u8 _dummy2_[4]; // 0x5c +} MDX_Header; // 0x60 + +typedef struct __attribute__((packed)) +{ + u64 session_start; + u16 session_number; // 0x8 + u8 num_all_blocks; // 0xa + u8 num_nontrack_blocks; // 0xb + u16 first_track; // 0xc + u16 last_track; // 0xe + u32 _dummy_; // 0x10 + u32 tracks_blocks_offset; // 0x14 + u64 session_end; // 0x18 +} MDX_SessionBlock; // 0x20 + +typedef struct __attribute__((packed)) +{ + u8 mode; + u8 subchannel; + u8 adr_ctl; + u8 tno; + u8 point; // 4 + u8 min; + u8 sec; + u8 frame; + u8 zero; // 8 + u8 pmin; + u8 psec; + u8 pframe; + u32 extra_offset; // 0xc + u16 file_block_size; // 0x10 original name. represent full size of data and additional data per sector + u8 _unk1_; // 0x12 + u8 _dummy1_[5]; // 0x13 + u32 _unk2_; // 0x18; + u32 _unk3_; // 0x1c; + u32 _unk4_; // 0x20; + u32 start_sector; // 0x24 + u64 start_offset; // 0x28 + u32 footer_count; // 0x30 + u32 footer_offset; // 0x34 + u64 start_sector64; // 0x38 major >= 2 + u64 track_size64; // 0x40 major >= 2 + u8 _dummy2_[8]; // 0x48 +} MDX_TrackBlock; // 0x50 + +typedef struct __attribute__((packed)) +{ + u32 filename_offset; + u8 flags; // 4 + u8 _dummy1_; // 5 + u16 _unk1_size_; // 6 + u32 _unk2_size_; // 8 + u32 blocks_in_compression_group; // c major >= 2 + u64 track_data_length; // 10 major >= 2 + u64 compress_table_offset; // 18 +} MDX_Footer; // 0x20 + + + + +// decode.c +#if 0 +void DecryptBlock(u8 *buf, TC_LARGEST_COMPILER_UINT len, u32 secSz, u64 secN, u8 flags, PCRYPTO_INFO cryptoInfo); + +int decode1(u8 *data, const char *pass, PCRYPTO_INFO *ci); + +void decryptMdxData(Decoder *ctx, u8 *buffer, u32 length, u64 blockSize, u64 blockIndex); +#else +#ifdef _WIN32 +# define MDSXDLLAPI __stdcall +#else +# define MDSXDLLAPI +#endif + +extern void(MDSXDLLAPI *DecryptBlock)(u8 *buf, TC_LARGEST_COMPILER_UINT len, u32 secSz, u64 secN, u8 flags, PCRYPTO_INFO cryptoInfo); +extern int(MDSXDLLAPI *decode1)(u8 *data, const char *pass, PCRYPTO_INFO *ci); +extern void(MDSXDLLAPI *decryptMdxData)(Decoder *ctx, u8 *buffer, u32 length, u64 blockSize, u64 blockIndex); +extern int(MDSXDLLAPI *Gf128Tab64Init)(uint8_t *a, GfCtx *ctx); +extern AES_RETURN(MDSXDLLAPI *aes_encrypt_key)(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]); +extern AES_RETURN(MDSXDLLAPI *aes_decrypt_key)(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]); + +extern void mdsx_close(void); +extern int mdsx_init(void); +#endif + + +// utils.c +inline static u64 getU64(const void *mem) +{ + const u8 *mem8 = (const u8 *)mem; + return ((u64)mem8[0] | ((u64)mem8[1] << 8) | ((u64)mem8[2] << 16) | ((u64)mem8[3] << 24) | ((u64)mem8[4] << 32) | ((u64)mem8[5] << 40) | ((u64)mem8[6] << 48) | ((u64)mem8[7] << 56)); +} + +inline static u32 getU32(const void *mem) +{ + const u8 *mem8 = (const u8 *)mem; + return ((u32)mem8[0] | ((u32)mem8[1] << 8) | ((u32)mem8[2] << 16) | ((u32)mem8[3] << 24)); +} + +inline static u16 getU16(const void *mem) +{ + const u8 *mem8 = (const u8 *)mem; + return ((u16)mem8[0] | ((u16)mem8[1] << 8)); +} + +inline static u8 getU8(const void *mem) +{ + const u8 *mem8 = (const u8 *)mem; + return (u8)mem8[0]; +} + +inline static void setU32(void *mem, u32 val) +{ + u8 *mem8 = (u8 *)mem; + mem8[0] = val & 0xff; + mem8[1] = (val >> 8) & 0xff; + mem8[2] = (val >> 16) & 0xff; + mem8[3] = (val >> 24) & 0xff; +} + +u32 freadU32(FILE *f); +u64 freadU64(FILE *f); +void printHex(void *data, int num); + +#endif diff --git a/src/utils/mdsx_dll.c b/src/utils/mdsx_dll.c new file mode 100644 index 000000000..87beff441 --- /dev/null +++ b/src/utils/mdsx_dll.c @@ -0,0 +1,90 @@ +/* + * 86Box A hypervisor and IBM PC system emulator that specializes in + * running old operating systems and software designed for IBM + * PC systems and compatibles from 1981 through fairly recent + * system designs based on the PCI bus. + * + * This file is part of the 86Box distribution. + * + * Implementation of a generic PostScript printer and a + * generic PCL 5e printer. + * + * Authors: David Hrdlička, + * Cacodemon345 + * + * Copyright 2019 David Hrdlička. + * Copyright 2024 Cacodemon345. + */ +#include +#include +#include +#include +#include +#include +#include +#include <86box/86box.h> +#include <86box/device.h> +#include <86box/timer.h> +#include <86box/device.h> +#include <86box/lpt.h> +#include <86box/pit.h> +#include <86box/path.h> +#include <86box/plat.h> +#include <86box/plat_dynld.h> +#include <86box/ui.h> +#include <86box/prt_devs.h> +#include "cpu.h" +#include "defines.h" +#include "mds.h" + +#ifdef _WIN32 +# define PATH_MDSX_DLL "mdsx.dll" +#elif defined __APPLE__ +# define PATH_MDSX_DLL "mdsx.dylib" +#else +# define PATH_MDSX_DLL "mdsx.so" +#endif + +void(MDSXDLLAPI *DecryptBlock)(u8 *buf, TC_LARGEST_COMPILER_UINT len, u32 secSz, u64 secN, u8 flags, PCRYPTO_INFO cryptoInfo); +int(MDSXDLLAPI *decode1)(u8 *data, const char *pass, PCRYPTO_INFO *ci); +void(MDSXDLLAPI *decryptMdxData)(Decoder *ctx, u8 *buffer, u32 length, u64 blockSize, u64 blockIndex); +int(MDSXDLLAPI *Gf128Tab64Init)(uint8_t *a, GfCtx *ctx); +AES_RETURN(MDSXDLLAPI *aes_encrypt_key)(const unsigned char *key, int key_len, aes_encrypt_ctx cx[1]); +AES_RETURN(MDSXDLLAPI *aes_decrypt_key)(const unsigned char *key, int key_len, aes_decrypt_ctx cx[1]); + +static dllimp_t mdsx_imports[] = { + // clang-format off + { "DecryptBlock", &DecryptBlock }, + { "decode1", &decode1 }, + { "decryptMdxData", &decryptMdxData }, + { "Gf128Tab64Init", &Gf128Tab64Init }, + { "aes_encrypt_key", &aes_encrypt_key }, + { "aes_decrypt_key", &aes_decrypt_key }, + { NULL, NULL } + // clang-format on +}; + +static void *mdsx_handle = NULL; + +void +mdsx_close(void) +{ + if (mdsx_handle != NULL) { + dynld_close(mdsx_handle); + mdsx_handle = NULL; + } +} + +int +mdsx_init(void) +{ + /* Try loading the DLL. */ + mdsx_handle = dynld_module(PATH_MDSX_DLL, mdsx_imports); + + if (mdsx_handle == NULL) { + warning("Unable to load %s\n", PATH_MDSX_DLL); + return 0; + } + + return 1; +} diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 70b360c1e..6a6b0723d 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -838,7 +838,7 @@ const device_t ati28800k_device = { }; const device_t ati28800k_spc4620p_device = { - .name = "ATI Korean VGA On-Board SPC-4620P", + .name = "ATI Korean VGA On-Board (Samsung SPC-4620P)", .internal_name = "ati28800k_spc4620p", .flags = DEVICE_ISA, .local = 1, @@ -852,7 +852,7 @@ const device_t ati28800k_spc4620p_device = { }; const device_t ati28800k_spc6033p_device = { - .name = "ATI Korean VGA On-Board SPC-6033P", + .name = "ATI Korean VGA On-Board (Samsung SPC-6033P)", .internal_name = "ati28800k_spc6033p", .flags = DEVICE_ISA, .local = 2, diff --git a/src/video/vid_ati_mach64.c b/src/video/vid_ati_mach64.c index 4cecf6cf4..ceaf4224b 100644 --- a/src/video/vid_ati_mach64.c +++ b/src/video/vid_ati_mach64.c @@ -5809,7 +5809,7 @@ const device_t mach64vt2_device = { }; const device_t mach64vt3_onboard_device = { - .name = "ATI Mach64VT3 (Onboard)", + .name = "ATI Mach64VT3 (On-Board)", .internal_name = "mach64vt3_onboard", .flags = DEVICE_PCI, .local = MACH64_VT3 | (1 << 19), diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index f4c93e9c4..65c85480a 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -239,9 +239,13 @@ cga_recalctimings(cga_t *cga) if (cga->cgamode & CGA_MODE_FLAG_HIGHRES) { disptime = (double) (cga->crtc[CGA_CRTC_HTOTAL] + 1); _dispontime = (double) cga->crtc[CGA_CRTC_HDISP]; + if (_dispontime >= disptime) + _dispontime = disptime - 1; } else { disptime = (double) ((cga->crtc[CGA_CRTC_HTOTAL] + 1) << 1); _dispontime = (double) (cga->crtc[CGA_CRTC_HDISP] << 1); + if (_dispontime >= disptime) + _dispontime = disptime - 2; } _dispofftime = disptime - _dispontime; _dispontime = _dispontime * CGACONST; diff --git a/src/video/vid_cga_olivetti.c b/src/video/vid_cga_olivetti.c index bd565c0d7..0279621a1 100644 --- a/src/video/vid_cga_olivetti.c +++ b/src/video/vid_cga_olivetti.c @@ -664,7 +664,7 @@ const device_config_t ogc_m24_config[] = { }; const device_t ogc_m24_device = { - .name = "Olivetti M21/M24/M28 (GO317/318/380/709) video card", + .name = "Olivetti M21/M24/M28 (GO317/318/380/709)", .internal_name = "ogc_m24", .flags = DEVICE_ISA, .local = 0, diff --git a/src/video/vid_cl54xx.c b/src/video/vid_cl54xx.c index 95f9e7bf6..4161e223e 100644 --- a/src/video/vid_cl54xx.c +++ b/src/video/vid_cl54xx.c @@ -768,6 +768,8 @@ gd54xx_out(uint16_t addr, uint8_t val, void *priv) svga->seqregs[6] = 0x0f; if (svga->crtc[0x27] < CIRRUS_ID_CLGD5429) gd54xx->unlocked = (svga->seqregs[6] == 0x12); + else + gd54xx->unlocked = 1; break; case 0x08: if (gd54xx->i2c) @@ -1643,6 +1645,10 @@ gd54xx_in(uint16_t addr, void *priv) case 0x24: /*Attribute controller toggle readback (R)*/ ret = svga->attrff << 7; break; + case 0x25: /* Part ID */ + if (svga->crtc[0x27] == CIRRUS_ID_CLGD5434) + ret = 0xb0; + break; case 0x26: /*Attribute controller index readback (R)*/ ret = svga->attraddr & 0x3f; break; diff --git a/src/video/vid_genius.c b/src/video/vid_genius.c index 5dd3d2ade..0289e1104 100644 --- a/src/video/vid_genius.c +++ b/src/video/vid_genius.c @@ -329,12 +329,13 @@ genius_recalctimings(genius_t *genius) double disptime; double _dispontime; double _dispofftime; + double crtcconst = (cpuclock / 53216000.0 * (double) (1ULL << 32)) * 9.0; - disptime = 0x31; - _dispontime = 0x28; + disptime = 0x62; + _dispontime = 0x50; _dispofftime = disptime - _dispontime; - _dispontime *= MDACONST; - _dispofftime *= MDACONST; + _dispontime *= crtcconst; + _dispofftime *= crtcconst; genius->dispontime = (uint64_t) (_dispontime); genius->dispofftime = (uint64_t) (_dispofftime); } diff --git a/src/video/vid_ht216.c b/src/video/vid_ht216.c index 42a337674..45f8766ef 100644 --- a/src/video/vid_ht216.c +++ b/src/video/vid_ht216.c @@ -1917,7 +1917,7 @@ const device_t v7_vga_1024i_device = { }; const device_t ht216_32_pb410a_device = { - .name = "Headland HT216-32 (Packard Bell PB410A)", + .name = "Headland HT216-32 On-Board (Packard Bell PB410A)", .internal_name = "ht216_32_pb410a", .flags = DEVICE_VLB, .local = 0x7861, /*HT216-32*/ diff --git a/src/video/vid_jega.c b/src/video/vid_jega.c index 8a34b9f61..5f38df23c 100644 --- a/src/video/vid_jega.c +++ b/src/video/vid_jega.c @@ -1042,7 +1042,7 @@ if386jega_available(void) } const device_t if386jega_device = { - .name = "JEGA (if386AX)", + .name = "JEGA On-Board (OKI if386AX30L)", .internal_name = "if386jega", .flags = DEVICE_ISA, .local = 0, diff --git a/src/video/vid_oak_oti.c b/src/video/vid_oak_oti.c index d8e3a89e4..e2ef1fbbb 100644 --- a/src/video/vid_oak_oti.c +++ b/src/video/vid_oak_oti.c @@ -702,7 +702,7 @@ const device_t oti037c_device = { }; const device_t oti037_pbl300sx_device = { - .name = "Oak OTI-037 (Packard Bell Legend 300SX)", + .name = "Oak OTI-037 On-Board (Packard Bell PB300/PB320)", .internal_name = "oti037_pbl300sx", .flags = DEVICE_ISA, .local = 1, @@ -730,7 +730,7 @@ const device_t oti067_device = { }; const device_t oti067_ama932j_device = { - .name = "Oak OTI-067 (AMA-932J)", + .name = "Oak OTI-067 On-Board (Arche AMA-932J)", .internal_name = "oti067_ama932j", .flags = DEVICE_ISA, .local = 3, @@ -744,7 +744,7 @@ const device_t oti067_ama932j_device = { }; const device_t oti067_m300_device = { - .name = "Oak OTI-067 (Olivetti M300-08/15)", + .name = "Oak OTI-067 On-Board (Olivetti M300-08/15)", .internal_name = "oti067_m300", .flags = DEVICE_ISA, .local = 4, @@ -772,7 +772,7 @@ const device_t oti077_device = { }; const device_t oti077_acer100t_device = { - .name = "Oak OTI-077 (Acer 100T)", + .name = "Oak OTI-077 On-Board (Acer 100T)", .internal_name = "oti077_acer100t", .flags = DEVICE_ISA, .local = 6, @@ -785,7 +785,7 @@ const device_t oti077_acer100t_device = { .config = oti077_acer100t_config }; const device_t oti077_pcs44c_device = { - .name = "Oak OTI-077 (Olivetti PCS 44/C)", + .name = "Oak OTI-077 On-Board (Olivetti PCS 44/C)", .internal_name = "oti077_pcs44c", .flags = DEVICE_ISA, .local = 7, diff --git a/src/video/vid_paradise.c b/src/video/vid_paradise.c index 4d8442d7a..8d178dbd5 100644 --- a/src/video/vid_paradise.c +++ b/src/video/vid_paradise.c @@ -964,7 +964,7 @@ paradise_force_redraw(void *priv) } const device_t paradise_pvga1a_pc2086_device = { - .name = "Paradise PVGA1A (Amstrad PC2086)", + .name = "Paradise PVGA1A On-Board (Amstrad PC2086)", .internal_name = "pvga1a_pc2086", .flags = 0, .local = PVGA1A, @@ -978,7 +978,7 @@ const device_t paradise_pvga1a_pc2086_device = { }; const device_t paradise_pvga1a_pc3086_device = { - .name = "Paradise PVGA1A (Amstrad PC3086)", + .name = "Paradise PVGA1A On-Board (Amstrad PC3086)", .internal_name = "pvga1a_pc3086", .flags = 0, .local = PVGA1A, @@ -1013,7 +1013,7 @@ static const device_config_t paradise_pvga1a_config[] = { }; const device_t paradise_pvga1a_ncr3302_device = { - .name = "Paradise PVGA1A (NCR 3302)", + .name = "Paradise PVGA1A On-Board (NCR 3302)", .internal_name = "pvga1a_ncr3302", .flags = 0, .local = PVGA1A, @@ -1041,7 +1041,7 @@ const device_t paradise_pvga1a_device = { }; const device_t paradise_wd90c11_megapc_device = { - .name = "Paradise WD90C11 (Amstrad MegaPC)", + .name = "Paradise WD90C11 On-Board (Amstrad MegaPC)", .internal_name = "wd90c11_megapc", .flags = 0, .local = WD90C11, diff --git a/src/video/vid_tandy.c b/src/video/vid_tandy.c index 0130fb7be..741719cd0 100644 --- a/src/video/vid_tandy.c +++ b/src/video/vid_tandy.c @@ -1029,7 +1029,7 @@ const device_config_t sl_vid_config[] = { }; const device_t tandy_1000_video_device = { - .name = "Tandy 1000", + .name = "Tandy 1000 SX (Video)", .internal_name = "tandy1000_video", .flags = 0, .local = 0, @@ -1043,7 +1043,7 @@ const device_t tandy_1000_video_device = { }; const device_t tandy_1000hx_video_device = { - .name = "Tandy 1000 HX", + .name = "Tandy 1000 HX (Video)", .internal_name = "tandy1000_hx_video", .flags = 0, .local = 0, @@ -1057,7 +1057,7 @@ const device_t tandy_1000hx_video_device = { }; const device_t tandy_1000sl_video_device = { - .name = "Tandy 1000SL2", + .name = "Tandy 1000SL2 (Video)", .internal_name = "tandy1000_sl_video", .flags = 0, .local = 1, diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 6920ece5c..72a57e66c 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -73,6 +74,66 @@ voodoo_log(const char *fmt, ...) # define voodoo_log(fmt, ...) #endif +static int +voodoo_env_is_disabled(const char *value) +{ + /* Accept common "off" values for env overrides. */ + return !strcmp(value, "0") || !strcmp(value, "off") || !strcmp(value, "false") || !strcmp(value, "disabled"); +} + +static void +voodoo_init_relax_settings(voodoo_t *voodoo) +{ + const char *relax_env = getenv("VOODOO_LFB_RELAX"); + const char *wait_env = getenv("VOODOO_WAIT_STATS"); + int relax_enabled = 1; + + /* Default to front-sync relax mode; wait stats are opt-in. */ + if (!relax_env || !*relax_env) { + relax_env = "4"; + } else if (voodoo_env_is_disabled(relax_env)) { + relax_enabled = 0; + } + + voodoo->wait_stats_explicit = (wait_env && *wait_env); + voodoo->wait_stats_enabled = voodoo->wait_stats_explicit && !voodoo_env_is_disabled(wait_env); + + voodoo->lfb_relax_enabled = relax_enabled; + voodoo->lfb_relax_full = relax_enabled && (strcmp(relax_env, "full") == 0); + voodoo->lfb_relax_ignore_cmdfifo = relax_enabled && (!strcmp(relax_env, "nocmdfifo") || !strcmp(relax_env, "2") || !strcmp(relax_env, "3") || !strcmp(relax_env, "4") || !strcmp(relax_env, "frontsync")); + voodoo->lfb_relax_ignore_draw = relax_enabled && (!strcmp(relax_env, "nodraw") || !strcmp(relax_env, "2") || !strcmp(relax_env, "3") || !strcmp(relax_env, "4") || !strcmp(relax_env, "frontsync")); + voodoo->lfb_relax_ignore_fb_writes = relax_enabled && (!strcmp(relax_env, "nowrites") || !strcmp(relax_env, "3") || !strcmp(relax_env, "4") || !strcmp(relax_env, "frontsync")); + voodoo->lfb_relax_front_sync = relax_enabled && (!strcmp(relax_env, "4") || !strcmp(relax_env, "frontsync")); +} + +static void +voodoo_update_queued_buffers(voodoo_t *voodoo) +{ + switch (voodoo->queued_lfbMode & LFB_WRITE_MASK) { + case LFB_WRITE_FRONT: + voodoo->queued_fb_write_buffer = voodoo->queued_disp_buffer; + break; + case LFB_WRITE_BACK: + voodoo->queued_fb_write_buffer = voodoo->queued_draw_buffer; + break; + default: + voodoo->queued_fb_write_buffer = voodoo->queued_disp_buffer; + break; + } + + switch (voodoo->queued_fbzMode & FBZ_DRAW_MASK) { + case FBZ_DRAW_FRONT: + voodoo->queued_fb_draw_buffer = voodoo->queued_disp_buffer; + break; + case FBZ_DRAW_BACK: + voodoo->queued_fb_draw_buffer = voodoo->queued_draw_buffer; + break; + default: + voodoo->queued_fb_draw_buffer = voodoo->queued_draw_buffer; + break; + } +} + void voodoo_recalc(voodoo_t *voodoo) { @@ -167,11 +228,69 @@ voodoo_readw(uint32_t addr, void *priv) voodoo = set->voodoos[0]; } - voodoo->flush = 1; - while (!FIFO_EMPTY) - voodoo_wake_fifo_thread_now(voodoo); - voodoo_wait_for_render_thread_idle(voodoo); - voodoo->flush = 0; + /* Reads from aux/draw/write regions must see completed rendering. */ + int need_sync = (voodoo->fb_read_offset == voodoo->params.aux_offset) || + (voodoo->fb_read_offset == voodoo->params.draw_offset) || + (voodoo->fb_read_offset == voodoo->fb_write_offset); + int do_sync = 0; + int read_buf = -1; + + if (voodoo->fb_read_offset == voodoo->params.front_offset) + read_buf = VOODOO_BUF_FRONT; + else if (voodoo->fb_read_offset == voodoo->back_offset) + read_buf = VOODOO_BUF_BACK; + else if (voodoo->fb_read_offset == voodoo->params.aux_offset) + read_buf = VOODOO_BUF_AUX; + + if (!need_sync && voodoo->lfb_relax_front_sync && read_buf >= 0 && read_buf != VOODOO_BUF_BACK) + need_sync = 1; + + if (need_sync) { + if (!voodoo->lfb_relax_enabled) + do_sync = 1; + else if (voodoo->lfb_relax_full) + do_sync = 0; + else { + /* In relax mode, only back-buffer reads can skip the full FIFO flush. */ + int pending_buf = 0; + int pending_unknown = 0; + + if (read_buf >= 0 && read_buf < VOODOO_BUF_COUNT) { + if (!voodoo->lfb_relax_ignore_fb_writes) + pending_buf += voodoo->pending_fb_writes_buf[read_buf]; + if (!voodoo->lfb_relax_ignore_draw) + pending_buf += voodoo->pending_draw_cmds_buf[read_buf]; + } + + if (!voodoo->lfb_relax_ignore_fb_writes) + pending_unknown += voodoo->pending_fb_writes_buf[VOODOO_BUF_UNKNOWN]; + if (!voodoo->lfb_relax_ignore_draw) + pending_unknown += voodoo->pending_draw_cmds_buf[VOODOO_BUF_UNKNOWN]; + if (!voodoo->lfb_relax_ignore_cmdfifo) { + if ((voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr) || voodoo->cmdfifo_in_sub) + pending_unknown++; + if ((voodoo->cmdfifo_depth_rd_2 != voodoo->cmdfifo_depth_wr_2) || voodoo->cmdfifo_in_sub_2) + pending_unknown++; + } + + if (read_buf != VOODOO_BUF_BACK) + do_sync = 1; + else + do_sync = (pending_buf || pending_unknown); + } + + if (do_sync) { + voodoo->flush = 1; + while (!FIFO_EMPTY) { + voodoo_wake_fifo_thread_now(voodoo); + thread_wait_event(voodoo->fifo_empty_event, -1); + } + voodoo_wait_for_render_thread_idle(voodoo); + voodoo->flush = 0; + } else if (voodoo->lfb_relax_enabled && !voodoo->lfb_relax_full) { + voodoo_wait_for_render_thread_idle(voodoo); + } + } return voodoo_fb_readw(addr, voodoo); } @@ -191,8 +310,17 @@ voodoo_readl(uint32_t addr, void *priv) cycles -= voodoo->read_time; if (addr & 0x800000) { /*Texture*/ + if (voodoo->wait_stats_enabled) + voodoo->readl_tex_count++; } else if (addr & 0x400000) /*Framebuffer*/ { + uint64_t fifo_wait_start = 0; + uint64_t fifo_wait_spins = 0; + int fifo_wait_active = 0; + int need_sync = 0; + int do_sync = 0; + int read_buf = -1; + if (SLI_ENABLED) { const voodoo_set_t *set = voodoo->set; int y = (addr >> 11) & 0x3ff; @@ -203,23 +331,116 @@ voodoo_readl(uint32_t addr, void *priv) voodoo = set->voodoos[0]; } - voodoo->flush = 1; - while (!FIFO_EMPTY) { - voodoo_wake_fifo_thread_now(voodoo); - thread_wait_event(voodoo->fifo_not_full_event, 1); + if (voodoo->wait_stats_enabled) + voodoo->readl_fb_count++; + + if (voodoo->fb_read_offset == voodoo->params.front_offset) + read_buf = VOODOO_BUF_FRONT; + else if (voodoo->fb_read_offset == voodoo->back_offset) + read_buf = VOODOO_BUF_BACK; + else if (voodoo->fb_read_offset == voodoo->params.aux_offset) + read_buf = VOODOO_BUF_AUX; + + /* Reads from aux/draw/write regions must see completed rendering. */ + need_sync = (voodoo->fb_read_offset == voodoo->params.aux_offset) || + (voodoo->fb_read_offset == voodoo->params.draw_offset) || + (voodoo->fb_read_offset == voodoo->fb_write_offset); + if (!need_sync && voodoo->lfb_relax_front_sync && read_buf >= 0 && read_buf != VOODOO_BUF_BACK) + need_sync = 1; + if (need_sync) { + if (!voodoo->lfb_relax_enabled) + do_sync = 1; + else if (voodoo->lfb_relax_full) + do_sync = 0; + else { + /* In relax mode, only back-buffer reads can skip the full FIFO flush. */ + int pending_buf = 0; + int pending_unknown = 0; + + if (read_buf >= 0 && read_buf < VOODOO_BUF_COUNT) { + if (!voodoo->lfb_relax_ignore_fb_writes) + pending_buf += voodoo->pending_fb_writes_buf[read_buf]; + if (!voodoo->lfb_relax_ignore_draw) + pending_buf += voodoo->pending_draw_cmds_buf[read_buf]; + } + + if (!voodoo->lfb_relax_ignore_fb_writes) + pending_unknown += voodoo->pending_fb_writes_buf[VOODOO_BUF_UNKNOWN]; + if (!voodoo->lfb_relax_ignore_draw) + pending_unknown += voodoo->pending_draw_cmds_buf[VOODOO_BUF_UNKNOWN]; + if (!voodoo->lfb_relax_ignore_cmdfifo) { + if ((voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr) || voodoo->cmdfifo_in_sub) + pending_unknown++; + if ((voodoo->cmdfifo_depth_rd_2 != voodoo->cmdfifo_depth_wr_2) || voodoo->cmdfifo_in_sub_2) + pending_unknown++; + } + + if (read_buf != VOODOO_BUF_BACK) + do_sync = 1; + else + do_sync = (pending_buf || pending_unknown); + } + } + + if (voodoo->wait_stats_enabled) { + if (do_sync) + voodoo->readl_fb_sync_count++; + else + voodoo->readl_fb_nosync_count++; + if (read_buf >= 0) { + if (do_sync) + voodoo->readl_fb_sync_buf[read_buf]++; + else + voodoo->readl_fb_nosync_buf[read_buf]++; + } + if (need_sync && voodoo->lfb_relax_enabled && !do_sync) { + voodoo->readl_fb_relaxed_count++; + if (read_buf >= 0) + voodoo->readl_fb_relaxed_buf[read_buf]++; + } + } + + if (do_sync) { + voodoo->flush = 1; + while (!FIFO_EMPTY) { + if (voodoo->wait_stats_enabled) { + if (!fifo_wait_active) { + fifo_wait_active = 1; + fifo_wait_start = plat_timer_read(); + voodoo->fifo_empty_waits++; + } + fifo_wait_spins++; + } + voodoo_wake_fifo_thread_now(voodoo); + thread_wait_event(voodoo->fifo_empty_event, -1); + } + if (fifo_wait_active) { + voodoo->fifo_empty_wait_ticks += plat_timer_read() - fifo_wait_start; + voodoo->fifo_empty_spin_checks += fifo_wait_spins; + } + voodoo_wait_for_render_thread_idle(voodoo); + voodoo->flush = 0; + } else if (need_sync && voodoo->lfb_relax_enabled && !voodoo->lfb_relax_full) { + voodoo_wait_for_render_thread_idle(voodoo); } - voodoo_wait_for_render_thread_idle(voodoo); - voodoo->flush = 0; temp = voodoo_fb_readl(addr, voodoo); - } else + } else { + if (voodoo->wait_stats_enabled) + voodoo->readl_reg_count++; + switch (addr & 0x3fc) { case SST_status: { int fifo_entries = FIFO_ENTRIES; int swap_count = voodoo->swap_count; int written = voodoo->cmd_written + voodoo->cmd_written_fifo + voodoo->cmd_written_fifo_2; - int busy = (written - voodoo->cmd_read) || (voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr); + int busy = (written - voodoo->cmd_read) || + (voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr) || + voodoo->voodoo_busy || + voodoo->render_voodoo_busy[0] || + (voodoo->render_threads >= 2 && voodoo->render_voodoo_busy[1]) || + (voodoo->render_threads == 4 && (voodoo->render_voodoo_busy[2] || voodoo->render_voodoo_busy[3])); if (SLI_ENABLED && voodoo->type != VOODOO_2) { voodoo_t *voodoo_other = (voodoo == voodoo->set->voodoos[0]) ? voodoo->set->voodoos[1] : voodoo->set->voodoos[0]; @@ -229,7 +450,12 @@ voodoo_readl(uint32_t addr, void *priv) swap_count = voodoo_other->swap_count; if ((voodoo_other->fifo_write_idx - voodoo_other->fifo_read_idx) > fifo_entries) fifo_entries = voodoo_other->fifo_write_idx - voodoo_other->fifo_read_idx; - if ((other_written - voodoo_other->cmd_read) || (voodoo_other->cmdfifo_depth_rd != voodoo_other->cmdfifo_depth_wr)) + if ((other_written - voodoo_other->cmd_read) || + (voodoo_other->cmdfifo_depth_rd != voodoo_other->cmdfifo_depth_wr) || + voodoo_other->voodoo_busy || + voodoo_other->render_voodoo_busy[0] || + (voodoo_other->render_threads >= 2 && voodoo_other->render_voodoo_busy[1]) || + (voodoo_other->render_threads == 4 && (voodoo_other->render_voodoo_busy[2] || voodoo_other->render_voodoo_busy[3]))) busy = 1; if (!voodoo_other->voodoo_busy) voodoo_wake_fifo_thread(voodoo_other); @@ -338,11 +564,11 @@ voodoo_readl(uint32_t addr, void *priv) break; case SST_hvRetrace: { - uint32_t line_time = (uint32_t) (voodoo->line_time >> 32); - uint32_t diff = (timer_get_ts_int(&voodoo->timer) > (tsc & 0xffffffff)) ? (timer_get_ts_int(&voodoo->timer) - (tsc & 0xffffffff)) : 0; - uint32_t pre_div = diff * voodoo->h_total; - uint32_t post_div = pre_div / line_time; - uint32_t h_pos = (voodoo->h_total - 1) - post_div; + uint64_t line_time = (uint64_t) (voodoo->line_time >> 32); + uint64_t diff = (timer_get_ts_int(&voodoo->timer) > tsc) ? (timer_get_ts_int(&voodoo->timer) - tsc) : 0; + uint64_t pre_div = diff * voodoo->h_total; + uint64_t post_div = pre_div / line_time; + uint64_t h_pos = (voodoo->h_total - 1) - post_div; if (h_pos >= voodoo->h_total) h_pos = 0; @@ -384,6 +610,7 @@ voodoo_readl(uint32_t addr, void *priv) voodoo_log("voodoo_readl : bad addr %08X\n", addr); temp = 0xffffffff; } + } return temp; } @@ -537,6 +764,11 @@ voodoo_writel(uint32_t addr, uint32_t val, void *priv) happen here on a real Voodoo*/ voodoo->disp_buffer = 0; voodoo->draw_buffer = 1; + voodoo->queued_disp_buffer = voodoo->disp_buffer; + voodoo->queued_draw_buffer = voodoo->draw_buffer; + voodoo->queued_lfbMode = voodoo->lfbMode; + voodoo->queued_fbzMode = voodoo->params.fbzMode; + voodoo_update_queued_buffers(voodoo); voodoo_recalc(voodoo); voodoo->front_offset = voodoo->params.front_offset; } @@ -925,6 +1157,7 @@ voodoo_card_init(void) voodoo_t *voodoo = malloc(sizeof(voodoo_t)); memset(voodoo, 0, sizeof(voodoo_t)); + voodoo_init_relax_settings(voodoo); voodoo->bilinear_enabled = device_get_config_int("bilinear"); voodoo->dithersub_enabled = device_get_config_int("dithersub"); voodoo->scrfilter = device_get_config_int("dacfilter"); @@ -992,6 +1225,9 @@ voodoo_card_init(void) voodoo->wake_render_thread[3] = thread_create_event(); voodoo->wake_main_thread = thread_create_event(); voodoo->fifo_not_full_event = thread_create_event(); + voodoo->fifo_empty_event = thread_create_event(); + thread_set_event(voodoo->fifo_empty_event); + ATOMIC_STORE(voodoo->fifo_empty_signaled, 1); voodoo->render_not_full_event[0] = thread_create_event(); voodoo->render_not_full_event[1] = thread_create_event(); voodoo->render_not_full_event[2] = thread_create_event(); @@ -1065,6 +1301,11 @@ voodoo_card_init(void) voodoo->disp_buffer = 0; voodoo->draw_buffer = 1; + voodoo->queued_disp_buffer = voodoo->disp_buffer; + voodoo->queued_draw_buffer = voodoo->draw_buffer; + voodoo->queued_lfbMode = voodoo->lfbMode; + voodoo->queued_fbzMode = voodoo->params.fbzMode; + voodoo_update_queued_buffers(voodoo); voodoo->force_blit_count = 0; voodoo->can_blit = 0; @@ -1080,6 +1321,7 @@ voodoo_2d3d_card_init(int type) voodoo_t *voodoo = malloc(sizeof(voodoo_t)); memset(voodoo, 0, sizeof(voodoo_t)); + voodoo_init_relax_settings(voodoo); voodoo->bilinear_enabled = device_get_config_int("bilinear"); voodoo->dithersub_enabled = device_get_config_int("dithersub"); voodoo->scrfilter = device_get_config_int("dacfilter"); @@ -1116,6 +1358,9 @@ voodoo_2d3d_card_init(int type) voodoo->wake_render_thread[3] = thread_create_event(); voodoo->wake_main_thread = thread_create_event(); voodoo->fifo_not_full_event = thread_create_event(); + voodoo->fifo_empty_event = thread_create_event(); + thread_set_event(voodoo->fifo_empty_event); + ATOMIC_STORE(voodoo->fifo_empty_signaled, 1); voodoo->render_not_full_event[0] = thread_create_event(); voodoo->render_not_full_event[1] = thread_create_event(); voodoo->render_not_full_event[2] = thread_create_event(); @@ -1189,6 +1434,11 @@ voodoo_2d3d_card_init(int type) voodoo->disp_buffer = 0; voodoo->draw_buffer = 1; + voodoo->queued_disp_buffer = voodoo->disp_buffer; + voodoo->queued_draw_buffer = voodoo->draw_buffer; + voodoo->queued_lfbMode = voodoo->lfbMode; + voodoo->queued_fbzMode = voodoo->params.fbzMode; + voodoo_update_queued_buffers(voodoo); voodoo->force_blit_count = 0; voodoo->can_blit = 0; @@ -1277,6 +1527,7 @@ voodoo_card_close(voodoo_t *voodoo) thread_wait(voodoo->render_thread[3]); } thread_destroy_event(voodoo->fifo_not_full_event); + thread_destroy_event(voodoo->fifo_empty_event); thread_destroy_event(voodoo->wake_main_thread); thread_destroy_event(voodoo->wake_fifo_thread); thread_destroy_event(voodoo->wake_render_thread[0]); @@ -1284,6 +1535,48 @@ voodoo_card_close(voodoo_t *voodoo) thread_destroy_event(voodoo->render_not_full_event[0]); thread_destroy_event(voodoo->render_not_full_event[1]); + if (voodoo->wait_stats_enabled && voodoo->wait_stats_explicit) { + pclog("Voodoo wait stats (type=%d): fifo_full waits=%" PRIu64 " ticks=%" PRIu64 " spins=%" PRIu64 + ", fifo_empty waits=%" PRIu64 " ticks=%" PRIu64 " spins=%" PRIu64 + ", render_wait waits=%" PRIu64 " ticks=%" PRIu64 " spins=%" PRIu64 + ", readl fb=%" PRIu64 " sync=%" PRIu64 " nosync=%" PRIu64 " relaxed=%" PRIu64 " relax=%d full=%d nocmdfifo=%d nodraw=%d nowrites=%d frontsync=%d" + " sync_buf f=%" PRIu64 " b=%" PRIu64 " a=%" PRIu64 + " nosync_buf f=%" PRIu64 " b=%" PRIu64 " a=%" PRIu64 + " relaxed_buf f=%" PRIu64 " b=%" PRIu64 " a=%" PRIu64 + " reg=%" PRIu64 " tex=%" PRIu64 "\n", + voodoo->type, + voodoo->fifo_full_waits, + voodoo->fifo_full_wait_ticks, + voodoo->fifo_full_spin_checks, + voodoo->fifo_empty_waits, + voodoo->fifo_empty_wait_ticks, + voodoo->fifo_empty_spin_checks, + voodoo->render_waits, + voodoo->render_wait_ticks, + voodoo->render_wait_spin_checks, + voodoo->readl_fb_count, + voodoo->readl_fb_sync_count, + voodoo->readl_fb_nosync_count, + voodoo->readl_fb_relaxed_count, + voodoo->lfb_relax_enabled, + voodoo->lfb_relax_full, + voodoo->lfb_relax_ignore_cmdfifo, + voodoo->lfb_relax_ignore_draw, + voodoo->lfb_relax_ignore_fb_writes, + voodoo->lfb_relax_front_sync, + voodoo->readl_fb_sync_buf[0], + voodoo->readl_fb_sync_buf[1], + voodoo->readl_fb_sync_buf[2], + voodoo->readl_fb_nosync_buf[0], + voodoo->readl_fb_nosync_buf[1], + voodoo->readl_fb_nosync_buf[2], + voodoo->readl_fb_relaxed_buf[0], + voodoo->readl_fb_relaxed_buf[1], + voodoo->readl_fb_relaxed_buf[2], + voodoo->readl_reg_count, + voodoo->readl_tex_count); + } + for (uint8_t c = 0; c < TEX_CACHE_MAX; c++) { if (voodoo->dual_tmus) free(voodoo->texture_cache[1][c].data); diff --git a/src/video/vid_voodoo_fifo.c b/src/video/vid_voodoo_fifo.c index a7ce0850e..c0fcfe349 100644 --- a/src/video/vid_voodoo_fifo.c +++ b/src/video/vid_voodoo_fifo.c @@ -62,8 +62,97 @@ voodoo_fifo_log(const char *fmt, ...) #define WAKE_DELAY_DEFAULT (TIMER_USEC * 100) -/* Per-card wake delay: Voodoo1 uses a larger delay to reduce FIFO wake frequency */ -#define WAKE_DELAY_OF(v) ((v)->type == VOODOO_1 ? (TIMER_USEC * 500) : WAKE_DELAY_DEFAULT) +/* Per-card wake delay: keep all Voodoo cards at the default */ +#define WAKE_DELAY_OF(v) (WAKE_DELAY_DEFAULT) + +static __inline uint8_t +voodoo_queue_color_buf_tag(const voodoo_t *voodoo, int buf) +{ + if (buf == voodoo->queued_disp_buffer) + return VOODOO_BUF_FRONT; + if (buf == voodoo->queued_draw_buffer) + return VOODOO_BUF_BACK; + return VOODOO_BUF_UNKNOWN; +} + +static __inline void +voodoo_queue_recalc_buffers(voodoo_t *voodoo) +{ + switch (voodoo->queued_lfbMode & LFB_WRITE_MASK) { + case LFB_WRITE_FRONT: + voodoo->queued_fb_write_buffer = voodoo->queued_disp_buffer; + break; + case LFB_WRITE_BACK: + voodoo->queued_fb_write_buffer = voodoo->queued_draw_buffer; + break; + default: + voodoo->queued_fb_write_buffer = voodoo->queued_disp_buffer; + break; + } + + switch (voodoo->queued_fbzMode & FBZ_DRAW_MASK) { + case FBZ_DRAW_FRONT: + voodoo->queued_fb_draw_buffer = voodoo->queued_disp_buffer; + break; + case FBZ_DRAW_BACK: + voodoo->queued_fb_draw_buffer = voodoo->queued_draw_buffer; + break; + default: + voodoo->queued_fb_draw_buffer = voodoo->queued_draw_buffer; + break; + } +} + +static __inline void +voodoo_queue_apply_reg(voodoo_t *voodoo, uint32_t addr, uint32_t val) +{ + switch (addr & 0x3fc) { + case SST_lfbMode: + voodoo->queued_lfbMode = val; + voodoo_queue_recalc_buffers(voodoo); + break; + case SST_fbzMode: + voodoo->queued_fbzMode = val; + voodoo_queue_recalc_buffers(voodoo); + break; + case SST_swapbufferCMD: + if (TRIPLE_BUFFER) { + voodoo->queued_disp_buffer = (voodoo->queued_disp_buffer + 1) % 3; + voodoo->queued_draw_buffer = (voodoo->queued_draw_buffer + 1) % 3; + } else { + voodoo->queued_disp_buffer = !voodoo->queued_disp_buffer; + voodoo->queued_draw_buffer = !voodoo->queued_draw_buffer; + } + voodoo_queue_recalc_buffers(voodoo); + break; + default: + break; + } +} + +static __inline uint8_t +voodoo_queue_reg_target_buf(voodoo_t *voodoo, uint32_t addr) +{ + switch (addr & 0x3fc) { + case SST_triangleCMD: + case SST_ftriangleCMD: + case SST_fastfillCMD: + return voodoo_queue_color_buf_tag(voodoo, voodoo->queued_fb_draw_buffer); + case SST_lfbMode: + case SST_fbzMode: + case SST_swapbufferCMD: + return VOODOO_BUF_UNKNOWN; + default: + return VOODOO_BUF_NONE; + } +} + +static __inline void +voodoo_cmdfifo_reg_writel(voodoo_t *voodoo, uint32_t addr, uint32_t val) +{ + voodoo_reg_writel(addr, val, voodoo); + voodoo_queue_apply_reg(voodoo, addr, val); +} void voodoo_wake_fifo_thread(voodoo_t *voodoo) { @@ -94,8 +183,19 @@ void voodoo_queue_command(voodoo_t *voodoo, uint32_t addr_type, uint32_t val) { fifo_entry_t *fifo = &voodoo->fifo[voodoo->fifo_write_idx & FIFO_MASK]; + uint64_t fifo_wait_start = 0; + uint64_t fifo_wait_spins = 0; + int fifo_wait_active = 0; while (FIFO_FULL) { + if (voodoo->wait_stats_enabled) { + if (!fifo_wait_active) { + fifo_wait_active = 1; + fifo_wait_start = plat_timer_read(); + voodoo->fifo_full_waits++; + } + fifo_wait_spins++; + } thread_reset_event(voodoo->fifo_not_full_event); if (FIFO_FULL) { thread_wait_event(voodoo->fifo_not_full_event, 1); /*Wait for room in ringbuffer*/ @@ -104,8 +204,38 @@ voodoo_queue_command(voodoo_t *voodoo, uint32_t addr_type, uint32_t val) } } - fifo->val = val; - fifo->addr_type = addr_type; + if (fifo_wait_active) { + voodoo->fifo_full_wait_ticks += plat_timer_read() - fifo_wait_start; + voodoo->fifo_full_spin_checks += fifo_wait_spins; + } + +#ifdef _WIN32 + /* Reset only after an empty signal to avoid heavy ResetEvent churn on Windows. */ + if (ATOMIC_LOAD(voodoo->fifo_empty_signaled)) { + ATOMIC_STORE(voodoo->fifo_empty_signaled, 0); + thread_reset_event(voodoo->fifo_empty_event); + } +#else + thread_reset_event(voodoo->fifo_empty_event); +#endif + + fifo->val = val; + fifo->addr_type = addr_type; + fifo->target_buf = VOODOO_BUF_NONE; + + if (((addr_type & FIFO_TYPE) == FIFO_WRITEW_FB) || + ((addr_type & FIFO_TYPE) == FIFO_WRITEL_FB)) { + fifo->target_buf = voodoo_queue_color_buf_tag(voodoo, voodoo->queued_fb_write_buffer); + ATOMIC_INC(voodoo->pending_fb_writes_buf[fifo->target_buf]); + } else if ((addr_type & FIFO_TYPE) == FIFO_WRITEL_REG) { + uint8_t reg_buf = voodoo_queue_reg_target_buf(voodoo, addr_type & FIFO_ADDR); + + if (reg_buf != VOODOO_BUF_NONE) { + fifo->target_buf = reg_buf; + ATOMIC_INC(voodoo->pending_draw_cmds_buf[fifo->target_buf]); + } + voodoo_queue_apply_reg(voodoo, addr_type & FIFO_ADDR, val); + } voodoo->fifo_write_idx++; voodoo->cmd_status &= ~(1 << 24); @@ -120,7 +250,7 @@ voodoo_flush(voodoo_t *voodoo) voodoo->flush = 1; while (!FIFO_EMPTY) { voodoo_wake_fifo_thread_now(voodoo); - thread_wait_event(voodoo->fifo_not_full_event, 1); + thread_wait_event(voodoo->fifo_empty_event, -1); } voodoo_wait_for_render_thread_idle(voodoo); voodoo->flush = 0; @@ -138,9 +268,7 @@ void voodoo_wait_for_swap_complete(voodoo_t *voodoo) { while (voodoo->swap_pending) { - thread_wait_event(voodoo->wake_fifo_thread, -1); - thread_reset_event(voodoo->wake_fifo_thread); - + /* Avoid waiting on wake_fifo_thread here; main thread may be draining the FIFO. */ thread_wait_mutex(voodoo->swap_mutex); if ((voodoo->swap_pending && voodoo->flush) || FIFO_FULL) { /*Main thread is waiting for FIFO to empty, so skip vsync wait and just swap*/ @@ -153,6 +281,13 @@ voodoo_wait_for_swap_complete(voodoo_t *voodoo) break; } else thread_release_mutex(voodoo->swap_mutex); + /* Yield briefly while waiting for the swap to complete. */ +#ifdef _WIN32 + /* Sleep(1) can add measurable stalls on Windows. */ + plat_delay_ms(0); +#else + plat_delay_ms(1); +#endif } } @@ -261,9 +396,15 @@ voodoo_fifo_thread(void *param) switch (fifo->addr_type & FIFO_TYPE) { case FIFO_WRITEL_REG: while ((fifo->addr_type & FIFO_TYPE) == FIFO_WRITEL_REG) { - voodoo_reg_writel(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo); + uint32_t reg_addr = fifo->addr_type & FIFO_ADDR; + uint8_t target_buf = fifo->target_buf; + + voodoo_reg_writel(reg_addr, fifo->val, voodoo); fifo->addr_type = FIFO_INVALID; voodoo->fifo_read_idx++; + if (target_buf < VOODOO_BUF_COUNT) { + ATOMIC_DEC(voodoo->pending_draw_cmds_buf[target_buf]); + } if (FIFO_EMPTY) break; fifo = &voodoo->fifo[voodoo->fifo_read_idx & FIFO_MASK]; @@ -272,9 +413,14 @@ voodoo_fifo_thread(void *param) case FIFO_WRITEW_FB: voodoo_wait_for_render_thread_idle(voodoo); while ((fifo->addr_type & FIFO_TYPE) == FIFO_WRITEW_FB) { + uint8_t target_buf = fifo->target_buf; + voodoo_fb_writew(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo); fifo->addr_type = FIFO_INVALID; voodoo->fifo_read_idx++; + if (target_buf < VOODOO_BUF_COUNT) { + ATOMIC_DEC(voodoo->pending_fb_writes_buf[target_buf]); + } if (FIFO_EMPTY) break; fifo = &voodoo->fifo[voodoo->fifo_read_idx & FIFO_MASK]; @@ -283,9 +429,14 @@ voodoo_fifo_thread(void *param) case FIFO_WRITEL_FB: voodoo_wait_for_render_thread_idle(voodoo); while ((fifo->addr_type & FIFO_TYPE) == FIFO_WRITEL_FB) { + uint8_t target_buf = fifo->target_buf; + voodoo_fb_writel(fifo->addr_type & FIFO_ADDR, fifo->val, voodoo); fifo->addr_type = FIFO_INVALID; voodoo->fifo_read_idx++; + if (target_buf < VOODOO_BUF_COUNT) { + ATOMIC_DEC(voodoo->pending_fb_writes_buf[target_buf]); + } if (FIFO_EMPTY) break; fifo = &voodoo->fifo[voodoo->fifo_read_idx & FIFO_MASK]; @@ -326,6 +477,8 @@ voodoo_fifo_thread(void *param) voodoo->cmd_status |= (1 << 24); voodoo->cmd_status_2 |= (1 << 24); + thread_set_event(voodoo->fifo_empty_event); + ATOMIC_STORE(voodoo->fifo_empty_signaled, 1); while (voodoo->cmdfifo_enabled && (voodoo->cmdfifo_depth_rd != voodoo->cmdfifo_depth_wr || voodoo->cmdfifo_in_sub)) { uint64_t start_time = plat_timer_read(); @@ -418,7 +571,7 @@ voodoo_fifo_thread(void *param) if (voodoo->type >= VOODOO_BANSHEE && (addr & 0x3ff) == SST_swapbufferCMD) voodoo->cmd_written_fifo++; - voodoo_reg_writel(addr, val, voodoo); + voodoo_cmdfifo_reg_writel(voodoo, addr, val); } if (header & (1 << 15)) @@ -447,7 +600,7 @@ voodoo_fifo_thread(void *param) num = (header >> 29) & 7; mask = header; //(header >> 10) & 0xff; smode = (header >> 22) & 0xf; - voodoo_reg_writel(SST_sSetupMode, ((header >> 10) & 0xff) | (smode << 16), voodoo); + voodoo_cmdfifo_reg_writel(voodoo, SST_sSetupMode, ((header >> 10) & 0xff) | (smode << 16)); num_verticies = (header >> 6) & 0xf; v_num = 0; if (((header >> 3) & 7) == 2) @@ -492,9 +645,9 @@ voodoo_fifo_thread(void *param) voodoo->verts[3].sT1 = cmdfifo_get_f(voodoo); } if (v_num) - voodoo_reg_writel(SST_sDrawTriCMD, 0, voodoo); + voodoo_cmdfifo_reg_writel(voodoo, SST_sDrawTriCMD, 0); else - voodoo_reg_writel(SST_sBeginTriCMD, 0, voodoo); + voodoo_cmdfifo_reg_writel(voodoo, SST_sBeginTriCMD, 0); v_num++; if (v_num == 3 && ((header >> 3) & 7) == 0) v_num = 0; @@ -528,7 +681,7 @@ voodoo_fifo_thread(void *param) if (voodoo->type >= VOODOO_BANSHEE && (addr & 0x3ff) == SST_swapbufferCMD) voodoo->cmd_written_fifo++; - voodoo_reg_writel(addr, val, voodoo); + voodoo_cmdfifo_reg_writel(voodoo, addr, val); } } @@ -709,7 +862,7 @@ voodoo_fifo_thread(void *param) if (voodoo->type >= VOODOO_BANSHEE && (addr & 0x3ff) == SST_swapbufferCMD) voodoo->cmd_written_fifo_2++; - voodoo_reg_writel(addr, val, voodoo); + voodoo_cmdfifo_reg_writel(voodoo, addr, val); } if (header & (1 << 15)) @@ -738,7 +891,7 @@ voodoo_fifo_thread(void *param) num = (header >> 29) & 7; mask = header; //(header >> 10) & 0xff; smode = (header >> 22) & 0xf; - voodoo_reg_writel(SST_sSetupMode, ((header >> 10) & 0xff) | (smode << 16), voodoo); + voodoo_cmdfifo_reg_writel(voodoo, SST_sSetupMode, ((header >> 10) & 0xff) | (smode << 16)); num_verticies = (header >> 6) & 0xf; v_num = 0; if (((header >> 3) & 7) == 2) @@ -783,9 +936,9 @@ voodoo_fifo_thread(void *param) voodoo->verts[3].sT1 = cmdfifo_get_f_2(voodoo); } if (v_num) - voodoo_reg_writel(SST_sDrawTriCMD, 0, voodoo); + voodoo_cmdfifo_reg_writel(voodoo, SST_sDrawTriCMD, 0); else - voodoo_reg_writel(SST_sBeginTriCMD, 0, voodoo); + voodoo_cmdfifo_reg_writel(voodoo, SST_sBeginTriCMD, 0); v_num++; if (v_num == 3 && ((header >> 3) & 7) == 0) v_num = 0; @@ -819,7 +972,7 @@ voodoo_fifo_thread(void *param) if (voodoo->type >= VOODOO_BANSHEE && (addr & 0x3ff) == SST_swapbufferCMD) voodoo->cmd_written_fifo_2++; - voodoo_reg_writel(addr, val, voodoo); + voodoo_cmdfifo_reg_writel(voodoo, addr, val); } }