From 2e7781505aa8918a1c6a2f1808b1ecc4d665e41f Mon Sep 17 00:00:00 2001 From: tiseno100 <58827426+tiseno100@users.noreply.github.com> Date: Thu, 10 Sep 2020 23:56:51 +0300 Subject: [PATCH] Added more 82335 parts Registers are treated with an array instead of separate values. Minor Shadowing changes and also implemented the chipset lock mechanism fixing the ADI soft reset issue properly. --- src/chipset/intel_82335.c | 115 +++++++++----------------------------- 1 file changed, 26 insertions(+), 89 deletions(-) diff --git a/src/chipset/intel_82335.c b/src/chipset/intel_82335.c index 6a3c5309a..761020921 100644 --- a/src/chipset/intel_82335.c +++ b/src/chipset/intel_82335.c @@ -12,25 +12,6 @@ * */ -#include -#include -#include -#include -#include -#include -#define HAVE_STDARG_H -#include <86box/86box.h> -#include "cpu.h" -#include <86box/timer.h> -#include <86box/io.h> -#include <86box/device.h> -#include <86box/keyboard.h> -#include <86box/mem.h> -#include <86box/fdd.h> -#include <86box/fdc.h> -#include <86box/chipset.h> - - #include #include #include @@ -50,20 +31,21 @@ #include <86box/port_92.h> #include <86box/chipset.h> -#define enabled_shadow (MEM_READ_INTERNAL | MEM_WRITE_INTERNAL) #define disabled_shadow (MEM_READ_EXTANY | MEM_WRITE_EXTANY) - #define rw_shadow (MEM_READ_INTERNAL | MEM_WRITE_INTERNAL) #define ro_shadow (MEM_READ_INTERNAL | MEM_WRITE_DISABLED) -#define extended_granuality_enabled (dev->reg_2c & 0x01) -#define determine_video_ram_write_access ((dev->reg_22 & (0x08 << 8)) ? rw_shadow : ro_shadow) +#define extended_granuality_enabled (dev->regs[0x2c] & 0x01) +#define determine_video_ram_write_access ((dev->regs[0x22] & (0x08 << 8)) ? rw_shadow : ro_shadow) + +#define ENABLE_INTEL_82335_LOG 1 typedef struct { - uint16_t - reg_22, reg_24, reg_26, reg_28, reg_2a, reg_2c, reg_2e; + uint16_t regs[256], + + cfg_locked; } intel_82335_t; @@ -88,58 +70,40 @@ static void intel_82335_write(uint16_t addr, uint16_t val, void *priv) { intel_82335_t *dev = (intel_82335_t *) priv; - uint32_t base, i; + dev->regs[addr] = val; + + dev->cfg_locked = (dev->regs[0x22] & (0x80 << 8)); + + if(!dev->cfg_locked) + { + intel_82335_log("Register %02x: Write %04x\n", addr, val); switch (addr) { - case 0x22: - dev->reg_22 = val; - if (!extended_granuality_enabled) { - mem_set_mem_state_both(0xa0000, 0x20000, (dev->reg_22 & (0x04 << 8)) ? determine_video_ram_write_access : disabled_shadow); - mem_set_mem_state_both(0xc0000, 0x20000, (dev->reg_22 & (0x02 << 8)) ? enabled_shadow : disabled_shadow); - mem_set_mem_state_both(0xe0000, 0x20000, (dev->reg_22 & 0x01) ? ro_shadow : disabled_shadow); + mem_set_mem_state_both(0xa0000, 0x20000, (dev->regs[0x22] & (0x04 << 8)) ? determine_video_ram_write_access : disabled_shadow); + mem_set_mem_state_both(0xc0000, 0x20000, (dev->regs[0x22] & (0x02 << 8)) ? rw_shadow : disabled_shadow); + mem_set_mem_state_both(0xe0000, 0x20000, (dev->regs[0x22] & 0x01) ? rw_shadow : disabled_shadow); } - break; - - case 0x24: - dev->reg_24 = val; - break; - - case 0x26: - dev->reg_26 = val; - break; - - case 0x28: - dev->reg_28 = val; - break; - - case 0x2a: - dev->reg_2a = val; - break; - - case 0x2c: - dev->reg_2c = val; break; case 0x2e: - dev->reg_2e = val; - if(extended_granuality_enabled) { for(i=0; i<8; i++) { base = 0xc0000 + (i << 15); - mem_set_mem_state_both(base, 0x8000, (dev->reg_2e & (1 << (i+8))) ? ((dev->reg_2e & (1 << i)) ? ro_shadow : rw_shadow) : disabled_shadow); + mem_set_mem_state_both(base, 0x8000, (dev->regs[0x2e] & (1 << (i+8))) ? ((dev->regs[0x2e] & (1 << i)) ? ro_shadow : rw_shadow) : disabled_shadow); } break; } - } + } + } @@ -150,32 +114,8 @@ intel_82335_read(uint16_t addr, void *priv) intel_82335_log("Register %02x: Reading\n", addr); - switch (addr) { - case 0x22: - return dev->reg_22; - break; - case 0x24: - return dev->reg_24; - break; - case 0x26: - return dev->reg_26; - break; - case 0x28: - return dev->reg_28; - break; - case 0x2a: - return dev->reg_2a; - break; - case 0x2c: - return dev->reg_2c; - break; - case 0x2e: - return dev->reg_2e; - break; - default: - return 0xff; - break; - } + return dev->regs[addr]; + } static void @@ -194,14 +134,11 @@ intel_82335_init(const device_t *info) memset(dev, 0, sizeof(intel_82335_t)); device_add(&port_92_device); + memset(dev->regs, 0, sizeof(dev->regs)); - dev->reg_22 = 0x00; - dev->reg_24 = 0x00; - dev->reg_26 = 0x00; - dev->reg_28 = 0xf9; - dev->reg_2a = 0x00; - dev->reg_2c = 0x00; - dev->reg_2e = 0x00; + dev->regs[0x28] = 0xf9; + + dev->cfg_locked = 1; /* Memory Configuration */ io_sethandler(0x0022, 0x0001, NULL, intel_82335_read, NULL, NULL, intel_82335_write, NULL, dev);