diff --git a/src/disk/hdc.c b/src/disk/hdc.c index 2fb47a7..c95b585 100644 --- a/src/disk/hdc.c +++ b/src/disk/hdc.c @@ -8,7 +8,7 @@ * * Common code to handle all sorts of disk controllers. * - * Version: @(#)hdc.c 1.0.3 2018/03/18 + * Version: @(#)hdc.c 1.0.4 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -38,6 +38,7 @@ #include #include #include +#define HAVE_STDARG_H #include "../emu.h" #include "../machine/machine.h" #include "../device.h" @@ -47,6 +48,9 @@ char *hdc_name; /* configured HDC name */ int hdc_current; +#ifdef ENABLE_HDC_LOG +int hdc_do_log = ENABLE_HDC_LOG; +#endif static void * @@ -150,13 +154,30 @@ static const struct { }; +void +hdc_log(const char *fmt, ...) +{ +#ifdef ENABLE_IDE_LOG + va_list ap; + + if (hdc_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +#endif +} + + /* Initialize the 'hdc_current' value based on configured HDC name. */ void hdc_init(char *name) { int c; - pclog("HDC: initializing..\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("HDC: initializing..\n"); +#endif for (c=0; controllers[c].device; c++) { if (! strcmp(name, (char *)controllers[c].internal_name)) { @@ -171,8 +192,10 @@ hdc_init(char *name) void hdc_reset(void) { - pclog("HDC: reset(current=%d, internal=%d)\n", +#ifdef ENABLE_HDC_LOG + hdc_log("HDC: reset(current=%d, internal=%d)\n", hdc_current, (machines[machine].flags & MACHINE_HDC)?1:0); +#endif /* If we have a valid controller, add its device. */ if (hdc_current > 1) diff --git a/src/disk/hdc.h b/src/disk/hdc.h index b996127..4a0b650 100644 --- a/src/disk/hdc.h +++ b/src/disk/hdc.h @@ -8,7 +8,7 @@ * * Definitions for the common disk controller handler. * - * Version: @(#)hdc.h 1.0.2 2018/03/15 + * Version: @(#)hdc.h 1.0.3 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -46,10 +46,11 @@ * least 7 devices, with each device being * able to support 8 units, but hey... */ -extern char *hdc_name; -extern int hdc_current; - +extern char *hdc_name; +extern int hdc_current; +extern int hdc_do_log; +#ifdef EMU_DEVICE_H extern const device_t mfm_xt_xebec_device; /* mfm_xt_xebec */ extern const device_t mfm_xt_dtc5150x_device; /* mfm_xt_dtc */ extern const device_t mfm_at_wd1003_device; /* mfm_at_wd1003 */ @@ -69,8 +70,10 @@ extern const device_t xtide_device; /* xtide_xt */ extern const device_t xtide_at_device; /* xtide_at */ extern const device_t xtide_acculogic_device; /* xtide_ps2 */ extern const device_t xtide_at_ps2_device; /* xtide_at_ps2 */ +#endif +extern void hdc_log(const char *fmt, ...); extern void hdc_init(char *name); extern void hdc_reset(void); diff --git a/src/disk/hdc_esdi_at.c b/src/disk/hdc_esdi_at.c index 25b4ed8..91a2bfc 100644 --- a/src/disk/hdc_esdi_at.c +++ b/src/disk/hdc_esdi_at.c @@ -8,7 +8,7 @@ * * Driver for the ESDI controller (WD1007-vse1) for PC/AT. * - * Version: @(#)hdc_esdi_at.c 1.0.6 2018/04/01 + * Version: @(#)hdc_esdi_at.c 1.0.6 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -122,7 +122,8 @@ typedef struct { } esdi_t; -static __inline void irq_raise(esdi_t *esdi) +static __inline void +irq_raise(esdi_t *esdi) { /* If not already pending.. */ if (! esdi->irqstat) { @@ -138,7 +139,8 @@ static __inline void irq_raise(esdi_t *esdi) } -static __inline void irq_lower(esdi_t *esdi) +static __inline void +irq_lower(esdi_t *esdi) { /* If raised.. */ if (esdi->irqstat) { @@ -164,12 +166,16 @@ get_sector(esdi_t *esdi, off64_t *addr) int c, h, s; if (esdi->head > heads) { - pclog("esdi_get_sector: past end of configured heads\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("esdi_get_sector: past end of configured heads\n"); +#endif return(1); } if (esdi->sector >= sectors+1) { - pclog("esdi_get_sector: past end of configured sectors\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("esdi_get_sector: past end of configured sectors\n"); +#endif return(1); } @@ -238,8 +244,8 @@ esdi_write(uint16_t port, uint8_t val, void *priv) { esdi_t *esdi = (esdi_t *)priv; -#if ENABLE_HDC_LOG > 1 - pclog("WD1007 write(%04x, %02x)\n", port, val); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1007 write(%04x, %02x)\n", port, val); #endif switch (port) { @@ -282,8 +288,8 @@ esdi_write(uint16_t port, uint8_t val, void *priv) esdi->command = val; esdi->error = 0; -#if ENABLE_HDC_LOG - pclog("WD1007: command %02x\n", val & 0xf0); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1007: command %02x\n", val & 0xf0); #endif switch (val & 0xf0) { case CMD_RESTORE: @@ -374,7 +380,9 @@ esdi_write(uint16_t port, uint8_t val, void *priv) break; default: - pclog("WD1007: bad command %02X\n", val); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1007: bad command %02X\n", val); +#endif case 0xe8: /*???*/ esdi->status = STAT_BUSY; timer_clock(); @@ -478,8 +486,8 @@ esdi_read(uint16_t port, void *priv) break; } -#if ENABLE_HDC_LOG > 1 - pclog("WD1007 read(%04x) = %02x\n", port, temp); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1007 read(%04x) = %02x\n", port, temp); #endif return(temp); @@ -508,8 +516,8 @@ esdi_callback(void *priv) return; } -#if ENABLE_HDC_LOG - pclog("WD1007: command %02x\n", esdi->command); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1007: command %02x\n", esdi->command); #endif switch (esdi->command) { @@ -656,8 +664,8 @@ esdi_callback(void *priv) drive->cfg_spt = esdi->secount; drive->cfg_hpc = esdi->head+1; -#if ENABLE_HDC_LOG - pclog("WD1007: parameters: spt=%i hpc=%i\n", drive->cfg_spt,drive->cfg_hpc); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1007: parameters: spt=%i hpc=%i\n", drive->cfg_spt,drive->cfg_hpc); #endif if (! esdi->secount) fatal("WD1007: secount=0\n"); @@ -697,8 +705,11 @@ esdi_callback(void *priv) break; default: - pclog("WD1007: bad read config %02x\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1007: bad read config %02x\n", esdi->cylinder >> 8); +#endif + break; } esdi->status = STAT_READY|STAT_DSC; irq_raise(esdi); @@ -754,7 +765,9 @@ esdi_callback(void *priv) break; default: - pclog("WD1007: callback on unknown command %02x\n", esdi->command); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1007: callback on unknown command %02x\n", esdi->command); +#endif /*FALLTHROUGH*/ case 0xe8: @@ -774,7 +787,9 @@ loadhd(esdi_t *esdi, int hdd_num, int d, const wchar_t *fn) drive_t *drive = &esdi->drives[hdd_num]; if (! hdd_image_load(d)) { - pclog("WD1007: drive %d not present!\n", d); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1007: drive %d not present!\n", d); +#endif drive->present = 0; return; } diff --git a/src/disk/hdc_esdi_mca.c b/src/disk/hdc_esdi_mca.c index eee6a26..c34533f 100644 --- a/src/disk/hdc_esdi_mca.c +++ b/src/disk/hdc_esdi_mca.c @@ -52,7 +52,7 @@ * however, are auto-configured by the system software as * shown above. * - * Version: @(#)hdc_esdi_mca.c 1.0.5 2018/04/01 + * Version: @(#)hdc_esdi_mca.c 1.0.5 2018/04/02 * * Authors: Fred N. van Kempen, * Sarah Walker, @@ -227,7 +227,6 @@ clear_irq(esdi_t *dev) } - static void cmd_unsupported(esdi_t *dev) { @@ -245,6 +244,7 @@ cmd_unsupported(esdi_t *dev) dev->status = STATUS_IRQ | STATUS_STATUS_OUT_FULL; dev->irq_status = dev->cmd_dev | IRQ_CMD_COMPLETE_FAILURE; dev->irq_in_progress = 1; + set_irq(dev); } @@ -266,26 +266,30 @@ device_not_present(esdi_t *dev) dev->status = STATUS_IRQ | STATUS_STATUS_OUT_FULL; dev->irq_status = dev->cmd_dev | IRQ_CMD_COMPLETE_FAILURE; dev->irq_in_progress = 1; + set_irq(dev); } -static void rba_out_of_range(esdi_t *dev) -{ - dev->status_len = 9; - dev->status_data[0] = dev->command | STATUS_LEN(9) | dev->cmd_dev; - dev->status_data[1] = 0x0e01; /*Command block error, invalid parameter*/ - dev->status_data[2] = 0x0007; /*RBA out of range*/ - dev->status_data[3] = 0; - dev->status_data[4] = 0; - dev->status_data[5] = 0; - dev->status_data[6] = 0; - dev->status_data[7] = 0; - dev->status_data[8] = 0; - dev->status = STATUS_IRQ | STATUS_STATUS_OUT_FULL; - dev->irq_status = dev->cmd_dev | IRQ_CMD_COMPLETE_FAILURE; - dev->irq_in_progress = 1; - set_irq(dev); +static void +rba_out_of_range(esdi_t *dev) +{ + dev->status_len = 9; + dev->status_data[0] = dev->command | STATUS_LEN(9) | dev->cmd_dev; + dev->status_data[1] = 0x0e01; /*Command block error, invalid parameter*/ + dev->status_data[2] = 0x0007; /*RBA out of range*/ + dev->status_data[3] = 0; + dev->status_data[4] = 0; + dev->status_data[5] = 0; + dev->status_data[6] = 0; + dev->status_data[7] = 0; + dev->status_data[8] = 0; + + dev->status = STATUS_IRQ | STATUS_STATUS_OUT_FULL; + dev->irq_status = dev->cmd_dev | IRQ_CMD_COMPLETE_FAILURE; + dev->irq_in_progress = 1; + + set_irq(dev); } #define ESDI_ADAPTER_ONLY() do \ @@ -562,7 +566,7 @@ esdi_callback(void *priv) dev->status_data[5] = drive->hpc | (drive->spt << 16); #if 0 - pclog("CMD_GET_DEV_CONFIG %i %04x %04x %04x %04x %04x %04x\n", + hdc_log("CMD_GET_DEV_CONFIG %i %04x %04x %04x %04x %04x %04x\n", drive->sectors, dev->status_data[0], dev->status_data[1], dev->status_data[2], dev->status_data[3], @@ -723,7 +727,7 @@ esdi_callback(void *priv) break; default: - fatal("BAD COMMAND %02x %i\n", dev->command, dev->cmd_dev); + hdc_log("BAD COMMAND %02x %i\n", dev->command, dev->cmd_dev); } } @@ -745,7 +749,7 @@ esdi_read(uint16_t port, void *priv) break; default: - fatal("esdi_read port=%04x\n", port); + hdc_log("esdi_read port=%04x\n", port); } return(ret); @@ -757,8 +761,8 @@ esdi_write(uint16_t port, uint8_t val, void *priv) { esdi_t *dev = (esdi_t *)priv; -#if ENABLE_HDC_LOG > 1 - pclog("ESDI: wr(%04x, %02x)\n", port-dev->base, val); +#ifdef ENABLE_HDC_LOG + hdc_log("ESDI: wr(%04x, %02x)\n", port-dev->base, val); #endif switch (port-dev->base) { case 2: /*Basic control register*/ @@ -799,7 +803,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv) break; default: - fatal("Bad attention request %02x\n", val); + hdc_log("Bad attention request %02x\n", val); } break; @@ -821,7 +825,7 @@ esdi_write(uint16_t port, uint8_t val, void *priv) break; default: - fatal("Bad attention request %02x\n", val); + hdc_log("Bad attention request %02x\n", val); } break; @@ -843,17 +847,17 @@ esdi_write(uint16_t port, uint8_t val, void *priv) break; default: - fatal("Bad attention request %02x\n", val); + hdc_log("Bad attention request %02x\n", val); } break; default: - fatal("Attention to unknown device %02x\n", val); + hdc_log("Attention to unknown device %02x\n", val); } break; default: - fatal("esdi_write port=%04x val=%02x\n", port, val); + hdc_log("esdi_write port=%04x val=%02x\n", port, val); } } @@ -876,7 +880,7 @@ esdi_readw(uint16_t port, void *priv) break; default: - fatal("esdi_readw port=%04x\n", port); + hdc_log("esdi_readw port=%04x\n", port); } return(ret); @@ -888,8 +892,8 @@ esdi_writew(uint16_t port, uint16_t val, void *priv) { esdi_t *dev = (esdi_t *)priv; -#if ENABLE_HDC_LOG > 1 - pclog("ESDI: wrw(%04x, %04x)\n", port-dev->base, val); +#ifdef ENABLE_HDC_LOG + hdc_log("ESDI: wrw(%04x, %04x)\n", port-dev->base, val); #endif switch (port-dev->base) { case 0: /*Command Interface Register*/ @@ -912,7 +916,7 @@ esdi_writew(uint16_t port, uint16_t val, void *priv) break; default: - fatal("esdi_writew port=%04x val=%04x\n", port, val); + hdc_log("esdi_writew port=%04x val=%04x\n", port, val); } } @@ -922,8 +926,8 @@ esdi_mca_read(int port, void *priv) { esdi_t *dev = (esdi_t *)priv; -#if ENABLE_HDC_LOG > 1 - pclog("ESDI: mcard(%04x)\n", port); +#ifdef ENABLE_HDC_LOG + hdc_log("ESDI: mcard(%04x)\n", port); #endif return(dev->pos_regs[port & 7]); } @@ -934,8 +938,8 @@ esdi_mca_write(int port, uint8_t val, void *priv) { esdi_t *dev = (esdi_t *)priv; -#if ENABLE_HDC_LOG > 1 - pclog("ESDI: mcawr(%04x, %02x) pos[2]=%02x pos[3]=%02x\n", +#ifdef ENABLE_HDC_LOG + hdc_log("ESDI: mcawr(%04x, %02x) pos[2]=%02x pos[3]=%02x\n", port, val, dev->pos_regs[2], dev->pos_regs[3]); #endif if (port < 0x102) return; @@ -1053,7 +1057,7 @@ esdi_mca_write(int port, uint8_t val, void *priv) } /* Say hello. */ - pclog("ESDI: I/O=%04x, IRQ=%d, DMA=%d, BIOS @%05X\n", + hdc_log("ESDI: I/O=%04x, IRQ=%d, DMA=%d, BIOS @%05X\n", dev->base, dev->irq, dev->dma, dev->bios); } } diff --git a/src/disk/hdc_ide.c b/src/disk/hdc_ide.c index 20c0c27..b299a16 100644 --- a/src/disk/hdc_ide.c +++ b/src/disk/hdc_ide.c @@ -8,7 +8,7 @@ * * Emulation of hard disk, CD-ROM and ZIP IDE/ATAPI devices. * - * Version: @(#)hdc_ide.c 1.0.15 2018/03/27 + * Version: @(#)hdc_ide.c 1.0.16 2018/04/02 * * Authors: Miran Grca, * Sarah Walker, @@ -44,7 +44,6 @@ #include #include #include -#define HAVE_STDARG_H #include "../emu.h" #include "../version.h" #include "../cpu/cpu.h" @@ -137,26 +136,6 @@ int cur_ide[5]; int ide_init_ch[2] = {0, 0}; -#ifdef ENABLE_IDE_LOG -int ide_do_log = ENABLE_IDE_LOG; -#endif - - -static void ide_log(const char *fmt, ...) -{ -#ifdef ENABLE_IDE_LOG - va_list ap; - - if (ide_do_log) - { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -#endif -} - - uint8_t getstat(IDE *ide) { return ide->atastat; } @@ -213,7 +192,7 @@ int ide_irq[5] = { 14, 15, 10, 11, 0 }; void ide_irq_raise(IDE *ide) { - /* ide_log("Attempting to raise IRQ %i (board %i)\n", ide_irq[ide->board], ide->board); */ + /* hdc_log("Attempting to raise IRQ %i (board %i)\n", ide_irq[ide->board], ide->board); */ if ((ide->board > 3) || ide->irqstat) { @@ -223,7 +202,9 @@ void ide_irq_raise(IDE *ide) return; } - ide_log("Raising IRQ %i (board %i)\n", ide_irq[ide->board], ide->board); +#ifdef ENABLE_HDC_LOG + hdc_log("Raising IRQ %i (board %i)\n", ide_irq[ide->board], ide->board); +#endif if (!(ide->fdisk&2)) { @@ -257,7 +238,9 @@ void ide_irq_lower(IDE *ide) return; } - ide_log("Lowering IRQ %i (board %i)\n", ide_irq[ide->board], ide->board); +#ifdef ENABLE_HDC_LOG + hdc_log("Lowering IRQ %i (board %i)\n", ide_irq[ide->board], ide->board); +#endif if (pci_use_mirq(0) && (ide->board == 1)) { @@ -342,7 +325,9 @@ static void ide_identify(IDE *ide) device_identify[6] = (ide->hdd_num / 10) + 0x30; device_identify[7] = (ide->hdd_num % 10) + 0x30; - ide_log("IDE Identify: %s\n", device_identify); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE Identify: %s\n", device_identify); +#endif memset(ide->buffer, 0, 512); d_spt = ide->spt; @@ -366,7 +351,9 @@ static void ide_identify(IDE *ide) ide->buffer[3] = 16; /* Heads in default CHS translation. */ ide->buffer[6] = 63; /* Heads in default CHS translation. */ } - ide_log("Default CHS translation: %i, %i, %i\n", ide->buffer[1], ide->buffer[3], ide->buffer[6]); +#ifdef ENABLE_HDC_LOG + hdc_log("Default CHS translation: %i, %i, %i\n", ide->buffer[1], ide->buffer[3], ide->buffer[6]); +#endif ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */ ide_padstr((char *) (ide->buffer + 23), EMU_VERSION, 8); /* Firmware */ @@ -384,7 +371,9 @@ static void ide_identify(IDE *ide) if ((ide->tracks >= 1024) || (ide->hpc > 16) || (ide->spt > 63)) { ide->buffer[49] |= (1 << 9); - ide_log("LBA supported\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("LBA supported\n"); +#endif } ide->buffer[50] = 0x4000; /* Capabilities */ ide->buffer[51] = 2 << 8; /*PIO timing mode*/ @@ -393,7 +382,9 @@ static void ide_identify(IDE *ide) { ide->buffer[60] = full_size & 0xFFFF; /* Total addressable sectors (LBA) */ ide->buffer[61] = (full_size >> 16) & 0x0FFF; - ide_log("Full size: %" PRIu64 "\n", full_size); +#ifdef ENABLE_HDC_LOG + hdc_log("Full size: %" PRIu64 "\n", full_size); +#endif ide->buffer[53] |= 1; @@ -418,7 +409,9 @@ static void ide_identify(IDE *ide) ide->buffer[57] = full_size & 0xFFFF; /* Total addressable sectors (LBA) */ ide->buffer[58] = (full_size >> 16) & 0x0FFF; - ide_log("Current CHS translation: %i, %i, %i\n", ide->buffer[54], ide->buffer[55], ide->buffer[56]); +#ifdef ENABLE_HDC_LOG + hdc_log("Current CHS translation: %i, %i, %i\n", ide->buffer[54], ide->buffer[55], ide->buffer[56]); +#endif } ide->buffer[59] = ide->blocksize ? (ide->blocksize | 0x100) : 0; @@ -446,7 +439,9 @@ static void ide_identify(IDE *ide) ide->buffer[64] |= d; } else ide->buffer[62] |= d; - ide_log(" IDENTIFY DMA Mode: %04X, %04X\n", ide->buffer[62], ide->buffer[63]); +#ifdef ENABLE_HDC_LOG + hdc_log(" IDENTIFY DMA Mode: %04X, %04X\n", ide->buffer[62], ide->buffer[63]); +#endif } ide->buffer[65] = 120; ide->buffer[66] = 120; @@ -471,7 +466,9 @@ static void ide_atapi_identify(IDE *ide) cdrom_id = atapi_cdrom_drives[ide->channel]; device_identify[7] = cdrom_id + 0x30; - ide_log("ATAPI Identify: %s\n", device_identify); +#ifdef ENABLE_HDC_LOG + hdc_log("ATAPI Identify: %s\n", device_identify); +#endif ide->buffer[0] = 0x8000 | (5<<8) | 0x80 | (2<<5); /* ATAPI device, CD-ROM drive, removable media, accelerated DRQ */ ide_padstr((char *) (ide->buffer + 10), "", 20); /* Serial Number */ @@ -505,7 +502,9 @@ static void ide_atapi_identify(IDE *ide) ide->buffer[64] |= d; } else ide->buffer[62] |= d; - ide_log("PIDENTIFY DMA Mode: %04X, %04X\n", ide->buffer[62], ide->buffer[63]); +#ifdef ENABLE_HDC_LOG + hdc_log("PIDENTIFY DMA Mode: %04X, %04X\n", ide->buffer[62], ide->buffer[63]); +#endif } ide->buffer[65] = 120; ide->buffer[66] = 120; @@ -584,7 +583,9 @@ static void ide_atapi_zip_identify(IDE *ide) if ((ide->mdma_mode & 0xff) >= 3) ide->buffer[64] |= d; } - ide_log("PIDENTIFY DMA Mode: %04X, %04X\n", ide->buffer[62], ide->buffer[63]); +#ifdef ENABLE_HDC_LOG + hdc_log("PIDENTIFY DMA Mode: %04X, %04X\n", ide->buffer[62], ide->buffer[63]); +#endif } } } @@ -712,14 +713,18 @@ static int ide_set_features(IDE *ide) max_pio = 4; } - ide_log("Features code %02X\n", features); +#ifdef ENABLE_HDC_LOG + hdc_log("Features code %02X\n", features); - ide_log("IDE %02X: Set features: %02X, %02X\n", ide->channel, features, features_data); + hdc_log("IDE %02X: Set features: %02X, %02X\n", ide->channel, features, features_data); +#endif switch(features) { case FEATURE_SET_TRANSFER_MODE: /* Set transfer mode. */ - ide_log("Transfer mode %02X\n", features_data >> 3); +#ifdef ENABLE_HDC_LOG + hdc_log("Transfer mode %02X\n", features_data >> 3); +#endif mode = (features_data >> 3); submode = features_data & 7; @@ -732,7 +737,9 @@ static int ide_set_features(IDE *ide) return 0; } ide->mdma_mode = -1; - ide_log("IDE %02X: Setting DPIO mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %02X: Setting DPIO mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#endif break; case 0x01: /* PIO mode */ @@ -741,7 +748,9 @@ static int ide_set_features(IDE *ide) return 0; } ide->mdma_mode = (1 << submode) | 0x400; - ide_log("IDE %02X: Setting PIO mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %02X: Setting PIO mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#endif break; case 0x02: /* Singleword DMA mode */ @@ -750,7 +759,9 @@ static int ide_set_features(IDE *ide) return 0; } ide->mdma_mode = (1 << submode); - ide_log("IDE %02X: Setting SDMA mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %02X: Setting SDMA mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#endif break; case 0x04: /* Multiword DMA mode */ @@ -759,7 +770,9 @@ static int ide_set_features(IDE *ide) return 0; } ide->mdma_mode = (1 << submode) | 0x100; - ide_log("IDE %02X: Setting MDMA mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %02X: Setting MDMA mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#endif break; case 0x08: /* Ultra DMA mode */ @@ -768,7 +781,9 @@ static int ide_set_features(IDE *ide) return 0; } ide->mdma_mode = (1 << submode) | 0x200; - ide_log("IDE %02X: Setting UDMA mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %02X: Setting UDMA mode: %02X, %08X\n", ide->channel, submode, ide->mdma_mode); +#endif break; default: @@ -878,13 +893,17 @@ void ide_reset(void) idecallback[2]=idecallback[3]=0LL; idecallback[4]=0LL; - ide_log("IDE: loading disks...\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE: loading disks...\n"); +#endif c = 0; for (d = 0; d < HDD_NUM; d++) { if (((hdd[d].bus == HDD_BUS_IDE_PIO_ONLY) || (hdd[d].bus == HDD_BUS_IDE_PIO_AND_DMA)) && (hdd[d].ide_channel < IDE_NUM)) { - ide_log("Found IDE hard disk on channel %i\n", hdd[d].ide_channel); +#ifdef ENABLE_HDC_LOG + hdc_log("Found IDE hard disk on channel %i\n", hdd[d].ide_channel); +#endif loadhd(&ide_drives[hdd[d].ide_channel], d, hdd[d].fn); ide_drives[hdd[d].ide_channel].sector_buffer = (uint8_t *) malloc(256*512); memset(ide_drives[hdd[d].ide_channel].sector_buffer, 0, 256*512); @@ -892,14 +911,18 @@ void ide_reset(void) } if ((hdd[d].bus==HDD_BUS_XTIDE) && (hdd[d].xtide_channel < XTIDE_NUM)) { - ide_log("Found XT IDE hard disk on channel %i\n", hdd[d].xtide_channel); +#ifdef ENABLE_HDC_LOG + hdc_log("Found XT IDE hard disk on channel %i\n", hdd[d].xtide_channel); +#endif loadhd(&ide_drives[hdd[d].xtide_channel | 8], d, hdd[d].fn); ide_drives[hdd[d].xtide_channel | 8].sector_buffer = (uint8_t *) malloc(256*512); memset(ide_drives[hdd[d].ide_channel].sector_buffer, 0, 256*512); if (++c >= (IDE_NUM+XTIDE_NUM)) break; } } - ide_log("IDE: done, loaded %d disks.\n", c); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE: done, loaded %d disks.\n", c); +#endif for (d = 0; d < IDE_NUM; d++) { @@ -1057,7 +1080,9 @@ void writeide(int ide_board, uint16_t addr, uint8_t val) IDE *ide = &ide_drives[cur_ide[ide_board]]; IDE *ide_other = &ide_drives[cur_ide[ide_board] ^ 1]; - ide_log("WriteIDE %04X %02X from %04X(%08X):%08X\n", addr, val, CS, cs, cpu_state.pc); +#ifdef ENABLE_HDC_LOG + hdc_log("WriteIDE %04X %02X from %04X(%08X):%08X\n", addr, val, CS, cs, cpu_state.pc); +#endif addr|=0x90; addr&=0xFFF7; @@ -1073,12 +1098,16 @@ void writeide(int ide_board, uint16_t addr, uint8_t val) case 0x1F1: /* Features */ if (ide_drive_is_zip(ide)) { - ide_log("ATAPI transfer mode: %s\n", (val & 1) ? "DMA" : "PIO"); +#ifdef ENABLE_HDC_LOG + hdc_log("ATAPI transfer mode: %s\n", (val & 1) ? "DMA" : "PIO"); +#endif zip[atapi_zip_drives[cur_ide[ide_board]]].features = val; } else if (ide_drive_is_cdrom(ide)) { - ide_log("ATAPI transfer mode: %s\n", (val & 1) ? "DMA" : "PIO"); +#ifdef ENABLE_HDC_LOG + hdc_log("ATAPI transfer mode: %s\n", (val & 1) ? "DMA" : "PIO"); +#endif cdrom[atapi_cdrom_drives[cur_ide[ide_board]]]->features = val; } ide->cylprecomp = val; @@ -1097,24 +1126,32 @@ void writeide(int ide_board, uint16_t addr, uint8_t val) case 0x1F2: /* Sector count */ if (ide_drive_is_zip(ide)) { - ide_log("Sector count write: %i\n", val); +#ifdef ENABLE_HDC_LOG + hdc_log("Sector count write: %i\n", val); +#endif zip[atapi_zip_drives[cur_ide[ide_board]]].phase = val; } else if (ide_drive_is_cdrom(ide)) { - ide_log("Sector count write: %i\n", val); +#ifdef ENABLE_HDC_LOG + hdc_log("Sector count write: %i\n", val); +#endif cdrom[atapi_cdrom_drives[cur_ide[ide_board]]]->phase = val; } ide->secount = val; if (ide_drive_is_zip(ide_other)) { - ide_log("Other sector count write: %i\n", val); +#ifdef ENABLE_HDC_LOG + hdc_log("Other sector count write: %i\n", val); +#endif zip[atapi_zip_drives[cur_ide[ide_board] ^ 1]].phase = val; } else if (ide_drive_is_cdrom(ide_other)) { - ide_log("Other sector count write: %i\n", val); +#ifdef ENABLE_HDC_LOG + hdc_log("Other sector count write: %i\n", val); +#endif cdrom[atapi_cdrom_drives[cur_ide[ide_board] ^ 1]]->phase = val; } ide_other->secount = val; @@ -1678,7 +1715,9 @@ uint32_t ide_read_data(int ide_board, int length) ide->pos = 0; if (!ide_drive_is_zip(ide) && !ide_drive_is_cdrom(ide)) { - ide_log("Drive not ZIP or CD-ROM (position: %i)\n", ide->pos); +#ifdef ENABLE_HDC_LOG + hdc_log("Drive not ZIP or CD-ROM (position: %i)\n", ide->pos); +#endif return 0; } if (ide_drive_is_zip(ide)) @@ -1920,7 +1959,9 @@ uint8_t readide(int ide_board, uint16_t addr) temp = 0xff; break; } - /* if (ide_board) */ ide_log("Read IDEb %04X %02X %02X %02X %i %04X:%04X %i\n", addr, temp, ide->atastat,(ide->atastat & ~DSC_STAT) | (ide->service ? SERVICE_STAT : 0),cur_ide[ide_board],CS,cpu_state.pc,ide_board); +#ifdef ENABLE_HDC_LOG + /* if (ide_board) */ hdc_log("Read IDEb %04X %02X %02X %02X %i %04X:%04X %i\n", addr, temp, ide->atastat,(ide->atastat & ~DSC_STAT) | (ide->service ? SERVICE_STAT : 0),cur_ide[ide_board],CS,cpu_state.pc,ide_board); +#endif return temp; } @@ -1965,7 +2006,9 @@ void callbackide(int ide_board) ext_ide = ide; if (ide->command==0x30) times30++; - /*if (ide_board) */ide_log("CALLBACK %02X %i %i %i\n",ide->command,times30,ide->reset,cur_ide[ide_board]); +#ifdef ENABLE_HDC_LOG + /*if (ide_board) */hdc_log("CALLBACK %02X %i %i %i\n",ide->command,times30,ide->reset,cur_ide[ide_board]); +#endif if (ide->reset) { @@ -2165,12 +2208,16 @@ void callbackide(int ide_board) case WIN_READ_DMA_ALT: if (ide_drive_is_zip(ide) || ide_drive_is_cdrom(ide) || (ide->board >= 2)) { - ide_log("IDE %i: DMA read aborted (bad device or board)\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA read aborted (bad device or board)\n", ide->channel); +#endif goto abort_cmd; } if (!ide->specify_success) { - ide_log("IDE %i: DMA read aborted (SPECIFY failed)\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA read aborted (SPECIFY failed)\n", ide->channel); +#endif goto id_not_found; } @@ -2191,13 +2238,17 @@ void callbackide(int ide_board) { if (ide_bus_master_read(ide_board, ide->sector_buffer, ide->sector_pos * 512)) { - ide_log("IDE %i: DMA read aborted (failed)\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA read aborted (failed)\n", ide->channel); +#endif goto abort_cmd; } else { /*DMA successful*/ - ide_log("IDE %i: DMA read successful\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA read successful\n", ide->channel); +#endif ide->atastat = READY_STAT | DSC_STAT; @@ -2205,7 +2256,9 @@ void callbackide(int ide_board) ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus, 0); } } else { - ide_log("IDE %i: DMA read aborted (no bus master)\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA read aborted (no bus master)\n", ide->channel); +#endif goto abort_cmd; } @@ -2292,12 +2345,16 @@ void callbackide(int ide_board) case WIN_WRITE_DMA_ALT: if (ide_drive_is_zip(ide) || ide_drive_is_cdrom(ide) || (ide_board >= 2)) { - ide_log("IDE %i: DMA write aborted (bad device type or board)\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA write aborted (bad device type or board)\n", ide->channel); +#endif goto abort_cmd; } if (!ide->specify_success) { - ide_log("IDE %i: DMA write aborted (SPECIFY failed)\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA write aborted (SPECIFY failed)\n", ide->channel); +#endif goto id_not_found; } @@ -2310,13 +2367,17 @@ void callbackide(int ide_board) if (ide_bus_master_write(ide_board, ide->sector_buffer, ide->sector_pos * 512)) { - ide_log("IDE %i: DMA write aborted (failed)\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA write aborted (failed)\n", ide->channel); +#endif goto abort_cmd; } else { /*DMA successful*/ - ide_log("IDE %i: DMA write successful\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA write successful\n", ide->channel); +#endif hdd_image_write(ide->hdd_num, ide_get_sector(ide), ide->sector_pos, ide->sector_buffer); @@ -2326,7 +2387,9 @@ void callbackide(int ide_board) ui_sb_update_icon(SB_HDD | hdd[ide->hdd_num].bus, 0); } } else { - ide_log("IDE %i: DMA write aborted (no bus master)\n", ide->channel); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE %i: DMA write aborted (no bus master)\n", ide->channel); +#endif goto abort_cmd; } @@ -2555,7 +2618,9 @@ void callbackide(int ide_board) zip_phase_callback(atapi_zip_drives[cur_ide[ide_board]]); else cdrom_phase_callback(atapi_cdrom_drives[cur_ide[ide_board]]); - ide_log("IDE callback now: %i\n", idecallback[ide_board]); +#ifdef ENABLE_HDC_LOG + hdc_log("IDE callback now: %i\n", idecallback[ide_board]); +#endif return; case 0xFF: @@ -2745,12 +2810,16 @@ void ide_pri_enable_ex(void) { if (ide_base_main[0] & 0x300) { - ide_log("Enabling primary base (%04X)...\n", ide_base_main[0]); +#ifdef ENABLE_HDC_LOG + hdc_log("Enabling primary base (%04X)...\n", ide_base_main[0]); +#endif io_sethandler(ide_base_main[0], 0x0008, ide_read_pri, ide_read_pri_w, ide_read_pri_l, ide_write_pri, ide_write_pri_w, ide_write_pri_l, NULL); } if (ide_side_main[0] & 0x300) { - ide_log("Enabling primary side (%04X)...\n", ide_side_main[0]); +#ifdef ENABLE_HDC_LOG + hdc_log("Enabling primary side (%04X)...\n", ide_side_main[0]); +#endif io_sethandler(ide_side_main[0], 0x0001, ide_read_pri, NULL, NULL, ide_write_pri, NULL, NULL , NULL); } } diff --git a/src/disk/hdc_ide.h b/src/disk/hdc_ide.h index 3a0618d..c98555f 100644 --- a/src/disk/hdc_ide.h +++ b/src/disk/hdc_ide.h @@ -8,7 +8,7 @@ * * Definitions for the IDE module. * - * Version: @(#)hdc_ide.h 1.0.5 2018/03/27 + * Version: @(#)hdc_ide.h 1.0.6 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, diff --git a/src/disk/hdc_mfm_at.c b/src/disk/hdc_mfm_at.c index ada7385..2a3fe93 100644 --- a/src/disk/hdc_mfm_at.c +++ b/src/disk/hdc_mfm_at.c @@ -12,7 +12,7 @@ * based design. Most cards were WD1003-WA2 or -WAH, where the * -WA2 cards had a floppy controller as well (to save space.) * - * Version: @(#)hdc_mfm_at.c 1.0.4 2018/04/01 + * Version: @(#)hdc_mfm_at.c 1.0.4 2018/04/02 * * Authors: Fred N. van Kempen, * Sarah Walker, @@ -128,7 +128,8 @@ typedef struct { } mfm_t; -static __inline void irq_raise(mfm_t *mfm) +static __inline void +irq_raise(mfm_t *mfm) { /* If not already pending.. */ if (! mfm->irqstat) { @@ -144,7 +145,8 @@ static __inline void irq_raise(mfm_t *mfm) } -static __inline void irq_lower(mfm_t *mfm) +static __inline void +irq_lower(mfm_t *mfm) { /* If raised.. */ if (mfm->irqstat) { @@ -178,31 +180,41 @@ get_sector(mfm_t *mfm, off64_t *addr) drive_t *drive = &mfm->drives[mfm->drvsel]; if (drive->curcyl != mfm->cylinder) { - pclog("WD1003(%d) sector: wrong cylinder\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) sector: wrong cylinder\n"); +#endif return(1); } if (mfm->head > drive->cfg_hpc) { - pclog("WD1003(%d) get_sector: past end of configured heads\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) get_sector: past end of configured heads\n", mfm->drvsel); +#endif return(1); } if (mfm->sector >= drive->cfg_spt+1) { - pclog("WD1003(%d) get_sector: past end of configured sectors\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) get_sector: past end of configured sectors\n", mfm->drvsel); +#endif return(1); } #if 1 /* We should check this in the SET_DRIVE_PARAMETERS command! --FvK */ if (mfm->head > drive->hpc) { - pclog("WD1003(%d) get_sector: past end of heads\n", mfm->drvsel); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) get_sector: past end of heads\n", mfm->drvsel); +#endif return(1); } if (mfm->sector >= drive->spt+1) { - pclog("WD1003(%d) get_sector: past end of sectors\n", mfm->drvsel); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) get_sector: past end of sectors\n", mfm->drvsel); +#endif return(1); } #endif @@ -239,8 +251,10 @@ mfm_cmd(mfm_t *mfm, uint8_t val) if (! drive->present) { /* This happens if sofware polls all drives. */ - pclog("WD1003(%d) command %02x on non-present drive\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) command %02x on non-present drive\n", mfm->drvsel, val); +#endif mfm->command = 0xff; mfm->status = STAT_BUSY; timer_clock(); @@ -256,8 +270,8 @@ mfm_cmd(mfm_t *mfm, uint8_t val) switch (val & 0xf0) { case CMD_RESTORE: drive->steprate = (val & 0x0f); -#if ENABLE_HDC_LOG - pclog("WD1003(%d) restore, step=%d\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) restore, step=%d\n", mfm->drvsel, drive->steprate); #endif drive->curcyl = 0; @@ -281,8 +295,8 @@ mfm_cmd(mfm_t *mfm, uint8_t val) case CMD_READ+1: case CMD_READ+2: case CMD_READ+3: -#if ENABLE_HDC_LOG - pclog("WD1003(%d) read, opt=%d\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) read, opt=%d\n", mfm->drvsel, val&0x03); #endif mfm->command = (val & 0xf0); @@ -298,8 +312,8 @@ mfm_cmd(mfm_t *mfm, uint8_t val) case CMD_WRITE+1: case CMD_WRITE+2: case CMD_WRITE+3: -#if ENABLE_HDC_LOG - pclog("WD1003(%d) write, opt=%d\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) write, opt=%d\n", mfm->drvsel, val & 0x03); #endif mfm->command = (val & 0xf0); @@ -353,13 +367,17 @@ mfm_cmd(mfm_t *mfm, uint8_t val) /* Only accept after RESET or DIAG. */ drive->cfg_spt = mfm->secount; drive->cfg_hpc = mfm->head+1; - pclog("WD1003(%d) parameters: tracks=%d, spt=%i, hpc=%i\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) parameters: tracks=%d, spt=%i, hpc=%i\n", mfm->drvsel, drive->tracks, drive->cfg_spt, drive->cfg_hpc); +#endif } else { - pclog("WD1003(%d) parameters: tracks=%d,spt=%i,hpc=%i (IGNORED)\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) parameters: tracks=%d,spt=%i,hpc=%i (IGNORED)\n", mfm->drvsel, drive->tracks, drive->cfg_spt, drive->cfg_hpc); +#endif } mfm->command = 0x00; mfm->status = STAT_READY|STAT_DSC; @@ -368,7 +386,9 @@ mfm_cmd(mfm_t *mfm, uint8_t val) break; default: - pclog("WD1003: bad command %02X\n", val); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003: bad command %02X\n", val); +#endif mfm->status = STAT_BUSY; timer_clock(); mfm->callback = 200LL*MFM_TIME; @@ -402,8 +422,8 @@ mfm_write(uint16_t port, uint8_t val, void *priv) { mfm_t *mfm = (mfm_t *)priv; -#if ENABLE_HDC_LOG > 1 - pclog("WD1003 write(%04x, %02x)\n", port, val); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003 write(%04x, %02x)\n", port, val); #endif switch (port) { case 0x01f0: /* data */ @@ -538,8 +558,8 @@ mfm_read(uint16_t port, void *priv) default: break; } -#if ENABLE_HDC_LOG > 1 - pclog("WD1003 read(%04x) = %02x\n", port, ret); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003 read(%04x) = %02x\n", port, ret); #endif return(ret); @@ -551,8 +571,8 @@ do_seek(mfm_t *mfm) { drive_t *drive = &mfm->drives[mfm->drvsel]; -#if ENABLE_HDC_LOG - pclog("WD1003(%d) seek(%d) max=%d\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) seek(%d) max=%d\n", mfm->drvsel,mfm->cylinder,drive->tracks); #endif if (mfm->cylinder < drive->tracks) @@ -571,8 +591,8 @@ do_callback(void *priv) mfm->callback = 0LL; if (mfm->reset) { -#if ENABLE_HDC_LOG - pclog("WD1003(%d) reset\n", mfm->drvsel); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) reset\n", mfm->drvsel); #endif mfm->status = STAT_READY|STAT_DSC; mfm->error = 1; @@ -593,8 +613,8 @@ do_callback(void *priv) switch (mfm->command) { case CMD_SEEK: -#if ENABLE_HDC_LOG - pclog("WD1003(%d) seek, step=%d\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) seek, step=%d\n", mfm->drvsel, drive->steprate); #endif do_seek(mfm); @@ -603,8 +623,8 @@ do_callback(void *priv) break; case CMD_READ: -#if ENABLE_HDC_LOG - pclog("WD1003(%d) read(%d,%d,%d)\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) read(%d,%d,%d)\n", mfm->drvsel, mfm->cylinder, mfm->head, mfm->sector); #endif do_seek(mfm); @@ -624,8 +644,8 @@ do_callback(void *priv) break; case CMD_WRITE: -#if ENABLE_HDC_LOG - pclog("WD1003(%d) write(%d,%d,%d)\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) write(%d,%d,%d)\n", mfm->drvsel, mfm->cylinder, mfm->head, mfm->sector); #endif do_seek(mfm); @@ -653,8 +673,8 @@ do_callback(void *priv) break; case CMD_VERIFY: -#if ENABLE_HDC_LOG - pclog("WD1003(%d) verify(%d,%d,%d)\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) verify(%d,%d,%d)\n", mfm->drvsel, mfm->cylinder, mfm->head, mfm->sector); #endif do_seek(mfm); @@ -665,8 +685,8 @@ do_callback(void *priv) break; case CMD_FORMAT: -#if ENABLE_HDC_LOG - pclog("WD1003(%d) format(%d,%d)\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) format(%d,%d)\n", mfm->drvsel, mfm->cylinder, mfm->head); #endif do_seek(mfm); @@ -685,8 +705,8 @@ do_callback(void *priv) break; case CMD_DIAGNOSE: -#if ENABLE_HDC_LOG - pclog("WD1003(%d) diag\n", mfm->drvsel); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) diag\n", mfm->drvsel); #endif drive->steprate = 0x0f; mfm->error = 1; @@ -695,8 +715,10 @@ do_callback(void *priv) break; default: - pclog("WD1003(%d) callback on unknown command %02x\n", +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d) callback on unknown command %02x\n", mfm->drvsel, mfm->command); +#endif mfm->status = STAT_READY|STAT_ERR|STAT_DSC; mfm->error = ERR_ABRT; irq_raise(mfm); @@ -730,7 +752,9 @@ mfm_init(const device_t *info) mfm_t *mfm; int c, d; - pclog("WD1003: ISA MFM/RLL Fixed Disk Adapter initializing ...\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003: ISA MFM/RLL Fixed Disk Adapter initializing ...\n"); +#endif mfm = malloc(sizeof(mfm_t)); memset(mfm, 0x00, sizeof(mfm_t)); @@ -739,8 +763,10 @@ mfm_init(const device_t *info) if ((hdd[d].bus == HDD_BUS_MFM) && (hdd[d].mfm_channel < MFM_NUM)) { loadhd(mfm, hdd[d].mfm_channel, d, hdd[d].fn); - pclog("WD1003(%d): (%ls) geometry %d/%d/%d\n", c, hdd[d].fn, +#ifdef ENABLE_HDC_LOG + hdc_log("WD1003(%d): (%ls) geometry %d/%d/%d\n", c, hdd[d].fn, (int)hdd[d].tracks, (int)hdd[d].hpc, (int)hdd[d].spt); +#endif if (++c >= MFM_NUM) break; } diff --git a/src/disk/hdc_mfm_xt.c b/src/disk/hdc_mfm_xt.c index 1035c88..c5c5363 100644 --- a/src/disk/hdc_mfm_xt.c +++ b/src/disk/hdc_mfm_xt.c @@ -41,7 +41,7 @@ * Since all controllers (including the ones made by DTC) use * (mostly) the same API, we keep them all in this module. * - * Version: @(#)hdc_mfm_xt.c 1.0.5 2018/03/31 + * Version: @(#)hdc_mfm_xt.c 1.0.5 2018/04/02 * * Authors: Fred N. van Kempen, * Sarah Walker, @@ -261,7 +261,7 @@ mfm_write(uint16_t port, uint8_t val, void *priv) break; default: - fatal("Write data unknown state - %i %02x\n", dev->state, dev->status); + hdc_log("Write data unknown state - %i %02x\n", dev->state, dev->status); } break; @@ -301,7 +301,9 @@ mfm_error(mfm_t *dev, uint8_t error) dev->completion_byte |= 0x02; dev->error = error; - pclog("mfm_error - %02x\n", dev->error); +#ifdef ENABLE_HDC_LOG + hdc_log("mfm_error - %02x\n", dev->error); +#endif } @@ -312,22 +314,30 @@ get_sector(mfm_t *dev, off64_t *addr) int heads = drive->cfg_hpc; if (drive->current_cylinder != dev->cylinder) { - pclog("mfm_get_sector: wrong cylinder\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("mfm_get_sector: wrong cylinder\n"); +#endif dev->error = ERR_ILLEGAL_SECTOR_ADDRESS; return(1); } if (dev->head > heads) { - pclog("mfm_get_sector: past end of configured heads\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("mfm_get_sector: past end of configured heads\n"); +#endif dev->error = ERR_ILLEGAL_SECTOR_ADDRESS; return(1); } if (dev->head > drive->hpc) { - pclog("mfm_get_sector: past end of heads\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("mfm_get_sector: past end of heads\n"); +#endif dev->error = ERR_ILLEGAL_SECTOR_ADDRESS; return(1); } if (dev->sector >= 17) { - pclog("mfm_get_sector: past end of sectors\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("mfm_get_sector: past end of sectors\n"); +#endif dev->error = ERR_ILLEGAL_SECTOR_ADDRESS; return(1); } @@ -418,7 +428,9 @@ mfm_callback(void *priv) dev->sector_count = dev->command[4]; do { if (get_sector(dev, &addr)) { - pclog("get_sector failed\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("get_sector failed\n"); +#endif mfm_error(dev, dev->error); mfm_complete(dev); return; @@ -445,7 +457,9 @@ mfm_callback(void *priv) dev->head = dev->command[1] & 0x1f; if (get_sector(dev, &addr)) { - pclog("get_sector failed\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("get_sector failed\n"); +#endif mfm_error(dev, dev->error); mfm_complete(dev); return; @@ -493,7 +507,9 @@ mfm_callback(void *priv) int val = dma_channel_write(3, dev->sector_buf[dev->data_pos]); if (val == DMA_NODATA) { - pclog("CMD_READ_SECTORS out of data!\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("CMD_READ_SECTORS out of data!\n"); +#endif dev->status = STAT_BSY | STAT_CD | STAT_IO | STAT_REQ; dev->callback = MFM_TIME; return; @@ -566,7 +582,9 @@ mfm_callback(void *priv) int val = dma_channel_read(3); if (val == DMA_NODATA) { - pclog("CMD_WRITE_SECTORS out of data!\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("CMD_WRITE_SECTORS out of data!\n"); +#endif dev->status = STAT_BSY | STAT_CD | STAT_IO | STAT_REQ; dev->callback = MFM_TIME; return; @@ -640,7 +658,9 @@ mfm_callback(void *priv) case STATE_RECEIVED_DATA: drive->cfg_cyl = dev->data[1] | (dev->data[0] << 8); drive->cfg_hpc = dev->data[2]; - pclog("Drive %i: cylinders=%i, heads=%i\n", dev->drive_sel, drive->cfg_cyl, drive->cfg_hpc); +#ifdef ENABLE_HDC_LOG + hdc_log("Drive %i: cylinders=%i, heads=%i\n", dev->drive_sel, drive->cfg_cyl, drive->cfg_hpc); +#endif mfm_complete(dev); break; @@ -669,7 +689,7 @@ mfm_callback(void *priv) int val = dma_channel_read(3); if (val == DMA_NODATA) { - pclog("CMD_WRITE_SECTOR_BUFFER out of data!\n"); + hdc_log("CMD_WRITE_SECTOR_BUFFER out of data!\n"); dev->status = STAT_BSY | STAT_CD | STAT_IO | STAT_REQ; dev->callback = MFM_TIME; return; @@ -718,7 +738,9 @@ mfm_callback(void *priv) dev->data[0] = drive->tracks & 0xff; dev->data[1] = 17 | ((drive->tracks >> 2) & 0xc0); dev->data[2] = drive->hpc-1; - pclog("Get drive params %02x %02x %02x %i\n", dev->data[0], dev->data[1], dev->data[2], drive->tracks); +#ifdef ENABLE_HDC_LOG + hdc_log("Get drive params %02x %02x %02x %i\n", dev->data[0], dev->data[1], dev->data[2], drive->tracks); +#endif break; case STATE_SENT_DATA: @@ -824,9 +846,11 @@ mfm_set_switches(mfm_t *dev) } } +#ifdef ENABLE_HDC_LOG if (c == 4) - pclog("WARNING: drive %d has unsupported format %d/%d/%d !\n", + hdc_log("WARNING: drive %d has unsupported format %d/%d/%d !\n", d, drive->tracks, drive->hpc, drive->spt); +#endif } } @@ -841,17 +865,23 @@ mfm_init(const device_t *info) dev = malloc(sizeof(mfm_t)); memset(dev, 0x00, sizeof(mfm_t)); - pclog("MFM: looking for disks..\n"); +#ifdef ENABLE_HDC_LOG + hdc_log("MFM: looking for disks..\n"); +#endif c = 0; for (i=0; i MFM_NUM) break; } } - pclog("MFM: %d disks loaded.\n", c); +#ifdef ENABLE_HDC_LOG + hdc_log("MFM: %d disks loaded.\n", c); +#endif switch(info->local) { case 0: /* Xebec */ diff --git a/src/disk/hdc_xtide.c b/src/disk/hdc_xtide.c index 2cf6ef5..2db9ae2 100644 --- a/src/disk/hdc_xtide.c +++ b/src/disk/hdc_xtide.c @@ -21,7 +21,7 @@ * already on their way out, the newer IDE standard based on the * PC/AT controller and 16b design became the IDE we now know. * - * Version: @(#)hdc_xtide.c 1.0.4 2018/03/31 + * Version: @(#)hdc_xtide.c 1.0.5 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, diff --git a/src/disk/hdd.c b/src/disk/hdd.c index 050755d..8729398 100644 --- a/src/disk/hdd.c +++ b/src/disk/hdd.c @@ -8,7 +8,7 @@ * * Common code to handle all sorts of hard disk images. * - * Version: @(#)hdd.c 1.0.1 2018/02/14 + * Version: @(#)hdd.c 1.0.2 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -37,7 +37,9 @@ #include #include #include +#include #include +#define HAVE_STDARG_H #include "../emu.h" #include "../plat.h" #include "../ui.h" @@ -45,6 +47,24 @@ hard_disk_t hdd[HDD_NUM]; +#ifdef ENABLE_HDD_LOG +int hdd_do_log = ENABLE_HDD_LOG; +#endif + + +void +hdd_log(const char *fmt, ...) +{ +#ifdef ENABLE_HDD_LOG + va_list ap; + + if (hdd_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +#endif +} int @@ -73,8 +93,7 @@ no_cdrom: return(HDD_BUS_MFM); } - /* FIXME: delete 'rll' in a year or so.. --FvK */ - if (!strcmp(str, "esdi") || !strcmp(str, "rll")) { + if (! strcmp(str, "esdi")) { if (cdrom) goto no_cdrom; return(HDD_BUS_ESDI); diff --git a/src/disk/hdd.h b/src/disk/hdd.h index 768ad73..5134999 100644 --- a/src/disk/hdd.h +++ b/src/disk/hdd.h @@ -8,7 +8,7 @@ * * Definitions for the hard disk image handler. * - * Version: @(#)hdd.h 1.0.3 2018/03/31 + * Version: @(#)hdd.h 1.0.4 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -92,10 +92,12 @@ typedef struct { } hard_disk_t; -extern hard_disk_t hdd[HDD_NUM]; extern const hddtab_t hdd_table[128]; +extern hard_disk_t hdd[HDD_NUM]; +extern int hdd_do_log; +extern void hdd_log(const char *fmt, ...); extern int hdd_init(void); extern int hdd_string_to_bus(char *str, int cdrom); extern char *hdd_bus_to_string(int bus, int cdrom); diff --git a/src/disk/hdd_image.c b/src/disk/hdd_image.c index feeb7db..36053e5 100644 --- a/src/disk/hdd_image.c +++ b/src/disk/hdd_image.c @@ -8,7 +8,7 @@ * * Handling of hard disk image files. * - * Version: @(#)hdd_image.c 1.0.3 2018/03/31 + * Version: @(#)hdd_image.c 1.0.4 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -41,436 +41,461 @@ #include #include #include -#include #include #include -#define HAVE_STDARG_H #include "../emu.h" #include "../plat.h" #include "hdd.h" -typedef struct -{ - FILE *file; - uint32_t base; - uint32_t last_sector; - uint8_t type; - uint8_t loaded; +typedef struct { + FILE *file; + uint32_t base; + uint32_t last_sector; + uint8_t type; + uint8_t loaded; } hdd_image_t; -hdd_image_t hdd_images[HDD_NUM]; - -static char empty_sector[512]; -static char *empty_sector_1mb; +hdd_image_t hdd_images[HDD_NUM]; -#ifdef ENABLE_HDD_LOG -int hdd_image_do_log = ENABLE_HDD_LOG; -#endif +static char empty_sector[512]; +static char *empty_sector_1mb; -static void -hdd_image_log(const char *fmt, ...) +int +image_is_hdi(const wchar_t *s) { -#ifdef ENABLE_HDD_LOG - va_list ap; + wchar_t ext[5] = { 0, 0, 0, 0, 0 }; + char *ws = (char *)s; + int len; - if (hdd_image_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -#endif -} + len = wcslen(s); + if ((len < 4) || (s[0] == L'.')) return 0; + memcpy(ext, ws + ((len - 4) << 1), 8); + if (! wcscasecmp(ext, L".HDI")) return 1; -int image_is_hdi(const wchar_t *s) -{ - int len; - wchar_t ext[5] = { 0, 0, 0, 0, 0 }; - char *ws = (char *) s; - len = wcslen(s); - if ((len < 4) || (s[0] == L'.')) return 0; - - memcpy(ext, ws + ((len - 4) << 1), 8); - if (! wcscasecmp(ext, L".HDI")) return 1; - - return 0; + return 0; } int image_is_hdx(const wchar_t *s, int check_signature) { - int len; - FILE *f; - uint64_t filelen; - uint64_t signature; - char *ws = (char *) s; - wchar_t ext[5] = { 0, 0, 0, 0, 0 }; - len = wcslen(s); - if ((len < 4) || (s[0] == L'.')) return 0; + wchar_t ext[5] = { 0, 0, 0, 0, 0 }; + char *ws = (char *)s; + uint64_t signature; + uint64_t filelen; + FILE *f; + int len; - memcpy(ext, ws + ((len - 4) << 1), 8); - if (wcscasecmp(ext, L".HDX") == 0) { - if (check_signature) { - f = plat_fopen((wchar_t *)s, L"rb"); - if (!f) - return 0; - fseeko64(f, 0, SEEK_END); - filelen = ftello64(f); - fseeko64(f, 0, SEEK_SET); - if (filelen < 44) - return 0; - fread(&signature, 1, 8, f); - fclose(f); - if (signature == 0xD778A82044445459ll) - return 1; + len = wcslen(s); + if ((len < 4) || (s[0] == L'.')) return 0; + memcpy(ext, ws + ((len - 4) << 1), 8); + if (wcscasecmp(ext, L".HDX") == 0) { + if (check_signature) { + f = plat_fopen((wchar_t *)s, L"rb"); + if (!f) return 0; - } + fseeko64(f, 0, SEEK_END); + filelen = ftello64(f); + fseeko64(f, 0, SEEK_SET); + if (filelen < 44) + return 0; + fread(&signature, 1, 8, f); + fclose(f); + if (signature == 0xD778A82044445459ll) + return 1; - return 1; + return 0; } - return 0; + return 1; + } + + return 0; } -int hdd_image_load(int id) +int +hdd_image_load(int id) { - uint32_t sector_size = 512; - uint32_t zero = 0; - uint64_t signature = 0xD778A82044445459ll; - uint64_t s = 0, t, full_size = 0; - int spt = 0, hpc = 0, tracks = 0; - int c, i; - wchar_t *fn = hdd[id].fn; - int is_hdx[2] = { 0, 0 }; + uint64_t signature = 0xD778A82044445459ll; + uint64_t s = 0, t, full_size = 0; + int spt = 0, hpc = 0, tracks = 0; + uint32_t sector_size = 512; + wchar_t *fn = hdd[id].fn; + int is_hdx[2] = { 0, 0 }; + uint32_t zero = 0; + int c, i; - memset(empty_sector, 0, sizeof(empty_sector)); + memset(empty_sector, 0, sizeof(empty_sector)); - hdd_images[id].base = 0; + hdd_images[id].base = 0; - if (hdd_images[id].loaded) { - if (hdd_images[id].file) { - fclose(hdd_images[id].file); - hdd_images[id].file = NULL; - } - hdd_images[id].loaded = 0; + if (hdd_images[id].loaded) { + if (hdd_images[id].file) { + fclose(hdd_images[id].file); + hdd_images[id].file = NULL; } + hdd_images[id].loaded = 0; + } - is_hdx[0] = image_is_hdx(fn, 0); - is_hdx[1] = image_is_hdx(fn, 1); + is_hdx[0] = image_is_hdx(fn, 0); + is_hdx[1] = image_is_hdx(fn, 1); - /* Try to open existing hard disk image */ - if (fn[0] == '.') { - hdd_image_log("File name starts with .\n"); - memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; - } - hdd_images[id].file = plat_fopen(fn, L"rb+"); - if (hdd_images[id].file == NULL) { - /* Failed to open existing hard disk image */ - if (errno == ENOENT) { - /* Failed because it does not exist, - so try to create new file */ - if (hdd[id].wp) { - hdd_image_log("A write-protected image must exist\n"); - memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; - } + /* Try to open existing hard disk image */ + if (fn[0] == '.') { +#ifdef ENABLE_HDD_LOG + hdd_log("File name starts with .\n"); +#endif + memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); + return 0; + } - hdd_images[id].file = plat_fopen(fn, L"wb+"); - if (hdd_images[id].file == NULL) { - hdd_image_log("Unable to open image\n"); - memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; - } else { - if (image_is_hdi(fn)) { - full_size = hdd[id].spt * hdd[id].hpc * hdd[id].tracks * 512; - hdd_images[id].base = 0x1000; - fwrite(&zero, 1, 4, hdd_images[id].file); - fwrite(&zero, 1, 4, hdd_images[id].file); - fwrite(&(hdd_images[id].base), 1, 4, hdd_images[id].file); - fwrite(&full_size, 1, 4, hdd_images[id].file); - fwrite(§or_size, 1, 4, hdd_images[id].file); - fwrite(&(hdd[id].spt), 1, 4, hdd_images[id].file); - fwrite(&(hdd[id].hpc), 1, 4, hdd_images[id].file); - fwrite(&(hdd[id].tracks), 1, 4, hdd_images[id].file); - for (c = 0; c < 0x3f8; c++) - fwrite(&zero, 1, 4, hdd_images[id].file); - hdd_images[id].type = 1; - } else if (is_hdx[0]) { - full_size = hdd[id].spt * hdd[id].hpc * hdd[id].tracks * 512; - hdd_images[id].base = 0x28; - fwrite(&signature, 1, 8, hdd_images[id].file); - fwrite(&full_size, 1, 8, hdd_images[id].file); - fwrite(§or_size, 1, 4, hdd_images[id].file); - fwrite(&(hdd[id].spt), 1, 4, hdd_images[id].file); - fwrite(&(hdd[id].hpc), 1, 4, hdd_images[id].file); - fwrite(&(hdd[id].tracks), 1, 4, hdd_images[id].file); - fwrite(&zero, 1, 4, hdd_images[id].file); - fwrite(&zero, 1, 4, hdd_images[id].file); - hdd_images[id].type = 2; - } else { - hdd_images[id].type = 0; - } - hdd_images[id].last_sector = 0; - } - - s = full_size = hdd[id].spt * hdd[id].hpc * hdd[id].tracks * 512; - - goto prepare_new_hard_disk; - } else { - /* Failed for another reason */ - hdd_image_log("Failed for another reason\n"); + hdd_images[id].file = plat_fopen(fn, L"rb+"); + if (hdd_images[id].file == NULL) { + /* Failed to open existing hard disk image */ + if (errno == ENOENT) { + /* Failed because it does not exist, + so try to create new file */ + if (hdd[id].wp) { +#ifdef ENABLE_HDD_LOG + hdd_log("A write-protected image must exist\n"); +#endif memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); return 0; } - } else { - if (image_is_hdi(fn)) { - fseeko64(hdd_images[id].file, 0x8, SEEK_SET); - fread(&(hdd_images[id].base), 1, 4, hdd_images[id].file); - fseeko64(hdd_images[id].file, 0xC, SEEK_SET); - full_size = 0; - fread(&full_size, 1, 4, hdd_images[id].file); - fseeko64(hdd_images[id].file, 0x10, SEEK_SET); - fread(§or_size, 1, 4, hdd_images[id].file); - if (sector_size != 512) { - /* Sector size is not 512 */ - hdd_image_log("HDI: Sector size is not 512\n"); - fclose(hdd_images[id].file); - hdd_images[id].file = NULL; - memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; - } - fread(&spt, 1, 4, hdd_images[id].file); - fread(&hpc, 1, 4, hdd_images[id].file); - fread(&tracks, 1, 4, hdd_images[id].file); - if (hdd[id].bus == HDD_BUS_SCSI_REMOVABLE) { - if ((spt != hdd[id].spt) || (hpc != hdd[id].hpc) || (tracks != hdd[id].tracks)) { - hdd_image_log("HDI: Geometry mismatch\n"); - fclose(hdd_images[id].file); - hdd_images[id].file = NULL; - memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; - } - } - hdd[id].spt = (uint8_t)spt; - hdd[id].hpc = (uint8_t)hpc; - hdd[id].tracks = (uint16_t)tracks; - hdd_images[id].type = 1; - } else if (is_hdx[1]) { - hdd_images[id].base = 0x28; - fseeko64(hdd_images[id].file, 8, SEEK_SET); - fread(&full_size, 1, 8, hdd_images[id].file); - fseeko64(hdd_images[id].file, 0x10, SEEK_SET); - fread(§or_size, 1, 4, hdd_images[id].file); - if (sector_size != 512) { - /* Sector size is not 512 */ - hdd_image_log("HDX: Sector size is not 512\n"); - fclose(hdd_images[id].file); - hdd_images[id].file = NULL; - memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; - } - fread(&spt, 1, 4, hdd_images[id].file); - fread(&hpc, 1, 4, hdd_images[id].file); - fread(&tracks, 1, 4, hdd_images[id].file); - if (hdd[id].bus == HDD_BUS_SCSI_REMOVABLE) { - if ((spt != hdd[id].spt) || (hpc != hdd[id].hpc) || (tracks != hdd[id].tracks)) { - hdd_image_log("HDX: Geometry mismatch\n"); - fclose(hdd_images[id].file); - hdd_images[id].file = NULL; - memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); - return 0; - } - } - hdd[id].spt = (uint8_t)spt; - hdd[id].hpc = (uint8_t)hpc; - hdd[id].tracks = (uint16_t)tracks; - fread(&(hdd[id].at_spt), 1, 4, hdd_images[id].file); - fread(&(hdd[id].at_hpc), 1, 4, hdd_images[id].file); - hdd_images[id].type = 2; + + hdd_images[id].file = plat_fopen(fn, L"wb+"); + if (hdd_images[id].file == NULL) { +#ifdef ENABLE_HDD_LOG + hdd_log("Unable to open image\n"); +#endif + memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); + return 0; } else { - full_size = hdd[id].spt * hdd[id].hpc * hdd[id].tracks * 512; - hdd_images[id].type = 0; - } - } - - fseeko64(hdd_images[id].file, 0, SEEK_END); - if (ftello64(hdd_images[id].file) < (int64_t)(full_size + hdd_images[id].base)) { - s = (full_size + hdd_images[id].base) - ftello64(hdd_images[id].file); -prepare_new_hard_disk: - s >>= 9; - t = (s >> 11) << 11; - s -= t; - t >>= 11; - - empty_sector_1mb = (char *) malloc(1048576); - memset(empty_sector_1mb, 0, 1048576); - - if (s > 0) { - for (i = 0; i < s; i++) { - fwrite(empty_sector, 1, 512, hdd_images[id].file); + if (image_is_hdi(fn)) { + full_size = hdd[id].spt * hdd[id].hpc * hdd[id].tracks * 512; + hdd_images[id].base = 0x1000; + fwrite(&zero, 1, 4, hdd_images[id].file); + fwrite(&zero, 1, 4, hdd_images[id].file); + fwrite(&(hdd_images[id].base), 1, 4, hdd_images[id].file); + fwrite(&full_size, 1, 4, hdd_images[id].file); + fwrite(§or_size, 1, 4, hdd_images[id].file); + fwrite(&(hdd[id].spt), 1, 4, hdd_images[id].file); + fwrite(&(hdd[id].hpc), 1, 4, hdd_images[id].file); + fwrite(&(hdd[id].tracks), 1, 4, hdd_images[id].file); + for (c = 0; c < 0x3f8; c++) + fwrite(&zero, 1, 4, hdd_images[id].file); + hdd_images[id].type = 1; + } else if (is_hdx[0]) { + full_size = hdd[id].spt * hdd[id].hpc * hdd[id].tracks * 512; + hdd_images[id].base = 0x28; + fwrite(&signature, 1, 8, hdd_images[id].file); + fwrite(&full_size, 1, 8, hdd_images[id].file); + fwrite(§or_size, 1, 4, hdd_images[id].file); + fwrite(&(hdd[id].spt), 1, 4, hdd_images[id].file); + fwrite(&(hdd[id].hpc), 1, 4, hdd_images[id].file); + fwrite(&(hdd[id].tracks), 1, 4, hdd_images[id].file); + fwrite(&zero, 1, 4, hdd_images[id].file); + fwrite(&zero, 1, 4, hdd_images[id].file); + hdd_images[id].type = 2; + } else { + hdd_images[id].type = 0; } + hdd_images[id].last_sector = 0; } - if (t > 0) { - for (i = 0; i < t; i++) { - fwrite(empty_sector_1mb, 1, 1045876, hdd_images[id].file); - } - } + s = full_size = hdd[id].spt * hdd[id].hpc * hdd[id].tracks * 512; - free(empty_sector_1mb); + goto prepare_new_hard_disk; + } else { + /* Failed for another reason */ +#ifdef ENABLE_HDD_LOG + hdd_log("Failed for another reason\n"); +#endif + memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); + return 0; } - - hdd_images[id].last_sector = (uint32_t) (full_size >> 9) - 1; - - hdd_images[id].loaded = 1; - - return 1; -} - -void hdd_image_seek(uint8_t id, uint32_t sector) -{ - off64_t addr = sector; - addr = (uint64_t)sector * 512; - - fseeko64(hdd_images[id].file, addr + hdd_images[id].base, SEEK_SET); -} - -void hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) -{ - fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); - fread(buffer, 1, count * 512, hdd_images[id].file); -} - -uint32_t hdd_sectors(uint8_t id) -{ - fseeko64(hdd_images[id].file, 0, SEEK_END); - return (uint32_t) (ftello64(hdd_images[id].file) >> 9); -} - -int hdd_image_read_ex(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) -{ - uint32_t transfer_sectors = count; - uint32_t sectors = hdd_sectors(id); - - if ((sectors - sector) < transfer_sectors) - transfer_sectors = sectors - sector; - - fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); - fread(buffer, 1, transfer_sectors * 512, hdd_images[id].file); - - if (count != transfer_sectors) - return 1; - - return 0; -} - -void hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) -{ - fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); - fwrite(buffer, count * 512, 1, hdd_images[id].file); -} - -int hdd_image_write_ex(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) -{ - uint32_t transfer_sectors = count; - uint32_t sectors = hdd_sectors(id); - - if ((sectors - sector) < transfer_sectors) - transfer_sectors = sectors - sector; - - fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); - fwrite(buffer, transfer_sectors * 512, 1, hdd_images[id].file); - - if (count != transfer_sectors) - return 1; - - return 0; -} - -void hdd_image_zero(uint8_t id, uint32_t sector, uint32_t count) -{ - uint32_t i; - - fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); - for (i = 0; i < count; i++) - fwrite(empty_sector, 512, 1, hdd_images[id].file); -} - -int hdd_image_zero_ex(uint8_t id, uint32_t sector, uint32_t count) -{ - uint32_t i; - - uint32_t transfer_sectors = count; - uint32_t sectors = hdd_sectors(id); - - if ((sectors - sector) < transfer_sectors) - transfer_sectors = sectors - sector; - - fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); - for (i = 0; i < transfer_sectors; i++) - fwrite(empty_sector, 1, 512, hdd_images[id].file); - - if (count != transfer_sectors) - return 1; - - return 0; -} - -uint32_t hdd_image_get_last_sector(uint8_t id) -{ - return hdd_images[id].last_sector; -} - -uint8_t hdd_image_get_type(uint8_t id) -{ - return hdd_images[id].type; -} - -void hdd_image_specify(uint8_t id, int hpc, int spt) -{ - if (hdd_images[id].type == 2) { - hdd[id].at_hpc = (uint8_t)hpc; - hdd[id].at_spt = (uint8_t)spt; - fseeko64(hdd_images[id].file, 0x20, SEEK_SET); - fwrite(&(hdd[id].at_spt), 1, 4, hdd_images[id].file); - fwrite(&(hdd[id].at_hpc), 1, 4, hdd_images[id].file); - } -} - -void hdd_image_unload(uint8_t id, int fn_preserve) -{ - if (wcslen(hdd[id].fn) == 0) - return; - - if (hdd_images[id].loaded) { - if (hdd_images[id].file != NULL) { + } else { + if (image_is_hdi(fn)) { + fseeko64(hdd_images[id].file, 0x8, SEEK_SET); + fread(&(hdd_images[id].base), 1, 4, hdd_images[id].file); + fseeko64(hdd_images[id].file, 0xC, SEEK_SET); + full_size = 0; + fread(&full_size, 1, 4, hdd_images[id].file); + fseeko64(hdd_images[id].file, 0x10, SEEK_SET); + fread(§or_size, 1, 4, hdd_images[id].file); + if (sector_size != 512) { + /* Sector size is not 512 */ +#ifdef ENABLE_HDD_LOG + hdd_log("HDI: Sector size is not 512\n"); +#endif fclose(hdd_images[id].file); hdd_images[id].file = NULL; + memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); + return 0; + } + fread(&spt, 1, 4, hdd_images[id].file); + fread(&hpc, 1, 4, hdd_images[id].file); + fread(&tracks, 1, 4, hdd_images[id].file); + if (hdd[id].bus == HDD_BUS_SCSI_REMOVABLE) { + if ((spt != hdd[id].spt) || (hpc != hdd[id].hpc) || (tracks != hdd[id].tracks)) { +#ifdef ENABLE_HDD_LOG + hdd_log("HDI: Geometry mismatch\n"); +#endif + fclose(hdd_images[id].file); + hdd_images[id].file = NULL; + memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); + return 0; + } + } + hdd[id].spt = (uint8_t)spt; + hdd[id].hpc = (uint8_t)hpc; + hdd[id].tracks = (uint16_t)tracks; + hdd_images[id].type = 1; + } else if (is_hdx[1]) { + hdd_images[id].base = 0x28; + fseeko64(hdd_images[id].file, 8, SEEK_SET); + fread(&full_size, 1, 8, hdd_images[id].file); + fseeko64(hdd_images[id].file, 0x10, SEEK_SET); + fread(§or_size, 1, 4, hdd_images[id].file); + if (sector_size != 512) { + /* Sector size is not 512 */ +#ifdef ENABLE_HDD_LOG + hdd_log("HDX: Sector size is not 512\n"); +#endif + fclose(hdd_images[id].file); + hdd_images[id].file = NULL; + memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); + return 0; + } + fread(&spt, 1, 4, hdd_images[id].file); + fread(&hpc, 1, 4, hdd_images[id].file); + fread(&tracks, 1, 4, hdd_images[id].file); + if (hdd[id].bus == HDD_BUS_SCSI_REMOVABLE) { + if ((spt != hdd[id].spt) || (hpc != hdd[id].hpc) || (tracks != hdd[id].tracks)) { +#ifdef ENABLE_HDD_LOG + hdd_log("HDX: Geometry mismatch\n"); +#endif + fclose(hdd_images[id].file); + hdd_images[id].file = NULL; + memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); + return 0; + } + } + hdd[id].spt = (uint8_t)spt; + hdd[id].hpc = (uint8_t)hpc; + hdd[id].tracks = (uint16_t)tracks; + fread(&(hdd[id].at_spt), 1, 4, hdd_images[id].file); + fread(&(hdd[id].at_hpc), 1, 4, hdd_images[id].file); + hdd_images[id].type = 2; + } else { + full_size = hdd[id].spt * hdd[id].hpc * hdd[id].tracks * 512; + hdd_images[id].type = 0; + } + } + + fseeko64(hdd_images[id].file, 0, SEEK_END); + if (ftello64(hdd_images[id].file) < (int64_t)(full_size + hdd_images[id].base)) { + s = (full_size + hdd_images[id].base) - ftello64(hdd_images[id].file); +prepare_new_hard_disk: + s >>= 9; + t = (s >> 11) << 11; + s -= t; + t >>= 11; + + empty_sector_1mb = (char *) malloc(1048576); + memset(empty_sector_1mb, 0, 1048576); + + if (s > 0) { + for (i = 0; i < s; i++) { + fwrite(empty_sector, 1, 512, hdd_images[id].file); } - hdd_images[id].loaded = 0; } - hdd_images[id].last_sector = -1; + if (t > 0) { + for (i = 0; i < t; i++) { + fwrite(empty_sector_1mb, 1, 1045876, hdd_images[id].file); + } + } - memset(hdd[id].prev_fn, 0, sizeof(hdd[id].prev_fn)); - if (fn_preserve) - wcscpy(hdd[id].prev_fn, hdd[id].fn); - memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); + free(empty_sector_1mb); + } + + hdd_images[id].last_sector = (uint32_t) (full_size >> 9) - 1; + + hdd_images[id].loaded = 1; + + return 1; } -void hdd_image_close(uint8_t id) + +void +hdd_image_seek(uint8_t id, uint32_t sector) { + off64_t addr = sector; + addr = (uint64_t)sector * 512; + + fseeko64(hdd_images[id].file, addr + hdd_images[id].base, SEEK_SET); +} + + +void +hdd_image_read(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) +{ + fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); + fread(buffer, 1, count * 512, hdd_images[id].file); +} + + +uint32_t +hdd_sectors(uint8_t id) +{ + fseeko64(hdd_images[id].file, 0, SEEK_END); + + return (uint32_t) (ftello64(hdd_images[id].file) >> 9); +} + + +int +hdd_image_read_ex(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) +{ + uint32_t transfer_sectors = count; + uint32_t sectors = hdd_sectors(id); + + if ((sectors - sector) < transfer_sectors) + transfer_sectors = sectors - sector; + + fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); + fread(buffer, 1, transfer_sectors * 512, hdd_images[id].file); + + if (count != transfer_sectors) + return 1; + + return 0; +} + + +void +hdd_image_write(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) +{ + fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); + fwrite(buffer, count * 512, 1, hdd_images[id].file); +} + + +int +hdd_image_write_ex(uint8_t id, uint32_t sector, uint32_t count, uint8_t *buffer) +{ + uint32_t transfer_sectors = count; + uint32_t sectors = hdd_sectors(id); + + if ((sectors - sector) < transfer_sectors) + transfer_sectors = sectors - sector; + + fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); + fwrite(buffer, transfer_sectors * 512, 1, hdd_images[id].file); + + if (count != transfer_sectors) + return 1; + + return 0; +} + + +void +hdd_image_zero(uint8_t id, uint32_t sector, uint32_t count) +{ + uint32_t i; + + fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); + for (i = 0; i < count; i++) + fwrite(empty_sector, 512, 1, hdd_images[id].file); +} + + +int +hdd_image_zero_ex(uint8_t id, uint32_t sector, uint32_t count) +{ + uint32_t transfer_sectors = count; + uint32_t sectors = hdd_sectors(id); + uint32_t i; + + if ((sectors - sector) < transfer_sectors) + transfer_sectors = sectors - sector; + + fseeko64(hdd_images[id].file, ((uint64_t)sector * 512) + hdd_images[id].base, SEEK_SET); + for (i = 0; i < transfer_sectors; i++) + fwrite(empty_sector, 1, 512, hdd_images[id].file); + + if (count != transfer_sectors) + return 1; + + return 0; +} + + +uint32_t +hdd_image_get_last_sector(uint8_t id) +{ + return hdd_images[id].last_sector; +} + + +uint8_t +hdd_image_get_type(uint8_t id) +{ + return hdd_images[id].type; +} + + +void +hdd_image_specify(uint8_t id, int hpc, int spt) +{ + if (hdd_images[id].type == 2) { + hdd[id].at_hpc = (uint8_t)hpc; + hdd[id].at_spt = (uint8_t)spt; + fseeko64(hdd_images[id].file, 0x20, SEEK_SET); + fwrite(&(hdd[id].at_spt), 1, 4, hdd_images[id].file); + fwrite(&(hdd[id].at_hpc), 1, 4, hdd_images[id].file); + } +} + + +void +hdd_image_unload(uint8_t id, int fn_preserve) +{ + if (wcslen(hdd[id].fn) == 0) return; + + if (hdd_images[id].loaded) { if (hdd_images[id].file != NULL) { fclose(hdd_images[id].file); hdd_images[id].file = NULL; } hdd_images[id].loaded = 0; + } + + hdd_images[id].last_sector = -1; + + memset(hdd[id].prev_fn, 0, sizeof(hdd[id].prev_fn)); + if (fn_preserve) + wcscpy(hdd[id].prev_fn, hdd[id].fn); + memset(hdd[id].fn, 0, sizeof(hdd[id].fn)); +} + + +void +hdd_image_close(uint8_t id) +{ + if (hdd_images[id].file != NULL) { + fclose(hdd_images[id].file); + hdd_images[id].file = NULL; + } + + hdd_images[id].loaded = 0; } diff --git a/src/disk/zip.c b/src/disk/zip.c index 3ad9841..c02111a 100644 --- a/src/disk/zip.c +++ b/src/disk/zip.c @@ -9,7 +9,7 @@ * Implementation of the Iomega ZIP drive with SCSI(-like) * commands, for both ATAPI and SCSI usage. * - * Version: @(#)zip.c 1.0.9 2018/03/27 + * Version: @(#)zip.c 1.0.10 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -481,6 +481,7 @@ int zip_do_log = ENABLE_ZIP_LOG; #endif +#ifdef ENABLE_ZIP_LOG static void zip_log(const char *format, ...) { @@ -495,6 +496,7 @@ zip_log(const char *format, ...) } #endif } +#endif int find_zip_for_channel(uint8_t channel) @@ -533,7 +535,9 @@ int zip_load(uint8_t id, wchar_t *fn) if (zip_drives[id].is_250) { if ((size != (ZIP_250_SECTORS << 9)) && (size != (ZIP_SECTORS << 9))) { +#ifdef ENABLE_ZIP_LOG zip_log("File is incorrect size for a ZIP image\nMust be exactly %i or %i bytes\n", ZIP_250_SECTORS << 9, ZIP_SECTORS << 9); +#endif fclose(zip_drives[id].f); zip_drives[id].f = NULL; zip_drives[id].medium_size = 0; @@ -542,7 +546,9 @@ int zip_load(uint8_t id, wchar_t *fn) } } else { if (size != (ZIP_SECTORS << 9)) { +#ifdef ENABLE_ZIP_LOG zip_log("File is incorrect size for a ZIP image\nMust be exactly %i bytes\n", ZIP_SECTORS << 9); +#endif fclose(zip_drives[id].f); zip_drives[id].f = NULL; zip_drives[id].medium_size = 0; @@ -672,7 +678,9 @@ void zip_init(int id, int cdb_len_setting) zip_drives[id].bus_mode |= 2; if (zip_drives[id].bus_type < ZIP_BUS_SCSI) zip_drives[id].bus_mode |= 1; +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Bus type %i, bus mode %i\n", id, zip_drives[id].bus_type, zip_drives[id].bus_mode); +#endif if (zip_drives[id].bus_type < ZIP_BUS_SCSI) zip_set_signature(id); zip[id].status = READY_STAT | DSC_STAT; @@ -699,13 +707,17 @@ int zip_current_mode(int id) if (!zip_supports_pio(id) && !zip_supports_dma(id)) return 0; if (zip_supports_pio(id) && !zip_supports_dma(id)) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Drive does not support DMA, setting to PIO\n", id); +#endif return 1; } if (!zip_supports_pio(id) && zip_supports_dma(id)) return 2; if (zip_supports_pio(id) && zip_supports_dma(id)) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Drive supports both, setting to %s\n", id, (zip[id].features & 1) ? "DMA" : "PIO", id); +#endif return (zip[id].features & 1) ? 2 : 1; } @@ -909,7 +921,9 @@ uint32_t zip_mode_sense(uint8_t id, uint8_t *buf, uint32_t pos, uint8_t type, ui buf[pos++] = zip_mode_sense_read(id, page_control, i, 0); msplen = zip_mode_sense_read(id, page_control, i, 1); buf[pos++] = msplen; +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: MODE SENSE: Page [%02X] length %i\n", id, i, msplen); +#endif for (j = 0; j < msplen; j++) buf[pos++] = zip_mode_sense_read(id, page_control, i, 2 + j); } @@ -1023,7 +1037,9 @@ static void zip_command_write_dma(uint8_t id) direction = Transfer direction (0 = read from host, 1 = write to host). */ static void zip_data_command_finish(uint8_t id, int len, int block_len, int alloc_len, int direction) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Finishing command (%02X): %i, %i, %i, %i, %i\n", id, zip[id].current_cdb[0], len, block_len, alloc_len, direction, zip[id].request_length); +#endif zip[id].pos=0; if (alloc_len >= 0) { if (alloc_len < len) { @@ -1057,7 +1073,9 @@ static void zip_data_command_finish(uint8_t id, int len, int block_len, int allo } } +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Status: %i, cylinder %i, packet length: %i, position: %i, phase: %i\n", id, zip[id].packet_status, zip[id].request_length, zip[id].packet_len, zip[id].pos, zip[id].phase); +#endif } static void zip_sense_clear(int id, int command) @@ -1089,7 +1107,9 @@ static void zip_cmd_error(uint8_t id) zip[id].packet_status = 0x80; zip[id].callback = 50LL * ZIP_TIME; zip_set_callback(id); +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: [%02X] ERROR: %02X/%02X/%02X\n", id, zip[id].current_cdb[0], zip_sense_key, zip_asc, zip_ascq); +#endif } static void zip_unit_attention(uint8_t id) @@ -1104,7 +1124,9 @@ static void zip_unit_attention(uint8_t id) zip[id].packet_status = 0x80; zip[id].callback = 50LL * ZIP_TIME; zip_set_callback(id); +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: UNIT ATTENTION\n", id); +#endif } static void zip_not_ready(uint8_t id) @@ -1189,18 +1211,24 @@ int zip_blocks(uint8_t id, uint32_t *len, int first_batch, int out) *len = zip[id].requested_blocks << 9; if (zip[id].sector_pos >= zip_drives[id].medium_size) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Trying to %s beyond the end of disk\n", id, out ? "write" : "read"); +#endif zip_lba_out_of_range(id); return 0; } +#ifdef ENABLE_ZIP_LOG zip_log("%s %i bytes of blocks...\n", out ? "Written" : "Read", *len); fseek(zip_drives[id].f, zip_drives[id].base + (zip[id].sector_pos << 9), SEEK_SET); +#endif if (out) fwrite(zipbufferb, 1, *len, zip_drives[id].f); else fread(zipbufferb, 1, *len, zip_drives[id].f); +#ifdef ENABLE_ZIP_LOG zip_log("%s %i bytes of blocks...\n", out ? "Written" : "Read", *len); +#endif zip[id].sector_pos += zip[id].requested_blocks; zip[id].sector_len -= zip[id].requested_blocks; @@ -1227,27 +1255,35 @@ int zip_pre_execution_check(uint8_t id, uint8_t *cdb) if (zip_drives[id].bus_type == ZIP_BUS_SCSI) { if (((zip[id].request_length >> 5) & 7) != zip_drives[id].scsi_device_lun) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Attempting to execute a unknown command targeted at SCSI LUN %i\n", id, ((zip[id].request_length >> 5) & 7)); +#endif zip_invalid_lun(id); return 0; } } if (!(zip_command_flags[cdb[0]] & IMPLEMENTED)) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Attempting to execute unknown command %02X over %s\n", id, cdb[0], (zip_drives[id].bus_type == ZIP_BUS_SCSI) ? "SCSI" : ((zip_drives[id].bus_type == ZIP_BUS_ATAPI_PIO_AND_DMA) ? "ATAPI PIO/DMA" : "ATAPI PIO")); +#endif zip_illegal_opcode(id); return 0; } if ((zip_drives[id].bus_type < ZIP_BUS_SCSI) && (zip_command_flags[cdb[0]] & SCSI_ONLY)) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Attempting to execute SCSI-only command %02X over ATAPI\n", id, cdb[0]); +#endif zip_illegal_opcode(id); return 0; } if ((zip_drives[id].bus_type == ZIP_BUS_SCSI) && (zip_command_flags[cdb[0]] & ATAPI_ONLY)) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Attempting to execute ATAPI-only command %02X over SCSI\n", id, cdb[0]); +#endif zip_illegal_opcode(id); return 0; } @@ -1265,16 +1301,22 @@ int zip_pre_execution_check(uint8_t id, uint8_t *cdb) if (zip[id].unit_attention == 1) { /* Only increment the unit attention phase if the command can not pass through it. */ if (!(zip_command_flags[cdb[0]] & ALLOW_UA)) { +#ifdef ENABLE_ZIP_LOG /* zip_log("ZIP %i: Unit attention now 2\n", id); */ +#endif zip[id].unit_attention = 2; +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: UNIT ATTENTION: Command %02X not allowed to pass through\n", id, cdb[0]); +#endif zip_unit_attention(id); return 0; } } else if (zip[id].unit_attention == 2) { if (cdb[0] != GPCMD_REQUEST_SENSE) { +#ifdef ENABLE_ZIP_LOG /* zip_log("ZIP %i: Unit attention now 0\n", id); */ +#endif zip[id].unit_attention = 0; } } @@ -1291,12 +1333,16 @@ int zip_pre_execution_check(uint8_t id, uint8_t *cdb) zip[id].media_status = (zip[id].unit_attention) ? MEC_NEW_MEDIA : MEC_NO_CHANGE; if ((zip_command_flags[cdb[0]] & CHECK_READY) && !ready) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Not ready (%02X)\n", id, cdb[0]); +#endif zip_not_ready(id); return 0; } +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Continuing with command %02X\n", id, cdb[0]); +#endif return 1; } @@ -1314,7 +1360,9 @@ void zip_clear_callback(uint8_t channel) static void zip_seek(uint8_t id, uint32_t pos) { +#ifdef ENABLE_ZIP_LOG /* zip_log("ZIP %i: Seek %08X\n", id, pos); */ +#endif zip[id].sector_pos = pos; } @@ -1356,7 +1404,9 @@ void zip_request_sense(uint8_t id, uint8_t *buffer, uint8_t alloc_length, int de buffer[desc ? 3 : 13]=0; } +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Reporting sense: %02X %02X %02X\n", id, buffer[2], buffer[12], buffer[13]); +#endif if (buffer[desc ? 1 : 2] == SENSE_UNIT_ATTENTION) { /* If the last remaining sense is unit attention, clear @@ -1395,20 +1445,26 @@ void zip_set_buf_len(uint8_t id, int32_t *BufLen, uint32_t *src_len) *BufLen = MIN(*src_len, (uint32_t)*BufLen); *src_len = *BufLen; } +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Actual transfer length: %i\n", id, *BufLen); +#endif } } void zip_buf_alloc(uint8_t id, uint32_t len) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Allocated buffer length: %i\n", id, len); +#endif zipbufferb = (uint8_t *) malloc(len); } void zip_buf_free(uint8_t id) { if (zipbufferb) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Freeing buffer...\n", id); +#endif free(zipbufferb); zipbufferb = NULL; } @@ -1444,6 +1500,7 @@ void zip_command(uint8_t id, uint8_t *cdb) memcpy(zip[id].current_cdb, cdb, zip[id].cdb_len); +#ifdef ENABLE_ZIP_LOG if (cdb[0] != 0) { zip_log("ZIP %i: Command 0x%02X, Sense Key %02X, Asc %02X, Ascq %02X, Unit attention: %i\n", id, cdb[0], zip_sense_key, zip_asc, zip_ascq, zip[id].unit_attention); zip_log("ZIP %i: Request length: %04X\n", id, zip[id].request_length); @@ -1452,6 +1509,7 @@ void zip_command(uint8_t id, uint8_t *cdb) cdb[0], cdb[1], cdb[2], cdb[3], cdb[4], cdb[5], cdb[6], cdb[7], cdb[8], cdb[9], cdb[10], cdb[11]); } +#endif zip[id].sector_len = 0; @@ -1564,12 +1622,16 @@ void zip_command(uint8_t id, uint8_t *cdb) case GPCMD_READ_6: zip[id].sector_len = cdb[4]; zip[id].sector_pos = ((((uint32_t) cdb[1]) & 0x1f) << 16) | (((uint32_t) cdb[2]) << 8) | ((uint32_t) cdb[3]); +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Length: %i, LBA: %i\n", id, zip[id].sector_len, zip[id].sector_pos); +#endif break; case GPCMD_READ_10: zip[id].sector_len = (cdb[7] << 8) | cdb[8]; zip[id].sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Length: %i, LBA: %i\n", id, zip[id].sector_len, zip[id].sector_pos); +#endif break; case GPCMD_READ_12: zip[id].sector_len = (((uint32_t) cdb[6]) << 24) | (((uint32_t) cdb[7]) << 16) | (((uint32_t) cdb[8]) << 8) | ((uint32_t) cdb[9]); @@ -1579,7 +1641,9 @@ void zip_command(uint8_t id, uint8_t *cdb) if (!zip[id].sector_len) { zip_set_phase(id, SCSI_PHASE_STATUS); +#ifdef ENABLE_ZIP_LOG /* zip_log("ZIP %i: All done - callback set\n", id); */ +#endif zip[id].packet_status = ZIP_PHASE_COMPLETE; zip[id].callback = 20LL * ZIP_TIME; zip_set_callback(id); @@ -1647,7 +1711,9 @@ void zip_command(uint8_t id, uint8_t *cdb) case GPCMD_WRITE_AND_VERIFY_10: zip[id].sector_len = (cdb[7] << 8) | cdb[8]; zip[id].sector_pos = (cdb[2] << 24) | (cdb[3] << 16) | (cdb[4] << 8) | cdb[5]; +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Length: %i, LBA: %i\n", id, zip[id].sector_len, zip[id].sector_pos); +#endif break; case GPCMD_VERIFY_12: case GPCMD_WRITE_12: @@ -1673,7 +1739,9 @@ void zip_command(uint8_t id, uint8_t *cdb) if (!zip[id].sector_len) { zip_set_phase(id, SCSI_PHASE_STATUS); +#ifdef ENABLE_ZIP_LOG /* zip_log("ZIP %i: All done - callback set\n", id); */ +#endif zip[id].packet_status = ZIP_PHASE_COMPLETE; zip[id].callback = 20LL * ZIP_TIME; zip_set_callback(id); @@ -1737,7 +1805,9 @@ void zip_command(uint8_t id, uint8_t *cdb) if (!zip[id].sector_len) { zip_set_phase(id, SCSI_PHASE_STATUS); +#ifdef ENABLE_ZIP_LOG /* zip_log("ZIP %i: All done - callback set\n", id); */ +#endif zip[id].packet_status = ZIP_PHASE_COMPLETE; zip[id].callback = 20LL * ZIP_TIME; zip_set_callback(id); @@ -1784,7 +1854,9 @@ void zip_command(uint8_t id, uint8_t *cdb) } zip[id].current_page_code = cdb[2] & 0x3F; +#ifdef ENABLE_ZIP_LOG zip_log("Mode sense page: %02X\n", zip[id].current_page_code); +#endif if (!(zip_mode_sense_page_flags & (1LL << zip[id].current_page_code))) { zip_invalid_field(id); @@ -1816,7 +1888,9 @@ void zip_command(uint8_t id, uint8_t *cdb) zip_set_buf_len(id, BufLen, &len); +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Reading mode page: %02X...\n", id, cdb[2]); +#endif zip_data_command_finish(id, len, len, alloc_length, 0); return; @@ -1918,7 +1992,9 @@ void zip_command(uint8_t id, uint8_t *cdb) idx += 20; break; default: +#ifdef ENABLE_ZIP_LOG zip_log("INQUIRY: Invalid page: %02X\n", cdb[2]); +#endif zip_invalid_field(id); zip_buf_free(id); return; @@ -2091,7 +2167,9 @@ atapi_out: break; } +#ifdef ENABLE_ZIP_LOG /* zip_log("ZIP %i: Phase: %02X, request length: %i\n", zip[id].phase, zip[id].request_length); */ +#endif if (zip_atapi_phase_to_scsi(id) == SCSI_PHASE_STATUS) zip_buf_free(id); @@ -2233,14 +2311,18 @@ void zip_pio_request(uint8_t id, uint8_t out) int ret = 0; if (zip_drives[id].bus_type < ZIP_BUS_SCSI) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Lowering IDE IRQ\n", id); +#endif ide_irq_lower(&(ide_drives[zip_drives[id].ide_channel])); } zip[id].status = BUSY_STAT; if (zip[id].pos >= zip[id].packet_len) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: %i bytes %s, command done\n", id, zip[id].pos, out ? "written" : "read"); +#endif zip[id].pos = zip[id].request_pos = 0; if (out) { @@ -2255,7 +2337,9 @@ void zip_pio_request(uint8_t id, uint8_t out) ui_sb_update_icon(SB_ZIP | id, 0); zip_buf_free(id); } else { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: %i bytes %s, %i bytes are still left\n", id, zip[id].pos, out ? "written" : "read", zip[id].packet_len - zip[id].pos); +#endif /* Make sure to keep pos, and reset request_pos to 0. */ /* Also make sure to not reset total_read. */ @@ -2300,7 +2384,9 @@ int zip_read_from_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun) if (id > ZIP_NUM) return 0; +#ifdef ENABLE_ZIP_LOG zip_log("Reading from SCSI DMA: SCSI ID %02X, init length %i\n", scsi_id, *BufLen); +#endif memcpy(zipbufferb, SCSIDevices[scsi_id][scsi_lun].CmdBuffer, *BufLen); return 1; } @@ -2313,11 +2399,15 @@ void zip_irq_raise(uint8_t id) int zip_read_from_dma(uint8_t id) { +#ifdef ENABLE_ZIP_LOG int32_t *BufLen = &SCSIDevices[zip_drives[id].scsi_device_id][zip_drives[id].scsi_device_lun].BufferLength; +#endif int ret = 0; +#ifdef ENABLE_ZIP_LOG int in_data_length = 0; +#endif if (zip_drives[id].bus_type == ZIP_BUS_SCSI) ret = zip_read_from_scsi_dma(zip_drives[id].scsi_device_id, zip_drives[id].scsi_device_lun); @@ -2328,11 +2418,15 @@ int zip_read_from_dma(uint8_t id) return 0; if (zip_drives[id].bus_type == ZIP_BUS_SCSI) { +#ifdef ENABLE_ZIP_LOG in_data_length = *BufLen; zip_log("ZIP %i: SCSI Input data length: %i\n", id, in_data_length); +#endif } else { +#ifdef ENABLE_ZIP_LOG in_data_length = zip[id].max_transfer_len; zip_log("ZIP %i: ATAPI Input data length: %i\n", id, in_data_length); +#endif } ret = zip_phase_data_out(id); @@ -2358,7 +2452,9 @@ int zip_write_to_ide_dma(uint8_t channel) uint8_t id = atapi_zip_drives[channel]; if (id > ZIP_NUM) { +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Drive not found\n", id); +#endif return 0; } @@ -2380,10 +2476,14 @@ int zip_write_to_scsi_dma(uint8_t scsi_id, uint8_t scsi_lun) if (id > ZIP_NUM) return 0; +#ifdef ENABLE_ZIP_LOG zip_log("Writing to SCSI DMA: SCSI ID %02X, init length %i\n", scsi_id, *BufLen); +#endif memcpy(SCSIDevices[scsi_id][scsi_lun].CmdBuffer, zipbufferb, *BufLen); +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: Data from CD buffer: %02X %02X %02X %02X %02X %02X %02X %02X\n", id, zipbufferb[0], zipbufferb[1], zipbufferb[2], zipbufferb[3], zipbufferb[4], zipbufferb[5], zipbufferb[6], zipbufferb[7]); zip_log("ZIP %i: Data from SCSI DMA : %02X %02X %02X %02X %02X %02X %02X %02X\n", id, SCSIDevices[scsi_id][scsi_lun].CmdBuffer[0], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[1], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[2], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[3], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[4], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[5], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[6], SCSIDevices[scsi_id][scsi_lun].CmdBuffer[7]); +#endif return 1; } @@ -2392,7 +2492,9 @@ int zip_write_to_dma(uint8_t id) int ret = 0; if (zip_drives[id].bus_type == ZIP_BUS_SCSI) { +#ifdef ENABLE_ZIP_LOG zip_log("Write to SCSI DMA: (%02X:%02X)\n", zip_drives[id].scsi_device_id, zip_drives[id].scsi_device_lun); +#endif ret = zip_write_to_scsi_dma(zip_drives[id].scsi_device_id, zip_drives[id].scsi_device_lun); } else ret = zip_write_to_ide_dma(zip_drives[id].ide_channel); @@ -2418,19 +2520,25 @@ void zip_phase_callback(uint8_t id) { switch(zip[id].packet_status) { case ZIP_PHASE_IDLE: +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: ZIP_PHASE_IDLE\n", id); +#endif zip[id].pos=0; zip[id].phase = 1; zip[id].status = READY_STAT | DRQ_STAT | (zip[id].status & ERR_STAT); return; case ZIP_PHASE_COMMAND: +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: ZIP_PHASE_COMMAND\n", id); +#endif zip[id].status = BUSY_STAT | (zip[id].status &ERR_STAT); memcpy(zip[id].atapi_cdb, zipbufferb, zip[id].cdb_len); zip_command(id, zip[id].atapi_cdb); return; case ZIP_PHASE_COMPLETE: +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: ZIP_PHASE_COMPLETE\n", id); +#endif zip[id].status = READY_STAT; zip[id].phase = 3; zip[id].packet_status = 0xFF; @@ -2438,27 +2546,37 @@ void zip_phase_callback(uint8_t id) zip_irq_raise(id); return; case ZIP_PHASE_DATA_OUT: +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: ZIP_PHASE_DATA_OUT\n", id); +#endif zip[id].status = READY_STAT | DRQ_STAT | (zip[id].status & ERR_STAT); zip[id].phase = 0; zip_irq_raise(id); return; case ZIP_PHASE_DATA_OUT_DMA: +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: ZIP_PHASE_DATA_OUT_DMA\n", id); +#endif zip_read_from_dma(id); return; case ZIP_PHASE_DATA_IN: +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: ZIP_PHASE_DATA_IN\n", id); +#endif zip[id].status = READY_STAT | DRQ_STAT | (zip[id].status & ERR_STAT); zip[id].phase = 2; zip_irq_raise(id); return; case ZIP_PHASE_DATA_IN_DMA: +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: ZIP_PHASE_DATA_IN_DMA\n", id); +#endif zip_write_to_dma(id); return; case ZIP_PHASE_ERROR: +#ifdef ENABLE_ZIP_LOG zip_log("ZIP %i: ZIP_PHASE_ERROR\n", id); +#endif zip[id].status = READY_STAT | ERR_STAT; zip[id].phase = 3; zip[id].packet_status = 0xFF; @@ -2513,13 +2631,19 @@ uint32_t zip_read(uint8_t channel, int length) if (zip[id].packet_status == ZIP_PHASE_DATA_IN) { if ((zip[id].request_pos >= zip[id].max_transfer_len) || (zip[id].pos >= zip[id].packet_len)) { /* Time for a DRQ. */ +#ifdef ENABLE_ZIP_LOG // zip_log("ZIP %i: Issuing read callback\n", id); +#endif zip_pio_request(id, 0); } +#ifdef ENABLE_ZIP_LOG // zip_log("ZIP %i: Returning: %02X (buffer position: %i, request position: %i)\n", id, temp, zip[id].pos, zip[id].request_pos); +#endif return temp; } else { +#ifdef ENABLE_ZIP_LOG // zip_log("ZIP %i: Returning zero (buffer position: %i, request position: %i)\n", id, zip[id].pos, zip[id].request_pos); +#endif return 0; } } @@ -2605,7 +2729,9 @@ zip_hard_reset(void) if (zip_drives[c].bus_type) SCSIReset(zip_drives[c].scsi_device_id, zip_drives[c].scsi_device_lun); +#ifdef ENABLE_ZIP_LOG zip_log("ZIP hard_reset drive=%d host=%02x\n", c, zip_drives[c].host_drive); +#endif if (wcslen(zip_drives[c].image_path)) zip_load(c, zip_drives[c].image_path); diff --git a/src/emu.h b/src/emu.h index 6854f07..d77f7bb 100644 --- a/src/emu.h +++ b/src/emu.h @@ -8,7 +8,7 @@ * * Main include file for the application. * - * Version: @(#)emu.h 1.0.12 2018/03/31 + * Version: @(#)emu.h 1.0.13 2018/04/02 * * Author: Fred N. van Kempen, * @@ -66,30 +66,15 @@ #define BIOS_FILE L"bios.txt" -/*FIXME: move to where it's needed (ui) */ -#if defined(ENABLE_BUSLOGIC_LOG) || \ - defined(ENABLE_CDROM_LOG) || \ - defined(ENABLE_D86F_LOG) || \ - defined(ENABLE_FDC_LOG) || \ - defined(ENABLE_IDE_LOG) || \ - defined(ENABLE_NIC_LOG) -# define ENABLE_LOG_TOGGLES 1 -#endif - -/*FIXME: move to where it's needed (ui) */ -#if defined(ENABLE_LOG_BREAKPOINT) || defined(ENABLE_VRAM_DUMP) -# define ENABLE_LOG_COMMANDS 1 -#endif - -#define MIN(a, b) ((a) < (b) ? (a) : (b)) -#define ABS(x) ((x) > 0 ? (x) : -(x)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define ABS(x) ((x) > 0 ? (x) : -(x)) #ifdef __cplusplus extern "C" { #endif -/* Global variables. */ +/* Commandline option variables. */ extern int dump_on_exit; /* (O) dump regs on exit*/ extern int do_dump_config; /* (O) dump cfg after load */ extern int start_in_fullscreen; /* (O) start in fullscreen */ @@ -104,6 +89,7 @@ extern int settings_only; /* (O) only the settings dlg */ extern wchar_t log_path[1024]; /* (O) full path of logfile */ +/* Configuration variables. */ extern int window_w, window_h, /* (C) window size and */ window_x, window_y, /* position info */ window_remember, @@ -145,16 +131,7 @@ extern int network_card; /* (C) net interface num */ extern char network_host[512]; /* (C) host network intf */ -#ifdef ENABLE_LOG_TOGGLES -extern int buslogic_do_log; -extern int cdrom_do_log; -extern int d86f_do_log; -extern int fdc_do_log; -extern int ide_do_log; -extern int serial_do_log; -extern int nic_do_log; -#endif - +/* Global variables. */ extern char emu_title[64]; /* full name of application */ extern char emu_version[32]; /* short version ID string */ extern char emu_fullversion[128]; /* full version ID string */ diff --git a/src/keyboard.c b/src/keyboard.c index 1e11b8a..eedd217 100644 --- a/src/keyboard.c +++ b/src/keyboard.c @@ -8,7 +8,7 @@ * * General keyboard driver interface. * - * Version: @(#)keyboard.c 1.0.3 2018/03/15 + * Version: @(#)keyboard.c 1.0.4 2018/04/01 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -39,12 +39,17 @@ #include #include #include +#include #include +#define HAVE_STDARG_H #include "emu.h" #include "machine/machine.h" #include "keyboard.h" +#ifdef ENABLE_KEYBOARD_LOG +int keyboard_do_log = ENABLE_KEYBOARD_LOG; +#endif int64_t keyboard_delay; int keyboard_scan; void (*keyboard_send)(uint16_t val); @@ -52,9 +57,6 @@ void (*keyboard_send)(uint16_t val); static int recv_key[512]; /* keyboard input buffer */ static int oldkey[512]; -#if 0 -static int keydelay[512]; -#endif static const scancode *scan_table; /* scancode table for keyboard */ static uint8_t caps_lock = 0; @@ -63,6 +65,21 @@ static uint8_t scroll_lock = 0; static uint8_t shift = 0; +void +kbd_log(const char *fmt, ...) +{ +#ifdef ENABLE_KEYBOARD_LOG + va_list ap; + + if (keyboard_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +#endif +} + + void keyboard_init(void) { @@ -236,8 +253,8 @@ keyboard_input(int down, uint16_t scan) recv_key[scan >> 6] |= ((uint64_t) down << ((uint64_t) scan & 0x3fLL)); #endif -#if 0 - pclog("Received scan code: %03X (%s)\n", +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("Received scan code: %03X (%s)\n", scan & 0x1ff, down ? "down" : "up"); #endif diff --git a/src/keyboard.h b/src/keyboard.h index 649c3da..cc1a281 100644 --- a/src/keyboard.h +++ b/src/keyboard.h @@ -8,7 +8,7 @@ * * Definitions for the keyboard interface. * - * Version: @(#)keyboard.h 1.0.4 2018/03/22 + * Version: @(#)keyboard.h 1.0.5 2018/04/01 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -90,6 +90,7 @@ extern const device_t keyboard_ps2_mca_2_device; extern const device_t keyboard_ps2_quadtel_device; #endif +extern void kbd_log(const char *fmt, ...); extern void keyboard_init(void); extern void keyboard_close(void); extern void keyboard_set_table(const scancode *ptr); diff --git a/src/keyboard_at.c b/src/keyboard_at.c index 28f6e2c..92327a8 100644 --- a/src/keyboard_at.c +++ b/src/keyboard_at.c @@ -8,7 +8,7 @@ * * Intel 8042 (AT keyboard controller) emulation. * - * Version: @(#)keyboard_at.c 1.0.9 2018/03/22 + * Version: @(#)keyboard_at.c 1.0.10 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -40,8 +40,6 @@ #include #include #include -#include -#define HAVE_STDARG_H #include #include "emu.h" #include "cpu/cpu.h" @@ -150,10 +148,6 @@ uint8_t keyboard_set3_all_break; /* Bits 0 - 1 = scan code set, bit 6 = translate or not. */ uint8_t keyboard_mode = 0x42; -#ifdef ENABLE_KEYBOARD_AT_LOG -int keyboard_at_do_log = ENABLE_KEYBOARD_AT_LOG; -#endif - int mouse_queue_start = 0, mouse_queue_end = 0; @@ -598,21 +592,6 @@ static const scancode scancode_set3[512] = { }; -static void -kbdlog(const char *fmt, ...) -{ -#ifdef ENABLE_KEYBOARD_AT_LOG - va_list ap; - - if (keyboard_at_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -#endif -} - - static void kbd_setmap(atkbd_t *kbd) { @@ -646,7 +625,9 @@ kbd_poll(void *priv) if ((kbd->out_new != -1) && !kbd->last_irq) { kbd->wantirq = 0; if (kbd->out_new & 0x100) { - kbdlog("ATkbd: want mouse data\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: want mouse data\n"); +#endif if (kbd->mem[0] & 0x02) picint(0x1000); kbd->out = kbd->out_new & 0xff; @@ -656,7 +637,9 @@ kbd_poll(void *priv) kbd->status |= STAT_MFULL; kbd->last_irq = 0x1000; } else { - kbdlog("ATkbd: want keyboard data\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: want keyboard data\n"); +#endif if (kbd->mem[0] & 0x01) picint(2); kbd->out = kbd->out_new & 0xff; @@ -721,21 +704,26 @@ kbd_adddata_vals(uint8_t *val, uint8_t len) or = 0; } else send = val[i]; - kbdlog("%02X", send); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("%02X", send); +#endif kbd_adddata(send); - if (i < (len - 1)) kbdlog(" "); +#ifdef ENABLE_KEYBOARD_LOG + if (i < (len - 1)) kbd_log(" "); +#endif } +#ifdef ENABLE_KEYBOARD_LOG if (translate) { - kbdlog(" original: ("); + kbd_log(" original: ("); for (i = 0; i < len; i++) { - kbdlog("%02X", val[i]); - if (i < (len - 1)) kbdlog(" "); + kbd_log("%02X", val[i]); + if (i < (len - 1)) kbd_log(" "); } - kbdlog(")"); + kbd_log(")"); } - - kbdlog("\n"); + kbd_log("\n"); +#endif } @@ -752,23 +740,25 @@ kbd_adddata_keyboard(uint16_t val) /* Allow for scan code translation. */ if (translate && (val == 0xf0)) { - kbdlog("Translate is on, F0 prefix detected\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("Translate is on, F0 prefix detected\n"); +#endif sc_or = 0x80; return; } /* Skip break code if translated make code has bit 7 set. */ if (translate && (sc_or == 0x80) && (val & 0x80)) { - kbdlog("Translate is on, skipping scan code: %02X (original: F0 %02X)\n", nont_to_t[val], val); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("Translate is on, skipping scan code: %02X (original: F0 %02X)\n", nont_to_t[val], val); +#endif sc_or = 0; return; } /* Test for T3100E 'Fn' key (Right Alt / Right Ctrl) */ - if (romset == ROM_T3100E && (keyboard_recv(0xb8) || keyboard_recv(0x9d))) - { - switch (val) - { + if (romset == ROM_T3100E && (keyboard_recv(0xb8) || keyboard_recv(0x9d))) { + switch (val) { case 0x4f: t3100e_notify_set(0x01); break; /* End */ case 0x50: t3100e_notify_set(0x02); break; /* Down */ case 0x51: t3100e_notify_set(0x03); break; /* PgDn */ @@ -787,13 +777,19 @@ kbd_adddata_keyboard(uint16_t val) } } - kbdlog("Translate is %s, ", translate ? "on" : "off"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("Translate is %s, ", translate ? "on" : "off"); +#endif switch(val) { case FAKE_LSHIFT_ON: - kbdlog("fake left shift on, scan code: "); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("fake left shift on, scan code: "); +#endif if (num_lock) { if (shift_states) { - kbdlog("N/A (one or both shifts on)\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("N/A (one or both shifts on)\n"); +#endif break; } else { /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ @@ -807,7 +803,9 @@ kbd_adddata_keyboard(uint16_t val) kbd_adddata_vals(fake_shift, 2); break; default: - kbdlog("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#endif break; } } @@ -824,7 +822,9 @@ kbd_adddata_keyboard(uint16_t val) kbd_adddata_vals(fake_shift, 3); break; default: - kbdlog("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#endif break; } } @@ -840,19 +840,27 @@ kbd_adddata_keyboard(uint16_t val) kbd_adddata_vals(fake_shift, 3); break; default: - kbdlog("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#endif break; } } +#ifdef ENABLE_KEYBOARD_LOG if (!shift_states) - kbdlog("N/A (both shifts off)\n"); + kbd_log("N/A (both shifts off)\n"); +#endif } break; case FAKE_LSHIFT_OFF: - kbdlog("fake left shift on, scan code: "); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("fake left shift on, scan code: "); +#endif if (num_lock) { if (shift_states) { - kbdlog("N/A (one or both shifts on)\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("N/A (one or both shifts on)\n"); +#endif break; } else { /* Num lock on and no shifts are pressed, send non-inverted fake shift. */ @@ -866,7 +874,9 @@ kbd_adddata_keyboard(uint16_t val) kbd_adddata_vals(fake_shift, 3); break; default: - kbdlog("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#endif break; } } @@ -883,7 +893,9 @@ kbd_adddata_keyboard(uint16_t val) kbd_adddata_vals(fake_shift, 2); break; default: - kbdlog("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#endif break; } } @@ -899,23 +911,29 @@ kbd_adddata_keyboard(uint16_t val) kbd_adddata_vals(fake_shift, 2); break; default: - kbdlog("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("N/A (scan code set %i)\n", keyboard_mode & 0x02); +#endif break; } } +#ifdef ENABLE_KEYBOARD_LOG if (!shift_states) - kbdlog("N/A (both shifts off)\n"); + kbd_log("N/A (both shifts off)\n"); +#endif } break; default: - kbdlog("scan code: "); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("scan code: "); if (translate) { - kbdlog("%02X (original: ", (nont_to_t[val] | sc_or)); + kbd_log("%02X (original: ", (nont_to_t[val] | sc_or)); if (sc_or == 0x80) - kbdlog("F0 "); - kbdlog("%02X)\n", val); + kbd_log("F0 "); + kbd_log("%02X)\n", val); } else - kbdlog("%02X\n", val); + kbd_log("%02X\n", val); +#endif key_queue[key_queue_end] = (translate ? (nont_to_t[val] | sc_or) : val); key_queue_end = (key_queue_end + 1) & 0xf; @@ -929,7 +947,9 @@ kbd_adddata_keyboard(uint16_t val) static void kbd_output_write(atkbd_t *kbd, uint8_t val) { - kbdlog("Write output port: %02X (old: %02X)\n", val, kbd->output_port); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("Write output port: %02X (old: %02X)\n", val, kbd->output_port); +#endif if ((kbd->output_port ^ val) & 0x20) { /*IRQ 12*/ if (val & 0x20) picint(1 << 12); @@ -961,7 +981,9 @@ kbd_output_write(atkbd_t *kbd, uint8_t val) static void kbd_cmd_write(atkbd_t *kbd, uint8_t val) { - kbdlog("Write command byte: %02X (old: %02X)\n", val, kbd->mem[0]); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("Write command byte: %02X (old: %02X)\n", val, kbd->mem[0]); +#endif if ((val & 1) && (kbd->status & STAT_OFULL)) kbd->wantirq = 1; @@ -979,8 +1001,10 @@ kbd_cmd_write(atkbd_t *kbd, uint8_t val) keyboard_mode |= (val & MODE_MASK); keyboard_scan = !(val & 0x10); - kbdlog("ATkbd: keyboard is now %s\n", mouse_scan ? "enabled" : "disabled"); - kbdlog("ATkbd: keyboard interrupt is now %s\n", (val & 0x01) ? "enabled" : "disabled"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: keyboard is now %s\n", mouse_scan ? "enabled" : "disabled"); + kbd_log("ATkbd: keyboard interrupt is now %s\n", (val & 0x01) ? "enabled" : "disabled"); +#endif /* ISA AT keyboard controllers use bit 5 for keyboard mode (1 = PC/XT, 2 = AT); PS/2 (and EISA/PCI) keyboard controllers use it as the PS/2 mouse enable switch. */ @@ -989,9 +1013,11 @@ kbd_cmd_write(atkbd_t *kbd, uint8_t val) keyboard_mode &= ~CCB_PCMODE; mouse_scan = !(val & 0x20); - kbdlog("ATkbd: mouse is now %s\n", mouse_scan ? "enabled" : "disabled"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: mouse is now %s\n", mouse_scan ? "enabled" : "disabled"); - kbdlog("ATkbd: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); + kbd_log("ATkbd: mouse interrupt is now %s\n", (val & 0x02) ? "enabled" : "disabled"); +#endif } } @@ -1020,91 +1046,129 @@ kbd_pulse_poll(void *p) static void kbd_keyboard_set(atkbd_t *kbd, uint8_t enable) { - kbd->mem[0] &= 0xef; - kbd->mem[0] |= (enable ? 0x00 : 0x10); - keyboard_scan = enable; + kbd->mem[0] &= 0xef; + kbd->mem[0] |= (enable ? 0x00 : 0x10); + keyboard_scan = enable; } static void kbd_mouse_set(atkbd_t *kbd, uint8_t enable) { - kbd->mem[0] &= 0xdf; - kbd->mem[0] |= (enable ? 0x00 : 0x20); - mouse_scan = enable; + kbd->mem[0] &= 0xdf; + kbd->mem[0] |= (enable ? 0x00 : 0x20); + mouse_scan = enable; } static uint8_t kbd_write64_generic(void *p, uint8_t val) { - atkbd_t *kbd = (atkbd_t *) p; + atkbd_t *kbd = (atkbd_t *)p; switch (val) { case 0xa4: /*Check if password installed*/ if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { - kbdlog("ATkbd: check if password installed\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: check if password installed\n"); +#endif kbd_adddata(0xf1); return 0; - } else - kbdlog("ATkbd: bad command A4\n"); + } +#ifdef ENABLE_KEYBOARD_LOG + else + kbd_log("ATkbd: bad command A4\n"); +#endif break; + case 0xa7: /*Disable mouse port*/ if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { - kbdlog("ATkbd: disable mouse port\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: disable mouse port\n"); +#endif kbd_mouse_set(kbd, 0); return 0; - } else - kbdlog("ATkbd: bad command A7\n"); + } +#ifdef ENABLE_KEYBOARD_LOG + else + kbd_log("ATkbd: bad command A7\n"); +#endif break; + case 0xa8: /*Enable mouse port*/ if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { - kbdlog("ATkbd: enable mouse port\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: enable mouse port\n"); +#endif kbd_mouse_set(kbd, 1); return 0; - } else - kbdlog("ATkbd: bad command A8\n"); + } +#ifdef ENABLE_KEYBOARD_LOG + else + kbd_log("ATkbd: bad command A8\n"); +#endif break; + case 0xa9: /*Test mouse port*/ - kbdlog("ATkbd: test mouse port\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: test mouse port\n"); +#endif if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { if (mouse_write) kbd_adddata(0x00); /*no error*/ else kbd_adddata(0xff); /*no mouse*/ return 0; - } else - kbdlog("ATkbd: bad command A9\n"); + } +#ifdef ENABLE_KEYBOARD_LOG + else + kbd_log("ATkbd: bad command A9\n"); +#endif break; + case 0xaf: /*Read keyboard version*/ - kbdlog("ATkbd: read keyboard version\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: read keyboard version\n"); +#endif kbd_adddata(0x00); return 0; + case 0xc0: /*Read input port*/ - kbdlog("ATkbd: read input port\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: read input port\n"); +#endif kbd_adddata(kbd->input_port | 4 | fdc_ps1_525()); kbd->input_port = ((kbd->input_port + 1) & 3) | (kbd->input_port & 0xfc) | fdc_ps1_525(); return 0; + case 0xd3: /*Write mouse output buffer*/ if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { - kbdlog("ATkbd: write mouse output buffer\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: write mouse output buffer\n"); +#endif kbd->want60 = 1; return 0; } break; + case 0xd4: /*Write to mouse*/ if ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1) { - kbdlog("ATkbd: write to mouse\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: write to mouse\n"); +#endif kbd->want60 = 1; return 0; } break; + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: - // kbdlog("ATkbd: pulse %01X\n", val & 0x0f); +#ifdef ENABLE_KEYBOARD_LOG + // kbd_log("ATkbd: pulse %01X\n", val & 0x0f); +#endif kbd_output_pulse(kbd, val & 0x0f); return 0; } @@ -1128,13 +1192,18 @@ kbd_write60_ami(void *p, uint8_t val) case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: - kbdlog("AMI - alias write to register %08X\n", kbd->command); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - alias write to register %08X\n", kbd->command); +#endif kbd->mem[kbd->command & 0x1f] = val; if (kbd->command == 0x60) kbd_cmd_write(kbd, val); return 0; + case 0xaf: /*AMI - set extended controller RAM*/ - kbdlog("AMI - set extended controller RAM\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - set extended controller RAM\n"); +#endif if (kbd->secr_phase == 1) { kbd->mem_addr = val; kbd->want60 = 1; @@ -1145,7 +1214,9 @@ kbd_write60_ami(void *p, uint8_t val) } return 0; case 0xcb: /*AMI - set keyboard mode*/ - kbdlog("AMI - set keyboard mode\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - set keyboard mode\n"); +#endif return 0; } @@ -1167,9 +1238,12 @@ kbd_write64_ami(void *p, uint8_t val) case 0x14: case 0x15: case 0x16: case 0x17: case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f: - kbdlog("AMI - alias read from register %08X\n", val); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - alias read from register %08X\n", val); +#endif kbd_adddata(kbd->mem[val]); return 0; + case 0x40: case 0x41: case 0x42: case 0x43: case 0x44: case 0x45: case 0x46: case 0x47: case 0x48: case 0x49: case 0x4a: case 0x4b: @@ -1178,121 +1252,171 @@ kbd_write64_ami(void *p, uint8_t val) case 0x54: case 0x55: case 0x56: case 0x57: case 0x58: case 0x59: case 0x5a: case 0x5b: case 0x5c: case 0x5d: case 0x5e: case 0x5f: - kbdlog("AMI - alias write to register %08X\n", kbd->command); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - alias write to register %08X\n", kbd->command); +#endif kbd->want60 = 1; return 0; + case 0xa1: /*AMI - get controller version*/ - kbdlog("AMI - get controller version\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - get controller version\n"); +#endif return 0; + case 0xa2: /*AMI - reset keyboard controller lines P22 and P23 low*/ if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - kbdlog("AMI - reset keyboard controller lines P22 and P23 low\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - reset keyboard controller lines P22 and P23 low\n"); +#endif kbd_output_write(kbd, kbd->output_port & 0xf3); kbd_adddata(0x00); return 0; } break; + case 0xa3: /*AMI - set keyboard controller lines P22 and P23 high*/ if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - kbdlog("AMI - set keyboard controller lines P22 and P23 high\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - set keyboard controller lines P22 and P23 high\n"); +#endif kbd_output_write(kbd, kbd->output_port | 0x0c); kbd_adddata(0x00); return 0; } break; + case 0xa4: /* AMI - write clock = low */ if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - kbdlog("AMI - write clock = low\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - write clock = low\n"); +#endif kbd->ami_stat &= 0xfe; return 0; } break; + case 0xa5: /* AMI - write clock = high */ if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - kbdlog("AMI - write clock = high\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - write clock = high\n"); +#endif kbd->ami_stat |= 0x01; return 0; } break; case 0xa6: /* AMI - read clock */ if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - kbdlog("AMI - read clock\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - read clock\n"); +#endif kbd_adddata(!!(kbd->ami_stat & 1)); return 0; } break; + case 0xa7: /* AMI - write cache bad */ if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - kbdlog("AMI - write cache bad\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - write cache bad\n"); +#endif kbd->ami_stat &= 0xfd; return 0; } break; + case 0xa8: /* AMI - write cache good */ if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - kbdlog("AMI - write cache good\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - write cache good\n"); +#endif kbd->ami_stat |= 0x02; return 0; } break; + case 0xa9: /* AMI - read cache */ if ((kbd->flags & KBC_TYPE_MASK) < KBC_TYPE_PS2_1) { - kbdlog("AMI - read cache\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - read cache\n"); +#endif kbd_adddata(!!(kbd->ami_stat & 2)); return 0; } break; + case 0xaf: /*Set extended controller RAM*/ - kbdlog("ATkbd: set extended controller RAM\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: set extended controller RAM\n"); +#endif kbd->want60 = 1; kbd->secr_phase = 1; return 0; + case 0xb0: case 0xb1: case 0xb2: case 0xb3: /*Set keyboard controller line P10-P13 (input port bits 0-3) low*/ if (!PCI || (val > 0xb1)) kbd->input_port &= ~(1 << (val & 0x03)); kbd_adddata(0x00); return 0; + case 0xb4: case 0xb5: /*Set keyboard controller line P22-P23 (output port bits 2-3) low*/ if (!PCI) kbd_output_write(kbd, kbd->output_port & ~(4 << (val & 0x01))); kbd_adddata(0x00); return 0; + case 0xb8: case 0xb9: case 0xba: case 0xbb: /*Set keyboard controller line P10-P13 (input port bits 0-3) high*/ if (!PCI || (val > 0xb9)) kbd->input_port |= (1 << (val & 0x03)); kbd_adddata(0x00); return 0; + case 0xbc: case 0xbd: /*Set keyboard controller line P22-P23 (output port bits 2-3) high*/ if (!PCI) kbd_output_write(kbd, kbd->output_port | (4 << (val & 0x01))); kbd_adddata(0x00); return 0; + case 0xc8: /*AMI - unblock keyboard controller lines P22 and P23 (allow command D1 to change bits 2 and 3 of the output port)*/ - kbdlog("AMI - unblock keyboard controller lines P22 and P23\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - unblock keyboard controller lines P22 and P23\n"); +#endif kbd->output_locked = 1; return 0; + case 0xc9: /*AMI - block keyboard controller lines P22 and P23 (prevent command D1 from changing bits 2 and 3 of the output port)*/ - kbdlog("AMI - block keyboard controller lines P22 and P23\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - block keyboard controller lines P22 and P23\n"); +#endif kbd->output_locked = 1; return 0; + case 0xca: /*AMI - read keyboard mode*/ - kbdlog("AMI - read keyboard mode\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - read keyboard mode\n"); +#endif kbd_adddata(0x00); /*ISA mode*/ return 0; + case 0xcb: /*AMI - set keyboard mode*/ - kbdlog("AMI - set keyboard mode\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("AMI - set keyboard mode\n"); +#endif kbd->want60 = 1; return 0; + case 0xef: /*??? - sent by AMI486*/ - kbdlog("??? - sent by AMI486\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("??? - sent by AMI486\n"); +#endif return 0; } @@ -1307,23 +1431,34 @@ kbd_write64_ibm_mca(void *p, uint8_t val) switch (val) { case 0xc1: /*Copy bits 0 to 3 of input port to status bits 4 to 7*/ - kbdlog("ATkbd: copy bits 0 to 3 of input port to status bits 4 to 7\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: copy bits 0 to 3 of input port to status bits 4 to 7\n"); +#endif kbd->status &= 0xf; kbd->status |= ((((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf) << 4); return 0; + case 0xc2: /*Copy bits 4 to 7 of input port to status bits 4 to 7*/ - kbdlog("ATkbd: copy bits 4 to 7 of input port to status bits 4 to 7\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: copy bits 4 to 7 of input port to status bits 4 to 7\n"); +#endif kbd->status &= 0xf; kbd->status |= (((kbd->input_port & 0xfc) | 0x84 | fdc_ps1_525()) & 0xf0); return 0; + case 0xaf: - kbdlog("ATkbd: bad kbc command AF\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: bad kbc command AF\n"); +#endif return 1; + case 0xf0: case 0xf1: case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6: case 0xf7: case 0xf8: case 0xf9: case 0xfa: case 0xfb: case 0xfc: case 0xfd: case 0xfe: case 0xff: - kbdlog("ATkbd: pulse: %01X\n", (val & 0x03) | 0x0c); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: pulse: %01X\n", (val & 0x03) | 0x0c); +#endif kbd_output_pulse(kbd, (val & 0x03) | 0x0c); return 0; } @@ -1339,7 +1474,9 @@ kbd_write60_quadtel(void *p, uint8_t val) switch(kbd->command) { case 0xcf: /*??? - sent by MegaPC BIOS*/ - kbdlog("??? - sent by MegaPC BIOS\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("??? - sent by MegaPC BIOS\n"); +#endif return 0; } @@ -1354,10 +1491,15 @@ kbd_write64_quadtel(void *p, uint8_t val) switch (val) { case 0xaf: - kbdlog("ATkbd: bad kbc command AF\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: bad kbc command AF\n"); +#endif return 1; + case 0xcf: /*??? - sent by MegaPC BIOS*/ - kbdlog("??? - sent by MegaPC BIOS\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("??? - sent by MegaPC BIOS\n"); +#endif kbd->want60 = 1; return 0; } @@ -1388,32 +1530,43 @@ kbd_write64_toshiba(void *p, uint8_t val) switch (val) { case 0xaf: - kbdlog("ATkbd: bad kbc command AF\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: bad kbc command AF\n"); +#endif return 1; + case 0xb0: /* T3100e: Turbo on */ t3100e_turbo_set(1); return 0; + case 0xb1: /* T3100e: Turbo off */ t3100e_turbo_set(0); return 0; + case 0xb2: /* T3100e: Select external display */ t3100e_display_set(0x00); return 0; + case 0xb3: /* T3100e: Select internal display */ t3100e_display_set(0x01); return 0; + case 0xb4: /* T3100e: Get configuration / status */ kbd_adddata(t3100e_config_get()); return 0; + case 0xb5: /* T3100e: Get colour / mono byte */ kbd_adddata(t3100e_mono_get()); return 0; + case 0xb6: /* T3100e: Set colour / mono byte */ kbd->want60 = 1; return 0; + case 0xb7: /* T3100e: Emulate PS/2 keyboard - not implemented */ case 0xb8: /* T3100e: Emulate AT keyboard - not implemented */ return 0; + case 0xbb: /* T3100e: Read 'Fn' key. Return it for right Ctrl and right Alt; on the real T3100e, these keystrokes could only be generated @@ -1423,11 +1576,15 @@ kbd_write64_toshiba(void *p, uint8_t val) kbd_adddata(0x04); else kbd_adddata(0x00); return 0; + case 0xbc: /* T3100e: Reset Fn+Key notification */ t3100e_notify_set(0x00); return 0; + case 0xc0: /*Read input port*/ - kbdlog("ATkbd: read input port\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: read input port\n"); +#endif /* The T3100e returns all bits set except bit 6 which * is set by t3100e_mono_set() */ @@ -1472,7 +1629,9 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; case 0xd1: /*Write output port*/ - // kbdlog("Write output port\n"); +#ifdef ENABLE_KEYBOARD_LOG + // kbd_log("Write output port\n"); +#endif if (kbd->output_locked) { /*If keyboard controller lines P22-P23 are blocked, we force them to remain unchanged.*/ @@ -1483,23 +1642,31 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; case 0xd2: /*Write to keyboard output buffer*/ - kbdlog("ATkbd: write to keyboard output buffer\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: write to keyboard output buffer\n"); +#endif kbd_adddata_keyboard(val); break; case 0xd3: /*Write to mouse output buffer*/ - kbdlog("ATkbd: write to mouse output buffer\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: write to mouse output buffer\n"); +#endif if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) keyboard_at_adddata_mouse(val); break; case 0xd4: /*Write to mouse*/ - kbdlog("ATkbd: write to mouse (%02X)\n", val); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: write to mouse (%02X)\n", val); +#endif kbd_mouse_set(kbd, 1); if (mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) mouse_write(val, mouse_p); else if (!mouse_write && ((kbd->flags & KBC_TYPE_MASK) >= KBC_TYPE_PS2_1)) { +#ifdef ENABLE_KEYBOARD_LOG pclog("Adding 0xFF to queue\n"); +#endif keyboard_at_adddata_mouse(0xff); } break; @@ -1510,8 +1677,12 @@ kbd_write(uint16_t port, uint8_t val, void *priv) if (kbd->write60_ven) bad = kbd->write60_ven(kbd, val); +#ifdef ENABLE_KEYBOARD_LOG if (bad) - kbdlog("ATkbd: bad keyboard controller 0060 write %02X command %02X\n", val, kbd->command); + kbd_log("ATkbd: bad keyboard controller 0060 write %02X command %02X\n", val, kbd->command); +#else + (void)bad; +#endif } } else { /*Write to keyboard*/ @@ -1541,76 +1712,103 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; default: - kbdlog("ATkbd: bad keyboard 0060 write %02X command %02X\n", val, kbd->key_command); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: bad keyboard 0060 write %02X command %02X\n", val, kbd->key_command); +#endif + break; } } else { kbd->key_command = val; kbd_keyboard_set(kbd, 1); switch (val) { case 0x00: - kbdlog("ATkbd: command 00\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: command 00\n"); +#endif kbd_adddata_keyboard(0xfa); break; case 0x05: /*??? - sent by NT 4.0*/ - kbdlog("ATkbd: nt 4.0 command fe\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: nt 4.0 command fe\n"); +#endif kbd_adddata_keyboard(0xfe); break; case 0x71: /*These two commands are sent by Pentium-era AMI BIOS'es.*/ case 0x82: - kbdlog("ATkbd: pentium-era ami bios command %02x\n", val); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: pentium-era ami bios command %02x\n", val); +#endif break; case 0xed: /*Set/reset LEDs*/ - kbdlog("ATkbd: set/reset leds\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: set/reset leds\n"); +#endif kbd->key_wantdata = 1; kbd_adddata_keyboard(0xfa); break; case 0xee: /*Diagnostic echo*/ - kbdlog("ATkbd: diagnostic echo\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: diagnostic echo\n"); +#endif kbd_adddata_keyboard(0xee); break; case 0xef: /*NOP (No OPeration). Reserved for future use.*/ - kbdlog("ATkbd: kbd nop\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: kbd nop\n"); +#endif break; case 0xf0: /*Get/set scan code set*/ - kbdlog("ATkbd: scan code set\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: scan code set\n"); +#endif kbd->key_wantdata = 1; kbd_adddata_keyboard(0xfa); break; case 0xf2: /*Read ID*/ /* Fixed as translation will be done in kbd_adddata_keyboard(). */ - kbdlog("ATkbd: read keyboard id\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: read keyboard id\n"); +#endif kbd_adddata_keyboard(0xfa); kbd_adddata_keyboard(0xab); kbd_adddata_keyboard(0x83); break; case 0xf3: /*Set typematic rate/delay*/ - kbdlog("ATkbd: set typematic rate/delay\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: set typematic rate/delay\n"); +#endif kbd->key_wantdata = 1; kbd_adddata_keyboard(0xfa); break; case 0xf4: /*Enable keyboard*/ - kbdlog("ATkbd: enable keyboard via keyboard\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: enable keyboard via keyboard\n"); +#endif keyboard_scan = 1; kbd_adddata_keyboard(0xfa); break; case 0xf5: /*Disable keyboard*/ - kbdlog("ATkbd: disable keyboard via keyboard\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: disable keyboard via keyboard\n"); +#endif keyboard_scan = 0; kbd_adddata_keyboard(0xfa); break; case 0xf6: /*Set defaults*/ - kbdlog("ATkbd: set defaults\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: set defaults\n"); +#endif keyboard_set3_all_break = 0; keyboard_set3_all_repeat = 0; memset(keyboard_set3_flags, 0, 512); @@ -1620,37 +1818,49 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; case 0xf7: /*Set all keys to repeat*/ - kbdlog("ATkbd: set all keys to repeat\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: set all keys to repeat\n"); +#endif keyboard_set3_all_break = 1; kbd_adddata_keyboard(0xfa); break; case 0xf8: /*Set all keys to give make/break codes*/ - kbdlog("ATkbd: set all keys to give make/break codes\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: set all keys to give make/break codes\n"); +#endif keyboard_set3_all_break = 1; kbd_adddata_keyboard(0xfa); break; case 0xf9: /*Set all keys to give make codes only*/ - kbdlog("ATkbd: set all keys to give make codes only\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: set all keys to give make codes only\n"); +#endif keyboard_set3_all_break = 0; kbd_adddata_keyboard(0xfa); break; case 0xfa: /*Set all keys to repeat and give make/break codes*/ - kbdlog("ATkbd: set all keys to repeat and give make/break codes\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: set all keys to repeat and give make/break codes\n"); +#endif keyboard_set3_all_repeat = 1; keyboard_set3_all_break = 1; kbd_adddata_keyboard(0xfa); break; case 0xfe: /*Resend last scan code*/ - kbdlog("ATkbd: reset last scan code\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: reset last scan code\n"); +#endif kbd_adddata_keyboard(kbd->last_scan_code); break; case 0xff: /*Reset*/ - kbdlog("ATkbd: kbd reset\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: kbd reset\n"); +#endif key_queue_start = key_queue_end = 0; /*Clear key queue*/ kbd_adddata_keyboard(0xfa); kbd_adddata_keyboard(0xaa); @@ -1661,7 +1871,9 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; default: - kbdlog("ATkbd: bad keyboard command %02X\n", val); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: bad keyboard command %02X\n", val); +#endif kbd_adddata_keyboard(0xfe); } } @@ -1717,7 +1929,9 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; case 0xaa: /*Self-test*/ - kbdlog("Self-test\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("Self-test\n"); +#endif if ((kbd->flags & KBC_VEN_MASK) == KBC_VEN_TOSHIBA) kbd->status |= STAT_IFULL; if (! kbd->initialized) { @@ -1735,12 +1949,16 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; case 0xab: /*Interface test*/ - kbdlog("ATkbd: interface test\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: interface test\n"); +#endif kbd_adddata(0x00); /*no error*/ break; case 0xac: /*Diagnostic dump*/ - kbdlog("ATkbd: diagnostic dump\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: diagnostic dump\n"); +#endif for (i=0; i<16; i++) kbd_adddata(kbd->mem[i]); kbd_adddata((kbd->input_port & 0xf0) | 0x80); @@ -1749,17 +1967,23 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; case 0xad: /*Disable keyboard*/ - kbdlog("ATkbd: disable keyboard\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: disable keyboard\n"); +#endif kbd_keyboard_set(kbd, 0); break; case 0xae: /*Enable keyboard*/ - kbdlog("ATkbd: enable keyboard\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: enable keyboard\n"); +#endif kbd_keyboard_set(kbd, 1); break; case 0xd0: /*Read output port*/ - kbdlog("ATkbd: read output port\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: read output port\n"); +#endif mask = 0xff; if(!keyboard_scan) mask &= 0xbf; @@ -1769,27 +1993,37 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; case 0xd1: /*Write output port*/ - // kbdlog("ATkbd: write output port\n"); +#ifdef ENABLE_KEYBOARD_LOG + // kbd_log("ATkbd: write output port\n"); +#endif kbd->want60 = 1; break; case 0xd2: /*Write keyboard output buffer*/ - kbdlog("ATkbd: write keyboard output buffer\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: write keyboard output buffer\n"); +#endif kbd->want60 = 1; break; case 0xdd: /* Disable A20 Address Line */ - kbdlog("ATkbd: disable A20 Address Line\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: disable A20 Address Line\n"); +#endif kbd_output_write(kbd, kbd->output_port & 0xfd); break; case 0xdf: /* Enable A20 Address Line */ - kbdlog("ATkbd: enable A20 address line\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: enable A20 address line\n"); +#endif kbd_output_write(kbd, kbd->output_port | 0x02); break; case 0xe0: /*Read test inputs*/ - kbdlog("ATkbd: read test inputs\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: read test inputs\n"); +#endif kbd_adddata(0x00); break; @@ -1799,8 +2033,10 @@ kbd_write(uint16_t port, uint8_t val, void *priv) if (kbd->write64_ven) bad = kbd->write64_ven(kbd, val); +#ifdef ENABLE_KEYBOARD_LOG if (bad) - kbdlog("ATkbd: bad controller command %02X\n", val); + kbd_log("ATkbd: bad controller command %02X\n", val); +#endif } break; } @@ -2113,7 +2349,9 @@ keyboard_at_set_mouse_scan(uint8_t val) kbd_mouse_set(kbd, val ? 1 : 0); - kbdlog("ATkbd: mouse scan %sabled via PCI\n", mouse_scan ? "en" : "dis"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("ATkbd: mouse scan %sabled via PCI\n", mouse_scan ? "en" : "dis"); +#endif } diff --git a/src/keyboard_xt.c b/src/keyboard_xt.c index a157e30..c89d154 100644 --- a/src/keyboard_xt.c +++ b/src/keyboard_xt.c @@ -8,7 +8,7 @@ * * Implementation of the XT-style keyboard. * - * Version: @(#)keyboard_xt.c 1.0.4 2018/03/15 + * Version: @(#)keyboard_xt.c 1.0.5 2018/04/01 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -351,8 +351,8 @@ kbd_poll(void *priv) if (key_queue_start != key_queue_end && !kbd->blocked) { kbd->pa = key_queue[key_queue_start]; picint(2); -#if ENABLE_KEYBOARD_LOG - pclog("XTkbd: reading %02X from the key queue at %i\n", +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("XTkbd: reading %02X from the key queue at %i\n", kbd->pa, key_queue_start); #endif key_queue_start = (key_queue_start + 1) & 0x0f; @@ -365,8 +365,8 @@ static void kbd_adddata(uint16_t val) { key_queue[key_queue_end] = val & 0xff; -#if ENABLE_KEYBOARD_LOG - pclog("XTkbd: %02X added to key queue at %i\n", +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("XTkbd: %02X added to key queue at %i\n", val, key_queue_end); #endif key_queue_end = (key_queue_end + 1) & 0x0f; @@ -402,6 +402,7 @@ kbd_adddata_process(uint16_t val, void (*adddata)(uint16_t val)) } } break; + case FAKE_LSHIFT_OFF: if (num_lock) { if (!shift_states) { @@ -419,6 +420,7 @@ kbd_adddata_process(uint16_t val, void (*adddata)(uint16_t val)) } } break; + default: adddata(val); break; @@ -441,8 +443,8 @@ kbd_write(uint16_t port, uint8_t val, void *priv) if (port != 0x61) return; if (!(kbd->pb & 0x40) && (val & 0x40)) { /*Reset keyboard*/ -#if ENABLE_KEYBOARD_LOG - pclog("XTkbd: reset keyboard\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("XTkbd: reset keyboard\n"); #endif key_queue_end = key_queue_start; kbd_adddata(0xaa); @@ -523,7 +525,9 @@ kbd_read(uint16_t port, void *priv) break; default: - pclog("XTkbd: bad read %04X\n", port); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("XTkbd: bad read %04X\n", port); +#endif ret = 0xff; } diff --git a/src/machine/m_olivetti_m24.c b/src/machine/m_olivetti_m24.c index 5d1fdcc..aa831f8 100644 --- a/src/machine/m_olivetti_m24.c +++ b/src/machine/m_olivetti_m24.c @@ -8,7 +8,7 @@ * * Emulation of the Olivetti M24. * - * Version: @(#)m_olivetti_m24.c 1.0.6 2018/03/27 + * Version: @(#)m_olivetti_m24.c 1.0.7 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -126,26 +126,6 @@ static int key_queue_start = 0, key_queue_end = 0; -#ifdef ENABLE_M24VID_LOG -int m24vid_do_log = ENABLE_M24VID_LOG; -#endif - - -static void -m24_log(const char *fmt, ...) -{ -#ifdef ENABLE_M24VID_LOG - va_list ap; - - if (m24vid_do_log) { - va_start(ap, fmt); - vfprintf(stdlog, fmt, ap); - va_end(ap); - fflush(stdlog); - } -#endif -} - static void recalc_timings(olim24_t *m24) { @@ -546,14 +526,14 @@ kbd_poll(void *priv) if (m24->wantirq) { m24->wantirq = 0; picint(2); -#if ENABLE_KEYBOARD_LOG - m24_log("M24: take IRQ\n"); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("M24: take IRQ\n"); #endif } if (!(m24->status & STAT_OFULL) && key_queue_start != key_queue_end) { -#if ENABLE_KEYBOARD_LOG - m24_log("Reading %02X from the key queue at %i\n", +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("M24: reading %02X from the key queue at %i\n", m24->out, key_queue_start); #endif m24->out = key_queue[key_queue_start]; @@ -585,15 +565,10 @@ kbd_write(uint16_t port, uint8_t val, void *priv) { olim24_t *m24 = (olim24_t *)priv; -#if ENABLE_KEYBOARD_LOG - m24_log("M24: write %04X %02X\n", port, val); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("M24: write %04X %02X\n", port, val); #endif -#if 0 - if (ram[8] == 0xc3) { - output = 3; - } -#endif switch (port) { case 0x60: if (m24->param != m24->param_total) { @@ -619,7 +594,10 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; default: - m24_log("M24: bad keyboard command complete %02X\n", m24->command); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("M24: bad keyboard command complete %02X\n", m24->command); +#endif + break; } } } else { @@ -643,7 +621,10 @@ kbd_write(uint16_t port, uint8_t val, void *priv) break; default: - m24_log("M24: bad keyboard command %02X\n", val); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("M24: bad keyboard command %02X\n", val); +#endif + break; } } break; @@ -696,7 +677,10 @@ kbd_read(uint16_t port, void *priv) break; default: - m24_log("\nBad M24 keyboard read %04X\n", port); +#ifdef ENABLE_KEYBOARD_LOG + kbd_log("\nBad M24 keyboard read %04X\n", port); +#endif + break; } return(ret); @@ -882,6 +866,7 @@ machine_olim24_init(const machine_t *model, void *arg) #if defined(DEV_BRANCH) && defined(USE_PORTABLE3) +/* Compaq Portable III also seems to use this. */ void machine_olim24_video_init(void) { diff --git a/src/pc.c b/src/pc.c index 8b3e7dd..ae0186d 100644 --- a/src/pc.c +++ b/src/pc.c @@ -8,7 +8,7 @@ * * Main emulator module where most things are controlled. * - * Version: @(#)pc.c 1.0.17 2018/03/31 + * Version: @(#)pc.c 1.0.18 2018/04/01 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -337,8 +337,10 @@ pc_version(const char *platform) void pc_path(wchar_t *dst, int sz, wchar_t *src) { - if ((src != NULL) && !wcscasecmp(src, usr_path)) - src += wcslen(usr_path); + int i = wcslen(usr_path); + + if ((src != NULL) && !wcsncasecmp(src, usr_path, i)) + src += i; /* * Fix all the slashes. @@ -562,6 +564,9 @@ usage: plat_append_slash(usr_path); } + /* Don't forget to clean up the user path. */ + pc_path(usr_path, sizeof_w(usr_path), NULL); + /* At this point, we can safely create the full path name. */ plat_append_filename(cfg_path, usr_path, p); diff --git a/src/plat.h b/src/plat.h index d3ee116..a70d073 100644 --- a/src/plat.h +++ b/src/plat.h @@ -8,7 +8,7 @@ * * Define the various platform support functions. * - * Version: @(#)plat.h 1.0.7 2018/03/31 + * Version: @(#)plat.h 1.0.8 2018/04/01 * * Author: Fred N. van Kempen, * @@ -56,7 +56,9 @@ /* The Win32 API uses _wcsicmp and _stricmp. */ #ifdef _WIN32 +# define wcsncasecmp _wcsnicmp # define wcscasecmp _wcsicmp +# define strncasecmp _strnicmp # define strcasecmp _stricmp #endif diff --git a/src/scsi/scsi.c b/src/scsi/scsi.c index ece1cc3..da906ba 100644 --- a/src/scsi/scsi.c +++ b/src/scsi/scsi.c @@ -8,7 +8,7 @@ * * Handling of the SCSI controllers. * - * Version: @(#)scsi.c 1.0.4 2018/03/19 + * Version: @(#)scsi.c 1.0.5 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -39,7 +39,9 @@ #include #include #include +#include #include +#define HAVE_STDARG_H #include "../emu.h" #include "../mem.h" #include "../rom.h" @@ -60,6 +62,9 @@ #include "scsi_x54x.h" +#ifdef ENABLE_SCSI_DEV_LOG +int scsi_dev_do_log = ENABLE_SCSI_DEV_LOG; +#endif scsi_device_t SCSIDevices[SCSI_ID_MAX][SCSI_LUN_MAX]; #if 0 uint8_t SCSIPhase = 0xff; @@ -107,6 +112,21 @@ static SCSI_CARD scsi_cards[] = { }; +void +scsi_dev_log(const char *fmt, ...) +{ +#ifdef ENABLE_SCSI_DEV_LOG + va_list ap; + + if (scsi_dev_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +#endif +} + + int scsi_card_available(int card) { diff --git a/src/scsi/scsi.h b/src/scsi/scsi.h index a5a2aa2..54168d2 100644 --- a/src/scsi/scsi.h +++ b/src/scsi/scsi.h @@ -8,7 +8,7 @@ * * SCSI controller handler header. * - * Version: @(#)scsi.h 1.0.4 2018/03/21 + * Version: @(#)scsi.h 1.0.5 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -39,7 +39,7 @@ #define EMU_SCSI_H -#define SCSI_TIME (5 * 100 * (1 << TIMER_SHIFT)) +#define SCSI_TIME (5 * 100 * (1 << TIMER_SHIFT)) /* Configuration. */ @@ -308,29 +308,31 @@ extern int mode_select_terminate(int force); extern int mode_select_write(uint8_t val); extern int scsi_card_current; +extern uint8_t scsi_disks[16][8]; -extern int scsi_card_available(int card); -extern char *scsi_card_getname(int card); +extern void scsi_dev_log(const char *fmt, ...); + +extern int scsi_card_available(int card); +extern char *scsi_card_getname(int card); #ifdef EMU_DEVICE_H extern const device_t *scsi_card_getdevice(int card); #endif -extern int scsi_card_has_config(int card); -extern char *scsi_card_get_internal_name(int card); -extern int scsi_card_get_from_internal_name(char *s); -extern void scsi_mutex(uint8_t start); -extern void scsi_card_init(void); -extern void scsi_card_reset(void); +extern int scsi_card_has_config(int card); +extern char *scsi_card_get_internal_name(int card); +extern int scsi_card_get_from_internal_name(char *s); +extern void scsi_mutex(uint8_t start); +extern void scsi_mutex_wait(uint8_t wait); +extern void scsi_card_init(void); +extern void scsi_card_reset(void); -extern uint8_t scsi_disks[16][8]; - -extern int scsi_hd_err_stat_to_scsi(uint8_t id); -extern int scsi_hd_phase_to_scsi(uint8_t id); -extern int find_hdc_for_scsi_id(uint8_t scsi_id, uint8_t scsi_lun); -extern void build_scsi_hd_map(void); -extern void scsi_hd_reset(uint8_t id); -extern void scsi_hd_request_sense_for_scsi(uint8_t id, uint8_t *buffer, uint8_t alloc_length); -extern void scsi_hd_command(uint8_t id, uint8_t *cdb); -extern void scsi_hd_callback(uint8_t id); +extern int scsi_hd_err_stat_to_scsi(uint8_t id); +extern int scsi_hd_phase_to_scsi(uint8_t id); +extern int find_hdc_for_scsi_id(uint8_t scsi_id, uint8_t scsi_lun); +extern void build_scsi_hd_map(void); +extern void scsi_hd_reset(uint8_t id); +extern void scsi_hd_request_sense_for_scsi(uint8_t id, uint8_t *buffer, uint8_t alloc_length); +extern void scsi_hd_command(uint8_t id, uint8_t *cdb); +extern void scsi_hd_callback(uint8_t id); #pragma pack(push,1) @@ -381,7 +383,4 @@ typedef struct { #define MODE_SELECT_PHASE_PAGE 4 -extern void scsi_mutex_wait(uint8_t wait); - - #endif /*EMU_SCSI_H*/ diff --git a/src/scsi/scsi_aha154x.c b/src/scsi/scsi_aha154x.c index d6e2a97..16a0a68 100644 --- a/src/scsi/scsi_aha154x.c +++ b/src/scsi/scsi_aha154x.c @@ -10,7 +10,7 @@ * made by Adaptec, Inc. These controllers were designed for * the ISA bus. * - * Version: @(#)scsi_aha154x.c 1.0.6 2018/03/31 + * Version: @(#)scsi_aha154x.c 1.0.7 2018/04/02 * * Based on original code from TheCollector1995 and Miran Grca. * @@ -43,9 +43,7 @@ #include #include #include -#include #include -#define HAVE_STDARG_H #include "../emu.h" #include "../io.h" #include "../mca.h" @@ -63,6 +61,8 @@ #include "scsi_x54x.h" +#define aha_log scsi_dev_log + #define AHA1540B_330_BIOS_PATH L"scsi/adaptec/aha1540b320_330.bin" #define AHA1540B_334_BIOS_PATH L"scsi/adaptec/aha1540b320_334.bin" #define AHA1540C_BIOS_PATH L"scsi/adaptec/aha1542c102.bin" @@ -109,26 +109,6 @@ typedef struct { #pragma pack(pop) -#ifdef ENABLE_AHA154X_LOG -int aha_do_log = ENABLE_AHA154X_LOG; -#endif - - -static void -aha_log(const char *fmt, ...) -{ -#ifdef ENABLE_AHA154X_LOG - va_list ap; - - if (aha_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -#endif -} - - /* * Write data to the BIOS space. * diff --git a/src/scsi/scsi_buslogic.c b/src/scsi/scsi_buslogic.c index 07d7d05..af16af5 100644 --- a/src/scsi/scsi_buslogic.c +++ b/src/scsi/scsi_buslogic.c @@ -13,7 +13,7 @@ * 1 - BT-545S ISA; * 2 - BT-958D PCI * - * Version: @(#)scsi_buslogic.c 1.0.8 2018/03/31 + * Version: @(#)scsi_buslogic.c 1.0.9 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -44,9 +44,7 @@ #include #include #include -#include #include -#define HAVE_STDARG_H #include "../emu.h" #include "../io.h" #include "../mca.h" @@ -66,6 +64,8 @@ #include "scsi_x54x.h" +#define buslogic_log scsi_dev_log + #define BT542_BIOS_PATH L"scsi/buslogic/bt-542bh_bios.rom" #define BT545_BIOS_PATH L"scsi/buslogic/bt-545s_bios.rom" #define BT545_AUTO_BIOS_PATH L"scsi/buslogic/bt-545s_autoscsi.rom" @@ -259,26 +259,6 @@ enum { }; -#ifdef ENABLE_BUSLOGIC_LOG -int buslogic_do_log = ENABLE_BUSLOGIC_LOG; -#endif - - -static void -buslogic_log(const char *fmt, ...) -{ -#ifdef ENABLE_BUSLOGIC_LOG - va_list ap; - - if (buslogic_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -#endif -} - - static wchar_t * GetNVRFileName(buslogic_data_t *bl) { diff --git a/src/scsi/scsi_ncr5380.c b/src/scsi/scsi_ncr5380.c index eb8361a..cc87b78 100644 --- a/src/scsi/scsi_ncr5380.c +++ b/src/scsi/scsi_ncr5380.c @@ -9,7 +9,7 @@ * Implementation of the NCR 5380 series of SCSI Host Adapters * made by NCR. These controllers were designed for the ISA bus. * - * Version: @(#)scsi_ncr5380.c 1.0.5 2018/03/31 + * Version: @(#)scsi_ncr5380.c 1.0.6 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -42,9 +42,7 @@ #include #include #include -#include #include -#define HAVE_STDARG_H #include "../emu.h" #include "../cpu/cpu.h" #include "../io.h" @@ -62,6 +60,8 @@ #include "scsi_ncr5380.h" +#define ncr_log scsi_dev_log + #define LCS6821N_ROM L"scsi/ncr5380/longshine lcs-6821n - bios version 1.04.bin" #define RT1000B_ROM L"scsi/ncr5380/rancho_rt1000_rtbios_version_8.10r.bin" #define T130B_ROM L"scsi/ncr5380/trantor_t130b_bios_v2.14.bin" @@ -176,26 +176,6 @@ enum { }; -#ifdef ENABLE_NCR5380_LOG -int ncr5380_do_log = ENABLE_NCR5380_LOG; -#endif - - -static void -ncr_log(const char *fmt, ...) -{ -#ifdef ENABLE_NCR5380_LOG - va_list ap; - - if (ncr5380_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -#endif -} - - static void dma_changed(void *priv, int mode, int enable) { @@ -251,7 +231,7 @@ ncr_write(uint16_t port, uint8_t val, void *priv) ncr5380_t *ncr = &scsi->ncr; int bus_host = 0; -#if ENABLE_NCR5380_LOG +#ifdef ENABLE_SCSI_DEV_LOG ncr_log("NCR5380 write(%04x,%02x) @%04X:%04X\n",port,val,CS,cpu_state.pc); #endif switch (port & 7) { @@ -394,7 +374,7 @@ ncr_read(uint16_t port, void *priv) break; } -#if ENABLE_NCR5380_LOG +#ifdef ENABLE_SCSI_DEV_LOG ncr_log("NCR5380 read(%04x)=%02x @%04X:%04X\n", port, ret, CS,cpu_state.pc); #endif return(ret); @@ -537,7 +517,7 @@ memio_read(uint32_t addr, void *priv) uint8_t ret = 0xff; addr &= 0x3fff; -#if ENABLE_NCR5380_LOG +#ifdef ENABLE_SCSI_DEV_LOG ncr_log("memio_read %08x\n", addr); #endif @@ -549,21 +529,21 @@ memio_read(uint32_t addr, void *priv) ret = scsi->ext_ram[addr - 0x3a00]; else switch (addr & 0x3f80) { case 0x3800: -#if ENABLE_NCR5380_LOG +#ifdef ENABLE_SCSI_DEV_LOG ncr_log("Read intRAM %02x %02x\n", addr & 0x3f, scsi->int_ram[addr & 0x3f]); #endif ret = scsi->int_ram[addr & 0x3f]; break; case 0x3880: -#if ENABLE_NCR5380_LOG +#ifdef ENABLE_SCSI_DEV_LOG ncr_log("Read 53c80 %04x\n", addr); #endif ret = ncr_read(addr, scsi); break; case 0x3900: -#if ENABLE_NCR5380_LOG +#ifdef ENABLE_SCSI_DEV_LOG ncr_log(" Read 3900 %i %02x\n", scsi->buffer_host_pos, scsi->status_ctrl); #endif if (scsi->buffer_host_pos >= 128 || !(scsi->status_ctrl & CTRL_DATA_DIR)) @@ -599,7 +579,7 @@ memio_read(uint32_t addr, void *priv) break; } -#if ENABLE_NCR5380_LOG +#ifdef ENABLE_SCSI_DEV_LOG if (addr >= 0x3880) ncr_log("memio_read(%08x)=%02x\n", addr, ret); #endif @@ -616,7 +596,7 @@ memio_write(uint32_t addr, uint8_t val, void *priv) addr &= 0x3fff; -#if ENABLE_NCR5380_LOG +#ifdef ENABLE_SCSI_DEV_LOG ncr_log("memio_write(%08x,%02x) @%04X:%04X %i %02x\n", addr, val, CS,cpu_state.pc, scsi->buffer_host_pos, scsi->status_ctrl); #endif @@ -631,7 +611,7 @@ memio_write(uint32_t addr, uint8_t val, void *priv) break; case 0x3880: -#if ENABLE_NCR5380_LOG +#ifdef ENABLE_SCSI_DEV_LOG ncr_log("Write 53c80 %04x %02x\n", addr, val); #endif ncr_write(addr, val, scsi); diff --git a/src/scsi/scsi_ncr53c810.c b/src/scsi/scsi_ncr53c810.c index 7666d4c..073ebc0 100644 --- a/src/scsi/scsi_ncr53c810.c +++ b/src/scsi/scsi_ncr53c810.c @@ -10,7 +10,7 @@ * NCR and later Symbios and LSI. This controller was designed * for the PCI bus. * - * Version: @(#)scsi_ncr53c810.c 1.0.5 2018/03/15 + * Version: @(#)scsi_ncr53c810.c 1.0.7 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -45,7 +45,6 @@ #include #include #include -#include #include #include "../emu.h" #include "../io.h" @@ -63,6 +62,8 @@ #include "scsi_ncr53c810.h" +#define ncr53c810_log scsi_dev_log + #define NCR_SCNTL0_TRG 0x01 #define NCR_SCNTL0_AAP 0x02 #define NCR_SCNTL0_EPC 0x08 @@ -295,26 +296,6 @@ typedef struct { } ncr53c810_t; -#ifdef ENABLE_NCR53C810_LOG -int ncr53c810_do_log = ENABLE_NCR53C810_LOG; -#endif - - -static void -ncr53c810_log(const char *fmt, ...) -{ -#ifdef ENABLE_NCR53C810_LOG - va_list ap; - - if (ncr53c810_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -#endif -} - - static uint8_t ncr53c810_reg_readb(ncr53c810_t *dev, uint32_t offset); static void ncr53c810_reg_writeb(ncr53c810_t *dev, uint32_t offset, uint8_t val); diff --git a/src/scsi/scsi_x54x.c b/src/scsi/scsi_x54x.c index cda5acc..97320cf 100644 --- a/src/scsi/scsi_x54x.c +++ b/src/scsi/scsi_x54x.c @@ -12,7 +12,7 @@ * * These controllers were designed for various buses. * - * Version: @(#)scsi_x54x.c 1.0.8 2018/03/15 + * Version: @(#)scsi_x54x.c 1.0.9 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -68,23 +68,23 @@ #define X54X_RESET_DURATION_US UINT64_C(50000) -static void x54x_cmd_callback(void *priv); -static x54x_t *x54x_dev; - - -#ifdef ENABLE_X54X_LOG -int x54x_do_log = ENABLE_X54X_LOG; +#ifdef ENABLE_SCSI_X54X_LOG +int scsi_x54x_do_log = ENABLE_SCSI_X54X_LOG; #endif +static void x54x_cmd_callback(void *priv); +static x54x_t *x54x_dev; + + static void x54x_log(const char *fmt, ...) { -#ifdef ENABLE_X54X_LOG +#ifdef ENABLE_SCSI_X54X_LOG va_list ap; - if (x54x_do_log) { + if (scsi_x54x_do_log) { // for debug, temporary pclog("In %s mode: ",(msw&1)?((eflags&VM_FLAG)?"V86":"protected"):"real"); va_start(ap, fmt); diff --git a/src/sound/snd_audiopci.c b/src/sound/snd_audiopci.c index 87d8101..2ea1580 100644 --- a/src/sound/snd_audiopci.c +++ b/src/sound/snd_audiopci.c @@ -8,7 +8,7 @@ * * Implementation of the AudioPCI sound device. * - * Version: @(#)snd_audiopci.c 1.0.8 2018/03/28 + * Version: @(#)snd_audiopci.c 1.0.9 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -40,9 +40,7 @@ #include #include #include -#include #include -#define HAVE_STDARG_H #include "../emu.h" #include "../device.h" #include "../io.h" @@ -174,25 +172,6 @@ const int32_t codec_attn[]= { static void es1371_fetch(es1371_t *es1371, int dac_nr); static void update_legacy(es1371_t *es1371); -#ifdef ENABLE_AUDIOPCI_LOG -int audiopci_do_log = ENABLE_AUDIOPCI_LOG; -#endif - - -static void -audiopci_log(const char *fmt, ...) -{ -#ifdef ENABLE_AUDIOPCI_LOG - va_list ap; - - if (audiopci_do_log) { - va_start(ap, fmt); - pclog_ex(fmt, ap); - va_end(ap); - } -#endif -} - static void es1371_update_irqs(es1371_t *es1371) { @@ -214,12 +193,12 @@ static void es1371_update_irqs(es1371_t *es1371) if (irq) { pci_set_irq(es1371->card, PCI_INTA); -// audiopci_log("Raise IRQ\n"); +// snddev_log("Raise IRQ\n"); } else { pci_clear_irq(es1371->card, PCI_INTA); -// audiopci_log("Drop IRQ\n"); +// snddev_log("Drop IRQ\n"); } } @@ -286,10 +265,10 @@ static uint8_t es1371_inb(uint16_t port, void *p) break; default: - audiopci_log("Bad es1371_inb: port=%04x\n", port); + snddev_log("Bad es1371_inb: port=%04x\n", port); } -// audiopci_log("es1371_inb: port=%04x ret=%02x\n", port, ret); +// snddev_log("es1371_inb: port=%04x ret=%02x\n", port, ret); // output = 3; return ret; } @@ -309,7 +288,7 @@ static uint16_t es1371_inw(uint16_t port, void *p) case 0x18: ret = es1371->legacy_ctrl & 0xffff; -// audiopci_log("Read legacy ctrl %04x\n", ret); +// snddev_log("Read legacy ctrl %04x\n", ret); break; case 0x26: @@ -328,7 +307,7 @@ static uint16_t es1371_inw(uint16_t port, void *p) break; default: - audiopci_log("Bad es1371_inw: mem_page=%x port=%04x\n", es1371->mem_page, port); + snddev_log("Bad es1371_inw: mem_page=%x port=%04x\n", es1371->mem_page, port); } break; @@ -340,15 +319,15 @@ static uint16_t es1371_inw(uint16_t port, void *p) break; default: - audiopci_log("Bad es1371_inw: mem_page=%x port=%04x\n", es1371->mem_page, port); + snddev_log("Bad es1371_inw: mem_page=%x port=%04x\n", es1371->mem_page, port); } break; default: - audiopci_log("Bad es1371_inw: port=%04x\n", port); + snddev_log("Bad es1371_inw: port=%04x\n", port); } -// audiopci_log("es1371_inw: port=%04x ret=%04x %04x:%08x\n", port, ret, CS,cpu_state.pc); +// snddev_log("es1371_inw: port=%04x ret=%04x %04x:%08x\n", port, ret, CS,cpu_state.pc); return ret; } static uint32_t es1371_inl(uint16_t port, void *p) @@ -390,7 +369,7 @@ static uint32_t es1371_inl(uint16_t port, void *p) break; default: - audiopci_log("Bad es1371_inl: mem_page=%x port=%04x\n", es1371->mem_page, port); + snddev_log("Bad es1371_inl: mem_page=%x port=%04x\n", es1371->mem_page, port); } break; @@ -402,15 +381,15 @@ static uint32_t es1371_inl(uint16_t port, void *p) break; default: - audiopci_log("Bad es1371_inl: mem_page=%x port=%04x\n", es1371->mem_page, port); + snddev_log("Bad es1371_inl: mem_page=%x port=%04x\n", es1371->mem_page, port); } break; default: - audiopci_log("Bad es1371_inl: port=%04x\n", port); + snddev_log("Bad es1371_inl: port=%04x\n", port); } -// audiopci_log("es1371_inl: port=%04x ret=%08x %08x\n", port, ret, cpu_state.pc); +// snddev_log("es1371_inl: port=%04x ret=%08x %08x\n", port, ret, cpu_state.pc); return ret; } @@ -418,7 +397,7 @@ static void es1371_outb(uint16_t port, uint8_t val, void *p) { es1371_t *es1371 = (es1371_t *)p; -// audiopci_log("es1371_outb: port=%04x val=%02x %04x:%08x\n", port, val, cs, cpu_state.pc); +// snddev_log("es1371_outb: port=%04x val=%02x %04x:%08x\n", port, val, cs, cpu_state.pc); switch (port & 0x3f) { case 0x00: @@ -487,14 +466,14 @@ static void es1371_outb(uint16_t port, uint8_t val, void *p) break; default: - audiopci_log("Bad es1371_outb: port=%04x val=%02x\n", port, val); + snddev_log("Bad es1371_outb: port=%04x val=%02x\n", port, val); } } static void es1371_outw(uint16_t port, uint16_t val, void *p) { es1371_t *es1371 = (es1371_t *)p; -// audiopci_log("es1371_outw: port=%04x val=%04x\n", port, val); +// snddev_log("es1371_outw: port=%04x val=%04x\n", port, val); switch (port & 0x3f) { case 0x0c: @@ -510,14 +489,14 @@ static void es1371_outw(uint16_t port, uint16_t val, void *p) break; default: - audiopci_log("Bad es1371_outw: port=%04x val=%04x\n", port, val); + snddev_log("Bad es1371_outw: port=%04x val=%04x\n", port, val); } } static void es1371_outl(uint16_t port, uint32_t val, void *p) { es1371_t *es1371 = (es1371_t *)p; -// audiopci_log("es1371_outl: port=%04x val=%08x %04x:%08x\n", port, val, CS, cpu_state.pc); +// snddev_log("es1371_outl: port=%04x val=%08x %04x:%08x\n", port, val, CS, cpu_state.pc); switch (port & 0x3f) { case 0x04: @@ -531,7 +510,7 @@ static void es1371_outl(uint16_t port, uint32_t val, void *p) es1371->sr_cir = val; if (es1371->sr_cir & SRC_RAM_WE) { -// audiopci_log("Write SR RAM %02x %04x\n", es1371->sr_cir >> 25, val & 0xffff); +// snddev_log("Write SR RAM %02x %04x\n", es1371->sr_cir >> 25, val & 0xffff); es1371->sr_ram[es1371->sr_cir >> 25] = val & 0xffff; switch (es1371->sr_cir >> 25) { @@ -579,7 +558,7 @@ static void es1371_outl(uint16_t port, uint32_t val, void *p) es1371->codec_ctrl = val; if (!(val & CODEC_READ)) { -// audiopci_log("Write codec %02x %04x\n", (val >> 16) & 0x3f, val & 0xffff); +// snddev_log("Write codec %02x %04x\n", (val >> 16) & 0x3f, val & 0xffff); es1371->codec_regs[(val >> 16) & 0x3f] = val & 0xffff; switch ((val >> 16) & 0x3f) { @@ -626,11 +605,11 @@ static void es1371_outl(uint16_t port, uint32_t val, void *p) case 0xc: es1371->dac[0].addr_latch = val; -// audiopci_log("DAC1 addr %08x\n", val); +// snddev_log("DAC1 addr %08x\n", val); break; default: - audiopci_log("Bad es1371_outl: mem_page=%x port=%04x val=%08x\n", es1371->mem_page, port, val); + snddev_log("Bad es1371_outl: mem_page=%x port=%04x val=%08x\n", es1371->mem_page, port, val); } break; case 0x34: @@ -654,7 +633,7 @@ static void es1371_outl(uint16_t port, uint32_t val, void *p) break; default: - audiopci_log("Bad es1371_outl: mem_page=%x port=%04x val=%08x\n", es1371->mem_page, port, val); + snddev_log("Bad es1371_outl: mem_page=%x port=%04x val=%08x\n", es1371->mem_page, port, val); } break; case 0x38: @@ -673,7 +652,7 @@ static void es1371_outl(uint16_t port, uint32_t val, void *p) break; default: - audiopci_log("Bad es1371_outl: mem_page=%x port=%04x val=%08x\n", es1371->mem_page, port, val); + snddev_log("Bad es1371_outl: mem_page=%x port=%04x val=%08x\n", es1371->mem_page, port, val); } break; case 0x3c: @@ -690,12 +669,12 @@ static void es1371_outl(uint16_t port, uint32_t val, void *p) break; default: - audiopci_log("Bad es1371_outl: mem_page=%x port=%04x val=%08x\n", es1371->mem_page, port, val); + snddev_log("Bad es1371_outl: mem_page=%x port=%04x val=%08x\n", es1371->mem_page, port, val); } break; default: - audiopci_log("Bad es1371_outl: port=%04x val=%08x\n", port, val); + snddev_log("Bad es1371_outl: port=%04x val=%08x\n", port, val); } } @@ -710,7 +689,7 @@ static void capture_event(es1371_t *es1371, int type, int rw, uint16_t port) es1371->legacy_ctrl |= ((port << LEGACY_EVENT_ADDR_SHIFT) & LEGACY_EVENT_ADDR_MASK); es1371->legacy_ctrl &= ~LEGACY_INT; nmi = 1; -// audiopci_log("Event! %s %04x\n", rw ? "write" : "read", port); +// snddev_log("Event! %s %04x\n", rw ? "write" : "read", port); } static void capture_write_sscape(uint16_t port, uint8_t val, void *p) @@ -854,7 +833,7 @@ static uint8_t es1371_pci_read(int func, int addr, void *p) if (func) return 0; - //audiopci_log("ES1371 PCI read %08X PC=%08x\n", addr, cpu_state.pc); + //snddev_log("ES1371 PCI read %08X PC=%08x\n", addr, cpu_state.pc); switch (addr) { @@ -911,7 +890,7 @@ static void es1371_pci_write(int func, int addr, uint8_t val, void *p) if (func) return; -// audiopci_log("ES1371 PCI write %04X %02X PC=%08x\n", addr, val, cpu_state.pc); +// snddev_log("ES1371 PCI write %04X %02X PC=%08x\n", addr, val, cpu_state.pc); switch (addr) { @@ -958,7 +937,7 @@ static void es1371_pci_write(int func, int addr, uint8_t val, void *p) es1371->pmcsr = (es1371->pmcsr & 0x00ff) | ((val & 0x01) << 8); break; } -// audiopci_log("es1371->base_addr %08x\n", es1371->base_addr); +// snddev_log("es1371->base_addr %08x\n", es1371->base_addr); } static void es1371_fetch(es1371_t *es1371, int dac_nr) @@ -967,7 +946,7 @@ static void es1371_fetch(es1371_t *es1371, int dac_nr) int pos = es1371->dac[dac_nr].buffer_pos & 63; int c; -//audiopci_log("Fetch format=%i %08x %08x %08x %08x %08x\n", format, es1371->dac[dac_nr].count, es1371->dac[dac_nr].size, es1371->dac[dac_nr].curr_samp_ct,es1371->dac[dac_nr].samp_ct, es1371->dac[dac_nr].addr); +//snddev_log("Fetch format=%i %08x %08x %08x %08x %08x\n", format, es1371->dac[dac_nr].count, es1371->dac[dac_nr].size, es1371->dac[dac_nr].curr_samp_ct,es1371->dac[dac_nr].samp_ct, es1371->dac[dac_nr].addr); switch (format) { case FORMAT_MONO_8: @@ -1030,7 +1009,7 @@ static void es1371_fetch(es1371_t *es1371, int dac_nr) { es1371->dac[dac_nr].buffer_l[(pos+c) & 63] = mem_readw_phys(es1371->dac[dac_nr].addr); es1371->dac[dac_nr].buffer_r[(pos+c) & 63] = mem_readw_phys(es1371->dac[dac_nr].addr + 2); -// audiopci_log("Fetch %02x %08x %04x %04x\n", (pos+c) & 63, es1371->dac[dac_nr].addr, es1371->dac[dac_nr].buffer_l[(pos+c) & 63], es1371->dac[dac_nr].buffer_r[(pos+c) & 63]); +// snddev_log("Fetch %02x %08x %04x %04x\n", (pos+c) & 63, es1371->dac[dac_nr].addr, es1371->dac[dac_nr].buffer_l[(pos+c) & 63], es1371->dac[dac_nr].buffer_r[(pos+c) & 63]); es1371->dac[dac_nr].addr += 4; es1371->dac[dac_nr].buffer_pos_end++; @@ -1100,10 +1079,10 @@ static void es1371_next_sample_filtered(es1371_t *es1371, int dac_nr, int out_id es1371->dac[dac_nr].filtered_r[out_idx+c] = (int)low_fir_es1371(dac_nr, 1, 0); } -// audiopci_log("Use %02x %04x %04x\n", es1371->dac[dac_nr].buffer_pos & 63, es1371->dac[dac_nr].out_l, es1371->dac[dac_nr].out_r); +// snddev_log("Use %02x %04x %04x\n", es1371->dac[dac_nr].buffer_pos & 63, es1371->dac[dac_nr].out_l, es1371->dac[dac_nr].out_r); es1371->dac[dac_nr].buffer_pos++; -// audiopci_log("Next sample %08x %08x %08x\n", es1371->dac[dac_nr].buffer_pos, es1371->dac[dac_nr].buffer_pos_end, es1371->dac[dac_nr].curr_samp_ct); +// snddev_log("Next sample %08x %08x %08x\n", es1371->dac[dac_nr].buffer_pos, es1371->dac[dac_nr].buffer_pos_end, es1371->dac[dac_nr].curr_samp_ct); } //static FILE *es1371_f;//,*es1371_f2; @@ -1158,7 +1137,7 @@ static void es1371_poll(void *p) es1371->dac[0].out_l = ((samp1_l * (0x8000 - frac)) + (samp2_l * frac)) >> 15; es1371->dac[0].out_r = ((samp1_r * (0x8000 - frac)) + (samp2_r * frac)) >> 15; -// audiopci_log("1Samp %i %i %08x\n", es1371->dac[0].curr_samp_ct, es1371->dac[0].samp_ct, es1371->dac[0].ac); +// snddev_log("1Samp %i %i %08x\n", es1371->dac[0].curr_samp_ct, es1371->dac[0].samp_ct, es1371->dac[0].ac); es1371->dac[0].ac += es1371->dac[0].vf; es1371->dac[0].ac &= ((32 << 15) - 1); if ((es1371->dac[0].ac >> (15+4)) != es1371->dac[0].f_pos) @@ -1169,7 +1148,7 @@ static void es1371_poll(void *p) es1371->dac[0].curr_samp_ct++; if (es1371->dac[0].curr_samp_ct == es1371->dac[0].samp_ct) { -// audiopci_log("DAC1 IRQ\n"); +// snddev_log("DAC1 IRQ\n"); es1371->int_status |= INT_STATUS_DAC1; es1371_update_irqs(es1371); } @@ -1191,7 +1170,7 @@ static void es1371_poll(void *p) es1371->dac[1].out_l = ((samp1_l * (0x8000 - frac)) + (samp2_l * frac)) >> 15; es1371->dac[1].out_r = ((samp1_r * (0x8000 - frac)) + (samp2_r * frac)) >> 15; -// audiopci_log("2Samp %i %i %08x\n", es1371->dac[1].curr_samp_ct, es1371->dac[1].samp_ct, es1371->dac[1].ac); +// snddev_log("2Samp %i %i %08x\n", es1371->dac[1].curr_samp_ct, es1371->dac[1].samp_ct, es1371->dac[1].ac); es1371->dac[1].ac += es1371->dac[1].vf; es1371->dac[1].ac &= ((32 << 15) - 1); if ((es1371->dac[1].ac >> (15+4)) != es1371->dac[1].f_pos) @@ -1203,7 +1182,7 @@ static void es1371_poll(void *p) if (es1371->dac[1].curr_samp_ct > es1371->dac[1].samp_ct) { // es1371->dac[1].curr_samp_ct = 0; -// audiopci_log("DAC2 IRQ\n"); +// snddev_log("DAC2 IRQ\n"); es1371->int_status |= INT_STATUS_DAC2; es1371_update_irqs(es1371); } diff --git a/src/sound/snd_emu8k.c b/src/sound/snd_emu8k.c index e5014c6..73be9fb 100644 --- a/src/sound/snd_emu8k.c +++ b/src/sound/snd_emu8k.c @@ -8,7 +8,7 @@ * * Implementation of Emu8000 emulator. * - * Version: @(#)snd_emu8k.c 1.0.7 2018/03/31 + * Version: @(#)snd_emu8k.c 1.0.8 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -37,11 +37,11 @@ * USA. */ #include -#include #include #include #include #include +#include #include #include #define HAVE_STDARG_H @@ -335,18 +335,18 @@ uint32_t rep_count_w = 0; #endif //EMU8K_DEBUG_REGISTERS -#ifdef ENABLE_EMU8K_LOG -int emu8k_do_log = ENABLE_EMU8K_LOG; +#ifdef ENABLE_SOUND_EMU8K_LOG +int sound_emu8k_do_log = ENABLE_SOUND_EMU8K_LOG; #endif static void emu8k_log(const char *fmt, ...) { -#ifdef ENABLE_EMU8K_LOG +#ifdef ENABLE_SOUND_EMU8K_LOG va_list ap; - if (emu8k_do_log) { + if (sound_emu8k_do_log) { va_start(ap, fmt); pclog_ex(fmt, ap); va_end(ap); diff --git a/src/sound/snd_mpu401.c b/src/sound/snd_mpu401.c index 99d1fb9..93a406d 100644 --- a/src/sound/snd_mpu401.c +++ b/src/sound/snd_mpu401.c @@ -8,7 +8,7 @@ * * Roland MPU-401 emulation. * - * Version: @(#)snd_mpu401.c 1.0.3 2018/03/28 + * Version: @(#)snd_mpu401.c 1.0.4 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -45,6 +45,7 @@ #include #include #include +#define HAVE_STDARG_H #include "../emu.h" #include "../device.h" #include "../io.h" @@ -67,9 +68,8 @@ static int64_t mpu401_event_callback = 0LL; static int64_t mpu401_eoi_callback = 0LL; static int64_t mpu401_reset_callback = 0LL; -#ifdef ENABLE_MPU401_LOG -static int mpu401_do_log = ENABLE_MPU401_LOG; -static char logfmt[512]; +#ifdef ENABLE_SOUND_MPU401_LOG +int sound_mpu401_do_log = ENABLE_SOUND_MPU401_LOG; #endif @@ -78,22 +78,19 @@ static void MPU401_EOIHandlerDispatch(void *p); static void -mpulog(const char *fmt, ...) +mpu_log(const char *fmt, ...) { -#ifdef ENABLE_MPU401_LOG +#ifdef ENABLE_SOUND_MPU401_LOG va_list ap; - if (mpu401_do_log) { - va_start(ap, fmt); - memset(logfmt, 0, 512); - strcpy(logfmt, "MPU-401: "); - strcpy(logfmt + strlen(logfmt), fmt); - vprintf(logfmt, ap); - va_end(ap); + if (sound_mpu401_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); } #endif } -#define pclog mpulog +#define pclog mpu_log static void diff --git a/src/sound/sound.c b/src/sound/sound.c index 49e8f7c..ddce303 100644 --- a/src/sound/sound.c +++ b/src/sound/sound.c @@ -8,7 +8,7 @@ * * Sound emulation core. * - * Version: @(#)sound.c 1.0.4 2018/03/31 + * Version: @(#)sound.c 1.0.5 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -40,7 +40,9 @@ #include #include #include +#include #include +#define HAVE_STDARG_H #include "../emu.h" #include "../device.h" #include "../timer.h" @@ -77,9 +79,12 @@ typedef struct { } sound_handler_t; -int sound_card_current = 0; -int sound_pos_global = 0; -int sound_gain = 0; +#ifdef ENABLE_SOUND_DEV_LOG +int sound_dev_do_log = ENABLE_SOUND_DEV_LOG; +#endif +int sound_card_current = 0; +int sound_pos_global = 0; +int sound_gain = 0; volatile int soundon = 1; @@ -125,6 +130,21 @@ static const SOUND_CARD sound_cards[] = }; +void +snddev_log(const char *fmt, ...) +{ +#ifdef ENABLE_SOUND_DEV_LOG + va_list ap; + + if (sound_dev_do_log) { + va_start(ap, fmt); + pclog_ex(fmt, ap); + va_end(ap); + } +#endif +} + + int sound_card_available(int card) { if (sound_cards[card].device) diff --git a/src/sound/sound.h b/src/sound/sound.h index ce335cc..37caf0e 100644 --- a/src/sound/sound.h +++ b/src/sound/sound.h @@ -8,7 +8,7 @@ * * Definitions for the Sound Emulation core. * - * Version: @(#)sound.h 1.0.3 2018/03/31 + * Version: @(#)sound.h 1.0.4 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -40,14 +40,14 @@ # define EMU_SOUND_H -extern int sound_gain; - #define SOUNDBUFLEN (48000/50) #define CD_FREQ 44100 #define CD_BUFLEN (CD_FREQ / 10) +extern int sound_dev_do_log; + extern int ppispeakon; extern int gated, speakval, @@ -56,6 +56,10 @@ extern int gated, extern int sound_pos_global; extern int sound_card_current; +extern int sound_gain; + + +extern void snddev_log(const char *fmt, ...); extern void sound_add_handler(void (*get_buffer)(int32_t *buffer, \ int len, void *p), void *p); diff --git a/src/ui.h b/src/ui.h index eebf018..7959ec6 100644 --- a/src/ui.h +++ b/src/ui.h @@ -8,7 +8,7 @@ * * Define the various UI functions. * - * Version: @(#)ui.h 1.0.2 2018/03/01 + * Version: @(#)ui.h 1.0.3 2018/04/02 * * Author: Fred N. van Kempen, * @@ -57,6 +57,52 @@ extern "C" { # define RENDER_FPS 30 /* default render speed */ #endif + +/* Define whether or not we need the Logging submenu. */ +#if defined(ENABLE_PCI_LOG) || \ + defined(ENABLE_KEYBOARD_LOG) || \ + defined(ENABLE_SERIAL_LOG) || \ + defined(ENABLE_FDC_LOG) || defined(ENABLE_D86F_LOG) || \ + defined(ENABLE_HDC_LOG) || defined(ENABLE_HDD_LOG) || \ + defined(ENABLE_ZIP_LOG) || defined(ENABLE_CDROM_LOG) || \ + defined(ENABLE_CDROM_IMAGE_LOG) || defined(ENABLE_CDROM_IOCTL_LOG) || \ + defined(ENABLE_SOUND_EMU8K_LOG) || defined(ENABLE_SOUND_MPU401_LOG) || \ + defined(ENABLE_SOUND_DEV_LOG) || \ + defined(ENABLE_NIC_LOG) || \ + defined(ENABLE_SCSI_BUS_LOG) || defined(ENABLE_SCSI_DISK_LOG) || \ + defined(ENABLE_SCSI_DEV_LOG) || defined(ENABLE_SCSI_X54X_LOG) || \ + defined(ENABLE_VOODOO_LOG) +# define ENABLE_LOG_TOGGLES 1 +#endif + +#if defined(ENABLE_LOG_BREAKPOINT) +# define ENABLE_LOG_COMMANDS 1 +#endif + + +#ifdef ENABLE_LOG_TOGGLES +extern int pci_do_log; +extern int keyboard_do_log; +extern int serial_do_log; +extern int fdc_do_log; +extern int d86f_do_log; +extern int hdc_do_log; +extern int hdd_do_log; +extern int zip_do_log; +extern int cdrom_do_log; +extern int cdrom_image_do_log; +extern int cdrom_ioctl_do_log; +extern int sound_emu8k_do_log; +extern int sound_mpu401_do_log; +extern int sound_dev_do_log; +extern int nic_do_log; +extern int scsi_bus_do_log; +extern int scsi_hd_do_log; +extern int scsi_dev_do_log; +extern int scsi_x54x_do_log; +extern int voodoo_do_log; +#endif + /* Message Box functions. */ #define MBX_INFO 1 #define MBX_ERROR 2 diff --git a/src/video/vid_voodoo.c b/src/video/vid_voodoo.c index 01a547a..c9e5eb6 100644 --- a/src/video/vid_voodoo.c +++ b/src/video/vid_voodoo.c @@ -8,7 +8,7 @@ * * Emulation of the 3DFX Voodoo Graphics controller. * - * Version: @(#)vid_voodoo.c 1.0.6 2018/03/31 + * Version: @(#)vid_voodoo.c 1.0.7 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -42,12 +42,14 @@ #include #include #include +#include #include #ifdef _MSC_VER # include #endif #include #include +#define HAVE_STDARG_H #include "../emu.h" #include "../cpu/cpu.h" #include "../machine/machine.h" diff --git a/src/video/video.h b/src/video/video.h index 5fa3b2a..8d3ccf5 100644 --- a/src/video/video.h +++ b/src/video/video.h @@ -8,7 +8,7 @@ * * Definitions for the video controller module. * - * Version: @(#)video.h 1.0.12 2018/03/31 + * Version: @(#)video.h 1.0.13 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -271,10 +271,6 @@ extern void loadfont(wchar_t *s, int format); extern int get_actual_size_x(void); extern int get_actual_size_y(void); -#ifdef ENABLE_VRAM_DUMP -extern void svga_dump_vram(void); -#endif - #ifdef __cplusplus } #endif diff --git a/src/win/VARCem.rc b/src/win/VARCem.rc index db6f95a..2d29dac 100644 --- a/src/win/VARCem.rc +++ b/src/win/VARCem.rc @@ -8,7 +8,7 @@ * * Application resource script for Windows. * - * Version: @(#)VARCem.rc 1.0.11 2018/03/31 + * Version: @(#)VARCem.rc 1.0.12 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -40,6 +40,7 @@ #include "../emu.h" #include "../version.h" #include "../plat.h" +#include "../ui.h" #undef IN_RESOURCE_H #define APSTUDIO_READONLY_SYMBOLS @@ -67,7 +68,7 @@ BEGIN POPUP "&Action" BEGIN MENUITEM "&Hard Reset", IDM_ACTION_HRESET - MENUITEM "&Ctrl+Alt+Del\tCtrl+F12", IDM_ACTION_RESET_CAD + MENUITEM "&Ctrl+Alt+Del", IDM_ACTION_RESET_CAD MENUITEM SEPARATOR MENUITEM "Ctrl+Alt+&Esc", IDM_ACTION_CTRL_ALT_ESC MENUITEM SEPARATOR @@ -138,51 +139,89 @@ BEGIN BEGIN MENUITEM "&Settings...", IDM_CONFIG MENUITEM SEPARATOR +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) + POPUP "&Logging" + BEGIN + +# ifdef ENABLE_PCI_LOG + MENUITEM "Enable PCI bus logs\tCtrl+F1", IDM_LOG_PCI +# endif +# ifdef ENABLE_KEYBOARD_LOG + MENUITEM "Enable keyboard logs\tCtrl+F2", IDM_LOG_KEYBOARD +# endif +# ifdef ENABLE_SERIAL_LOG + MENUITEM "Enable Serial Port logs\tCtrl+F3", IDM_LOG_SERIAL +# endif +# ifdef ENABLE_FDC_LOG + MENUITEM "Enable floppy controller logs\tCtrl+F4", IDM_LOG_FDC +# endif +# ifdef ENABLE_D86F_LOG + MENUITEM "Enable floppy (86F) logs\tCtrl+F5", IDM_LOG_D86F +# endif +# ifdef ENABLE_HDC_LOG + MENUITEM "Enable Hard Disk controller logs\tCtrl+F6", IDM_LOG_HDC +# endif +# ifdef ENABLE_HDD_LOG + MENUITEM "Enable Hard Disk images logs\tCtrl+F7", IDM_LOG_HDD +# endif +# ifdef ENABLE_ZIP_LOG + MENUITEM "Enable ZIP drive logs\tCtrl+F8", IDM_LOG_ZIP +# endif +# ifdef ENABLE_CDROM_LOG + MENUITEM "Enable CD-ROM logs\tCtrl+F9", IDM_LOG_CDROM +# endif +# ifdef ENABLE_CDROM_IMAGE_LOG + MENUITEM "Enable CD-ROM images logs\tCtrl+F10", IDM_LOG_CDROM_IMAGE +# endif +# ifdef ENABLE_CDROM_IOCTL_LOG + MENUITEM "Enable CD-ROM ioctl logs\tCtrl+F11", IDM_LOG_CDROM_IOCTL +# endif +# ifdef ENABLE_NIC_LOG + MENUITEM "Enable Network logs\tCtrl+F12", IDM_LOG_NIC +# endif +# ifdef ENABLE_SOUND_EMU8K_LOG + MENUITEM "Enable sound EMU8K logs\tCtrl+Alt+F1", IDM_LOG_SOUND_EMU8K +# endif +# ifdef ENABLE_SOUND_MPU401_LOG + MENUITEM "Enable sound MPU401 logs\tCtrl+Alt+F2", IDM_LOG_SOUND_MPU401 +# endif +# ifdef ENABLE_SOUND_AUDIOPCI_LOG + MENUITEM "Enable sound device logs\tCtrl+Alt+F3", IDM_LOG_SOUND_AUDIOPCI +# endif +# ifdef ENABLE_SCSI_BUS_LOG + MENUITEM "Enable SCSI bus logs\tCtrl+Alt+F4", IDM_LOG_SCSI_BUS +# endif +# ifdef ENABLE_SCSI_DISK_LOG + MENUITEM "Enable SCSI disk logs\tCtrl+Alt+F5", IDM_LOG_SCSI_DISK +# endif +# ifdef ENABLE_SCSI_DEV_LOG + MENUITEM "Enable SCSI controller logs\tCtrl+Alt+F6", IDM_LOG_SCSI_DEV +# endif +# ifdef ENABLE_SCSI_X54X_LOG + MENUITEM "Enable Adaptec/BusLogic command logs\tCtrl+Alt+F7", IDM_LOG_SCSI_X54X +# endif +# ifdef ENABLE_VOODOO_LOG + MENUITEM "Enable Voodoo logs\tCtrl+Alt+F9", IDM_LOG_VOODOO +# endif + +# if defined(ENABLE_LOG_COMMANDS) && defined(ENABLE_LOG_TOGGLES) + MENUITEM SEPARATOR +# endif + +# ifdef ENABLE_LOG_BREAKPOINT + MENUITEM "&Log breakpoint\tCtrl+Insert", IDM_LOG_BREAKPOINT +# endif + MENUITEM SEPARATOR + END +#endif MENUITEM "S&tatus", IDM_STATUS - MENUITEM "Take s&creenshot\tCtrl+F11", IDM_ACTION_SCREENSHOT + MENUITEM "Take s&creenshot\tCtrl+Esc", IDM_ACTION_SCREENSHOT MENUITEM SEPARATOR MENUITEM "&Update status bar icons", IDM_UPDATE_ICONS END -#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) - POPUP "&Logging" - BEGIN -# ifdef ENABLE_BUSLOGIC_LOG - MENUITEM "Enable BusLogic logs\tCtrl+F4", IDM_LOG_BUSLOGIC -# endif -# ifdef ENABLE_CDROM_LOG - MENUITEM "Enable CD-ROM logs\tCtrl+F5", IDM_LOG_CDROM -# endif -# ifdef ENABLE_D86F_LOG - MENUITEM "Enable floppy (86F) logs\tCtrl+F6", IDM_LOG_D86F -# endif -# ifdef ENABLE_FDC_LOG - MENUITEM "Enable floppy controller logs\tCtrl+F7", IDM_LOG_FDC -# endif -# ifdef ENABLE_IDE_LOG - MENUITEM "Enable IDE logs\tCtrl+F8", IDM_LOG_IDE -# endif -# ifdef ENABLE_SERIAL_LOG - MENUITEM "Enable Serial Port logs\tCtrl+F3", IDM_LOG_SERIAL -# endif -# ifdef ENABLE_NIC_LOG - MENUITEM "Enable Network logs\tCtrl+F9", IDM_LOG_NIC -# endif -# ifdef ENABLE_LOG_COMMANDS -# ifdef ENABLE_LOG_TOGGLES - MENUITEM SEPARATOR -# endif -# ifdef ENABLE_LOG_BREAKPOINT - MENUITEM "&Log breakpoint\tCtrl+F10", IDM_LOG_BREAKPOINT -# endif -# ifdef ENABLE_VRAM_DUMP - MENUITEM "Dump &video RAM\tCtrl+F1", IDM_DUMP_VRAM -# endif -# endif - END -#endif POPUP "&Help" BEGIN - MENUITEM "&About VARCem...", IDM_ABOUT + MENUITEM "&About VARCem...", IDM_ABOUT END END @@ -199,37 +238,74 @@ END MainAccel ACCELERATORS MOVEABLE PURE BEGIN -#ifdef ENABLE_VRAM_DUMP - VK_F1, IDM_DUMP_VRAM, CONTROL, VIRTKEY +#ifdef ENABLE_PCI_LOG + VK_F1, IDM_LOG_PCI, VIRTKEY, CONTROL +#endif +#ifdef ENABLE_KEYBOARD_LOG + VK_F2, IDM_LOG_KEYBOARD, VIRTKEY, CONTROL #endif #ifdef ENABLE_SERIAL_LOG - VK_F3, IDM_LOG_SERIAL, CONTROL, VIRTKEY -#endif -#ifdef ENABLE_BUSLOGIC_LOG - VK_F4, IDM_LOG_BUSLOGIC, CONTROL, VIRTKEY -#endif -#ifdef ENABLE_CDROM_LOG - VK_F5, IDM_LOG_CDROM, CONTROL, VIRTKEY -#endif -#ifdef ENABLE_D86F_LOG - VK_F6, IDM_LOG_D86F, CONTROL, VIRTKEY + VK_F3, IDM_LOG_SERIAL, VIRTKEY, CONTROL #endif #ifdef ENABLE_FDC_LOG - VK_F7, IDM_LOG_FDC, CONTROL, VIRTKEY + VK_F4, IDM_LOG_FDC, VIRTKEY, CONTROL #endif -#ifdef ENABLE_IDE_LOG - VK_F8, IDM_LOG_IDE, CONTROL, VIRTKEY +#ifdef ENABLE_D86F_LOG + VK_F5, IDM_LOG_D86F, VIRTKEY, CONTROL +#endif +#ifdef ENABLE_HDC_LOG + VK_F6, IDM_LOG_HDC, VIRTKEY, CONTROL +#endif +#ifdef ENABLE_HDD_LOG + VK_F7, IDM_LOG_HDD, VIRTKEY, CONTROL +#endif +#ifdef ENABLE_ZIP_LOG + VK_F8, IDM_LOG_ZIP, VIRTKEY, CONTROL +#endif +#ifdef ENABLE_CDROM_LOG + VK_F9, IDM_LOG_CDROM, VIRTKEY, CONTROL +#endif +#ifdef ENABLE_CDROM_IMAGE_LOG + VK_F10, IDM_LOG_CDROM_IMAGE, VIRTKEY, CONTROL +#endif +#ifdef ENABLE_CDROM_IOCTL_LOG + VK_F11, IDM_LOG_CDROM_IOCTL, VIRTKEY, CONTROL #endif #ifdef ENABLE_NIC_LOG - VK_F9, IDM_LOG_NIC, CONTROL, VIRTKEY + VK_F12, IDM_LOG_NIC, VIRTKEY, CONTROL #endif + +# ifdef ENABLE_EMU8K_LOG + VK_F1, IDM_LOG_SOUND_EMU8K, VIRTKEY, CONTROL, ALT +# endif +# ifdef ENABLE_MPU401_LOG + VK_F2, IDM_LOG_SOUND_MPU401, VIRTKEY, CONTROL, ALT +# endif +# ifdef ENABLE_AUDIOPCI_LOG + VK_F3, IDM_LOG_SOUND_AUDIOPCI, VIRTKEY, CONTROL, ALT +# endif +# ifdef ENABLE_SCSI_BUS_LOG + VK_F4, IDM_LOG_SCSI_BUS, VIRTKEY, CONTROL, ALT +# endif +# ifdef ENABLE_SCSI_DISK_LOG + VK_F5, IDM_LOG_SCSI_DISK, VIRTKEY, CONTROL, ALT +# endif +# ifdef ENABLE_SCSI_DEV_LOG + VK_F6, IDM_LOG_SCSI_DEV, VIRTKEY, CONTROL, ALT +# endif +# ifdef ENABLE_X54X_LOG + VK_F7, IDM_LOG_SCSI_X54X, VIRTKEY, CONTROL, ALT +# endif +# ifdef ENABLE_VOODOO_LOG + VK_F9, IDM_LOG_VOODOO, VIRTKEY, CONTROL, ALT +# endif + #ifdef ENABLE_LOG_BREAKPOINT - VK_F10, IDM_LOG_BREAKPOINT, CONTROL, VIRTKEY + VK_INSERT, IDM_LOG_BREAKPOINT, VIRTKEY, CONTROL #endif - VK_PRIOR,IDM_VID_FULLSCREEN, VIRTKEY, CONTROL , ALT - VK_F11, IDM_ACTION_SCREENSHOT, VIRTKEY, CONTROL - VK_F12, IDM_ACTION_RESET_CAD, VIRTKEY, CONTROL - VK_PAUSE,IDM_ACTION_PAUSE, VIRTKEY, CONTROL + VK_PRIOR,IDM_VID_FULLSCREEN, VIRTKEY, CONTROL, ALT + VK_HOME, IDM_ACTION_SCREENSHOT, VIRTKEY, CONTROL + VK_PAUSE,IDM_ACTION_PAUSE, VIRTKEY, CONTROL END diff --git a/src/win/resource.h b/src/win/resource.h index af2c251..9bd009f 100644 --- a/src/win/resource.h +++ b/src/win/resource.h @@ -8,7 +8,7 @@ * * Windows resource defines. * - * Version: @(#)resource.h 1.0.7 2018/03/31 + * Version: @(#)resource.h 1.0.8 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -290,16 +290,29 @@ #define IDM_VID_GRAY_WHITE 40094 #define IDM_KBD_RCTRL_IS_LALT 40101 -#define IDM_LOG_BREAKPOINT 51201 -#define IDM_DUMP_VRAM 51202 // should be an Action - -#define IDM_LOG_SERIAL 51211 -#define IDM_LOG_D86F 51212 -#define IDM_LOG_FDC 51213 -#define IDM_LOG_IDE 51214 -#define IDM_LOG_CDROM 51215 -#define IDM_LOG_NIC 51216 -#define IDM_LOG_BUSLOGIC 51217 +#define IDM_LOGGING 51200 +#define IDM_LOG_BREAKPOINT (IDM_LOGGING + 0) +#define IDM_LOG_PCI (IDM_LOGGING + 1) +#define IDM_LOG_KEYBOARD (IDM_LOGGING + 2) +#define IDM_LOG_SERIAL (IDM_LOGGING + 3) +#define IDM_LOG_FDC (IDM_LOGGING + 4) +#define IDM_LOG_D86F (IDM_LOGGING + 5) +#define IDM_LOG_HDC (IDM_LOGGING + 6) +#define IDM_LOG_HDD (IDM_LOGGING + 7) +#define IDM_LOG_ZIP (IDM_LOGGING + 8) +#define IDM_LOG_CDROM (IDM_LOGGING + 9) +#define IDM_LOG_CDROM_IMAGE (IDM_LOGGING + 10) +#define IDM_LOG_CDROM_IOCTL (IDM_LOGGING + 11) +#define IDM_LOG_NIC (IDM_LOGGING + 12) +#define IDM_LOG_SOUND_EMU8K (IDM_LOGGING + 13) +#define IDM_LOG_SOUND_MPU401 (IDM_LOGGING + 14) +#define IDM_LOG_SOUND_DEV (IDM_LOGGING + 15) +#define IDM_LOG_SCSI_BUS (IDM_LOGGING + 16) +#define IDM_LOG_SCSI_DISK (IDM_LOGGING + 17) +#define IDM_LOG_SCSI_DEV (IDM_LOGGING + 18) +#define IDM_LOG_SCSI_X54X (IDM_LOGGING + 19) +#define IDM_LOG_VOODOO (IDM_LOGGING + 20) + /* * We need 7 bits for CDROM (2 bits ID and 5 bits for host drive), diff --git a/src/win/win_ui.c b/src/win/win_ui.c index 60b30c0..50562ba 100644 --- a/src/win/win_ui.c +++ b/src/win/win_ui.c @@ -8,7 +8,7 @@ * * Implement the user Interface module. * - * Version: @(#)win_ui.c 1.0.8 2018/03/31 + * Version: @(#)win_ui.c 1.0.9 2018/04/02 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -142,6 +142,150 @@ video_toggle_option(HMENU h, int *val, int id) } +#if defined(ENABLE_LOG_TOGGLES) || defined(ENABLE_LOG_COMMANDS) +/* Simplest way to handle all these, for now.. */ +static void +SetLoggingItem(int idm, int val) +{ + int *ptr = NULL; + + switch(idm) { +#ifdef ENABLE_PCI_LOG + case IDM_LOG_PCI: + ptr = &pci_do_log; + break; +#endif + +#ifdef ENABLE_KEYBOARD_LOG + case IDM_LOG_KEYBOARD: + ptr = &keyboard_do_log; + break; +#endif + +#ifdef ENABLE_SERIAL_LOG + case IDM_LOG_SERIAL: + ptr = &serial_do_log; + break; +#endif + +#ifdef ENABLE_FDC_LOG + case IDM_LOG_FDC: + ptr = &fdc_do_log; + break; +#endif + +#ifdef ENABLE_D86F_LOG + case IDM_LOG_D86F: + ptr = &d86f_do_log; + break; +#endif + +#ifdef ENABLE_HDC_LOG + case IDM_LOG_HDC: + ptr = &hdc_do_log; + break; +#endif + +#ifdef ENABLE_HDD_LOG + case IDM_LOG_HDD: + ptr = &hdd_do_log; + break; +#endif + +#ifdef ENABLE_ZIP_LOG + case IDM_LOG_ZIP: + ptr = &zip_do_log; + break; +#endif + +#ifdef ENABLE_CDROM_LOG + case IDM_LOG_CDROM: + ptr = &cdrom_do_log; + break; +#endif + +#ifdef ENABLE_CDROM_IMAGE_LOG + case IDM_LOG_CDROM_IMAGE: + ptr = &cdrom_image_do_log; + break; +#endif + +#ifdef ENABLE_CDROM_IOCTL_LOG + case IDM_LOG_CDROM_IOCTL: + ptr = &cdrom_ioctl_do_log; + break; +#endif + +#ifdef ENABLE_NIC_LOG + case IDM_LOG_NIC: + ptr = &nic_do_log; + break; +#endif + +#ifdef ENABLE_SOUND_EMU8K_LOG + case IDM_LOG_SOUND_EMU8K: + ptr = &sound_emu8k_do_log; + break; +#endif + +#ifdef ENABLE_SOUND_MPU401_LOG + case IDM_LOG_SOUND_MPU401: + ptr = &sound_mpu401_do_log; + break; +#endif + +#ifdef ENABLE_SOUND_DEV_LOG + case IDM_LOG_SOUND_DEV: + ptr = &sound_dev_do_log; + break; +#endif + +#ifdef ENABLE_SCSI_BUS_LOG + case IDM_LOG_SCSI_BUS: + ptr = &scsi_bus_do_log; + break; +#endif + +#ifdef ENABLE_SCSI_DISK_LOG + case IDM_LOG_SCSI_DISK: + ptr = &scsi_hd_do_log; + break; +#endif + +#ifdef ENABLE_SCSI_DEV_LOG + case IDM_LOG_SCSI_DEV: + ptr = &scsi_dev_do_log; + break; +#endif + +#ifdef ENABLE_SCSI_X54X_LOG + case IDM_LOG_SCSI_X54X: + ptr = &scsi_x54x_do_log; + break; +#endif + +#ifdef ENABLE_VOODOO_LOG + case IDM_LOG_VOODOO: + ptr = &voodoo_do_log; + break; +#endif + } + + if (ptr != NULL) { + /* Set the desired value. */ + if (val != 0xff) { + /* Initialize the logging value. */ + if (val < 0) *ptr ^= 1; + else *ptr = val; + } + + /* And update its menu entry. */ + CheckMenuItem(menuMain, idm, (*ptr) ? MF_CHECKED : MF_UNCHECKED); + } +} +#endif + + static void ResetAllMenus(void) { @@ -156,27 +300,26 @@ ResetAllMenus(void) CheckMenuItem(menuMain, IDM_UPDATE_ICONS, MF_UNCHECKED); #ifdef ENABLE_LOG_TOGGLES -# ifdef ENABLE_BUSLOGIC_LOG - CheckMenuItem(menuMain, IDM_LOG_BUSLOGIC, MF_UNCHECKED); -# endif -# ifdef ENABLE_CDROM_LOG - CheckMenuItem(menuMain, IDM_LOG_CDROM, MF_UNCHECKED); -# endif -# ifdef ENABLE_D86F_LOG - CheckMenuItem(menuMain, IDM_LOG_D86F, MF_UNCHECKED); -# endif -# ifdef ENABLE_FDC_LOG - CheckMenuItem(menuMain, IDM_LOG_FDC, MF_UNCHECKED); -# endif -# ifdef ENABLE_IDE_LOG - CheckMenuItem(menuMain, IDM_LOG_IDE, MF_UNCHECKED); -# endif -# ifdef ENABLE_SERIAL_LOG - CheckMenuItem(menuMain, IDM_LOG_SERIAL, MF_UNCHECKED); -# endif -# ifdef ENABLE_NIC_LOG - CheckMenuItem(menuMain, IDM_LOG_NIC, MF_UNCHECKED); -# endif + SetLoggingItem(IDM_LOG_PCI, 0xff); + SetLoggingItem(IDM_LOG_KEYBOARD, 0xff); + SetLoggingItem(IDM_LOG_SERIAL, 0xff); + SetLoggingItem(IDM_LOG_FDC, 0xff); + SetLoggingItem(IDM_LOG_D86F, 0xff); + SetLoggingItem(IDM_LOG_HDC, 0xff); + SetLoggingItem(IDM_LOG_HDD, 0xff); + SetLoggingItem(IDM_LOG_ZIP, 0xff); + SetLoggingItem(IDM_LOG_CDROM, 0xff); + SetLoggingItem(IDM_LOG_CDROM_IMAGE, 0xff); + SetLoggingItem(IDM_LOG_CDROM_IOCTL, 0xff); + SetLoggingItem(IDM_LOG_NIC, 0xff); + SetLoggingItem(IDM_LOG_SOUND_EMU8K, 0xff); + SetLoggingItem(IDM_LOG_SOUND_MPU401, 0xff); + SetLoggingItem(IDM_LOG_SOUND_DEV, 0xff); + SetLoggingItem(IDM_LOG_SCSI_BUS, 0xff); + SetLoggingItem(IDM_LOG_SCSI_DISK, 0xff); + SetLoggingItem(IDM_LOG_SCSI_DEV, 0xff); + SetLoggingItem(IDM_LOG_SCSI_X54X, 0xff); + SetLoggingItem(IDM_LOG_VOODOO, 0xff); #endif CheckMenuItem(menuMain, IDM_VID_FORCE43, MF_UNCHECKED); @@ -217,30 +360,6 @@ ResetAllMenus(void) CheckMenuItem(menuMain, IDM_UPDATE_ICONS, update_icons ? MF_CHECKED : MF_UNCHECKED); -#ifdef ENABLE_LOG_TOGGLES -# ifdef ENABLE_BUSLOGIC_LOG - CheckMenuItem(menuMain, IDM_LOG_BUSLOGIC, buslogic_do_log?MF_CHECKED:MF_UNCHECKED); -# endif -# ifdef ENABLE_CDROM_LOG - CheckMenuItem(menuMain, IDM_LOG_CDROM, cdrom_do_log?MF_CHECKED:MF_UNCHECKED); -# endif -# ifdef ENABLE_D86F_LOG - CheckMenuItem(menuMain, IDM_LOG_D86F, d86f_do_log?MF_CHECKED:MF_UNCHECKED); -# endif -# ifdef ENABLE_FDC_LOG - CheckMenuItem(menuMain, IDM_LOG_FDC, fdc_do_log?MF_CHECKED:MF_UNCHECKED); -# endif -# ifdef ENABLE_IDE_LOG - CheckMenuItem(menuMain, IDM_LOG_IDE, ide_do_log?MF_CHECKED:MF_UNCHECKED); -# endif -# ifdef ENABLE_SERIAL_LOG - CheckMenuItem(menuMain, IDM_LOG_SERIAL, serial_do_log?MF_CHECKED:MF_UNCHECKED); -# endif -# ifdef ENABLE_NIC_LOG - CheckMenuItem(menuMain, IDM_LOG_NIC, nic_do_log?MF_CHECKED:MF_UNCHECKED); -# endif -#endif - CheckMenuItem(menuMain, IDM_VID_FORCE43, force_43?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_OVERSCAN, enable_overscan?MF_CHECKED:MF_UNCHECKED); CheckMenuItem(menuMain, IDM_VID_INVERT, invert_display ? MF_CHECKED : MF_UNCHECKED); @@ -510,69 +629,36 @@ MainWindowProcedure(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) config_save(); break; -#ifdef ENABLE_LOG_TOGGLES -# ifdef ENABLE_BUSLOGIC_LOG - case IDM_LOG_BUSLOGIC: - buslogic_do_log ^= 1; - CheckMenuItem(hmenu, IDM_LOG_BUSLOGIC, buslogic_do_log ? MF_CHECKED : MF_UNCHECKED); - break; -# endif - -# ifdef ENABLE_CDROM_LOG - case IDM_LOG_CDROM: - cdrom_do_log ^= 1; - CheckMenuItem(hmenu, IDM_LOG_CDROM, cdrom_do_log ? MF_CHECKED : MF_UNCHECKED); - break; -# endif - -# ifdef ENABLE_D86F_LOG - case IDM_LOG_D86F: - d86f_do_log ^= 1; - CheckMenuItem(hmenu, IDM_LOG_D86F, d86f_do_log ? MF_CHECKED : MF_UNCHECKED); - break; -# endif - -# ifdef ENABLE_FDC_LOG - case IDM_LOG_FDC: - fdc_do_log ^= 1; - CheckMenuItem(hmenu, IDM_LOG_FDC, fdc_do_log ? MF_CHECKED : MF_UNCHECKED); - break; -# endif - -# ifdef ENABLE_IDE_LOG - case IDM_LOG_IDE: - ide_do_log ^= 1; - CheckMenuItem(hmenu, IDM_LOG_IDE, ide_do_log ? MF_CHECKED : MF_UNCHECKED); - break; -# endif - -# ifdef ENABLE_SERIAL_LOG - case IDM_LOG_SERIAL: - serial_do_log ^= 1; - CheckMenuItem(hmenu, IDM_LOG_SERIAL, serial_do_log ? MF_CHECKED : MF_UNCHECKED); - break; -# endif - -# ifdef ENABLE_NIC_LOG - case IDM_LOG_NIC: - nic_do_log ^= 1; - CheckMenuItem(hmenu, IDM_LOG_NIC, nic_do_log ? MF_CHECKED : MF_UNCHECKED); - break; -# endif -#endif - #ifdef ENABLE_LOG_BREAKPOINT case IDM_LOG_BREAKPOINT: pclog("---- LOG BREAKPOINT ----\n"); break; #endif -#ifdef ENABLE_VRAM_DUMP - case IDM_DUMP_VRAM: - svga_dump_vram(); +#ifdef ENABLE_LOG_TOGGLES + case IDM_LOG_PCI: + case IDM_LOG_KEYBOARD: + case IDM_LOG_SERIAL: + case IDM_LOG_FDC: + case IDM_LOG_D86F: + case IDM_LOG_HDC: + case IDM_LOG_HDD: + case IDM_LOG_ZIP: + case IDM_LOG_CDROM: + case IDM_LOG_CDROM_IMAGE: + case IDM_LOG_CDROM_IOCTL: + case IDM_LOG_NIC: + case IDM_LOG_SOUND_EMU8K: + case IDM_LOG_SOUND_MPU401: + case IDM_LOG_SOUND_DEV: + case IDM_LOG_SCSI_BUS: + case IDM_LOG_SCSI_DISK: + case IDM_LOG_SCSI_DEV: + case IDM_LOG_SCSI_X54X: + case IDM_LOG_VOODOO: + SetLoggingItem(LOWORD(wParam), -1); break; #endif - case IDM_CONFIG_LOAD: plat_pause(1); if (! file_dlg_st(hwnd, IDS_2160, L"", 0) &&