diff --git a/CMakeLists.txt b/CMakeLists.txt index b1f56e7da..98ab7c3fd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -113,21 +113,23 @@ option(DEV_BRANCH "Development branch" # Development branch features # -# Option Description Def. Condition Otherwise -# ------ ----------- ---- --------- --------- -cmake_dependent_option(AMD_K5 "AMD K5" ON "DEV_BRANCH" OFF) -cmake_dependent_option(CYRIX_6X86 "Cyrix 6x86" ON "DEV_BRANCH" OFF) -cmake_dependent_option(GUSMAX "Gravis UltraSound MAX" ON "DEV_BRANCH" OFF) -cmake_dependent_option(LASERXT "VTech Laser XT" ON "DEV_BRANCH" OFF) -cmake_dependent_option(MGA "Matrox Mystique graphics adapters" ON "DEV_BRANCH" OFF) -cmake_dependent_option(NO_SIO "Machines without emulated Super I/O chips" ON "DEV_BRANCH" OFF) -cmake_dependent_option(OLIVETTI "Olivetti M290" ON "DEV_BRANCH" OFF) -cmake_dependent_option(OPEN_AT "OpenAT" ON "DEV_BRANCH" OFF) -cmake_dependent_option(PAS16 "Pro Audio Spectrum 16" OFF "DEV_BRANCH" OFF) -cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" ON "DEV_BRANCH" OFF) -cmake_dependent_option(VGAWONDER "ATI VGA Wonder (ATI-18800)" ON "DEV_BRANCH" OFF) -cmake_dependent_option(VNC "VNC renderer" OFF "DEV_BRANCH" OFF) -cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF) +# Option Description Def. Condition Otherwise +# ------ ----------- ---- --------- --------- +cmake_dependent_option(AMD_K5 "AMD K5" ON "DEV_BRANCH" OFF) +cmake_dependent_option(CYRIX_6X86 "Cyrix 6x86" ON "DEV_BRANCH" OFF) +cmake_dependent_option(GUSMAX "Gravis UltraSound MAX" ON "DEV_BRANCH" OFF) +cmake_dependent_option(LASERXT "VTech Laser XT" ON "DEV_BRANCH" OFF) +cmake_dependent_option(MGA "Matrox Mystique graphics adapters" ON "DEV_BRANCH" OFF) +cmake_dependent_option(NO_SIO "Machines without emulated Super I/O chips" ON "DEV_BRANCH" OFF) +cmake_dependent_option(OLIVETTI "Olivetti M290" ON "DEV_BRANCH" OFF) +cmake_dependent_option(OPEN_AT "OpenAT" ON "DEV_BRANCH" OFF) +cmake_dependent_option(PAS16 "Pro Audio Spectrum 16" OFF "DEV_BRANCH" OFF) +cmake_dependent_option(SIO_DETECT "Super I/O Detection Helper" ON "DEV_BRANCH" OFF) +cmake_dependent_option(VGAWONDER "ATI VGA Wonder (ATI-18800)" ON "DEV_BRANCH" OFF) +cmake_dependent_option(VNC "VNC renderer" OFF "DEV_BRANCH" OFF) +cmake_dependent_option(XL24 "ATI VGA Wonder XL24 (ATI-28800-6)" ON "DEV_BRANCH" OFF) +cmake_dependent_option(ISAMEM_RAMPAGE "AST Rampage" ON "DEV_BRANCH" OFF) +cmake_dependent_option(ISAMEM_IAB "Intel Above Board" ON "DEV_BRANCH" OFF) # Determine the build type set(RELEASE_BUILD OFF) diff --git a/src/86box.c b/src/86box.c index 0970a6cb6..4cee64445 100644 --- a/src/86box.c +++ b/src/86box.c @@ -160,7 +160,8 @@ int GAMEBLASTER = 0; /* (C) sound option */ int GUS = 0; /* (C) sound option */ int SSI2001 = 0; /* (C) sound option */ int voodoo_enabled = 0; /* (C) video option */ -uint32_t mem_size = 0; /* (C) memory size */ +uint32_t mem_size = 0; /* (C) memory size (Installed on system board)*/ +uint32_t isa_mem_size = 0; /* (C) memory size (ISA Memory Cards) */ int cpu_use_dynarec = 0; /* (C) cpu uses/needs Dyna */ int cpu = 0; /* (C) cpu type */ int fpu_type = 0; /* (C) fpu type */ @@ -976,9 +977,6 @@ pc_reset_hard_init(void) /* Reset and reconfigure the Sound Card layer. */ sound_card_reset(); - /* Reset any ISA memory cards. */ - isamem_reset(); - /* Reset any ISA RTC cards. */ isartc_reset(); diff --git a/src/device/CMakeLists.txt b/src/device/CMakeLists.txt index 17a9ca1bb..2b7b34c7b 100644 --- a/src/device/CMakeLists.txt +++ b/src/device/CMakeLists.txt @@ -21,4 +21,12 @@ add_library(dev OBJECT bugger.c cassette.c cartridge.c hasp.c hwm.c hwm_lm75.c h if(LASERXT) target_compile_definitions(dev PRIVATE USE_LASERXT) +endif() + +if(ISAMEM_RAMPAGE) + target_compile_definitions(dev PRIVATE USE_ISAMEM_RAMPAGE) +endif() + +if(ISAMEM_IAB) + target_compile_definitions(dev PRIVATE USE_ISAMEM_IAB) endif() \ No newline at end of file diff --git a/src/device/ibm_5161.c b/src/device/ibm_5161.c index 3924e61dd..f6ed88476 100644 --- a/src/device/ibm_5161.c +++ b/src/device/ibm_5161.c @@ -54,15 +54,29 @@ ibm_5161_in(uint16_t port, void *priv) ret = dev->regs[port & 0x0007]; switch (port) { - case 0x211: - case 0x215: + case 0x210: /* Write to latch expansion bus data (ED0-ED7) */ + /* Read to verify expansion bus data (ED0-ED7) */ + break; + case 0x214: /* Write to latch data bus bits (DO - 07) */ + /* Read data bus bits (DO - D7) */ + break; + case 0x211: /* Read high-order address bits (A8 - A 15) */ + case 0x215: /* Read high-order address bits (A8 - A 15) */ ret = (get_last_addr() >> 8) & 0xff; break; - case 0x212: - case 0x216: + case 0x212: /* Read low-order address bits (A0 - A7) */ + case 0x216: /* Read low-order address bits (A0 - A7) */ ret = get_last_addr() & 0xff; break; - case 0x213: + case 0x213: /* Write 00 to disable expansion unit */ + /* Write 01 to enable expansion unit */ + /* Read status of expansion unit + 00 = enable/disable + 01 = wait-state request flag + 02-03 = not used + 04-07 = switch position + 1 = Off + 0 =On */ ret = dev->regs[3] & 0x01; break; } diff --git a/src/device/isamem.c b/src/device/isamem.c index a11a3d68b..b16d5d247 100644 --- a/src/device/isamem.c +++ b/src/device/isamem.c @@ -84,6 +84,16 @@ #include "cpu.h" +#define ISAMEM_IBMXT_CARD 0 +#define ISAMEM_GENXT_CARD 1 +#define ISAMEM_IBMAT_CARD 2 +#define ISAMEM_GENAT_CARD 3 +#define ISAMEM_P5PAK_CARD 4 +#define ISAMEM_A6PAK_CARD 5 +#define ISAMEM_EMS5150_CARD 6 +#define ISAMEM_EV159_CARD 10 +#define ISAMEM_RAMPAGEXT_CARD 11 +#define ISAMEM_ABOVEBOARD_CARD 12 #define ISAMEM_DEBUG 0 @@ -95,6 +105,9 @@ #define EMS_PGSIZE (16 << 10) /* one page is this big */ #define EMS_MAXPAGE 4 /* number of viewport pages */ +#define EXTRAM_CONVENTIONAL 0 +#define EXTRAM_HIGH 1 +#define EXTRAM_XMS 2 typedef struct { int8_t enabled; /* 1=ENABLED */ @@ -398,28 +411,31 @@ isamem_init(const device_t *info) /* Do per-board initialization. */ tot = 0; switch(dev->board) { - case 0: /* IBM PC/XT Memory Expansion Card */ - case 2: /* Paradise Systems 5-PAK */ + case ISAMEM_IBMXT_CARD: /* IBM PC/XT Memory Expansion Card */ + case ISAMEM_GENXT_CARD: /* Generic PC/XT Memory Expansion Card */ + case ISAMEM_P5PAK_CARD: /* Paradise Systems 5-PAK */ + case ISAMEM_A6PAK_CARD: /* AST SixPakPlus */ dev->total_size = device_get_config_int("size"); dev->start_addr = device_get_config_int("start"); tot = dev->total_size; break; - case 1: /* IBM PC/AT Memory Expansion Card */ + case ISAMEM_IBMAT_CARD: /* IBM PC/AT Memory Expansion Card */ + case ISAMEM_GENAT_CARD: /* Generic PC/AT Memory Expansion Card */ dev->total_size = device_get_config_int("size"); dev->start_addr = device_get_config_int("start"); tot = dev->total_size; dev->flags |= FLAG_WIDE; break; - case 3: /* Micro Mainframe EMS-5150(T) */ + case ISAMEM_EMS5150_CARD: /* Micro Mainframe EMS-5150(T) */ dev->base_addr = device_get_config_hex16("base"); dev->total_size = device_get_config_int("size"); dev->frame_addr = 0xD0000; dev->flags |= (FLAG_EMS | FLAG_CONFIG); break; - case 10: /* Everex EV-159 RAM 3000 */ + case ISAMEM_EV159_CARD: /* Everex EV-159 RAM 3000 */ dev->base_addr = device_get_config_hex16("base"); dev->total_size = device_get_config_int("size"); dev->start_addr = device_get_config_int("start"); @@ -433,7 +449,8 @@ isamem_init(const device_t *info) dev->frame_addr = 0xE0000; break; - case 11: + case ISAMEM_RAMPAGEXT_CARD: /* AST RAMpage/XT */ + case ISAMEM_ABOVEBOARD_CARD: /* Intel AboveBoard */ dev->base_addr = device_get_config_hex16("base"); dev->total_size = device_get_config_int("size"); dev->start_addr = device_get_config_int("start"); @@ -496,8 +513,8 @@ dev->frame_addr = 0xE0000; t = tot; isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr>>10, t>>10); - dev->ext_ram[0].ptr = ptr; - dev->ext_ram[0].base = addr; + dev->ext_ram[EXTRAM_CONVENTIONAL].ptr = ptr; + dev->ext_ram[EXTRAM_CONVENTIONAL].base = addr; /* Create, initialize and enable the low-memory mapping. */ mem_mapping_add(&dev->low_mapping, addr, t, @@ -507,7 +524,7 @@ dev->frame_addr = 0xE0000; ram_writeb, (dev->flags&FLAG_WIDE) ? ram_writew : NULL, NULL, - ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[0]); + ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[EXTRAM_CONVENTIONAL]); /* Tell the memory system this is external RAM. */ mem_set_mem_state(addr, t, @@ -531,8 +548,8 @@ dev->frame_addr = 0xE0000; isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr>>10, t>>10); - dev->ext_ram[1].ptr = ptr; - dev->ext_ram[1].base = addr + tot; + dev->ext_ram[EXTRAM_HIGH].ptr = ptr; + dev->ext_ram[EXTRAM_HIGH].base = addr + tot; /* Update and enable the remap. */ mem_mapping_set(&ram_remapped_mapping, @@ -540,7 +557,7 @@ dev->frame_addr = 0xE0000; ram_readb, ram_readw, NULL, ram_writeb, ram_writew, NULL, ptr, MEM_MAPPING_EXTERNAL, - &dev->ext_ram[1]); + &dev->ext_ram[EXTRAM_HIGH]); mem_mapping_disable(&ram_remapped_mapping); /* Tell the memory system this is external RAM. */ @@ -565,14 +582,14 @@ dev->frame_addr = 0xE0000; t = tot; isamem_log("ISAMEM: RAM at %05iKB (%iKB)\n", addr>>10, t>>10); - dev->ext_ram[2].ptr = ptr; - dev->ext_ram[2].base = addr; + dev->ext_ram[EXTRAM_XMS].ptr = ptr; + dev->ext_ram[EXTRAM_XMS].base = addr; /* Create, initialize and enable the high-memory mapping. */ mem_mapping_add(&dev->high_mapping, addr, t, ram_readb, ram_readw, NULL, ram_writeb, ram_writew, NULL, - ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[2]); + ptr, MEM_MAPPING_EXTERNAL, &dev->ext_ram[EXTRAM_XMS]); /* Tell the memory system this is external RAM. */ mem_set_mem_state(addr, t, MEM_READ_EXTERNAL | MEM_WRITE_EXTERNAL); @@ -583,6 +600,8 @@ dev->frame_addr = 0xE0000; addr += t; } + isa_mem_size += dev->total_size - (k >> 10); + /* If EMS is enabled, use the remainder for EMS. */ if (dev->flags & FLAG_EMS) { /* EMS 3.2 cannot have more than 2048KB per board. */ @@ -663,7 +682,7 @@ static const device_config_t ibmxt_config[] = }, { "start", "Start Address", CONFIG_SPINNER, "", 256, "", - { 0, 640-64, 64 }, + { 0, 576, 64 }, { { 0 } } }, { @@ -674,23 +693,50 @@ static const device_config_t ibmxt_config[] = static const device_t ibmxt_device = { "IBM PC/XT Memory Expansion", DEVICE_ISA, - 0, + ISAMEM_IBMXT_CARD, isamem_init, isamem_close, NULL, { NULL }, NULL, NULL, ibmxt_config }; +static const device_config_t genericxt_config[] = +{ + { + "size", "Memory Size", CONFIG_SPINNER, "", 16, "", + { 0, 640, 16 }, + { { 0 } } + }, + { + "start", "Start Address", CONFIG_SPINNER, "", 0, "", + { 0, 624, 16 }, + { { 0 } } + }, + { + "", "", -1 + } +}; + +static const device_t genericxt_device = { + "Generic PC/XT Memory Expansion", + DEVICE_ISA, + ISAMEM_GENXT_CARD, + isamem_init, isamem_close, NULL, + { NULL }, NULL, NULL, + genericxt_config +}; + + static const device_config_t ibmat_config[] = { { "size", "Memory Size", CONFIG_SPINNER, "", 512, "", - { 0, 4096, 512 }, + { 0, 12288, 512 }, { { 0 } } }, { "start", "Start Address", CONFIG_SPINNER, "", 512, "", - { 0, 16128, 128 }, + { 0, 15872, 512 }, { { 0 } } }, { @@ -701,13 +747,40 @@ static const device_config_t ibmat_config[] = static const device_t ibmat_device = { "IBM PC/AT Memory Expansion", DEVICE_ISA, - 1, + ISAMEM_IBMAT_CARD, isamem_init, isamem_close, NULL, { NULL }, NULL, NULL, ibmat_config }; +static const device_config_t genericat_config[] = +{ + { + "size", "Memory Size", CONFIG_SPINNER, "", 512, "", + { 0, 16384, 512 }, + { { 0 } } + }, + { + "start", "Start Address", CONFIG_SPINNER, "", 512, "", + { 0, 15872, 128 }, + { { 0 } } + }, + { + "", "", -1 + } +}; + +static const device_t genericat_device = { + "Generic PC/AT Memory Expansion", + DEVICE_ISA, + ISAMEM_GENAT_CARD, + isamem_init, isamem_close, NULL, + { NULL }, NULL, NULL, + genericat_config +}; + + static const device_config_t p5pak_config[] = { { @@ -728,13 +801,40 @@ static const device_config_t p5pak_config[] = static const device_t p5pak_device = { "Paradise Systems 5-PAK", DEVICE_ISA, - 2, + ISAMEM_P5PAK_CARD, isamem_init, isamem_close, NULL, { NULL }, NULL, NULL, p5pak_config }; +static const device_config_t a6pak_config[] = +{ + { + "size", "Memory Size", CONFIG_SPINNER, "", 64, "", + { 0, 576, 64 }, + { { 0 } } + }, + { + "start", "Start Address", CONFIG_SPINNER, "", 256, "", + { 64, 512, 64 }, + { { 0 } } + }, + { + "", "", -1 + } +}; + +static const device_t a6pak_device = { + "AST SixPakPlus", + DEVICE_ISA, + ISAMEM_A6PAK_CARD, + isamem_init, isamem_close, NULL, + { NULL }, NULL, NULL, + a6pak_config +}; + + static const device_config_t ems5150_config[] = { { @@ -774,7 +874,7 @@ static const device_config_t ems5150_config[] = static const device_t ems5150_device = { "Micro Mainframe EMS-5150(T)", DEVICE_ISA, - 3, + ISAMEM_EMS5150_CARD, isamem_init, isamem_close, NULL, { NULL }, NULL, NULL, ems5150_config @@ -877,7 +977,7 @@ static const device_config_t ev159_config[] = static const device_t ev159_device = { "Everex EV-159 RAM 3000 Deluxe", DEVICE_ISA, - 10, + ISAMEM_EV159_CARD, isamem_init, isamem_close, NULL, { NULL }, NULL, NULL, ev159_config @@ -975,10 +1075,10 @@ static const device_config_t rampage_config[] = } }; -static const device_t isamem_rampage_device = { +static const device_t rampage_device = { "AST RAMpage/XT", DEVICE_ISA, - 11, + ISAMEM_RAMPAGEXT_CARD, isamem_init, isamem_close, NULL, { NULL }, NULL, NULL, rampage_config @@ -986,14 +1086,119 @@ static const device_t isamem_rampage_device = { #endif +#ifdef USE_ISAMEM_IAB +static const device_config_t iab_config[] = +{ + { + "base", "Address", CONFIG_HEX16, "", 0x0258, "", { 0 }, + { + { + "208H", 0x0208 + }, + { + "218H", 0x0218 + }, + { + "258H", 0x0258 + }, + { + "268H", 0x0268 + }, + { + "2A8H", 0x02A8 + }, + { + "2B8H", 0x02B8 + }, + { + "2E8H", 0x02E8 + }, + { + "" + } + }, + }, + { + "frame", "Frame Address", CONFIG_HEX20, "", 0, "", { 0 }, + { + { + "Disabled", 0x00000 + }, + { + "C000H", 0xC0000 + }, + { + "D000H", 0xD0000 + }, + { + "E000H", 0xE0000 + }, + { + "" + } + }, + }, + { + "width", "I/O Width", CONFIG_SELECTION, "", 8, "", { 0 }, + { + { + "8-bit", 8 + }, + { + "16-bit", 16 + }, + { + "" + } + }, + }, + { + "speed", "Transfer Speed", CONFIG_SELECTION, "", 0, "", { 0 }, + { + { + "Standard", 0 + }, + { + "High-Speed", 1 + }, + { + "" + } + } + }, + { + "size", "Memory Size", CONFIG_SPINNER, "", 128, + "", + { 0, 8192, 128 }, + { 0 } + }, + { + "", "", -1 + } +}; + +static const device_t iab_device = { + "Intel AboveBoard", + DEVICE_ISA, + ISAMEM_ABOVEBOARD_CARD, + isamem_init, isamem_close, NULL, + { NULL }, NULL, NULL, + iab_config +}; +#endif + + static const struct { const char *internal_name; const device_t *dev; } boards[] = { - { "none", NULL }, + { "none", NULL }, { "ibmxt", &ibmxt_device }, + { "genericxt", &genericxt_device }, { "ibmat", &ibmat_device }, + { "genericat", &genericat_device }, { "p5pak", &p5pak_device }, + { "a6pak", &a6pak_device }, { "ems5150", &ems5150_device }, { "ev159", &ev159_device }, #ifdef USE_ISAMEM_BRAT @@ -1003,9 +1208,9 @@ static const struct { { "rampage", &rampage_device }, #endif #ifdef USE_ISAMEM_IAB - { "iab", &iab_device }, + { "iab", &iab_device }, #endif - { "", NULL } + { "", NULL } }; @@ -1014,6 +1219,9 @@ isamem_reset(void) { int k, i; + /* We explicitly set to zero here or bad things happen */ + isa_mem_size = 0; + for (i = 0; i < ISAMEM_MAX; i++) { k = isamem_type[i]; if (k == 0) continue; diff --git a/src/device/isartc.c b/src/device/isartc.c index d587f9015..bc1fa795b 100644 --- a/src/device/isartc.c +++ b/src/device/isartc.c @@ -83,6 +83,11 @@ #include <86box/isartc.h> +#define ISARTC_EV170 0 +#define ISARTC_DTK 1 +#define ISARTC_P5PAK 2 +#define ISARTC_A6PAK 3 + #define ISARTC_DEBUG 0 @@ -506,7 +511,7 @@ isartc_init(const device_t *info) /* Do per-board initialization. */ switch(dev->board) { - case 0: /* Everex EV-170 Magic I/O */ + case ISARTC_EV170: /* Everex EV-170 Magic I/O */ dev->flags |= FLAG_YEAR80; dev->base_addr = device_get_config_hex16("base"); dev->base_addrsz = 32; @@ -519,7 +524,7 @@ isartc_init(const device_t *info) dev->year = MM67_AL_DOM; /* year, NON STANDARD */ break; - case 1: /* DTK PII-147 Hexa I/O Plus */ + case ISARTC_DTK: /* DTK PII-147 Hexa I/O Plus */ dev->flags |= FLAG_YEARBCD; dev->base_addr = device_get_config_hex16("base"); dev->base_addrsz = 32; @@ -531,7 +536,8 @@ isartc_init(const device_t *info) dev->year = MM67_AL_HUNTEN; /* year, NON STANDARD */ break; - case 2: /* Paradise Systems 5PAK */ + case ISARTC_P5PAK: /* Paradise Systems 5PAK */ + case ISARTC_A6PAK: /* AST SixPakPlus */ dev->flags |= FLAG_YEAR80; dev->base_addr = 0x02c0; dev->base_addrsz = 32; @@ -627,7 +633,7 @@ static const device_config_t ev170_config[] = { static const device_t ev170_device = { "Everex EV-170 Magic I/O", DEVICE_ISA, - 0, + ISARTC_EV170, isartc_init, isartc_close, NULL, { NULL }, NULL, NULL, ev170_config @@ -657,7 +663,7 @@ static const device_config_t pii147_config[] = { static const device_t pii147_device = { "DTK PII-147 Hexa I/O Plus", DEVICE_ISA, - 1, + ISARTC_DTK, isartc_init, isartc_close, NULL, { NULL }, NULL, NULL, pii147_config @@ -693,13 +699,49 @@ static const device_config_t p5pak_config[] = { static const device_t p5pak_device = { "Paradise Systems 5-PAK", DEVICE_ISA, - 2, + ISARTC_P5PAK, isartc_init, isartc_close, NULL, { NULL }, NULL, NULL, p5pak_config }; +static const device_config_t a6pak_config[] = { + { + "irq", "IRQ", CONFIG_SELECTION, "", -1, "", { 0 }, + { + { + "Disabled", -1 + }, + { + "IRQ2", 2 + }, + { + "IRQ3", 3 + }, + { + "IRQ5", 5 + }, + { + "" + } + }, + }, + { + "", "", -1 + } +}; + +static const device_t a6pak_device = { + "AST SixPakPlus", + DEVICE_ISA, + ISARTC_A6PAK, + isartc_init, isartc_close, NULL, + { NULL }, NULL, NULL, + a6pak_config +}; + + static const struct { const char *internal_name; const device_t *dev; @@ -708,6 +750,7 @@ static const struct { { "ev170", &ev170_device }, { "pii147", &pii147_device }, { "p5pak", &p5pak_device }, + { "a6pak", &a6pak_device }, { "", NULL }, }; diff --git a/src/device/keyboard_xt.c b/src/device/keyboard_xt.c index 78c17ae19..9b7f98f64 100644 --- a/src/device/keyboard_xt.c +++ b/src/device/keyboard_xt.c @@ -55,6 +55,17 @@ #define STAT_IFULL 0x02 #define STAT_OFULL 0x01 +// Keyboard Types +#define KBD_TYPE_PC81 0 +#define KBD_TYPE_PC82 1 +#define KBD_TYPE_XT82 2 +#define KBD_TYPE_XT86 3 +#define KBD_TYPE_COMPAQ 4 +#define KBD_TYPE_TANDY 5 +#define KBD_TYPE_TOSHIBA 6 +#define KBD_TYPE_VTECH 7 +#define KBD_TYPE_OLIVETTI 8 +#define KBD_TYPE_ZENITH 9 typedef struct { int want_irq; @@ -357,8 +368,8 @@ kbd_log(const char *fmt, ...) #endif static uint8_t -get_fdd_switch_settings(){ - +get_fdd_switch_settings() { + int i, fdd_count = 0; for (i = 0; i < FDD_NUM; i++) { @@ -369,20 +380,18 @@ get_fdd_switch_settings(){ if (!fdd_count) return 0x00; else - return ((fdd_count - 1) << 6) | 0x01; - + return ((fdd_count - 1) << 6) | 0x01; } static uint8_t -get_videomode_switch_settings(){ - +get_videomode_switch_settings() { + if (video_is_mda()) return 0x30; else if (video_is_cga()) return 0x20; /* 0x10 would be 40x25 */ else - return 0x00; - + return 0x00; } static void @@ -392,7 +401,7 @@ kbd_poll(void *priv) timer_advance_u64(&kbd->send_delay_timer, 1000 * TIMER_USEC); - if (!(kbd->pb & 0x40) && (kbd->type != 5)) + if (!(kbd->pb & 0x40) && (kbd->type != KBD_TYPE_TANDY)) return; if (kbd->want_irq) { @@ -504,7 +513,7 @@ kbd_write(uint16_t port, uint8_t val, void *priv) xtkbd_t *kbd = (xtkbd_t *)priv; switch (port) { - case 0x61: + case 0x61: /* Keyboard Control Register (aka Port B) */ if (!(kbd->pb & 0x40) && (val & 0x40)) { key_queue_start = key_queue_end = 0; kbd->want_irq = 0; @@ -514,9 +523,9 @@ kbd_write(uint16_t port, uint8_t val, void *priv) kbd->pb = val; ppi.pb = val; - timer_process(); + timer_process(); - if ((kbd->type <= 1) && (cassette != NULL)) + if (((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) && (cassette != NULL)) pc_cas_set_motor(cassette, (kbd->pb & 0x08) == 0); speaker_update(); @@ -535,13 +544,13 @@ kbd_write(uint16_t port, uint8_t val, void *priv) } #ifdef ENABLE_KEYBOARD_XT_LOG - if (kbd->type <= 1) + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) kbd_log("Cassette motor is %s\n", !(val & 0x08) ? "ON" : "OFF"); #endif break; #ifdef ENABLE_KEYBOARD_XT_LOG - case 0x62: - if (kbd->type <= 1) + case 0x62: /* Switch Register (aka Port C) */ + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) kbd_log("Cassette IN is %i\n", !!(val & 0x10)); break; #endif @@ -554,16 +563,17 @@ kbd_read(uint16_t port, void *priv) { xtkbd_t *kbd = (xtkbd_t *)priv; uint8_t ret = 0xff; - switch (port) { - case 0x60: - if ((kbd->pb & 0x80) && ((kbd->type <= 3) || (kbd->type == 9))) { - if (kbd->type <= 1) + case 0x60: /* Keyboard Data Register (aka Port A) */ + if ((kbd->pb & 0x80) && ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) + || (kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86) + || (kbd->type == KBD_TYPE_ZENITH))) { + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) ret = (kbd->pd & ~0x02) | (hasfpu ? 0x02 : 0x00); - else if ((kbd->type == 2) || (kbd->type == 3)) + else if ((kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86)) ret = 0xff; /* According to Ruud on the PCem forum, this is supposed to return 0xFF on the XT. */ - else if (kbd->type == 9) { + else if (kbd->type == KBD_TYPE_ZENITH) { /* Zenith Data Systems Z-151 * SW1 switch settings: * bits 6-7: floppy drive number @@ -586,32 +596,41 @@ kbd_read(uint16_t port, void *priv) ret = kbd->pa; break; - case 0x61: + case 0x61: /* Keyboard Control Register (aka Port B) */ ret = kbd->pb; break; - case 0x62: - if (kbd->type == 0) - ret = 0x00; - else if (kbd->type == 1) { - if (kbd->pb & 0x04) - ret = ((mem_size - 64) / 32) & 0x0f; + case 0x62: /* Switch Register (aka Port C) */ + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) { + if (kbd->pb & 0x04) /* PB2 */ + switch (mem_size + isa_mem_size) { + case 64: + case 48: + case 32: + case 16: + ret = 0x00; + break; + default: + ret = (((mem_size + isa_mem_size) - 64) / 32) & 0x0f; + break; + } else - ret = ((mem_size - 64) / 32) >> 4; - } else if (kbd->type == 8 || kbd->type == 9) { + ret = (((mem_size + isa_mem_size) - 64) / 32) >> 4; + } else if (kbd->type == KBD_TYPE_OLIVETTI + || kbd->type == KBD_TYPE_ZENITH) { /* Olivetti M19 or Zenith Data Systems Z-151 */ - if (kbd->pb & 0x04) + if (kbd->pb & 0x04) /* PB2 */ ret = kbd->pd & 0xbf; - else + else ret = kbd->pd >> 4; } else { - if (kbd->pb & 0x08) + if (kbd->pb & 0x08) /* PB3 */ ret = kbd->pd >> 4; else { /* LaserXT = Always 512k RAM; LaserXT/3 = Bit 0: set = 512k, clear = 256k. */ #if defined(DEV_BRANCH) && defined(USE_LASERXT) - if (kbd->type == 6) + if (kbd->type == KBD_TYPE_TOSHIBA) ret = ((mem_size == 512) ? 0x0d : 0x0c) | (hasfpu ? 0x02 : 0x00); else #endif @@ -622,19 +641,21 @@ kbd_read(uint16_t port, void *priv) /* This is needed to avoid error 131 (cassette error). This is serial read: bit 5 = clock, bit 4 = data, cassette header is 256 x 0xff. */ - if (kbd->type <= 1) { + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82)) { if (cassette == NULL) ret |= (ppispeakon ? 0x10 : 0); else ret |= (pc_cas_get_inp(cassette) ? 0x10 : 0); } - if (kbd->type == 5) + if (kbd->type == KBD_TYPE_TANDY) ret |= (tandy1k_eeprom_read() ? 0x10 : 0); break; - case 0x63: - if ((kbd->type == 2) || (kbd->type == 3) || (kbd->type == 4) || (kbd->type == 6)) + case 0x63: /* Keyboard Configuration Register (aka Port D) */ + if ((kbd->type == KBD_TYPE_XT82) || (kbd->type == KBD_TYPE_XT86) + || (kbd->type == KBD_TYPE_COMPAQ) + || (kbd->type == KBD_TYPE_TOSHIBA)) ret = kbd->pd; break; } @@ -685,9 +706,14 @@ kbd_init(const device_t *info) video_reset(gfxcard); - if ((kbd->type <= 3) || (kbd->type == 4) || (kbd->type == 6) || (kbd->type == 8)) { + if ((kbd->type == KBD_TYPE_PC81) || (kbd->type == KBD_TYPE_PC82) + || (kbd->type == KBD_TYPE_XT82) || (kbd->type <= KBD_TYPE_XT86) + || (kbd->type == KBD_TYPE_COMPAQ) + || (kbd->type == KBD_TYPE_TOSHIBA) + || (kbd->type == KBD_TYPE_OLIVETTI)) { + /* DIP switch readout: bit set = OFF, clear = ON. */ - if (kbd->type == 8) + if (kbd->type == KBD_TYPE_OLIVETTI) /* Olivetti M19 * Jumpers J1, J2 - monitor type. * 01 - mono (high-res) @@ -699,10 +725,13 @@ kbd_init(const device_t *info) /* Switches 7, 8 - floppy drives. */ kbd->pd = get_fdd_switch_settings(); + /* Siitches 5, 6 - video card type */ kbd->pd |= get_videomode_switch_settings(); /* Switches 3, 4 - memory size. */ - if ((kbd->type == 3) || (kbd->type == 4) || (kbd->type == 6)) { + if ((kbd->type == KBD_TYPE_XT86) + || (kbd->type == KBD_TYPE_COMPAQ) + || (kbd->type == KBD_TYPE_TOSHIBA)) { switch (mem_size) { case 256: kbd->pd |= 0x00; @@ -718,34 +747,49 @@ kbd_init(const device_t *info) kbd->pd |= 0x0c; break; } - } else if (kbd->type >= 1) { + } else if (kbd->type == KBD_TYPE_XT82) { switch (mem_size) { - case 64: + case 64: /* 1x64k */ kbd->pd |= 0x00; break; - case 128: + case 128: /* 2x64k */ kbd->pd |= 0x04; break; - case 192: + case 192: /* 3x64k */ kbd->pd |= 0x08; break; - case 256: + case 256: /* 4x64k */ default: kbd->pd |= 0x0c; break; } - } else { + } else if (kbd->type == KBD_TYPE_PC82) { switch (mem_size) { - case 16: - kbd->pd |= 0x00; - break; - case 32: - kbd->pd |= 0x04; - break; - case 48: + case 192: /* 3x64k, not supported by stock BIOS due to bugs */ kbd->pd |= 0x08; break; - case 64: + case 64: /* 4x16k */ + case 96: /* 2x32k + 2x16k */ + case 128: /* 4x32k */ + case 160: /* 2x64k + 2x16k */ + case 224: /* 3x64k + 1x32k */ + case 256: /* 4x64k */ + default: + kbd->pd |= 0x0c; + break; + } + } else { /* really just the PC '81 */ + switch (mem_size) { + case 16: /* 1x16k */ + kbd->pd |= 0x00; + break; + case 32: /* 2x16k */ + kbd->pd |= 0x04; + break; + case 48: /* 3x16k */ + kbd->pd |= 0x08; + break; + case 64: /* 4x16k */ default: kbd->pd |= 0x0c; break; @@ -755,7 +799,7 @@ kbd_init(const device_t *info) /* Switch 2 - 8087 FPU. */ if (hasfpu) kbd->pd |= 0x02; - } else if (kbd-> type == 9) { + } else if (kbd-> type == KBD_TYPE_ZENITH) { /* Zenith Data Systems Z-151 * SW2 switch settings: * bit 7: monitor frequency @@ -799,8 +843,8 @@ kbd_init(const device_t *info) keyboard_set_table(scancode_xt); - is_tandy = (kbd->type == 5); - is_t1x00 = (kbd->type == 6); + is_tandy = (kbd->type == KBD_TYPE_TANDY); + is_t1x00 = (kbd->type == KBD_TYPE_TOSHIBA); is_amstrad = 0; @@ -831,7 +875,7 @@ kbd_close(void *priv) const device_t keyboard_pc_device = { "IBM PC Keyboard (1981)", 0, - 0, + KBD_TYPE_PC81, kbd_init, kbd_close, kbd_reset, @@ -841,7 +885,7 @@ const device_t keyboard_pc_device = { const device_t keyboard_pc82_device = { "IBM PC Keyboard (1982)", 0, - 1, + KBD_TYPE_PC82, kbd_init, kbd_close, kbd_reset, @@ -851,7 +895,7 @@ const device_t keyboard_pc82_device = { const device_t keyboard_xt_device = { "XT (1982) Keyboard", 0, - 2, + KBD_TYPE_XT82, kbd_init, kbd_close, kbd_reset, @@ -861,7 +905,7 @@ const device_t keyboard_xt_device = { const device_t keyboard_xt86_device = { "XT (1986) Keyboard", 0, - 3, + KBD_TYPE_XT86, kbd_init, kbd_close, kbd_reset, @@ -871,7 +915,7 @@ const device_t keyboard_xt86_device = { const device_t keyboard_xt_compaq_device = { "Compaq Portable Keyboard", 0, - 4, + KBD_TYPE_COMPAQ, kbd_init, kbd_close, kbd_reset, @@ -881,7 +925,7 @@ const device_t keyboard_xt_compaq_device = { const device_t keyboard_tandy_device = { "Tandy 1000 Keyboard", 0, - 5, + KBD_TYPE_TANDY, kbd_init, kbd_close, kbd_reset, @@ -891,7 +935,7 @@ const device_t keyboard_tandy_device = { const device_t keyboard_xt_t1x00_device = { "Toshiba T1x00 Keyboard", 0, - 6, + KBD_TYPE_TOSHIBA, kbd_init, kbd_close, kbd_reset, @@ -902,7 +946,7 @@ const device_t keyboard_xt_t1x00_device = { const device_t keyboard_xt_lxt3_device = { "VTech Laser XT3 Keyboard", 0, - 7, + KBD_TYPE_VTECH, kbd_init, kbd_close, kbd_reset, @@ -913,7 +957,7 @@ const device_t keyboard_xt_lxt3_device = { const device_t keyboard_xt_olivetti_device = { "Olivetti XT Keyboard", 0, - 8, + KBD_TYPE_OLIVETTI, kbd_init, kbd_close, kbd_reset, @@ -923,7 +967,7 @@ const device_t keyboard_xt_olivetti_device = { const device_t keyboard_xt_zenith_device = { "Zenith XT Keyboard", 0, - 9, + KBD_TYPE_ZENITH, kbd_init, kbd_close, kbd_reset, diff --git a/src/floppy/fdc.c b/src/floppy/fdc.c index 545eafd72..5f47a5c34 100644 --- a/src/floppy/fdc.c +++ b/src/floppy/fdc.c @@ -2311,7 +2311,7 @@ fdc_reset(void *priv) fdc->max_track = (fdc->flags & FDC_FLAG_MORE_TRACKS) ? 85 : 79; fdc_remove(fdc); - fdc_set_base(fdc, (fdc->flags & FDC_FLAG_PCJR) ? 0x00f0 : 0x03f0); + fdc_set_base(fdc, (fdc->flags & FDC_FLAG_PCJR) ? FDC_PRIMARY_PCJR_ADDR : FDC_PRIMARY_ADDR); current_drive = 0; @@ -2342,12 +2342,12 @@ fdc_init(const device_t *info) fdc->flags = info->local; - fdc->irq = 6; + fdc->irq = FDC_PRIMARY_IRQ; if (fdc->flags & FDC_FLAG_PCJR) timer_add(&fdc->watchdog_timer, fdc_watchdog_poll, fdc, 0); else - fdc->dma_ch = 2; + fdc->dma_ch = FDC_PRIMARY_DMA; fdc_log("FDC added: %04X (flags: %08X)\n", fdc->base_address, fdc->flags); diff --git a/src/floppy/fdc_magitronic.c b/src/floppy/fdc_magitronic.c index 2242cf760..807e021e7 100644 --- a/src/floppy/fdc_magitronic.c +++ b/src/floppy/fdc_magitronic.c @@ -101,7 +101,7 @@ b215_init(const device_t *info) rom_init(&dev->rom, ROM_B215, ROM_ADDR, 0x2000, 0x1fff, 0, MEM_MAPPING_EXTERNAL); dev->fdc_controller = device_add(&fdc_um8398_device); - io_sethandler(0x03f0, 1, b215_read, NULL, NULL, NULL, NULL, NULL, dev); + io_sethandler(FDC_PRIMARY_ADDR, 1, b215_read, NULL, NULL, NULL, NULL, NULL, dev); return dev; } diff --git a/src/include/86box/86box.h b/src/include/86box/86box.h index e5f0bac94..af4a6a962 100644 --- a/src/include/86box/86box.h +++ b/src/include/86box/86box.h @@ -122,7 +122,8 @@ extern int sound_is_float, /* (C) sound uses FP values */ GUS, GUSMAX, /* (C) sound option */ SSI2001, /* (C) sound option */ voodoo_enabled; /* (C) video option */ -extern uint32_t mem_size; /* (C) memory size */ +extern uint32_t mem_size; /* (C) memory size (Installed on system board) */ +extern uint32_t isa_mem_size; /* (C) memory size (ISA Memory Cards) */ extern int cpu, /* (C) cpu type */ cpu_use_dynarec, /* (C) cpu uses/needs Dyna */ fpu_type; /* (C) fpu type */ diff --git a/src/include/86box/fdc.h b/src/include/86box/fdc.h index 87404e174..f50e82b58 100644 --- a/src/include/86box/fdc.h +++ b/src/include/86box/fdc.h @@ -24,6 +24,22 @@ extern int fdc_type; +#define FDC_PRIMARY_ADDR 0x03f0 +#define FDC_PRIMARY_IRQ 6 +#define FDC_PRIMARY_DMA 2 +#define FDC_PRIMARY_PCJR_ADDR 0x00f0 +#define FDC_PRIMARY_PCJR_IRQ 6 +#define FDC_PRIMARY_PCJR_DMA 2 +#define FDC_SECONDARY_ADDR 0x0370 +#define FDC_SECONDARY_IRQ 6 +#define FDC_SECONDARY_DMA 2 +#define FDC_TERTIARY_ADDR 0x0360 +#define FDC_TERTIARY_IRQ 6 +#define FDC_TERTIARY_DMA 2 +#define FDC_QUATERNARY_ADDR 0x03e0 +#define FDC_QUATERNARY_IRQ 6 +#define FDC_QUATERNARY_DMA 2 + #define FDC_FLAG_PCJR 0x01 /* PCjr */ #define FDC_FLAG_DISKCHG_ACTLOW 0x02 /* Amstrad, PS/1, PS/2 ISA */ #define FDC_FLAG_AT 0x04 /* AT+, PS/x */ diff --git a/src/include/86box/snd_mpu401.h b/src/include/86box/snd_mpu401.h index 93df18a80..433bf09a1 100644 --- a/src/include/86box/snd_mpu401.h +++ b/src/include/86box/snd_mpu401.h @@ -19,6 +19,8 @@ * Copyright 2016-2020 Miran Grca. * Copyright 2016-2020 TheCollector1995. */ +#ifndef SOUND_MPU401_H +# define SOUND_MPU401_H #define MPU401_VERSION 0x15 #define MPU401_REVISION 0x01 @@ -160,3 +162,6 @@ extern void mpu401_irq_attach(mpu_t *mpu, void (*ext_irq_update)(void *priv, int extern int MPU401_InputSysex(void *p, uint8_t *buffer, uint32_t len, int abort); extern void MPU401_InputMsg(void *p, uint8_t *msg, uint32_t len); + + +#endif /*SOUND_MPU401_H*/ diff --git a/src/machine/machine.c b/src/machine/machine.c index 59c4bee04..5813c1d1a 100644 --- a/src/machine/machine.c +++ b/src/machine/machine.c @@ -40,6 +40,7 @@ #include "cpu.h" #include <86box/video.h> #include <86box/machine.h> +#include <86box/isamem.h> int bios_only = 0; @@ -101,6 +102,9 @@ machine_init_ex(int m) /* Prepare some video-related things if we're using internal or no video. */ video_pre_reset(gfxcard); + + /* Reset any ISA memory cards. */ + isamem_reset(); } /* All good, boot the machine! */ diff --git a/src/machine/machine_table.c b/src/machine/machine_table.c index 17a3dc335..3a95bebda 100644 --- a/src/machine/machine_table.c +++ b/src/machine/machine_table.c @@ -105,7 +105,7 @@ const machine_type_t machine_types[] = { const machine_t machines[] = { /* 8088 Machines */ { "[8088] IBM PC (1981)", "ibmpc", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 16, 64, 16, 0, machine_pc_init, NULL }, - { "[8088] IBM PC (1982)", "ibmpc82", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 256, 256, 256, 0, machine_pc82_init, NULL }, + { "[8088] IBM PC (1982)", "ibmpc82", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 64, 256, 64, 0, machine_pc82_init, NULL }, { "[8088] IBM PCjr", "ibmpcjr", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 4772728, 4772728, 0, 0, 0, 0, MACHINE_PC | MACHINE_VIDEO_FIXED | MACHINE_CARTRIDGE, 128, 640, 128, 0, machine_pcjr_init, pcjr_get_device }, { "[8088] IBM XT (1982)", "ibmxt", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 64, 256, 64, 0, machine_xt_init, NULL }, { "[8088] IBM XT (1986)", "ibmxt86", MACHINE_TYPE_8088, CPU_PKG_8088, 0, 0, 0, 0, 0, 0, 0, MACHINE_PC, 256, 640, 64, 0, machine_xt86_init, NULL }, diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index 13744c3cd..ed97f2ab2 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -1259,6 +1259,9 @@ static const device_config_t aha_154xb_config[] = { { "D800H", 0xd8000 }, + { + "DC00H", 0xdc000 + }, { "" } @@ -1357,6 +1360,9 @@ static const device_config_t aha_154x_config[] = { { "D800H", 0xd8000 }, + { + "DC00H", 0xdc000 + }, { "" } @@ -1450,12 +1456,21 @@ static const device_config_t aha_154xcf_config[] = { { "C800H", 0xc8000 }, + { + "CC00H", 0xcc000 + }, { "D000H", 0xd0000 }, + { + "D400H", 0xd4000 + }, { "D800H", 0xd8000 }, + { + "DC00H", 0xdc000 + }, { "" } diff --git a/src/sound/snd_adlibgold.c b/src/sound/snd_adlibgold.c index 845ee2bfc..da8c66c93 100644 --- a/src/sound/snd_adlibgold.c +++ b/src/sound/snd_adlibgold.c @@ -9,9 +9,11 @@ #include <86box/dma.h> #include <86box/pic.h> #include <86box/device.h> +#include <86box/gameport.h> #include <86box/nvr.h> #include <86box/sound.h> #include <86box/filters.h> +#include <86box/midi.h> #include <86box/snd_opl.h> #include <86box/snd_ym7128.h> @@ -38,6 +40,10 @@ typedef struct adgold_t int adgold_mma_intpos[2]; pc_timer_t adgold_mma_timer_count; + + uint8_t adgold_midi_ctrl, midi_queue[16]; + int midi_r, midi_w; + int uart_in, uart_out, sysex; struct { @@ -54,6 +60,7 @@ typedef struct adgold_t int fm_vol_l, fm_vol_r; int samp_vol_l, samp_vol_r; + int aux_vol_l, aux_vol_r; int vol_l, vol_r; int treble, bass; @@ -61,7 +68,9 @@ typedef struct adgold_t int16_t mma_buffer[2][SOUNDBUFLEN]; int pos; - + + int gameport_enabled; + int surround_enabled; } adgold_t; @@ -134,12 +143,17 @@ void adgold_update_irq_status(adgold_t *adgold) uint8_t temp = 0xf; if (!(adgold->adgold_mma_regs[0][8] & 0x10) && (adgold->adgold_mma_status & 0x10)) /*Timer 0*/ - temp &= ~2; + temp &= ~2; if (!(adgold->adgold_mma_regs[0][8] & 0x20) && (adgold->adgold_mma_status & 0x20)) /*Timer 1*/ - temp &= ~2; + temp &= ~2; if (!(adgold->adgold_mma_regs[0][8] & 0x40) && (adgold->adgold_mma_status & 0x40)) /*Timer 2*/ - temp &= ~2; - + temp &= ~2; + if (!(adgold->adgold_mma_regs[0][0xd] & 0x01) && (adgold->adgold_mma_status & 0x04)) + temp &= ~2; + if (!(adgold->adgold_mma_regs[0][0xd] & 0x04) && (adgold->adgold_mma_status & 0x08)) + temp &= ~2; + if (!(adgold->adgold_mma_regs[0][0xd] & 0x10) && (adgold->adgold_mma_status & 0x80)) + temp &= ~2; if ((adgold->adgold_mma_status & 0x01) && !(adgold->adgold_mma_regs[0][0xc] & 2)) temp &= ~2; if ((adgold->adgold_mma_status & 0x02) && !(adgold->adgold_mma_regs[1][0xc] & 2)) @@ -249,11 +263,19 @@ void adgold_write(uint16_t addr, uint8_t val, void *p) adgold->adgold_38x_regs[0x0c] = val; adgold->samp_vol_r = (int)(int8_t)(val - 128); break; + case 0x0d: /*Aux volume left*/ + adgold->adgold_38x_regs[0x0d] = val; + adgold->aux_vol_l = (int)(int8_t)(val - 128); + break; + case 0x0e: /*Aux volume right*/ + adgold->adgold_38x_regs[0x0e] = val; + adgold->aux_vol_r = (int)(int8_t)(val - 128); + break; case 0x18: /*Surround*/ adgold->adgold_38x_regs[0x18] = val; ym7128_write(&adgold->ym7128, val); - break; + break; default: adgold->adgold_38x_regs[adgold->adgold_38x_addr] = val; @@ -380,6 +402,45 @@ void adgold_write(uint16_t addr, uint8_t val, void *p) case 0xc: adgold->adgold_mma_intpos[0] = (7 - ((val >> 2) & 7)) * 8; break; + + case 0xd: + adgold->adgold_midi_ctrl = val & 0x3f; + + if ((adgold->adgold_midi_ctrl & 0x0f) != 0x0f) { + if ((adgold->adgold_midi_ctrl & 0x0f) == 0x00) { + adgold->uart_out = 0; + adgold->uart_in = 0; + adgold->midi_w = 0; + adgold->midi_r = 0; + adgold->adgold_mma_status &= ~0x8c; + } else { + if (adgold->adgold_midi_ctrl & 0x01) + adgold->uart_in = 1; + if (adgold->adgold_midi_ctrl & 0x04) + adgold->uart_out = 1; + if (adgold->adgold_midi_ctrl & 0x02) { + adgold->uart_in = 0; + adgold->midi_w = 0; + adgold->midi_r = 0; + } + if (adgold->adgold_midi_ctrl & 0x08) + adgold->uart_out = 0; + adgold->adgold_mma_status &= ~0x80; + } + } else + adgold->adgold_mma_status &= ~0x8c; + + adgold_update_irq_status(adgold); + break; + + case 0xe: + if (adgold->uart_out) { + midi_raw_out_byte(val); + + adgold->adgold_mma_status &= ~0x08; + adgold_update_irq_status(adgold); + } + break; } adgold->adgold_mma_regs[0][adgold->adgold_mma_addr] = val; break; @@ -467,9 +528,9 @@ uint8_t adgold_read(uint16_t addr, void *p) { case 0x00: /*Control/ID*/ if (adgold->surround_enabled) - temp = 0x50; /*16-bit ISA, surround module, no telephone/CDROM*/ + temp = 0x51; /*8-bit ISA, surround module, no telephone/CD-ROM*/ else - temp = 0x70; /*16-bit ISA, no telephone/surround/CD-ROM*/ + temp = 0x71; /*8-bit ISA, no telephone/surround/CD-ROM*/ break; default: @@ -482,7 +543,7 @@ uint8_t adgold_read(uint16_t addr, void *p) case 4: case 6: temp = adgold->adgold_mma_status; - adgold->adgold_mma_status = 0; /*JUKEGOLD expects timer status flags to auto-clear*/ + adgold->adgold_mma_status &= ~0xf3; /*JUKEGOLD expects timer status flags to auto-clear*/ adgold_update_irq_status(adgold); break; case 5: @@ -491,12 +552,26 @@ uint8_t adgold_read(uint16_t addr, void *p) { case 6: /*Timer 2 low*/ adgold->adgold_mma.timer2_read = adgold->adgold_mma.timer2_count; + adgold->adgold_mma_status |= 0x40; temp = adgold->adgold_mma.timer2_read & 0xff; break; case 7: /*Timer 2 high*/ temp = adgold->adgold_mma.timer2_read >> 8; break; + case 0xe: + temp = 0; + if (adgold->uart_in) { + temp = adgold->midi_queue[adgold->midi_r]; + if (adgold->midi_r != adgold->midi_w) { + adgold->midi_r++; + adgold->midi_r &= 0x0f; + } + adgold->adgold_mma_status &= ~0x04; + adgold_update_irq_status(adgold); + } + break; + default: temp = adgold->adgold_mma_regs[0][adgold->adgold_mma_addr]; break; @@ -579,6 +654,17 @@ void adgold_timer_poll(void *p) adgold_t *adgold = (adgold_t *)p; timer_advance_u64(&adgold->adgold_mma_timer_count, (uint64_t)((double)TIMER_USEC * 1.88964)); + + if (adgold->adgold_midi_ctrl & 0x3f) { + if ((adgold->adgold_midi_ctrl & 0x3f) != 0x3f) { + if (adgold->uart_out) + adgold->adgold_mma_status |= 0x08; + if (adgold->adgold_midi_ctrl & 0x10) + adgold->adgold_mma_status |= 0x80; + } + adgold_update_irq_status(adgold); + } + if (adgold->adgold_mma_regs[0][8] & 0x01) /*Timer 0*/ { adgold->adgold_mma.timer0_count--; @@ -752,6 +838,59 @@ static void adgold_get_buffer(int32_t *buffer, int len, void *p) free(adgold_buffer); } +static void +adgold_filter_cd_audio(int channel, double *buffer, void *p) +{ + adgold_t *adgold = (adgold_t *)p; + double c; + int aux = channel ? adgold->aux_vol_r : adgold->aux_vol_l; + int vol = channel ? adgold->vol_r : adgold->vol_l; + + c = ((((*buffer) * aux) / 4096.0) * vol) / 4096.0; + *buffer = c; +} + + +static void adgold_input_msg(void *p, uint8_t *msg, uint32_t len) +{ + adgold_t *adgold = (adgold_t *)p; + uint8_t i; + + if (adgold->sysex) + return; + + if (adgold->uart_in) { + adgold->adgold_mma_status |= 0x04; + + for (i=0; i < len; i++) { + adgold->midi_queue[adgold->midi_w++] = msg[i]; + adgold->midi_w &= 0x0f; + } + + adgold_update_irq_status(adgold); + } +} + +static int adgold_input_sysex(void *p, uint8_t *buffer, uint32_t len, int abort) +{ + adgold_t *adgold = (adgold_t *)p; + uint32_t i; + + if (abort) { + adgold->sysex = 0; + return 0; + } + adgold->sysex = 1; + for (i=0;imidi_r == adgold->midi_w) + return (len-i); + adgold->midi_queue[adgold->midi_w++] = buffer[i]; + adgold->midi_w &= 0x0f; + } + adgold->sysex = 0; + return 0; +} + void *adgold_init(const device_t *info) { @@ -762,6 +901,8 @@ void *adgold_init(const device_t *info) memset(adgold, 0, sizeof(adgold_t)); adgold->surround_enabled = device_get_config_int("surround"); + + adgold->gameport_enabled = device_get_config_int("gameport"); opl3_init(&adgold->opl); if (adgold->surround_enabled) @@ -798,6 +939,8 @@ void *adgold_init(const device_t *info) adgold->fm_vol_r = (int)(int8_t)(adgold->adgold_eeprom[0x0a] - 128); adgold->samp_vol_l = (int)(int8_t)(adgold->adgold_eeprom[0x0b] - 128); adgold->samp_vol_r = (int)(int8_t)(adgold->adgold_eeprom[0x0c] - 128); + adgold->aux_vol_l = (int)(int8_t)(adgold->adgold_eeprom[0x0d] - 128); + adgold->aux_vol_r = (int)(int8_t)(adgold->adgold_eeprom[0x0e] - 128); adgold->adgold_mma_enable[0] = 0; adgold->adgold_mma_fifo_start[0] = adgold->adgold_mma_fifo_end[0] = 0; @@ -805,10 +948,17 @@ void *adgold_init(const device_t *info) /*388/389 are handled by adlib_init*/ io_sethandler(0x0388, 0x0008, adgold_read, NULL, NULL, adgold_write, NULL, NULL, adgold); + if (adgold->gameport_enabled) + gameport_remap(gameport_add(&gameport_201_device), 0x201); + timer_add(&adgold->adgold_mma_timer_count, adgold_timer_poll, adgold, 1); sound_add_handler(adgold_get_buffer, adgold); + sound_set_cd_audio_filter(adgold_filter_cd_audio, adgold); + if (device_get_config_int("receive_input")) + midi_in_handler(1, adgold_input_msg, adgold_input_sysex, adgold); + return adgold; } @@ -829,9 +979,15 @@ void adgold_close(void *p) static const device_config_t adgold_config[] = { + { + "gameport", "Enable Game port", CONFIG_BINARY, "", 1 + }, { "surround", "Surround module", CONFIG_BINARY, "", 1 }, + { + "receive_input", "Receive input (MIDI)", CONFIG_BINARY, "", 1 + }, { "", "", -1 } diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index 7f10701f5..91d04a311 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -67,9 +67,10 @@ typedef struct { uint32_t sr_cir; uint16_t sr_ram[128]; - uint8_t uart_ctrl, uart_status, - uart_res; - uint32_t uart_fifo; + uint8_t uart_data, uart_ctrl, + uart_status, uart_res; + uint32_t uart_fifo[8]; + uint8_t read_fifo_pos, write_fifo_pos; ac97_codec_t * codec; uint32_t codec_ctrl; @@ -165,6 +166,8 @@ typedef struct { #define UART_STATUS_TXRDY (1<<1) #define UART_STATUS_RXRDY (1<<0) +#define UART_FIFO_BYTE_VALID 0x00000100 + #define FORMAT_MONO_8 0 #define FORMAT_STEREO_8 1 #define FORMAT_MONO_16 2 @@ -174,7 +177,6 @@ typedef struct { static void es1371_fetch(es1371_t *dev, int dac_nr); static void update_legacy(es1371_t *dev, uint32_t old_legacy_ctrl); - #ifdef ENABLE_AUDIOPCI_LOG int audiopci_do_log = ENABLE_AUDIOPCI_LOG; @@ -205,10 +207,12 @@ es1371_update_irqs(es1371_t *dev) if ((dev->int_status & INT_STATUS_DAC2) && (dev->si_cr & SI_P2_INTR_EN)) irq = 1; - /* MIDI input is unsupported for now */ - if ((dev->int_status & INT_STATUS_UART) && (dev->uart_status & UART_STATUS_TXINT) && - ((dev->uart_ctrl & UART_CTRL_TXINTEN) != 0x20)) + dev->int_status &= ~INT_STATUS_UART; + + if ((dev->uart_status & UART_STATUS_TXINT) || (dev->uart_status & UART_STATUS_RXINT)) { + dev->int_status |= INT_STATUS_UART; irq = 1; + } if (irq) dev->int_status |= INT_STATUS_INTR; @@ -225,10 +229,96 @@ es1371_update_irqs(es1371_t *dev) } +static void +es1371_update_tx_irq(es1371_t *dev) +{ + dev->uart_status &= ~UART_STATUS_TXINT; + + if (((dev->uart_ctrl & UART_CTRL_TXINTEN) == 0x20) && (dev->uart_status & UART_STATUS_TXRDY)) + dev->uart_status |= UART_STATUS_TXINT; + + es1371_update_irqs(dev); +} + + +static void +es1371_set_tx_irq(es1371_t *dev, int set) +{ + dev->uart_status &= ~UART_STATUS_TXRDY; + + if (set) + dev->uart_status |= UART_STATUS_TXRDY; + + es1371_update_tx_irq(dev); +} + + +static void +es1371_update_rx_irq(es1371_t *dev) +{ + dev->uart_status &= ~UART_STATUS_RXINT; + + if ((dev->uart_ctrl & UART_CTRL_RXINTEN) && (dev->uart_status & UART_STATUS_RXRDY)) + dev->uart_status |= UART_STATUS_RXINT; + + es1371_update_irqs(dev); +} + + +static void +es1371_set_rx_irq(es1371_t *dev, int set) +{ + dev->uart_status &= ~UART_STATUS_RXRDY; + + if (set) + dev->uart_status |= UART_STATUS_RXRDY; + + es1371_update_rx_irq(dev); +} + + +static void +es1371_scan_fifo(es1371_t *dev) +{ + if (dev->read_fifo_pos != dev->write_fifo_pos) { + dev->uart_data = dev->uart_fifo[dev->read_fifo_pos]; + dev->read_fifo_pos = (dev->read_fifo_pos + 1) & 7; + + es1371_set_rx_irq(dev, 1); + } else + es1371_set_rx_irq(dev, 0); +} + + +static void +es1371_write_fifo(es1371_t *dev, uint8_t val) +{ + if (dev->write_fifo_pos < 8) { + dev->uart_fifo[dev->write_fifo_pos] = val | UART_FIFO_BYTE_VALID; + dev->write_fifo_pos = (dev->write_fifo_pos + 1) & 7; + } +} + + +static void +es1371_reset_fifo(es1371_t *dev) +{ + int i; + + for (i = 0; i < 8; i++) + dev->uart_fifo[i] = 0x00000000; + + dev->read_fifo_pos = dev->write_fifo_pos = 0; + + es1371_set_rx_irq(dev, 0); +} + + static void es1371_reset(void *p) { es1371_t *dev = (es1371_t *) p; + int i; nmi = 0; @@ -316,7 +406,14 @@ es1371_reset(void *p) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ - dev->uart_fifo = 0xfffffe00; + for (i = 0; i < 8; i++) + dev->uart_fifo[i] = 0xffff0000; + + /* Reset the UART TX. */ + es1371_set_tx_irq(dev, 0); + + /* Reset the UART (RX) FIFO. */ + es1371_reset_fifo(dev); /* Update interrupts to ensure they're all correctly cleared. */ es1371_update_irqs(dev); @@ -344,7 +441,10 @@ es1371_read_frame_reg(es1371_t *dev, int frame, int page) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - ret = dev->uart_fifo; + audiopci_log("[30:%02X] ret = dev->uart_fifo[%02X] = %08X\n", page, + ((page & 0x01) << 2) + ((frame >> 2) & 0x03), + dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)]); + ret = dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)]; break; } break; @@ -363,7 +463,10 @@ es1371_read_frame_reg(es1371_t *dev, int frame, int page) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - ret = dev->uart_fifo; + audiopci_log("[34:%02X] ret = dev->uart_fifo[%02X] = %08X\n", page, + ((page & 0x01) << 2) + ((frame >> 2) & 0x03), + dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)]); + ret = dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)]; break; } break; @@ -377,7 +480,10 @@ es1371_read_frame_reg(es1371_t *dev, int frame, int page) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - ret = dev->uart_fifo; + audiopci_log("[38:%02X] ret = dev->uart_fifo[%02X] = %08X\n", page, + ((page & 0x01) << 2) + ((frame >> 2) & 0x03), + dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)]); + ret = dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)]; break; } break; @@ -391,12 +497,19 @@ es1371_read_frame_reg(es1371_t *dev, int frame, int page) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - ret = dev->uart_fifo; + audiopci_log("[3C:%02X] ret = dev->uart_fifo[%02X] = %08X\n", page, + ((page & 0x01) << 2) + ((frame >> 2) & 0x03), + dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)]); + ret = dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)]; break; } break; } + if (page == 0x0e || page == 0x0f) { + audiopci_log("Read frame = %02x, page = %02x, uart fifo valid = %02x, temp = %03x\n", frame, page, dev->valid, ret); + } + return ret; } @@ -420,7 +533,9 @@ es1371_write_frame_reg(es1371_t *dev, int frame, int page, uint32_t val) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - dev->uart_fifo = (dev->uart_fifo & 0xfffffe00) | (val & 0x000001ff); + audiopci_log("[30:%02X] dev->uart_fifo[%02X] = %08X\n", page, + ((page & 0x01) << 2) + ((frame >> 2) & 0x03), val); + dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)] = val; break; } break; @@ -441,7 +556,9 @@ es1371_write_frame_reg(es1371_t *dev, int frame, int page, uint32_t val) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - dev->uart_fifo = (dev->uart_fifo & 0xfffffe00) | (val & 0x000001ff); + audiopci_log("[34:%02X] dev->uart_fifo[%02X] = %08X\n", page, + ((page & 0x01) << 2) + ((frame >> 2) & 0x03), val); + dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)] = val; break; } break; @@ -455,7 +572,9 @@ es1371_write_frame_reg(es1371_t *dev, int frame, int page, uint32_t val) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - dev->uart_fifo = (dev->uart_fifo & 0xfffffe00) | (val & 0x000001ff); + audiopci_log("[38:%02X] dev->uart_fifo[%02X] = %08X\n", page, + ((page & 0x01) << 2) + ((frame >> 2) & 0x03), val); + dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)] = val; break; } break; @@ -470,11 +589,17 @@ es1371_write_frame_reg(es1371_t *dev, int frame, int page, uint32_t val) /* UART FIFO Register, Address 30H, 34H, 38H, 3CH, Memory Page 1110b, 1111b Addressable as longword only */ case 0xe: case 0xf: - dev->uart_fifo = (dev->uart_fifo & 0xfffffe00) | (val & 0x000001ff); + audiopci_log("[3C:%02X] dev->uart_fifo[%02X] = %08X\n", page, + ((page & 0x01) << 2) + ((frame >> 2) & 0x03), val); + dev->uart_fifo[((page & 0x01) << 2) + ((frame >> 2) & 0x03)] = val; break; } break; } + + if (page == 0x0e || page == 0x0f) { + audiopci_log("Write frame = %02x, page = %02x, uart fifo = %08x, val = %02x\n", frame, page, dev->uart_fifo, val); + } } @@ -505,21 +630,27 @@ es1371_inb(uint16_t port, void *p) must be for a reason */ case 0x04: ret = dev->int_status & 0xff; + audiopci_log("[R] STATUS 0- 7 = %02X\n", ret); break; case 0x05: ret = (dev->int_status >> 8) & 0xff; + audiopci_log("[R] STATUS 8-15 = %02X\n", ret); break; case 0x06: ret = (dev->int_status >> 16) & 0x0f; + audiopci_log("[R] STATUS 16-23 = %02X\n", ret); break; case 0x07: ret = ((dev->int_status >> 24) & 0x03) | 0xfc; + audiopci_log("[R] STATUS 24-31 = %02X\n", ret); break; /* UART Data Register, Address 08H Addressable as byte only */ case 0x08: - ret = 0x00; + ret = dev->uart_data; + es1371_set_rx_irq(dev, 0); + audiopci_log("[R] UART DATA = %02X\n", ret); break; /* UART Status Register, Address 09H @@ -533,6 +664,7 @@ es1371_inb(uint16_t port, void *p) Addressable as byte only */ case 0x0a: ret = dev->uart_res & 0x01; + audiopci_log("[R] UART RES = %02X\n", ret); break; /* Memory Page Register, Address 0CH @@ -661,6 +793,8 @@ es1371_inw(uint16_t port, void *p) break; } + audiopci_log("es1371_inw: port=%04x ret=%04x\n", port, ret); + return ret; } @@ -682,6 +816,7 @@ es1371_inl(uint16_t port, void *p) Addressable as longword only */ case 0x04: ret = dev->int_status; + audiopci_log("[R] STATUS = %08X\n", ret); break; /* Memory Page Register, Address 0CH @@ -783,22 +918,36 @@ es1371_outb(uint16_t port, uint8_t val, void *p) /* UART Data Register, Address 08H Addressable as byte only */ case 0x08: + audiopci_log("MIDI data = %02x\n", val); + /* TX does not use FIFO. */ midi_raw_out_byte(val); + es1371_set_tx_irq(dev, 1); break; /* UART Control Register, Address 09H Addressable as byte only */ case 0x09: + audiopci_log("[W] UART CTRL = %02X\n", val); dev->uart_ctrl = val & 0xe3; - if ((dev->uart_ctrl & UART_CTRL_TXINTEN) != 0x20) - dev->int_status &= ~INT_STATUS_UART; - es1371_update_irqs(dev); - audiopci_log("ES1371 UART Cntrl = %02x\n", dev->uart_ctrl); + + if ((val & 0x03) == 0x03) { + /* Reset TX */ + es1371_set_tx_irq(dev, 1); + + /* Software reset */ + es1371_reset_fifo(dev); + } else { + es1371_set_tx_irq(dev, 1); + + es1371_update_tx_irq(dev); + es1371_update_rx_irq(dev); + } break; /* UART Reserved Register, Address 0AH Addressable as byte only */ case 0x0a: + audiopci_log("[W] UART RES = %02X\n", val); dev->uart_res = val & 0x01; break; @@ -965,6 +1114,7 @@ es1371_outl(uint16_t port, uint32_t val, void *p) /* Interrupt/Chip Select Status Register, Address 04H Addressable as longword only */ case 0x04: + audiopci_log("[W] STATUS = %08X\n", val); break; /* Memory Page Register, Address 0CH @@ -1704,29 +1854,10 @@ es1371_poll(void *p) timer_advance_u64(&dev->dac[1].timer, dev->dac[1].latch); + es1371_scan_fifo(dev); + es1371_update(dev); - if (dev->int_ctrl & INT_UART_EN) { - //audiopci_log("UART INT Enabled\n"); - if (dev->uart_ctrl & UART_CTRL_RXINTEN) { - /* We currently don't implement MIDI Input. - But if anything sets MIDI Input and Output together we'd have to take account - of the MIDI Output case, and disable IRQ's and RX bits when MIDI Input is - enabled as well but not in the MIDI Output portion */ - dev->int_status &= ~INT_STATUS_UART; - dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); - } else if (!(dev->uart_ctrl & UART_CTRL_RXINTEN) && ((dev->uart_ctrl & UART_CTRL_TXINTEN))) { - /* Or enable the UART IRQ and the respective TX bits only when the MIDI Output is - enabled */ - dev->int_status |= INT_STATUS_UART; - } else { - dev->uart_status |= (UART_STATUS_TXINT | UART_STATUS_TXRDY); - } - - //audiopci_log("UART control = %02x\n", dev->uart_ctrl & (UART_CTRL_RXINTEN | UART_CTRL_TXINTEN)); - es1371_update_irqs(dev); - } - if (dev->int_ctrl & INT_DAC1_EN) { frac = dev->dac[0].ac & 0x7fff; idx = dev->dac[0].ac >> 15; @@ -1846,12 +1977,51 @@ generate_es1371_filter(void) } +static void +es1371_input_msg(void *p, uint8_t *msg, uint32_t len) +{ + es1371_t *dev = (es1371_t *)p; + uint8_t i; + + for (i = 0; i < len; i++) + es1371_write_fifo(dev, msg[i]); +} + + +static int +es1371_input_sysex(void *p, uint8_t *buffer, uint32_t len, int abort) +{ + es1371_t *dev = (es1371_t *)p; + uint32_t i = -1; + + audiopci_log("Abort = %i\n", abort); + + if (dev->uart_status & UART_STATUS_RXRDY) + abort = 1; + + if (!abort) { + for (i = 0; i < len; i++) { + es1371_write_fifo(dev, buffer[i]); + if (dev->uart_status & UART_STATUS_RXRDY) + break; + } + } + + /* The last sent position is in i. Return 7 - i. */ + + return 7 - i; +} + + static void * es1371_init(const device_t *info) { es1371_t *dev = malloc(sizeof(es1371_t)); memset(dev, 0x00, sizeof(es1371_t)); + if (device_get_config_int("receive_input")) + midi_in_handler(1, es1371_input_msg, es1371_input_sysex, dev); + sound_add_handler(es1371_get_buffer, dev); sound_set_cd_audio_filter(es1371_filter_cd_audio, dev); @@ -1920,7 +2090,11 @@ static const device_config_t es1371_config[] = } }, .default_int = AC97_CODEC_CS4297A - }, { + }, + { + "receive_input", "Receive input (MIDI)", CONFIG_BINARY, "", 1 + }, + { "", "", -1 } }; diff --git a/src/sound/snd_pas16.c b/src/sound/snd_pas16.c index 3a085241c..483b7548c 100644 --- a/src/sound/snd_pas16.c +++ b/src/sound/snd_pas16.c @@ -17,6 +17,7 @@ #include <86box/filters.h> #include <86box/snd_mpu401.h> #include <86box/snd_opl.h> +#include <86box/snd_sb.h> #include <86box/snd_sb_dsp.h> @@ -413,7 +414,7 @@ static void pas16_pit_out(uint16_t port, uint8_t val, void *p) { if (!(val & 0x20)) { - if (val & 2) pas16->pit.rl[0] = timer_get_remaining_u64(&pit.timer[0]) / PITCONST;; + if (val & 2) pas16->pit.rl[0] = timer_get_remaining_u64(&pas16->pit.timer[0]) / PITCONST;; if (val & 4) pas16->pit.rl[1] = pas16->pit.c[1]; if (val & 8) pas16->pit.rl[2] = pas16->pit.c[2]; } @@ -429,7 +430,7 @@ static void pas16_pit_out(uint16_t port, uint8_t val, void *p) if (!(pas16->pit.ctrl & 0x30)) { if (!t) - pas16->pit.rl[t] = timer_get_remaining_u64(&pit.timer[t]) / PITCONST; + pas16->pit.rl[t] = timer_get_remaining_u64(&pas16->pit.timer[t]) / PITCONST; else { pas16->pit.rl[t] = pas16->pit.c[t]; @@ -450,7 +451,7 @@ static void pas16_pit_out(uint16_t port, uint8_t val, void *p) { pas16->pit.rm[t] = 3; if (!t) - pas16->pit.rl[t] = timer_get_remaining_u64(&pit.timer[t]) / PITCONST; + pas16->pit.rl[t] = timer_get_remaining_u64(&pas16->pit.timer[t]) / PITCONST; else pas16->pit.rl[t] = pas16->pit.c[t]; } @@ -519,8 +520,8 @@ static uint8_t pas16_pit_in(uint16_t port, void *p) pas16->pit.rereadlatch[t] = 0; if (!t) { - pas16->pit.rl[t] = timer_get_remaining_u64(&pit.timer[t]) / PITCONST; - if ((timer_get_remaining_u64(&pit.timer[t]) / PITCONST) > 65536) + pas16->pit.rl[t] = timer_get_remaining_u64(&pas16->pit.timer[t]) / PITCONST; + if ((timer_get_remaining_u64(&pas16->pit.timer[t]) / PITCONST) > 65536) pas16->pit.rl[t] = 0xFFFF; } else diff --git a/src/win/86Box.rc b/src/win/86Box.rc index 8b34c5c09..8f1195a06 100644 --- a/src/win/86Box.rc +++ b/src/win/86Box.rc @@ -379,6 +379,7 @@ END #include "languages/it-IT.rc" #include "languages/ja-JP.rc" #include "languages/ko-KR.rc" +#include "languages/pl-PL.rc" #include "languages/pt-BR.rc" #include "languages/pt-PT.rc" #include "languages/ru-RU.rc" diff --git a/src/win/Makefile.mingw b/src/win/Makefile.mingw index 948e1d260..f4e45fa41 100644 --- a/src/win/Makefile.mingw +++ b/src/win/Makefile.mingw @@ -69,6 +69,12 @@ ifeq ($(DEV_BUILD), y) ifndef XL24 XL24 := y endif + ifndef ISAMEM_RAMPAGE + ISAMEM_RAMPAGE := y + endif + ifndef ISAMEM_IAB + ISAMEM_IAB := y + endif ifndef OLIVETTI OLIVETTI := y endif @@ -118,6 +124,12 @@ else ifndef XL24 XL24 := n endif + ifndef ISAMEM_RAMPAGE + ISAMEM_RAMPAGE := n + endif + ifndef ISAMEM_IAB + ISAMEM_IAB := n + endif ifndef OLIVETTI OLIVETTI := n endif @@ -450,6 +462,14 @@ ifeq ($(XL24), y) OPTS += -DUSE_XL24 endif +ifeq ($(ISAMEM_RAMPAGE), y) +OPTS += -DUSE_ISAMEM_RAMPAGE +endif + +ifeq ($(ISAMEM_IAB), y) +OPTS += -DUSE_ISAMEM_IAB +endif + ifeq ($(OLIVETTI), y) OPTS += -DUSE_OLIVETTI DEVBROBJ += olivetti_eva.o diff --git a/src/win/languages/pl-PL.rc b/src/win/languages/pl-PL.rc new file mode 100644 index 000000000..2c4a74e7c --- /dev/null +++ b/src/win/languages/pl-PL.rc @@ -0,0 +1,647 @@ +//////////////////////////////////////////////////////////////////////////// +// Polish (pl-PL) resources + +#ifdef _WIN32 +LANGUAGE LANG_POLISH, SUBLANG_DEFAULT +#pragma code_page(65001) +#endif //_WIN32 + +#define AUTHORS + +///////////////////////////////////////////////////////////////////////////// +// +// Menu +// + +MainMenu MENU DISCARDABLE +BEGIN + POPUP "&Akcje" + BEGIN + MENUITEM "&Klawaitura wymaga przechwytu myszy", IDM_ACTION_KBD_REQ_CAPTURE + MENUITEM "&Prawy CTRL to lewy Alt", IDM_ACTION_RCTRL_IS_LALT + MENUITEM SEPARATOR + MENUITEM "&Twardy reset...", IDM_ACTION_HRESET + MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM SEPARATOR + MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC + MENUITEM SEPARATOR + MENUITEM "&Pauza", IDM_ACTION_PAUSE + MENUITEM SEPARATOR + MENUITEM "W&yjdź...", IDM_ACTION_EXIT + END + POPUP "&Widok" + BEGIN + MENUITEM "&Ukryj pasek statusu", IDM_VID_HIDE_STATUS_BAR + MENUITEM "Ukryj &pasek narzędzi", IDM_VID_HIDE_TOOLBAR + MENUITEM SEPARATOR + MENUITEM "&Okno o zmiennym rozmiarze", IDM_VID_RESIZE + MENUITEM "P&amiętaj rozmiar &i pozycję", IDM_VID_REMEMBER + MENUITEM SEPARATOR + POPUP "Re&nderer" + BEGIN + MENUITEM "&SDL (Software)", IDM_VID_SDL_SW + MENUITEM "SDL (&Hardware)", IDM_VID_SDL_HW + MENUITEM "SDL (&OpenGL)", IDM_VID_SDL_OPENGL + MENUITEM "Open&GL (3.0 Core)", IDM_VID_OPENGL_CORE +#ifdef USE_VNC + MENUITEM "&VNC", IDM_VID_VNC +#endif + END + MENUITEM SEPARATOR + MENUITEM "Określ rozmiary...", IDM_VID_SPECIFY_DIM + MENUITEM "&Wymuś proporcje wyświetlania 4:3", IDM_VID_FORCE43 + POPUP "&Czynnik skalowania okna" + BEGIN + MENUITEM "&0.5x", IDM_VID_SCALE_1X + MENUITEM "&1x", IDM_VID_SCALE_2X + MENUITEM "1.&5x", IDM_VID_SCALE_3X + MENUITEM "&2x", IDM_VID_SCALE_4X + END + POPUP "Metoda filtrowania" + BEGIN + MENUITEM "&Nearest", IDM_VID_FILTER_NEAREST + MENUITEM "&Linear", IDM_VID_FILTER_LINEAR + END + MENUITEM "Skalowanie Hi&DPI", IDM_VID_HIDPI + MENUITEM SEPARATOR + MENUITEM "&Pełny ekran\tCtrl+Alt+PageUP", IDM_VID_FULLSCREEN + POPUP "Fullscreen &stretch mode" + BEGIN + MENUITEM "&Tryb rozciągania na pełnym ekranie", IDM_VID_FS_FULL + MENUITEM "&4:3", IDM_VID_FS_43 + MENUITEM "&Kwadratowe piksele (Zachowaj proporcje)", IDM_VID_FS_KEEPRATIO + MENUITEM "&Skalowanie całkowite", IDM_VID_FS_INT + END + POPUP "Ustawienia E&GA/(S)VGA" + BEGIN + MENUITEM "&Odwrócony monitor VGA", IDM_VID_INVERT + POPUP "Rodzaj ekranu &VGA" + BEGIN + MENUITEM "RGB - &Kolorowy", IDM_VID_GRAY_RGB + MENUITEM "&RGB - Skala szarości", IDM_VID_GRAY_MONO + MENUITEM "&Bursztynowy monitor", IDM_VID_GRAY_AMBER + MENUITEM "&Zielony monitor", IDM_VID_GRAY_GREEN + MENUITEM "&Biały monitor", IDM_VID_GRAY_WHITE + END + POPUP "Typ konwersji &w skali szarości" + BEGIN + MENUITEM "BT&601 (NTSC/PAL)", IDM_VID_GRAYCT_601 + MENUITEM "BT&709 (HDTV)", IDM_VID_GRAYCT_709 + MENUITEM "&Średni", IDM_VID_GRAYCT_AVE + END + END + MENUITEM SEPARATOR + MENUITEM "Overscan dla CGA/PCjr/Tandy/E&GA/(S)VGA", IDM_VID_OVERSCAN + MENUITEM "Zmień kontrast dla &monochromatycznego ekranu", IDM_VID_CGACON + END + MENUITEM "&Nośnik", IDM_MEDIA + POPUP "&Narzędzia" + BEGIN + MENUITEM "&Ustawienia...", IDM_CONFIG + MENUITEM "&Aktualizuj ikony na pasku statusu", IDM_UPDATE_ICONS + MENUITEM SEPARATOR + MENUITEM "Zrób &zrzut ekranu\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM SEPARATOR + MENUITEM "&Preferencje...", IDM_PREFERENCES + MENUITEM "Włącz integrację z &Discord", IDM_DISCORD + MENUITEM SEPARATOR + MENUITEM "Wzmocnienie &dźwięku...", IDM_SND_GAIN +#ifdef MTR_ENABLED + MENUITEM SEPARATOR + MENUITEM "Rozpocznij śledzenie\tCtrl+T", IDM_ACTION_BEGIN_TRACE + MENUITEM "Zakończ śledzenie\tCtrl+T", IDM_ACTION_END_TRACE +#endif + END +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Logowanie" + BEGIN +# ifdef ENABLE_BUSLOGIC_LOG + MENUITEM "Włącz logu BusLogic\tCtrl+F4", IDM_LOG_BUSLOGIC +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "Włącz logi CD-ROM\tCtrl+F5", IDM_LOG_CDROM +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Włącz logi dyskietek (86F)\tCtrl+F6", IDM_LOG_D86F +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Włącz logi kontrolera dyskietek\tCtrl+F7", IDM_LOG_FDC +# endif +# ifdef ENABLE_IDE_LOG + MENUITEM "Włącz logi IDE\tCtrl+F8", IDM_LOG_IDE +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Włącz logi portu szeregowego\tCtrl+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Włącz logi sieci\tCtrl+F9", IDM_LOG_NIC +# endif +# ifdef ENABLE_LOG_COMMANDS +# ifdef ENABLE_LOG_TOGGLES + MENUITEM SEPARATOR +# endif +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "&Punkt przerwania dziennika\tCtrl+F10", IDM_LOG_BREAKPOINT +# endif +# ifdef ENABLE_VRAM_DUMP + MENUITEM "Zrzuć pamięć &wideo\tCtrl+F1", IDM_DUMP_VRAM +# endif +# endif + END +#endif + POPUP "&Pomoc" + BEGIN + MENUITEM "&Dokumentacja...", IDM_DOCS + MENUITEM "&O 86Box...", IDM_ABOUT + END +END + +StatusBarMenu MENU DISCARDABLE +BEGIN + MENUITEM SEPARATOR +END + +CassetteSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nowy obraz...", IDM_CASSETTE_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Istniejący obraz...", IDM_CASSETTE_IMAGE_EXISTING + MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_CASSETTE_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "&Nagraj", IDM_CASSETTE_RECORD + MENUITEM "&Odtwórz", IDM_CASSETTE_PLAY + MENUITEM "&Przewiń do początku", IDM_CASSETTE_REWIND + MENUITEM "&Przewiń do końca", IDM_CASSETTE_FAST_FORWARD + MENUITEM SEPARATOR + MENUITEM "W&yjmij", IDM_CASSETTE_EJECT + END +END + +CartridgeSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Obraz...", IDM_CARTRIDGE_IMAGE + MENUITEM SEPARATOR + MENUITEM "W&yjmij", IDM_CARTRIDGE_EJECT + END +END + +FloppySubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nowy obraz...", IDM_FLOPPY_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Istniejący obraz...", IDM_FLOPPY_IMAGE_EXISTING + MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_FLOPPY_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "E&ksportuj do 86F...", IDM_FLOPPY_EXPORT_TO_86F + MENUITEM SEPARATOR + MENUITEM "W&yjmij", IDM_FLOPPY_EJECT + END +END + +CdromSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Ścisz", IDM_CDROM_MUTE + MENUITEM SEPARATOR + MENUITEM "P&usty", IDM_CDROM_EMPTY + MENUITEM "&Przeładuj poprzedni obraz", IDM_CDROM_RELOAD + MENUITEM SEPARATOR + MENUITEM "&Obraz", IDM_CDROM_IMAGE + END +END + +ZIPSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nowy obraz...", IDM_ZIP_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Istniejący obraz...", IDM_ZIP_IMAGE_EXISTING + MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_ZIP_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "W&yjmij", IDM_ZIP_EJECT + MENUITEM "&Przeładuj poprzedni obraz", IDM_ZIP_RELOAD + END +END + +MOSubmenu MENU DISCARDABLE +BEGIN + POPUP "" + BEGIN + MENUITEM "&Nowy obraz...", IDM_MO_IMAGE_NEW + MENUITEM SEPARATOR + MENUITEM "&Istniejący obraz...", IDM_MO_IMAGE_EXISTING + MENUITEM "Istniejący obraz (&Chroniony przed zapisem)...", IDM_MO_IMAGE_EXISTING_WP + MENUITEM SEPARATOR + MENUITEM "W&yjmij", IDM_MO_EJECT + MENUITEM "&Przeładuj poprzedni obraz", IDM_MO_RELOAD + END +END + +VidGLSubMenu MENU DISCARDABLE +BEGIN + POPUP "Docelowa &liczba klatek na sekundę" + BEGIN + MENUITEM "&Zsynchronizuj z wideo", IDM_VID_GL_FPS_BLITTER + MENUITEM "&25 fps", IDM_VID_GL_FPS_25 + MENUITEM "&30 fps", IDM_VID_GL_FPS_30 + MENUITEM "&50 fps", IDM_VID_GL_FPS_50 + MENUITEM "&60 fps", IDM_VID_GL_FPS_60 + MENUITEM "&75 fps", IDM_VID_GL_FPS_75 + END + MENUITEM "&VSync", IDM_VID_GL_VSYNC + MENUITEM "&Wybierz shader...", IDM_VID_GL_SHADER + MENUITEM "&Usuń shader", IDM_VID_GL_NOSHADER +END + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +#define STR_PREFERENCES "Preferencje" +#define STR_SND_GAIN "Wzmocnienie dźwięku" +#define STR_NEW_FLOPPY "Nowy obraz" +#define STR_CONFIG "Ustawienia" +#define STR_SPECIFY_DIM "Określ rozmiary okna" + +#define STR_OK "OK" +#define STR_CANCEL "Anuluj" +#define STR_GLOBAL "Zapisz ustawienia jako &globalne ustawienia domyślne" +#define STR_DEFAULT "&Domyślny" +#define STR_LANGUAGE "Język:" +#define STR_ICONSET "Zestaw ikon:" + +#define STR_GAIN "Wzmacniacz" + +#define STR_FILE_NAME "Nazwa pliku:" +#define STR_DISK_SIZE "Rozmiar dysku:" +#define STR_RPM_MODE "Tryb RPM:" +#define STR_PROGRESS "Postęp:" + +#define STR_WIDTH "Szerokość:" +#define STR_HEIGHT "Wysokość:" +#define STR_LOCK_TO_SIZE "Stały rozmiar" + +#define STR_MACHINE_TYPE "Rodzaj maszyny:" +#define STR_MACHINE "Maszyna:" +#define STR_CONFIGURE "Konfiguruj" +#define STR_CPU_TYPE "Rodzaj procesora:" +#define STR_SPEED "Szybkość:" +#define STR_FPU "Jednostka FPU:" +#define STR_WAIT_STATES "Stany oczekiwania:" +#define STR_MB "MB" +#define STR_MEMORY "Pamięć:" +#define STR_TIME_SYNC "Synchronizacja czasu" +#define STR_DISABLED "Wyłączona" +#define STR_ENABLED_LOCAL "Włączona (czas lokalny)" +#define STR_ENABLED_UTC "Włączona (UTC)" +#define STR_DYNAREC "Dynamiczny rekompilator" + +#define STR_VIDEO "Wideo:" +#define STR_VOODOO "Grafika Voodoo" + +#define STR_MOUSE "Mysz:" +#define STR_JOYSTICK "Joystick:" +#define STR_JOY1 "Joystick 1..." +#define STR_JOY2 "Joystick 2..." +#define STR_JOY3 "Joystick 3..." +#define STR_JOY4 "Joystick 4..." + +#define STR_SOUND "Karta dźwiękowa:" +#define STR_MIDI "Urządzenie wyjściowe MIDI:" +#define STR_MIDI_IN "Urządzenie wejściowe MIDI:" +#define STR_MPU401 "Samodzielne urządzenie MPU-401" +#define STR_SSI "Innovation SSI-2001" +#define STR_CMS "CMS / Game Blaster" +#define STR_GUS "Gravis Ultrasound" +#define STR_FLOAT "Użyj dźwięku FLOAT32" + +#define STR_NET_TYPE "Rodzaj sieci:" +#define STR_PCAP "Urządzenie PCap:" +#define STR_NET "Karta sieciowa:" + +#define STR_LPT1 "Urządzenie LPT1:" +#define STR_LPT2 "Urządzenie LPT2:" +#define STR_LPT3 "Urządzenie LPT3:" +#define STR_SERIAL1 "Port szeregowy 1" +#define STR_SERIAL2 "Port szeregowy 2" +#define STR_SERIAL3 "Port szeregowy 3" +#define STR_SERIAL4 "Port Szeregowy 4" +#define STR_PARALLEL1 "Port równoległy 1" +#define STR_PARALLEL2 "Port równoległy 2" +#define STR_PARALLEL3 "Port równoległy 3" + +#define STR_HDC "Kontroler dysku twardego:" +#define STR_FDC "Kontroler dyskietek:" +#define STR_IDE_TER "Trzeciorzędowy kontroler IDE" +#define STR_IDE_QUA "Czwartorzędowy kontroler IDE" +#define STR_SCSI "SCSI" +#define STR_SCSI_1 "Kontroler 1:" +#define STR_SCSI_2 "Kontroler 2:" +#define STR_SCSI_3 "Kontroler 3:" +#define STR_SCSI_4 "Kontroler 4:" +#define STR_CASSETTE "Kaseta" + +#define STR_HDD "Dyski twarde:" +#define STR_NEW "&Nowy..." +#define STR_EXISTING "&Istniejący..." +#define STR_REMOVE "&Usuń" +#define STR_BUS "Magistrala:" +#define STR_CHANNEL "Kanał:" +#define STR_ID "ID:" + +#define STR_SPECIFY "&Określ..." +#define STR_SECTORS "Sektory:" +#define STR_HEADS "Głowice:" +#define STR_CYLS "Cylindry:" +#define STR_SIZE_MB "Rozmiar (MB):" +#define STR_TYPE "Rodzaj:" +#define STR_IMG_FORMAT "Format obrazu:" +#define STR_BLOCK_SIZE "Rozmiar bloku:" + +#define STR_FLOPPY_DRIVES "Napędy dyskietek:" +#define STR_TURBO "Rozrządy Turbo" +#define STR_CHECKBPB "Sprawdzaj BPB" +#define STR_CDROM_DRIVES "Napędy CD-ROM:" + +#define STR_MO_DRIVES "Napędy MO:" +#define STR_ZIP_DRIVES "Napędy ZIP:" +#define STR_250 "ZIP 250" + +#define STR_ISARTC "ISA RTC:" +#define STR_ISAMEM "Rozszerzenie pamięci ISA" +#define STR_ISAMEM_1 "Karta 1:" +#define STR_ISAMEM_2 "Karta 2:" +#define STR_ISAMEM_3 "Karta 3:" +#define STR_ISAMEM_4 "Karta 4:" +#define STR_BUGGER "Urządzenie ISABugger" +#define STR_POSTCARD "Karta POST" + +#define FONT_SIZE 9 +#define FONT_NAME "Segoe UI" + +#include "dialogs.rc" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + 2048 "86Box" + IDS_2049 "Błąd" + IDS_2050 "Fatalny błąd" + IDS_2051 "" + IDS_2052 "Naciśnij klawisze CTRL+ALT+PAGE DOWN aby wrócić to trybu okna." + IDS_2053 "Szybkość" + IDS_2054 "ZIP %03i %i (%s): %ls" + IDS_2055 "Obrazy ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0" + IDS_2056 "86Box nie może znaleźć obrazów ROM nadających się do użytku.\n\nProszę pobrać zestaw obrazów ROM ze strony download, i rozpakować je do katalogu ""roms""." + IDS_2057 "(pusty)" + IDS_2058 "Obrazy ZIP (*.IM?;*.ZDI)\0*.IM?;*.ZDI\0Wszystkie pliki (*.*)\0*.*\0" + IDS_2059 "Turbo" + IDS_2060 "Włącz" + IDS_2061 "Wyłącz" + IDS_2062 "Wszystkie obrazy (*.86F;*.DSK;*.FLP;*.IM?;*.*FD?)\0*.86F;*.DSK;*.FLP;*.IM?;*.*FD?\0Podstawowe obrazy sektorów(*.DSK;*.FLP;*.IM?;*.*FD?)\0*.DSK;*.FLP;*.IM?;*.IMG;*.*FD?\0Obrazy powierzchniowe (*.86F)\0*.86F\0" + IDS_2063 "Maszyna ""%hs"" nie jest dostępna, ponieważ brakuje obrazów ROM w katalogu roms/machines. Przełączanie na dostępną maszynę." +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2064 "Karta wideo ""%hs"" nie jest dostępna, ponieważ brakuje obrazów ROM w katalogu roms/video. Przełączanie na dostępną kartę wideo." + IDS_2065 "Maszyna" + IDS_2066 "Ekran" + IDS_2067 "Urządzenia wejściowe" + IDS_2068 "Dźwięk" + IDS_2069 "Sieć" + IDS_2070 "Porty (COM & LPT)" + IDS_2071 "Kontrolery pamięci" + IDS_2072 "Dyski twarde" + IDS_2073 "Napędy dyskietek i CD-ROM" + IDS_2074 "Inne urządzenia wymienne" + IDS_2075 "Inne urządzenia peryferyjne" + IDS_2076 "Obrazy powierzchniowe (*.86F)\0*.86F\0" + IDS_2077 "Kliknij w celu przechwycenia myszy" + IDS_2078 "Naciśnij klawisze F8+F12 w celu uwolnienia myszy" + IDS_2079 "Naciśnij klawisze F8+F12 lub środkowy przycisk w celu uwolnienia myszy" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_2080 "Nie można zainicjować FluidSynth" + IDS_2081 "Magistrala" + IDS_2082 "Plik" + IDS_2083 "C" + IDS_2084 "H" + IDS_2085 "S" + IDS_2086 "MB" + IDS_2087 "Sprawdzaj BPB" + IDS_2088 "KB" + IDS_2089 "Nie można zainicjować renderera wideo." + IDS_2090 "Domyślny" + IDS_2091 "%i Stany oczekiwania" + IDS_2092 "Rodzaj" + IDS_2093 "Nie udało się ustawić PCap" + IDS_2094 "Nie znaleziono urządzeń PCap" + IDS_2095 "Nieprawidłowe urządzenie PCap" + IDS_2096 "Standardowe joysticki 2-przyciskowe" + IDS_2097 "Standardowy joystick 4-przyciskowy" + IDS_2098 "Standardowy joystick 6-przyciskowy" + IDS_2099 "Standardowy joystick 8-przyciskowy" + IDS_2100 "CH Flightstick Pro" + IDS_2101 "Microsoft SideWinder Pad" + IDS_2102 "Thrustmaster Flight Control System" + IDS_2103 "Żaden" + IDS_2104 "Nie można załadować akceleratorów klawiaturowych." + IDS_2105 "Nie można zarejestrować surowych danych wejściowych." + IDS_2106 "%u" + IDS_2107 "%u MB (CHS: %i, %i, %i)" + IDS_2108 "Dyskietka %i (%s): %ls" + IDS_2109 "Wszystkie obrazy (*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF)\0*.0??;*.1??;*.??0;*.86F;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.JSON;*.TD0;*.*FD?;*.MFM;*.XDF\0Zaawansowane obrazy sektorów (*.IMD;*.JSON;*.TD0)\0*.IMD;*.JSON;*.TD0\0Podstawowe obrazy sektorów (*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?)\0*.0??;*.1??;*.??0;*.BIN;*.CQ?;*.D??;*.FLP;*.HDM;*.IM?;*.XDF;*.*FD?\0Flux images (*.FDI)\0*.FDI\0Obrazy powierzchniowe (*.86F;*.MFM)\0*.86F;*.MFM\0All files (*.*)\0*.*\0" + IDS_2110 "Nie można zainicjować FreeType" + IDS_2111 "Nie można zainicjować SDL, wymagany SDL2.dll" + IDS_2112 "Jesteś pewien że chcesz wykonać twardy reset emulowanej maszyny?" + IDS_2113 "Jesteś pewien że chcesz zakończyć 86Box?" + IDS_2114 "Nie można zainicjować Ghostscript" + IDS_2115 "MO %i (%ls): %ls" + IDS_2116 "Obrazy MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2117 "Witamy w 86Box!" + IDS_2118 "Kontroler wewnętrzny" + IDS_2119 "Zakończ" + IDS_2120 "Nie znaleziono obrazów ROM" + IDS_2121 "Czy chcesz zapisać ustawienia?" + IDS_2122 "To spowoduje twardy reset wirtualnej maszyny." + IDS_2123 "Zapisz" + IDS_2124 "O 86Box" + IDS_2125 "86Box v" EMU_VERSION + + IDS_2126 "Emulator starych komputerów\n\nAutorzy: Sarah Walker, Miran Grca, Fred N. van Kempen (waltje), SA1988, Tiseno100, reenigne, leilei, JohnElliott, greatpsycho, i inni.\n\nPrzetłumaczony przez: Fanta-Shokata\n\nWydany na licencji GNU General Public License w wersji 2 lub nowszej. Zobacz LICENSE aby uzyskać więcej informacji." + IDS_2127 "OK" + IDS_2128 "Sprzęt niedostępny" +#ifdef _WIN32 +#define LIB_NAME_PCAP "WinPcap" +#else +#define LIB_NAME_PCAP "libpcap" +#endif + IDS_2129 "Sprawdź, czy " LIB_NAME_PCAP " jest zainstalowany i czy posiadasz połączenie sieciowe kompatybilne z " LIB_NAME_PCAP "." + IDS_2130 "Nieprawidłowa konfiguracja" +#ifdef _WIN32 +#define LIB_NAME_FREETYPE "freetype.dll" +#else +#define LIB_NAME_FREETYPE "libfreetype" +#endif + IDS_2131 LIB_NAME_FREETYPE " jest wymagany do emulacji drukarki ESC-P." +#ifdef _WIN32 +#define LIB_NAME_GS "gsdll32.dll" +#else +#define LIB_NAME_GS "libgs" +#endif + IDS_2132 LIB_NAME_GS " jest wymagany do automatycznej konwersji plików PostScript do PDF.\n\nDokumenty wysłane do ogólnej drukarki PostScript zostaną zapisane jako pliki PostScript (.ps)." +#ifdef _WIN32 +#define LIB_NAME_FLUIDSYNTH "libfluidsynth.dll" +#else +#define LIB_NAME_FLUIDSYNTH "libfluidsynth" +#endif + IDS_2133 LIB_NAME_FLUIDSYNTH " jest wymagany dla wyjścia FluidSynth MIDI." + IDS_2134 "Przechodzenie do trybu pełnoekranowego" + IDS_2135 "Nie pokazuj więcej tego komunikatu" + IDS_2136 "Nie kończ" + IDS_2137 "Przywróć" + IDS_2138 "Nie przywracaj" + IDS_2139 "Obrazy MO (*.IM?;*.MDI)\0*.IM?;*.MDI\0All files (*.*)\0*.*\0" + IDS_2140 "Obrazy CD-ROM (*.ISO;*.CUE)\0*.ISO;*.CUE\0All files (*.*)\0*.*\0" + IDS_2141 "Konfiguracja urządzenia %hs" + IDS_2142 "Monitor w trybie czuwania" + IDS_2143 "Shadery OpenGL (*.GLSL)\0*.GLSL\0Wszystkie pliki (*.*)\0*.*\0" + IDS_2144 "Opcje OpenGL" + IDS_2145 "Ładujesz nieobsługiwaną konfigurację" + IDS_2146 "Wybór rodzaju procesora oparty na wybranej maszynie jest wyłączony dla tej emulowanej maszyny.\n\nPozwala to na wybór procesora który jest niekompatybilny z wybraną maszyną. Jednak możesz napotkać niezgodności z BIOS-em maszyny lub innym oprogramowaniem.\n\nAktywacja tego ustawienia nie jest wspierana i każde zgłoszenie błędu może zostać zamknięte jako nieważne." + IDS_2147 "Kontynuuj" + IDS_2148 "Kaseta: %s" + IDS_2149 "Obrazy kaset (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Wszystkie pliki (*.*)\0*.*\0" + IDS_2150 "Kartrydż %i: %ls" + IDS_2151 "Obrazy kartrydżu (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Wszystkie pliki (*.*)\0*.*\0" + IDS_2152 "Błąd inicjalizacji renderera" + IDS_2153 "Nie można zainicjować renderera OpenGL (3.0 Core). Użyj innego." + IDS_2154 "Wznów wykonywanie" + IDS_2155 "Zatrzymaj wykonywanie" + IDS_2156 "Naciśnij Ctrl+Alt+Del" + IDS_2157 "Naciśnij Ctrl+Alt+Esc" + IDS_2158 "Twardy reset" + IDS_2159 "Wyłączenie ACPI" + IDS_2160 "Ustawienia" +END + +STRINGTABLE DISCARDABLE +BEGIN + IDS_4096 "Dysk twardy (%s)" + IDS_4097 "%01i:%01i" + IDS_4098 "%01i" + IDS_4099 "Napędy CD-ROM MFM/RLL lub ESDI nigdy nie istniały" + IDS_4100 "Niestandardowy..." + IDS_4101 "Niestandardowy (duży)..." + IDS_4102 "Dodaj nowy dysk twardy" + IDS_4103 "Dodaj istniejący dysk twardy" + IDS_4104 "Obrazy dysków HDI nie mogą być większe niż 4 GB." + IDS_4105 "Obrazy dysków nie mogą być większe niż 127 GB." + IDS_4106 "Obrazy dysku twardego (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Wszystkie pliki (*.*)\0*.*\0" + IDS_4107 "Nie można odczytać pliku" + IDS_4108 "Nie można zapisać pliku" + IDS_4109 "Obrazy HDI lub HDX z rozmiarem sektora innym niż 512 nie są wspierane." + IDS_4110 "USB nie jest jeszcze wspierane" + IDS_4111 "Plik obrazu dysku już istnieje" + IDS_4112 "Określ prawidłową nazwę pliku." + IDS_4113 "Utworzono obraz dysku" + IDS_4114 "Sprawdź, czy plik istnieje i nadaje się do odczytu." + IDS_4115 "Sprawdź, czy plik jest zapiyswany w katalogu z możliwością zapisu." + IDS_4116 "Obraz dysku jest za duży" + IDS_4117 "Nie zapomnij o partycjonowaniu u sformatowaniu nowo utworzego dysku" + IDS_4118 "Wybrany plik zostanie nadpisany. Czy na pewno chcesz użyć tego pliku?" + IDS_4119 "Niewspierany obraz dysku" + IDS_4120 "Nadpisz" + IDS_4121 "Nie nadpisuj" + IDS_4122 "Obraz surowy (.img)" + IDS_4123 "Obraz HDI (.hdi)" + IDS_4124 "Obraz HDX (.hdx)" + IDS_4125 "VHD o stałym rozmiarze (.vhd)" + IDS_4126 "VHD o dynamicznym rozmiarze (.vhd)" + IDS_4127 "VHD różnicujący (.vhd)" + IDS_4128 "Duże bloki (2 MB)" + IDS_4129 "Małe bloki (512 KB)" + IDS_4130 "Pliki VHD (*.VHD)\0*.VHD\0Wszystkie pliki (*.*)\0*.*\0" + IDS_4131 "Wybierz nadrzędny plik VHD" + IDS_4132 "Może to oznaczać, że obraz nadrzędny został zmodyfikowany po utworzeniu obrazu różnicującego.\n\nMoże się to również zdarzyć, jeśli pliki obrazów przeniesione lub skopiowane, lub wystąpił błąd w programie, który utworzył ten dysk\n\nCzy chcesz naprawić sygnatury czasowe?" + IDS_4133 "Sygnatury czasowe dysku nadrzędnego i podrzędnego nie zgadzają się" + IDS_4134 "Nie można naprawić sygnatury czasowej VHD." + IDS_4135 "%01i:%02i" + + IDS_4352 "MFM/RLL" + IDS_4353 "XTA" + IDS_4354 "ESDI" + IDS_4355 "IDE" + IDS_4356 "ATAPI" + IDS_4357 "SCSI" + + IDS_4608 "MFM/RLL (%01i:%01i)" + IDS_4609 "XTA (%01i:%01i)" + IDS_4610 "ESDI (%01i:%01i)" + IDS_4611 "IDE (%01i:%01i)" + IDS_4612 "ATAPI (%01i:%01i)" + IDS_4613 "SCSI (%01i:%02i)" + + IDS_5120 "CD-ROM %i (%s): %s" + + IDS_5376 "Wyłączony" + IDS_5381 "ATAPI" + IDS_5382 "SCSI" + + IDS_5632 "Wyłączony" + IDS_5637 "ATAPI (%01i:%01i)" + IDS_5638 "SCSI (%01i:%02i)" + + IDS_5888 "160 kB" + IDS_5889 "180 kB" + IDS_5890 "320 kB" + IDS_5891 "360 kB" + IDS_5892 "640 kB" + IDS_5893 "720 kB" + IDS_5894 "1,2 MB" + IDS_5895 "1,25 MB" + IDS_5896 "1,44 MB" + IDS_5897 "DMF (klaster 1024)" + IDS_5898 "DMF (klaster 2048)" + IDS_5899 "2,88 MB" + IDS_5900 "ZIP 100" + IDS_5901 "ZIP 250" + IDS_5902 "3.5"" 128Mb M.O. (ISO 10090)" + IDS_5903 "3.5"" 230Mb M.O. (ISO 13963)" + IDS_5904 "3.5"" 540Mb M.O. (ISO 15498)" + IDS_5905 "3.5"" 640Mb M.O. (ISO 15498)" + IDS_5906 "3.5"" 1,3Gb M.O. (GigaMO)" + IDS_5907 "3.5"" 2,3Gb M.O. (GigaMO 2)" + IDS_5908 "5.25"" 600Mb M.O." + IDS_5909 "5.25"" 650Mb M.O." + IDS_5910 "5.25"" 1Gb M.O." + IDS_5911 "5.25"" 1,3Gb M.O." + + IDS_6144 "Idealne obroty" + IDS_6145 "1%% poniżej idealnych obrotów" + IDS_6146 "1.5%% poniżej idealnych obrotów" + IDS_6147 "2%% poniżej idealnych obrotów" + + IDS_7168 "(Domyślne ustawienie systemowe)" +END +#define IDS_LANG_ENUS IDS_7168 + +// Polish (pl-PL) resources +///////////////////////////////////////////////////////////////////////////// diff --git a/src/win/languages/ru-RU.rc b/src/win/languages/ru-RU.rc index 6bb1f222a..43289dbfc 100644 --- a/src/win/languages/ru-RU.rc +++ b/src/win/languages/ru-RU.rc @@ -31,8 +31,8 @@ BEGIN END POPUP "&Вид" BEGIN - MENUITEM "&Скрыть строку статуса", IDM_VID_HIDE_STATUS_BAR - MENUITEM "Hide &toolbar", IDM_VID_HIDE_TOOLBAR + MENUITEM "&Скрыть строку состояния", IDM_VID_HIDE_STATUS_BAR + MENUITEM "С&крыть панель инструментов", IDM_VID_HIDE_TOOLBAR MENUITEM SEPARATOR MENUITEM "&Изменяемый размер окна", IDM_VID_RESIZE MENUITEM "&Запомнить размер и положение", IDM_VID_REMEMBER @@ -98,7 +98,7 @@ BEGIN POPUP "&Инструменты" BEGIN MENUITEM "&Настройки машины...", IDM_CONFIG - MENUITEM "&Обновление значков строки статуса", IDM_UPDATE_ICONS + MENUITEM "&Обновление значков строки состояния", IDM_UPDATE_ICONS MENUITEM SEPARATOR MENUITEM "Сделать с&криншот\tCtrl+F11", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR @@ -208,7 +208,7 @@ CdromSubmenu MENU DISCARDABLE BEGIN POPUP "" BEGIN - MENUITEM "&Mute", IDM_CDROM_MUTE + MENUITEM "О&тключить звук", IDM_CDROM_MUTE MENUITEM SEPARATOR MENUITEM "П&устой", IDM_CDROM_EMPTY MENUITEM "&Снова загрузить предыдущий образ", IDM_CDROM_RELOAD @@ -294,8 +294,8 @@ END #define STR_MACHINE_TYPE "Тип машины:" #define STR_MACHINE "Системная плата:" #define STR_CONFIGURE "Настройка" -#define STR_CPU_TYPE "Тип ЦПУ:" -#define STR_SPEED "Speed:" +#define STR_CPU_TYPE "Тип ЦП:" +#define STR_SPEED "Скорость:" #define STR_FPU "FPU:" #define STR_WAIT_STATES "Циклы ожидания:" #define STR_MB "МБ" @@ -463,7 +463,7 @@ BEGIN IDS_2102 "Система управления полетом Thrustmaster" IDS_2103 "Нет" IDS_2104 "Невозможно загрузить ускорители клавиатуры." - IDS_2105 "Невозможно зарегистрировать необработанный ввод." + IDS_2105 "Невозможно зарегистрировать необработанный (RAW) ввод." IDS_2106 "%u" IDS_2107 "%u МБ (CHS: %i, %i, %i)" IDS_2108 "Дисковод %i (%s): %ls" @@ -525,21 +525,21 @@ BEGIN IDS_2143 "Шейдеры OpenGL (*.GLSL)\0*.GLSL\0Все файлы (*.*)\0*.*\0" IDS_2144 "Параметры OpenGL" IDS_2145 "Вы загружаете неподдерживаемую конфигурацию" - IDS_2146 "Выбор типов CPU для этой системной платы на данной эмулируемой машине отключен.\n\nЭто позволяет выбрать процессор, который в противном случае несовместим с выбранной материнской платой. Однако, вы можете столкнуться с несовместимостью с BIOS материнской платы или другим ПО.\n\nВключение этого параметра официально не поддерживается, и все поданные отчеты об ошибках могут быть закрыты как недействительные." + IDS_2146 "Выбор типов ЦП для этой системной платы на данной эмулируемой машине отключен.\n\nЭто позволяет выбрать процессор, который в противном случае несовместим с выбранной материнской платой. Однако, вы можете столкнуться с несовместимостью с BIOS материнской платы или другим ПО.\n\nВключение этого параметра официально не поддерживается, и все поданные отчеты об ошибках могут быть закрыты как недействительные." IDS_2147 "Продолжить" IDS_2148 "Кассета: %s" IDS_2149 "Образы кассет (*.PCM;*.RAW;*.WAV;*.CAS)\0*.PCM;*.RAW;*.WAV;*.CAS\0Все файлы (*.*)\0*.*\0" IDS_2150 "Картридж %i: %ls" IDS_2151 "Образы картриджей (*.A;*.B;*.JRC)\0*.A;*.B;*.JRC\0Все файлы (*.*)\0*.*\0" - IDS_2152 "Error initializing renderer" - IDS_2153 "OpenGL (3.0 Core) renderer could not be initialized. Use another renderer." - IDS_2154 "Resume execution" - IDS_2155 "Pause execution" - IDS_2156 "Press Ctrl+Alt+Del" - IDS_2157 "Press Ctrl+Alt+Esc" - IDS_2158 "Hard reset" - IDS_2159 "ACPI shutdown" - IDS_2160 "Settings" + IDS_2152 "Ошибка инициализации рендерера" + IDS_2153 "Невозможно инициализировать рендерер OpenGL (3.0). Пожалуйста, используйте другой рендерер." + IDS_2154 "Возобновить выполнение" + IDS_2155 "Приостановить выполнение" + IDS_2156 "Нажать Ctrl+Alt+Del" + IDS_2157 "Нажать Ctrl+Alt+Esc" + IDS_2158 "Холодная перезагрузка" + IDS_2159 "Сигнал завершения ACPI" + IDS_2160 "Настройки машины" END STRINGTABLE DISCARDABLE @@ -548,10 +548,10 @@ BEGIN IDS_4097 "%01i:%01i" IDS_4098 "%01i" IDS_4099 "MFM/RLL или ESDI дисководов CD-ROM никогда не существовало" - IDS_4100 "Custom..." - IDS_4101 "Custom (large)..." + IDS_4100 "Задать вручную..." + IDS_4101 "Задать вручную (large)..." IDS_4102 "Создать новый жёсткий диск" - IDS_4103 "Добавить существующий жёсткий диск" + IDS_4103 "Выбрать существующий жёсткий диск" IDS_4104 "Размер образов дисков HDI не может превышать 4 ГБ." IDS_4105 "Размер образов дисков не может превышать 127 ГБ." IDS_4106 "Образы жёстких дисков (*.HD?;*.IM?;*.VHD)\0*.HD?;*.IM?;*.VHD\0Все файлы (*.*)\0*.*\0" diff --git a/src/win/win_new_floppy.c b/src/win/win_new_floppy.c index b692a070e..4f0f1255f 100644 --- a/src/win/win_new_floppy.c +++ b/src/win/win_new_floppy.c @@ -52,8 +52,13 @@ typedef struct { } disk_size_t; -static const disk_size_t disk_sizes[14] = { { 0, 1, 2, 1, 0, 40, 8, 2, 0xfe, 2, 2, 1, 64 }, /* 160k */ - { 0, 1, 2, 1, 0, 40, 9, 2, 0xfc, 2, 2, 1, 64 }, /* 180k */ +static const disk_size_t disk_sizes[14] = { +// { 1, 1, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 250k 8" */ +// { 1, 2, 2, 1, 1, 77, 26, 0, 0, 4, 2, 6, 68 }, /* 500k 8" */ +// { 1, 1, 2, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 616k 8" */ +// { 1, 2, 0, 1, 1, 77, 8, 3, 0, 1, 2, 2, 192 }, /* 1232k 8" */ + { 0, 1, 2, 1, 0, 40, 8, 2, 0xfe, 1, 2, 1, 64 }, /* 160k */ + { 0, 1, 2, 1, 0, 40, 9, 2, 0xfc, 1, 2, 2, 64 }, /* 180k */ { 0, 2, 2, 1, 0, 40, 8, 2, 0xff, 2, 2, 1, 112 }, /* 320k */ { 0, 2, 2, 1, 0, 40, 9, 2, 0xfd, 2, 2, 2, 112 }, /* 360k */ { 0, 2, 2, 1, 0, 80, 8, 2, 0xfb, 2, 2, 2, 112 }, /* 640k */ @@ -698,7 +703,7 @@ NewFloppyDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) uint8_t disk_size, rpm_mode; int ret; FILE *f; - int zip_types, mo_types; + int zip_types, mo_types, floppy_types; wchar_t *twcs; switch (message) { @@ -716,7 +721,8 @@ NewFloppyDialogProcedure(HWND hdlg, UINT message, WPARAM wParam, LPARAM lParam) for (i = 0; i < mo_types; i++) SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_5902 + i)); } else { - for (i = 0; i < 12; i++) + floppy_types = 12; + for (i = 0; i < floppy_types; i++) SendMessage(h, CB_ADDSTRING, 0, win_get_string(IDS_5888 + i)); } SendMessage(h, CB_SETCURSEL, 0, 0); diff --git a/src/win/win_opengl.c b/src/win/win_opengl.c index 99843cd9f..9bb13561d 100644 --- a/src/win/win_opengl.c +++ b/src/win/win_opengl.c @@ -872,6 +872,8 @@ static void opengl_main(void* param) static void opengl_blit(int x, int y, int w, int h) { + int row; + if ((x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (thread == NULL) || atomic_flag_test_and_set(&blit_info[write_pos].in_use)) { @@ -879,7 +881,8 @@ static void opengl_blit(int x, int y, int w, int h) return; } - video_copy(blit_info[write_pos].buffer, &(buffer32->line[y][x]), h * ROW_LENGTH * sizeof(uint32_t)); + for (row = 0; row < h; ++row) + video_copy(&(((uint8_t *) blit_info[write_pos].buffer)[row * ROW_LENGTH * sizeof(uint32_t)]), &(buffer32->line[y + row][x]), w * sizeof(uint32_t)); if (screenshots) video_screenshot(blit_info[write_pos].buffer, 0, 0, ROW_LENGTH); diff --git a/src/win/win_sdl.c b/src/win/win_sdl.c index 4fc735a1c..cf5afb809 100644 --- a/src/win/win_sdl.c +++ b/src/win/win_sdl.c @@ -274,6 +274,7 @@ sdl_blit_ex(int x, int y, int w, int h) SDL_Rect r_src; void *pixeldata; int pitch, ret; + int row; if (!sdl_enabled || (x < 0) || (y < 0) || (w <= 0) || (h <= 0) || (w > 2048) || (h > 2048) || (buffer32 == NULL) || (sdl_render == NULL) || (sdl_tex == NULL)) { video_blit_complete(); @@ -284,7 +285,8 @@ sdl_blit_ex(int x, int y, int w, int h) SDL_LockTexture(sdl_tex, 0, &pixeldata, &pitch); - video_copy(pixeldata, &(buffer32->line[y][x]), h * 2048 * sizeof(uint32_t)); + for (row = 0; row < h; ++row) + video_copy(&(((uint8_t *) pixeldata)[row * 2048 * sizeof(uint32_t)]), &(buffer32->line[y + row][x]), w * sizeof(uint32_t)); if (screenshots) video_screenshot((uint32_t *) pixeldata, 0, 0, 2048);