diff --git a/CMakeLists.txt b/CMakeLists.txt index adec2eedb..a7dede226 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -36,7 +36,7 @@ if(MUNT_EXTERNAL) endif() project(86Box - VERSION 5.3 + VERSION 5.4 DESCRIPTION "Emulator of x86-based systems" HOMEPAGE_URL "https://86box.net" LANGUAGES C CXX) diff --git a/debian/changelog b/debian/changelog index 3720d22aa..c0c4bf945 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,5 +1,5 @@ -86box (5.3) UNRELEASED; urgency=medium +86box (5.4) UNRELEASED; urgency=medium * Bump release. - -- Jasmine Iwanek Tue, 02 Dec 2025 15:24:58 +0100 + -- Jasmine Iwanek Tue, 23 Dec 2025 00:27:45 +0100 diff --git a/src/86box.c b/src/86box.c index 4bf73790e..b2311f0e2 100644 --- a/src/86box.c +++ b/src/86box.c @@ -2138,17 +2138,6 @@ set_screen_size_natural(void) set_screen_size(monitors[i].mon_unscaled_size_x, monitors[i].mon_unscaled_size_y); } -int -get_actual_size_x(void) -{ - return (unscaled_size_x); -} - -int -get_actual_size_y(void) -{ - return (efscrnsz_y); -} void do_pause(int p) diff --git a/src/codegen_new/codegen_allocator.c b/src/codegen_new/codegen_allocator.c index 157c3cc0b..c3fca66b7 100644 --- a/src/codegen_new/codegen_allocator.c +++ b/src/codegen_new/codegen_allocator.c @@ -192,11 +192,7 @@ codegen_allocator_clean_blocks(UNUSED(struct mem_block_t *block)) { #if defined __ARM_EABI__ || defined __aarch64__ || defined _M_ARM64 while (1) { -# ifndef _MSC_VER __clear_cache(&mem_block_alloc[block->offset], &mem_block_alloc[block->offset + MEM_BLOCK_SIZE]); -# else - FlushInstructionCache(GetCurrentProcess(), &mem_block_alloc[block->offset], MEM_BLOCK_SIZE); -# endif if (block->next) block = &mem_blocks[block->next - 1]; else diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 25564082b..865e76ffb 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -446,16 +446,14 @@ typedef struct { # define CPU_STATUS_MASK 0xffff0000 #endif -#ifdef _MSC_VER -# define COMPILE_TIME_ASSERT(expr) /*nada*/ + +#ifdef EXTREME_DEBUG +# define COMPILE_TIME_ASSERT(expr) typedef char COMP_TIME_ASSERT[(expr) ? 1 : 0]; #else -# ifdef EXTREME_DEBUG -# define COMPILE_TIME_ASSERT(expr) typedef char COMP_TIME_ASSERT[(expr) ? 1 : 0]; -# else -# define COMPILE_TIME_ASSERT(expr) /*nada*/ -# endif +# define COMPILE_TIME_ASSERT(expr) /*nada*/ #endif + COMPILE_TIME_ASSERT(sizeof(cpu_state_t) <= 128) #define cpu_state_offset(MEMBER) ((uint8_t) ((uintptr_t) &cpu_state.MEMBER - (uintptr_t) &cpu_state - 128)) diff --git a/src/cpu/x87_ops.h b/src/cpu/x87_ops.h index e581652d4..4d099885a 100644 --- a/src/cpu/x87_ops.h +++ b/src/cpu/x87_ops.h @@ -33,9 +33,6 @@ #endif #include "x87_timings.h" -#ifdef _MSC_VER -# include -#endif #include "x87_ops_conv.h" #ifdef ENABLE_FPU_LOG @@ -390,8 +387,7 @@ x87_compare(double a, double b) if ((fpu_type < FPU_287XL) && !(cpu_state.npxc & 0x1000) && ((a == INFINITY) || (a == -INFINITY)) && ((b == INFINITY) || (b == -INFINITY))) eb = ea; -# if !defined(_MSC_VER) || defined(__clang__) - /* Memory barrier, to force GCC to write to the input parameters + /* Memory barrier, to force GCC to write to the input parameters * before the compare rather than after */ __asm volatile("" : @@ -406,17 +402,7 @@ x87_compare(double a, double b) "fnstsw %0\n" : "=m"(result) : "m"(ea), "m"(eb)); -# else - _ReadWriteBarrier(); - _asm - { - fld eb - fld ea - fclex - fcompp - fnstsw result - } -# endif + return result & (FPU_SW_C0 | FPU_SW_C2 | FPU_SW_C3); #else @@ -451,7 +437,6 @@ x87_ucompare(double a, double b) #ifdef X87_INLINE_ASM uint32_t result; -# if !defined(_MSC_VER) || defined(__clang__) /* Memory barrier, to force GCC to write to the input parameters * before the compare rather than after */ __asm volatile("" @@ -467,17 +452,6 @@ x87_ucompare(double a, double b) "fnstsw %0\n" : "=m"(result) : "m"(a), "m"(b)); -# else - _ReadWriteBarrier(); - _asm - { - fld b - fld a - fclex - fcompp - fnstsw result - } -# endif return result & (FPU_SW_C0 | FPU_SW_C2 | FPU_SW_C3); #else diff --git a/src/device/cartridge.c b/src/device/cartridge.c index 639095f72..bbcbad661 100644 --- a/src/device/cartridge.c +++ b/src/device/cartridge.c @@ -33,7 +33,7 @@ typedef struct cart_t { uint32_t base; } cart_t; -char cart_fns[2][512]; +char cart_fns[2][MAX_IMAGE_PATH_LEN]; char *cart_image_history[2][CART_IMAGE_HISTORY]; static cart_t carts[2]; diff --git a/src/device/cassette.c b/src/device/cassette.c index 0577ae06f..b2d8f7a1c 100644 --- a/src/device/cassette.c +++ b/src/device/cassette.c @@ -43,7 +43,7 @@ pc_cassette_t *cassette; -char cassette_fname[512]; +char cassette_fname[MAX_IMAGE_PATH_LEN]; char cassette_mode[512]; char * cassette_image_history[CASSETTE_IMAGE_HISTORY]; unsigned long cassette_pos; diff --git a/src/device/kbc_at.c b/src/device/kbc_at.c index b2e027cd3..771b95c2a 100644 --- a/src/device/kbc_at.c +++ b/src/device/kbc_at.c @@ -37,7 +37,6 @@ #include <86box/fdd.h> #include <86box/fdc.h> #include <86box/pci.h> -#include <86box/video.h> #include <86box/keyboard.h> #define STAT_PARITY 0x80 @@ -2786,18 +2785,14 @@ static void kbc_at_reset(void *priv) { atkbc_t *dev = (atkbc_t *) priv; - uint8_t kbc_ven = dev->flags & KBC_VEN_MASK; dev->status = STAT_UNLOCKED; dev->mem[0x20] = 0x01; dev->mem[0x20] |= CCB_TRANSLATE; dev->command_phase = 0; - /* Set up the correct Video Type bits. */ - if (!is286 || (kbc_ven == KBC_VEN_ACER)) - dev->p1 = video_is_mda() ? 0xb0 : 0xf0; - else - dev->p1 = video_is_mda() ? 0xf0 : 0xb0; + /* Video Type is now handled in the machine P1 handler. */ + dev->p1 = 0xf0; kbc_at_log("ATkbc: P1 = %02x\n", dev->p1); /* Disabled both the keyboard and auxiliary ports. */ @@ -2918,7 +2913,6 @@ kbc_at_init(const device_t *info) dev->is_asic = !!(info->local & KBC_FLAG_IS_ASIC); dev->is_type2 = !!(info->local & KBC_FLAG_IS_TYPE2); - video_reset(gfxcard[0]); kbc_at_reset(dev); dev->handlers[0].read = kbc_at_port_1_read; diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index c1bf04618..de0549ca4 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -784,6 +784,9 @@ fdc_sis(fdc_t *fdc) static void fdc_soft_reset(fdc_t *fdc) { + /* Reset boot status to POST on controller soft reset */ + fdd_boot_status_reset(); + if (fdc->power_down) { timer_set_delay_u64(&fdc->timer, 1000 * TIMER_USEC); fdc->interrupt = -5; @@ -2403,6 +2406,9 @@ fdc_reset(void *priv) fdc_t *fdc = (fdc_t *) priv; + /* Reset boot status to POST on controller reset */ + fdd_boot_status_reset(); + default_rwc = (fdc->flags & FDC_FLAG_START_RWC_1) ? 1 : 0; fdc->enable_3f1 = 1; diff --git a/src/floppy/fdd.c b/src/floppy/fdd.c index 30be0979a..14627a3f9 100644 --- a/src/floppy/fdd.c +++ b/src/floppy/fdd.c @@ -101,7 +101,10 @@ typedef struct fdd_pending_op_t { static fdd_pending_op_t fdd_pending[FDD_NUM]; -char floppyfns[FDD_NUM][512]; +/* BIOS boot status tracking */ +static bios_boot_status_t bios_boot_status = BIOS_BOOT_POST; + +char floppyfns[FDD_NUM][MAX_IMAGE_PATH_LEN]; char *fdd_image_history[FDD_NUM][FLOPPY_IMAGE_HISTORY]; pc_timer_t fdd_poll_time[FDD_NUM]; @@ -212,9 +215,9 @@ int fdd_do_log = ENABLE_FDD_LOG; static void fdd_log(const char *fmt, ...) { - va_list ap, ap_copy; + va_list ap; char timebuf[32]; - char fullbuf[1056]; // 32 + 1024 bytes for timestamp + message + char fullbuf[1056]; /* 32 + 1024 bytes for timestamp + message */ if (fdd_do_log) { uint32_t ticks = plat_get_ticks(); @@ -224,27 +227,58 @@ fdd_log(const char *fmt, ...) snprintf(timebuf, sizeof(timebuf), "[%07u.%03u] ", seconds, milliseconds); va_start(ap, fmt); - va_copy(ap_copy, ap); - strcpy(fullbuf, timebuf); - vsnprintf(fullbuf + strlen(timebuf), sizeof(fullbuf) - strlen(timebuf), fmt, ap_copy); - - va_end(ap_copy); + vsnprintf(fullbuf + strlen(timebuf), sizeof(fullbuf) - strlen(timebuf), fmt, ap); va_end(ap); - va_start(ap, fmt); - va_end(ap); - - char *msg = fullbuf; - va_start(ap, fmt); - pclog_ex("%s", (va_list) &msg); - va_end(ap); + pclog("%s", fullbuf); } } #else # define fdd_log(fmt, ...) #endif +/* + * BIOS boot status functions + * + * These functions track whether the system is in BIOS POST (Power-On Self Test) + * or has transitioned to normal operation. The POST state is set on: + * - System hard reset (fdd_reset) + * - FDC soft reset (fdd_boot_status_reset) + * + * POST is considered complete when the first floppy read operation occurs, + * indicating that BIOS has finished POST and is attempting to boot. + */ +bios_boot_status_t +fdd_get_boot_status(void) +{ + return bios_boot_status; +} + +void +fdd_set_boot_status(bios_boot_status_t status) +{ + if (bios_boot_status != status) { + fdd_log("BIOS boot status changed: %s -> %s\n", + bios_boot_status == BIOS_BOOT_POST ? "POST" : "NORMAL", + status == BIOS_BOOT_POST ? "POST" : "NORMAL"); + bios_boot_status = status; + } +} + +void +fdd_boot_status_reset(void) +{ + fdd_log("BIOS boot status reset to POST\n"); + bios_boot_status = BIOS_BOOT_POST; +} + +int +fdd_is_post_complete(void) +{ + return (bios_boot_status == BIOS_BOOT_NORMAL); +} + void fdd_set_audio_profile(int drive, int profile) { @@ -690,6 +724,7 @@ fdd_close(int drive) drives[drive].format = NULL; drives[drive].byteperiod = NULL; drives[drive].stop = NULL; + fdd_seek_in_progress[drive] = 0; d86f_destroy(drive); ui_sb_update_icon_state(SB_FLOPPY | drive, 1); } @@ -778,9 +813,15 @@ fdd_get_bitcell_period(int rate) void fdd_reset(void) { + /* Reset boot status to POST on system reset */ + fdd_boot_status_reset(); + for (uint8_t i = 0; i < FDD_NUM; i++) { drives[i].id = i; timer_add(&(fdd_poll_time[i]), fdd_poll, &drives[i], 0); + + /* Clear any pending seek state */ + fdd_seek_in_progress[i] = 0; } } @@ -789,6 +830,11 @@ fdd_readsector(int drive, int sector, int track, int side, int density, int sect { fdd_log("fdd_readsector(%d, %d, %d, %d, %d, %d)\n", drive, sector, track, side, density, sector_size); + /* First floppy read operation marks POST as complete */ + if (bios_boot_status == BIOS_BOOT_POST) { + fdd_set_boot_status(BIOS_BOOT_NORMAL); + } + if (fdd_seek_in_progress[drive]) { fdd_log("Seek in progress on drive %d, deferring READ (trk=%d->%d, side=%d, sec=%d)\n", drive, fdd[drive].track, track, side, sector); diff --git a/src/floppy/fdd_audio.c b/src/floppy/fdd_audio.c index 9bd9aeea6..8cbebf209 100644 --- a/src/floppy/fdd_audio.c +++ b/src/floppy/fdd_audio.c @@ -38,39 +38,6 @@ static fdd_audio_profile_config_t audio_profiles[FDD_AUDIO_PROFILE_MAX]; static int audio_profile_count = 0; -/* Audio sample structure */ -typedef struct { - char filename[512]; - int16_t *buffer; - int samples; - float volume; -} audio_sample_t; - -typedef struct { - int position; - int active; -} single_step_state_t; - -/* Multi-track seek audio state */ -typedef struct { - int position; - int active; - int duration_samples; - int from_track; - int to_track; - int track_diff; -} multi_seek_state_t; - -/* Drive type specific audio samples */ -typedef struct { - audio_sample_t spindlemotor_start; - audio_sample_t spindlemotor_loop; - audio_sample_t spindlemotor_stop; - /* Individual seek samples for each track count (indexed 0-78 for 1-79 tracks) */ - audio_sample_t seek_up[MAX_SEEK_SAMPLES]; - audio_sample_t seek_down[MAX_SEEK_SAMPLES]; -} drive_audio_samples_t; - /* Dynamic sample storage for each profile */ static drive_audio_samples_t profile_samples[FDD_AUDIO_PROFILE_MAX]; @@ -86,28 +53,115 @@ static multi_seek_state_t seek_state[FDD_NUM][MAX_CONCURRENT_SEEKS] = {}; extern uint64_t motoron[FDD_NUM]; extern char exe_path[2048]; -extern int fdd_get_audio_profile(int drive); - /* Forward declaration */ static int16_t *load_wav(const char *filename, int *sample_count); -# ifdef ENABLE_FDD_LOG -int fdc_do_log = ENABLE_FDD_LOG; +extern uint8_t *rom; +extern uint32_t biosmask; +extern uint32_t biosaddr; +typedef enum { + BIOS_VENDOR_UNKNOWN = 0, + BIOS_VENDOR_AMI, + BIOS_VENDOR_AWARD, + BIOS_VENDOR_PHOENIX, + BIOS_VENDOR_IBM, + BIOS_VENDOR_COMPAQ, + BIOS_VENDOR_OTHER +} bios_vendor_t; + +#ifdef ENABLE_FDD_LOG +int fdd_audio_do_log = ENABLE_FDD_LOG; static void fdd_log(const char *fmt, ...) { va_list ap; - if (fdc_do_log) { + if (fdd_audio_do_log) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); } } -# else +#else # define fdd_log(fmt, ...) -# endif +#endif + +/* Detect BIOS vendor by scanning ROM for signature strings */ +static bios_vendor_t +fdd_audio_detect_bios_vendor(void) +{ + if (!rom || biosmask == 0) + return BIOS_VENDOR_UNKNOWN; + + /* Search for BIOS vendor strings in ROM */ + for (uint32_t i = 0; i < (biosmask + 1); i++) { + /* AMI BIOS signatures */ + if ((i + 7) < (biosmask + 1)) { + if (memcmp(&rom[i], "AMIBIOS", 7) == 0) { + fdd_log("FDD Audio: Detected AMI BIOS\n"); + return BIOS_VENDOR_AMI; + } + if (memcmp(&rom[i], "American Megatrends", 19) == 0) { + fdd_log("FDD Audio: Detected AMI BIOS (American Megatrends)\n"); + return BIOS_VENDOR_AMI; + } + } + + /* Award BIOS signatures */ + if ((i + 5) < (biosmask + 1)) { + if (memcmp(&rom[i], "Award", 5) == 0) { + fdd_log("FDD Audio: Detected Award BIOS\n"); + return BIOS_VENDOR_AWARD; + } + } + + /* Phoenix BIOS signatures */ + if ((i + 7) < (biosmask + 1)) { + if (memcmp(&rom[i], "Phoenix", 7) == 0) { + fdd_log("FDD Audio: Detected Phoenix BIOS\n"); + return BIOS_VENDOR_PHOENIX; + } + } + + /* IBM BIOS signatures */ + if ((i + 3) < (biosmask + 1)) { + if (memcmp(&rom[i], "IBM", 3) == 0 && (i + 10) < (biosmask + 1)) { + if (memcmp(&rom[i], "IBM CORP", 8) == 0) { + fdd_log("FDD Audio: Detected IBM BIOS\n"); + return BIOS_VENDOR_IBM; + } + } + } + + /* Compaq BIOS signatures */ + if ((i + 6) < (biosmask + 1)) { + if (memcmp(&rom[i], "COMPAQ", 6) == 0) { + fdd_log("FDD Audio: Detected Compaq BIOS\n"); + return BIOS_VENDOR_COMPAQ; + } + } + } + + fdd_log("FDD Audio: BIOS vendor unknown\n"); + return BIOS_VENDOR_UNKNOWN; +} + +/* Determine if this BIOS uses POST-mode FDC seeks */ +static int +fdd_audio_get_bios_vendor(void) +{ + static bios_vendor_t detected_vendor = BIOS_VENDOR_UNKNOWN; + static int detection_done = 0; + + /* Only detect once */ + if (!detection_done) { + detected_vendor = fdd_audio_detect_bios_vendor(); + detection_done = 1; + } + + return detected_vendor; +} /* Logging function for audio profile parameters */ static void @@ -271,13 +325,67 @@ fdd_audio_load_profiles(void) snprintf(key, sizeof(key), "seek_down_%dtrack_volume", track_count); profile->seek_down[track_count - 1].volume = ini_section_get_double(section, key, 1.0); + /* POST mode seek down samples */ + snprintf(key, sizeof(key), "post_seek_down_%dtrack_file", track_count); + filename = ini_section_get_string(section, key, ""); + strncpy(profile->post_seek_down[track_count - 1].filename, filename, + sizeof(profile->post_seek_down[track_count - 1].filename) - 1); + profile->post_seek_down[track_count - 1].filename[sizeof(profile->post_seek_down[track_count - 1].filename) - 1] = '\0'; + + snprintf(key, sizeof(key), "post_seek_down_%dtrack_volume", track_count); + profile->post_seek_down[track_count - 1].volume = ini_section_get_double(section, key, 1.0); + + /* BIOS vendor-specific POST mode seek samples */ + static const char *bios_prefixes[] = { + NULL, /* BIOS_VENDOR_UNKNOWN */ + "amibios", /* BIOS_VENDOR_AMI */ + "award", /* BIOS_VENDOR_AWARD */ + "phoenix", /* BIOS_VENDOR_PHOENIX */ + "ibm", /* BIOS_VENDOR_IBM */ + "compaq", /* BIOS_VENDOR_COMPAQ */ + NULL /* BIOS_VENDOR_OTHER */ + }; + + for (int vendor = 1; vendor < BIOS_VENDOR_COUNT; vendor++) { + if (!bios_prefixes[vendor]) + continue; + + /* BIOS-specific POST mode seek up samples */ + snprintf(key, sizeof(key), "%s_post_seek_up_%dtrack_file", bios_prefixes[vendor], track_count); + filename = ini_section_get_string(section, key, ""); + strncpy(profile->bios_post_seek_up[vendor][track_count - 1].filename, filename, + sizeof(profile->bios_post_seek_up[vendor][track_count - 1].filename) - 1); + profile->bios_post_seek_up[vendor][track_count - 1].filename[sizeof(profile->bios_post_seek_up[vendor][track_count - 1].filename) - 1] = '\0'; + + snprintf(key, sizeof(key), "%s_post_seek_up_%dtrack_volume", bios_prefixes[vendor], track_count); + profile->bios_post_seek_up[vendor][track_count - 1].volume = ini_section_get_double(section, key, 1.0); + + /* BIOS-specific POST mode seek down samples */ + snprintf(key, sizeof(key), "%s_post_seek_down_%dtrack_file", bios_prefixes[vendor], track_count); + filename = ini_section_get_string(section, key, ""); + strncpy(profile->bios_post_seek_down[vendor][track_count - 1].filename, filename, + sizeof(profile->bios_post_seek_down[vendor][track_count - 1].filename) - 1); + profile->bios_post_seek_down[vendor][track_count - 1].filename[sizeof(profile->bios_post_seek_down[vendor][track_count - 1].filename) - 1] = '\0'; + + snprintf(key, sizeof(key), "%s_post_seek_down_%dtrack_volume", bios_prefixes[vendor], track_count); + profile->bios_post_seek_down[vendor][track_count - 1].volume = ini_section_get_double(section, key, 1.0); + + /* BIOS-specific POST mode seek time in milliseconds */ + snprintf(key, sizeof(key), "%s_post_seek_%dtrack_time_ms", bios_prefixes[vendor], track_count); + profile->bios_post_seek_time_ms[vendor][track_count - 1] = ini_section_get_double(section, key, 0.0); + } + /* Seek time in milliseconds - used for FDC timing, not sample playback */ snprintf(key, sizeof(key), "seek_%dtrack_time_ms", track_count); profile->seek_time_ms[track_count - 1] = ini_section_get_double(section, key, 6.0 * track_count); + + /* POST mode seek time in milliseconds */ + snprintf(key, sizeof(key), "post_seek_%dtrack_time_ms", track_count); + profile->post_seek_time_ms[track_count - 1] = ini_section_get_double(section, key, 0.0); } /* Load timing configurations */ - profile->total_tracks = ini_section_get_int(section, "total_tracks", 80); + profile->total_tracks = ini_section_get_int(section, "total_tracks", 0); audio_profile_count++; } @@ -362,7 +470,7 @@ load_profile_samples(int profile_id) &samples->seek_up[idx].samples); if (samples->seek_up[idx].buffer) { fdd_log(" Loaded seek_up[%d]: %s (%d samples, volume %.2f)\n", - track_count, config->seek_up[idx].filename, + idx, config->seek_up[idx].filename, samples->seek_up[idx].samples, config->seek_up[idx].volume); } } @@ -375,10 +483,76 @@ load_profile_samples(int profile_id) &samples->seek_down[idx].samples); if (samples->seek_down[idx].buffer) { fdd_log(" Loaded seek_down[%d]: %s (%d samples, volume %.2f)\n", - track_count, config->seek_down[idx].filename, + idx, config->seek_down[idx].filename, samples->seek_down[idx].samples, config->seek_down[idx].volume); } } + + /* Load POST mode seek samples if configured */ + if (config->post_seek_up[idx].filename[0]) { + if (samples->post_seek_up[idx].buffer == NULL) { + strcpy(samples->post_seek_up[idx].filename, config->post_seek_up[idx].filename); + samples->post_seek_up[idx].volume = config->post_seek_up[idx].volume; + samples->post_seek_up[idx].buffer = load_wav(config->post_seek_up[idx].filename, + &samples->post_seek_up[idx].samples); + if (samples->post_seek_up[idx].buffer) { + fdd_log(" Loaded POST seek_up[%d] (%d-track): %s (%d samples, volume %.2f)\n", + idx, track_count, config->post_seek_up[idx].filename, + samples->post_seek_up[idx].samples, config->post_seek_up[idx].volume); + } + } + } + + if (config->post_seek_down[idx].filename[0]) { + if (samples->post_seek_down[idx].buffer == NULL) { + strcpy(samples->post_seek_down[idx].filename, config->post_seek_down[idx].filename); + samples->post_seek_down[idx].volume = config->post_seek_down[idx].volume; + samples->post_seek_down[idx].buffer = load_wav(config->post_seek_down[idx].filename, + &samples->post_seek_down[idx].samples); + if (samples->post_seek_down[idx].buffer) { + fdd_log(" Loaded POST seek_down[%d] (%d-track): %s (%d samples, volume %.2f)\n", + idx, track_count, config->post_seek_down[idx].filename, + samples->post_seek_down[idx].samples, config->post_seek_down[idx].volume); + } + } + } + +#ifdef ENABLE_FDD_LOG + /* Load BIOS vendor-specific POST mode seek samples if configured */ + static const char *bios_names[] = { + "UNKNOWN", "AMI", "AWARD", "PHOENIX", "IBM", "COMPAQ", "OTHER" + }; +#endif + + for (int vendor = 1; vendor < BIOS_VENDOR_COUNT; vendor++) { + if (config->bios_post_seek_up[vendor][idx].filename[0]) { + if (samples->bios_post_seek_up[vendor][idx].buffer == NULL) { + strcpy(samples->bios_post_seek_up[vendor][idx].filename, config->bios_post_seek_up[vendor][idx].filename); + samples->bios_post_seek_up[vendor][idx].volume = config->bios_post_seek_up[vendor][idx].volume; + samples->bios_post_seek_up[vendor][idx].buffer = load_wav(config->bios_post_seek_up[vendor][idx].filename, + &samples->bios_post_seek_up[vendor][idx].samples); + if (samples->bios_post_seek_up[vendor][idx].buffer) { + fdd_log(" Loaded %s POST seek_up[%d] (%d-track): %s (%d samples, volume %.2f)\n", + bios_names[vendor], idx, track_count, config->bios_post_seek_up[vendor][idx].filename, + samples->bios_post_seek_up[vendor][idx].samples, config->bios_post_seek_up[vendor][idx].volume); + } + } + } + + if (config->bios_post_seek_down[vendor][idx].filename[0]) { + if (samples->bios_post_seek_down[vendor][idx].buffer == NULL) { + strcpy(samples->bios_post_seek_down[vendor][idx].filename, config->bios_post_seek_down[vendor][idx].filename); + samples->bios_post_seek_down[vendor][idx].volume = config->bios_post_seek_down[vendor][idx].volume; + samples->bios_post_seek_down[vendor][idx].buffer = load_wav(config->bios_post_seek_down[vendor][idx].filename, + &samples->bios_post_seek_down[vendor][idx].samples); + if (samples->bios_post_seek_down[vendor][idx].buffer) { + fdd_log(" Loaded %s POST seek_down[%d] (%d-track): %s (%d samples, volume %.2f)\n", + bios_names[vendor], idx, track_count, config->bios_post_seek_down[vendor][idx].filename, + samples->bios_post_seek_down[vendor][idx].samples, config->bios_post_seek_down[vendor][idx].volume); + } + } + } + } } } @@ -461,6 +635,21 @@ fdd_audio_get_seek_time(int drive, int track_count, int is_seek_down) /* Return configured seek time in microseconds */ if (track_count > 0 && track_count <= MAX_SEEK_SAMPLES) { + /* In POST mode, check for BIOS-specific timing first */ + if (fdd_get_boot_status() == BIOS_BOOT_POST) { + int bios_vendor = fdd_audio_get_bios_vendor(); + + /* Check BIOS vendor-specific timing first */ + if (bios_vendor > 0 && bios_vendor < BIOS_VENDOR_COUNT && + profile->bios_post_seek_time_ms[bios_vendor][track_count - 1] > 0.0) { + return profile->bios_post_seek_time_ms[bios_vendor][track_count - 1] * 1000.0; + } + + /* Fall back to generic POST timing */ + if (profile->post_seek_time_ms[track_count - 1] > 0.0) { + return profile->post_seek_time_ms[track_count - 1] * 1000.0; + } + } return profile->seek_time_ms[track_count - 1] * 1000.0; } @@ -489,6 +678,7 @@ fdd_audio_init(void) seek_state[i][j].from_track = -1; seek_state[i][j].to_track = -1; seek_state[i][j].track_diff = 0; + seek_state[i][j].sample_to_play = NULL; } } @@ -546,6 +736,30 @@ fdd_audio_close(void) samples->seek_down[track_count].buffer = NULL; samples->seek_down[track_count].samples = 0; } + if (samples->post_seek_up[track_count].buffer) { + free(samples->post_seek_up[track_count].buffer); + samples->post_seek_up[track_count].buffer = NULL; + samples->post_seek_up[track_count].samples = 0; + } + if (samples->post_seek_down[track_count].buffer) { + free(samples->post_seek_down[track_count].buffer); + samples->post_seek_down[track_count].buffer = NULL; + samples->post_seek_down[track_count].samples = 0; + } + + /* Free BIOS vendor-specific POST seek samples */ + for (int vendor = 0; vendor < BIOS_VENDOR_COUNT; vendor++) { + if (samples->bios_post_seek_up[vendor][track_count].buffer) { + free(samples->bios_post_seek_up[vendor][track_count].buffer); + samples->bios_post_seek_up[vendor][track_count].buffer = NULL; + samples->bios_post_seek_up[vendor][track_count].samples = 0; + } + if (samples->bios_post_seek_down[vendor][track_count].buffer) { + free(samples->bios_post_seek_down[vendor][track_count].buffer); + samples->bios_post_seek_down[vendor][track_count].buffer = NULL; + samples->bios_post_seek_down[vendor][track_count].samples = 0; + } + } } } @@ -629,16 +843,81 @@ fdd_audio_play_multi_track_seek(int drive, int from_track, int to_track) track_diff = max_seek_tracks; } - /* Get the appropriate seek sample */ - int idx = track_diff - 1; - audio_sample_t *sample_to_use = is_seek_down ? &samples->seek_down[idx] : &samples->seek_up[idx]; + int boot_status = fdd_get_boot_status(); + int bios_vendor = fdd_audio_get_bios_vendor(); + int idx = track_diff - 1; + int real_track_diff = to_track - from_track; + audio_sample_t *sample_to_use = NULL; + + if (boot_status == BIOS_BOOT_POST) { + if (bios_vendor == BIOS_VENDOR_AMI) { + /* AMI BIOS POST mode: use AMI-specific samples if available */ + + /* AMI BIOS quirk: for single-track seeks down (except 10->9), do not play audio */ + if (real_track_diff == -1 && (from_track != 10 || to_track != 9)) { + fdd_log("FDD Audio Drive %d: AMI BIOS quirk: for single-track seeks down (except 10->9), do not play audio\n", drive); + return; + } + + /* For 10->9 seek, use the 1-track sample (which should be the 10-0 sound) */ + sample_to_use = is_seek_down ? &samples->bios_post_seek_down[bios_vendor][idx] : &samples->bios_post_seek_up[bios_vendor][idx]; + + if (sample_to_use->buffer && sample_to_use->samples > 0) { + fdd_log("FDD Audio Drive %d: Using AMI BIOS POST mode seek sample (idx=%d, %s)\n", + drive, idx, is_seek_down ? "DOWN" : "UP"); + } else { + /* Fall back to generic POST sample */ + sample_to_use = is_seek_down ? &samples->post_seek_down[idx] : &samples->post_seek_up[idx]; + if (sample_to_use->buffer && sample_to_use->samples > 0) { + fdd_log("FDD Audio Drive %d: AMI BIOS sample not available, using generic POST sample (idx=%d, %s)\n", + drive, idx, is_seek_down ? "DOWN" : "UP"); + } else { + /* Fall back to normal sample */ + fdd_log("FDD Audio Drive %d: POST sample not available, using normal sample\n", drive); + sample_to_use = is_seek_down ? &samples->seek_down[idx] : &samples->seek_up[idx]; + } + } + } else if (bios_vendor > 0 && bios_vendor < BIOS_VENDOR_COUNT) { + /* Other known BIOS vendors: try vendor-specific samples first */ + sample_to_use = is_seek_down ? &samples->bios_post_seek_down[bios_vendor][idx] : &samples->bios_post_seek_up[bios_vendor][idx]; + + if (sample_to_use->buffer && sample_to_use->samples > 0) { + fdd_log("FDD Audio Drive %d: Using BIOS vendor %d POST mode seek sample (idx=%d, %s)\n", + drive, bios_vendor, idx, is_seek_down ? "DOWN" : "UP"); + } else { + /* Fall back to generic POST sample */ + sample_to_use = is_seek_down ? &samples->post_seek_down[idx] : &samples->post_seek_up[idx]; + if (sample_to_use->buffer && sample_to_use->samples > 0) { + fdd_log("FDD Audio Drive %d: BIOS-specific sample not available, using generic POST sample (idx=%d, %s)\n", + drive, idx, is_seek_down ? "DOWN" : "UP"); + } else { + /* Fall back to normal sample */ + fdd_log("FDD Audio Drive %d: POST sample not available, using normal sample\n", drive); + sample_to_use = is_seek_down ? &samples->seek_down[idx] : &samples->seek_up[idx]; + } + } + } else { + /* Unknown BIOS vendor POST mode */ + sample_to_use = is_seek_down ? &samples->post_seek_down[idx] : &samples->post_seek_up[idx]; + if (!sample_to_use->buffer || sample_to_use->samples == 0) { + fdd_log("FDD Audio Drive %d: POST sample not available, using normal sample\n", drive); + sample_to_use = is_seek_down ? &samples->seek_down[idx] : &samples->seek_up[idx]; + } else { + fdd_log("FDD Audio Drive %d: Using POST mode seek sample (idx=%d, %s)\n", + drive, idx, is_seek_down ? "DOWN" : "UP"); + } + } + } else { + /* Use normal samples */ + sample_to_use = is_seek_down ? &samples->seek_down[idx] : &samples->seek_up[idx]; + } /* Only proceed if we have the appropriate sample */ if (!sample_to_use || !sample_to_use->buffer || sample_to_use->samples == 0) return; - fdd_log("FDD Audio Drive %d: Multi-track seek %d -> %d (%d tracks, %s)\n", - drive, from_track, to_track, track_diff, is_seek_down ? "DOWN" : "UP"); + fdd_log("FDD Audio Drive %d: Multi-track seek %d -> %d (%d tracks, %s, POST=%d)\n", + drive, from_track, to_track, track_diff, is_seek_down ? "DOWN" : "UP", boot_status); /* Find an available seek slot */ int slot = -1; @@ -662,6 +941,7 @@ fdd_audio_play_multi_track_seek(int drive, int from_track, int to_track) seek_state[drive][slot].from_track = from_track; seek_state[drive][slot].to_track = to_track; seek_state[drive][slot].track_diff = track_diff; + seek_state[drive][slot].sample_to_play = sample_to_use; fdd_log("FDD Audio Drive %d: Started seek in slot %d, duration %d samples\n", drive, slot, sample_to_use->samples); @@ -867,30 +1147,26 @@ fdd_audio_callback(int16_t *buffer, int length) if (!seek_state[drive][slot].active) continue; - int track_diff = seek_state[drive][slot].track_diff; - if (track_diff > 0 && track_diff <= MAX_SEEK_SAMPLES) { - int idx = track_diff - 1; - int is_seek_down = (seek_state[drive][slot].to_track < seek_state[drive][slot].from_track); - audio_sample_t *seek_sample = is_seek_down ? &samples->seek_down[idx] : &samples->seek_up[idx]; + audio_sample_t *seek_sample = seek_state[drive][slot].sample_to_play; - if (seek_sample && seek_sample->buffer && seek_state[drive][slot].position < seek_sample->samples) { - /* Mix seek sound with existing audio */ - float seek_left = (float) seek_sample->buffer[seek_state[drive][slot].position * 2] / 131072.0f * seek_sample->volume; - float seek_right = (float) seek_sample->buffer[seek_state[drive][slot].position * 2 + 1] / 131072.0f * seek_sample->volume; + if (seek_sample && seek_sample->buffer && seek_state[drive][slot].position < seek_sample->samples) { + /* Mix seek sound with existing audio */ + float seek_left = (float) seek_sample->buffer[seek_state[drive][slot].position * 2] / 131072.0f * seek_sample->volume; + float seek_right = (float) seek_sample->buffer[seek_state[drive][slot].position * 2 + 1] / 131072.0f * seek_sample->volume; - left_sample += seek_left; - right_sample += seek_right; + left_sample += seek_left; + right_sample += seek_right; - seek_state[drive][slot].position++; - } else { - /* Seek sound finished */ - seek_state[drive][slot].active = 0; - seek_state[drive][slot].position = 0; - seek_state[drive][slot].duration_samples = 0; - seek_state[drive][slot].from_track = -1; - seek_state[drive][slot].to_track = -1; - seek_state[drive][slot].track_diff = 0; - } + seek_state[drive][slot].position++; + } else { + /* Seek sound finished */ + seek_state[drive][slot].active = 0; + seek_state[drive][slot].position = 0; + seek_state[drive][slot].duration_samples = 0; + seek_state[drive][slot].from_track = -1; + seek_state[drive][slot].to_track = -1; + seek_state[drive][slot].track_diff = 0; + seek_state[drive][slot].sample_to_play = NULL; } } @@ -983,30 +1259,26 @@ fdd_audio_callback(int16_t *buffer, int length) if (!seek_state[drive][slot].active) continue; - int track_diff = seek_state[drive][slot].track_diff; - if (track_diff > 0 && track_diff <= MAX_SEEK_SAMPLES) { - int idx = track_diff - 1; - int is_seek_down = (seek_state[drive][slot].to_track < seek_state[drive][slot].from_track); - audio_sample_t *seek_sample = is_seek_down ? &samples->seek_down[idx] : &samples->seek_up[idx]; + audio_sample_t *seek_sample = seek_state[drive][slot].sample_to_play; - if (seek_sample && seek_sample->buffer && seek_state[drive][slot].position < seek_sample->samples) { - /* Mix seek sound with existing audio */ - int16_t seek_left = (int16_t) ((float) seek_sample->buffer[seek_state[drive][slot].position * 2] / 4.0f * seek_sample->volume); - int16_t seek_right = (int16_t) ((float) seek_sample->buffer[seek_state[drive][slot].position * 2 + 1] / 4.0f * seek_sample->volume); + if (seek_sample && seek_sample->buffer && seek_state[drive][slot].position < seek_sample->samples) { + /* Mix seek sound with existing audio */ + int16_t seek_left = (int16_t) ((float) seek_sample->buffer[seek_state[drive][slot].position * 2] / 4.0f * seek_sample->volume); + int16_t seek_right = (int16_t) ((float) seek_sample->buffer[seek_state[drive][slot].position * 2 + 1] / 4.0f * seek_sample->volume); - left_sample += seek_left; - right_sample += seek_right; + left_sample += seek_left; + right_sample += seek_right; - seek_state[drive][slot].position++; - } else { - /* Seek sound finished */ - seek_state[drive][slot].active = 0; - seek_state[drive][slot].position = 0; - seek_state[drive][slot].duration_samples = 0; - seek_state[drive][slot].from_track = -1; - seek_state[drive][slot].to_track = -1; - seek_state[drive][slot].track_diff = 0; - } + seek_state[drive][slot].position++; + } else { + /* Seek sound finished */ + seek_state[drive][slot].active = 0; + seek_state[drive][slot].position = 0; + seek_state[drive][slot].duration_samples = 0; + seek_state[drive][slot].from_track = -1; + seek_state[drive][slot].to_track = -1; + seek_state[drive][slot].track_diff = 0; + seek_state[drive][slot].sample_to_play = NULL; } } diff --git a/src/floppy/fdd_pcjs.c b/src/floppy/fdd_pcjs.c index 2193048c6..b1494cd38 100644 --- a/src/floppy/fdd_pcjs.c +++ b/src/floppy/fdd_pcjs.c @@ -18,11 +18,7 @@ #include #include #include -#ifndef _MSC_VER #include -#else -#include -#endif #define HAVE_STDARG_H #include <86box/86box.h> #include <86box/timer.h> diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index d9c105546..0a6b2461a 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -47,7 +47,7 @@ /* Recently used images */ #define MAX_PREV_IMAGES 10 -#define MAX_IMAGE_PATH_LEN 2048 +#define MAX_IMAGE_PATH_LEN 4096 /* Max UUID Length */ #define MAX_UUID_LEN 64 diff --git a/src/include/86box/cartridge.h b/src/include/86box/cartridge.h index 3afe1c3fc..66fa34e1a 100644 --- a/src/include/86box/cartridge.h +++ b/src/include/86box/cartridge.h @@ -21,7 +21,7 @@ extern "C" { #define CART_IMAGE_HISTORY 10 -extern char cart_fns[2][512]; +extern char cart_fns[2][MAX_IMAGE_PATH_LEN]; extern char *cart_image_history[2][CART_IMAGE_HISTORY]; extern void cart_load(int drive, char *fn); diff --git a/src/include/86box/cassette.h b/src/include/86box/cassette.h index dc85bfc26..82aebeef6 100644 --- a/src/include/86box/cassette.h +++ b/src/include/86box/cassette.h @@ -157,7 +157,7 @@ void pc_cas_advance(pc_cassette_t *cas); extern pc_cassette_t *cassette; -extern char cassette_fname[512]; +extern char cassette_fname[MAX_IMAGE_PATH_LEN]; extern char cassette_mode[512]; extern char * cassette_image_history[CASSETTE_IMAGE_HISTORY]; extern unsigned long cassette_pos; diff --git a/src/include/86box/cdrom.h b/src/include/86box/cdrom.h index 82c59ccd6..487676023 100644 --- a/src/include/86box/cdrom.h +++ b/src/include/86box/cdrom.h @@ -323,8 +323,8 @@ typedef struct cdrom { void *priv; - char image_path[1024]; - char prev_image_path[1280]; + char image_path[MAX_IMAGE_PATH_LEN]; + char prev_image_path[MAX_IMAGE_PATH_LEN + 256]; uint32_t sound_on; uint32_t cdrom_capacity; diff --git a/src/include/86box/fdd.h b/src/include/86box/fdd.h index a173279a4..5e526ab6d 100644 --- a/src/include/86box/fdd.h +++ b/src/include/86box/fdd.h @@ -26,6 +26,12 @@ #define SEEK_RECALIBRATE -999 #define DEFAULT_SEEK_TIME_MS 10.0 +/* BIOS boot status - used to detect POST vs normal operation */ +typedef enum { + BIOS_BOOT_POST = 0, /* System is in POST (Power-On Self Test) */ + BIOS_BOOT_NORMAL = 1 /* POST complete, normal operation */ +} bios_boot_status_t; + #ifdef __cplusplus extern "C" { #endif @@ -90,7 +96,7 @@ typedef struct DRIVE { } DRIVE; extern DRIVE drives[FDD_NUM]; -extern char floppyfns[FDD_NUM][512]; +extern char floppyfns[FDD_NUM][MAX_IMAGE_PATH_LEN]; extern char *fdd_image_history[FDD_NUM][FLOPPY_IMAGE_HISTORY]; extern pc_timer_t fdd_poll_time[FDD_NUM]; extern int ui_writeprot[FDD_NUM]; @@ -118,6 +124,12 @@ extern int fdd_hole(int drive); extern void fdd_stop(int drive); extern void fdd_do_writeback(int drive); +/* BIOS boot status functions */ +extern bios_boot_status_t fdd_get_boot_status(void); +extern void fdd_set_boot_status(bios_boot_status_t status); +extern void fdd_boot_status_reset(void); +extern int fdd_is_post_complete(void); + extern int motorspin; extern uint64_t motoron[FDD_NUM]; diff --git a/src/include/86box/fdd_audio.h b/src/include/86box/fdd_audio.h index 1d1b52d14..433aeaff8 100644 --- a/src/include/86box/fdd_audio.h +++ b/src/include/86box/fdd_audio.h @@ -16,6 +16,7 @@ #define EMU_FDD_AUDIO_H #include +#include <86box/fdd.h> #ifdef __cplusplus extern "C" { @@ -29,6 +30,9 @@ extern "C" { /* Maximum number of simultaneous seek sounds per drive */ #define MAX_CONCURRENT_SEEKS 8 +/* Number of BIOS vendors (for BIOS-specific samples) */ +#define BIOS_VENDOR_COUNT 7 + /* Audio sample configuration structure */ typedef struct { char filename[512]; @@ -45,7 +49,15 @@ typedef struct { audio_sample_config_t spindlemotor_stop; audio_sample_config_t seek_up[MAX_SEEK_SAMPLES]; audio_sample_config_t seek_down[MAX_SEEK_SAMPLES]; - double seek_time_ms[MAX_SEEK_SAMPLES]; /* Seek time in milliseconds for each track count */ + audio_sample_config_t post_seek_up[MAX_SEEK_SAMPLES]; + audio_sample_config_t post_seek_down[MAX_SEEK_SAMPLES]; + /* BIOS vendor-specific POST seek samples [vendor][track] */ + audio_sample_config_t bios_post_seek_up[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES]; + audio_sample_config_t bios_post_seek_down[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES]; + double seek_time_ms[MAX_SEEK_SAMPLES]; + double post_seek_time_ms[MAX_SEEK_SAMPLES]; + /* BIOS vendor-specific POST seek times [vendor][track] */ + double bios_post_seek_time_ms[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES]; int total_tracks; /* 40 or 80 */ } fdd_audio_profile_config_t; @@ -76,6 +88,45 @@ typedef struct { uint32_t data_size; } wav_header_t; +/* Audio sample structure */ +typedef struct { + char filename[512]; + int16_t *buffer; + int samples; + float volume; +} audio_sample_t; + +typedef struct { + int position; + int active; +} single_step_state_t; + +/* Multi-track seek audio state */ +typedef struct { + int position; + int active; + int duration_samples; + int from_track; + int to_track; + int track_diff; + audio_sample_t *sample_to_play; +} multi_seek_state_t; + +/* Drive type specific audio samples */ +typedef struct { + audio_sample_t spindlemotor_start; + audio_sample_t spindlemotor_loop; + audio_sample_t spindlemotor_stop; + /* Individual seek samples for each track count (indexed 0-78 for 1-79 tracks) */ + audio_sample_t seek_up[MAX_SEEK_SAMPLES]; + audio_sample_t seek_down[MAX_SEEK_SAMPLES]; + audio_sample_t post_seek_up[MAX_SEEK_SAMPLES]; + audio_sample_t post_seek_down[MAX_SEEK_SAMPLES]; + /* BIOS vendor-specific POST seek samples [vendor][track] */ + audio_sample_t bios_post_seek_up[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES]; + audio_sample_t bios_post_seek_down[BIOS_VENDOR_COUNT][MAX_SEEK_SAMPLES]; +} drive_audio_samples_t; + /* Fade duration: 75ms at 48kHz = 3600 samples */ #define FADE_DURATION_MS 75 #define FADE_SAMPLES (48000 * FADE_DURATION_MS / 1000) @@ -89,6 +140,8 @@ extern const char* fdd_audio_get_profile_internal_name(int id); extern int fdd_audio_get_profile_by_internal_name(const char *internal_name); extern double fdd_audio_get_seek_time(int drive, int track_count, int is_seek_down); extern void load_profile_samples(int profile_id); +extern int fdd_get_audio_profile(int drive); +extern bios_boot_status_t fdd_get_boot_status(void); #else diff --git a/src/include/86box/hdd.h b/src/include/86box/hdd.h index e471cb54e..88855552b 100644 --- a/src/include/86box/hdd.h +++ b/src/include/86box/hdd.h @@ -161,7 +161,7 @@ typedef struct hard_disk_t { void *priv; - char fn[1024]; /* Name of current image file */ + char fn[MAX_IMAGE_PATH_LEN]; /* Name of current image file */ /* Differential VHD parent file */ char vhd_parent[1280]; diff --git a/src/include/86box/mo.h b/src/include/86box/mo.h index 5d48579eb..53e342ed6 100644 --- a/src/include/86box/mo.h +++ b/src/include/86box/mo.h @@ -113,8 +113,8 @@ typedef struct mo_drive_t { FILE *fp; void *priv; - char image_path[1024]; - char prev_image_path[1024]; + char image_path[MAX_IMAGE_PATH_LEN]; + char prev_image_path[MAX_IMAGE_PATH_LEN + 256]; char *image_history[MO_IMAGE_HISTORY]; diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h index dcf7e4d53..2d28ec9bc 100644 --- a/src/include/86box/plat.h +++ b/src/include/86box/plat.h @@ -69,19 +69,10 @@ extern int strnicmp(const char *s1, const char *s2, size_t n); # define fseeko64 fseeko # define ftello64 ftello # define off64_t off_t -#elif defined(_MSC_VER) -// # define fopen64 fopen -# define fseeko64 _fseeki64 -# define ftello64 _ftelli64 -# define off64_t off_t #endif -#ifdef _MSC_VER -# define UNUSED(arg) arg -#else /* A hack (GCC-specific?) to allow us to ignore unused parameters. */ # define UNUSED(arg) __attribute__((unused)) arg -#endif /* Return the size (in wchar's) of a wchar_t array. */ #define sizeof_w(x) (sizeof((x)) / sizeof(wchar_t)) @@ -90,28 +81,23 @@ extern int strnicmp(const char *s1, const char *s2, size_t n); # include # define atomic_flag_t std::atomic_flag # define atomic_bool_t std::atomic_bool + extern "C" { #else # include # define atomic_flag_t atomic_flag # define atomic_bool_t atomic_bool -#endif -#if defined(_MSC_VER) -# define ssize_t intptr_t -#endif -#ifdef _MSC_VER -# define fallthrough do {} while (0) /* fallthrough */ +#if __has_attribute(fallthrough) +# define fallthrough __attribute__((fallthrough)) #else -# if __has_attribute(fallthrough) -# define fallthrough __attribute__((fallthrough)) -# else -# if __has_attribute(__fallthrough__) -# define fallthrough __attribute__((__fallthrough__)) -# endif -# define fallthrough do {} while (0) /* fallthrough */ +# if __has_attribute(__fallthrough__) +# define fallthrough __attribute__((__fallthrough__)) # endif +# define fallthrough do {} while (0) /* fallthrough */ +#endif + #endif /* Global variables residing in the platform module. */ diff --git a/src/include/86box/plat_fallthrough.h b/src/include/86box/plat_fallthrough.h index 2ba000848..1221f03fa 100644 --- a/src/include/86box/plat_fallthrough.h +++ b/src/include/86box/plat_fallthrough.h @@ -16,18 +16,16 @@ #define EMU_PLAT_FALLTHROUGH_H #ifndef EMU_PLAT_H -#ifdef _MSC_VER -# define fallthrough do {} while (0) /* fallthrough */ + +#if __has_attribute(fallthrough) +# define fallthrough __attribute__((fallthrough)) #else -# if __has_attribute(fallthrough) -# define fallthrough __attribute__((fallthrough)) -# else -# if __has_attribute(__fallthrough__) -# define fallthrough __attribute__((__fallthrough__)) -# endif -# define fallthrough do {} while (0) /* fallthrough */ +# if __has_attribute(__fallthrough__) +# define fallthrough __attribute__((__fallthrough__)) # endif +# define fallthrough do {} while (0) /* fallthrough */ #endif + #endif #endif /*EMU_PLAT_FALLTHROUGH_H*/ diff --git a/src/include/86box/plat_unused.h b/src/include/86box/plat_unused.h index 4688a615b..4090f3358 100644 --- a/src/include/86box/plat_unused.h +++ b/src/include/86box/plat_unused.h @@ -19,12 +19,9 @@ #define EMU_PLAT_UNUSED_H #ifndef EMU_PLAT_H -#ifdef _MSC_VER -# define UNUSED(arg) arg -#else /* A hack (GCC-specific?) to allow us to ignore unused parameters. */ + # define UNUSED(arg) __attribute__((unused)) arg -#endif -#endif +#endif #endif /*EMU_PLAT_UNUSED_H*/ diff --git a/src/include/86box/rdisk.h b/src/include/86box/rdisk.h index 6f0255847..fff53ec63 100644 --- a/src/include/86box/rdisk.h +++ b/src/include/86box/rdisk.h @@ -91,8 +91,8 @@ typedef struct rdisk_drive_t { FILE *fp; void *priv; - char image_path[1024]; - char prev_image_path[1024]; + char image_path[MAX_IMAGE_PATH_LEN]; + char prev_image_path[MAX_IMAGE_PATH_LEN + 256]; char *image_history[RDISK_IMAGE_HISTORY]; diff --git a/src/include/86box/vid_mda.h b/src/include/86box/vid_mda.h index 17c028343..4d11305f4 100644 --- a/src/include/86box/vid_mda.h +++ b/src/include/86box/vid_mda.h @@ -18,6 +18,7 @@ // Defines #define MDA_CRTC_NUM_REGISTERS 32 +#define MDA_VRAM 0x1000 // Enums & structures diff --git a/src/include/86box/vid_voodoo_codegen_x86-64.h b/src/include/86box/vid_voodoo_codegen_x86-64.h index 67a5cae2c..0e43c15bd 100644 --- a/src/include/86box/vid_voodoo_codegen_x86-64.h +++ b/src/include/86box/vid_voodoo_codegen_x86-64.h @@ -8,11 +8,7 @@ #ifndef VIDEO_VOODOO_CODEGEN_X86_64_H #define VIDEO_VOODOO_CODEGEN_X86_64_H -#ifdef _MSC_VER -# include -#else -# include -#endif +#include #define BLOCK_NUM 8 #define BLOCK_MASK (BLOCK_NUM - 1) @@ -653,14 +649,15 @@ codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *pa static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) { - int block_pos = 0; - int z_skip_pos = 0; - int a_skip_pos = 0; - int amask_skip_pos = 0; - int chroma_skip_pos = 0; - int depth_jump_pos = 0; - int depth_jump_pos2 = 0; - int loop_jump_pos = 0; + int block_pos = 0; + int z_skip_pos = 0; + int a_skip_pos = 0; + int amask_skip_pos = 0; + int stipple_skip_pos = 0; + int chroma_skip_pos = 0; + int depth_jump_pos = 0; + int depth_jump_pos2 = 0; + int loop_jump_pos = 0; #if 0 xmm_01_w = (__m128i)0x0001000100010001ull; xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; @@ -766,6 +763,69 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, addquad((uint64_t) (uintptr_t) &i_00_ff_w); loop_jump_pos = block_pos; + if (params->fbzMode & FBZ_STIPPLE) { + /* Stipple enabled. */ + if (params->fbzMode & FBZ_STIPPLE_PATT) { + /* x64's BT instruction is too slow. So use TEST instead. */ + addbyte(0x4c); /* MOV RBX, R14(real_y)*/ + addbyte(0x89); + addbyte(0xf3); + + addbyte(0x83); /* AND EBX, 3 */ + addbyte(0xe3); + addbyte(0x03); + + addbyte(0xc1); /* SHL EBX, 3 */ + addbyte(0xe3); + addbyte(0x03); + + addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ + addbyte(0x87); + addlong(offsetof(voodoo_state_t, x)); + + addbyte(0xf7); /* NOT EAX */ + addbyte(0xd0); + + addbyte(0x83); /* AND EAX, 7 */ + addbyte(0xe0); + addbyte(0x07); + + addbyte(0x09); /* OR EAX, EBX */ + addbyte(0xc3); + + addbyte(0x88); /* MOV CL, AL */ + addbyte(0xc1); + + addbyte(0xb8); /* MOV EAX, 1*/ + addlong(1); + + addbyte(0xd3); /* SHL EAX, CL */ + addbyte(0xe0); + + addbyte(0x85); /* TEST state->stipple[EDI], EAX */ + addbyte(0x87); + addlong(offsetof(voodoo_state_t, stipple)); + + addbyte(0x0f); /* JZ stipple_skip_pos */ + addbyte(0x84); + stipple_skip_pos = block_pos; + addlong(0); + } else { + addbyte(0xd1); /* ROR state->stipple[EDI], 1*/ + addbyte(0x8f); + addlong(offsetof(voodoo_state_t, stipple)); + + addbyte(0xf7); /* TEST state->stipple[EDI], 0x80000000 */ + addbyte(0x87); + addlong(offsetof(voodoo_state_t, stipple)); + addlong(0x80000000); + + addbyte(0x0f); /* JZ stipple_skip_pos */ + addbyte(0x84); + stipple_skip_pos = block_pos; + addlong(0); + } + } addbyte(0x4c); /*MOV RSI, R15*/ addbyte(0x89); addbyte(0xfe); @@ -3190,6 +3250,8 @@ voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, *(uint32_t *) &code_block[chroma_skip_pos] = (block_pos - chroma_skip_pos) - 4; if (amask_skip_pos) *(uint32_t *) &code_block[amask_skip_pos] = (block_pos - amask_skip_pos) - 4; + if (stipple_skip_pos) + *(uint32_t *) &code_block[stipple_skip_pos] = (block_pos - stipple_skip_pos) - 4; addbyte(0x4c); /*MOV RSI, R15*/ addbyte(0x89); diff --git a/src/include/86box/vid_voodoo_codegen_x86.h b/src/include/86box/vid_voodoo_codegen_x86.h index 996bd28f1..f479a5413 100644 --- a/src/include/86box/vid_voodoo_codegen_x86.h +++ b/src/include/86box/vid_voodoo_codegen_x86.h @@ -8,11 +8,7 @@ #ifndef VIDEO_VOODOO_CODEGEN_X86_H #define VIDEO_VOODOO_CODEGEN_X86_H -#ifdef _MSC_VER -# include -#else -# include -#endif +#include #define BLOCK_NUM 8 #define BLOCK_MASK (BLOCK_NUM - 1) diff --git a/src/include/86box/vid_voodoo_common.h b/src/include/86box/vid_voodoo_common.h index d87c1f731..2870f09ea 100644 --- a/src/include/86box/vid_voodoo_common.h +++ b/src/include/86box/vid_voodoo_common.h @@ -667,6 +667,8 @@ typedef struct voodoo_t { struct voodoo_set_t *set; + uint32_t launch_pending; + uint8_t fifo_thread_run; uint8_t render_thread_run[4]; diff --git a/src/include/86box/vid_voodoo_regs.h b/src/include/86box/vid_voodoo_regs.h index 3340720a7..9f3260c9f 100644 --- a/src/include/86box/vid_voodoo_regs.h +++ b/src/include/86box/vid_voodoo_regs.h @@ -358,6 +358,7 @@ enum { enum { FBZ_CHROMAKEY = (1 << 1), + FBZ_STIPPLE = (1 << 2), FBZ_W_BUFFER = (1 << 3), FBZ_DEPTH_ENABLE = (1 << 4), @@ -366,6 +367,8 @@ enum { FBZ_DEPTH_WMASK = (1 << 10), FBZ_DITHER_2x2 = (1 << 11), + FBZ_STIPPLE_PATT = (1 << 12), + FBZ_ALPHA_MASK = (1 << 13), FBZ_DRAW_FRONT = 0x0000, diff --git a/src/include/86box/video.h b/src/include/86box/video.h index ff63a3a79..b94bdf415 100644 --- a/src/include/86box/video.h +++ b/src/include/86box/video.h @@ -58,6 +58,21 @@ enum { VIDEO_AGP }; +typedef enum video_font_format_e +{ + FONT_FORMAT_MDA = 0, + FONT_FORMAT_PC200 = 1, + FONT_FORMAT_CGA = 2, + FONT_FORMAT_WY700 = 3, + FONT_FORMAT_MDSI_GENIUS = 4, + FONT_FORMAT_TOSHIBA_3100E = 5, + FONT_FORMAT_KSC6501 = 6, + FONT_FORMAT_SIGMA = 7, + FONT_FORMAT_PC1512_T1000 = 8, + FONT_FORMAT_IM1024 = 9, + FONT_FORMAT_PRAVETZ = 10, +} video_font_format; + #define VIDEO_FLAG_TYPE_CGA 0 #define VIDEO_FLAG_TYPE_MDA 1 #define VIDEO_FLAG_TYPE_SPECIAL 2 @@ -202,8 +217,6 @@ extern int video_fullscreen; extern int video_fullscreen_scale; extern uint8_t fontdat[2048][8]; /* IBM CGA font */ extern uint8_t fontdatm[2048][16]; /* IBM MDA font */ -extern uint8_t fontdat2[2048][8]; /* IBM CGA 2nd instance font */ -extern uint8_t fontdatm2[2048][16]; /* IBM MDA 2nd instance font */ extern uint8_t fontdatw[512][32]; /* Wyse700 font */ extern uint8_t fontdat8x12[256][16]; /* MDSI Genius font */ extern uint8_t fontdat12x18[256][36]; /* IM1024 font */ @@ -253,9 +266,6 @@ extern int video_get_video_from_internal_name(char *s); extern int video_card_get_flags(int card); extern int video_is_mda(void); extern int video_is_cga(void); -extern int video_is_ega_vga(void); -extern int video_is_8514(void); -extern int video_is_xga(void); extern void video_inform_monitor(int type, const video_timings_t *ptr, int monitor_index); extern int video_get_type_monitor(int monitor_index); @@ -288,12 +298,8 @@ extern uint8_t video_force_resize_get_monitor(int monitor_index); extern void video_force_resize_set_monitor(uint8_t res, int monitor_index); extern void video_update_timing(void); -extern void loadfont_ex(char *fn, int format, int offset); -extern void loadfont(char *fn, int format); - -extern int get_actual_size_x(void); -extern int get_actual_size_y(void); - +#define LOAD_FONT_NO_OFFSET 0 +extern void video_load_font(char *fn, int format, int offset); extern uint32_t video_color_transform(uint32_t color); #define video_inform(type, video_timings_ptr) video_inform_monitor(type, video_timings_ptr, monitor_index_global) diff --git a/src/machine/m_amstrad.c b/src/machine/m_amstrad.c index 8e52bd488..f056397a1 100644 --- a/src/machine/m_amstrad.c +++ b/src/machine/m_amstrad.c @@ -3020,7 +3020,7 @@ machine_amstrad_init(const machine_t *model, int type) if (gfxcard[0] == VID_INTERNAL) switch (type) { case AMS_PC1512: - loadfont("roms/machines/pc1512/40078", 8); + video_load_font("roms/machines/pc1512/40078", FONT_FORMAT_PC1512_T1000, LOAD_FONT_NO_OFFSET); device_context(&vid_1512_device); ams->language = device_get_config_int("language"); vid_init_1512(ams); @@ -3029,7 +3029,7 @@ machine_amstrad_init(const machine_t *model, int type) break; case AMS_PPC512: - loadfont("roms/machines/ppc512/40109", 1); + video_load_font("roms/machines/ppc512/40109", FONT_FORMAT_PC200, LOAD_FONT_NO_OFFSET); device_context(&vid_ppc512_device); ams->language = device_get_config_int("language"); vid_init_200(ams); @@ -3038,7 +3038,7 @@ machine_amstrad_init(const machine_t *model, int type) break; case AMS_PC1640: - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); device_context(&vid_1640_device); ams->language = device_get_config_int("language"); vid_init_1640(ams); @@ -3047,7 +3047,7 @@ machine_amstrad_init(const machine_t *model, int type) break; case AMS_PC200: - loadfont("roms/machines/pc200/40109", 1); + video_load_font("roms/machines/pc200/40109", FONT_FORMAT_PC200, LOAD_FONT_NO_OFFSET); device_context(&vid_200_device); ams->language = device_get_config_int("language"); vid_init_200(ams); diff --git a/src/machine/m_elt.c b/src/machine/m_elt.c index b965486d1..1f440bad2 100644 --- a/src/machine/m_elt.c +++ b/src/machine/m_elt.c @@ -33,9 +33,9 @@ #include #include #include +#include <86box/86box.h> #include <86box/timer.h> #include <86box/fdd.h> -#include <86box/86box.h> #include <86box/device.h> #include <86box/fdc.h> #include <86box/fdc_ext.h> diff --git a/src/machine/m_pcjr.c b/src/machine/m_pcjr.c index 78f7ba710..10d2d0c7b 100644 --- a/src/machine/m_pcjr.c +++ b/src/machine/m_pcjr.c @@ -897,7 +897,7 @@ machine_pcjr_init(UNUSED(const machine_t *model)) /* Initialize the video controller. */ video_reset(gfxcard[0]); - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); device_context(&pcjr_device); pcjr_vid_init(pcjr); device_context_restore(); diff --git a/src/machine/m_v86p.c b/src/machine/m_v86p.c index 0be44de53..126517345 100644 --- a/src/machine/m_v86p.c +++ b/src/machine/m_v86p.c @@ -77,9 +77,9 @@ machine_v86p_init(const machine_t *model) return ret; if (rom_id == 2) - loadfont("roms/machines/v86p/V86P.FON", 8); + video_load_font("roms/machines/v86p/V86P.FON", FONT_FORMAT_PC1512_T1000, LOAD_FONT_NO_OFFSET); else - loadfont("roms/machines/v86p/v86pfont.rom", 8); + video_load_font("roms/machines/v86p/v86pfont.rom", FONT_FORMAT_PC1512_T1000, LOAD_FONT_NO_OFFSET); machine_common_init(model); diff --git a/src/machine/m_xt.c b/src/machine/m_xt.c index 2d314b7f2..81c9eba72 100644 --- a/src/machine/m_xt.c +++ b/src/machine/m_xt.c @@ -2154,7 +2154,7 @@ machine_xt_maz1016_init(const machine_t *model) if (bios_only || !ret) return ret; - loadfont("roms/machines/maz1016/crt-8.bin", 0); + video_load_font("roms/machines/maz1016/crt-8.bin", FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); machine_xt_clone_init(model, 0); diff --git a/src/machine/m_xt_olivetti.c b/src/machine/m_xt_olivetti.c index 50a891e2c..e6c64cf95 100644 --- a/src/machine/m_xt_olivetti.c +++ b/src/machine/m_xt_olivetti.c @@ -2018,7 +2018,7 @@ m19_vid_init(m19_vid_t *vid) #endif /* OGC emulation part begin */ - loadfont("roms/machines/m19/MBM2764-30 8514 107 AB PCF3.BIN", 7); + video_load_font("roms/machines/m19/MBM2764-30 8514 107 AB PCF3.BIN", FONT_FORMAT_SIGMA, LOAD_FONT_NO_OFFSET); /* composite is not working yet */ vid->ogc.cga.composite = 0; // (display_type != CGA_RGB); vid->ogc.cga.revision = device_get_config_int("composite_type"); diff --git a/src/machine/m_xt_t1000.c b/src/machine/m_xt_t1000.c index 87899e7c6..8fd692588 100644 --- a/src/machine/m_xt_t1000.c +++ b/src/machine/m_xt_t1000.c @@ -846,7 +846,7 @@ machine_xt_t1000_init(const machine_t *model) t1000.ems_port_index = 7; /* EMS disabled */ /* Load the T1000 CGA Font ROM. */ - loadfont("roms/machines/t1000/t1000font.bin", 2); + video_load_font("roms/machines/t1000/t1000font.bin", FONT_FORMAT_CGA, LOAD_FONT_NO_OFFSET); /* * The ROM drive is optional. @@ -928,7 +928,7 @@ machine_xt_t1200_init(const machine_t *model) t1000.ems_port_index = 7; /* EMS disabled */ /* Load the T1000 CGA Font ROM. */ - loadfont("roms/machines/t1000/t1000font.bin", 2); + video_load_font("roms/machines/t1000/t1000font.bin", FONT_FORMAT_CGA, LOAD_FONT_NO_OFFSET); /* Map the EMS page frame */ for (uint8_t pg = 0; pg < 4; pg++) { diff --git a/src/network/network.c b/src/network/network.c index 3f854f356..8680d6c64 100644 --- a/src/network/network.c +++ b/src/network/network.c @@ -52,9 +52,7 @@ #include #include #include -#ifndef _MSC_VER #include -#endif #include #define HAVE_STDARG_H #include <86box/86box.h> diff --git a/src/qt/dummy_cdrom_ioctl.c b/src/qt/dummy_cdrom_ioctl.c index af8679ecc..9b7a8bfbf 100644 --- a/src/qt/dummy_cdrom_ioctl.c +++ b/src/qt/dummy_cdrom_ioctl.c @@ -24,6 +24,7 @@ #include #include #define HAVE_STDARG_H +#include <86box/86box.h> #include <86box/scsi_device.h> #include <86box/cdrom.h> #include <86box/log.h> diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po new file mode 100644 index 000000000..75e0a593d --- /dev/null +++ b/src/qt/languages/ca-ES.po @@ -0,0 +1,3001 @@ +msgid "" +msgstr "" +"PO-Revision-Date: 2025-11-29 00:34+0000\n" +"Last-Translator: OBattler \n" +"Language-Team: Catalan \n" +"Language: ca-ES\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.12.2\n" +"X-Language: ca_ES\n" +"X-Source-Language: en_US\n" + +msgid "&Action" +msgstr "&Acció" + +msgid "&Keyboard requires capture" +msgstr "&Teclat requereix captura" + +msgid "&Right CTRL is left ALT" +msgstr "CTRL &dret és ALT esquerre" + +msgid "&Hard reset" +msgstr "&Reiniciació completa" + +msgid "&Ctrl+Alt+Del" +msgstr "&Ctrl+Alt+Supr" + +msgid "Ctrl+Alt+&Esc" +msgstr "Ctrl+Alt+&Esc" + +msgid "&Pause" +msgstr "&Pausa" + +msgid "Pause" +msgstr "Pausa" + +msgid "Re&sume" +msgstr "Re&prendre" + +msgid "E&xit" +msgstr "&Surt" + +msgid "&View" +msgstr "&Visualitza" + +msgid "&Hide status bar" +msgstr "&Amaga la barra d'estat" + +msgid "Hide &toolbar" +msgstr "Amaga la &barra d'eines" + +msgid "&Resizeable window" +msgstr "Fi&nestra redimensionable" + +msgid "R&emember size && position" +msgstr "&Recorda grandària i posició" + +msgid "Remember size && position" +msgstr "Recorda grandària i posició" + +msgid "Re&nderer" +msgstr "Re&nderitzador" + +msgid "&Qt (Software)" +msgstr "&Qt (Programari)" + +msgid "Open&GL (3.0 Core)" +msgstr "Open&GL (3.0 Core)" + +msgid "&VNC" +msgstr "&VNC" + +msgid "Specify &dimensions…" +msgstr "E&specifica dimensions…" + +msgid "Force &4:3 display ratio" +msgstr "Força ràtio de visualització &4:3" + +msgid "&Window scale factor" +msgstr "&Factor de escalat de finestra" + +msgid "&0.5x" +msgstr "&0.5x" + +msgid "&1x" +msgstr "&1x" + +msgid "1.&5x" +msgstr "1.&5x" + +msgid "&2x" +msgstr "&2x" + +msgid "&3x" +msgstr "&3x" + +msgid "&4x" +msgstr "&4x" + +msgid "&5x" +msgstr "&5x" + +msgid "&6x" +msgstr "&6x" + +msgid "&7x" +msgstr "&7x" + +msgid "&8x" +msgstr "&8x" + +msgid "Fi<er method" +msgstr "&Mètode de filtració" + +msgid "&Nearest" +msgstr "&Més a prop" + +msgid "&Linear" +msgstr "&Lineal" + +msgid "Hi&DPI scaling" +msgstr "&Escalat alta densitat" + +msgid "&Fullscreen" +msgstr "&Pantalla sencera" + +msgid "Fullscreen &stretch mode" +msgstr "M&odalitat de estirament en la pantalla sencera" + +msgid "&Full screen stretch" +msgstr "&Estirament en la pantalla sencera" + +msgid "&4:3" +msgstr "&4:3" + +msgid "&Square pixels (Keep ratio)" +msgstr "&Píxels quadrats (Mantenir ràtio)" + +msgid "&Integer scale" +msgstr "&Escalat de valor enter" + +msgid "4:&3 Integer scale" +msgstr "Escalat de valor enter 4:&3" + +msgid "EGA/(S)&VGA settings" +msgstr "Configuració EGA/(S)&VGA" + +msgid "&Inverted VGA monitor" +msgstr "&Monitor VGA invertit" + +msgid "VGA screen &type" +msgstr "&Tipus de pantalla VGA" + +msgid "RGB &Color" +msgstr "&Colors RGB" + +msgid "RGB (no brown)" +msgstr "RGB (sense marró)" + +msgid "&RGB Grayscale" +msgstr "&RGB en escala de grisos" + +msgid "Generic RGBI color monitor" +msgstr "Monitor RGBI genèric a color" + +msgid "&Amber monitor" +msgstr "Monitor ambr&e" + +msgid "&Green monitor" +msgstr "Monitor &verd" + +msgid "&White monitor" +msgstr "Monitor &blanc" + +msgid "Grayscale &conversion type" +msgstr "Tipus de &conversió a l'escala de grisos" + +msgid "BT&601 (NTSC/PAL)" +msgstr "BT&601 (NTSC/PAL)" + +msgid "BT&709 (HDTV)" +msgstr "BT&709 (HDTV)" + +msgid "&Average" +msgstr "&Mitja" + +msgid "CGA/PCjr/Tandy/E&GA/(S)VGA overscan" +msgstr "Overscan de CGA/PCjr/Tandy/E&GA/(S)VGA" + +msgid "Change contrast for &monochrome display" +msgstr "Canvia contrast per a la pantalla &monocromàtica" + +msgid "&Media" +msgstr "&Mitjans" + +msgid "&Tools" +msgstr "&Eines" + +msgid "&Settings…" +msgstr "&Configuració…" + +msgid "Settings…" +msgstr "Configuració…" + +msgid "&Update status bar icons" +msgstr "&Actualitza icones a la barra d'estat" + +msgid "Take s&creenshot" +msgstr "Desa captura de &pantalla" + +msgid "S&ound" +msgstr "S&o" + +msgid "&Preferences…" +msgstr "&Preferències…" + +msgid "Enable &Discord integration" +msgstr "Activa integració amb D&iscord" + +msgid "Sound &gain…" +msgstr "&Guany de so…" + +msgid "Begin trace" +msgstr "Inicia el rastreig" + +msgid "End trace" +msgstr "Acaba el rastreig" + +msgid "&Help" +msgstr "Aj&uda" + +msgid "&Documentation…" +msgstr "&Documentació…" + +msgid "&About 86Box…" +msgstr "&Quant al 86Box…" + +msgid "&New image…" +msgstr "&Nova imatge…" + +msgid "&Existing image…" +msgstr "Imatge &existent…" + +msgid "Existing image (&Write-protected)…" +msgstr "Imatge existent (&Protegit d'escriptura)…" + +msgid "&Record" +msgstr "&Enregistra" + +msgid "&Play" +msgstr "&Reprodueix" + +msgid "&Rewind to the beginning" +msgstr "&Rebobina a l'inici" + +msgid "&Fast forward to the end" +msgstr "&Avança ràpid al final" + +msgid "E&ject" +msgstr "E&xpolsa" + +msgid "&Image…" +msgstr "&Imatge…" + +msgid "E&xport to 86F…" +msgstr "E&xporta a 86F…" + +msgid "&Mute" +msgstr "&Silencia" + +msgid "E&mpty" +msgstr "&CDROM buit" + +msgid "Reload previous image" +msgstr "Recarrega imatge prèvia" + +msgid "&Folder…" +msgstr "&Carpeta…" + +msgid "Preferences" +msgstr "Preferències" + +msgid "Sound Gain" +msgstr "Guany de so" + +msgid "New Image" +msgstr "Nova imatge" + +msgid "Settings" +msgstr "Configuració" + +msgid "Specify Main Window Dimensions" +msgstr "Especifica dimensions de la finestra principal" + +msgid "OK" +msgstr "D'acord" + +msgid "Cancel" +msgstr "Anuŀla" + +msgid "&Default" +msgstr "&Per defecte" + +msgid "Language:" +msgstr "Idioma:" + +msgid "Gain" +msgstr "Guany" + +msgid "File name:" +msgstr "Nom de fitxer:" + +msgid "Disk size:" +msgstr "Mida del disc:" + +msgid "RPM mode:" +msgstr "Modalitat RPM:" + +msgid "Progress:" +msgstr "Progrés:" + +msgid "Width:" +msgstr "Amplada:" + +msgid "Height:" +msgstr "Alçada:" + +msgid "Lock to this size" +msgstr "Fixa a aquesta grandària" + +msgid "Machine type:" +msgstr "Tipus de màquina:" + +msgid "Machine:" +msgstr "Màquina:" + +msgid "Configure" +msgstr "Configura" + +msgid "CPU:" +msgstr "Processador:" + +msgid "CPU type:" +msgstr "Tipus del CPU:" + +msgid "Speed:" +msgstr "Velocitat:" + +msgid "Frequency:" +msgstr "Freqüència:" + +msgid "FPU:" +msgstr "FPU:" + +msgid "Wait states:" +msgstr "Estats de espera:" + +msgid "MB" +msgstr "MB" + +msgid "Memory:" +msgstr "Memòria:" + +msgid "Time synchronization" +msgstr "Sincronització de l'hora" + +msgid "Disabled" +msgstr "Desactivat" + +msgid "Enabled (local time)" +msgstr "Activat (hora local)" + +msgid "Enabled (UTC)" +msgstr "Activat (UTC)" + +msgid "Dynamic Recompiler" +msgstr "Recompilador dinàmic" + +msgid "CPU frame size" +msgstr "Mida de blocs de la CPU" + +msgid "Larger frames (less smooth)" +msgstr "Blocs més grans (menys suau)" + +msgid "Smaller frames (smoother)" +msgstr "Blocs més petits (més suau)" + +msgid "Video:" +msgstr "Vídeo:" + +msgid "Video #2:" +msgstr "Vídeo 2:" + +msgid "Voodoo 1 or 2 Graphics" +msgstr "Gràfics Voodoo 1 o 2" + +msgid "IBM 8514/A Graphics" +msgstr "Gràfics IBM 8514/A" + +msgid "XGA Graphics" +msgstr "Gràfics XGA" + +msgid "IBM PS/55 Display Adapter Graphics" +msgstr "Adaptador de gràfics de pantalla IBM PS/55" + +msgid "Keyboard:" +msgstr "Teclat:" + +msgid "Keyboard" +msgstr "Teclat" + +msgid "Mouse:" +msgstr "Ratolí:" + +msgid "Mouse" +msgstr "Ratolí" + +msgid "Joystick:" +msgstr "Comandament:" + +msgid "Joystick" +msgstr "Joystick" + +msgid "Joystick 1…" +msgstr "Joystick 1…" + +msgid "Joystick 2…" +msgstr "Joystick 2…" + +msgid "Joystick 3…" +msgstr "Joystick 3…" + +msgid "Joystick 4…" +msgstr "Joystick 4…" + +msgid "Sound card #1:" +msgstr "Targeta de so núm. 1:" + +msgid "Sound card #2:" +msgstr "Targeta de so núm. 2:" + +msgid "Sound card #3:" +msgstr "Targeta de so núm. 3:" + +msgid "Sound card #4:" +msgstr "Targeta de so núm. 4:" + +msgid "MIDI Out Device:" +msgstr "Dispositiu MIDI de sortida:" + +msgid "MIDI In Device:" +msgstr "Dispositiu MIDI d'entrada:" + +msgid "MIDI Out:" +msgstr "Sortida MIDI:" + +msgid "Standalone MPU-401" +msgstr "MPU-401 independent" + +msgid "Use FLOAT32 sound" +msgstr "Utilitza so FLOAT32" + +msgid "FM synth driver" +msgstr "Manejador de síntesi FM" + +msgid "Nuked (more accurate)" +msgstr "Nuked (més precís)" + +msgid "YMFM (faster)" +msgstr "YMFM (més ràpid)" + +msgid "COM1 Device:" +msgstr "Dispositiu COM1:" + +msgid "COM2 Device:" +msgstr "Dispositiu COM2:" + +msgid "COM3 Device:" +msgstr "Dispositiu COM3:" + +msgid "COM4 Device:" +msgstr "Dispositiu COM4:" + +msgid "LPT1 Device:" +msgstr "Dispositiu LPT1:" + +msgid "LPT2 Device:" +msgstr "Dispositiu LPT2:" + +msgid "LPT3 Device:" +msgstr "Dispositiu LPT3:" + +msgid "LPT4 Device:" +msgstr "Dispositiu LPT4:" + +msgid "Internal LPT ECP DMA:" +msgstr "DMA de ECP de l'LPT intern:" + +msgid "Serial port 1" +msgstr "Port sèrie 1" + +msgid "Serial port 2" +msgstr "Port sèrie 2" + +msgid "Serial port 3" +msgstr "Port sèrie 3" + +msgid "Serial port 4" +msgstr "Port sèrie 4" + +msgid "Parallel port 1" +msgstr "Port paralel 1" + +msgid "Parallel port 2" +msgstr "Port paralel 2" + +msgid "Parallel port 3" +msgstr "Port paralel 3" + +msgid "Parallel port 4" +msgstr "Port paralel 4" + +msgid "Floppy disk controller:" +msgstr "Controladora de disquets:" + +msgid "CD-ROM controller:" +msgstr "Controladora de CD-ROM:" + +msgid "[ISA16] Tertiary IDE Controller" +msgstr "[ISA16] Controlador IDE terciari" + +msgid "[ISA16] Quaternary IDE Controller" +msgstr "[ISA16] Controlador IDE quaternari" + +msgid "Hard disk controllers" +msgstr "Controladores de disc dur" + +msgid "SCSI controllers" +msgstr "Controladores SCSI" + +msgid "Controller 1:" +msgstr "Controladora 1:" + +msgid "Controller 2:" +msgstr "Controladora 2:" + +msgid "Controller 3:" +msgstr "Controladora 3:" + +msgid "Controller 4:" +msgstr "Controladora 4:" + +msgid "Cassette" +msgstr "Cinta" + +msgid "Hard disks:" +msgstr "Discs durs:" + +msgid "Firmware Version" +msgstr "Versió del firmware" + +msgid "&New…" +msgstr "&Nou…" + +msgid "&Existing…" +msgstr "&Existent…" + +msgid "&Remove" +msgstr "&Suprimir" + +msgid "Bus:" +msgstr "Bus:" + +msgid "Channel:" +msgstr "Canal:" + +msgid "ID:" +msgstr "ID:" + +msgid "Sectors:" +msgstr "Sectors:" + +msgid "Heads:" +msgstr "Cabeçals:" + +msgid "Cylinders:" +msgstr "Cilindres:" + +msgid "Size (MB):" +msgstr "Mida (MB):" + +msgid "Type:" +msgstr "Tipus:" + +msgid "Image Format:" +msgstr "Format d'imatge:" + +msgid "Block Size:" +msgstr "Mida de bloc:" + +msgid "Floppy drives:" +msgstr "Unitats de disquet:" + +msgid "Turbo timings" +msgstr "Velocitat turbo" + +msgid "Check BPB" +msgstr "Verificar BPB" + +msgid "CD-ROM drives:" +msgstr "Unitats de CD-ROM:" + +msgid "MO drives:" +msgstr "Unitats MO:" + +msgid "MO:" +msgstr "MO:" + +msgid "Removable disks:" +msgstr "Discs extraïbles:" + +msgid "Removable disk drives:" +msgstr "Unitats de disc extraïble:" + +msgid "ZIP 250" +msgstr "ZIP 250" + +msgid "ISA RTC:" +msgstr "ISA RTC:" + +msgid "ISA Memory Expansion" +msgstr "Expansió de memòria ISA" + +msgid "ISA ROM Cards" +msgstr "Targetes ROM ISA" + +msgid "Card 1:" +msgstr "Targeta 1:" + +msgid "Card 2:" +msgstr "Targeta 2:" + +msgid "Card 3:" +msgstr "Targeta 3:" + +msgid "Card 4:" +msgstr "Targeta 4:" + +msgid "Generic ISA ROM Board" +msgstr "Targeta ROM ISA genèrica" + +msgid "Generic Dual ISA ROM Board" +msgstr "Targeta ROM ISA genèrica doble" + +msgid "Generic Quad ISA ROM Board" +msgstr "Targeta ROM ISA genèrica quàdruple" + +msgid "ISABugger device" +msgstr "Dispositiu ISABugger" + +msgid "POST card" +msgstr "Targeta POST" + +msgid "Error" +msgstr "Error" + +msgid "Fatal error" +msgstr "Error fatal" + +msgid " - PAUSED" +msgstr " - EN PAUSA" + +msgid "Speed" +msgstr "Velocitat" + +msgid "Removable disk %1 (%2): %3" +msgstr "Disc extraïble %1 (%2): %3" + +msgid "&Removable disk %1 (%2): %3" +msgstr "&Disc extraïble %1 (%2): %3" + +msgid "Removable disk images" +msgstr "Imatges de disc extraïble" + +msgid "Image %1" +msgstr "Imatge %1" + +msgid "86Box could not find any usable ROM images.\n\nPlease download a ROM set and extract it into the \"roms\" directory." +msgstr "El 86Box no ha pogut trobar cap de imatge ROM utilitzable.\n\nSi us plau, descarregueu un conjunt de ROMs i extraieu-les al directori \"roms\"." + +msgid "(empty)" +msgstr "(buit)" + +msgid "All files" +msgstr "Tots els fitxers" + +msgid "Turbo" +msgstr "Turbo" + +msgid "On" +msgstr "Activat" + +msgid "Off" +msgstr "Desactivat" + +msgid "All images" +msgstr "Totes les imatges" + +msgid "Basic sector images" +msgstr "Imatges bàsiques de sector" + +msgid "Surface images" +msgstr "Imatges de superfície" + +msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." +msgstr "La màquina \"%hs\" no està disponible a causa de les ROMs faltants al directori roms/machines. Canviant a una màquina disponible." + +msgid "Video card \"%hs\" is not available due to missing ROMs in the roms/video directory. Switching to an available video card." +msgstr "La tarjeta de vídeo \"%hs\" no està disponible a causa de les ROMs faltants al directori roms/video. Canviant a una tarjeta de video disponible." + +msgid "Video card #2 \"%hs\" is not available due to missing ROMs in the roms/video directory. Disabling the second video card." +msgstr "La tarjeta de vídeo 2 \"%hs\" no està disponible a causa de les ROMs faltants al directori roms/video. Desactivant la segona targeta de vídeo." + +msgid "Device \"%hs\" is not available due to missing ROMs. Ignoring the device." +msgstr "El dispositiu \"%hs\" no està disponible a causa de les ROMs faltants. Ignorant el dispositiu." + +msgid "Machine" +msgstr "Màquina" + +msgid "Display" +msgstr "Pantalla" + +msgid "Input devices" +msgstr "Dispositius de entrada" + +msgid "Sound" +msgstr "So" + +msgid "Network" +msgstr "Xarxa" + +msgid "Ports (COM & LPT)" +msgstr "Ports (COM i LPT)" + +msgid "Ports" +msgstr "Ports" + +msgid "Serial ports:" +msgstr "Ports sèrie:" + +msgid "Parallel ports:" +msgstr "Puerts paralels:" + +msgid "Storage controllers" +msgstr "Controladors de emmagatzematge" + +msgid "Hard disks" +msgstr "Discs durs" + +msgid "Disks:" +msgstr "Discs:" + +msgid "Floppy:" +msgstr "Disquet:" + +msgid "Controllers:" +msgstr "Controladors:" + +msgid "Floppy & CD-ROM drives" +msgstr "Disquets i unitats de CD-ROM" + +msgid "Other removable devices" +msgstr "Altres dispositius extraïbles" + +msgid "Other peripherals" +msgstr "Altres perifèrics" + +msgid "Other devices" +msgstr "Altres dispositius" + +msgid "Click to capture mouse" +msgstr "Feu clic per capturar el ratolí" + +msgid "Press %1 to release mouse" +msgstr "Premeu %1 per alliberar el ratolí" + +msgid "Press %1 or middle button to release mouse" +msgstr "Premeu %1 o bé el botó central per alliberar el ratolí" + +msgid "Bus" +msgstr "Bus" + +msgid "File" +msgstr "Fitxer" + +msgid "C" +msgstr "C" + +msgid "H" +msgstr "H" + +msgid "S" +msgstr "S" + +msgid "KB" +msgstr "KB" + +msgid "Default" +msgstr "Per defecte" + +msgid "%1 Wait state(s)" +msgstr "%1 estat(s) de espera" + +msgid "Type" +msgstr "Tipus" + +msgid "No PCap devices found" +msgstr "No s'ha trobat cap dispositiu PCap" + +msgid "Invalid PCap device" +msgstr "Dispositiu PCap invàlid" + +msgid "Generic paddle controller(s)" +msgstr "Controlador(s) de rem genèric(s)" + +msgid "2-axis, 1-button joystick(s)" +msgstr "Joystick(s) de 2 eixos, 1 botons" + +msgid "2-axis, 2-button joystick(s)" +msgstr "Joystick(s) de 2 eixos, 2 botons" + +msgid "2-axis, 3-button joystick" +msgstr "Joystick de 2 eixos, 3 botons" + +msgid "2-axis, 4-button joystick" +msgstr "Joystick de 2 eixos, 4 botons" + +msgid "2-axis, 6-button joystick" +msgstr "Joystick de 2 eixos, 6 botons" + +msgid "2-axis, 8-button joystick" +msgstr "Joystick de 2 eixos, 8 botons" + +msgid "3-axis, 2-button joystick" +msgstr "Joystick de 3 eixos, 2 botons" + +msgid "3-axis, 3-button joystick" +msgstr "Joystick de 3 eixos, 3 botons" + +msgid "3-axis, 4-button joystick" +msgstr "Joystick de 3 eixos, 4 botons" + +msgid "4-axis, 2-button joystick" +msgstr "Joystick de 4 eixos, 2 botons" + +msgid "4-axis, 3-button joystick" +msgstr "Joystick de 4 eixos, 3 botons" + +msgid "4-axis, 4-button joystick" +msgstr "Joystick de 4 eixos, 4 botons" + +msgid "2-button gamepad(s)" +msgstr "Comandament(s) de joc de 2 botons" + +msgid "3-button gamepad" +msgstr "Comandament de joc de 3 botons" + +msgid "4-button gamepad" +msgstr "Comandament de joc de 4 botons" + +msgid "6-button gamepad" +msgstr "Comandament de joc de 6 botons" + +msgid "2-button flight yoke" +msgstr "Volant d'avió de 2 botons" + +msgid "3-button flight yoke" +msgstr "Volant d'avió de 3 botons" + +msgid "4-button flight yoke" +msgstr "Volant d'avió de 4 botons" + +msgid "2-button flight yoke with throttle" +msgstr "Volant d'avió de 2 botones amb accelerador" + +msgid "3-button flight yoke with throttle" +msgstr "Volant d'avió de 3 botones amb accelerador" + +msgid "4-button flight yoke with throttle" +msgstr "Volant d'avió de 4 botones amb accelerador" + +msgid "Steering wheel (3-axis, 2-button)" +msgstr "Volant (de 3 eixos, 2 botons)" + +msgid "Steering wheel (3-axis, 3-button)" +msgstr "Volant (de 3 eixos, 3 botons)" + +msgid "Steering wheel (3-axis, 4-button)" +msgstr "Volant (de 3 eixos, 4 botons)" + +msgid "Thrustmaster Formula T1/T2 with adapter" +msgstr "Thrustmaster Formula T1/T2 amb adaptador" + +msgid "Thrustmaster Formula T1/T2 without adapter" +msgstr "Thrustmaster Formula T1/T2 sense adaptador" + +msgid "None" +msgstr "Cap" + +msgid "%1 MB (CHS: %2, %3, %4)" +msgstr "%1 MB (CHS: %2, %3, %4)" + +msgid "Floppy %1 (%2): %3" +msgstr "Disquet %1 (%2): %3" + +msgid "&Floppy %1 (%2): %3" +msgstr "&Disquet %1 (%2): %3" + +msgid "Advanced sector images" +msgstr "Imatges avançades de sector" + +msgid "Flux images" +msgstr "Imatges de fluix" + +msgid "Are you sure you want to hard reset the emulated machine?" +msgstr "Esteu segurs de que voleu fer una reinicialització completa de la màquina emulada?" + +msgid "Are you sure you want to exit 86Box?" +msgstr "Esteu segurs de que voleu tancar al 86Box?" + +msgid "Unable to initialize Ghostscript" +msgstr "No fou possible inicialitzar el Ghostscript" + +msgid "Unable to initialize GhostPCL" +msgstr "No fou possible inicialitzar el GhostPCL" + +msgid "MO %1 (%2): %3" +msgstr "MO %1 (%2): %3" + +msgid "&MO %1 (%2): %3" +msgstr "&MO %1 (%2): %3" + +msgid "MO images" +msgstr "Imatges de MO" + +msgid "Welcome to 86Box!" +msgstr "Benvinguts al 86Box!" + +msgid "Internal device" +msgstr "Dispositiu intern" + +msgid "&File" +msgstr "&Fitxer" + +msgid "&New machine…" +msgstr "&Nova màquina…" + +msgid "New machine…" +msgstr "Nova màquina…" + +msgid "New machine" +msgstr "Nova màquina" + +msgid "&Check for updates…" +msgstr "&Comprova actualitzacions…" + +msgid "Exit" +msgstr "Sortir" + +msgid "No ROMs found" +msgstr "No s'han trobat ROMs" + +msgid "Do you want to save the settings?" +msgstr "Voleu desar les configuracions?" + +msgid "This will hard reset the emulated machine." +msgstr "Això causarà una reinicialització completa de la màquina emulada." + +msgid "Save" +msgstr "Desa" + +msgid "About %1" +msgstr "Quant al %1" + +msgid "An emulator of old computers\n\nAuthors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, and others.\n\nWith previous core contributions from Sarah Walker, leilei, JohnElliott, greatpsycho, and others.\n\nReleased under the GNU General Public License version 2 or later. See LICENSE for more information." +msgstr "Un emulador d'ordinadors antics\n\nAutors: Miran Grča (OBattler), RichardG867, Jasmine Iwanek, TC1995, coldbrewed, Teemu Korhonen (Manaatti), Joakim L. Gilje, Adrien Moulin (elyosh), Daniel Balsom (gloriouscow), Cacodemon345, Fred N. van Kempen (waltje), Tiseno100, reenigne, i altres.\n\nAmb contribucions anteriors de Sarah Walker, leilei, JohnElliott, greatpsycho i altres.\n\nPublicat sota la GNU General Public License versió 2 o posterior. Veieu LICENSE per a més informació." + +msgid "Hardware not available" +msgstr "Equip no disponible" + +msgid "Make sure %1 is installed and that you are on a %1-compatible network connection." +msgstr "Assegureu-vos de que %1 està instal·lat i de que esteu en una connexió de xarxa compatible amb %1." + +msgid "Invalid configuration" +msgstr "Configuració invàlida" + +msgid "%1 is required for automatic conversion of PostScript files to PDF.\n\nAny documents sent to the generic PostScript printer will be saved as PostScript (.ps) files." +msgstr "%1 és imprescindible per la conversió automàtica de fitxers PostScript a PDF.\n\nQualsevol document enviat a la impressora genèrica PostScript es desarà com a fitxer PostScript (.ps)." + +msgid "%1 is required for automatic conversion of PCL files to PDF.\n\nAny documents sent to the generic PCL printer will be saved as Printer Command Language (.pcl) files." +msgstr "%1 és imprescindible per la conversió automàtica de fitxers PCL a PDF.\n\nQualsevol document enviat a la impressora genèrica PCL es desarà com a fitxer Printer Command Language (.pcl)." + +msgid "Don't show this message again" +msgstr "No tornis a mostrar aquest missatge" + +msgid "Don't exit" +msgstr "No sortir" + +msgid "Reset" +msgstr "Reinicialitza" + +msgid "Don't reset" +msgstr "No reinicialitzis" + +msgid "CD-ROM images" +msgstr "Imatges de CD-ROM" + +msgid "%1 Device Configuration" +msgstr "Configuració de dispositiu %1" + +msgid "Monitor in sleep mode" +msgstr "Monitor en suspens" + +msgid "GLSL shaders" +msgstr "Shaders GLSL" + +msgid "You are loading an unsupported configuration" +msgstr "Esteu carregant una configuració no suportada" + +msgid "CPU type filtering based on selected machine is disabled for this emulated machine.\n\nThis makes it possible to choose a CPU that is otherwise incompatible with the selected machine. However, you may run into incompatibilities with the machine BIOS or other software.\n\nEnabling this setting is not officially supported and any bug reports filed may be closed as invalid." +msgstr "La filtració del tipus de CPU basat en la màquina sel·leccionada està desactivada per a aquesta màquina.\n\nAixò fa possible sel·leccionar una CPU que sigui incompatible amb aquesta màquina. Tanmateix, poden aparèixer incompatibilitats amb la BIOS de la màquina o altres programes.\n\nActivar esta configuració no està oficialment suportat i qualsevol report de error pot ser tancat com a invàlid." + +msgid "Continue" +msgstr "Continua" + +msgid "Cassette: %1" +msgstr "Cinta: %1" + +msgid "C&assette: %1" +msgstr "C&inta: %1" + +msgid "Cassette images" +msgstr "Imatges de cinta" + +msgid "Cartridge %1: %2" +msgstr "Cartutx %1: %2" + +msgid "Car&tridge %1: %2" +msgstr "Car&tutx %1: %2" + +msgid "Cartridge images" +msgstr "Imatges de cartutx" + +msgid "Resume execution" +msgstr "Reprendre la execució" + +msgid "Pause execution" +msgstr "Metre en pausa la execució" + +msgid "Ctrl+Alt+Del" +msgstr "Ctrl+Alt+Del" + +msgid "Press Ctrl+Alt+Del" +msgstr "Prémer Ctrl+Alt+Supr" + +msgid "Press Ctrl+Alt+Esc" +msgstr "Prémer Ctrl+Alt+Esc" + +msgid "Hard reset" +msgstr "Reiniciació completa" + +msgid "Force shutdown" +msgstr "Apagada forçada" + +msgid "Start" +msgstr "Inicia" + +msgid "&Force shutdown" +msgstr "&Apagada forçada" + +msgid "&Start" +msgstr "&Inicir" + +msgid "Not running" +msgstr "No en execució" + +msgid "Running" +msgstr "En exeució" + +msgid "Paused" +msgstr "En pausa" + +msgid "Waiting" +msgstr "En espera" + +msgid "Powered Off" +msgstr "Apagat" + +msgid "%n running" +msgstr "%n en execució" + +msgid "%n paused" +msgstr "%n en pausa" + +msgid "%n waiting" +msgstr "%n en espera" + +msgid "%1 total" +msgstr "%1 total" + +msgid "VMs: %1" +msgstr "MV: %1" + +msgid "System Directory:" +msgstr "Directori del sistema:" + +msgid "Choose directory" +msgstr "Escollir directori" + +msgid "Choose configuration file" +msgstr "Escollir fitxer de configuració" + +msgid "86Box configuration files (86box.cfg)" +msgstr "Fitxers de configuració de 86Box (86box.cfg)" + +msgid "Configuration read failed" +msgstr "Error en llegir la configuració" + +msgid "Unable to open the selected configuration file for reading: %1" +msgstr "No fou possible obrir el fitxer de configuració seleccionat per llegir: %1" + +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 "Add new system wizard" +msgstr "Auxiliar d'addició de un nou sistema" + +msgid "Introduction" +msgstr "Introducció" + +msgid "This will help you add a new system to 86Box." +msgstr "Aquest us ajudará a afegir un nou sistema al 86Box." + +msgid "New configuration" +msgstr "Nova configuració" + +msgid "Complete" +msgstr "Completar" + +msgid "The wizard will now launch the configuration for the new system." +msgstr "L'auxiliar ara executarà la configuració pel nou sistema." + +msgid "Use existing configuration" +msgstr "Utilitza una configuració existent" + +msgid "Type some notes here" +msgstr "Escriviu algunes notes aquí" + +msgid "Paste the contents of the existing configuration file into the box below." +msgstr "Enganxa el contingut del fitxer de configuració existent en la caixa de sota." + +msgid "Load configuration from file" +msgstr "Carrega la configuració a partir d'un fitxer" + +msgid "System name" +msgstr "Nom del sistema" + +msgid "System name:" +msgstr "Nom del sistema:" + +msgid "System name cannot contain certain characters" +msgstr "El nom del sistema no pot contenir alguns caràcters" + +msgid "System name already exists" +msgstr "El nom del sistema ja existeix" + +msgid "Please enter a directory for the system" +msgstr "Si us plau, escriviu un directori per el sistema" + +msgid "Directory does not exist" +msgstr "El directori no existeix" + +msgid "A new directory for the system will be created in the selected directory above" +msgstr "Un nou directori per al sistema serà creat en el directori escollit a dalt" + +msgid "System location:" +msgstr "Ubicació del sistema:" + +msgid "System name and location" +msgstr "Nom i ubicació del sistema" + +msgid "Enter the name of the system and choose the location" +msgstr "Escriviu el nom del sistema i escolliu la ubicació" + +msgid "Enter the name of the system" +msgstr "Escriviu el nome del sistema" + +msgid "Please enter a system name" +msgstr "Si us plau, escriviu un nom del sistema" + +msgid "Display name (optional):" +msgstr "Nom mostrat (optatiu):" + +msgid "Display name:" +msgstr "Nom mostrat:" + +msgid "Set display name" +msgstr "Establir nom mostrat" + +msgid "Enter the new display name (blank to reset)" +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…" + +msgid "Open p&rinter tray…" +msgstr "Obre safata de la &impressora…" + +msgid "Set &icon…" +msgstr "Estableix &icona…" + +msgid "Select an icon" +msgstr "Tria una icona" + +msgid "C&lone…" +msgstr "C&lona…" + +msgid "Virtual machine \"%1\" (%2) will be cloned into:" +msgstr "La màquina virtual \"%1\" (%2) serà clonada a:" + +msgid "Directory %1 already exists" +msgstr "El directori %1 ja existeix" + +msgid "You cannot use the following characters in the name: %1" +msgstr "No es pot utilitzar els seguints caràcters en el nom: %1" + +msgid "Clone" +msgstr "Clona" + +msgid "Failed to create directory for cloned VM" +msgstr "Error en crear el directori per a la MV clonada" + +msgid "Failed to clone VM." +msgstr "Error en clonar la VM." + +msgid "Directory in use" +msgstr "Directori en ús" + +msgid "The selected directory is already in use. Please select a different directory." +msgstr "El directori escollit ja està en ùs. Si us plau, escolliu un altre directori." + +msgid "Create directory failed" +msgstr "Error en crear el directori" + +msgid "Unable to create the directory for the new system" +msgstr "No fou possible crear el directori pel nou sistema" + +msgid "Configuration write failed" +msgstr "Error en escriure la configuració" + +msgid "Unable to open the configuration file at %1 for writing" +msgstr "No fou possible obrir el fitxer de configuració en %1 per escriure" + +msgid "Error adding system" +msgstr "Error en afegir el sistema" + +msgid "Remove directory failed" +msgstr "Error en suprimir el directori" + +msgid "Some files in the machine's directory were unable to be deleted. Please delete them manually." +msgstr "No fou possible suprimir alguns fitxers al directori de la màquina. Si us plau, suprimiu-los manualment." + +msgid "Build" +msgstr "Compilació" + +msgid "Version" +msgstr "Versió" + +msgid "An update to 86Box is available: %1 %2" +msgstr "Està disponible una actualització pel 86Box: %1 %2" + +msgid "An error has occurred while checking for updates: %1" +msgstr "S'ha produït un error en verificar les actualitzacions: %1" + +msgid "An update to 86Box is available!" +msgstr "Una actualització pel 86Box està disponible!" + +msgid "Warning" +msgstr "Atenció" + +msgid "&Kill" +msgstr "&Finalitza forçosament" + +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 "Finalitzar forçosament la màquina virtual pot causar la pèrdua de dades. Només feu-ho si el procés del 86Box s'ha blocat.\n\n¿Realment voleu finalitzar forçosament la màquina virtual \"%1\"?" + +msgid "&Delete" +msgstr "&Suprimir" + +msgid "Do you really want to delete the virtual machine \"%1\" and all its files? This action cannot be undone!" +msgstr "Realment voleu suprimir la màquina virtual \"%1\" i tots els seus fitxers? Aquesta acció no es pot desfer!" + +msgid "Show &config file" +msgstr "Mostra fitxer de &configuració" + +msgid "No screenshot" +msgstr "Sense captures de pantalla" + +msgid "Search" +msgstr "Cerca" + +msgid "Searching for VMs…" +msgstr "Cerca per MV…" + +msgid "Found %1" +msgstr "%1 trobada" + +msgid "System" +msgstr "Sistema" + +msgid "Storage" +msgstr "Emmagatzematge" + +msgid "Disk %1:" +msgstr "Disc %1:" + +msgid "No disks" +msgstr "Sense disc" + +msgid "Audio" +msgstr "So" + +msgid "Audio:" +msgstr "So:" + +msgid "ACPI shutdown" +msgstr "Apagada ACPI" + +msgid "ACP&I shutdown" +msgstr "Apagada ACP&I" + +msgid "Hard disk (%1)" +msgstr "Disc dur (%1)" + +msgid "MFM/RLL or ESDI CD-ROM drives never existed" +msgstr "Les unitats de CD-ROM MFM/RLL o bé ESDI no han existit" + +msgid "Custom…" +msgstr "Personalitzada…" + +msgid "Custom (large)…" +msgstr "Personalitzada (gran)…" + +msgid "Add New Hard Disk" +msgstr "Afegeix nou disc dur" + +msgid "Add Existing Hard Disk" +msgstr "Afegeix disc dur existent" + +msgid "HDI disk images cannot be larger than 4 GB." +msgstr "Les imatges de disc HDI no poden superar els 4 GB." + +msgid "Disk images cannot be larger than 127 GB." +msgstr "Les imatges de disc no poden superar els 127 GB." + +msgid "Hard disk images" +msgstr "Imatges de disc dur" + +msgid "Unable to read file" +msgstr "No s'ha pogut llegir el fitxer" + +msgid "Unable to write file" +msgstr "No s'ha pogut escriure el fitxer" + +msgid "HDI or HDX images with a sector size other than 512 are not supported." +msgstr "Les imatges HDI o bé HDX amb una mida de sector diferent a 512 no estan suportades." + +msgid "Disk image file already exists" +msgstr "La imatge de disc ja existeix" + +msgid "Please specify a valid file name." +msgstr "Si us plau, especifiqueu un nom de fitxer vàlid." + +msgid "Disk image created" +msgstr "Imatge de disc creada" + +msgid "Make sure the file exists and is readable." +msgstr "Assegureu-vos que el fitxer existeix i és llegible." + +msgid "Make sure the file is being saved to a writable directory." +msgstr "Assegureu-vos que el fitxer s'està desant a un directori amb permís de escirptura." + +msgid "Disk image too large" +msgstr "Imatge de disc massa gran" + +msgid "Remember to partition and format the newly-created drive." +msgstr "Recordeu de particionar i formatar la nova unitat." + +msgid "The selected file will be overwritten. Are you sure you want to use it?" +msgstr "El fitxer triat se sobreescriurà. Esteu segurs de que voleu utilitzar-lo?" + +msgid "Unsupported disk image" +msgstr "Imatge de disc no suportada" + +msgid "Overwrite" +msgstr "Sobreescriu" + +msgid "Don't overwrite" +msgstr "No sobreescriguis" + +msgid "Raw image" +msgstr "Imatge en brut" + +msgid "HDI image" +msgstr "Imatge HDI" + +msgid "HDX image" +msgstr "Imatge HDX" + +msgid "Fixed-size VHD" +msgstr "VHD de mida fixa" + +msgid "Dynamic-size VHD" +msgstr "VHD de mida dinàmica" + +msgid "Differencing VHD" +msgstr "VHD diferencial" + +msgid "(N/A)" +msgstr "(Cap)" + +msgid "Raw image (.img)" +msgstr "Imatge en brut (.img)" + +msgid "HDI image (.hdi)" +msgstr "Imatge HDI (.hdi)" + +msgid "HDX image (.hdx)" +msgstr "Imatge HDX (.hdx)" + +msgid "Fixed-size VHD (.vhd)" +msgstr "VHD de mida fixa (.vhd)" + +msgid "Dynamic-size VHD (.vhd)" +msgstr "VHD de mida dinàmica (.vhd)" + +msgid "Differencing VHD (.vhd)" +msgstr "VHD diferencial (.vhd)" + +msgid "Large blocks (2 MB)" +msgstr "Blocs grans (2 MB)" + +msgid "Small blocks (512 KB)" +msgstr "Blocs petits (512 KB)" + +msgid "VHD files" +msgstr "Fitxers VHD" + +msgid "Select the parent VHD" +msgstr "Escolliu el VHD pare" + +msgid "This could mean that the parent image was modified after the differencing image was created.\n\nIt can also happen if the image files were moved or copied, or by a bug in the program that created this disk.\n\nDo you want to fix the timestamps?" +msgstr "Això podria significar que la imatge pare es va modificar després de que es creés la imatge diferencial.\n\nTambé pot passar si les imatges han sigut mogudes o copiades, o a causa d'un error all programa que va crear aquest disc.\n\nVoleu corregir les marques de temps?" + +msgid "Parent and child disk timestamps do not match" +msgstr "Les marques de temps del pare e fill no coincideixen" + +msgid "Could not fix VHD timestamp." +msgstr "No ha sigut possible corregir la marca de temps del VHD." + +msgid "CD-ROM %1 (%2): %3" +msgstr "CD-ROM %1 (%2): %3" + +msgid "&CD-ROM %1 (%2): %3" +msgstr "&CD-ROM %1 (%2): %3" + +msgid "160 KB" +msgstr "160 KB" + +msgid "180 KB" +msgstr "180 KB" + +msgid "320 KB" +msgstr "320 KB" + +msgid "360 KB" +msgstr "360 KB" + +msgid "640 KB" +msgstr "640 KB" + +msgid "720 KB" +msgstr "720 KB" + +msgid "1.2 MB" +msgstr "1,2 MB" + +msgid "1.25 MB" +msgstr "1,25 MB" + +msgid "1.44 MB" +msgstr "1,44 MB" + +msgid "DMF (cluster 1024)" +msgstr "DMF (clúster 1024)" + +msgid "DMF (cluster 2048)" +msgstr "DMF (clúster 2048)" + +msgid "2.88 MB" +msgstr "2,88 MB" + +msgid "ZIP 100" +msgstr "ZIP 100" + +msgid "3.5\" 128 MB (ISO 10090)" +msgstr "3,5\" 128 MB (ISO 10090)" + +msgid "3.5\" 230 MB (ISO 13963)" +msgstr "3,5\" 230 MB (ISO 13963)" + +msgid "3.5\" 540 MB (ISO 15498)" +msgstr "3,5\" 540 MB (ISO 15498)" + +msgid "3.5\" 640 MB (ISO 15498)" +msgstr "3,5\" 640 MB (ISO 15498)" + +msgid "3.5\" 1.3 GB (GigaMO)" +msgstr "3,5\" 1.3 GB (GigaMO)" + +msgid "3.5\" 2.3 GB (GigaMO 2)" +msgstr "3,5\" 2.3 GB (GigaMO 2)" + +msgid "5.25\" 600 MB" +msgstr "5,25\" 600 MB" + +msgid "5.25\" 650 MB" +msgstr "5,25\" 650 MB" + +msgid "5.25\" 1 GB" +msgstr "5,25\" 1 GB" + +msgid "5.25\" 1.3 GB" +msgstr "5,25\" 1.3 GB" + +msgid "Perfect RPM" +msgstr "RPM perfectes" + +msgid "1% below perfect RPM" +msgstr "1% per sota dels RPM perfectes" + +msgid "1.5% below perfect RPM" +msgstr "1.5% per sota dels RPM perfectes" + +msgid "2% below perfect RPM" +msgstr "2% per sota dels RPM perfectes" + +msgid "(System Default)" +msgstr "(Per defecte del sistema)" + +msgid "Failed to initialize network driver" +msgstr "No fou possible iniciaitzar el controlador de xarxa" + +msgid "The network configuration will be switched to the null driver" +msgstr "La configuració de xarxa es canviarà al controlador nul" + +msgid "Mouse sensitivity:" +msgstr "Sensitivitat del ratolí:" + +msgid "Select media images from program working directory" +msgstr "Trieu imatges de mitjans del directori de treball del programa" + +msgid "PIT mode:" +msgstr "Modalitat PIT:" + +msgid "Auto" +msgstr "Automàtica" + +msgid "Slow" +msgstr "Lenta" + +msgid "Fast" +msgstr "Rápida" + +msgid "&Auto-pause on focus loss" +msgstr "Pa&usa automàtica en perdre el focus" + +msgid "WinBox is no longer supported" +msgstr "El WinBox ja no és suportat" + +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 "El desenvolupament de l'administrador WinBox es va aturar el 2022 per la manca de mantenidors. Com que ara dirigim els nostres esforços a fer 86Box encara millor, hem pres la decisió de no suportar més el WinBox com a administrador.\n\nNo es proporcionaran més actualitzacions a través del WinBox, i podríeu trobar un comportament incorrecte si continua utilitzant amb versions más noves del 86Box. Qualsevol report de error relacionat amb el comportament del WinBox serà tancat com a invàlid.\n\nAneu a 86box.net per a una llista d'altres administradors que podeu utilitzar." + +msgid "Generate" +msgstr "Genera" + +msgid "Joystick configuration" +msgstr "Configuració del joystick" + +msgid "Device" +msgstr "Dispositiu" + +msgid "%1 (X axis)" +msgstr "%1 (eix X)" + +msgid "%1 (Y axis)" +msgstr "%1 (eix Y)" + +msgid "MCA devices" +msgstr "Dispositius MCA" + +msgid "List of MCA devices:" +msgstr "Llista de dispositius MCA:" + +msgid "&Tablet tool" +msgstr "Eina de &tauleta" + +msgid "About &Qt" +msgstr "Quant al &Qt" + +msgid "&MCA devices…" +msgstr "Dispositius MCA…" + +msgid "Show non-&primary monitors" +msgstr "Mostrar monitors no prim&aris" + +msgid "Open screenshots &folder…" +msgstr "Obre la ca&rpeta de captures…" + +msgid "Appl&y fullscreen stretch mode when maximized" +msgstr "&Utilitza estirament de la pantalla sencera en modalitat maximitzada" + +msgid "&Cursor/Puck" +msgstr "&Cursor/Puck" + +msgid "&Pen" +msgstr "&Llapis" + +msgid "&Host CD/DVD Drive (%1:)" +msgstr "&Unitat de CD/DVD de l'amfitrió (%1:)" + +msgid "&Connected" +msgstr "&Connectat" + +msgid "Clear image &history" +msgstr "Esborra &historial d'imatges" + +msgid "Create…" +msgstr "Crea…" + +msgid "Host CD/DVD Drive (%1)" +msgstr "Unitat de CD/DVD de l'amfitrió (%1)" + +msgid "Unknown Bus" +msgstr "Bus desconegut" + +msgid "Null Driver" +msgstr "Controlador nul" + +msgid "NIC:" +msgstr "NIC:" + +msgid "NIC %1 (%2) %3" +msgstr "NIC %1 (%2) %3" + +msgid "&NIC %1 (%2) %3" +msgstr "&NIC %1 (%2) %3" + +msgid "Render behavior" +msgstr "Comportament del renderitzador" + +msgid "Use target framerate:" +msgstr "Utilitza la següent freqüència de fotogrames:" + +msgid " fps" +msgstr " fps" + +msgid "VSync" +msgstr "VSync" + +msgid "Synchronize with video" +msgstr "Sincronitzar amb els gràfics" + +msgid "Shaders" +msgstr "Shaders" + +msgid "Remove" +msgstr "Esborra" + +msgid "Browse…" +msgstr "Navega…" + +msgid "Couldn't create OpenGL context." +msgstr "Impossible de crear el context OpenGL." + +msgid "Couldn't switch to OpenGL context." +msgstr "Impossible de canviar al context OpenGL." + +msgid "OpenGL version 3.0 or greater is required. Current version is %1.%2" +msgstr "Es requereix la versió 3.0 o superior de l'OpenGL. La versió actual és %1.%2" + +msgid "Error initializing OpenGL" +msgstr "Error en inicialitzar l'OpenGL" + +msgid "\nFalling back to software rendering." +msgstr "\nTornant al renderitzat per software." + +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 "

En escollir imatges de mitjans (CD-ROM, disquet, etc.), el quadred de diàleg d'obertura s'iniciarà en el mateix directori que el fitxer de configuració del 86Box. És probable que aquest ajust només farà una diferència en el macOS.

" + +msgid "This machine might have been moved or copied." +msgstr "Aquesta màquina pot haver estat moguda o bé copiada." + +msgid "In order to ensure proper networking functionality, 86Box needs to know if this machine was moved or copied.\n\nSelect \"I Copied It\" if you are not sure." +msgstr "Per garantir la funcionalitat adequada de la xarxa, el 86Box ha de saber si aquesta màquina s'ha mogut o bé copiat.\n\nSi no esteu segurs, escolliu \"La vaig copiar\"." + +msgid "I Moved It" +msgstr "L'he moguda" + +msgid "I Copied It" +msgstr "L'he copiada" + +msgid "86Box Monitor #%1" +msgstr "Monitor del 86Box %1" + +msgid "No MCA devices." +msgstr "Cap dispositiu MCA." + +msgid "MiB" +msgstr "MiB" + +msgid "GiB" +msgstr "GiB" + +msgid "Network Card #1" +msgstr "Targeta de xarxa 1" + +msgid "Network Card #2" +msgstr "Targeta de xarxa 2" + +msgid "Network Card #3" +msgstr "Targeta de xarxa 3" + +msgid "Network Card #4" +msgstr "Targeta de xarxa 4" + +msgid "Mode:" +msgstr "Modalitat:" + +msgid "Interface:" +msgstr "Interfície:" + +msgid "Adapter:" +msgstr "Adaptador:" + +msgid "VDE Socket:" +msgstr "Sòcol VDE:" + +msgid "TAP Bridge Device:" +msgstr "Dispositiu pont TAP:" + +msgid "86Box Unit Tester" +msgstr "Comprovador d'unitats del 86Box" + +msgid "Novell NetWare 2.x Key Card" +msgstr "Targeta de clau per al Novell NetWare 2.x" + +msgid "Serial port passthrough 1" +msgstr "Passatge de port sèrie 1" + +msgid "Serial port passthrough 2" +msgstr "Passatge de port sèrie 2" + +msgid "Serial port passthrough 3" +msgstr "Passatge de port sèrie 3" + +msgid "Serial port passthrough 4" +msgstr "Passatge de port sèrie 4" + +msgid "Renderer &options…" +msgstr "Opc&ions del renderitzador…" + +msgid "PC/XT Keyboard" +msgstr "Teclat PC/XT" + +msgid "AT Keyboard" +msgstr "Teclat AT" + +msgid "AX Keyboard" +msgstr "Teclat AX" + +msgid "PS/2 Keyboard" +msgstr "Teclat PS/2" + +msgid "PS/55 Keyboard" +msgstr "Teclat PS/55" + +msgid "Keys" +msgstr "Tecles" + +msgid "Logitech/Microsoft Bus Mouse" +msgstr "Ratolí de bus Logitech/Microsoft" + +msgid "Microsoft Bus Mouse (InPort)" +msgstr "Ratolí de bus (InPort)" + +msgid "Mouse Systems Serial Mouse" +msgstr "Ratolí sèrie Mouse Systems" + +msgid "Mouse Systems Bus Mouse" +msgstr "Ratolí de bus Mouse Systems" + +msgid "Microsoft Serial Mouse" +msgstr "Ratolí sèrie Microsoft" + +msgid "Microsoft Serial BallPoint" +msgstr "Ratolí sèrie Microsoft BallPoint" + +msgid "Logitech Serial Mouse" +msgstr "Ratolí sèrie Logitech" + +msgid "PS/2 Mouse" +msgstr "Ratolì PS/2" + +msgid "PS/2 QuickPort Mouse" +msgstr "Ratolì PS/2 QuickPort" + +msgid "3M MicroTouch (Serial)" +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 "Roland MT-32 Emulation" +msgstr "Emulació Roland MT-32" + +msgid "Roland MT-32 (New) Emulation" +msgstr "Emulació Roland MT-32 (nou)" + +msgid "Roland CM-32L Emulation" +msgstr "Emulació Roland CM-32L" + +msgid "Roland CM-32LN Emulation" +msgstr "Emulació Roland CM-32LN" + +msgid "OPL4-ML Daughterboard" +msgstr "Placa filla OPL4-ML" + +msgid "System MIDI" +msgstr "MIDI del sistema" + +msgid "MIDI Input Device" +msgstr "Dispositiu d'entrada MIDI" + +msgid "BIOS file" +msgstr "Fitxer de la BIOS" + +msgid "BIOS file (ROM #1)" +msgstr "Fitxer de la BIOS (ROM núm. 1)" + +msgid "BIOS file (ROM #2)" +msgstr "Fitxer de la BIOS (ROM núm. 2)" + +msgid "BIOS file (ROM #3)" +msgstr "Fitxer de la BIOS (ROM núm. 3)" + +msgid "BIOS file (ROM #4)" +msgstr "Fitxer de la BIOS (ROM núm. 4)" + +msgid "BIOS address" +msgstr "Adreça de la BIOS" + +msgid "BIOS address (ROM #1)" +msgstr "Adreça de la BIOS (ROM núm. 1)" + +msgid "BIOS address (ROM #2)" +msgstr "Adreça de la BIOS (ROM núm. 2)" + +msgid "BIOS address (ROM #3)" +msgstr "Adreça de la BIOS (ROM núm. 3)" + +msgid "BIOS address (ROM #4)" +msgstr "Adreça de la BIOS (ROM núm. 4)" + +msgid "Enable BIOS extension ROM Writes" +msgstr "Activa l'escriptura per a la ROM d'extensió de la BIOS" + +msgid "Enable BIOS extension ROM Writes (ROM #1)" +msgstr "Activa l'escriptura per a la ROM d'extensió de la BIOS (ROM núm. 1)" + +msgid "Enable BIOS extension ROM Writes (ROM #2)" +msgstr "Activa l'escriptura per a la ROM d'extensió de la BIOS (ROM núm. 2)" + +msgid "Enable BIOS extension ROM Writes (ROM #3)" +msgstr "Activa l'escriptura per a la ROM d'extensió de la BIOS (ROM núm. 3)" + +msgid "Enable BIOS extension ROM Writes (ROM #4)" +msgstr "Activa l'escriptura per a la ROM d'extensió de la BIOS (ROM núm. 4)" + +msgid "Linear framebuffer base" +msgstr "Base del búfer lineal de pantalla" + +msgid "Address" +msgstr "Adreça" + +msgid "IRQ" +msgstr "IRQ" + +msgid "Serial port IRQ" +msgstr "IRQ del port sèrie" + +msgid "Parallel port IRQ" +msgstr "IRQ del port paral·lel" + +msgid "Hard disk" +msgstr "Disc dur" + +msgid "BIOS Revision" +msgstr "Revisió de la BIOS" + +msgid "BIOS Version" +msgstr "Versió de la BIOS" + +msgid "BIOS Language" +msgstr "Idioma de la BIOS" + +msgid "IBM 5161 Expansion Unit" +msgstr "Unitat d'expansió IBM 5161" + +msgid "IBM Cassette Basic" +msgstr "IBM Basic per a cinta" + +msgid "Translate 26 -> 17" +msgstr "Traduir 26 -> 17" + +msgid "Language" +msgstr "Idioma" + +msgid "Enable backlight" +msgstr "Activa retroiŀluminació" + +msgid "Invert colors" +msgstr "Inverteix colors" + +msgid "BIOS size" +msgstr "Mida de la BIOS" + +msgid "BIOS size (ROM #1)" +msgstr "Mida de la BIOS (ROM núm. 1)" + +msgid "BIOS size (ROM #2)" +msgstr "Mida de la BIOS (ROM núm. 2)" + +msgid "BIOS size (ROM #3)" +msgstr "Mida de la BIOS (ROM núm. 3)" + +msgid "BIOS size (ROM #4)" +msgstr "Mida de la BIOS (ROM núm. 4)" + +msgid "Map C0000-C7FFF as UMB" +msgstr "Mapeja C0000-C7FFF com a UMB" + +msgid "Map C8000-CFFFF as UMB" +msgstr "Mapeja C8000-CFFFF com a UMB" + +msgid "Map D0000-D7FFF as UMB" +msgstr "Mapeja D0000-D7FFF com a UMB" + +msgid "Map D8000-DFFFF as UMB" +msgstr "Mapeja D8000-DFFFF com a UMB" + +msgid "Map E0000-E7FFF as UMB" +msgstr "Mapeja E0000-E7FFF com a UMB" + +msgid "Map E8000-EFFFF as UMB" +msgstr "Mapeja E8000-EFFFF com a UMB" + +msgid "JS9 Jumper (JIM)" +msgstr "Jumper JS9 (JIM)" + +msgid "MIDI Output Device" +msgstr "Dispositiu de sortida MIDI" + +msgid "MIDI Real time" +msgstr "MIDI en temps real" + +msgid "MIDI Thru" +msgstr "Passatge de la entrada MIDI" + +msgid "MIDI Clockout" +msgstr "Sortida del rellotge MIDI" + +msgid "Output Gain" +msgstr "Guany de la sortida" + +msgid "Chorus" +msgstr "Cor" + +msgid "Chorus Voices" +msgstr "Veus del cor" + +msgid "Chorus Level" +msgstr "Nivell del cor" + +msgid "Chorus Speed" +msgstr "Velocitat del cor" + +msgid "Chorus Depth" +msgstr "Profunditat del cor" + +msgid "Chorus Waveform" +msgstr "Forma d'ona del cor" + +msgid "Reverb" +msgstr "Reverberació" + +msgid "Reverb Room Size" +msgstr "Mida de l'habitació de reverberació" + +msgid "Reverb Damping" +msgstr "Amortiment de reverberació" + +msgid "Reverb Width" +msgstr "Amplada de reverberació" + +msgid "Reverb Level" +msgstr "Nivell de reverberació" + +msgid "Interpolation Method" +msgstr "Mètode de interpolació" + +msgid "Dynamic Sample Loading" +msgstr "Càrrega dinàmica de mostres" + +msgid "Reverb Output Gain" +msgstr "Guany de sortida de reverberació" + +msgid "Reversed stereo" +msgstr "Estéreo invertit" + +msgid "Nice ramp" +msgstr "Rampa agradable" + +msgid "Hz" +msgstr "Hz" + +msgid "Buttons" +msgstr "Botons" + +msgid "Serial Port" +msgstr "Port sèrie" + +msgid "RTS toggle" +msgstr "Commutació RTS" + +msgid "Revision" +msgstr "Revisió" + +msgid "Controller" +msgstr "Controlador" + +msgid "Show Crosshair" +msgstr "Mostrar mirada creuada" + +msgid "DMA" +msgstr "DMA" + +msgid "MAC Address" +msgstr "Adreça MAC" + +msgid "MAC Address OUI" +msgstr "OUI de la adreça MAC" + +msgid "Enable BIOS" +msgstr "Activar la BIOS" + +msgid "Baud Rate" +msgstr "Velocitat de transmissió" + +msgid "TCP/IP listening port" +msgstr "Port TCP/IP d'escolta" + +msgid "Phonebook File" +msgstr "Fitxer de llista de contactes" + +msgid "Telnet emulation" +msgstr "Emulació Telnet" + +msgid "RAM Address" +msgstr "Adreça del RAM" + +msgid "RAM size" +msgstr "Mida de la RAM" + +msgid "Initial RAM size" +msgstr "Mida inicial de la RAM" + +msgid "Serial Number" +msgstr "Número de sèrie" + +msgid "Host ID" +msgstr "ID de l'amfitrió" + +msgid "FDC Address" +msgstr "Adreça del FDC" + +msgid "MPU-401 Address" +msgstr "Adreça del MPU-401" + +msgid "MPU-401 IRQ" +msgstr "IRQ del MPU-401" + +msgid "Receive MIDI input" +msgstr "Rebre entrada MIDI" + +msgid "Low DMA" +msgstr "DMA baix" + +msgid "Enable Game port" +msgstr "Activa port de joystick" + +msgid "Enable Adlib ports" +msgstr "Activa ports Adlib" + +msgid "SID Model" +msgstr "Model del SID" + +msgid "SID Filter Strength" +msgstr "Força del filtatge del SID" + +msgid "Surround module" +msgstr "Mòdul surround" + +msgid "SB Address" +msgstr "Adreça de la SB" + +msgid "Adlib Address" +msgstr "Adreça de l'Adlib" + +msgid "Use EEPROM setting" +msgstr "Uitilitza la configuració de l'EEPROM" + +msgid "WSS IRQ" +msgstr "IRQ del WSS" + +msgid "WSS DMA" +msgstr "DMA del WSS" + +msgid "RTC IRQ" +msgstr "IRQ RTC" + +msgid "RTC Port Address" +msgstr "Adreça del port RTC" + +msgid "Onboard RTC" +msgstr "RTC integrat" + +msgid "Not installed" +msgstr "No instal·lat" + +msgid "Enable OPL" +msgstr "Activa OPL" + +msgid "Receive MIDI input (MPU-401)" +msgstr "Rebre entrada MIDI (MPU-401)" + +msgid "SB low DMA" +msgstr "DMA baix de la SB" + +msgid "6CH variant (6-channel)" +msgstr "Variant 6CH (6 canals)" + +msgid "Enable CMS" +msgstr "Activar CMS" + +msgid "Mixer" +msgstr "Mesclador" + +msgid "High DMA" +msgstr "DMA alt" + +msgid "Control PC speaker" +msgstr "Controla l'altaveu del PC" + +msgid "Memory size" +msgstr "Mida de memòria" + +msgid "EMU8000 Address" +msgstr "Adreça del EMU8000" + +msgid "IDE Controller" +msgstr "Controladora IDE" + +msgid "Codec" +msgstr "Codec" + +msgid "GUS type" +msgstr "Tipus de GUS" + +msgid "Enable 0x04 \"Exit 86Box\" command" +msgstr "Activa ordre 0x04 \"Surt de 86Box\"" + +msgid "Display type" +msgstr "Tipus de pantalla" + +msgid "Composite type" +msgstr "Tipus de pantalla composta" + +msgid "RGB type" +msgstr "Tipus de pantalla RGB" + +msgid "Line doubling type" +msgstr "Tipus de duplicació de línia" + +msgid "Snow emulation" +msgstr "Emulació de neu" + +msgid "Monitor type" +msgstr "Tipus de monitor" + +msgid "Character set" +msgstr "Conjunt de caràcters" + +msgid "XGA type" +msgstr "Tipus de XGA" + +msgid "Instance" +msgstr "Instància" + +msgid "MMIO Address" +msgstr "Adreça del MMIO" + +msgid "RAMDAC type" +msgstr "Tipus de RAMDAC" + +msgid "Blend" +msgstr "Mescla" + +msgid "Font" +msgstr "Tipus de lletra" + +msgid "Bilinear filtering" +msgstr "Filtració bilineal" + +msgid "Video chroma-keying" +msgstr "Croma-clau de vídeo" + +msgid "Dithering" +msgstr "Díthering" + +msgid "Enable NMI for CGA emulation" +msgstr "Activar NMI per a l'emulació del CGA" + +msgid "Voodoo type" +msgstr "Tipus de Voodoo" + +msgid "Framebuffer memory size" +msgstr "Mida de memòria del búffer de la pantalla" + +msgid "Texture memory size" +msgstr "Mida de memòria de textura" + +msgid "Dither subtraction" +msgstr "Subtracció de dither" + +msgid "Screen Filter" +msgstr "Filtre de pantalla" + +msgid "Render threads" +msgstr "Fils de renderització" + +msgid "SLI" +msgstr "SLI" + +msgid "Start Address" +msgstr "Adreça inicial" + +msgid "Contiguous Size" +msgstr "Mida contígua" + +msgid "I/O Width" +msgstr "Amplada de E/S" + +msgid "Transfer Speed" +msgstr "Velocitat de transferència" + +msgid "EMS mode" +msgstr "Modalitat EMS" + +msgid "EMS Address" +msgstr "Adreça de l'EMS" + +msgid "EMS 1 Address" +msgstr "Adreça de l'EMS 1" + +msgid "EMS 2 Address" +msgstr "Adreça de l'EMS 2" + +msgid "EMS Memory Size" +msgstr "Mida de la memòria EMS" + +msgid "EMS 1 Memory Size" +msgstr "Mida de la memòria EMS 1" + +msgid "EMS 2 Memory Size" +msgstr "Mida de la memòria EMS 2" + +msgid "Enable EMS" +msgstr "Activa EMS" + +msgid "Enable EMS 1" +msgstr "Activa EMS 1" + +msgid "Enable EMS 2" +msgstr "Activa EMS 2" + +msgid "Address for > 2 MB" +msgstr "Adreça per a > 2 MB" + +msgid "Frame Address" +msgstr "Adreça del marc" + +msgid "USA" +msgstr "EUA" + +msgid "Danish" +msgstr "Danés" + +msgid "Always at selected speed" +msgstr "Sempre a la velocitat escollida" + +msgid "BIOS setting + Hotkeys (off during POST)" +msgstr "Configuració de la BIOS + Tecles d'accés ràpid (desactivades durant el POST)" + +msgid "64 KB starting from F0000" +msgstr "64 KB a partir de F0000" + +msgid "128 KB starting from E0000 (address MSB inverted, last 64 KB first)" +msgstr "128 KB a partir d'E0000 (MSB d'adreça invertida, darrers 64 KB primer)" + +msgid "Sine" +msgstr "Sinusoidal" + +msgid "Triangle" +msgstr "Triangular" + +msgid "Linear" +msgstr "Lineal" + +msgid "4th Order" +msgstr "De 4t ordre" + +msgid "7th Order" +msgstr "De 7è ordre" + +msgid "Non-timed (original)" +msgstr "No cronometrat (original)" + +msgid "45 Hz (JMP2 not populated)" +msgstr "45 Hz (JMP2 no poblat)" + +msgid "Two" +msgstr "Dos" + +msgid "Three" +msgstr "Tres" + +msgid "Wheel" +msgstr "Roda" + +msgid "Five + Wheel" +msgstr "Cinc + roda" + +msgid "Five + 2 Wheels" +msgstr "Cinc + 2 rodes" + +msgid "A3 - SMT2 Serial / SMT3(R)V" +msgstr "A3 - SMT2 sèrie / SMT3(R)V" + +msgid "Q1 - SMT3(R) Serial" +msgstr "Q1 - SMT3(R) sèrie" + +msgid "8 KB" +msgstr "8 KB" + +msgid "32 KB" +msgstr "32 KB" + +msgid "16 KB" +msgstr "16 KB" + +msgid "64 KB" +msgstr "64 KB" + +msgid "Disable BIOS" +msgstr "Desactiva la BIOS" + +msgid "512 KB" +msgstr "512 KB" + +msgid "2 MB" +msgstr "2 MB" + +msgid "8 MB" +msgstr "8 MB" + +msgid "28 MB" +msgstr "28 MB" + +msgid "1 MB" +msgstr "1 MB" + +msgid "4 MB" +msgstr "4 MB" + +msgid "12 MB" +msgstr "12 MB" + +msgid "16 MB" +msgstr "16 MB" + +msgid "20 MB" +msgstr "20 MB" + +msgid "24 MB" +msgstr "24 MB" + +msgid "SigmaTel STAC9721T (stereo)" +msgstr "SigmaTel STAC9721T (estéreo)" + +msgid "256 KB" +msgstr "256 KB" + +msgid "Composite" +msgstr "Compost" + +msgid "True color" +msgstr "Color real" + +msgid "Old" +msgstr "Antic" + +msgid "New" +msgstr "Nou" + +msgid "Color (generic)" +msgstr "Color (genèric)" + +msgid "Green Monochrome" +msgstr "Monocromàtic verd" + +msgid "Amber Monochrome" +msgstr "Monocromàtic ambre" + +msgid "Gray Monochrome" +msgstr "Monocromàtic gris" + +msgid "Color (no brown)" +msgstr "Color (sense marró)" + +msgid "Color (IBM 5153)" +msgstr "Color (IBM 5153)" + +msgid "Simple doubling" +msgstr "Duplicació simple" + +msgid "sRGB interpolation" +msgstr "Interpolació sRGB" + +msgid "Linear interpolation" +msgstr "Interpolació lineal" + +msgid "Has secondary 8x8 character set" +msgstr "Té conjunt de caràcters 8x8 secundari" + +msgid "Has Quadcolor II daughter board" +msgstr "Té placa filla Quadcolor II" + +msgid "Alternate monochrome contrast" +msgstr "Contrast monocromátic alternatiu" + +msgid "128 KB" +msgstr "128 KB" + +msgid "Monochrome (5151/MDA) (white)" +msgstr "Monocromàtic (5151/MDA) (blanc)" + +msgid "Monochrome (5151/MDA) (green)" +msgstr "Monocromàtic (5151/MDA) (verd)" + +msgid "Monochrome (5151/MDA) (amber)" +msgstr "Monocromàtic (5151/MDA) (ambre)" + +msgid "Color 40x25 (5153/CGA)" +msgstr "Color 40x25 (5153/CGA)" + +msgid "Color 80x25 (5153/CGA)" +msgstr "Color 80x25 (5153/CGA)" + +msgid "Enhanced Color - Normal Mode (5154/ECD)" +msgstr "Color millorat - modalitat normal (5154/ECD)" + +msgid "Enhanced Color - Enhanced Mode (5154/ECD)" +msgstr "Color millorat - modalitat millorada (5154/ECD)" + +msgid "Green" +msgstr "Verd" + +msgid "Amber" +msgstr "Ambre" + +msgid "Gray" +msgstr "Gris" + +msgid "Grayscale" +msgstr "Escala de grisos" + +msgid "Color" +msgstr "Color" + +msgid "U.S. English" +msgstr "Anglès dels EUA" + +msgid "Scandinavian" +msgstr "Escandinau" + +msgid "Other languages" +msgstr "Altres idiomes" + +msgid "Bochs latest" +msgstr "Bochs més nou" + +msgid "Apply overscan deltas" +msgstr "Aplicar deltes de l'overscan" + +msgid "Mono Interlaced" +msgstr "Monocromàtic entrallaçat" + +msgid "Mono Non-Interlaced" +msgstr "Monocromàtic no entrallaçat" + +msgid "Color Interlaced" +msgstr "Color entrallaçat" + +msgid "Color Non-Interlaced" +msgstr "Color no entrallaçat" + +msgid "3Dfx Voodoo Graphics" +msgstr "Gràfics 3dfx Voodoo" + +msgid "3Dfx Voodoo 2" +msgstr "3Dfx Voodoo 2" + +msgid "Obsidian SB50 + Amethyst (2 TMUs)" +msgstr "Obsidian SB50 + Amethyst (2 unitats TMU)" + +msgid "8-bit" +msgstr "8 bits" + +msgid "16-bit" +msgstr "16 bits" + +msgid "Standard (150ns)" +msgstr "Estàndard (150ns)" + +msgid "High-Speed (120ns)" +msgstr "Alta velocitat (120ns)" + +msgid "Enabled" +msgstr "Activat" + +msgid "Standard" +msgstr "Estàndard" + +msgid "High-Speed" +msgstr "Alta velocitat" + +msgid "Stereo LPT DAC" +msgstr "DAC LPT estèreo" + +msgid "Generic Text Printer" +msgstr "Impressora genèrica de text" + +msgid "Generic ESC/P 2 Dot-Matrix Printer" +msgstr "Impressora genèrica matricial ESC/P 2" + +msgid "Generic PostScript Printer" +msgstr "Impressora genèrica PostScript" + +msgid "Generic PCL5e Printer" +msgstr "Impresora genèrica PCL5e" + +msgid "Parallel Line Internet Protocol" +msgstr "Protocol d'Internet de línia paralela" + +msgid "Protection Dongle for Savage Quest" +msgstr "Dongle de protecció per a Savage Quest" + +msgid "Serial Passthrough Device" +msgstr "Dispositiu de passatge de port sèrie" + +msgid "Passthrough Mode" +msgstr "Modalitat de passatge" + +msgid "Host Serial Device" +msgstr "Dispositiu serie del amfitrió" + +msgid "Name of pipe" +msgstr "Nom de conducta" + +msgid "Data bits" +msgstr "Bits de dades" + +msgid "Stop bits" +msgstr "Bits d'aturada" + +msgid "Baud Rate of Passthrough" +msgstr "Velocitat de transmissió de passatge" + +msgid "Named Pipe (Server)" +msgstr "Conducta anomenada (servidor)" + +msgid "Named Pipe (Client)" +msgstr "Conducta anomenada (client)" + +msgid "Host Serial Passthrough" +msgstr "Passatge del port sèrie de l'amfitrió" + +msgid "E&ject %1" +msgstr "E&xpulsa %1" + +msgid "&Unmute" +msgstr "&Reactiva so" + +msgid "Softfloat FPU" +msgstr "FPU Softfloat" + +msgid "High performance impact" +msgstr "Alt impacte en el rendiment" + +msgid "[Generic] RAM Disk (max. speed)" +msgstr "[Genèric] Disc RAM (velocitat màxima)" + +msgid "[Generic] 1989 (3500 RPM)" +msgstr "[Genèric] 1989 (3500 RPM)" + +msgid "[Generic] 1992 (3600 RPM)" +msgstr "[Genèric] 1992 (3600 RPM)" + +msgid "[Generic] 1994 (4500 RPM)" +msgstr "[Genèric] 1994 (4500 RPM)" + +msgid "[Generic] 1996 (5400 RPM)" +msgstr "[Genèric] 1996 (5400 RPM)" + +msgid "[Generic] 1997 (5400 RPM)" +msgstr "[Genèric] 1997 (5400 RPM)" + +msgid "[Generic] 1998 (5400 RPM)" +msgstr "[Genèric] 1998 (5400 RPM)" + +msgid "[Generic] 2000 (7200 RPM)" +msgstr "[Genèric] 2000 (7200 RPM)" + +msgid "IBM 8514/A clone (ISA)" +msgstr "Clon IBM 8514/A (ISA)" + +msgid "Vendor" +msgstr "Fabricant" + +msgid "30 Hz (JMP2 = 1)" +msgstr "30 Hz (JMP2 = 1)" + +msgid "60 Hz (JMP2 = 2)" +msgstr "60 Hz (JMP2 = 2)" + +msgid "Generic PC/XT Memory Expansion" +msgstr "Expansió genèrica PC/XT de memòria" + +msgid "Generic PC/AT Memory Expansion" +msgstr "Expansió genèrica PC/AT de memòria" + +msgid "Unable to find Dot-Matrix fonts" +msgstr "No fou possible trobar els tipus de lletra matricials" + +msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P 2 Dot-Matrix Printer." +msgstr "Els tipus de lletra TrueType en el directori \"roms/printer/fonts\" són imprescindibles per l'emulació de la impressora genèrica matricial ESC/P 2." + +msgid "Inhibit multimedia keys" +msgstr "Inhibir tecles multimèdia" + +msgid "Ask for confirmation before saving settings" +msgstr "Demana confirmació abans de desar la configuració" + +msgid "Ask for confirmation before hard resetting" +msgstr "Demana confirmació abans de la reiniciació completa" + +msgid "Ask for confirmation before quitting" +msgstr "Demana confirmació abans de sortir" + +msgid "Options" +msgstr "Opcions" + +msgid "Model" +msgstr "Model" + +msgid "Model:" +msgstr "Model:" + +msgid "Failed to initialize Vulkan renderer." +msgstr "Error en inicialitzar el renderitzador Vulkan." + +msgid "GLSL Error" +msgstr "Error de GLSL" + +msgid "Could not load shader: %1" +msgstr "No fou possible carregar el shader: %1" + +msgid "Could not load texture: %1" +msgstr "Error en carregar la textura: %1" + +msgid "Could not compile shader:\n\n%1" +msgstr "Error en compilar el shader:\n\n%1" + +msgid "Program not linked:\n\n%1" +msgstr "Programa no vinculat:\n\n%1" + +msgid "Shader Manager" +msgstr "Administrador de shaders" + +msgid "Shader Configuration" +msgstr "Configuració de shaders" + +msgid "Add" +msgstr "Afegeix" + +msgid "Move up" +msgstr "Moure cap amunt" + +msgid "Move down" +msgstr "Moure cap avall" + +msgid "Could not load file %1" +msgstr "Error en carregar el fitxer %1" + +msgid "Key Bindings:" +msgstr "Dreceres de teclat:" + +msgid "Action" +msgstr "Acció" + +msgid "Keybind" +msgstr "Drecera" + +msgid "Clear binding" +msgstr "Esborra drecera" + +msgid "Bind" +msgstr "Vincula" + +msgid "Bind Key" +msgstr "Vincula tecla" + +msgid "Enter key combo:" +msgstr "Escriviu combinació de tecles:" + +msgid "Bind conflict" +msgstr "Conflicte entre dreceres" + +msgid "This key combo is already in use." +msgstr "Aquesta combinació de tecles ja està en ús." + +msgid "Send Control+Alt+Del" +msgstr "Envia Control+Alt+Supr" + +msgid "Send Control+Alt+Escape" +msgstr "Envia Control+Alt+Esc" + +msgid "Toggle fullscreen" +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í" + +msgid "Toggle pause" +msgstr "Alterna pausa" + +msgid "Toggle mute" +msgstr "Alterna silenci" + +msgid "Text files" +msgstr "Fitxers de text" + +msgid "ROM files" +msgstr "Fitxers de ROM" + +msgid "SoundFont files" +msgstr "Fitxers SoundFont" + +msgid "Local Switch" +msgstr "Commutador local" + +msgid "Remote Switch" +msgstr "Commutador remot" + +msgid "Switch:" +msgstr "Commutador:" + +msgid "Hub Mode" +msgstr "Modalitat de concentrador" + +msgid "Hostname:" +msgstr "Nom de l'amfitrió:" + +msgid "ISA RAM:" +msgstr "RAM ISA:" + +msgid "ISA ROM:" +msgstr "ROM ISA:" + +msgid "&Wipe NVRAM" +msgstr "&Esborra la NVRAM" + +msgid "This will delete all NVRAM (and related) files of the virtual machine located in the \"nvr\" subdirectory. You'll have to reconfigure the BIOS (and possibly other devices inside the VM) settings again if applicable.\n\nAre you sure you want to wipe all NVRAM contents of the virtual machine \"%1\"?" +msgstr "Això suprimirà tots els fitxers NVRAM (i relacionats) de la màquina virtual situats al subdirectori \"nvr\". Haureu de tornar a reconfigurar la configuració de la BIOS (i potser d'altres dispositius a l'interior de la MV) si s'escau.\n\nEsteu segurs que voleu esborrar tot el contingut de la NVRAM de la màquina virtual \"%1\"?" + +msgid "Success" +msgstr "Èxit" + +msgid "Successfully wiped the NVRAM contents of the virtual machine \"%1\"" +msgstr "El contingut de la NVRAM de la màquina virtual \"%1\" s'ha esborrat amb èxit" + +msgid "An error occurred trying to wipe the NVRAM contents of the virtual machine \"%1\"" +msgstr "S'ha produït un error en intentar esborrar el contingut de la NVRAM de la màquina virtual \"%1\"" + +msgid "%1 VM Manager" +msgstr "Administrador de MV de %1" + +msgid "%n disk(s)" +msgstr "%n disc(s)" + +msgid "Unknown Status" +msgstr "Estat desconegut" + +msgid "No Machines Found!" +msgstr "No s'han trobat màquines!" + +msgid "Check for updates on startup" +msgstr "Comprova actualitzacions en iniciar" + +msgid "Unable to determine release information" +msgstr "No fou possible determinar la informació de la versió" + +msgid "There was an error checking for updates:\n\n%1\n\nPlease try again later." +msgstr "S'ha produït un error en verificar actualitzacions:\n\n%1\n\nSi us plau, torneu a intentar-ho més tard." + +msgid "Update check complete" +msgstr "Verificació de actualitzacions finalitzada" + +msgid "stable" +msgstr "estable" + +msgid "beta" +msgstr "beta" + +msgid "You are running the latest %1 version of 86Box: %2" +msgstr "Esteu executant l'última versió %1 del 86Box: %2" + +msgid "version" +msgstr "versió" + +msgid "build" +msgstr "compilació" + +msgid "You are currently running version %1." +msgstr "Actualment esteu executant la versió %1." + +msgid "Version %1 is now available." +msgstr "La versió %1 ja és disponible." + +msgid "You are currently running build %1." +msgstr "Actualment esteu executant la compialació %1." + +msgid "Build %1 is now available." +msgstr "La compilació %1 ja és disponible." + +msgid "Would you like to visit the download page?" +msgstr "Voleu visitar la pàgina de descàrregues?" + +msgid "Visit download page" +msgstr "Visita la pàgina de descàrregues" + +msgid "Update check" +msgstr "Verificació de actualitzacions" + +msgid "Checking for updates…" +msgstr "Verificant las actualitzacions…" + +msgid "86Box Update" +msgstr "Actualització del 86Box" + +msgid "Release notes:" +msgstr "Notes de versió:" + +msgid "%1 Hz" +msgstr "%1 Hz" + +msgid "Virtual machine crash" +msgstr "Finalització inesperada de la màquina virtual" + +msgid "The virtual machine \"%1\"'s process has unexpectedly terminated with exit code %2." +msgstr "El procés de la màquina virtual \"%1\" s'ha finalitzat inesperadament amb con el codi de sortida %2." + +msgid "The system will not be added." +msgstr "El sistema no serà afegit." + +msgid "&Update mouse every CPU frame" +msgstr "&Actualitza l'estat del ratolí a cada bloc del CPU" + +msgid "Hue" +msgstr "Matís" + +msgid "Saturation" +msgstr "Saturació" + +msgid "Contrast" +msgstr "Contrast" + +msgid "Brightness" +msgstr "Luminositat" + +msgid "Sharpness" +msgstr "Nitidesa" + +msgid "&CGA composite settings…" +msgstr "Configuració de la modalitat compòsita &CGA…" + +msgid "CGA composite settings" +msgstr "Configuració de la modalitat compòsita CGA" + +msgid "Monitor EDID" +msgstr "EDID del monitor" + +msgid "Export…" +msgstr "Exporta…" + +msgid "Export EDID" +msgstr "Exporta l'EDID" + +msgid "EDID file \"%ls\" is too large." +msgstr "El fitxer EDID \"%ls\" és massa gran." + +msgid "OpenGL input scale" +msgstr "Escala de entrada de l'OpenGL" + +msgid "OpenGL input stretch mode" +msgstr "Modalitat de estirament de entrada de l'OpenGL" + +msgid "Color scheme" +msgstr "Esquema de colors" + +msgid "Light" +msgstr "Clar" + +msgid "Dark" +msgstr "Fosc" + +msgid "Search:" +msgstr "Cerca:" + +msgid "Force interpretation" +msgstr "Força interpretació" + +msgid "Allow recompilation" +msgstr "Permetre recompilació" + +msgid "&Force interpretation" +msgstr "&Força interpretació" + +msgid "&Allow recompilation" +msgstr "&Permetre recompilació" diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po index c348fa87b..53bd643b2 100644 --- a/src/qt/languages/es-ES.po +++ b/src/qt/languages/es-ES.po @@ -160,19 +160,19 @@ msgid "RGB (no brown)" msgstr "RGB (sin marrón)" msgid "&RGB Grayscale" -msgstr "RGB &Grises" +msgstr "RGB &grises" msgid "Generic RGBI color monitor" msgstr "Monitor a colores RGBI genérico" msgid "&Amber monitor" -msgstr "Monitor Ámb&ar" +msgstr "Monitor ámb&ar" msgid "&Green monitor" -msgstr "Monitor &Verde" +msgstr "Monitor &verde" msgid "&White monitor" -msgstr "Monitor &Blanco" +msgstr "Monitor &blanco" msgid "Grayscale &conversion type" msgstr "&Conversión a grises" @@ -241,10 +241,10 @@ msgid "&New image…" msgstr "&Nueva imagen…" msgid "&Existing image…" -msgstr "Imagen &Existente…" +msgstr "Imagen &existente…" msgid "Existing image (&Write-protected)…" -msgstr "Imagen Existente (&Sólo-lectura)…" +msgstr "Imagen existente (&Sólo-lectura)…" msgid "&Record" msgstr "&Grabar" @@ -283,16 +283,16 @@ msgid "Preferences" msgstr "Preferencias" msgid "Sound Gain" -msgstr "Ganancia de Sonido" +msgstr "Ganancia de sonido" msgid "New Image" -msgstr "Nueva Imagen" +msgstr "Nueva imagen" msgid "Settings" msgstr "Configuraciones" msgid "Specify Main Window Dimensions" -msgstr "Especificar Dimensiones de la Ventana Principal" +msgstr "Especificar dimensiones de la ventana principal" msgid "OK" msgstr "Aceptar" @@ -376,7 +376,7 @@ msgid "Enabled (UTC)" msgstr "Habilitado (UTC)" msgid "Dynamic Recompiler" -msgstr "Recompilador Dinámico" +msgstr "Recompilador dinámico" msgid "CPU frame size" msgstr "Tamaño de blocos de CPU" @@ -682,7 +682,7 @@ msgid "&Removable disk %1 (%2): %3" msgstr "&Disco removible %1 (%2): %3" msgid "Removable disk images" -msgstr "Imagenes de disco removible" +msgstr "Imágenes de disco removible" msgid "Image %1" msgstr "Imagen %1" @@ -709,10 +709,10 @@ msgid "All images" msgstr "Todas las imagenes" msgid "Basic sector images" -msgstr "Basic sector images" +msgstr "Imaáenes básicas de sector" msgid "Surface images" -msgstr "Surface images" +msgstr "Imágenes de superficie" msgid "Machine \"%hs\" is not available due to missing ROMs in the roms/machines directory. Switching to an available machine." msgstr "La máquina \"%hs\" no está disponible debido a ROMs faltantes en el directorio roms/machines. Cambiando a una máquina disponible." @@ -733,7 +733,7 @@ msgid "Display" msgstr "Vídeo" msgid "Input devices" -msgstr "Dispositivos de Entrada" +msgstr "Dispositivos de entrada" msgid "Sound" msgstr "Sonido" @@ -754,10 +754,10 @@ msgid "Parallel ports:" msgstr "Puertos paralelos:" msgid "Storage controllers" -msgstr "Controladoras de Almacenamiento" +msgstr "Controladoras de almacenamiento" msgid "Hard disks" -msgstr "Discos Duros" +msgstr "Discos duros" msgid "Disks:" msgstr "Discos:" @@ -946,7 +946,7 @@ msgid "MO images" msgstr "Imágenes de MO" msgid "Welcome to 86Box!" -msgstr "¡Bienvenido a 86Box!" +msgstr "¡Bienvenido en 86Box!" msgid "Internal device" msgstr "Dispositivo interno" @@ -991,7 +991,7 @@ msgid "Hardware not available" msgstr "Equipo no disponible" msgid "Make sure %1 is installed and that you are on a %1-compatible network connection." -msgstr "Asegúrate de que %1 está instalado y de que estás en una conexión de red compatible con %1." +msgstr "Asegúree de que %1 está instalado y de que estás en una conexión de red compatible con %1." msgid "Invalid configuration" msgstr "Configuración inválida" @@ -1018,7 +1018,7 @@ msgid "CD-ROM images" msgstr "Imágenes de CD-ROM" msgid "%1 Device Configuration" -msgstr "%1 Configuración de Dispositivo" +msgstr "Configuración de dispositivo %1" msgid "Monitor in sleep mode" msgstr "Monitor en modo ahorro" @@ -1042,7 +1042,7 @@ msgid "C&assette: %1" msgstr "C&assette: %1" msgid "Cassette images" -msgstr "Imágenes de Cassette" +msgstr "Imágenes de cassette" msgid "Cartridge %1: %2" msgstr "Cartucho %1: %2" @@ -1051,7 +1051,7 @@ msgid "Car&tridge %1: %2" msgstr "Car&tucho %1: %2" msgid "Cartridge images" -msgstr "Imágenes de Cartucho" +msgstr "Imágenes de cartucho" msgid "Resume execution" msgstr "Retomar la ejecución" @@ -1072,13 +1072,13 @@ msgid "Hard reset" msgstr "Hard reset" msgid "Force shutdown" -msgstr "Apagqar forzadamente" +msgstr "Apagar forzadamente" msgid "Start" msgstr "Iniciar" msgid "&Force shutdown" -msgstr "&Apagqar forzadamente" +msgstr "&Apagar forzadamente" msgid "&Start" msgstr "&Iniciar" @@ -1192,7 +1192,7 @@ msgid "System location:" msgstr "Ubicación del sistema:" msgid "System name and location" -msgstr "Nombre y ubicaciónd el sistema" +msgstr "Nombre y ubicación del sistema" msgid "Enter the name of the system and choose the location" msgstr "Escribir el nombre del sistema y escoger la ubicación" @@ -1363,10 +1363,10 @@ msgid "Custom (large)…" msgstr "A medida (grande)…" msgid "Add New Hard Disk" -msgstr "Añadir Nuevo Disco Duro" +msgstr "Añadir nuevo disco duro" msgid "Add Existing Hard Disk" -msgstr "Añadir Disco Duro Existente" +msgstr "Añadir disco duro existente" msgid "HDI disk images cannot be larger than 4 GB." msgstr "Las imágenes de disco HDI no pueden superar los 4 GB." @@ -1375,7 +1375,7 @@ msgid "Disk images cannot be larger than 127 GB." msgstr "Las imágenes de disco no pueden superar los 127 GB." msgid "Hard disk images" -msgstr "Imágenes de Disco Duro" +msgstr "Imágenes de disco duro" msgid "Unable to read file" msgstr "No se pudo leer el archivo" @@ -2122,7 +2122,7 @@ msgid "MPU-401 Address" msgstr "Dirección del MPU-401" msgid "MPU-401 IRQ" -msgstr "IQ del MPU-401" +msgstr "IRQ del MPU-401" msgid "Receive MIDI input" msgstr "Recebir entrada MIDI" @@ -2218,7 +2218,7 @@ msgid "Display type" msgstr "Tipo de pantalla" msgid "Composite type" -msgstr "Tipo de pantalla compuesta" +msgstr "Tipo de pantalla compósita" msgid "RGB type" msgstr "Tipo de pantalla RGB" @@ -2446,7 +2446,7 @@ msgid "256 KB" msgstr "256 KB" msgid "Composite" -msgstr "Compuesto" +msgstr "Compósito" msgid "True color" msgstr "Verdadero color" @@ -2482,13 +2482,13 @@ msgid "sRGB interpolation" msgstr "Interpolación sRGB" msgid "Linear interpolation" -msgstr "Interpolación lineare" +msgstr "Interpolación lineal" msgid "Has secondary 8x8 character set" msgstr "Tiene conjunto de carácteres 8x8 secundário" msgid "Has Quadcolor II daughter board" -msgstr "Tiene tarjeta hija Quadcolor II" +msgstr "Tiene placa hija Quadcolor II" msgid "Alternate monochrome contrast" msgstr "Contraste monocromo alternativo" @@ -2569,7 +2569,7 @@ msgid "Obsidian SB50 + Amethyst (2 TMUs)" msgstr "Obsidian SB50 + Amethyst (2 unidades TMU)" msgid "8-bit" -msgstr "8 bitss" +msgstr "8 bits" msgid "16-bit" msgstr "16 bits" @@ -2596,7 +2596,7 @@ msgid "Generic Text Printer" msgstr "Impresora genérica de texto" msgid "Generic ESC/P 2 Dot-Matrix Printer" -msgstr "Impresora matricial ESC/P 2 genérica" +msgstr "Impresora genérica matricial ESC/P 2" msgid "Generic PostScript Printer" msgstr "Impresora genérica PostScript" @@ -2698,7 +2698,7 @@ msgid "Unable to find Dot-Matrix fonts" msgstr "No fué posible encontrar las fuentes matriciales" msgid "TrueType fonts in the \"roms/printer/fonts\" directory are required for the emulation of the Generic ESC/P 2 Dot-Matrix Printer." -msgstr "Las fuentes TrueType en el directorio \"roms/printer/fonts\" son necesarias para la emulación de la impresora matricial ESC/P 2 genérica." +msgstr "Las fuentes TrueType en el directorio \"roms/printer/fonts\" son necesarias para la emulación de la impresora genérica matricial ESC/P 2." msgid "Inhibit multimedia keys" msgstr "Inhibir teclas multimedia" @@ -2863,10 +2863,10 @@ msgid "Unknown Status" msgstr "Estado desconocido" msgid "No Machines Found!" -msgstr "¡No fueron encontradas máquinas!" +msgstr "¡No fueran encontradas máquinas!" msgid "Check for updates on startup" -msgstr "Contorlar actualizaciones al iniciar" +msgstr "Verificar actualizaciones al iniciar" msgid "Unable to determine release information" msgstr "No fué posible determinar informaciones de la versión" @@ -2953,19 +2953,19 @@ msgid "Sharpness" msgstr "Nitidez" msgid "&CGA composite settings…" -msgstr "Configuración del modo compuesto &CGA…" +msgstr "Configuración del modo compósito &CGA…" msgid "CGA composite settings" -msgstr "Configuración del modo compuesto CGA" +msgstr "Configuración del modo compósito CGA" msgid "Monitor EDID" -msgstr "EDID du moniteur" +msgstr "EDID del monitor" msgid "Export…" -msgstr "Exporter…" +msgstr "Exportar…" msgid "Export EDID" -msgstr "EDID exportieren" +msgstr "Exportar el EDID" msgid "EDID file \"%ls\" is too large." msgstr "El archivo EDID \"%ls\" es demasiado grande." @@ -2980,7 +2980,7 @@ msgid "Color scheme" msgstr "Esquema de colores" msgid "Light" -msgstr "Luz" +msgstr "Claro" msgid "Dark" msgstr "Oscuro" diff --git a/src/qt/qt_harddrive_common.cpp b/src/qt/qt_harddrive_common.cpp index eb814ebfd..7ec75d47d 100644 --- a/src/qt/qt_harddrive_common.cpp +++ b/src/qt/qt_harddrive_common.cpp @@ -17,6 +17,7 @@ #include extern "C" { +#include <86box/86box.h> #include <86box/hdd.h> #include <86box/scsi.h> #include <86box/cdrom.h> diff --git a/src/qt/qt_machinestatus.cpp b/src/qt/qt_machinestatus.cpp index 2e6203f24..e6ab80688 100644 --- a/src/qt/qt_machinestatus.cpp +++ b/src/qt/qt_machinestatus.cpp @@ -17,9 +17,9 @@ #include "qt_machinestatus.hpp" extern "C" { +#include <86box/86box.h> #include <86box/hdd.h> #include <86box/timer.h> -#include <86box/86box.h> #include <86box/device.h> #include <86box/cartridge.h> #include <86box/cassette.h> diff --git a/src/qt/qt_progsettings.cpp b/src/qt/qt_progsettings.cpp index 268cec894..58d22c63b 100644 --- a/src/qt/qt_progsettings.cpp +++ b/src/qt/qt_progsettings.cpp @@ -47,6 +47,7 @@ QTranslator *ProgSettings::qtTranslator = nullptr; QVector> ProgSettings::languages = { { "system", "(System Default)" }, + { "ca-ES", "Catalan (Spain)" }, { "zh-CN", "Chinese (Simplified)" }, { "zh-TW", "Chinese (Traditional)" }, { "hr-HR", "Croatian (Croatia)" }, diff --git a/src/qt/qt_settings_bus_tracking.cpp b/src/qt/qt_settings_bus_tracking.cpp index aee57da1b..77865be72 100644 --- a/src/qt/qt_settings_bus_tracking.cpp +++ b/src/qt/qt_settings_bus_tracking.cpp @@ -19,9 +19,13 @@ #include #include +extern "C" { +#include "86box/86box.h" #include "86box/hdd.h" #include "86box/scsi.h" #include "86box/cdrom.h" +} + #include "qt_settings_bus_tracking.hpp" SettingsBusTracking::SettingsBusTracking() diff --git a/src/qt/qt_settingsfloppycdrom.cpp b/src/qt/qt_settingsfloppycdrom.cpp index 8fcad3f21..d896614d8 100644 --- a/src/qt/qt_settingsfloppycdrom.cpp +++ b/src/qt/qt_settingsfloppycdrom.cpp @@ -149,7 +149,7 @@ SettingsFloppyCDROM::SettingsFloppyCDROM(QWidget *parent) #ifndef DISABLE_FDD_AUDIO // Get the profile name from the configuration system - const char *name = fdd_audio_get_profile_internal_name(prof); + const char *name = fdd_audio_get_profile_name(prof); if (name) { profName = QString(name); } else { @@ -449,7 +449,7 @@ SettingsFloppyCDROM::on_comboBoxFloppyAudio_activated(int) #ifndef DISABLE_FDD_AUDIO // Get the profile name from the configuration system - const char *name = fdd_audio_get_profile_internal_name(prof); + const char *name = fdd_audio_get_profile_name(prof); if (name) { profName = name; } else { diff --git a/src/qt/qt_settingsotherremovable.cpp b/src/qt/qt_settingsotherremovable.cpp index 7b3bb89f6..567eaa3e2 100644 --- a/src/qt/qt_settingsotherremovable.cpp +++ b/src/qt/qt_settingsotherremovable.cpp @@ -18,6 +18,7 @@ #include "ui_qt_settingsotherremovable.h" extern "C" { +#include <86box/86box.h> #include <86box/timer.h> #include <86box/scsi_device.h> #include <86box/mo.h> diff --git a/src/qt/qt_translations.qrc.in b/src/qt/qt_translations.qrc.in index ef7993372..46541b103 100644 --- a/src/qt/qt_translations.qrc.in +++ b/src/qt/qt_translations.qrc.in @@ -1,5 +1,6 @@ + 86box_ca-ES.qm 86box_cs-CZ.qm 86box_de-DE.qm 86box_en-US.qm diff --git a/src/qt/qt_vmmanager_details.cpp b/src/qt/qt_vmmanager_details.cpp index d91ba951b..396997e7d 100644 --- a/src/qt/qt_vmmanager_details.cpp +++ b/src/qt/qt_vmmanager_details.cpp @@ -149,11 +149,11 @@ VMManagerDetails::VMManagerDetails(QWidget *parent) cadButton->setEnabled(false); cadButton->setToolTip(tr("Ctrl+Alt+Del")); - ui->toolButtonHolder->layout()->addWidget(configureButton); + ui->toolButtonHolder->layout()->addWidget(startPauseButton); ui->toolButtonHolder->layout()->addWidget(resetButton); ui->toolButtonHolder->layout()->addWidget(stopButton); - ui->toolButtonHolder->layout()->addWidget(startPauseButton); ui->toolButtonHolder->layout()->addWidget(cadButton); + ui->toolButtonHolder->layout()->addWidget(configureButton); ui->notesTextEdit->setEnabled(false); diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt index 1d428fa2b..1c79b42d2 100644 --- a/src/unix/CMakeLists.txt +++ b/src/unix/CMakeLists.txt @@ -22,6 +22,7 @@ add_library(plat OBJECT unix.c unix_serial_passthrough.c unix_netsocket.c + ../qt/sdl_joystick.c ) if (NOT CPPTHREADS) diff --git a/src/unix/assets/86Box.spec b/src/unix/assets/86Box.spec index c5fbc120f..a189a5f41 100644 --- a/src/unix/assets/86Box.spec +++ b/src/unix/assets/86Box.spec @@ -12,10 +12,10 @@ # After a successful build, you can install the RPMs as follows: # sudo dnf install RPMS/$(uname -m)/86Box-3* RPMS/noarch/86Box-roms* -%global romver 5.3 +%global romver 5.4 Name: 86Box -Version: 5.3 +Version: 5.4 Release: 1%{?dist} Summary: Classic PC emulator License: GPLv2+ @@ -121,5 +121,5 @@ popd %{_datadir}/%{name}/roms %changelog -* Sat Aug 31 Jasmine Iwanek 5.3-1 +* Sat Aug 31 Jasmine Iwanek 5.4-1 - Bump release diff --git a/src/unix/assets/net.86box.86Box.metainfo.xml b/src/unix/assets/net.86box.86Box.metainfo.xml index 0cf1a0fb4..c6a612a4c 100644 --- a/src/unix/assets/net.86box.86Box.metainfo.xml +++ b/src/unix/assets/net.86box.86Box.metainfo.xml @@ -11,7 +11,7 @@ net.86box.86Box.desktop - + diff --git a/src/unix/dummy_cdrom_ioctl.c b/src/unix/dummy_cdrom_ioctl.c index af8679ecc..9b7a8bfbf 100644 --- a/src/unix/dummy_cdrom_ioctl.c +++ b/src/unix/dummy_cdrom_ioctl.c @@ -24,6 +24,7 @@ #include #include #define HAVE_STDARG_H +#include <86box/86box.h> #include <86box/scsi_device.h> #include <86box/cdrom.h> #include <86box/log.h> diff --git a/src/unix/unix.c b/src/unix/unix.c index 535fd06ea..97f8b972a 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -67,9 +67,6 @@ int fixed_size_x = 640; int fixed_size_y = 480; extern int title_set; extern wchar_t sdl_win_title[512]; -plat_joystick_state_t plat_joystick_state[MAX_PLAT_JOYSTICKS]; -joystick_state_t joystick_state[GAMEPORT_MAX][MAX_JOYSTICKS]; -int joysticks_present; SDL_mutex *blitmtx; SDL_threadID eventthread; static int exit_event = 0; @@ -1689,24 +1686,6 @@ plat_language_code_r(UNUSED(int id), UNUSED(char *outbuf), UNUSED(int len)) return; } -void -joystick_init(void) -{ - /* No-op. */ -} - -void -joystick_close(void) -{ - /* No-op. */ -} - -void -joystick_process(uint8_t gp) -{ - /* No-op. */ -} - void startblit(void) { diff --git a/src/utils/random.c b/src/utils/random.c index 6ed6c1d0c..5658bc3fb 100644 --- a/src/utils/random.c +++ b/src/utils/random.c @@ -51,16 +51,10 @@ rdtsc(void) #if defined(__x86_64__) unsigned int hi; unsigned int lo; -# ifdef _MSC_VER - __asm { - rdtsc - mov hi, edx ; EDX:EAX is already standard return!! - mov lo, eax - } -# else + __asm__ __volatile__("rdtsc" : "=a"(lo), "=d"(hi)); -# endif + return ((unsigned long long) lo) | (((unsigned long long) hi) << 32); #else return time(NULL); diff --git a/src/video/vid_ati28800.c b/src/video/vid_ati28800.c index 2fe46bea3..70b360c1e 100644 --- a/src/video/vid_ati28800.c +++ b/src/video/vid_ati28800.c @@ -574,16 +574,16 @@ ati28800k_init(const device_t *info) default: case 0: rom_init(&ati28800->bios_rom, BIOS_ATIKOR_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - loadfont(FONT_ATIKOR_PATH, 6); + video_load_font(FONT_ATIKOR_PATH, FONT_FORMAT_KSC6501, LOAD_FONT_NO_OFFSET); break; case 1: rom_init_interleaved(&ati28800->bios_rom, BIOS_ATIKOR_4620P_PATH_L, BIOS_ATIKOR_4620P_PATH_H, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - loadfont(FONT_ATIKOR_4620P_PATH, 6); + video_load_font(FONT_ATIKOR_4620P_PATH, FONT_FORMAT_KSC6501, LOAD_FONT_NO_OFFSET); break; case 2: rom_init(&ati28800->bios_rom, BIOS_ATIKOR_6033P_PATH, 0xc0000, 0x8000, 0x7fff, 0, MEM_MAPPING_EXTERNAL); - loadfont(FONT_ATIKOR_6033P_PATH, 6); + video_load_font(FONT_ATIKOR_6033P_PATH, FONT_FORMAT_KSC6501,LOAD_FONT_NO_OFFSET); break; } diff --git a/src/video/vid_cga.c b/src/video/vid_cga.c index 3bedf53a4..f4c93e9c4 100644 --- a/src/video/vid_cga.c +++ b/src/video/vid_cga.c @@ -782,13 +782,13 @@ cga_standalone_init(UNUSED(const device_t *info)) switch(device_get_config_int("font")) { case 0: - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 1: - loadfont(FONT_IBM_MDA_437_NORDIC_PATH, 0); + video_load_font(FONT_IBM_MDA_437_NORDIC_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 4: - loadfont(FONT_TULIP_DGA_PATH, 0); + video_load_font(FONT_TULIP_DGA_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; } @@ -802,7 +802,7 @@ cga_pravetz_init(const device_t *info) { cga_t *cga = cga_standalone_init(info); - loadfont("roms/video/cga/PRAVETZ-VDC2.BIN", 10); + video_load_font("roms/video/cga/PRAVETZ-VDC2.BIN", FONT_FORMAT_PRAVETZ, LOAD_FONT_NO_OFFSET); io_removehandler(0x03dd, 0x0001, cga_in, NULL, NULL, cga_out, NULL, NULL, cga); io_sethandler(0x03dd, 0x0001, cga_pravetz_in, NULL, NULL, cga_pravetz_out, NULL, NULL, cga); diff --git a/src/video/vid_cga_ncr.c b/src/video/vid_cga_ncr.c index 6b0f15f65..cda38036b 100644 --- a/src/video/vid_cga_ncr.c +++ b/src/video/vid_cga_ncr.c @@ -562,7 +562,7 @@ nga_init(UNUSED(const device_t *info)) charset = device_get_config_int("charset"); - loadfont_ex("roms/video/nga/ncr_nga_35122.bin", 1, 4096 * charset); + video_load_font("roms/video/nga/ncr_nga_35122.bin", 1, 4096 * charset); nga->cga.composite = 0; nga->cga.snow_enabled = device_get_config_int("snow_enabled"); diff --git a/src/video/vid_cga_olivetti.c b/src/video/vid_cga_olivetti.c index 4cb845684..bd565c0d7 100644 --- a/src/video/vid_cga_olivetti.c +++ b/src/video/vid_cga_olivetti.c @@ -592,7 +592,7 @@ ogc_init(UNUSED(const device_t *info)) memset(ogc, 0x00, sizeof(ogc_t)); video_inform(VIDEO_FLAG_TYPE_CGA, &timing_ogc); - loadfont("roms/video/ogc/ogc graphics board go380 258 pqbq.bin", 1); + video_load_font("roms/video/ogc/ogc graphics board go380 258 pqbq.bin", FONT_FORMAT_PC200, LOAD_FONT_NO_OFFSET); /* FIXME: composite is not working yet */ #if 0 diff --git a/src/video/vid_cga_quadcolor.c b/src/video/vid_cga_quadcolor.c index 4159dc2c1..c5c3d3456 100644 --- a/src/video/vid_cga_quadcolor.c +++ b/src/video/vid_cga_quadcolor.c @@ -828,13 +828,13 @@ quadcolor_standalone_init(UNUSED(const device_t *info)) switch(device_get_config_int("font")) { case 0: - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 1: - loadfont(FONT_IBM_MDA_437_NORDIC_PATH, 0); + video_load_font(FONT_IBM_MDA_437_NORDIC_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 4: - loadfont(FONT_TULIP_DGA_PATH, 0); + video_load_font(FONT_TULIP_DGA_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; } diff --git a/src/video/vid_cga_toshiba_t1000.c b/src/video/vid_cga_toshiba_t1000.c index 894d28a56..2a16a7d0e 100644 --- a/src/video/vid_cga_toshiba_t1000.c +++ b/src/video/vid_cga_toshiba_t1000.c @@ -650,7 +650,7 @@ static void * t1000_init(UNUSED(const device_t *info)) { t1000_t *t1000 = calloc(1, sizeof(t1000_t)); - loadfont("roms/machines/t1000/t1000font.bin", 8); + video_load_font("roms/machines/t1000/t1000font.bin", FONT_FORMAT_PC1512_T1000, LOAD_FONT_NO_OFFSET); cga_init(&t1000->cga); video_inform(VIDEO_FLAG_TYPE_CGA, &timing_t1000); diff --git a/src/video/vid_cga_toshiba_t3100e.c b/src/video/vid_cga_toshiba_t3100e.c index 25f079204..d8344426b 100644 --- a/src/video/vid_cga_toshiba_t3100e.c +++ b/src/video/vid_cga_toshiba_t3100e.c @@ -654,7 +654,7 @@ void * t3100e_init(UNUSED(const device_t *info)) { t3100e_t *t3100e = calloc(1, sizeof(t3100e_t)); - loadfont("roms/machines/t3100e/t3100e_font.bin", 5); + video_load_font("roms/machines/t3100e/t3100e_font.bin", FONT_FORMAT_TOSHIBA_3100E, LOAD_FONT_NO_OFFSET); cga_init(&t3100e->cga); video_inform(VIDEO_FLAG_TYPE_CGA, &timing_t3100e); diff --git a/src/video/vid_cga_v6355.c b/src/video/vid_cga_v6355.c index 1ddc1f2cd..f259f6277 100644 --- a/src/video/vid_cga_v6355.c +++ b/src/video/vid_cga_v6355.c @@ -924,13 +924,13 @@ v6355_standalone_init(const device_t *info) { switch(device_get_config_int("font")) { case 0: - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 1: - loadfont(FONT_IBM_MDA_437_NORDIC_PATH, 0); + video_load_font(FONT_IBM_MDA_437_NORDIC_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 4: - loadfont(FONT_TULIP_DGA_PATH, 0); + video_load_font(FONT_TULIP_DGA_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; } diff --git a/src/video/vid_et4000.c b/src/video/vid_et4000.c index 937623689..c17495c1e 100644 --- a/src/video/vid_et4000.c +++ b/src/video/vid_et4000.c @@ -850,7 +850,7 @@ et4000_init(const device_t *info) et4000k_in, NULL, NULL, et4000k_out, NULL, NULL, dev); io_sethandler(0x32cb, 1, et4000k_in, NULL, NULL, et4000k_out, NULL, NULL, dev); - loadfont(KOREAN_FONT_ROM_PATH, 6); + video_load_font(KOREAN_FONT_ROM_PATH, FONT_FORMAT_KSC6501, LOAD_FONT_NO_OFFSET); fn = KOREAN_BIOS_ROM_PATH; break; @@ -884,7 +884,7 @@ et4000_init(const device_t *info) et4000_kasan_in, NULL, NULL, et4000_kasan_out, NULL, NULL, dev); io_sethandler(0x0258, 2, et4000_kasan_in, NULL, NULL, et4000_kasan_out, NULL, NULL, dev); - loadfont(KASAN_FONT_ROM_PATH, 6); + video_load_font(KASAN_FONT_ROM_PATH, FONT_FORMAT_KSC6501, LOAD_FONT_NO_OFFSET); fn = KASAN_BIOS_ROM_PATH; break; diff --git a/src/video/vid_genius.c b/src/video/vid_genius.c index 472217d30..5dd3d2ade 100644 --- a/src/video/vid_genius.c +++ b/src/video/vid_genius.c @@ -744,7 +744,7 @@ genius_init(UNUSED(const device_t *info)) /* 160k video RAM */ genius->vram = malloc(0x28000); - loadfont(BIOS_ROM_PATH, 4); + video_load_font(BIOS_ROM_PATH, FONT_FORMAT_MDSI_GENIUS, LOAD_FONT_NO_OFFSET); timer_add(&genius->timer, genius_poll, genius, 1); diff --git a/src/video/vid_hercules.c b/src/video/vid_hercules.c index 758b041af..a53ea9871 100644 --- a/src/video/vid_hercules.c +++ b/src/video/vid_hercules.c @@ -542,19 +542,19 @@ hercules_init(UNUSED(const device_t *info)) switch(device_get_config_int("font")) { case 0: - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 1: - loadfont(FONT_IBM_MDA_437_NORDIC_PATH, 0); + video_load_font(FONT_IBM_MDA_437_NORDIC_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 2: - loadfont(FONT_KAM_PATH, 0); + video_load_font(FONT_KAM_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 3: - loadfont(FONT_KAMCL16_PATH, 0); + video_load_font(FONT_KAMCL16_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 4: - loadfont(FONT_TULIP_DGA_PATH, 0); + video_load_font(FONT_TULIP_DGA_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; } diff --git a/src/video/vid_hercules_incolor.c b/src/video/vid_hercules_incolor.c index b9be0765e..e6acb9bbb 100644 --- a/src/video/vid_hercules_incolor.c +++ b/src/video/vid_hercules_incolor.c @@ -994,19 +994,19 @@ incolor_init(UNUSED(const device_t *info)) switch(device_get_config_int("font")) { case 0: - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 1: - loadfont(FONT_IBM_MDA_437_NORDIC_PATH, 0); + video_load_font(FONT_IBM_MDA_437_NORDIC_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 2: - loadfont(FONT_KAM_PATH, 0); + video_load_font(FONT_KAM_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 3: - loadfont(FONT_KAMCL16_PATH, 0); + video_load_font(FONT_KAMCL16_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 4: - loadfont(FONT_TULIP_DGA_PATH, 0); + video_load_font(FONT_TULIP_DGA_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; } diff --git a/src/video/vid_hercules_plus.c b/src/video/vid_hercules_plus.c index 25b44ad70..f6eb2e9fb 100644 --- a/src/video/vid_hercules_plus.c +++ b/src/video/vid_hercules_plus.c @@ -631,19 +631,19 @@ herculesplus_init(UNUSED(const device_t *info)) switch(device_get_config_int("font")) { case 0: - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 1: - loadfont(FONT_IBM_MDA_437_NORDIC_PATH, 0); + video_load_font(FONT_IBM_MDA_437_NORDIC_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 2: - loadfont(FONT_KAM_PATH, 0); + video_load_font(FONT_KAM_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 3: - loadfont(FONT_KAMCL16_PATH, 0); + video_load_font(FONT_KAMCL16_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 4: - loadfont(FONT_TULIP_DGA_PATH, 0); + video_load_font(FONT_TULIP_DGA_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; } diff --git a/src/video/vid_im1024.c b/src/video/vid_im1024.c index 1ade8badb..b16855229 100644 --- a/src/video/vid_im1024.c +++ b/src/video/vid_im1024.c @@ -1036,7 +1036,7 @@ im1024_init(UNUSED(const device_t *info)) dev = (im1024_t *) malloc(sizeof(im1024_t)); memset(dev, 0x00, sizeof(im1024_t)); - loadfont(BIOS_ROM_PATH, 9); + video_load_font(BIOS_ROM_PATH, FONT_FORMAT_IM1024, LOAD_FONT_NO_OFFSET); dev->fifo_len = 4096; dev->fifo = (uint8_t *) malloc(dev->fifo_len); diff --git a/src/video/vid_jega.c b/src/video/vid_jega.c index d3c806708..8a34b9f61 100644 --- a/src/video/vid_jega.c +++ b/src/video/vid_jega.c @@ -686,7 +686,7 @@ readfontxtbl(fontx_tbl *table, int size, FILE *fp) } static int -LoadFontxFile(const char *fn, void *priv) +jega_load_font(const char *fn, void *priv) { fontx_h fhead; fontx_tbl *ftbl; @@ -793,7 +793,7 @@ jega_standalone_init(const device_t *info) rom_init(&jega->bios_rom, JEGA_PATH_BIOS, 0xc0000, 0x8000, 0x7fff, 0, 0); memset(&jega->jfont_dbcs_16, 0, DBCS16_FILESIZE); - LoadFontxFile(JEGA_PATH_FONTDBCS, jega); + jega_load_font(JEGA_PATH_FONTDBCS, jega); jega_commoninit(info, jega, 0); @@ -807,7 +807,7 @@ jvga_standalone_init(const device_t *info) rom_init(&jega->bios_rom, JVGA_PATH_BIOS, 0xc0000, 0x8000, 0x7fff, 0, 0); memset(&jega->jfont_dbcs_16, 0, DBCS16_FILESIZE); - LoadFontxFile(JVGA_PATH_FONTDBCS, jega); + jega_load_font(JVGA_PATH_FONTDBCS, jega); jega_commoninit(info, jega, 1); @@ -1024,7 +1024,7 @@ if386jega_init(const device_t *info) rom_init(&jega->bios_rom, IF386_PATH_VBIOS, 0xc0000, 0x8000, 0x7fff, 0, 0); memset(&jega->jfont_dbcs_16, 0, DBCS16_FILESIZE); - LoadFontxFile(JEGA_PATH_FONTDBCS, jega); + jega_load_font(JEGA_PATH_FONTDBCS, jega); jega_commoninit(info, jega, 0); diff --git a/src/video/vid_mda.c b/src/video/vid_mda.c index f530419f2..574e31550 100644 --- a/src/video/vid_mda.c +++ b/src/video/vid_mda.c @@ -414,27 +414,27 @@ mda_init(mda_t *mda) void * mda_standalone_init(UNUSED(const device_t *info)) { - mda_t *mda = malloc(sizeof(mda_t)); - memset(mda, 0, sizeof(mda_t)); + mda_t *mda = calloc(1, sizeof(mda_t)); + video_inform(VIDEO_FLAG_TYPE_MDA, &timing_mda); - mda->vram = malloc(0x1000); + mda->vram = malloc(MDA_VRAM); switch (device_get_config_int("font")) { case 0: - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 1: - loadfont(FONT_IBM_MDA_437_NORDIC_PATH, 0); + video_load_font(FONT_IBM_MDA_437_NORDIC_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 2: - loadfont(FONT_KAM_PATH, 0); + video_load_font(FONT_KAM_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 3: - loadfont(FONT_KAMCL16_PATH, 0); + video_load_font(FONT_KAMCL16_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; case 4: - loadfont(FONT_TULIP_DGA_PATH, 0); + video_load_font(FONT_TULIP_DGA_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); break; } diff --git a/src/video/vid_ps55da2.c b/src/video/vid_ps55da2.c index a97d2aa84..3df73f92c 100644 --- a/src/video/vid_ps55da2.c +++ b/src/video/vid_ps55da2.c @@ -3149,7 +3149,7 @@ da2_poll(void *priv) } static void -da2_loadfont(char *fname, void *priv) +da2_video_load_font(char *fname, void *priv) { da2_t *da2 = (da2_t *) priv; uint8_t buf; @@ -3267,10 +3267,10 @@ da2_init(UNUSED(const device_t *info)) da2->mmio.font = malloc(DA2_FONTROM_SIZE); switch (da2->mmio.charset) { case DA2_DCONFIG_CHARSET_HANT: - da2_loadfont(DA2_FONTROM_PATH_HANT, da2); + da2_video_load_font(DA2_FONTROM_PATH_HANT, da2); break; case DA2_DCONFIG_CHARSET_JPAN: - da2_loadfont(DA2_FONTROM_PATH_JPAN, da2); + da2_video_load_font(DA2_FONTROM_PATH_JPAN, da2); /* Add magic code for OS/2 J1.3. This disables BitBlt's text drawing function. */ da2->mmio.font[0x1AFFE] = 0x80; da2->mmio.font[0x1AFFF] = 0x01; diff --git a/src/video/vid_sigma.c b/src/video/vid_sigma.c index 4759bb7af..d2c79b62e 100644 --- a/src/video/vid_sigma.c +++ b/src/video/vid_sigma.c @@ -794,7 +794,7 @@ sigma_init(UNUSED(const device_t *info)) sigma->enable_nmi = device_get_config_int("enable_nmi"); - loadfont(ROM_SIGMA_FONT, 7); + video_load_font(ROM_SIGMA_FONT, FONT_FORMAT_SIGMA, LOAD_FONT_NO_OFFSET); rom_init(&sigma->bios_rom, ROM_SIGMA_BIOS, bios_addr, 0x2000, 0x1FFF, 0, MEM_MAPPING_EXTERNAL); /* The BIOS ROM is overlaid by RAM, so remove its default mapping diff --git a/src/video/vid_svga_render.c b/src/video/vid_svga_render.c index 25b3cd946..f266fbf8f 100644 --- a/src/video/vid_svga_render.c +++ b/src/video/vid_svga_render.c @@ -91,7 +91,7 @@ svga_render_blank(svga_t *svga) line_width -= svga->x_add; } - if (((svga->hdisp + svga->scrollcache) > 0) && (line_width >= 0)) + if ((line_ptr != NULL) && ((svga->hdisp + svga->scrollcache) > 0) && (line_width >= 0)) memset(line_ptr, 0, line_width); } @@ -106,7 +106,7 @@ svga_render_overscan_left(svga_t *svga) uint32_t *line_ptr = svga->monitor->target_buffer->line[svga->displine + svga->y_add]; - if (svga->x_add >= 0) for (int i = 0; i < svga->x_add; i++) + if ((line_ptr != NULL) && (svga->x_add >= 0)) for (int i = 0; i < svga->x_add; i++) *line_ptr++ = svga->overscan_color; } @@ -121,10 +121,15 @@ svga_render_overscan_right(svga_t *svga) if (svga->scrblank || (svga->hdisp <= 0)) return; - uint32_t *line_ptr = &svga->monitor->target_buffer->line[svga->displine + svga->y_add][svga->x_add + svga->hdisp]; + uint32_t *line_ptr = svga->monitor->target_buffer->line[svga->displine + svga->y_add]; right = overscan_x - svga->left_overscan; - for (int i = 0; i < right; i++) - *line_ptr++ = svga->overscan_color; + + if (line_ptr != NULL) { + line_ptr += svga->x_add + svga->hdisp; + + for (int i = 0; i < right; i++) + *line_ptr++ = svga->overscan_color; + } } void diff --git a/src/video/vid_table.c b/src/video/vid_table.c index cb7e794e8..88cd6789e 100644 --- a/src/video/vid_table.c +++ b/src/video/vid_table.c @@ -360,7 +360,7 @@ video_reset(int card) card, machine_has_flags(machine, MACHINE_VIDEO) ? 1 : 0); monitor_index_global = 0; - loadfont(FONT_IBM_MDA_437_PATH, 0); + video_load_font(FONT_IBM_MDA_437_PATH, FONT_FORMAT_MDA, LOAD_FONT_NO_OFFSET); for (uint8_t i = 1; i < GFXCARD_MAX; i ++) { if ((card != VID_NONE) && !machine_has_flags(machine, MACHINE_VIDEO_ONLY) && @@ -482,21 +482,3 @@ video_is_cga(void) { return (video_get_type() == VIDEO_FLAG_TYPE_CGA); } - -int -video_is_ega_vga(void) -{ - return (video_get_type() == VIDEO_FLAG_TYPE_SPECIAL); -} - -int -video_is_8514(void) -{ - return (video_get_type() == VIDEO_FLAG_TYPE_8514); -} - -int -video_is_xga(void) -{ - return (video_get_type() == VIDEO_FLAG_TYPE_XGA); -} diff --git a/src/video/vid_voodoo_banshee_blitter.c b/src/video/vid_voodoo_banshee_blitter.c index ac8cb172d..af609d785 100644 --- a/src/video/vid_voodoo_banshee_blitter.c +++ b/src/video/vid_voodoo_banshee_blitter.c @@ -1438,9 +1438,30 @@ banshee_polyfill_continue(voodoo_t *voodoo, uint32_t data) } } +static inline void +banshee_do_2d_launch(voodoo_t *voodoo) +{ + voodoo->launch_pending = 0; + voodoo->banshee_blt.rops[0] = voodoo->banshee_blt.command >> 24; + voodoo->banshee_blt.patoff_x = (voodoo->banshee_blt.command & COMMAND_PATOFF_X_MASK) >> COMMAND_PATOFF_X_SHIFT; + voodoo->banshee_blt.patoff_y = (voodoo->banshee_blt.command & COMMAND_PATOFF_Y_MASK) >> COMMAND_PATOFF_Y_SHIFT; + voodoo->banshee_blt.cur_x = 0; + voodoo->banshee_blt.cur_y = 0; + voodoo->banshee_blt.dstX = ((int32_t) (voodoo->banshee_blt.dstXY << 19)) >> 19; + voodoo->banshee_blt.dstY = ((int32_t) (voodoo->banshee_blt.dstXY << 3)) >> 19; + voodoo->banshee_blt.srcX = ((int32_t) (voodoo->banshee_blt.srcXY << 19)) >> 19; + voodoo->banshee_blt.srcY = ((int32_t) (voodoo->banshee_blt.srcXY << 3)) >> 19; + voodoo->banshee_blt.old_srcX = voodoo->banshee_blt.srcX; + voodoo->banshee_blt.host_data_remainder = 0; + voodoo->banshee_blt.host_data_count = 0; +} + static void banshee_do_2d_blit(voodoo_t *voodoo, int count, uint32_t data) { + if (voodoo->launch_pending) { + banshee_do_2d_launch(voodoo); + } switch (voodoo->banshee_blt.command & COMMAND_CMD_MASK) { case COMMAND_CMD_NOP: break; @@ -1691,21 +1712,7 @@ voodoo_2d_reg_writel(voodoo_t *voodoo, uint32_t addr, uint32_t val) case 0x70: voodoo_wait_for_render_thread_idle(voodoo); voodoo->banshee_blt.command = val; - voodoo->banshee_blt.rops[0] = val >> 24; -#if 0 - bansheeblt_log("command=%x %08x\n", voodoo->banshee_blt.command & COMMAND_CMD_MASK, val); -#endif - voodoo->banshee_blt.patoff_x = (val & COMMAND_PATOFF_X_MASK) >> COMMAND_PATOFF_X_SHIFT; - voodoo->banshee_blt.patoff_y = (val & COMMAND_PATOFF_Y_MASK) >> COMMAND_PATOFF_Y_SHIFT; - voodoo->banshee_blt.cur_x = 0; - voodoo->banshee_blt.cur_y = 0; - voodoo->banshee_blt.dstX = ((int32_t) (voodoo->banshee_blt.dstXY << 19)) >> 19; - voodoo->banshee_blt.dstY = ((int32_t) (voodoo->banshee_blt.dstXY << 3)) >> 19; - voodoo->banshee_blt.srcX = ((int32_t) (voodoo->banshee_blt.srcXY << 19)) >> 19; - voodoo->banshee_blt.srcY = ((int32_t) (voodoo->banshee_blt.srcXY << 3)) >> 19; - voodoo->banshee_blt.old_srcX = voodoo->banshee_blt.srcX; - voodoo->banshee_blt.host_data_remainder = 0; - voodoo->banshee_blt.host_data_count = 0; + voodoo->launch_pending = 1; switch (voodoo->banshee_blt.command & COMMAND_CMD_MASK) { #if 0 @@ -1725,6 +1732,7 @@ voodoo_2d_reg_writel(voodoo_t *voodoo, uint32_t addr, uint32_t val) #endif case COMMAND_CMD_POLYFILL: + banshee_do_2d_launch(voodoo); if (val & COMMAND_INITIATE) { voodoo->banshee_blt.dstXY = voodoo->banshee_blt.srcXY; voodoo->banshee_blt.dstX = voodoo->banshee_blt.srcX; @@ -1733,6 +1741,10 @@ voodoo_2d_reg_writel(voodoo_t *voodoo, uint32_t addr, uint32_t val) banshee_polyfill_start(voodoo); break; + case COMMAND_CMD_HOST_TO_SCREEN_BLT: + case COMMAND_CMD_HOST_TO_SCREEN_STRETCH_BLT: + break; + default: if (val & COMMAND_INITIATE) { banshee_do_2d_blit(voodoo, -1, 0); @@ -1779,6 +1791,9 @@ voodoo_2d_reg_writel(voodoo_t *voodoo, uint32_t addr, uint32_t val) #if 0 bansheeblt_log("launch %08x %08x %08x %08x\n", voodoo->banshee_blt.command, voodoo->banshee_blt.commandExtra, voodoo->banshee_blt.srcColorkeyMin, voodoo->banshee_blt.srcColorkeyMax); #endif + if (voodoo->launch_pending) { + banshee_do_2d_launch(voodoo); + } switch (voodoo->banshee_blt.command & COMMAND_CMD_MASK) { case COMMAND_CMD_SCREEN_TO_SCREEN_BLT: voodoo->banshee_blt.srcXY = val; diff --git a/src/video/vid_voodoo_blitter.c b/src/video/vid_voodoo_blitter.c index 0d2c9e103..d4b316dc5 100644 --- a/src/video/vid_voodoo_blitter.c +++ b/src/video/vid_voodoo_blitter.c @@ -218,14 +218,7 @@ skip_pixel_blit: break; case BLIT_COMMAND_CPU_TO_SCREEN: - voodoo->blt.dst_x = voodoo->bltDstX; - voodoo->blt.dst_y = voodoo->bltDstY; - voodoo->blt.cur_x = 0; - voodoo->blt.size_x = size_x; - voodoo->blt.size_y = size_y; - voodoo->blt.x_dir = x_dir; - voodoo->blt.y_dir = y_dir; - voodoo->blt.dst_stride = (voodoo->bltCommand & BLTCMD_DST_TILED) ? ((voodoo->bltDstXYStride & 0x3f) * 32 * 2) : (voodoo->bltDstXYStride & 0xff8); + voodoo->launch_pending = 1; break; case BLIT_COMMAND_RECT_FILL: @@ -234,13 +227,13 @@ skip_pixel_blit: int dst_x = voodoo->bltDstX; if (SLI_ENABLED) { - if ((!(voodoo->initEnable & INITENABLE_SLI_MASTER_SLAVE) && (voodoo->blt.dst_y & 1)) || ((voodoo->initEnable & INITENABLE_SLI_MASTER_SLAVE) && !(voodoo->blt.dst_y & 1))) + if ((!(voodoo->initEnable & INITENABLE_SLI_MASTER_SLAVE) && (dst_y & 1)) || ((voodoo->initEnable & INITENABLE_SLI_MASTER_SLAVE) && !(dst_y & 1))) goto skip_line_fill; dst = (uint16_t *) &voodoo->fb_mem[dst_base_addr + (dst_y >> 1) * dst_stride]; } else dst = (uint16_t *) &voodoo->fb_mem[dst_base_addr + dst_y * dst_stride]; - for (int x = 0; x <= size_x; x++) { + for (int x = 0; x < size_x; x++) { if (voodoo->bltCommand & BLIT_CLIPPING_ENABLED) { if (dst_x < voodoo->bltClipLeft || dst_x >= voodoo->bltClipRight || dst_y < voodoo->bltClipLowY || dst_y >= voodoo->bltClipHighY) goto skip_pixel_fill; @@ -303,6 +296,18 @@ voodoo_v2_blit_data(voodoo_t *voodoo, uint32_t data) if ((voodoo->bltCommand & BLIT_COMMAND_MASK) != BLIT_COMMAND_CPU_TO_SCREEN) return; + if (voodoo->launch_pending) { + voodoo->blt.dst_x = voodoo->bltDstX; + voodoo->blt.dst_y = voodoo->bltDstY; + voodoo->blt.cur_x = 0; + voodoo->blt.size_x = voodoo->bltSizeX; + voodoo->blt.size_y = voodoo->bltSizeY; + voodoo->blt.x_dir = (voodoo->bltSizeX > 0) ? 1 : -1; + voodoo->blt.y_dir = (voodoo->bltSizeY > 0) ? 1 : -1; + voodoo->blt.dst_stride = (voodoo->bltCommand & BLTCMD_DST_TILED) ? ((voodoo->bltDstXYStride & 0x3f) * 32 * 2) : (voodoo->bltDstXYStride & 0xff8); + voodoo->launch_pending = 0; + } + if (SLI_ENABLED) { addr = base_addr + (voodoo->blt.dst_y >> 1) * voodoo->blt.dst_stride; dst = (uint16_t *) &voodoo->fb_mem[addr]; diff --git a/src/video/vid_voodoo_display.c b/src/video/vid_voodoo_display.c index 3595d8b89..b126fc165 100644 --- a/src/video/vid_voodoo_display.c +++ b/src/video/vid_voodoo_display.c @@ -645,6 +645,8 @@ skip_draw: if (voodoo->dirty_line_high > voodoo->dirty_line_low || force_blit) svga_doblit(voodoo->h_disp, voodoo->v_disp - 1, voodoo->svga); + else if (voodoo->svga->override) + voodoo->svga->monitor->mon_renderedframes++; if (voodoo->clutData_dirty) { voodoo->clutData_dirty = 0; voodoo_calc_clutData(voodoo); diff --git a/src/video/vid_voodoo_fb.c b/src/video/vid_voodoo_fb.c index 1c140873f..a97ca62a7 100644 --- a/src/video/vid_voodoo_fb.c +++ b/src/video/vid_voodoo_fb.c @@ -254,6 +254,19 @@ voodoo_fb_writew(uint32_t addr, uint16_t val, void *priv) int colbfog_g = 0; int colbfog_b = 0; + if (params->fbzMode & FBZ_STIPPLE) { + if (params->fbzMode & FBZ_STIPPLE_PATT) { + int index = ((y & 3) << 3) | (~x & 7); + if (!(params->stipple & (1 << index))) + goto skip_pixel; + } else { + voodoo->params.stipple = (voodoo->params.stipple << 1) | (voodoo->params.stipple >> 31); + if (!(voodoo->params.stipple & 0x80000000)) { + goto skip_pixel; + } + } + } + if (params->fbzMode & FBZ_DEPTH_ENABLE) { uint16_t old_depth = *(uint16_t *) (&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]); @@ -449,6 +462,19 @@ voodoo_fb_writel(uint32_t addr, uint32_t val, void *priv) int colbfog_g = 0; int colbfog_b = 0; + if (params->fbzMode & FBZ_STIPPLE) { + if (params->fbzMode & FBZ_STIPPLE_PATT) { + int index = ((y & 3) << 3) | (~(x + c) & 7); + if (!(params->stipple & (1 << index))) + goto skip_pixel; + } else { + voodoo->params.stipple = (voodoo->params.stipple << 1) | (voodoo->params.stipple >> 31); + if (!(voodoo->params.stipple & 0x80000000)) { + goto skip_pixel; + } + } + } + if (params->fbzMode & FBZ_DEPTH_ENABLE) { uint16_t old_depth = *(uint16_t *) (&voodoo->fb_mem[write_addr_aux & voodoo->fb_mask]); diff --git a/src/video/vid_voodoo_render.c b/src/video/vid_voodoo_render.c index 97186634d..b25f42507 100644 --- a/src/video/vid_voodoo_render.c +++ b/src/video/vid_voodoo_render.c @@ -88,6 +88,8 @@ typedef struct voodoo_state_t { uint32_t texBaseAddr; int lod_frac[2]; + + int stipple; } voodoo_state_t; #ifdef ENABLE_VOODOO_RENDER_LOG @@ -990,6 +992,20 @@ voodoo_half_triangle(voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t * w_depth = 0xffff; } + if (params->fbzMode & FBZ_STIPPLE) { + if (params->fbzMode & FBZ_STIPPLE_PATT) { + int index = ((real_y & 3) << 3) | (~x & 7); + + if (!(state->stipple & (1 << index))) + goto skip_pixel; + } else { + state->stipple = (state->stipple << 1) | (state->stipple >> 31); + if (!(state->stipple & 0x80000000)) { + goto skip_pixel; + } + } + } + #if 0 w_depth = CLAMP16(w_depth); #endif @@ -1560,6 +1576,7 @@ voodoo_render_log("voodoo_triangle %i %i %i : vA %f, %f vB %f, %f vC %f, %f f if (lodbias & 0x20) lodbias |= ~0x3f; state.tmu[1].lod = LOD + (lodbias << 6); + state.stipple = params->stipple; voodoo_half_triangle(voodoo, params, &state, vertexAy_adjusted, vertexCy_adjusted, odd_even); } diff --git a/src/video/vid_wy700.c b/src/video/vid_wy700.c index bd9ba9386..0245b7e3e 100644 --- a/src/video/vid_wy700.c +++ b/src/video/vid_wy700.c @@ -886,7 +886,7 @@ wy700_init(UNUSED(const device_t *info)) /* 128k video RAM */ wy700->vram = malloc(0x20000); - loadfont("roms/video/wyse700/wy700.rom", 3); + video_load_font("roms/video/wyse700/wy700.rom", FONT_FORMAT_WY700, LOAD_FONT_NO_OFFSET); timer_add(&wy700->timer, wy700_poll, wy700, 1); diff --git a/src/video/video.c b/src/video/video.c index 81fe3a26b..4c4256a89 100644 --- a/src/video/video.c +++ b/src/video/video.c @@ -8,37 +8,8 @@ * * Main video-rendering module. * - * Video timing settings - - * - * 8-bit - 1mb/sec - * B = 8 ISA clocks - * W = 16 ISA clocks - * L = 32 ISA clocks - * - * Slow 16-bit - 2mb/sec - * B = 6 ISA clocks - * W = 8 ISA clocks - * L = 16 ISA clocks - * - * Fast 16-bit - 4mb/sec - * B = 3 ISA clocks - * W = 3 ISA clocks - * L = 6 ISA clocks - * - * Slow VLB/PCI - 8mb/sec (ish) - * B = 4 bus clocks - * W = 8 bus clocks - * L = 16 bus clocks - * - * Mid VLB/PCI - - * B = 4 bus clocks - * W = 5 bus clocks - * L = 10 bus clocks - * - * Fast VLB/PCI - - * B = 3 bus clocks - * W = 3 bus clocks - * L = 4 bus clocks + * Video timings are set individually by the graphics cards. + * * * Authors: Sarah Walker, * Miran Grca, @@ -79,8 +50,6 @@ uint8_t edatlookup[4][4]; uint8_t egaremap2bpp[256]; uint8_t fontdat[2048][8]; /* IBM CGA font */ uint8_t fontdatm[2048][16]; /* IBM MDA font */ -uint8_t fontdat2[2048][8]; /* IBM CGA 2nd instance font */ -uint8_t fontdatm2[2048][16]; /* IBM MDA 2nd instance font */ uint8_t fontdatw[512][32]; /* Wyse700 font */ uint8_t fontdat8x12[256][16]; /* MDSI Genius font */ uint8_t fontdat12x18[256][36]; /* IM1024 font */ @@ -793,30 +762,6 @@ hline(bitmap_t *b, int x1, int y, int x2, uint32_t col) b->line[y][x] = col; } -void -blit(UNUSED(bitmap_t *src), UNUSED(bitmap_t *dst), UNUSED(int x1), UNUSED(int y1), UNUSED(int x2), UNUSED(int y2), UNUSED(int xs), UNUSED(int ys)) -{ - // -} - -void -stretch_blit(UNUSED(bitmap_t *src), UNUSED(bitmap_t *dst), UNUSED(int x1), UNUSED(int y1), UNUSED(int xs1), UNUSED(int ys1), UNUSED(int x2), UNUSED(int y2), UNUSED(int xs2), UNUSED(int ys2)) -{ - // -} - -void -rectfill(UNUSED(bitmap_t *b), UNUSED(int x1), UNUSED(int y1), UNUSED(int x2), UNUSED(int y2), UNUSED(uint32_t col)) -{ - // -} - -void -set_palette(UNUSED(PALETTE p)) -{ - // -} - void destroy_bitmap(bitmap_t *b) { @@ -1005,10 +950,18 @@ video_force_resize_set_monitor(uint8_t res, int monitor_index) } void -loadfont_common(FILE *fp, int format) +video_load_font(char *fn, int format, int offset) { + FILE *fp; + + fp = rom_fopen(fn, "rb"); + if (fp == NULL) + return; + + fseek(fp, offset, SEEK_SET); + switch (format) { - case 0: /* MDA */ + case FONT_FORMAT_MDA: /* MDA */ for (uint16_t c = 0; c < 256; c++) /* 8x14 MDA in 8x8 cell (lines 0-7) */ for (uint8_t d = 0; d < 8; d++) fontdatm[c][d] = fgetc(fp) & 0xff; @@ -1021,7 +974,7 @@ loadfont_common(FILE *fp, int format) fontdat[c][d] = fgetc(fp) & 0xff; break; - case 1: /* PC200 */ + case FONT_FORMAT_PC200: /* PC200 */ for (uint8_t d = 0; d < 4; d++) { /* There are 4 fonts in the ROM */ for (uint16_t c = 0; c < 256; c++) /* 8x14 MDA in 8x16 cell */ @@ -1033,26 +986,25 @@ loadfont_common(FILE *fp, int format) } break; - default: - case 2: /* CGA */ + case FONT_FORMAT_CGA: /* CGA */ for (uint16_t c = 0; c < 256; c++) for (uint8_t d = 0; d < 8; d++) fontdat[c][d] = fgetc(fp) & 0xff; break; - case 3: /* Wyse 700 */ + case FONT_FORMAT_WY700: /* Wyse 700 */ for (uint16_t c = 0; c < 512; c++) for (uint8_t d = 0; d < 32; d++) fontdatw[c][d] = fgetc(fp) & 0xff; break; - case 4: /* MDSI Genius */ + case FONT_FORMAT_MDSI_GENIUS: /* MDSI Genius */ for (uint16_t c = 0; c < 256; c++) for (uint8_t d = 0; d < 16; d++) fontdat8x12[c][d] = fgetc(fp) & 0xff; break; - case 5: /* Toshiba 3100e */ + case FONT_FORMAT_TOSHIBA_3100E: /* Toshiba 3100e */ for (uint16_t d = 0; d < 2048; d += 512) { /* Four languages... */ for (uint16_t c = d; c < d + 256; c++) { (void) !fread(&fontdatm[c][8], 1, 8, fp); @@ -1076,7 +1028,7 @@ loadfont_common(FILE *fp, int format) } break; - case 6: /* Korean KSC-5601 */ + case FONT_FORMAT_KSC6501: /* Korean KSC-5601 */ if (!fontdatksc5601) fontdatksc5601 = malloc(16384 * sizeof(dbcs_font_t)); @@ -1089,7 +1041,7 @@ loadfont_common(FILE *fp, int format) } break; - case 7: /* Sigma Color 400 */ + case FONT_FORMAT_SIGMA: /* Sigma Color 400 */ /* The first 4k of the character ROM holds an 8x8 font */ for (uint16_t c = 0; c < 256; c++) { (void) !fread(&fontdat[c][0], 1, 8, fp); @@ -1098,62 +1050,32 @@ loadfont_common(FILE *fp, int format) /* The second 4k holds an 8x16 font */ for (uint16_t c = 0; c < 256; c++) { if (fread(&fontdatm[c][0], 1, 16, fp) != 16) - fatal("loadfont(): Error reading 8x16 font in Sigma Color 400 mode, c = %i\n", c); + fatal("video_load_font(): Error reading 8x16 font in Sigma Color 400 mode, c = %i\n", c); } break; - case 8: /* Amstrad PC1512, Toshiba T1000/T1200 */ + case FONT_FORMAT_PC1512_T1000: /* Amstrad PC1512, Toshiba T1000/T1200 */ for (uint16_t c = 0; c < 2048; c++) /* Allow up to 2048 chars */ for (uint8_t d = 0; d < 8; d++) fontdat[c][d] = fgetc(fp) & 0xff; break; - case 9: /* Image Manager 1024 native font */ + case FONT_FORMAT_IM1024: /* Image Manager 1024 native font */ for (uint16_t c = 0; c < 256; c++) (void) !fread(&fontdat12x18[c][0], 1, 36, fp); break; - case 10: /* Pravetz */ + case FONT_FORMAT_PRAVETZ: /* Pravetz */ for (uint16_t c = 0; c < 1024; c++) /* Allow up to 1024 chars */ for (uint8_t d = 0; d < 8; d++) fontdat[c][d] = fgetc(fp) & 0xff; break; - case 11: /* PC200 */ - for (uint8_t d = 0; d < 4; d++) { - /* There are 4 fonts in the ROM */ - for (uint16_t c = 0; c < 256; c++) /* 8x14 MDA in 8x16 cell */ - (void) !fread(&fontdatm2[256 * d + c][0], 1, 16, fp); - for (uint16_t c = 0; c < 256; c++) { /* 8x8 CGA in 8x16 cell */ - (void) !fread(&fontdat2[256 * d + c][0], 1, 8, fp); - fseek(fp, 8, SEEK_CUR); - } - } - break; } (void) fclose(fp); } -void -loadfont_ex(char *fn, int format, int offset) -{ - FILE *fp; - - fp = rom_fopen(fn, "rb"); - if (fp == NULL) - return; - - fseek(fp, offset, SEEK_SET); - loadfont_common(fp, format); -} - -void -loadfont(char *fn, int format) -{ - loadfont_ex(fn, format, 0); -} - uint32_t video_color_transform(uint32_t color) { diff --git a/vcpkg.json b/vcpkg.json index 43cf367c5..4c0d502ef 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,6 +1,6 @@ { "name": "86box", - "version-string": "5.3", + "version-string": "5.4", "homepage": "https://86box.net/", "documentation": "https://86box.readthedocs.io/", "license": "GPL-2.0-or-later",