Changes to logging - nothing (other than some parts of pc.c) uses the global pclog anymore (and logs will be almost empty (until the base set logging flags is agreed upon);

Fixes to various hard disk controllers;
Added the Packard Bell PB640;
Fixed the InPort mouse emulation - now it works correctly on Windows NT 3.1;
Removed the status window and the associated variables;
Completely removed the Green B 486 machine;
Fixed the MDSI Genius;
Fixed the single-sided 5.25" floppy drive;
Ported a CPU-related commit from VARCem.
This commit is contained in:
OBattler
2018-05-21 19:04:05 +02:00
parent 534ed6ea32
commit 5d8deea63b
130 changed files with 5062 additions and 3262 deletions

View File

@@ -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.15 2018/04/26
* Version: @(#)hdc_mfm_at.c 1.0.17 2018/05/02
*
* Authors: Sarah Walker, <http://pcem-emulator.co.uk/>
* Fred N. van Kempen, <decwiz@yahoo.com>
@@ -23,11 +23,13 @@
#define __USE_LARGEFILE64
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#include <stdio.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wchar.h>
#define HAVE_STDARG_H
#include "../86box.h"
#include "../device.h"
#include "../io.h"
@@ -110,28 +112,45 @@ typedef struct {
} mfm_t;
#ifdef ENABLE_MFM_AT_LOG
int mfm_at_do_log = ENABLE_MFM_AT_LOG;
#endif
static void
mfm_at_log(const char *fmt, ...)
{
#ifdef ENABLE_MFM_AT_LOG
va_list ap;
if (mfm_at_do_log) {
va_start(ap, fmt);
pclog_ex(fmt, ap);
va_end(ap);
}
#endif
}
static inline void
irq_raise(mfm_t *mfm)
{
if (!(mfm->fdisk&2))
if (!(mfm->fdisk & 2))
picint(1 << 14);
mfm->irqstat=1;
mfm->irqstat = 1;
}
static inline void
irq_lower(mfm_t *mfm)
{
picintc(1 << 14);
}
if (mfm->irqstat) {
if (!(mfm->fdisk & 2))
picintc(1 << 14);
static void
irq_update(mfm_t *mfm)
{
if (mfm->irqstat && !((pic2.pend|pic2.ins)&0x40) && !(mfm->fdisk & 2))
picint(1 << 14);
mfm->irqstat = 0;
}
}
@@ -153,18 +172,18 @@ 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");
mfm_at_log("WD1003(%d) sector: wrong cylinder\n");
return(1);
}
if (mfm->head > drive->cfg_hpc) {
pclog("WD1003(%d) get_sector: past end of configured heads\n",
mfm_at_log("WD1003(%d) get_sector: past end of configured heads\n",
mfm->drvsel);
return(1);
}
if (mfm->sector >= drive->cfg_spt+1) {
pclog("WD1003(%d) get_sector: past end of configured sectors\n",
mfm_at_log("WD1003(%d) get_sector: past end of configured sectors\n",
mfm->drvsel);
return(1);
}
@@ -172,12 +191,12 @@ get_sector(mfm_t *mfm, off64_t *addr)
#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);
mfm_at_log("WD1003(%d) get_sector: past end of heads\n", mfm->drvsel);
return(1);
}
if (mfm->sector >= drive->spt+1) {
pclog("WD1003(%d) get_sector: past end of sectors\n", mfm->drvsel);
mfm_at_log("WD1003(%d) get_sector: past end of sectors\n", mfm->drvsel);
return(1);
}
#endif
@@ -214,7 +233,7 @@ 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",
mfm_at_log("WD1003(%d) command %02x on non-present drive\n",
mfm->drvsel, val);
mfm->command = 0xff;
mfm->status = STAT_BUSY;
@@ -232,10 +251,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",
mfm_at_log("WD1003(%d) restore, step=%d\n",
mfm->drvsel, drive->steprate);
#endif
drive->curcyl = 0;
mfm->status = STAT_READY|STAT_DSC;
mfm->command &= 0xf0;
@@ -258,10 +275,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",
mfm_at_log("WD1003(%d) read, opt=%d\n",
mfm->drvsel, val&0x03);
#endif
mfm->command &= 0xfc;
if (val & 2)
fatal("WD1003: READ with ECC\n");
@@ -275,10 +290,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",
mfm_at_log("WD1003(%d) write, opt=%d\n",
mfm->drvsel, val & 0x03);
#endif
mfm->command &= 0xfc;
if (val & 2)
fatal("WD1003: WRITE with ECC\n");
@@ -328,11 +341,11 @@ 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",
mfm_at_log("WD1003(%d) parameters: tracks=%d, spt=%i, hpc=%i\n",
mfm->drvsel, drive->tracks,
drive->cfg_spt, drive->cfg_hpc);
} else {
pclog("WD1003(%d) parameters: tracks=%d,spt=%i,hpc=%i (IGNORED)\n",
mfm_at_log("WD1003(%d) parameters: tracks=%d,spt=%i,hpc=%i (IGNORED)\n",
mfm->drvsel, drive->tracks,
drive->cfg_spt, drive->cfg_hpc);
}
@@ -343,7 +356,7 @@ mfm_cmd(mfm_t *mfm, uint8_t val)
break;
default:
pclog("WD1003: bad command %02X\n", val);
mfm_at_log("WD1003: bad command %02X\n", val);
mfm->status = STAT_BUSY;
timer_clock();
mfm->callback = 200LL*MFM_TIME;
@@ -366,7 +379,9 @@ mfm_writew(uint16_t port, uint16_t val, void *priv)
mfm->pos = 0;
mfm->status = STAT_BUSY;
timer_clock();
mfm->callback = 6LL*MFM_TIME;
/* 781.25 us per sector at 5 Mbit/s = 640 kB/s. */
mfm->callback = ((3125LL * TIMER_USEC) / 4LL);
/* mfm->callback = 10LL * MFM_TIME; */
timer_update_outstanding();
}
}
@@ -377,9 +392,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);
#endif
mfm_at_log("WD1003 write(%04x, %02x)\n", port, val);
switch (port) {
case 0x01f0: /* data */
mfm_writew(port, val | (val << 8), priv);
@@ -436,7 +450,9 @@ mfm_write(uint16_t port, uint8_t val, void *priv)
mfm->status = STAT_BUSY;
}
mfm->fdisk = val;
irq_update(mfm);
/* Lower IRQ on IRQ disable. */
if ((val & 2) && !(mfm->fdisk & 0x02))
picintc(1 << 14);
break;
}
}
@@ -459,7 +475,9 @@ mfm_readw(uint16_t port, void *priv)
next_sector(mfm);
mfm->status = STAT_BUSY;
timer_clock();
mfm->callback = 6LL*MFM_TIME;
/* 781.25 us per sector at 5 Mbit/s = 640 kB/s. */
mfm->callback = ((3125LL * TIMER_USEC) / 4LL);
/* mfm->callback = 10LL * MFM_TIME; */
timer_update_outstanding();
} else {
ui_sb_update_icon(SB_HDD|HDD_BUS_MFM, 0);
@@ -514,9 +532,8 @@ mfm_read(uint16_t port, void *priv)
default:
break;
}
#if ENABLE_HDC_LOG > 1
pclog("WD1003 read(%04x) = %02x\n", port, ret);
#endif
mfm_at_log("WD1003 read(%04x) = %02x\n", port, ret);
return(ret);
}
@@ -527,10 +544,9 @@ do_seek(mfm_t *mfm)
{
drive_t *drive = &mfm->drives[mfm->drvsel];
#if ENABLE_HDC_LOG
pclog("WD1003(%d) seek(%d) max=%d\n",
mfm_at_log("WD1003(%d) seek(%d) max=%d\n",
mfm->drvsel,mfm->cylinder,drive->tracks);
#endif
if (mfm->cylinder < drive->tracks)
drive->curcyl = mfm->cylinder;
else
@@ -547,9 +563,8 @@ do_callback(void *priv)
mfm->callback = 0LL;
if (mfm->reset) {
#if ENABLE_HDC_LOG
pclog("WD1003(%d) reset\n", mfm->drvsel);
#endif
mfm_at_log("WD1003(%d) reset\n", mfm->drvsel);
mfm->status = STAT_READY|STAT_DSC;
mfm->error = 1;
mfm->secount = 1;
@@ -569,20 +584,16 @@ do_callback(void *priv)
switch (mfm->command) {
case CMD_SEEK:
#if ENABLE_HDC_LOG
pclog("WD1003(%d) seek, step=%d\n",
mfm_at_log("WD1003(%d) seek, step=%d\n",
mfm->drvsel, drive->steprate);
#endif
do_seek(mfm);
mfm->status = STAT_READY|STAT_DSC;
irq_raise(mfm);
break;
case CMD_READ:
#if ENABLE_HDC_LOG
pclog("WD1003(%d) read(%d,%d,%d)\n",
mfm_at_log("WD1003(%d) read(%d,%d,%d)\n",
mfm->drvsel, mfm->cylinder, mfm->head, mfm->sector);
#endif
do_seek(mfm);
if (get_sector(mfm, &addr)) {
mfm->error = ERR_ID_NOT_FOUND;
@@ -600,10 +611,8 @@ do_callback(void *priv)
break;
case CMD_WRITE:
#if ENABLE_HDC_LOG
pclog("WD1003(%d) write(%d,%d,%d)\n",
mfm_at_log("WD1003(%d) write(%d,%d,%d)\n",
mfm->drvsel, mfm->cylinder, mfm->head, mfm->sector);
#endif
do_seek(mfm);
if (get_sector(mfm, &addr)) {
mfm->error = ERR_ID_NOT_FOUND;
@@ -628,10 +637,8 @@ do_callback(void *priv)
break;
case CMD_VERIFY:
#if ENABLE_HDC_LOG
pclog("WD1003(%d) verify(%d,%d,%d)\n",
mfm_at_log("WD1003(%d) verify(%d,%d,%d)\n",
mfm->drvsel, mfm->cylinder, mfm->head, mfm->sector);
#endif
do_seek(mfm);
mfm->pos = 0;
mfm->status = STAT_READY|STAT_DSC;
@@ -640,10 +647,8 @@ do_callback(void *priv)
break;
case CMD_FORMAT:
#if ENABLE_HDC_LOG
pclog("WD1003(%d) format(%d,%d)\n",
mfm_at_log("WD1003(%d) format(%d,%d)\n",
mfm->drvsel, mfm->cylinder, mfm->head);
#endif
do_seek(mfm);
if (get_sector(mfm, &addr)) {
mfm->error = ERR_ID_NOT_FOUND;
@@ -660,9 +665,7 @@ do_callback(void *priv)
break;
case CMD_DIAGNOSE:
#if ENABLE_HDC_LOG
pclog("WD1003(%d) diag\n", mfm->drvsel);
#endif
mfm_at_log("WD1003(%d) diag\n", mfm->drvsel);
drive->steprate = 0x0f;
mfm->error = 1;
mfm->status = STAT_READY|STAT_DSC;
@@ -670,7 +673,7 @@ do_callback(void *priv)
break;
default:
pclog("WD1003(%d) callback on unknown command %02x\n",
mfm_at_log("WD1003(%d) callback on unknown command %02x\n",
mfm->drvsel, mfm->command);
mfm->status = STAT_READY|STAT_ERR|STAT_DSC;
mfm->error = ERR_ABRT;
@@ -705,7 +708,7 @@ mfm_init(const device_t *info)
mfm_t *mfm;
int c, d;
pclog("WD1003: ISA MFM/RLL Fixed Disk Adapter initializing ...\n");
mfm_at_log("WD1003: ISA MFM/RLL Fixed Disk Adapter initializing ...\n");
mfm = malloc(sizeof(mfm_t));
memset(mfm, 0x00, sizeof(mfm_t));
@@ -714,7 +717,7 @@ 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,
mfm_at_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);
if (++c >= MFM_NUM) break;