+#include
+#define HAVE_STDARG_H
+
+#include <86box/86box.h>
+#include <86box/device.h>
+#include <86box/io.h>
+#include <86box/midi.h>
+#include <86box/timer.h>
+#include <86box/pic.h>
+#include <86box/dma.h>
+#include <86box/sound.h>
+#include <86box/gameport.h>
+#include <86box/snd_sb.h>
+#include <86box/mem.h>
+#include <86box/rom.h>
+#include <86box/plat_unused.h>
+#include <86box/isapnp.h>
+#include <86box/log.h>
+
+#define PNP_ROM_AD1816 "roms/sound/ad1816/ad1816.bin"
+
+#ifdef ENABLE_AD1816_LOG
+int ad1816_do_log = ENABLE_AD1816_LOG;
+
+static void
+ad1816_log(void *priv, const char *fmt, ...)
+{
+ if (ad1816_do_log) {
+ va_list ap;
+ va_start(ap, fmt);
+ log_out(priv, fmt, ap);
+ va_end(ap);
+ }
+}
+#else
+# define ad1816_log(fmt, ...)
+#endif
+
+static double ad1816_vols_5bits[32];
+static double ad1816_vols_5bits_aux_gain[32];
+static int ad1816_vols_6bits[64];
+
+typedef struct ad1816_t {
+ uint8_t index;
+ uint8_t regs[16];
+ uint16_t iregs[64];
+
+ uint16_t cur_ad1816_addr;
+ uint16_t cur_sb_addr;
+ uint16_t cur_opl_addr;
+ uint16_t cur_mpu_addr;
+ uint16_t cur_js_addr;
+ uint8_t cur_irq;
+ uint8_t cur_mpu_irq;
+ uint8_t cur_dma;
+
+ int freq;
+
+ pc_timer_t timer_count;
+ uint64_t timer_latch;
+
+ pc_timer_t ad1816_irq_timer;
+
+ uint8_t status;
+ int count;
+ int16_t out_l;
+ int16_t out_r;
+ uint8_t fmt_mask;
+ uint8_t dma_ff;
+ uint32_t dma_data;
+ int16_t buffer[SOUNDBUFLEN * 2];
+ int pos;
+ uint8_t playback_pos : 2;
+ uint8_t enable;
+ uint8_t codec_enable;
+
+ double master_l;
+ double master_r;
+ double cd_vol_l;
+ double cd_vol_r;
+ int fm_vol_l;
+ int fm_vol_r;
+
+ void *gameport;
+ mpu_t *mpu;
+ sb_t *sb;
+
+ void *pnp_card;
+ uint8_t pnp_rom[512];
+ isapnp_device_config_t *ad1816_pnp_config;
+
+ void * log; /* New logging system */
+} ad1816_t;
+
+static void
+ad1816_update_mastervol(void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+
+ if (ad1816->iregs[14] & 0x8000)
+ ad1816->master_l = 0;
+ else
+ ad1816->master_l = ad1816_vols_5bits[(ad1816->iregs[14] >> 8) & 0x1f] / 65536.0;
+
+ if (ad1816->iregs[14] & 0x0080)
+ ad1816->master_r = 0;
+ else
+ ad1816->master_r = ad1816_vols_5bits[(ad1816->iregs[14]) & 0x1f] / 65536.0;
+}
+
+void
+ad1816_filter_cd_audio(int channel, double *buffer, void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+
+ ad1816_update_mastervol(ad1816);
+
+ const double cd_vol = channel ? ad1816->cd_vol_r : ad1816->cd_vol_l;
+ double master = channel ? ad1816->master_r : ad1816->master_l;
+ double c = ((*buffer * cd_vol / 1.0) * master) / 65536.0;
+
+ *buffer = c;
+}
+
+static void
+ad1816_filter_opl(void *priv, double *out_l, double *out_r)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+
+ ad1816_update_mastervol(ad1816);
+ *out_l *= ad1816->fm_vol_l;
+ *out_r *= ad1816->fm_vol_r;
+ *out_l *= ad1816->master_l;
+ *out_r *= ad1816->master_r;
+
+}
+
+void
+ad1816_update(ad1816_t *ad1816)
+{
+ for (; ad1816->pos < sound_pos_global; ad1816->pos++) {
+ ad1816->buffer[ad1816->pos * 2] = ad1816->out_l;
+ ad1816->buffer[ad1816->pos * 2 + 1] = ad1816->out_r;
+ }
+}
+
+static int16_t
+ad1816_process_mulaw(uint8_t byte)
+{
+ byte = ~byte;
+ int temp = (((byte & 0x0f) << 3) + 0x84);
+ temp <<= ((byte & 0x70) >> 4);
+ temp = (byte & 0x80) ? (0x84 - temp) : (temp - 0x84);
+ if (temp > 32767)
+ return 32767;
+ else if (temp < -32768)
+ return -32768;
+ return (int16_t) temp;
+}
+
+static int16_t
+ad1816_process_alaw(uint8_t byte)
+{
+ byte ^= 0x55;
+ int dec = ((byte & 0x0f) << 4);;
+ const int seg = (int) ((byte & 0x70) >> 4);
+ switch (seg) {
+ default:
+ dec |= 0x108;
+ dec <<= seg - 1;
+ break;
+
+ case 0:
+ dec |= 0x8;
+ break;
+
+ case 1:
+ dec |= 0x108;
+ break;
+ }
+ return (int16_t) ((byte & 0x80) ? dec : -dec);
+}
+
+static uint32_t
+ad1816_dma_channel_read(ad1816_t *ad1816, int channel)
+{
+ uint32_t ret;
+
+ if (channel >= 4) {
+ if (ad1816->dma_ff) {
+ ret = (ad1816->dma_data & 0xff00) >> 8;
+ ret |= (ad1816->dma_data & 0xffff0000);
+ } else {
+ ad1816->dma_data = dma_channel_read(channel);
+
+ if (ad1816->dma_data == DMA_NODATA)
+ return DMA_NODATA;
+
+ ret = ad1816->dma_data & 0xff;
+ }
+
+ ad1816->dma_ff = !ad1816->dma_ff;
+ } else
+ ret = dma_channel_read(channel);
+
+ return ret;
+}
+
+static void
+ad1816_poll(void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+
+ if (ad1816->timer_latch)
+ timer_advance_u64(&ad1816->timer_count, ad1816->timer_latch);
+ else
+ timer_advance_u64(&ad1816->timer_count, TIMER_USEC * 1000);
+
+ ad1816_update(ad1816);
+
+ if (ad1816->enable) {
+ int32_t temp;
+ uint8_t format;
+
+ format = (ad1816->regs[8] << 2) & 0xf0;
+ ad1816_log(ad1816->log, "AD1816 format = %04X\n", format);
+ ad1816_log(ad1816->log, "count = %04X, pos = %02X\n", ad1816->count, ad1816->playback_pos);
+
+ switch (format) {
+ case 0x00: /* Mono, 8-bit PCM */
+ ad1816->out_l = ad1816->out_r = (int16_t) ((ad1816_dma_channel_read(ad1816, ad1816->cur_dma) ^ 0x80) << 8);
+ ad1816->playback_pos++;
+ break;
+
+ case 0x10: /* Stereo, 8-bit PCM */
+ ad1816->out_l = (int16_t) ((ad1816_dma_channel_read(ad1816, ad1816->cur_dma) ^ 0x80) << 8);
+ ad1816->out_r = (int16_t) ((ad1816_dma_channel_read(ad1816, ad1816->cur_dma) ^ 0x80) << 8);
+ ad1816->playback_pos += 2;
+ break;
+
+ case 0x20: /* Mono, 8-bit Mu-Law */
+ ad1816->out_l = ad1816->out_r = ad1816_process_mulaw(ad1816_dma_channel_read(ad1816, ad1816->cur_dma));
+ ad1816->playback_pos++;
+ break;
+
+ case 0x30: /* Stereo, 8-bit Mu-Law */
+ ad1816->out_l = ad1816_process_mulaw(ad1816_dma_channel_read(ad1816, ad1816->cur_dma));
+ ad1816->out_r = ad1816_process_mulaw(ad1816_dma_channel_read(ad1816, ad1816->cur_dma));
+ ad1816->playback_pos += 2;
+ break;
+
+ case 0x40: /* Mono, 16-bit PCM little endian */
+ temp = (int32_t) ad1816_dma_channel_read(ad1816, ad1816->cur_dma);
+ ad1816->out_l = ad1816->out_r = (int16_t) ((ad1816_dma_channel_read(ad1816, ad1816->cur_dma) << 8) | temp);
+ ad1816->playback_pos += 2;
+ break;
+
+ case 0x50: /* Stereo, 16-bit PCM little endian */
+ temp = (int32_t) ad1816_dma_channel_read(ad1816, ad1816->cur_dma);
+ ad1816->out_l = (int16_t) ((ad1816_dma_channel_read(ad1816, ad1816->cur_dma) << 8) | temp);
+ temp = (int32_t) ad1816_dma_channel_read(ad1816, ad1816->cur_dma);
+ ad1816->out_r = (int16_t) ((ad1816_dma_channel_read(ad1816, ad1816->cur_dma) << 8) | temp);
+ ad1816->playback_pos += 4;
+ break;
+
+ case 0x60: /* Mono, 8-bit A-Law */
+ ad1816->out_l = ad1816->out_r = ad1816_process_alaw(ad1816_dma_channel_read(ad1816, ad1816->cur_dma));
+ ad1816->playback_pos++;
+ break;
+
+ case 0x70: /* Stereo, 8-bit A-Law */
+ ad1816->out_l = ad1816_process_alaw(ad1816_dma_channel_read(ad1816, ad1816->cur_dma));
+ ad1816->out_r = ad1816_process_alaw(ad1816_dma_channel_read(ad1816, ad1816->cur_dma));
+ ad1816->playback_pos += 2;
+ break;
+
+ /* 0x80, 0x90, 0xa0, 0xb0 reserved */
+
+ case 0xc0: /* Mono, 16-bit PCM big endian */
+ temp = (int32_t) ad1816_dma_channel_read(ad1816, ad1816->cur_dma);
+ ad1816->out_l = ad1816->out_r = (int16_t) (ad1816_dma_channel_read(ad1816, ad1816->cur_dma) | (temp << 8));
+ ad1816->playback_pos += 2;
+ break;
+
+ case 0xd0: /* Stereo, 16-bit PCM big endian */
+ temp = (int32_t) ad1816_dma_channel_read(ad1816, ad1816->cur_dma);
+ ad1816->out_l = (int16_t) (ad1816_dma_channel_read(ad1816, ad1816->cur_dma) | (temp << 8));
+ temp = (int32_t) ad1816_dma_channel_read(ad1816, ad1816->cur_dma);
+ ad1816->out_r = (int16_t) (ad1816_dma_channel_read(ad1816, ad1816->cur_dma) | (temp << 8));
+ ad1816->playback_pos += 4;
+ break;
+
+ /* 0xe0 and 0xf0 reserved */
+
+ default:
+ break;
+ }
+ if (ad1816->iregs[4] & 0x8000)
+ ad1816->out_l = 0;
+ else
+ ad1816->out_l = (int16_t) ((ad1816->out_l * ad1816_vols_6bits[(ad1816->iregs[4] >> 8) & 0x3f]) >> 16);
+
+ if (ad1816->iregs[4] & 0x0080)
+ ad1816->out_r = 0;
+ else
+ ad1816->out_r = (int16_t) ((ad1816->out_r * ad1816_vols_6bits[ad1816->iregs[4] & 0x3f]) >> 16);
+
+ if (ad1816->count < 0) {
+ ad1816->count = ad1816->iregs[8];
+ ad1816->regs[1] |= 0x80;
+ ad1816->playback_pos = 0;
+ if (ad1816->iregs[1] & 0x8000) {
+ ad1816_log(ad1816->log, "AD1816 Playback interrupt fired\n");
+ picint(1 << ad1816->cur_irq);
+ }
+ else {
+ ad1816_log(ad1816->log, "AD1816 Playback interrupt cleared\n");
+ picintc(1 << ad1816->cur_irq);
+ }
+ }
+ /* AD1816 count decrements every 4 bytes */
+ if (!(ad1816->playback_pos & 3))
+ ad1816->count--;
+ } else {
+ ad1816->out_l = ad1816->out_r = 0;
+ }
+}
+
+static void
+ad1816_get_buffer(int32_t *buffer, int len, void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+
+ /* Don't play audio if the DAC mute or chip powerdown bits are set */
+ if ((ad1816->iregs[44] & 0x8000) || (ad1816->iregs[44] & 0x0008))
+ return;
+
+ ad1816_update_mastervol(ad1816);
+ ad1816_update(ad1816);
+ for (int c = 0; c < len * 2; c++) {
+ double out_l = 0.0;
+ double out_r = 0.0;
+
+ out_l = (ad1816->buffer[c] * ad1816->master_l);
+ out_r = (ad1816->buffer[c + 1] * ad1816->master_r);
+
+ buffer[c] += (int32_t) out_l;
+ buffer[c + 1] += (int32_t) out_r;
+ }
+
+ ad1816->pos = 0;
+
+ /* sbprov2 part */
+ sb_get_buffer_sbpro(buffer, len, ad1816->sb);
+}
+
+static void
+ad1816_updatefreq(ad1816_t *ad1816)
+{
+ double freq;
+
+ if (ad1816->iregs[2] > 55200)
+ ad1816->iregs[2] = 55200;
+ freq = ad1816->iregs[2];
+
+ ad1816->freq = (int) trunc(freq);
+ ad1816->timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / (double) ad1816->freq));
+
+ ad1816_log(ad1816->log, "AD1816: Frequency set to %f\n", freq);
+}
+
+static void
+ad1816_reg_write(uint16_t addr, uint8_t val, void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+ uint16_t iridx = ad1816->index;
+ uint8_t port = addr - ad1816->cur_ad1816_addr;
+ double timebase = 0;
+
+ switch (port) {
+ case 0: /* Status/Indirect address */
+ ad1816->regs[0] = val | 0x80;
+ ad1816->index = val & 0x3f;
+ break;
+ case 1: /* Interrupt Status */
+ ad1816->regs[1] = 0x00; /* Sticky read/clear */
+ break;
+ case 2: /* Indirect data low byte */
+ ad1816->regs[2] = val;
+ ad1816->iregs[0] = val; /* Indirect low byte temp */
+ break;
+ case 3: /* Indirect data high byte */
+ ad1816->regs[3] = val;
+ switch (iridx) {
+ case 1: /* Interrupt Enable/External Control */
+ ad1816->iregs[1] = ((val << 8) | ad1816->regs[2]);
+ if (ad1816->iregs[1] & 0x0080) {
+ ad1816_log(ad1816->log, "Timer Enable\n");
+ timebase = (ad1816->iregs[44] & 0x0100) ? 100000 : 10;
+ timer_set_delay_u64(&ad1816->ad1816_irq_timer, (ad1816->iregs[13] * timebase * TIMER_USEC));
+ }
+ else {
+ ad1816_log(ad1816->log, "Timer Disable\n");
+ timer_disable(&ad1816->ad1816_irq_timer);
+ }
+ break;
+ case 2: /* Voice Playback Sample Rate */
+ ad1816->iregs[2] = ((val << 8) | ad1816->regs[2]);
+ ad1816_updatefreq(ad1816);
+ break;
+ case 3: /* Voice Capture Sample Rate */
+ ad1816->iregs[3] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 4: /* Voice Attenuation */
+ ad1816->iregs[4] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 5: /* FM Attenuation */
+ ad1816->iregs[5] = ((val << 8) | ad1816->regs[2]);
+ /* FM has distortion problems at the highest volume setting and the Win95 driver only uses the upper
+ 16 values, currently needs a small hack to use lower volumes if the FM mixer is set too high */
+ if (ad1816->iregs[5] & 0x8000)
+ ad1816->fm_vol_l = 0;
+ else {
+ if (((ad1816->iregs[5] >> 8) & 0x3F) <= 0x0F)
+ ad1816->fm_vol_l = ad1816_vols_6bits[((ad1816->iregs[5] >> 8) & 0x3f) + 0x10];
+ else
+ ad1816->fm_vol_l = ad1816_vols_6bits[((ad1816->iregs[5] >> 8) & 0x3f)];
+ }
+ if (ad1816->iregs[5] & 0x0080)
+ ad1816->fm_vol_r = 0;
+ else {
+ if ((ad1816->iregs[5] & 0x3F) <= 0x0F)
+ ad1816->fm_vol_r = ad1816_vols_6bits[(ad1816->iregs[5] & 0x3f) + 0x10];
+ else
+ ad1816->fm_vol_r = ad1816_vols_6bits[(ad1816->iregs[5] & 0x3f)];
+ }
+ break;
+ case 6: /* I2S(1) Attenuation */
+ ad1816->iregs[6] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 7: /* I2S(0) Attenuation */
+ ad1816->iregs[7] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 8: /* Playback Base Count */
+ ad1816->iregs[8] = ((val << 8) | ad1816->regs[2]);
+ ad1816->iregs[9] = ((val << 8) | ad1816->regs[2]);
+ ad1816->count = ad1816->iregs[8];
+ break;
+ case 9: /* Playback Current Count */
+ ad1816->iregs[9] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 10: /* Capture Base Count */
+ ad1816->iregs[10] = ((val << 8) | ad1816->regs[2]);
+ ad1816->iregs[11] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 11: /* Capture Current Count */
+ ad1816->iregs[11] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 12: /* Timer Base Count */
+ ad1816->iregs[12] = ((val << 8) | ad1816->regs[2]);
+ ad1816->iregs[13] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 13: /* Timer Current Count */
+ ad1816->iregs[13] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 14: /* Master Volume Attenuation */
+ ad1816->iregs[14] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 15: /* CD Gain/Attenuation */
+ ad1816->iregs[15] = ((val << 8) | ad1816->regs[2]);
+ if (ad1816->iregs[15] & 0x8000)
+ ad1816->cd_vol_l = 0;
+ else
+ ad1816->cd_vol_l = ad1816_vols_5bits_aux_gain[(ad1816->iregs[15] >> 8) & 0x1f];
+ if (ad1816->iregs[15] & 0x0080)
+ ad1816->cd_vol_r = 0;
+ else
+ ad1816->cd_vol_r = ad1816_vols_5bits_aux_gain[ad1816->iregs[15] & 0x1f];
+ break;
+ case 16: /* Synth Gain/Attenuation */
+ ad1816->iregs[16] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 17: /* Vid Gain/Attenuation */
+ ad1816->iregs[17] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 18: /* Line Gain/Attenuation */
+ ad1816->iregs[18] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 19: /* Mic/Phone_In Gain/Attenuation */
+ ad1816->iregs[19] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 20: /* ADC Source Select/ADC PGA */
+ ad1816->iregs[20] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 32: /* Chip Configuration */
+ ad1816->iregs[32] = ((val << 8) | ad1816->regs[2]);
+ if (ad1816->iregs[32] & 0x8000) {
+ ad1816->codec_enable = 1;
+ sound_set_cd_audio_filter(NULL, NULL); /* Seems to be necessary for the filter below to apply */
+ sound_set_cd_audio_filter(ad1816_filter_cd_audio, ad1816);
+ ad1816->sb->opl_mixer = ad1816;
+ ad1816->sb->opl_mix = ad1816_filter_opl;
+ }
+ else {
+ ad1816->codec_enable = 0;
+ sound_set_cd_audio_filter(NULL, NULL); /* Seems to be necessary for the filter below to apply */
+ sound_set_cd_audio_filter(sbpro_filter_cd_audio, ad1816->sb); /* Use SBPro to filter when codec is disabled */
+ ad1816->sb->opl_mixer = NULL;
+ ad1816->sb->opl_mix = NULL;
+ }
+ break;
+ case 33: /* DSP Configuration */
+ ad1816->iregs[33] = ((val << 8) | ad1816->regs[2]);
+ if ((ad1816->iregs[1] & 0x0800) && (ad1816->iregs[33] & 0x2000)) {
+ ad1816_log(ad1816->log, "Firing DSP interrupt\n");
+ ad1816->regs[1] |= 0x08;
+ picint(1 << ad1816->cur_irq);
+ }
+ break;
+ case 34: /* FM Sample Rate */
+ ad1816->iregs[34] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 35: /* I2S(1) Sample Rate */
+ ad1816->iregs[35] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 36: /* I2S(0) Sample Rate */
+ ad1816->iregs[36] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 37: /* Reserved on AD1816, Modem sample rate on AD1815 */
+ break;
+ case 38: /* Programmable Clock Rate */
+ ad1816->iregs[38] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 39: /* 3D Phat Stereo Control/Phone_Out Attenuation on AD1816, Modem DAC/ADC attenuation on AD1815 */
+ ad1816->iregs[39] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 40: /* Reserved on AD1816, Modem mix attenuation on AD1815 */
+ break;
+ case 41: /* Hardware Volume Button Modifier */
+ ad1816->iregs[41] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 42: /* DSP Mailbox 0 */
+ ad1816->iregs[42] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 43: /* DSP Mailbox 1 */
+ ad1816->iregs[43] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 44: /* Powerdown and Timer Control */
+ ad1816->iregs[44] = ((val << 8) | ad1816->regs[2]);
+ break;
+ case 45: /* Version/ID */
+ break;
+ case 46: /* Reserved test register */
+ break;
+ default:
+ break;
+ }
+ ad1816_log(ad1816->log, "AD1816 Indirect Register write: idx = %02X, val = %04X\n", ad1816->index, ad1816->iregs[iridx]);
+ break;
+ case 4: /* PIO Debug */
+ ad1816->regs[4] = 0x00; /* Sticky read/clear */
+ break;
+ case 5: /* PIO Status (RO) */
+ break;
+ case 6: /* PIO Data */
+ ad1816->regs[6] = val;
+ break;
+ case 7: /* Reserved */
+ break;
+ case 8: /* Playback Config */
+ ad1816->regs[8] = val;
+ if (!ad1816->enable && val & 0x01) {
+ ad1816->playback_pos = 0;
+ ad1816->dma_ff = 0;
+ if (ad1816->timer_latch)
+ timer_set_delay_u64(&ad1816->timer_count, ad1816->timer_latch);
+ else
+ timer_set_delay_u64(&ad1816->timer_count, TIMER_USEC);
+ }
+ ad1816->enable = (val & 0x01);
+ if (!ad1816->enable) {
+ timer_disable(&ad1816->timer_count);
+ ad1816->out_l = ad1816->out_r = 0;
+ }
+ break;
+ case 9: /* Capture Config */
+ ad1816->regs[9] = val;
+ break;
+ case 10: /* Reserved on AD1816, PIO modem out/in bits 7-0 on AD1815 */
+ break;
+ case 11: /* Reserved on AD1816, PIO modem out/in bits 15-8 on AD1815 */
+ break;
+ case 12: /* Joystick Raw Data (RO) */
+ break;
+ case 13: /* Joystick Control */
+ ad1816->regs[13] = ((val & 0x7f) | (ad1816->regs[13] & 0x80));
+ break;
+ case 14: /* Joystick Position Low Byte (RO) */
+ case 15: /* Joystick Position Low Byte (RO) */
+ break;
+ }
+ ad1816_log(ad1816->log, "AD1816 Write: idx = %02X, val = %02X\n", port, val);
+}
+
+static uint8_t
+ad1816_reg_read(uint16_t addr, void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+ uint16_t iridx = ad1816->index;
+ uint8_t temp = 0xFF;
+ uint8_t port = addr - ad1816->cur_ad1816_addr;
+
+ switch (port) {
+ case 0:
+ temp = ad1816->regs[port];
+ break;
+ case 1:
+ temp = ad1816->regs[port];
+ temp |= ((ad1816->sb->dsp.sb_irq8) ? 1 : 0);
+ break;
+ case 2:
+ temp = (ad1816->iregs[iridx] & 0x00ff);
+ break;
+ case 3:
+ temp = (ad1816->iregs[iridx] & 0xff00) >> 8;
+ break;
+ case 4 ... 15:
+ temp = ad1816->regs[port];
+ break;
+ default:
+ break;
+ }
+
+ ad1816_log(ad1816->log, "AD1816 Read: idx = %02X, val = %02X\n", port, temp);
+ return temp;
+}
+
+static void
+ad1816_pnp_config_changed(uint8_t ld, isapnp_device_config_t *config, void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+
+ ad1816_log(ad1816->log, "PnP Config changed\n");
+
+ switch(ld) {
+ case 0: /* Audio */
+ if (ad1816->cur_ad1816_addr) {
+ io_removehandler(ad1816->cur_ad1816_addr, 0x10, ad1816_reg_read, NULL, NULL, ad1816_reg_write, NULL, NULL, ad1816);
+ ad1816->cur_ad1816_addr = 0;
+ }
+
+ if (ad1816->cur_opl_addr) {
+ io_removehandler(ad1816->cur_opl_addr, 0x0004, ad1816->sb->opl.read, NULL, NULL, ad1816->sb->opl.write, NULL, NULL, ad1816->sb->opl.priv);
+ ad1816->cur_opl_addr = 0;
+ }
+
+ if (ad1816->cur_sb_addr) {
+ sb_dsp_setaddr(&ad1816->sb->dsp, 0);
+ io_removehandler(ad1816->cur_sb_addr + 4, 0x0002, sb_ct1345_mixer_read, NULL, NULL, sb_ct1345_mixer_write, NULL, NULL, ad1816->sb);
+ io_removehandler(ad1816->cur_sb_addr + 0, 0x0004, ad1816->sb->opl.read, NULL, NULL, ad1816->sb->opl.write, NULL, NULL, ad1816->sb->opl.priv);
+ io_removehandler(ad1816->cur_sb_addr + 8, 0x0002, ad1816->sb->opl.read, NULL, NULL, ad1816->sb->opl.write, NULL, NULL, ad1816->sb->opl.priv);
+ ad1816->cur_sb_addr = 0;
+ }
+
+ sb_dsp_setirq(&ad1816->sb->dsp, 0);
+ sb_dsp_setdma8(&ad1816->sb->dsp, 0);
+
+ if (config->activate) {
+ if (config->io[0].base != ISAPNP_IO_DISABLED) {
+ ad1816->cur_sb_addr = config->io[0].base;
+ ad1816_log(ad1816->log, "Updating SB DSP I/O port, SB DSP addr = %04X\n", ad1816->cur_sb_addr);
+ sb_dsp_setaddr(&ad1816->sb->dsp, ad1816->cur_sb_addr);
+ io_sethandler(ad1816->cur_sb_addr + 4, 0x0002, sb_ct1345_mixer_read, NULL, NULL, sb_ct1345_mixer_write, NULL, NULL, ad1816->sb);
+ io_sethandler(ad1816->cur_sb_addr + 0, 0x0004, ad1816->sb->opl.read, NULL, NULL, ad1816->sb->opl.write, NULL, NULL, ad1816->sb->opl.priv);
+ io_sethandler(ad1816->cur_sb_addr + 8, 0x0002, ad1816->sb->opl.read, NULL, NULL, ad1816->sb->opl.write, NULL, NULL, ad1816->sb->opl.priv);
+ }
+ if (config->io[1].base != ISAPNP_IO_DISABLED) {
+ ad1816->cur_opl_addr = config->io[1].base;
+ ad1816_log(ad1816->log, "Updating OPL I/O port, OPL addr = %04X\n", ad1816->cur_opl_addr);
+ io_sethandler(ad1816->cur_opl_addr, 0x0004, ad1816->sb->opl.read, NULL, NULL, ad1816->sb->opl.write, NULL, NULL, ad1816->sb->opl.priv);
+
+ }
+ if (config->io[2].base != ISAPNP_IO_DISABLED) {
+ ad1816->cur_ad1816_addr = config->io[2].base;
+ ad1816_log(ad1816->log, "Updating AD1816 I/O port, AD1816 addr = %04X\n", ad1816->cur_ad1816_addr);
+ io_sethandler(ad1816->cur_ad1816_addr, 0x10, ad1816_reg_read, NULL, NULL, ad1816_reg_write, NULL, NULL, ad1816);
+ }
+ if (config->irq[0].irq != ISAPNP_IRQ_DISABLED) {
+ ad1816->cur_irq = config->irq[0].irq;
+ sb_dsp_setirq(&ad1816->sb->dsp, ad1816->cur_irq);
+ ad1816_log(ad1816->log, "Updated AD1816/SB IRQ to %02X\n", ad1816->cur_irq);
+ }
+ if (config->dma[0].dma != ISAPNP_DMA_DISABLED) {
+ ad1816->cur_dma = config->dma[0].dma;
+ sb_dsp_setdma8(&ad1816->sb->dsp, ad1816->cur_dma);
+ ad1816_log(ad1816->log, "Updated AD1816/SB DMA to %02X\n", ad1816->cur_dma);
+ }
+ }
+ break;
+ case 1: /* MPU401 */
+ if (config->activate) {
+ if (config->io[0].base != ISAPNP_IO_DISABLED) {
+ ad1816->cur_mpu_addr = config->io[0].base;
+ ad1816_log(ad1816->log, "Updating MPU401 I/O port, MPU401 addr = %04X\n", ad1816->cur_mpu_addr);
+ mpu401_change_addr(ad1816->mpu, ad1816->cur_mpu_addr);
+ }
+ if (config->irq[0].irq != ISAPNP_IRQ_DISABLED) {
+ ad1816->cur_mpu_irq = config->irq[0].irq;
+ mpu401_setirq(ad1816->mpu, ad1816->cur_mpu_irq);
+ ad1816_log(ad1816->log, "Updated MPU401 IRQ to %02X\n", ad1816->cur_mpu_irq);
+ }
+ }
+ break;
+ case 2: /* Gameport */
+ ad1816->cur_js_addr = config->io[0].base;
+ gameport_remap(ad1816->gameport, (config->activate && (config->io[0].base != ISAPNP_IO_DISABLED)) ? config->io[0].base : 0);
+ break;
+ default:
+ break;
+ }
+}
+
+void
+ad1816_irq_poll(void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+ if (ad1816->iregs[1] & 0x2000) {
+ ad1816_log(ad1816->log, "Firing timer IRQ\n");
+ picint(1 << ad1816->cur_irq);
+ ad1816_log(ad1816->log, "Setting TI bit\n");
+ ad1816->regs[1] = ad1816->regs[1] | 0x20;
+ ad1816_log(ad1816->log, "Reloading Timer Count\n");
+ ad1816->iregs[13] = ad1816->iregs[12];
+ }
+}
+
+static void *
+ad1816_init(const device_t *info)
+{
+ ad1816_t *ad1816 = calloc(1, sizeof(ad1816_t));
+ uint8_t c;
+ double attenuation;
+
+ ad1816->cur_ad1816_addr = 0x530;
+ ad1816->cur_sb_addr = 0x220;
+ ad1816->cur_opl_addr = 0x388;
+ ad1816->cur_mpu_addr = 0x330;
+ ad1816->cur_js_addr = 0x200;
+ ad1816->cur_irq = 5;
+ ad1816->cur_mpu_irq = 9;
+ ad1816->cur_dma = 1;
+ ad1816->enable = 1;
+
+ ad1816->regs[0] = 0x80;
+ ad1816->regs[13] = 0xf0;
+ ad1816->regs[14] = 0xff;
+ ad1816->regs[15] = 0xff;
+
+ ad1816->iregs[01] = 0x0102;
+ ad1816->iregs[02] = 0x1f40;
+ ad1816->iregs[03] = 0x1f40;
+ ad1816->iregs[04] = 0x8080;
+ ad1816->iregs[05] = 0x8080;
+ ad1816->iregs[06] = 0x8080;
+ ad1816->iregs[07] = 0x8080;
+ ad1816->iregs[15] = 0x8888;
+ ad1816->iregs[16] = 0x8888;
+ ad1816->iregs[17] = 0x8888;
+ ad1816->iregs[18] = 0x8888;
+ ad1816->iregs[19] = 0x8888;
+ ad1816->iregs[32] = 0x00f0;
+ ad1816->iregs[34] = 0x5622;
+ ad1816->iregs[35] = 0xac44;
+ ad1816->iregs[36] = 0xac44;
+ ad1816->iregs[38] = 0xac44;
+ ad1816->iregs[39] = 0x8000;
+ ad1816->iregs[41] = 0x001b;
+ ad1816->iregs[45] = 0x0000; /* Version/ID */
+
+ ad1816->log = log_open("AD1816");
+
+ ad1816->gameport = gameport_add(&gameport_pnp_device);
+ gameport_remap(ad1816->gameport, ad1816->cur_js_addr);
+
+ /* Set up Sound System direct registers */
+ io_sethandler(ad1816->cur_ad1816_addr, 0x10, ad1816_reg_read, NULL,NULL, ad1816_reg_write, NULL, NULL, ad1816);
+
+ ad1816_updatefreq(ad1816);
+
+ ad1816->sb = calloc(1, sizeof(sb_t));
+ ad1816->sb->opl_enabled = 1;
+
+ sb_dsp_set_real_opl(&ad1816->sb->dsp, FM_YMF262);
+ sb_dsp_init(&ad1816->sb->dsp, SBPRO2_DSP_302, SB_SUBTYPE_DEFAULT, ad1816);
+ sb_dsp_setaddr(&ad1816->sb->dsp, ad1816->cur_sb_addr);
+ sb_dsp_setirq(&ad1816->sb->dsp, ad1816->cur_irq);
+ sb_dsp_setirq(&ad1816->sb->dsp, ad1816->cur_dma);
+ sb_ct1345_mixer_reset(ad1816->sb);
+
+ fm_driver_get(FM_YMF262, &ad1816->sb->opl);
+ io_sethandler(ad1816->cur_sb_addr + 0, 0x0004, ad1816->sb->opl.read, NULL, NULL, ad1816->sb->opl.write, NULL, NULL, ad1816->sb->opl.priv);
+ io_sethandler(ad1816->cur_sb_addr + 8, 0x0002, ad1816->sb->opl.read, NULL, NULL, ad1816->sb->opl.write, NULL, NULL, ad1816->sb->opl.priv);
+ io_sethandler(ad1816->cur_opl_addr, 0x0004, ad1816->sb->opl.read, NULL, NULL, ad1816->sb->opl.write, NULL, NULL, ad1816->sb->opl.priv);
+
+ io_sethandler(ad1816->cur_sb_addr + 4, 0x0002, sb_ct1345_mixer_read, NULL, NULL, sb_ct1345_mixer_write, NULL, NULL, ad1816->sb);
+
+ sound_add_handler(ad1816_get_buffer, ad1816);
+ music_add_handler(sb_get_music_buffer_sbpro, ad1816->sb);
+
+ sound_set_cd_audio_filter(NULL, NULL); /* Seems to be necessary for the filter below to apply */
+ sound_set_cd_audio_filter(sbpro_filter_cd_audio, ad1816->sb); /* Default SBPro mode CD audio filter */
+
+ ad1816->mpu = (mpu_t *) calloc(1, sizeof(mpu_t));
+ mpu401_init(ad1816->mpu, ad1816->cur_mpu_addr, ad1816->cur_mpu_irq, M_UART, device_get_config_int("receive_input401"));
+
+ if (device_get_config_int("receive_input"))
+ midi_in_handler(1, sb_dsp_input_msg, sb_dsp_input_sysex, &ad1816->sb->dsp);
+
+ const char *pnp_rom_file = NULL;
+ uint16_t pnp_rom_len = 512;
+ pnp_rom_file = PNP_ROM_AD1816;
+
+ uint8_t *pnp_rom = NULL;
+ if (pnp_rom_file) {
+ FILE *fp = rom_fopen(pnp_rom_file, "rb");
+ if (fp) {
+ if (fread(ad1816->pnp_rom, 1, pnp_rom_len, fp) == pnp_rom_len)
+ pnp_rom = ad1816->pnp_rom;
+ fclose(fp);
+ }
+ }
+ ad1816->pnp_card = isapnp_add_card(pnp_rom, sizeof(ad1816->pnp_rom), ad1816_pnp_config_changed,
+ NULL, NULL, NULL, ad1816);
+
+ timer_add(&ad1816->timer_count, ad1816_poll, ad1816, 0);
+
+ timer_add(&ad1816->ad1816_irq_timer, ad1816_irq_poll, ad1816, 0);
+
+ /* Calculate attenuation values for both the 6-bit and 5-bit volume controls */
+ for (c = 0; c < 64; c++) {
+ attenuation = 0.0;
+ if (c & 0x01)
+ attenuation -= 1.5;
+ if (c & 0x02)
+ attenuation -= 3.0;
+ if (c & 0x04)
+ attenuation -= 6.0;
+ if (c & 0x08)
+ attenuation -= 12.0;
+ if (c & 0x10)
+ attenuation -= 24.0;
+ if (c & 0x20)
+ attenuation -= 48.0;
+
+ attenuation = pow(10, attenuation / 10);
+
+ ad1816_vols_6bits[c] = (int) (attenuation * 65536);
+ }
+
+ for (c = 0; c < 32; c++) {
+ attenuation = 0.0;
+ if (c & 0x01)
+ attenuation -= 1.5;
+ if (c & 0x02)
+ attenuation -= 3.0;
+ if (c & 0x04)
+ attenuation -= 6.0;
+ if (c & 0x08)
+ attenuation -= 12.0;
+ if (c & 0x10)
+ attenuation -= 24.0;
+
+ attenuation = pow(10, attenuation / 10);
+
+ ad1816_vols_5bits[c] = (attenuation * 65536);
+ }
+
+ for (c = 0; c < 32; c++) {
+ attenuation = 12.0;
+ if (c & 0x01)
+ attenuation -= 1.5;
+ if (c & 0x02)
+ attenuation -= 3.0;
+ if (c & 0x04)
+ attenuation -= 6.0;
+ if (c & 0x08)
+ attenuation -= 12.0;
+ if (c & 0x10)
+ attenuation -= 24.0;
+
+ attenuation = pow(10, attenuation / 10);
+
+ ad1816_vols_5bits_aux_gain[c] = (attenuation * 65536);
+ }
+
+ return ad1816;
+}
+
+static void
+ad1816_close(void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+
+ if (ad1816->log != NULL) {
+ log_close(ad1816->log);
+ ad1816->log = NULL;
+ }
+
+ sb_close(ad1816->sb);
+ free(ad1816->mpu);
+ free(priv);
+}
+
+static int
+ad1816_available(void)
+{
+ return rom_present(PNP_ROM_AD1816);
+}
+
+static void
+ad1816_speed_changed(void *priv)
+{
+ ad1816_t *ad1816 = (ad1816_t *) priv;
+
+ ad1816->timer_latch = (uint64_t) ((double) TIMER_USEC * (1000000.0 / (double) ad1816->freq));
+
+ sb_speed_changed(ad1816->sb);
+}
+
+static const device_config_t ad1816_config[] = {
+ // clang-format off
+ {
+ .name = "receive_input",
+ .description = "Receive MIDI input",
+ .type = CONFIG_BINARY,
+ .default_string = NULL,
+ .default_int = 1,
+ .file_filter = NULL,
+ .spinner = { 0 },
+ .selection = { { 0 } },
+ .bios = { { 0 } }
+ },
+ {
+ .name = "receive_input401",
+ .description = "Receive MIDI input (MPU-401)",
+ .type = CONFIG_BINARY,
+ .default_string = NULL,
+ .default_int = 0,
+ .file_filter = NULL,
+ .spinner = { 0 },
+ .selection = { { 0 } },
+ .bios = { { 0 } }
+ },
+ { .name = "", .description = "", .type = CONFIG_END }
+ // clang-format on
+};
+
+const device_t ad1816_device = {
+ .name = "Analog Devices AD1816",
+ .internal_name = "ad1816",
+ .flags = DEVICE_ISA16,
+ .local = 0,
+ .init = ad1816_init,
+ .close = ad1816_close,
+ .reset = NULL,
+ .available = ad1816_available,
+ .speed_changed = ad1816_speed_changed,
+ .force_redraw = NULL,
+ .config = ad1816_config
+};
+
diff --git a/src/sound/sound.c b/src/sound/sound.c
index 4b3575bc0..a5a7b07ed 100644
--- a/src/sound/sound.c
+++ b/src/sound/sound.c
@@ -137,6 +137,7 @@ static const SOUND_CARD sound_cards[] = {
{ &adlib_device },
/* ISA16 */
{ &acermagic_s20_device },
+ { &ad1816_device },
{ &azt2316a_device },
{ &azt1605_device },
{ &sb_goldfinch_device },
From 7513769b4bc1463f7cc54f4709bd21a1993f5701 Mon Sep 17 00:00:00 2001
From: RichardG867
Date: Sun, 21 Dec 2025 20:40:30 -0300
Subject: [PATCH 02/16] Fix missing None floppy sound preset on 40-track drives
---
src/floppy/fdd_audio.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/floppy/fdd_audio.c b/src/floppy/fdd_audio.c
index 46cc40a81..8cbebf209 100644
--- a/src/floppy/fdd_audio.c
+++ b/src/floppy/fdd_audio.c
@@ -385,7 +385,7 @@ fdd_audio_load_profiles(void)
}
/* 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++;
}
@@ -553,7 +553,7 @@ load_profile_samples(int profile_id)
}
}
}
- }
+ }
}
static drive_audio_samples_t *
From 69a7db1af627fd4b36ee08579429bfd08fdb8c1e Mon Sep 17 00:00:00 2001
From: OBattler
Date: Mon, 22 Dec 2025 00:59:02 +0100
Subject: [PATCH 03/16] Corrected Catalan translation by ahernandez094 from
BetaWiki (native speaker) and more fixes to the Spanish translation.
---
src/qt/languages/ca-ES.po | 658 +++++++++++++++++++-------------------
src/qt/languages/es-ES.po | 4 +-
2 files changed, 331 insertions(+), 331 deletions(-)
diff --git a/src/qt/languages/ca-ES.po b/src/qt/languages/ca-ES.po
index dabe58233..75e0a593d 100644
--- a/src/qt/languages/ca-ES.po
+++ b/src/qt/languages/ca-ES.po
@@ -25,7 +25,7 @@ msgid "&Hard reset"
msgstr "&Reiniciació completa"
msgid "&Ctrl+Alt+Del"
-msgstr "&Ctrl+Alt+Del"
+msgstr "&Ctrl+Alt+Supr"
msgid "Ctrl+Alt+&Esc"
msgstr "Ctrl+Alt+&Esc"
@@ -40,31 +40,31 @@ msgid "Re&sume"
msgstr "Re&prendre"
msgid "E&xit"
-msgstr "&Sortir"
+msgstr "&Surt"
msgid "&View"
-msgstr "&Visualització"
+msgstr "&Visualitza"
msgid "&Hide status bar"
-msgstr "&Ocultar barra d'estat"
+msgstr "&Amaga la barra d'estat"
msgid "Hide &toolbar"
-msgstr "Ocultar &barra d'eines"
+msgstr "Amaga la &barra d'eines"
msgid "&Resizeable window"
msgstr "Fi&nestra redimensionable"
msgid "R&emember size && position"
-msgstr "&Recordar grandària i posició"
+msgstr "&Recorda grandària i posició"
msgid "Remember size && position"
-msgstr "Recordar grandària i posició"
+msgstr "Recorda grandària i posició"
msgid "Re&nderer"
-msgstr "Re&ndidor"
+msgstr "Re&nderitzador"
msgid "&Qt (Software)"
-msgstr "&Qt (Software)"
+msgstr "&Qt (Programari)"
msgid "Open&GL (3.0 Core)"
msgstr "Open&GL (3.0 Core)"
@@ -73,10 +73,10 @@ msgid "&VNC"
msgstr "&VNC"
msgid "Specify &dimensions…"
-msgstr "E&specificar dimensions…"
+msgstr "E&specifica dimensions…"
msgid "Force &4:3 display ratio"
-msgstr "Forçar ràtio de visualització &4:3"
+msgstr "Força ràtio de visualització &4:3"
msgid "&Window scale factor"
msgstr "&Factor de escalat de finestra"
@@ -145,7 +145,7 @@ msgid "4:&3 Integer scale"
msgstr "Escalat de valor enter 4:&3"
msgid "EGA/(S)&VGA settings"
-msgstr "Configuracions EGA/(S)&VGA"
+msgstr "Configuració EGA/(S)&VGA"
msgid "&Inverted VGA monitor"
msgstr "&Monitor VGA invertit"
@@ -163,7 +163,7 @@ msgid "&RGB Grayscale"
msgstr "&RGB en escala de grisos"
msgid "Generic RGBI color monitor"
-msgstr "Monitor RGBI genèric en colors"
+msgstr "Monitor RGBI genèric a color"
msgid "&Amber monitor"
msgstr "Monitor ambr&e"
@@ -184,13 +184,13 @@ msgid "BT&709 (HDTV)"
msgstr "BT&709 (HDTV)"
msgid "&Average"
-msgstr "&Mitjà"
+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 "Canviar contrast per a la pantalla &monocromàtica"
+msgstr "Canvia contrast per a la pantalla &monocromàtica"
msgid "&Media"
msgstr "&Mitjans"
@@ -199,16 +199,16 @@ msgid "&Tools"
msgstr "&Eines"
msgid "&Settings…"
-msgstr "&Configuracions…"
+msgstr "&Configuració…"
msgid "Settings…"
-msgstr "Configuracions…"
+msgstr "Configuració…"
msgid "&Update status bar icons"
-msgstr "&Actualitzar icones en barra d'estat"
+msgstr "&Actualitza icones a la barra d'estat"
msgid "Take s&creenshot"
-msgstr "Desar imatge de &pantalla"
+msgstr "Desa captura de &pantalla"
msgid "S&ound"
msgstr "S&o"
@@ -217,16 +217,16 @@ msgid "&Preferences…"
msgstr "&Preferències…"
msgid "Enable &Discord integration"
-msgstr "Activar integració amb D&iscord"
+msgstr "Activa integració amb D&iscord"
msgid "Sound &gain…"
msgstr "&Guany de so…"
msgid "Begin trace"
-msgstr "Iniciar el rastreig"
+msgstr "Inicia el rastreig"
msgid "End trace"
-msgstr "Terminar el rastreig"
+msgstr "Acaba el rastreig"
msgid "&Help"
msgstr "Aj&uda"
@@ -247,34 +247,34 @@ msgid "Existing image (&Write-protected)…"
msgstr "Imatge existent (&Protegit d'escriptura)…"
msgid "&Record"
-msgstr "&Enregistrar"
+msgstr "&Enregistra"
msgid "&Play"
-msgstr "&Reproduir"
+msgstr "&Reprodueix"
msgid "&Rewind to the beginning"
-msgstr "&Rebobinar al inici"
+msgstr "&Rebobina a l'inici"
msgid "&Fast forward to the end"
-msgstr "&Avanç ràpid al final"
+msgstr "&Avança ràpid al final"
msgid "E&ject"
-msgstr "E&xpulsar"
+msgstr "E&xpolsa"
msgid "&Image…"
msgstr "&Imatge…"
msgid "E&xport to 86F…"
-msgstr "E&xportar a 86F…"
+msgstr "E&xporta a 86F…"
msgid "&Mute"
-msgstr "&Silenciar"
+msgstr "&Silencia"
msgid "E&mpty"
msgstr "&CDROM buit"
msgid "Reload previous image"
-msgstr "Recarregar imatge prèvia"
+msgstr "Recarrega imatge prèvia"
msgid "&Folder…"
msgstr "&Carpeta…"
@@ -289,16 +289,16 @@ msgid "New Image"
msgstr "Nova imatge"
msgid "Settings"
-msgstr "Configuracions"
+msgstr "Configuració"
msgid "Specify Main Window Dimensions"
-msgstr "Especificar dimensions de la finestra principal"
+msgstr "Especifica dimensions de la finestra principal"
msgid "OK"
msgstr "D'acord"
msgid "Cancel"
-msgstr "Anuŀlació"
+msgstr "Anuŀla"
msgid "&Default"
msgstr "&Per defecte"
@@ -313,7 +313,7 @@ msgid "File name:"
msgstr "Nom de fitxer:"
msgid "Disk size:"
-msgstr "Grandària del disc:"
+msgstr "Mida del disc:"
msgid "RPM mode:"
msgstr "Modalitat RPM:"
@@ -328,7 +328,7 @@ msgid "Height:"
msgstr "Alçada:"
msgid "Lock to this size"
-msgstr "Fixar a aquesta grandària"
+msgstr "Fixa a aquesta grandària"
msgid "Machine type:"
msgstr "Tipus de màquina:"
@@ -337,7 +337,7 @@ msgid "Machine:"
msgstr "Màquina:"
msgid "Configure"
-msgstr "Configurar"
+msgstr "Configura"
msgid "CPU:"
msgstr "Processador:"
@@ -364,7 +364,7 @@ msgid "Memory:"
msgstr "Memòria:"
msgid "Time synchronization"
-msgstr "Sincronització de la hora"
+msgstr "Sincronització de l'hora"
msgid "Disabled"
msgstr "Desactivat"
@@ -379,7 +379,7 @@ msgid "Dynamic Recompiler"
msgstr "Recompilador dinàmic"
msgid "CPU frame size"
-msgstr "Grandària de blocs del CPU"
+msgstr "Mida de blocs de la CPU"
msgid "Larger frames (less smooth)"
msgstr "Blocs més grans (menys suau)"
@@ -418,7 +418,7 @@ msgid "Mouse"
msgstr "Ratolí"
msgid "Joystick:"
-msgstr "Mando:"
+msgstr "Comandament:"
msgid "Joystick"
msgstr "Joystick"
@@ -436,22 +436,22 @@ msgid "Joystick 4…"
msgstr "Joystick 4…"
msgid "Sound card #1:"
-msgstr "Targeta de so 1:"
+msgstr "Targeta de so núm. 1:"
msgid "Sound card #2:"
-msgstr "Targeta de so 2:"
+msgstr "Targeta de so núm. 2:"
msgid "Sound card #3:"
-msgstr "Targeta de so 3:"
+msgstr "Targeta de so núm. 3:"
msgid "Sound card #4:"
-msgstr "Targeta de so 4:"
+msgstr "Targeta de so núm. 4:"
msgid "MIDI Out Device:"
msgstr "Dispositiu MIDI de sortida:"
msgid "MIDI In Device:"
-msgstr "Dispositiu MIDI de entrada:"
+msgstr "Dispositiu MIDI d'entrada:"
msgid "MIDI Out:"
msgstr "Sortida MIDI:"
@@ -460,13 +460,13 @@ msgid "Standalone MPU-401"
msgstr "MPU-401 independent"
msgid "Use FLOAT32 sound"
-msgstr "Utilitzar so FLOAT32"
+msgstr "Utilitza so FLOAT32"
msgid "FM synth driver"
msgstr "Manejador de síntesi FM"
msgid "Nuked (more accurate)"
-msgstr "Nuked (més acurat)"
+msgstr "Nuked (més precís)"
msgid "YMFM (faster)"
msgstr "YMFM (més ràpid)"
@@ -496,7 +496,7 @@ msgid "LPT4 Device:"
msgstr "Dispositiu LPT4:"
msgid "Internal LPT ECP DMA:"
-msgstr "DMA de ECP del LPT intern:"
+msgstr "DMA de ECP de l'LPT intern:"
msgid "Serial port 1"
msgstr "Port sèrie 1"
@@ -523,10 +523,10 @@ msgid "Parallel port 4"
msgstr "Port paralel 4"
msgid "Floppy disk controller:"
-msgstr "Controlador de disquet:"
+msgstr "Controladora de disquets:"
msgid "CD-ROM controller:"
-msgstr "Controlador de CD-ROM:"
+msgstr "Controladora de CD-ROM:"
msgid "[ISA16] Tertiary IDE Controller"
msgstr "[ISA16] Controlador IDE terciari"
@@ -535,31 +535,31 @@ msgid "[ISA16] Quaternary IDE Controller"
msgstr "[ISA16] Controlador IDE quaternari"
msgid "Hard disk controllers"
-msgstr "Controladors de disc dur"
+msgstr "Controladores de disc dur"
msgid "SCSI controllers"
-msgstr "Controladors SCSI"
+msgstr "Controladores SCSI"
msgid "Controller 1:"
-msgstr "Controlador 1:"
+msgstr "Controladora 1:"
msgid "Controller 2:"
-msgstr "Controlador 2:"
+msgstr "Controladora 2:"
msgid "Controller 3:"
-msgstr "Controlador 3:"
+msgstr "Controladora 3:"
msgid "Controller 4:"
-msgstr "Controlador 4:"
+msgstr "Controladora 4:"
msgid "Cassette"
-msgstr "Casset"
+msgstr "Cinta"
msgid "Hard disks:"
msgstr "Discs durs:"
msgid "Firmware Version"
-msgstr "Versió de firmware"
+msgstr "Versió del firmware"
msgid "&New…"
msgstr "&Nou…"
@@ -589,16 +589,16 @@ msgid "Cylinders:"
msgstr "Cilindres:"
msgid "Size (MB):"
-msgstr "Grandària (MB):"
+msgstr "Mida (MB):"
msgid "Type:"
msgstr "Tipus:"
msgid "Image Format:"
-msgstr "Format de imatge:"
+msgstr "Format d'imatge:"
msgid "Block Size:"
-msgstr "Grandària de bloc:"
+msgstr "Mida de bloc:"
msgid "Floppy drives:"
msgstr "Unitats de disquet:"
@@ -634,7 +634,7 @@ msgid "ISA Memory Expansion"
msgstr "Expansió de memòria ISA"
msgid "ISA ROM Cards"
-msgstr "Targetas ROM ISA"
+msgstr "Targetes ROM ISA"
msgid "Card 1:"
msgstr "Targeta 1:"
@@ -688,7 +688,7 @@ 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-lo al directori \"roms\"."
+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)"
@@ -715,22 +715,22 @@ 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 dels ROMs faltants en el directori roms/machines. Canviant a una màquina disponible."
+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 dels ROMs faltants en el directori roms/video. Canviant a una tarjeta de video disponible."
+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 dels ROMs faltants en el directori roms/video. Desactivnt a la segona targeta de vídeo."
+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 dels ROMs faltants. Ignorant el dispositiu."
+msgstr "El dispositiu \"%hs\" no està disponible a causa de les ROMs faltants. Ignorant el dispositiu."
msgid "Machine"
msgstr "Màquina"
msgid "Display"
-msgstr "Vídeo"
+msgstr "Pantalla"
msgid "Input devices"
msgstr "Dispositius de entrada"
@@ -769,7 +769,7 @@ msgid "Controllers:"
msgstr "Controladors:"
msgid "Floppy & CD-ROM drives"
-msgstr "Disquets i unitates de CD-ROM"
+msgstr "Disquets i unitats de CD-ROM"
msgid "Other removable devices"
msgstr "Altres dispositius extraïbles"
@@ -784,10 +784,10 @@ msgid "Click to capture mouse"
msgstr "Feu clic per capturar el ratolí"
msgid "Press %1 to release mouse"
-msgstr "Premeu %1 per soltar el ratolí"
+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 soltar el ratolí"
+msgstr "Premeu %1 o bé el botó central per alliberar el ratolí"
msgid "Bus"
msgstr "Bus"
@@ -817,7 +817,7 @@ msgid "Type"
msgstr "Tipus"
msgid "No PCap devices found"
-msgstr "No se trobaren dispositius PCap"
+msgstr "No s'ha trobat cap dispositiu PCap"
msgid "Invalid PCap device"
msgstr "Dispositiu PCap invàlid"
@@ -862,16 +862,16 @@ msgid "4-axis, 4-button joystick"
msgstr "Joystick de 4 eixos, 4 botons"
msgid "2-button gamepad(s)"
-msgstr "Maneta(s) de joc de 2 botons"
+msgstr "Comandament(s) de joc de 2 botons"
msgid "3-button gamepad"
-msgstr "Maneta de joc de 3 botons"
+msgstr "Comandament de joc de 3 botons"
msgid "4-button gamepad"
-msgstr "Maneta de joc de 4 botons"
+msgstr "Comandament de joc de 4 botons"
msgid "6-button gamepad"
-msgstr "Maneta de joc de 6 botons"
+msgstr "Comandament de joc de 6 botons"
msgid "2-button flight yoke"
msgstr "Volant d'avió de 2 botons"
@@ -925,10 +925,10 @@ msgid "Flux images"
msgstr "Imatges de fluix"
msgid "Are you sure you want to hard reset the emulated machine?"
-msgstr "Segur que voleu fer una reinicialització completa de la màquina emulada?"
+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 "Segur que voleu tancar al 86Box?"
+msgstr "Esteu segurs de que voleu tancar al 86Box?"
msgid "Unable to initialize Ghostscript"
msgstr "No fou possible inicialitzar el Ghostscript"
@@ -964,13 +964,13 @@ msgid "New machine"
msgstr "Nova màquina"
msgid "&Check for updates…"
-msgstr "&Verifica actualitzacions…"
+msgstr "&Comprova actualitzacions…"
msgid "Exit"
msgstr "Sortir"
msgid "No ROMs found"
-msgstr "No se trobaren ROMs"
+msgstr "No s'han trobat ROMs"
msgid "Do you want to save the settings?"
msgstr "Voleu desar les configuracions?"
@@ -979,40 +979,40 @@ msgid "This will hard reset the emulated machine."
msgstr "Això causarà una reinicialització completa de la màquina emulada."
msgid "Save"
-msgstr "Desar"
+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 de ordinadors anticos\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, y otros.\n\nAmb contribucions anteriors de Sarah Walker, leilei, JohnElliott, greatpsycho y otros.\n\nPublicat sota la GNU General Public License versió 2 o bé posterior. Veieu LICENSE per més informacions."
+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à instalat i de que esteu en una connexió de xarxa compatible amb %1."
+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 se desarà com ara fitxer PostScript (.ps)."
+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 se desarà com ara fitxer Printer Command Language (.pcl)."
+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 tornar a mostrar aquest missatge"
+msgstr "No tornis a mostrar aquest missatge"
msgid "Don't exit"
msgstr "No sortir"
msgid "Reset"
-msgstr "Reinicialitzar"
+msgstr "Reinicialitza"
msgid "Don't reset"
-msgstr "No reinicialitzar"
+msgstr "No reinicialitzis"
msgid "CD-ROM images"
msgstr "Imatges de CD-ROM"
@@ -1021,7 +1021,7 @@ msgid "%1 Device Configuration"
msgstr "Configuració de dispositiu %1"
msgid "Monitor in sleep mode"
-msgstr "Monitor en modalitat de dormida"
+msgstr "Monitor en suspens"
msgid "GLSL shaders"
msgstr "Shaders GLSL"
@@ -1030,19 +1030,19 @@ 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ó de tipus CPU basat en màquina seleccionada està desactivat per a aquesta màquina.\n\nAixò fa possible seleccionar una CPU que sigui incompatible amb aquesta màquina. Tanmateix, poden aparèixerr 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 ésser tancat com ara invàlid."
+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 "Continuar"
+msgstr "Continua"
msgid "Cassette: %1"
-msgstr "Casset: %1"
+msgstr "Cinta: %1"
msgid "C&assette: %1"
-msgstr "C&asset: %1"
+msgstr "C&inta: %1"
msgid "Cassette images"
-msgstr "Imatges de casset"
+msgstr "Imatges de cinta"
msgid "Cartridge %1: %2"
msgstr "Cartutx %1: %2"
@@ -1075,13 +1075,13 @@ msgid "Force shutdown"
msgstr "Apagada forçada"
msgid "Start"
-msgstr "Iniciar"
+msgstr "Inicia"
msgid "&Force shutdown"
msgstr "&Apagada forçada"
msgid "&Start"
-msgstr "&Iniciar"
+msgstr "&Inicir"
msgid "Not running"
msgstr "No en execució"
@@ -1114,7 +1114,7 @@ msgid "VMs: %1"
msgstr "MV: %1"
msgid "System Directory:"
-msgstr "Directori de sistema:"
+msgstr "Directori del sistema:"
msgid "Choose directory"
msgstr "Escollir directori"
@@ -1132,10 +1132,10 @@ 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 "Utilitzar expressions regulars en la caixa de cerca"
+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 del administrador de MV?"
+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"
@@ -1156,19 +1156,19 @@ 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 "Utilitzar configuració existent"
+msgstr "Utilitza una configuració existent"
msgid "Type some notes here"
-msgstr "Escriure algunes notes aquí"
+msgstr "Escriviu algunes notes aquí"
msgid "Paste the contents of the existing configuration file into the box below."
-msgstr "Enganxar el contingut del fitxer de configuració existent en la caixa que de sota."
+msgstr "Enganxa el contingut del fitxer de configuració existent en la caixa de sota."
msgid "Load configuration from file"
-msgstr "Carregar la configuració a partir d'un fitxer"
+msgstr "Carrega la configuració a partir d'un fitxer"
msgid "System name"
-msgstr "Nomb del sistema"
+msgstr "Nom del sistema"
msgid "System name:"
msgstr "Nom del sistema:"
@@ -1186,7 +1186,7 @@ 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 directour per el sistema serà criat en el directori escollit a dalt"
+msgstr "Un nou directori per al sistema serà creat en el directori escollit a dalt"
msgid "System location:"
msgstr "Ubicació del sistema:"
@@ -1216,25 +1216,25 @@ msgid "Enter the new display name (blank to reset)"
msgstr "Escriviu el nou nom mostrat (buit per restablir)"
msgid "Change &display name…"
-msgstr "Canviar nom &mostrat…"
+msgstr "Canvia nom &mostrat…"
msgid "Context Menu"
msgstr "Menú de context"
msgid "&Open folder…"
-msgstr "&Obrir carpeta…"
+msgstr "&Obre carpeta…"
msgid "Open p&rinter tray…"
-msgstr "Obrir safata de la &impressora…"
+msgstr "Obre safata de la &impressora…"
msgid "Set &icon…"
-msgstr "Establir &icona…"
+msgstr "Estableix &icona…"
msgid "Select an icon"
-msgstr "Escollir una icona"
+msgstr "Tria una icona"
msgid "C&lone…"
-msgstr "C&lonar…"
+msgstr "C&lona…"
msgid "Virtual machine \"%1\" (%2) will be cloned into:"
msgstr "La màquina virtual \"%1\" (%2) serà clonada a:"
@@ -1246,10 +1246,10 @@ 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 "Clonar"
+msgstr "Clona"
msgid "Failed to create directory for cloned VM"
-msgstr "Error en criar el directori per la MV clonada"
+msgstr "Error en crear el directori per a la MV clonada"
msgid "Failed to clone VM."
msgstr "Error en clonar la VM."
@@ -1261,10 +1261,10 @@ msgid "The selected directory is already in use. Please select a different direc
msgstr "El directori escollit ja està en ùs. Si us plau, escolliu un altre directori."
msgid "Create directory failed"
-msgstr "Error en criar el directori"
+msgstr "Error en crear el directori"
msgid "Unable to create the directory for the new system"
-msgstr "No fou possible criar el directori pel nou sistema"
+msgstr "No fou possible crear el directori pel nou sistema"
msgid "Configuration write failed"
msgstr "Error en escriure la configuració"
@@ -1279,7 +1279,7 @@ 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 en el directori de la màquina. Si us plau, suprimiu-los manualment."
+msgstr "No fou possible suprimir alguns fitxers al directori de la màquina. Si us plau, suprimiu-los manualment."
msgid "Build"
msgstr "Compilació"
@@ -1297,31 +1297,31 @@ msgid "An update to 86Box is available!"
msgstr "Una actualització pel 86Box està disponible!"
msgid "Warning"
-msgstr "Compte"
+msgstr "Atenció"
msgid "&Kill"
-msgstr "&Terminar forçadament"
+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 "Terminar forçadament a la màquina virtual pot causar la pèrdua de dades. Només ho feu si el procés del 86Box es blocà.\n\n¿De verdad quiere terminar forzadamente a la máquina virtual \"%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 seus fitxers? Aquesta acció no se pot desfer!"
+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 "Mostrar fitxer de &configuració"
+msgstr "Mostra fitxer de &configuració"
msgid "No screenshot"
-msgstr "Sense captura de pantalla"
+msgstr "Sense captures de pantalla"
msgid "Search"
-msgstr "Cercar"
+msgstr "Cerca"
msgid "Searching for VMs…"
-msgstr "Cercar per MV…"
+msgstr "Cerca per MV…"
msgid "Found %1"
msgstr "%1 trobada"
@@ -1354,7 +1354,7 @@ msgid "Hard disk (%1)"
msgstr "Disc dur (%1)"
msgid "MFM/RLL or ESDI CD-ROM drives never existed"
-msgstr "Mai existiren unitats de CD-ROM MFM/RLL o bé ESDI"
+msgstr "Les unitats de CD-ROM MFM/RLL o bé ESDI no han existit"
msgid "Custom…"
msgstr "Personalitzada…"
@@ -1363,10 +1363,10 @@ msgid "Custom (large)…"
msgstr "Personalitzada (gran)…"
msgid "Add New Hard Disk"
-msgstr "Afegir nou disc dur"
+msgstr "Afegeix nou disc dur"
msgid "Add Existing Hard Disk"
-msgstr "Afegir disc dur existent"
+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."
@@ -1378,28 +1378,28 @@ msgid "Hard disk images"
msgstr "Imatges de disc dur"
msgid "Unable to read file"
-msgstr "No es pogué llegir el fitxer"
+msgstr "No s'ha pogut llegir el fitxer"
msgid "Unable to write file"
-msgstr "No es pogué escriure el fitxer"
+msgstr "No s'ha pogut escriure el fitxer"
msgid "HDI or HDX images with a sector size other than 512 are not supported."
-msgstr "No es suporten les imatges HDI o bé HDX amb una grandària de sector diferent a 512."
+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 nomb de fitxer vàlid."
+msgstr "Si us plau, especifiqueu un nom de fitxer vàlid."
msgid "Disk image created"
-msgstr "Imatge de disc criada"
+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 es està desant a un directori amb permís de escirptura."
+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"
@@ -1408,16 +1408,16 @@ 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 escollit serà sobreescrit. Segur que voleu utilitzar-lo?"
+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 "Sobreescriure"
+msgstr "Sobreescriu"
msgid "Don't overwrite"
-msgstr "No sobreescriure"
+msgstr "No sobreescriguis"
msgid "Raw image"
msgstr "Imatge en brut"
@@ -1429,10 +1429,10 @@ msgid "HDX image"
msgstr "Imatge HDX"
msgid "Fixed-size VHD"
-msgstr "VHD de grandària fixa"
+msgstr "VHD de mida fixa"
msgid "Dynamic-size VHD"
-msgstr "VHD de grandària dinàmica"
+msgstr "VHD de mida dinàmica"
msgid "Differencing VHD"
msgstr "VHD diferencial"
@@ -1450,10 +1450,10 @@ msgid "HDX image (.hdx)"
msgstr "Imatge HDX (.hdx)"
msgid "Fixed-size VHD (.vhd)"
-msgstr "VHD de grandària fixa (.vhd)"
+msgstr "VHD de mida fixa (.vhd)"
msgid "Dynamic-size VHD (.vhd)"
-msgstr "VHD de grandària dinàmica (.vhd)"
+msgstr "VHD de mida dinàmica (.vhd)"
msgid "Differencing VHD (.vhd)"
msgstr "VHD diferencial (.vhd)"
@@ -1471,13 +1471,13 @@ 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 foren mogudes o copiades, o a causa d'un error en el programa que crià aquest disc.\n\nVoleu corregir els registres de temps?"
+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 "Els segells de temps del pare e fill no coincideixen"
+msgstr "Les marques de temps del pare e fill no coincideixen"
msgid "Could not fix VHD timestamp."
-msgstr "No fou possible corregir el segell de temps del VHD."
+msgstr "No ha sigut possible corregir la marca de temps del VHD."
msgid "CD-ROM %1 (%2): %3"
msgstr "CD-ROM %1 (%2): %3"
@@ -1504,13 +1504,13 @@ msgid "720 KB"
msgstr "720 KB"
msgid "1.2 MB"
-msgstr "1.2 MB"
+msgstr "1,2 MB"
msgid "1.25 MB"
-msgstr "1.25 MB"
+msgstr "1,25 MB"
msgid "1.44 MB"
-msgstr "1.44 MB"
+msgstr "1,44 MB"
msgid "DMF (cluster 1024)"
msgstr "DMF (clúster 1024)"
@@ -1519,52 +1519,52 @@ msgid "DMF (cluster 2048)"
msgstr "DMF (clúster 2048)"
msgid "2.88 MB"
-msgstr "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)"
+msgstr "3,5\" 128 MB (ISO 10090)"
msgid "3.5\" 230 MB (ISO 13963)"
-msgstr "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)"
+msgstr "3,5\" 540 MB (ISO 15498)"
msgid "3.5\" 640 MB (ISO 15498)"
-msgstr "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)"
+msgstr "3,5\" 1.3 GB (GigaMO)"
msgid "3.5\" 2.3 GB (GigaMO 2)"
-msgstr "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"
+msgstr "5,25\" 600 MB"
msgid "5.25\" 650 MB"
-msgstr "5.25\" 650 MB"
+msgstr "5,25\" 650 MB"
msgid "5.25\" 1 GB"
-msgstr "5.25\" 1 GB"
+msgstr "5,25\" 1 GB"
msgid "5.25\" 1.3 GB"
-msgstr "5.25\" 1.3 GB"
+msgstr "5,25\" 1.3 GB"
msgid "Perfect RPM"
msgstr "RPM perfectes"
msgid "1% below perfect RPM"
-msgstr "1% por sota dels RPM perfectes"
+msgstr "1% per sota dels RPM perfectes"
msgid "1.5% below perfect RPM"
-msgstr "1.5% por sota dels RPM perfectes"
+msgstr "1.5% per sota dels RPM perfectes"
msgid "2% below perfect RPM"
-msgstr "2% por sota dels RPM perfectes"
+msgstr "2% per sota dels RPM perfectes"
msgid "(System Default)"
msgstr "(Per defecte del sistema)"
@@ -1576,10 +1576,10 @@ 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 ratón:"
+msgstr "Sensitivitat del ratolí:"
msgid "Select media images from program working directory"
-msgstr "Escollir imatges de mitjans del directori de treball del programa"
+msgstr "Trieu imatges de mitjans del directori de treball del programa"
msgid "PIT mode:"
msgstr "Modalitat PIT:"
@@ -1591,19 +1591,19 @@ msgid "Slow"
msgstr "Lenta"
msgid "Fast"
-msgstr "Ráàida"
+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 no és més suportat"
+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 del administrador WinBox s'ha aturat en 2022 per la manca de mantenidors. Com ara dirigim els nostres esforços a fer 86Box encara millor, hem pres la decisió de no més suportar el WinBox com ara administrador.\n\nNo es proporcionaran més actualitzacions a través del WinBox, i podeu trobar un comportament incorrecte si continua en utilitzar-lo amb versions más noves del 86Box. Qualsevol report de error relacionat amb el comportament del WinBox serà tancat com ara invàlid.\n\nAneu a 86box.net per a una llista de altres administradors que podeu utilitzar."
+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 "Generar"
+msgstr "Genera"
msgid "Joystick configuration"
msgstr "Configuració del joystick"
@@ -1624,7 +1624,7 @@ msgid "List of MCA devices:"
msgstr "Llista de dispositius MCA:"
msgid "&Tablet tool"
-msgstr "Eine de &taula"
+msgstr "Eina de &tauleta"
msgid "About &Qt"
msgstr "Quant al &Qt"
@@ -1636,31 +1636,31 @@ msgid "Show non-&primary monitors"
msgstr "Mostrar monitors no prim&aris"
msgid "Open screenshots &folder…"
-msgstr "Obrir la ca&rpeta de captures…"
+msgstr "Obre la ca&rpeta de captures…"
msgid "Appl&y fullscreen stretch mode when maximized"
-msgstr "&Utilitzar estirament de la pantalla sencera en modalitat maximitzada"
+msgstr "&Utilitza estirament de la pantalla sencera en modalitat maximitzada"
msgid "&Cursor/Puck"
msgstr "&Cursor/Puck"
msgid "&Pen"
-msgstr "&Bolígraf"
+msgstr "&Llapis"
msgid "&Host CD/DVD Drive (%1:)"
-msgstr "&Unitat de CD/DVD del amfitrió (%1:)"
+msgstr "&Unitat de CD/DVD de l'amfitrió (%1:)"
msgid "&Connected"
msgstr "&Connectat"
msgid "Clear image &history"
-msgstr "Suprimir &història de imatges"
+msgstr "Esborra &historial d'imatges"
msgid "Create…"
-msgstr "Criar…"
+msgstr "Crea…"
msgid "Host CD/DVD Drive (%1)"
-msgstr "Unitat de CD/DVD del amfitrió (%1)"
+msgstr "Unitat de CD/DVD de l'amfitrió (%1)"
msgid "Unknown Bus"
msgstr "Bus desconegut"
@@ -1681,7 +1681,7 @@ msgid "Render behavior"
msgstr "Comportament del renderitzador"
msgid "Use target framerate:"
-msgstr "Utilitzar la freqüència de fotogrames del objectiu:"
+msgstr "Utilitza la següent freqüència de fotogrames:"
msgid " fps"
msgstr " fps"
@@ -1696,46 +1696,46 @@ msgid "Shaders"
msgstr "Shaders"
msgid "Remove"
-msgstr "Suprimir"
+msgstr "Esborra"
msgid "Browse…"
-msgstr "Navegació…"
+msgstr "Navega…"
msgid "Couldn't create OpenGL context."
-msgstr "Impossible de criar el context OpenGL."
+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 bé més alta del OpenGL. La versió actual és %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 el 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 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.
"
+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 està segur, escolliu \"La vaig copiar\"."
+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 "La vaig moure"
+msgstr "L'he moguda"
msgid "I Copied It"
-msgstr "La vaig copiar"
+msgstr "L'he copiada"
msgid "86Box Monitor #%1"
msgstr "Monitor del 86Box %1"
msgid "No MCA devices."
-msgstr "Cap de dispositius MCA."
+msgstr "Cap dispositiu MCA."
msgid "MiB"
msgstr "MiB"
@@ -1759,7 +1759,7 @@ msgid "Mode:"
msgstr "Modalitat:"
msgid "Interface:"
-msgstr "Interfase:"
+msgstr "Interfície:"
msgid "Adapter:"
msgstr "Adaptador:"
@@ -1771,10 +1771,10 @@ msgid "TAP Bridge Device:"
msgstr "Dispositiu pont TAP:"
msgid "86Box Unit Tester"
-msgstr "Comprovador de unitat del 86Box"
+msgstr "Comprovador d'unitats del 86Box"
msgid "Novell NetWare 2.x Key Card"
-msgstr "Targeta de clau del Novell NetWare 2.x"
+msgstr "Targeta de clau per al Novell NetWare 2.x"
msgid "Serial port passthrough 1"
msgstr "Passatge de port sèrie 1"
@@ -1864,55 +1864,55 @@ msgid "System MIDI"
msgstr "MIDI del sistema"
msgid "MIDI Input Device"
-msgstr "Dispositiu de entrada MIDI"
+msgstr "Dispositiu d'entrada MIDI"
msgid "BIOS file"
-msgstr "Fitxer del BIOS"
+msgstr "Fitxer de la BIOS"
msgid "BIOS file (ROM #1)"
-msgstr "Fitxer del BIOS (ROM núm. 1)"
+msgstr "Fitxer de la BIOS (ROM núm. 1)"
msgid "BIOS file (ROM #2)"
-msgstr "Fitxer del BIOS (ROM núm. 2)"
+msgstr "Fitxer de la BIOS (ROM núm. 2)"
msgid "BIOS file (ROM #3)"
-msgstr "Fitxer del BIOS (ROM núm. 3)"
+msgstr "Fitxer de la BIOS (ROM núm. 3)"
msgid "BIOS file (ROM #4)"
-msgstr "Fitxer del BIOS (ROM núm. 4)"
+msgstr "Fitxer de la BIOS (ROM núm. 4)"
msgid "BIOS address"
-msgstr "Adreça del BIOS"
+msgstr "Adreça de la BIOS"
msgid "BIOS address (ROM #1)"
-msgstr "Adreça del BIOS (ROM núm. 1)"
+msgstr "Adreça de la BIOS (ROM núm. 1)"
msgid "BIOS address (ROM #2)"
-msgstr "Adreça del BIOS (ROM núm. 2)"
+msgstr "Adreça de la BIOS (ROM núm. 2)"
msgid "BIOS address (ROM #3)"
-msgstr "Adreça del BIOS (ROM núm. 3)"
+msgstr "Adreça de la BIOS (ROM núm. 3)"
msgid "BIOS address (ROM #4)"
-msgstr "Adreça del BIOS (ROM núm. 4)"
+msgstr "Adreça de la BIOS (ROM núm. 4)"
msgid "Enable BIOS extension ROM Writes"
-msgstr "Activar escriptures per al ROM de extensió del BIOS"
+msgstr "Activa l'escriptura per a la ROM d'extensió de la BIOS"
msgid "Enable BIOS extension ROM Writes (ROM #1)"
-msgstr "Activar escriptures per al ROM de extensió del BIOS (ROM núm. 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 "Activar escriptures per al ROM de extensió del BIOS (ROM núm. 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 "Activar escriptures per al ROM de extensió del BIOS (ROM núm. 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 "Activar escriptures per al ROM de extensió del BIOS (ROM núm. 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 buffer lineal de pantalla"
+msgstr "Base del búfer lineal de pantalla"
msgid "Address"
msgstr "Adreça"
@@ -1924,25 +1924,25 @@ msgid "Serial port IRQ"
msgstr "IRQ del port sèrie"
msgid "Parallel port IRQ"
-msgstr "IRQ del port paralel"
+msgstr "IRQ del port paral·lel"
msgid "Hard disk"
msgstr "Disc dur"
msgid "BIOS Revision"
-msgstr "Revisió del BIOS"
+msgstr "Revisió de la BIOS"
msgid "BIOS Version"
-msgstr "Versió del BIOS"
+msgstr "Versió de la BIOS"
msgid "BIOS Language"
-msgstr "Idioma del BIOS"
+msgstr "Idioma de la BIOS"
msgid "IBM 5161 Expansion Unit"
-msgstr "Unitat de expansió IBM 5161"
+msgstr "Unitat d'expansió IBM 5161"
msgid "IBM Cassette Basic"
-msgstr "BASIC de casset IBM"
+msgstr "IBM Basic per a cinta"
msgid "Translate 26 -> 17"
msgstr "Traduir 26 -> 17"
@@ -1951,46 +1951,46 @@ msgid "Language"
msgstr "Idioma"
msgid "Enable backlight"
-msgstr "Activar retroiŀluminació"
+msgstr "Activa retroiŀluminació"
msgid "Invert colors"
-msgstr "Invertir colors"
+msgstr "Inverteix colors"
msgid "BIOS size"
-msgstr "Grandària del BIOS"
+msgstr "Mida de la BIOS"
msgid "BIOS size (ROM #1)"
-msgstr "Grandària del BIOS (ROM núm. 1)"
+msgstr "Mida de la BIOS (ROM núm. 1)"
msgid "BIOS size (ROM #2)"
-msgstr "Grandària del BIOS (ROM núm. 2)"
+msgstr "Mida de la BIOS (ROM núm. 2)"
msgid "BIOS size (ROM #3)"
-msgstr "Grandària del BIOS (ROM núm. 3)"
+msgstr "Mida de la BIOS (ROM núm. 3)"
msgid "BIOS size (ROM #4)"
-msgstr "Grandària del BIOS (ROM núm. 4)"
+msgstr "Mida de la BIOS (ROM núm. 4)"
msgid "Map C0000-C7FFF as UMB"
-msgstr "Mapar C0000-C7FFF com ara UMB"
+msgstr "Mapeja C0000-C7FFF com a UMB"
msgid "Map C8000-CFFFF as UMB"
-msgstr "Mapar C8000-CFFFF com ara UMB"
+msgstr "Mapeja C8000-CFFFF com a UMB"
msgid "Map D0000-D7FFF as UMB"
-msgstr "Mapar D0000-D7FFF com ara UMB"
+msgstr "Mapeja D0000-D7FFF com a UMB"
msgid "Map D8000-DFFFF as UMB"
-msgstr "Mapar D8000-DFFFF com ara UMB"
+msgstr "Mapeja D8000-DFFFF com a UMB"
msgid "Map E0000-E7FFF as UMB"
-msgstr "Mapar E0000-E7FFF com ara UMB"
+msgstr "Mapeja E0000-E7FFF com a UMB"
msgid "Map E8000-EFFFF as UMB"
-msgstr "Mapar E8000-EFFFF com ara UMB"
+msgstr "Mapeja E8000-EFFFF com a UMB"
msgid "JS9 Jumper (JIM)"
-msgstr "Pont JS9 (JIM)"
+msgstr "Jumper JS9 (JIM)"
msgid "MIDI Output Device"
msgstr "Dispositiu de sortida MIDI"
@@ -2005,7 +2005,7 @@ msgid "MIDI Clockout"
msgstr "Sortida del rellotge MIDI"
msgid "Output Gain"
-msgstr "Guany de sortida"
+msgstr "Guany de la sortida"
msgid "Chorus"
msgstr "Cor"
@@ -2029,7 +2029,7 @@ msgid "Reverb"
msgstr "Reverberació"
msgid "Reverb Room Size"
-msgstr "Mida de l'habitaciò de reverberació"
+msgstr "Mida de l'habitació de reverberació"
msgid "Reverb Damping"
msgstr "Amortiment de reverberació"
@@ -2086,13 +2086,13 @@ msgid "MAC Address OUI"
msgstr "OUI de la adreça MAC"
msgid "Enable BIOS"
-msgstr "Activar el BIOS"
+msgstr "Activar la BIOS"
msgid "Baud Rate"
msgstr "Velocitat de transmissió"
msgid "TCP/IP listening port"
-msgstr "Port de auscultació TCP/IP"
+msgstr "Port TCP/IP d'escolta"
msgid "Phonebook File"
msgstr "Fitxer de llista de contactes"
@@ -2104,16 +2104,16 @@ msgid "RAM Address"
msgstr "Adreça del RAM"
msgid "RAM size"
-msgstr "Grandària del RAM"
+msgstr "Mida de la RAM"
msgid "Initial RAM size"
-msgstr "Grandària inicial del RAM"
+msgstr "Mida inicial de la RAM"
msgid "Serial Number"
msgstr "Número de sèrie"
msgid "Host ID"
-msgstr "ID del amfitrió"
+msgstr "ID de l'amfitrió"
msgid "FDC Address"
msgstr "Adreça del FDC"
@@ -2131,28 +2131,28 @@ msgid "Low DMA"
msgstr "DMA baix"
msgid "Enable Game port"
-msgstr "Activar port de joc"
+msgstr "Activa port de joystick"
msgid "Enable Adlib ports"
-msgstr "Activar ports Adlib"
+msgstr "Activa ports Adlib"
msgid "SID Model"
msgstr "Model del SID"
msgid "SID Filter Strength"
-msgstr "Força del filtre del SID"
+msgstr "Força del filtatge del SID"
msgid "Surround module"
-msgstr "Mòdulo surround"
+msgstr "Mòdul surround"
msgid "SB Address"
-msgstr "Adreça del SB"
+msgstr "Adreça de la SB"
msgid "Adlib Address"
-msgstr "Adreça del Adlib"
+msgstr "Adreça de l'Adlib"
msgid "Use EEPROM setting"
-msgstr "Uitilitzar la configuració del EEPROM"
+msgstr "Uitilitza la configuració de l'EEPROM"
msgid "WSS IRQ"
msgstr "IRQ del WSS"
@@ -2170,16 +2170,16 @@ msgid "Onboard RTC"
msgstr "RTC integrat"
msgid "Not installed"
-msgstr "No instalat"
+msgstr "No instal·lat"
msgid "Enable OPL"
-msgstr "Activar OPL"
+msgstr "Activa OPL"
msgid "Receive MIDI input (MPU-401)"
msgstr "Rebre entrada MIDI (MPU-401)"
msgid "SB low DMA"
-msgstr "DMA baix del SB"
+msgstr "DMA baix de la SB"
msgid "6CH variant (6-channel)"
msgstr "Variant 6CH (6 canals)"
@@ -2194,16 +2194,16 @@ msgid "High DMA"
msgstr "DMA alt"
msgid "Control PC speaker"
-msgstr "Controlar el altaveu del PC"
+msgstr "Controla l'altaveu del PC"
msgid "Memory size"
-msgstr "Grandària de memòria"
+msgstr "Mida de memòria"
msgid "EMU8000 Address"
msgstr "Adreça del EMU8000"
msgid "IDE Controller"
-msgstr "Controlador IDE"
+msgstr "Controladora IDE"
msgid "Codec"
msgstr "Codec"
@@ -2212,13 +2212,13 @@ msgid "GUS type"
msgstr "Tipus de GUS"
msgid "Enable 0x04 \"Exit 86Box\" command"
-msgstr "Activar ordre 0x04 \"Sortir de 86Box\""
+msgstr "Activa ordre 0x04 \"Surt de 86Box\""
msgid "Display type"
msgstr "Tipus de pantalla"
msgid "Composite type"
-msgstr "Tipus de pantalla compòsita"
+msgstr "Tipus de pantalla composta"
msgid "RGB type"
msgstr "Tipus de pantalla RGB"
@@ -2233,7 +2233,7 @@ msgid "Monitor type"
msgstr "Tipus de monitor"
msgid "Character set"
-msgstr "Conjunt de caracters"
+msgstr "Conjunt de caràcters"
msgid "XGA type"
msgstr "Tipus de XGA"
@@ -2248,7 +2248,7 @@ msgid "RAMDAC type"
msgstr "Tipus de RAMDAC"
msgid "Blend"
-msgstr "Mesclar"
+msgstr "Mescla"
msgid "Font"
msgstr "Tipus de lletra"
@@ -2260,19 +2260,19 @@ msgid "Video chroma-keying"
msgstr "Croma-clau de vídeo"
msgid "Dithering"
-msgstr "Dithering"
+msgstr "Díthering"
msgid "Enable NMI for CGA emulation"
-msgstr "Activar NMI per a emulació del CGA"
+msgstr "Activar NMI per a l'emulació del CGA"
msgid "Voodoo type"
msgstr "Tipus de Voodoo"
msgid "Framebuffer memory size"
-msgstr "Grandària de memòria del buffer de pantalla"
+msgstr "Mida de memòria del búffer de la pantalla"
msgid "Texture memory size"
-msgstr "Grandària de memòria de textura"
+msgstr "Mida de memòria de textura"
msgid "Dither subtraction"
msgstr "Subtracció de dither"
@@ -2290,7 +2290,7 @@ msgid "Start Address"
msgstr "Adreça inicial"
msgid "Contiguous Size"
-msgstr "Grandària contigua"
+msgstr "Mida contígua"
msgid "I/O Width"
msgstr "Amplada de E/S"
@@ -2302,31 +2302,31 @@ msgid "EMS mode"
msgstr "Modalitat EMS"
msgid "EMS Address"
-msgstr "Adreça del EMS"
+msgstr "Adreça de l'EMS"
msgid "EMS 1 Address"
-msgstr "Adreça del EMS 1"
+msgstr "Adreça de l'EMS 1"
msgid "EMS 2 Address"
-msgstr "Adreça del EMS 2"
+msgstr "Adreça de l'EMS 2"
msgid "EMS Memory Size"
-msgstr "Grandària de memòria del EMS"
+msgstr "Mida de la memòria EMS"
msgid "EMS 1 Memory Size"
-msgstr "Grandària de memòria del EMS 1"
+msgstr "Mida de la memòria EMS 1"
msgid "EMS 2 Memory Size"
-msgstr "Grandària de memòria del EMS 2"
+msgstr "Mida de la memòria EMS 2"
msgid "Enable EMS"
-msgstr "Activar EMS"
+msgstr "Activa EMS"
msgid "Enable EMS 1"
-msgstr "Activar EMS 1"
+msgstr "Activa EMS 1"
msgid "Enable EMS 2"
-msgstr "Activar EMS 2"
+msgstr "Activa EMS 2"
msgid "Address for > 2 MB"
msgstr "Adreça per a > 2 MB"
@@ -2344,13 +2344,13 @@ msgid "Always at selected speed"
msgstr "Sempre a la velocitat escollida"
msgid "BIOS setting + Hotkeys (off during POST)"
-msgstr "Configuració del BIOS + Tecles de accés ràpid (desactivates durant el 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 de E0000 (MSB de adreça invertit, últimes 64 KB primer)"
+msgstr "128 KB a partir d'E0000 (MSB d'adreça invertida, darrers 64 KB primer)"
msgid "Sine"
msgstr "Sinusoidal"
@@ -2362,10 +2362,10 @@ msgid "Linear"
msgstr "Lineal"
msgid "4th Order"
-msgstr "De 4º ordre"
+msgstr "De 4t ordre"
msgid "7th Order"
-msgstr "De 7º ordre"
+msgstr "De 7è ordre"
msgid "Non-timed (original)"
msgstr "No cronometrat (original)"
@@ -2407,7 +2407,7 @@ msgid "64 KB"
msgstr "64 KB"
msgid "Disable BIOS"
-msgstr "Desactivar el BIOS"
+msgstr "Desactiva la BIOS"
msgid "512 KB"
msgstr "512 KB"
@@ -2446,19 +2446,19 @@ msgid "256 KB"
msgstr "256 KB"
msgid "Composite"
-msgstr "Compòsit"
+msgstr "Compost"
msgid "True color"
-msgstr "Color veritable"
+msgstr "Color real"
msgid "Old"
-msgstr "Vell"
+msgstr "Antic"
msgid "New"
msgstr "Nou"
msgid "Color (generic)"
-msgstr "Colors (genèric)"
+msgstr "Color (genèric)"
msgid "Green Monochrome"
msgstr "Monocromàtic verd"
@@ -2470,10 +2470,10 @@ msgid "Gray Monochrome"
msgstr "Monocromàtic gris"
msgid "Color (no brown)"
-msgstr "Colors (sense marró)"
+msgstr "Color (sense marró)"
msgid "Color (IBM 5153)"
-msgstr "Colors (IBM 5153)"
+msgstr "Color (IBM 5153)"
msgid "Simple doubling"
msgstr "Duplicació simple"
@@ -2506,16 +2506,16 @@ msgid "Monochrome (5151/MDA) (amber)"
msgstr "Monocromàtic (5151/MDA) (ambre)"
msgid "Color 40x25 (5153/CGA)"
-msgstr "Colors 40x25 (5153/CGA)"
+msgstr "Color 40x25 (5153/CGA)"
msgid "Color 80x25 (5153/CGA)"
-msgstr "Colors 80x25 (5153/CGA)"
+msgstr "Color 80x25 (5153/CGA)"
msgid "Enhanced Color - Normal Mode (5154/ECD)"
-msgstr "Colors millorat - modalitat normal (5154/ECD)"
+msgstr "Color millorat - modalitat normal (5154/ECD)"
msgid "Enhanced Color - Enhanced Mode (5154/ECD)"
-msgstr "Colors millorat - modalitat millorada (5154/ECD)"
+msgstr "Color millorat - modalitat millorada (5154/ECD)"
msgid "Green"
msgstr "Verd"
@@ -2530,7 +2530,7 @@ msgid "Grayscale"
msgstr "Escala de grisos"
msgid "Color"
-msgstr "Colors"
+msgstr "Color"
msgid "U.S. English"
msgstr "Anglès dels EUA"
@@ -2545,7 +2545,7 @@ msgid "Bochs latest"
msgstr "Bochs més nou"
msgid "Apply overscan deltas"
-msgstr "Aplicar deltes del overscan"
+msgstr "Aplicar deltes de l'overscan"
msgid "Mono Interlaced"
msgstr "Monocromàtic entrallaçat"
@@ -2554,10 +2554,10 @@ msgid "Mono Non-Interlaced"
msgstr "Monocromàtic no entrallaçat"
msgid "Color Interlaced"
-msgstr "Colors entrallaçat"
+msgstr "Color entrallaçat"
msgid "Color Non-Interlaced"
-msgstr "Colors no entrallaçat"
+msgstr "Color no entrallaçat"
msgid "3Dfx Voodoo Graphics"
msgstr "Gràfics 3dfx Voodoo"
@@ -2590,7 +2590,7 @@ msgid "High-Speed"
msgstr "Alta velocitat"
msgid "Stereo LPT DAC"
-msgstr "DAC LPT estéreo"
+msgstr "DAC LPT estèreo"
msgid "Generic Text Printer"
msgstr "Impressora genèrica de text"
@@ -2605,7 +2605,7 @@ msgid "Generic PCL5e Printer"
msgstr "Impresora genèrica PCL5e"
msgid "Parallel Line Internet Protocol"
-msgstr "Protocol de Internet de línia paralela"
+msgstr "Protocol d'Internet de línia paralela"
msgid "Protection Dongle for Savage Quest"
msgstr "Dongle de protecció per a Savage Quest"
@@ -2626,7 +2626,7 @@ msgid "Data bits"
msgstr "Bits de dades"
msgid "Stop bits"
-msgstr "Bits de parada"
+msgstr "Bits d'aturada"
msgid "Baud Rate of Passthrough"
msgstr "Velocitat de transmissió de passatge"
@@ -2638,13 +2638,13 @@ msgid "Named Pipe (Client)"
msgstr "Conducta anomenada (client)"
msgid "Host Serial Passthrough"
-msgstr "Passatge del port sèrie del amfitrió"
+msgstr "Passatge del port sèrie de l'amfitrió"
msgid "E&ject %1"
-msgstr "E&xpulsar %1"
+msgstr "E&xpulsa %1"
msgid "&Unmute"
-msgstr "&Reactivar so"
+msgstr "&Reactiva so"
msgid "Softfloat FPU"
msgstr "FPU Softfloat"
@@ -2704,13 +2704,13 @@ msgid "Inhibit multimedia keys"
msgstr "Inhibir tecles multimèdia"
msgid "Ask for confirmation before saving settings"
-msgstr "Demanar confirmació abans de desar la configuració"
+msgstr "Demana confirmació abans de desar la configuració"
msgid "Ask for confirmation before hard resetting"
-msgstr "Demanar confirmació abans de la reiniciació completa"
+msgstr "Demana confirmació abans de la reiniciació completa"
msgid "Ask for confirmation before quitting"
-msgstr "Demanar confirmació abans de sortir"
+msgstr "Demana confirmació abans de sortir"
msgid "Options"
msgstr "Opcions"
@@ -2746,7 +2746,7 @@ msgid "Shader Configuration"
msgstr "Configuració de shaders"
msgid "Add"
-msgstr "Afegir"
+msgstr "Afegeix"
msgid "Move up"
msgstr "Moure cap amunt"
@@ -2767,16 +2767,16 @@ msgid "Keybind"
msgstr "Drecera"
msgid "Clear binding"
-msgstr "Escorrar drecera"
+msgstr "Esborra drecera"
msgid "Bind"
-msgstr "Vincular"
+msgstr "Vincula"
msgid "Bind Key"
-msgstr "Vincular tecla"
+msgstr "Vincula tecla"
msgid "Enter key combo:"
-msgstr "Escriure combinació de tecles:"
+msgstr "Escriviu combinació de tecles:"
msgid "Bind conflict"
msgstr "Conflicte entre dreceres"
@@ -2785,28 +2785,28 @@ msgid "This key combo is already in use."
msgstr "Aquesta combinació de tecles ja està en ús."
msgid "Send Control+Alt+Del"
-msgstr "Enviar Control+Alt+Del"
+msgstr "Envia Control+Alt+Supr"
msgid "Send Control+Alt+Escape"
-msgstr "Enviar Control+Alt+Escape"
+msgstr "Envia Control+Alt+Esc"
msgid "Toggle fullscreen"
msgstr "Alternar pantalla completa"
msgid "Toggle UI in fullscreen"
-msgstr "Alternar interfase de usuari en modalitat de pantalla completa"
+msgstr "Alternar interfície d'usuari en modalitat de pantalla completa"
msgid "Screenshot"
msgstr "Captura de pantalla"
msgid "Release mouse pointer"
-msgstr "Soltar el punter del ratolí"
+msgstr "Allibera el punter del ratolí"
msgid "Toggle pause"
-msgstr "Alternar pausa"
+msgstr "Alterna pausa"
msgid "Toggle mute"
-msgstr "Alternar silenci"
+msgstr "Alterna silenci"
msgid "Text files"
msgstr "Fitxers de text"
@@ -2830,7 +2830,7 @@ msgid "Hub Mode"
msgstr "Modalitat de concentrador"
msgid "Hostname:"
-msgstr "Nombre del amfitrió:"
+msgstr "Nom de l'amfitrió:"
msgid "ISA RAM:"
msgstr "RAM ISA:"
@@ -2839,19 +2839,19 @@ msgid "ISA ROM:"
msgstr "ROM ISA:"
msgid "&Wipe NVRAM"
-msgstr "&Esborrar el 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 de NVRAM (i relacionats) de la màquina virtual situats al subdirectori \"nvr\". Haureu de tornar a reconfigurar la configuració del BIOS (i potser de altres dispositius a l'interior de la MV) si s'escau.\n\nSegur que voleu suprimir tots els continguts de la NVRAM de la màquina virtual \"%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 "Èxito"
+msgstr "Èxit"
msgid "Successfully wiped the NVRAM contents of the virtual machine \"%1\""
-msgstr "Els continguts de la NVRAM de la màquina virtual \"%1\" s'han esborrat amb èxit"
+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 els continguts de la NVRAM de la màquina virtual \"%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"
@@ -2866,16 +2866,16 @@ msgid "No Machines Found!"
msgstr "No s'han trobat màquines!"
msgid "Check for updates on startup"
-msgstr "Verificar actualitzacions en iniciar"
+msgstr "Comprova actualitzacions en iniciar"
msgid "Unable to determine release information"
-msgstr "No fou possible determinar informacions de la versió"
+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 més tard."
+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 completada"
+msgstr "Verificació de actualitzacions finalitzada"
msgid "stable"
msgstr "estable"
@@ -2884,7 +2884,7 @@ msgid "beta"
msgstr "beta"
msgid "You are running the latest %1 version of 86Box: %2"
-msgstr "Està executant la última versió %1 del 86Box: %2"
+msgstr "Esteu executant l'última versió %1 del 86Box: %2"
msgid "version"
msgstr "versió"
@@ -2893,22 +2893,22 @@ msgid "build"
msgstr "compilació"
msgid "You are currently running version %1."
-msgstr "Actualment està a executar la versió %1."
+msgstr "Actualment esteu executant la versió %1."
msgid "Version %1 is now available."
-msgstr "La versió %1 és ara disponible."
+msgstr "La versió %1 ja és disponible."
msgid "You are currently running build %1."
-msgstr "Actualment está a executar la compialació %1."
+msgstr "Actualment esteu executant la compialació %1."
msgid "Build %1 is now available."
-msgstr "La compilació %1 és ara disponible."
+msgstr "La compilació %1 ja és disponible."
msgid "Would you like to visit the download page?"
-msgstr "Voleu visitar a la pàgina de descàrregas?"
+msgstr "Voleu visitar la pàgina de descàrregues?"
msgid "Visit download page"
-msgstr "Visitar a la pàgina de descarregas"
+msgstr "Visita la pàgina de descàrregues"
msgid "Update check"
msgstr "Verificació de actualitzacions"
@@ -2926,16 +2926,16 @@ msgid "%1 Hz"
msgstr "%1 Hz"
msgid "Virtual machine crash"
-msgstr "Terminació inesperada de la màquina virtual"
+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 terminat inesperadament amb con el codi de sortida %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 el estat del ratolí a cada bloc del CPU"
+msgstr "&Actualitza l'estat del ratolí a cada bloc del CPU"
msgid "Hue"
msgstr "Matís"
@@ -2962,19 +2962,19 @@ msgid "Monitor EDID"
msgstr "EDID del monitor"
msgid "Export…"
-msgstr "Exportar…"
+msgstr "Exporta…"
msgid "Export EDID"
-msgstr "Exportar el EDID"
+msgstr "Exporta l'EDID"
msgid "EDID file \"%ls\" is too large."
-msgstr "El fitxer EDID \"%ls\" es massa gran."
+msgstr "El fitxer EDID \"%ls\" és massa gran."
msgid "OpenGL input scale"
-msgstr "Escala de entrada del OpenGL"
+msgstr "Escala de entrada de l'OpenGL"
msgid "OpenGL input stretch mode"
-msgstr "Modalitat de estirament de entrada del OpenGL"
+msgstr "Modalitat de estirament de entrada de l'OpenGL"
msgid "Color scheme"
msgstr "Esquema de colors"
@@ -2986,16 +2986,16 @@ msgid "Dark"
msgstr "Fosc"
msgid "Search:"
-msgstr "Cercar:"
+msgstr "Cerca:"
msgid "Force interpretation"
-msgstr "Forçar interpretació"
+msgstr "Força interpretació"
msgid "Allow recompilation"
msgstr "Permetre recompilació"
msgid "&Force interpretation"
-msgstr "&Forçar interpretació"
+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 e99f2431b..31fb80359 100644
--- a/src/qt/languages/es-ES.po
+++ b/src/qt/languages/es-ES.po
@@ -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"
From 46520dc16aecea1325a68e712142b6c42d94982b Mon Sep 17 00:00:00 2001
From: RSX798
Date: Mon, 22 Dec 2025 16:37:37 +0800
Subject: [PATCH 04/16] Update es-ES.po
---
src/qt/languages/es-ES.po | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/src/qt/languages/es-ES.po b/src/qt/languages/es-ES.po
index 31fb80359..53bd643b2 100644
--- a/src/qt/languages/es-ES.po
+++ b/src/qt/languages/es-ES.po
@@ -166,13 +166,13 @@ 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"
@@ -283,10 +283,10 @@ 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"
@@ -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:"
@@ -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"
From f6f518eacc7b5120d26bad129caedeebe55de019 Mon Sep 17 00:00:00 2001
From: Mike Swanson
Date: Mon, 22 Dec 2025 00:54:50 -0800
Subject: [PATCH 05/16] Use lock emoji to indicate write-protected recent disk
images.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This makes the menu look a little more visually distinct and obvious
when a recent disk image item is set to write-protected mode. While
an icon does exist, I have found it to be small and visually
indistinguisable enough that I didn't even know it existed before I
dug into the code.
This prefixes image names with U+1F512 LOCK (🔒). My first iteration
also added U+1F513 OPEN LOCK (🔓) to read-write image names, but I
quickly found that to be too visually distracting and confusing next
to the write-protect symbols, so I have opted to only keep the first
one.
This might have a caveat that the symbol will fail to show up on
systems without the lock emoji somewhere in their font set, but these
days, I expect pretty much everyone to be on OSes that come with the
full set of emoji fonts anyhow.
---
src/qt/qt_mediamenu.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/qt/qt_mediamenu.cpp b/src/qt/qt_mediamenu.cpp
index b2dcf9c40..c5611ec2e 100644
--- a/src/qt/qt_mediamenu.cpp
+++ b/src/qt/qt_mediamenu.cpp
@@ -668,7 +668,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
else
fi.setFile(fn);
if (!fi.fileName().isEmpty() && (fn.left(5) == "wp://")) {
- menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn.right(fn.length() - 5);
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : "🔒 " + fn.right(fn.length() - 5);
imageHistoryUpdatePos->setIcon(getIconWithIndicator(menu_icon, pixmap_size, QIcon::Normal, WriteProtected));
} else {
menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
@@ -696,7 +696,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
else
fi.setFile(fn);
if (!fi.fileName().isEmpty() && (fn.left(5) == "wp://")) {
- menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn.right(fn.length() - 5);
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : "🔒 " + fn.right(fn.length() - 5);
imageHistoryUpdatePos->setIcon(getIconWithIndicator(menu_icon, pixmap_size, QIcon::Normal, WriteProtected));
} else {
menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
@@ -735,7 +735,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
else
fi.setFile(fn);
if (!fi.fileName().isEmpty() && (fn.left(5) == "wp://")) {
- menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn.right(fn.length() - 5);
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : "🔒 " + fn.right(fn.length() - 5);
imageHistoryUpdatePos->setIcon(getIconWithIndicator(menu_icon, pixmap_size, QIcon::Normal, WriteProtected));
} else {
menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
@@ -754,7 +754,7 @@ MediaMenu::updateImageHistory(int index, int slot, ui::MediaType type)
else
fi.setFile(fn);
if (!fi.fileName().isEmpty() && (fn.left(5) == "wp://")) {
- menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn.right(fn.length() - 5);
+ menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : "🔒 " + fn.right(fn.length() - 5);
imageHistoryUpdatePos->setIcon(getIconWithIndicator(menu_icon, pixmap_size, QIcon::Normal, WriteProtected));
} else {
menu_item_name = fi.fileName().isEmpty() ? tr("Reload previous image") : fn;
From 0092ce15de3efac108b961882f870a8c05e8c38f Mon Sep 17 00:00:00 2001
From: OBattler
Date: Mon, 22 Dec 2025 22:56:10 +0100
Subject: [PATCH 06/16] Only make the fallthrough define available in C code,
fixes #6607.
---
src/include/86box/plat.h | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h
index dcf7e4d53..cbc348709 100644
--- a/src/include/86box/plat.h
+++ b/src/include/86box/plat.h
@@ -90,16 +90,12 @@ 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 */
@@ -114,6 +110,12 @@ extern "C" {
# endif
#endif
+#endif
+
+#if defined(_MSC_VER)
+# define ssize_t intptr_t
+#endif
+
/* Global variables residing in the platform module. */
extern int dopause; /* system is paused */
extern int mouse_capture; /* mouse is captured in app */
From d95d0d0b59de5881aa11d6e8524790820e4182e6 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Mon, 22 Dec 2025 23:00:02 +0100
Subject: [PATCH 07/16] Manager: Reorder the toolbar buttons to match the
buttons below.
---
src/qt/qt_vmmanager_mainwindow.ui | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/qt/qt_vmmanager_mainwindow.ui b/src/qt/qt_vmmanager_mainwindow.ui
index fbaeecf0f..a33893ee3 100644
--- a/src/qt/qt_vmmanager_mainwindow.ui
+++ b/src/qt/qt_vmmanager_mainwindow.ui
@@ -94,11 +94,11 @@
-
+
+
-
From 11976adced0e45c12c16665c8ea678c101038685 Mon Sep 17 00:00:00 2001
From: starfrost013
Date: Mon, 22 Dec 2025 22:29:35 +0000
Subject: [PATCH 08/16] remove remaining msvc check
---
src/include/86box/plat.h | 4 ----
1 file changed, 4 deletions(-)
diff --git a/src/include/86box/plat.h b/src/include/86box/plat.h
index cbc348709..7b2f0c12f 100644
--- a/src/include/86box/plat.h
+++ b/src/include/86box/plat.h
@@ -112,10 +112,6 @@ extern "C" {
#endif
-#if defined(_MSC_VER)
-# define ssize_t intptr_t
-#endif
-
/* Global variables residing in the platform module. */
extern int dopause; /* system is paused */
extern int mouse_capture; /* mouse is captured in app */
From 0055af732ada9617894ec568a259a73afa2463c5 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Mon, 22 Dec 2025 23:33:56 +0100
Subject: [PATCH 09/16] Increase MAX_IMAGE_PATH_LEN to 4096 bytes (to fix that
config.c warning) and make sure all file name arrays are of that length (no
more hardcoded 512 or 1024).
---
src/device/cartridge.c | 2 +-
src/device/cassette.c | 2 +-
src/floppy/fdd.c | 2 +-
src/include/86box/86box.h | 2 +-
src/include/86box/cartridge.h | 2 +-
src/include/86box/cassette.h | 2 +-
src/include/86box/cdrom.h | 4 ++--
src/include/86box/fdd.h | 2 +-
src/include/86box/hdd.h | 2 +-
src/include/86box/mo.h | 4 ++--
src/include/86box/rdisk.h | 4 ++--
src/machine/m_elt.c | 2 +-
src/qt/qt_harddrive_common.cpp | 1 +
src/qt/qt_machinestatus.cpp | 2 +-
src/qt/qt_settings_bus_tracking.cpp | 4 ++++
src/qt/qt_settingsotherremovable.cpp | 1 +
16 files changed, 22 insertions(+), 16 deletions(-)
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/floppy/fdd.c b/src/floppy/fdd.c
index 35676258c..14627a3f9 100644
--- a/src/floppy/fdd.c
+++ b/src/floppy/fdd.c
@@ -104,7 +104,7 @@ static fdd_pending_op_t fdd_pending[FDD_NUM];
/* BIOS boot status tracking */
static bios_boot_status_t bios_boot_status = BIOS_BOOT_POST;
-char floppyfns[FDD_NUM][512];
+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];
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 ef2a33489..5e526ab6d 100644
--- a/src/include/86box/fdd.h
+++ b/src/include/86box/fdd.h
@@ -96,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];
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/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/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/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_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_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>
From 7860e06f8a3514ce5614e6806e917d091d7ad324 Mon Sep 17 00:00:00 2001
From: starfrost013
Date: Mon, 22 Dec 2025 22:36:15 +0000
Subject: [PATCH 10/16] Remove all non-library _MSC_VER checks
---
src/codegen_new/codegen_allocator.c | 4 ---
src/cpu/cpu.h | 12 ++++----
src/cpu/x87_ops.h | 30 ++-----------------
src/floppy/fdd_pcjs.c | 4 ---
src/include/86box/plat.h | 24 ++++-----------
src/include/86box/plat_fallthrough.h | 16 +++++-----
src/include/86box/plat_unused.h | 7 ++---
src/include/86box/vid_voodoo_codegen_x86-64.h | 6 +---
src/include/86box/vid_voodoo_codegen_x86.h | 6 +---
src/network/network.c | 2 --
src/utils/random.c | 10 ++-----
11 files changed, 26 insertions(+), 95 deletions(-)
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/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/plat.h b/src/include/86box/plat.h
index 7b2f0c12f..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))
@@ -97,17 +88,14 @@ extern "C" {
# define atomic_flag_t atomic_flag
# define atomic_bool_t atomic_bool
-#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
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/vid_voodoo_codegen_x86-64.h b/src/include/86box/vid_voodoo_codegen_x86-64.h
index 8b1413ad4..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)
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/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/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);
From 1275f13d6883656c102fd1aa5a3d54ff4fc1346c Mon Sep 17 00:00:00 2001
From: OBattler
Date: Tue, 23 Dec 2025 00:22:00 +0100
Subject: [PATCH 11/16] (S)VGA render: Make sure the overscan is not blitted to
a line whose pointer is NULL, fixes #6591.
---
src/video/vid_svga_render.c | 15 ++++++++++-----
1 file changed, 10 insertions(+), 5 deletions(-)
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
From 196ffe7e4ec92cc1bdbf9553f34daaaf2f82e875 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Tue, 23 Dec 2025 00:26:58 +0100
Subject: [PATCH 12/16] Actually use the previous toolbar icons order in both
cases, because it's more logical.
---
src/qt/qt_vmmanager_details.cpp | 4 ++--
src/qt/qt_vmmanager_mainwindow.ui | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
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/qt/qt_vmmanager_mainwindow.ui b/src/qt/qt_vmmanager_mainwindow.ui
index a33893ee3..fbaeecf0f 100644
--- a/src/qt/qt_vmmanager_mainwindow.ui
+++ b/src/qt/qt_vmmanager_mainwindow.ui
@@ -94,11 +94,11 @@
-
+
-
+
From 0c6f43cd5500092ecd83c4d6a682b44abfa28405 Mon Sep 17 00:00:00 2001
From: OBattler
Date: Tue, 23 Dec 2025 00:28:08 +0100
Subject: [PATCH 13/16] Bump version to 5.4.
---
CMakeLists.txt | 2 +-
debian/changelog | 4 ++--
src/unix/assets/86Box.spec | 6 +++---
src/unix/assets/net.86box.86Box.metainfo.xml | 2 +-
vcpkg.json | 2 +-
5 files changed, 8 insertions(+), 8 deletions(-)
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/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/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",
From 77596d36231ef0a149c89c9f456b62daadebe69c Mon Sep 17 00:00:00 2001
From: OBattler
Date: Tue, 23 Dec 2025 01:20:26 +0100
Subject: [PATCH 14/16] Include 86box.h in the two dummy CD-ROM IOCTL files,
fixes compile on Linux and Mac.
---
src/qt/dummy_cdrom_ioctl.c | 1 +
src/unix/dummy_cdrom_ioctl.c | 1 +
2 files changed, 2 insertions(+)
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/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>
From cebf1502ac99f103ef69dfe99ad879533316bdc9 Mon Sep 17 00:00:00 2001
From: RSX798
Date: Tue, 23 Dec 2025 08:52:38 +0800
Subject: [PATCH 15/16] Update fr-FR.po
---
src/qt/languages/fr-FR.po | 54 +++++++++++++++++++--------------------
1 file changed, 27 insertions(+), 27 deletions(-)
diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po
index cba81ff67..20c6483db 100644
--- a/src/qt/languages/fr-FR.po
+++ b/src/qt/languages/fr-FR.po
@@ -19,7 +19,7 @@ msgid "&Keyboard requires capture"
msgstr "C&apturer le clavier"
msgid "&Right CTRL is left ALT"
-msgstr "CTRL &Droite devient ALT Gauche"
+msgstr "CTRL &droite devient ALT gauche"
msgid "&Hard reset"
msgstr "&Hard reset"
@@ -28,7 +28,7 @@ msgid "&Ctrl+Alt+Del"
msgstr "&Ctrl+Alt+Suppr"
msgid "Ctrl+Alt+&Esc"
-msgstr "Ctrl+Alt+&Esc"
+msgstr "Ctrl+A<+Échap"
msgid "&Pause"
msgstr "&Pause"
@@ -79,7 +79,7 @@ msgid "Force &4:3 display ratio"
msgstr "Forcer le ratio &4:3"
msgid "&Window scale factor"
-msgstr "Facteur d'&Echelle"
+msgstr "Facteur d'éch&elle"
msgid "&0.5x"
msgstr "&0.5x"
@@ -112,7 +112,7 @@ msgid "&8x"
msgstr "&8x"
msgid "Fi<er method"
-msgstr "Mét&hode de Filtre"
+msgstr "Mét&hode de filtre"
msgid "&Nearest"
msgstr "&Plus proche"
@@ -139,16 +139,16 @@ msgid "&Square pixels (Keep ratio)"
msgstr "Pixels &carrés (Conserver le ratio)"
msgid "&Integer scale"
-msgstr "&Echelle entière"
+msgstr "Éch&elle entière"
msgid "4:&3 Integer scale"
-msgstr "Echelle entière 4:&3"
+msgstr "Échelle entière 4:&3"
msgid "EGA/(S)&VGA settings"
msgstr "Réglages EGA/(S)&VGA"
msgid "&Inverted VGA monitor"
-msgstr "Moniteur VGA &Inversé"
+msgstr "Moniteur VGA &inversé"
msgid "VGA screen &type"
msgstr "&Type d'écran VGA"
@@ -160,22 +160,22 @@ msgid "RGB (no brown)"
msgstr "RVB (sans brun)"
msgid "&RGB Grayscale"
-msgstr "Niveau de Gris &RVB"
+msgstr "Niveau de gris &RVB"
msgid "Generic RGBI color monitor"
msgstr "Moniteur couleur RVB générique"
msgid "&Amber monitor"
-msgstr "Moniteur &Ambre"
+msgstr "Moniteur &ambre"
msgid "&Green monitor"
-msgstr "Moniteur &Vert"
+msgstr "Moniteur &vert"
msgid "&White monitor"
-msgstr "Moniteur &Blanc"
+msgstr "Moniteur &blanc"
msgid "Grayscale &conversion type"
-msgstr "Type de &conversion du niveau de Gris"
+msgstr "Type de &conversion du niveau de gris"
msgid "BT&601 (NTSC/PAL)"
msgstr "BT&601 (NTSC/PAL)"
@@ -220,7 +220,7 @@ msgid "Enable &Discord integration"
msgstr "Activer l'intégration &Discord"
msgid "Sound &gain…"
-msgstr "&Gain Son…"
+msgstr "&Gain son…"
msgid "Begin trace"
msgstr "Démarrer traces"
@@ -229,22 +229,22 @@ msgid "End trace"
msgstr "Arrêter traces"
msgid "&Help"
-msgstr "Ai&de"
+msgstr "&Aide"
msgid "&Documentation…"
msgstr "&Documentation…"
msgid "&About 86Box…"
-msgstr "&A Propos de 86Box…"
+msgstr "À &propos de 86Box…"
msgid "&New image…"
msgstr "&Nouvelle image…"
msgid "&Existing image…"
-msgstr "Image &Existante…"
+msgstr "Image &existante…"
msgid "Existing image (&Write-protected)…"
-msgstr "Image Existante (&Lecture seule)…"
+msgstr "Image existante (&Lecture seule)…"
msgid "&Record"
msgstr "En®istrer"
@@ -256,7 +256,7 @@ msgid "&Rewind to the beginning"
msgstr "&Revenir au debut"
msgid "&Fast forward to the end"
-msgstr "Avance rapide jusqu'à la &Fin"
+msgstr "Avance rapide jusqu'à la &fin"
msgid "E&ject"
msgstr "É&jecter"
@@ -595,7 +595,7 @@ msgid "Type:"
msgstr "Type :"
msgid "Image Format:"
-msgstr "Format Image :"
+msgstr "Format image :"
msgid "Block Size:"
msgstr "Taille du bloc :"
@@ -1300,7 +1300,7 @@ msgid "Warning"
msgstr "Avertissement"
msgid "&Kill"
-msgstr "Fo&rcer Extinction"
+msgstr "Fo&rcer extinction"
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 "La fermeture forcée d'une machine virtuelle peut entraîner une perte de données. Ne procédez ainsi que si le processus 86Box est bloqué.\n\nVoulez-vous vraiment fermer la machine virtuelle « %1 » ?"
@@ -1459,10 +1459,10 @@ msgid "Differencing VHD (.vhd)"
msgstr "VHD différentiel (.vhd)"
msgid "Large blocks (2 MB)"
-msgstr "Grands Blocs (2 Mo)"
+msgstr "Grands blocs (2 Mo)"
msgid "Small blocks (512 KB)"
-msgstr "Petits Blocs (512 Ko)"
+msgstr "Petits blocs (512 Ko)"
msgid "VHD files"
msgstr "Fichiers VHD"
@@ -1624,10 +1624,10 @@ msgid "List of MCA devices:"
msgstr "Liste des dispositifs MCA :"
msgid "&Tablet tool"
-msgstr "Outil Tablette"
+msgstr "Outil tablette"
msgid "About &Qt"
-msgstr "A propos de &Qt"
+msgstr "À propos de &Qt"
msgid "&MCA devices…"
msgstr "Dispositifs MCA…"
@@ -1684,7 +1684,7 @@ msgid "Use target framerate:"
msgstr "Utiliser le taux de rafraîchissement cible :"
msgid " fps"
-msgstr " Images par seconde"
+msgstr " images par seconde"
msgid "VSync"
msgstr "VSync"
@@ -2707,7 +2707,7 @@ msgid "Ask for confirmation before saving settings"
msgstr "Demander confirmation avant de sauvegarder les réglages"
msgid "Ask for confirmation before hard resetting"
-msgstr "Demander confirmation avant Hard Reset"
+msgstr "Demander confirmation avant hard reset"
msgid "Ask for confirmation before quitting"
msgstr "Demander confirmation avant de quitter"
@@ -2743,7 +2743,7 @@ msgid "Shader Manager"
msgstr "Gestionnaire de shader"
msgid "Shader Configuration"
-msgstr "Configuration Shader"
+msgstr "Configuration du shader"
msgid "Add"
msgstr "Ajouter"
From 2e9c82bf3efe1e28c62d1b0b9620d3c8b4bd8f56 Mon Sep 17 00:00:00 2001
From: RSX798
Date: Tue, 23 Dec 2025 09:02:20 +0800
Subject: [PATCH 16/16] Make "d" as hotkey in "Aide"
---
src/qt/languages/fr-FR.po | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/qt/languages/fr-FR.po b/src/qt/languages/fr-FR.po
index 20c6483db..6a5628f29 100644
--- a/src/qt/languages/fr-FR.po
+++ b/src/qt/languages/fr-FR.po
@@ -229,7 +229,7 @@ msgid "End trace"
msgstr "Arrêter traces"
msgid "&Help"
-msgstr "&Aide"
+msgstr "Ai&de"
msgid "&Documentation…"
msgstr "&Documentation…"