From eecb5869ed1c7f9ada8d007478316db3b02d432f Mon Sep 17 00:00:00 2001 From: sorgelig Date: Thu, 6 Aug 2020 14:34:25 +0800 Subject: [PATCH] ao486: support for new mgmt bus. --- support/x86/x86.cpp | 336 +++++++++++++++++++++++--------------------- 1 file changed, 174 insertions(+), 162 deletions(-) diff --git a/support/x86/x86.cpp b/support/x86/x86.cpp index 1eaa804..a867fae 100644 --- a/support/x86/x86.cpp +++ b/support/x86/x86.cpp @@ -39,30 +39,37 @@ #include "../../fpga_io.h" #include "x86_share.h" -#define FLOPPY0_BASE 0x8800 -#define HDD0_BASE 0x8840 -#define FLOPPY1_BASE 0x9800 -#define HDD1_BASE 0x9840 -#define PC_BUS_BASE 0x88a0 -#define PIO_OUTPUT_BASE 0x8860 -#define SOUND_BASE 0x9000 -#define PIT_BASE 0x8880 -#define VGA_BASE 0x8900 -#define RTC_BASE 0x8c00 -#define SD_BASE 0x0A00 +#define FLOPPY0_BASE_OLD 0x8800 +#define HDD0_BASE_OLD 0x8840 +#define FLOPPY1_BASE_OLD 0x9800 +#define HDD1_BASE_OLD 0x9840 +#define PC_BUS_BASE_OLD 0x88a0 +#define SOUND_BASE_OLD 0x9000 +#define PIT_BASE_OLD 0x8880 +#define VGA_BASE_OLD 0x8900 +#define RTC_BASE_OLD 0x8c00 +#define SD_BASE_OLD 0x0A00 -#define IMG_TYPE_FDD0 0x0800 -#define IMG_TYPE_FDD1 0x1800 -#define IMG_TYPE_HDD0 0x0000 -#define IMG_TYPE_HDD1 0x1000 -#define IMG_TYPE_HDD0_FAST 0x2000 -#define IMG_TYPE_HDD1_FAST 0x2001 +#define IMG_TYPE_FDD0_OLD 0x0800 +#define IMG_TYPE_FDD1_OLD 0x1800 +#define IMG_TYPE_HDD0_OLD 0x0000 +#define IMG_TYPE_HDD1_OLD 0x1000 + +#define HDD0_BASE_NEW 0xF000 +#define HDD1_BASE_NEW 0xF100 +#define FDD0_BASE_NEW 0xF200 +#define FDD1_BASE_NEW 0xF300 +#define RTC_BASE_NEW 0xF400 #define CFG_VER 2 #define SHMEM_ADDR 0x30000000 #define BIOS_SIZE 0x10000 +static int newcore = 0; + +#define IOWR(base, reg, value) dma_set((base) + (newcore ? (reg) : ((reg)<<2)), value) + typedef struct { uint32_t ver; @@ -121,9 +128,19 @@ static void dma_set(uint32_t address, uint32_t data) static void dma_sendbuf(uint32_t address, uint32_t length, uint32_t *data) { EnableIO(); - spi8(UIO_DMA_WRITE); - spi32_w(address); - if (address == IMG_TYPE_HDD0_FAST || address == IMG_TYPE_HDD1_FAST) fpga_spi_fast_block_write((uint16_t*)data, length * 2); + fpga_spi_fast(UIO_DMA_WRITE); + fpga_spi_fast(address); + fpga_spi_fast(0); + if (newcore) + { + if(address < FDD0_BASE_NEW) fpga_spi_fast_block_write((uint16_t*)data, length * 2); + else + { + uint8_t *buf = (uint8_t*)data; + length *= 4; + while (length--) spi32_w(*buf++); + } + } else while (length--) spi32_w(*data++); DisableIO(); } @@ -131,9 +148,19 @@ static void dma_sendbuf(uint32_t address, uint32_t length, uint32_t *data) static void dma_recvbuf(uint32_t address, uint32_t length, uint32_t *data) { EnableIO(); - spi8(UIO_DMA_READ); - spi32_w(address); - if (address == IMG_TYPE_HDD0_FAST || address == IMG_TYPE_HDD1_FAST) fpga_spi_fast_block_read((uint16_t*)data, length * 2); + fpga_spi_fast(UIO_DMA_READ); + fpga_spi_fast(address); + fpga_spi_fast(0); + if (newcore) + { + if (address <= FDD0_BASE_NEW) fpga_spi_fast_block_read((uint16_t*)data, length * 2); + else + { + uint8_t *buf = (uint8_t*)data; + length *= 4; + while (length--) *buf++ = spi32_w(0); + } + } else while (length--) *data++ = spi32_w(0); DisableIO(); } @@ -189,26 +216,13 @@ struct image_t uint8_t buf[512 * 8]; }; -static image_t fdd_image0 = {}; -static image_t fdd_image1 = {}; -static image_t hdd_image0 = {}; -static image_t hdd_image1 = {}; +static image_t fdd0_image = {}; +static image_t hdd0_image = {}; +static image_t hdd1_image = {}; static bool boot_from_floppy = 1; -static __inline image_t *get_image(uint32_t type) +static int img_mount(image_t *img, char *name) { - switch (type) - { - case IMG_TYPE_HDD0: return &hdd_image0; - case IMG_TYPE_HDD1: return &hdd_image1; - case IMG_TYPE_FDD0: return &fdd_image0; - } - return &fdd_image1; -} - -static int img_mount(uint32_t type, char *name) -{ - image_t *img = get_image(type); FileClose(&img->f); img->cached_lba = UINT32_MAX; img->last_lba = 0; @@ -256,30 +270,7 @@ static uint32_t img_write(image_t *img, uint32_t lba, void *buf, uint32_t cnt) return FileWriteAdv(&img->f, buf, cnt * 512); } -#define IOWR(base, reg, value) dma_set((base)+((reg)<<2), value) - static uint32_t cmos[128]; -/* -static void cmos_set(uint addr, uint8_t val) -{ - if (addr >= sizeof(cmos)) return; - - cmos[addr] = val; - return; - - uint16_t sum = 0; - for (int i = 0x10; i <= 0x2D; i++) sum += cmos[i]; - - cmos[0x2E] = sum >> 8; - cmos[0x2F] = sum & 0xFF; - - IOWR(RTC_BASE, addr, cmos[addr]); - - IOWR(RTC_BASE, 0x2E, cmos[0x2E]); - IOWR(RTC_BASE, 0x2F, cmos[0x2F]); -} -*/ - static int floppy_wait_cycles; static void set_clock() @@ -287,13 +278,13 @@ static void set_clock() uint32_t cpu_clock = cpu_get_clock(); old_cpu_clock = cpu_clock; - IOWR(FLOPPY0_BASE, 0x7, (int)(floppy_wait_cycles / (1000000000.0 / cpu_clock))); - IOWR(FLOPPY0_BASE, 0x8, (int)(1000000.0 / (1000000000.0 / cpu_clock))); - IOWR(FLOPPY0_BASE, 0x9, (int)(1666666.0 / (1000000000.0 / cpu_clock))); - IOWR(FLOPPY0_BASE, 0xA, (int)(2000000.0 / (1000000000.0 / cpu_clock))); - IOWR(FLOPPY0_BASE, 0xB, (int)(500000.0 / (1000000000.0 / cpu_clock))); + IOWR(FLOPPY0_BASE_OLD, 0x7, (int)(floppy_wait_cycles / (1000000000.0 / cpu_clock))); + IOWR(FLOPPY0_BASE_OLD, 0x8, (int)(1000000.0 / (1000000000.0 / cpu_clock))); + IOWR(FLOPPY0_BASE_OLD, 0x9, (int)(1666666.0 / (1000000000.0 / cpu_clock))); + IOWR(FLOPPY0_BASE_OLD, 0xA, (int)(2000000.0 / (1000000000.0 / cpu_clock))); + IOWR(FLOPPY0_BASE_OLD, 0xB, (int)(500000.0 / (1000000000.0 / cpu_clock))); - IOWR(VGA_BASE, 0, cpu_clock); + IOWR(VGA_BASE_OLD, 0, cpu_clock); //-------------------------------------------------------------------------- sound /* @@ -308,26 +299,26 @@ static void set_clock() double f = 1000000.0 / (256.0 - i); double cycles_in_period = 1000000000.0 / (f * cycle_in_ns); - IOWR(SOUND_BASE, i, (int)cycles_in_period); + IOWR(SOUND_BASE_OLD, i, (int)cycles_in_period); } - IOWR(SOUND_BASE, 256, (int)(80000.0 / (1000000000.0 / cpu_clock))); - IOWR(SOUND_BASE, 257, (int)((1000000000.0 / 96000.0) / (1000000000.0 / cpu_clock))); + IOWR(SOUND_BASE_OLD, 256, (int)(80000.0 / (1000000000.0 / cpu_clock))); + IOWR(SOUND_BASE_OLD, 257, (int)((1000000000.0 / 96000.0) / (1000000000.0 / cpu_clock))); //-------------------------------------------------------------------------- pit /* 0.[7:0]: cycles in sysclock 1193181 Hz */ - IOWR(PIT_BASE, 0, (int)((1000000000.0 / 1193181.0) / (1000000000.0 / cpu_clock))); + IOWR(PIT_BASE_OLD, 0, (int)((1000000000.0 / 1193181.0) / (1000000000.0 / cpu_clock))); /* 128.[26:0]: cycles in second 129.[12:0]: cycles in 122.07031 us */ - IOWR(RTC_BASE, 128, (int)(1000000000.0 / (1000000000.0 / cpu_clock))); - IOWR(RTC_BASE, 129, (int)(122070.0 / (1000000000.0 / cpu_clock))); + IOWR(RTC_BASE_OLD, 128, (int)(1000000000.0 / (1000000000.0 / cpu_clock))); + IOWR(RTC_BASE_OLD, 129, (int)(122070.0 / (1000000000.0 / cpu_clock))); } static int fdd_set(char* filename) @@ -342,8 +333,11 @@ static int fdd_set(char* filename) floppy_is_1_68m = false; floppy_is_2_88m = false; - int floppy = img_mount(IMG_TYPE_FDD0, filename); - uint32_t size = get_image(IMG_TYPE_FDD0)->f.size/512; + uint32_t base = newcore ? FDD0_BASE_NEW : FLOPPY0_BASE_OLD; + + int floppy = img_mount(&fdd0_image, filename); + uint32_t size = fdd0_image.f.size/512; + printf("floppy size: %d blks\n", size); if (floppy && size) { if (size >= 5760) floppy_is_2_88m = true; @@ -395,6 +389,12 @@ static int fdd_set(char* filename) int floppy_total_sectors = floppy_spt * floppy_heads * floppy_cylinders; floppy_wait_cycles = 200000000 / floppy_spt; + printf("floppy:\n"); + printf(" cylinders: %d\n", floppy_cylinders); + printf(" heads: %d\n", floppy_heads); + printf(" spt: %d\n", floppy_spt); + printf(" total_sectors: %d\n\n", floppy_total_sectors); + int floppy_media = (!floppy) ? 0x20 : (floppy_is_160k) ? 0x00 : @@ -407,55 +407,47 @@ static int fdd_set(char* filename) (floppy_is_2_88m) ? 0x40 : 0x20; - IOWR(FLOPPY0_BASE, 0x0, floppy ? 1 : 0); - IOWR(FLOPPY0_BASE, 0x1, (floppy && (get_image(IMG_TYPE_FDD0)->f.mode & O_RDWR)) ? 0 : 1); - IOWR(FLOPPY0_BASE, 0x2, floppy_cylinders); - IOWR(FLOPPY0_BASE, 0x3, floppy_spt); - IOWR(FLOPPY0_BASE, 0x4, floppy_total_sectors); - IOWR(FLOPPY0_BASE, 0x5, floppy_heads); - IOWR(FLOPPY0_BASE, 0x6, 0); // base LBA - IOWR(FLOPPY0_BASE, 0xC, floppy_media); + IOWR(base, 0x0, floppy ? 1 : 0); + IOWR(base, 0x1, (floppy && (fdd0_image.f.mode & O_RDWR)) ? 0 : 1); + IOWR(base, 0x2, floppy_cylinders); + IOWR(base, 0x3, floppy_spt); + IOWR(base, 0x4, floppy_total_sectors); + IOWR(base, 0x5, floppy_heads); + IOWR(base, 0x6, 0); // base LBA + IOWR(base, 0xC, floppy_media); - set_clock(); + if(!newcore) set_clock(); //cmos_set(0x10, CMOS_FDD_TYPE); return floppy; } -typedef struct +static int hdd_set(uint32_t num, char* filename) { - uint32_t type; - uint32_t base; uint32_t hd_cylinders; uint32_t hd_heads; uint32_t hd_spt; uint32_t hd_total_sectors; uint32_t present; - char* name; -} hdd_config; -static hdd_config hdd[2] = { - { IMG_TYPE_HDD0, HDD0_BASE, 0, 0, 0, 0, 0, config.hdd0_name }, - { IMG_TYPE_HDD1, HDD1_BASE, 0, 0, 0, 0, 0, config.hdd1_name } -}; + uint32_t base = newcore ? (num ? HDD1_BASE_NEW : HDD0_BASE_NEW) : (num ? HDD1_BASE_OLD : HDD0_BASE_OLD); + image_t *img = num ? &hdd1_image : &hdd0_image; -static int hdd_set(uint32_t num) -{ - hdd[num].hd_cylinders = 0; - hdd[num].hd_heads = 0; - hdd[num].hd_spt = 0; - hdd[num].hd_total_sectors = 0; + hd_cylinders = 0; + hd_heads = 0; + hd_spt = 0; + hd_total_sectors = 0; - hdd[num].present = img_mount(hdd[num].type, hdd[num].name); - if (!hdd[num].present) return 0; + present = img_mount(img, filename); + if (!present) return 0; - hdd[num].hd_heads = 16; - hdd[num].hd_spt = 63; - hdd[num].hd_cylinders = get_image(hdd[num].type)->f.size / (hdd[num].hd_heads * hdd[num].hd_spt * 512); + hd_heads = 16; + hd_spt = 63; + hd_cylinders = img->f.size / (hd_heads * hd_spt * 512); //Maximum 8GB images are supported. - if (hdd[num].hd_cylinders > 16383) hdd[num].hd_cylinders = 16383; - hdd[num].hd_total_sectors = hdd[num].hd_spt*hdd[num].hd_heads*hdd[num].hd_cylinders; + if (hd_cylinders > 16383) hd_cylinders = 16383; + hd_total_sectors = hd_spt*hd_heads*hd_cylinders; /* 0x00.[31:0]: identify write @@ -470,12 +462,12 @@ static int hdd_set(uint32_t num) uint32_t identify[256] = { 0x0040, //word 0 - hdd[num].hd_cylinders, //word 1 + hd_cylinders, //word 1 0x0000, //word 2 reserved - hdd[num].hd_heads, //word 3 - (uint16_t)(512 * hdd[num].hd_spt), //word 4 + hd_heads, //word 3 + (uint16_t)(512 * hd_spt), //word 4 512, //word 5 - hdd[num].hd_spt, //word 6 + hd_spt, //word 6 0x0000, //word 7 vendor specific 0x0000, //word 8 vendor specific 0x0000, //word 9 vendor specific @@ -520,14 +512,14 @@ static int hdd_set(uint32_t num) 0x0200, //word 51 pio timing 0x0200, //word 52 pio timing 0x0007, //word 53 valid fields - hdd[num].hd_cylinders, //word 54 - hdd[num].hd_heads, //word 55 - hdd[num].hd_spt, //word 56 - hdd[num].hd_total_sectors & 0xFFFF, //word 57 - hdd[num].hd_total_sectors >> 16, //word 58 + hd_cylinders, //word 54 + hd_heads, //word 55 + hd_spt, //word 56 + hd_total_sectors & 0xFFFF, //word 57 + hd_total_sectors >> 16, //word 58 16, //word 59 multiple sectors - hdd[num].hd_total_sectors & 0xFFFF, //word 60 - hdd[num].hd_total_sectors >> 16, //word 61 + hd_total_sectors & 0xFFFF, //word 60 + hd_total_sectors >> 16, //word 61 0x0000, //word 62 single word dma modes 0x0000, //word 63 multiple word dma modes 0x0000, //word 64 pio modes @@ -545,8 +537,8 @@ static int hdd_set(uint32_t num) 0,0,0,0, //word 89..92 1 | (1 << 14) | 0x2000, //word 93 0,0,0,0,0,0, //word 94..99 - hdd[num].hd_total_sectors & 0xFFFF, //word 100 - hdd[num].hd_total_sectors >> 16, //word 101 + hd_total_sectors & 0xFFFF, //word 100 + hd_total_sectors >> 16, //word 101 0, //word 102 0, //word 103 @@ -562,9 +554,9 @@ static int hdd_set(uint32_t num) 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; - if (hdd[num].present) + if (present) { - char *name = get_image(hdd[num].type)->f.name; + char *name = img->f.name; for (int i = 0; i < 20; i++) { if (*name) identify[27 + i] = ((*name++) << 8) | 0x20; @@ -572,17 +564,17 @@ static int hdd_set(uint32_t num) } } - for (int i = 0; i<128; i++) IOWR(hdd[num].base, 0, hdd[num].present ? ((unsigned int)identify[2 * i + 1] << 16) | (unsigned int)identify[2 * i + 0] : 0); + for (int i = 0; i < 128; i++) IOWR(base, 0, present ? ((unsigned int)identify[2 * i + 1] << 16) | (unsigned int)identify[2 * i + 0] : 0); - IOWR(hdd[num].base, 1, hdd[num].hd_cylinders); - IOWR(hdd[num].base, 2, hdd[num].hd_heads); - IOWR(hdd[num].base, 3, hdd[num].hd_spt); - IOWR(hdd[num].base, 4, hdd[num].hd_spt * hdd[num].hd_heads); - IOWR(hdd[num].base, 5, hdd[num].hd_spt * hdd[num].hd_heads * hdd[num].hd_cylinders); - IOWR(hdd[num].base, 6, 0); // base LBA + IOWR(base, 1, hd_cylinders); + IOWR(base, 2, hd_heads); + IOWR(base, 3, hd_spt); + IOWR(base, 4, hd_spt * hd_heads); + IOWR(base, 5, hd_spt * hd_heads * hd_cylinders); + IOWR(base, 6, 0); // base LBA - printf("HDD%d:\n present %d\n hd_cylinders %d\n hd_heads %d\n hd_spt %d\n hd_total_sectors %d\n\n", num, hdd[num].present, hdd[num].hd_cylinders, hdd[num].hd_heads, hdd[num].hd_spt, hdd[num].hd_total_sectors); - return hdd[num].present; + printf("HDD%d:\n present %d\n hd_cylinders %d\n hd_heads %d\n hd_spt %d\n hd_total_sectors %d\n\n", num, present, hd_cylinders, hd_heads, hd_spt, hd_total_sectors); + return present; } static uint8_t bin2bcd(unsigned val) @@ -599,17 +591,17 @@ void x86_init() load_bios(user_io_make_filepath(home, "boot0.rom"), 0); load_bios(user_io_make_filepath(home, "boot1.rom"), 1); - IOWR(PC_BUS_BASE, 0, 0x00FFF0EA); - IOWR(PC_BUS_BASE, 1, 0x000000F0); + newcore = ((dma_sdio(0) & 0xC000) == 0xC000); - //-------------------------------------------------------------------------- floppy + if (!newcore) + { + IOWR(PC_BUS_BASE_OLD, 0, 0x00FFF0EA); + IOWR(PC_BUS_BASE_OLD, 1, 0x000000F0); + } fdd_set(config.fdd_name); - - //-------------------------------------------------------------------------- hdd - - hdd_set(0); - hdd_set(1); + hdd_set(0, config.hdd0_name); + hdd_set(1, config.hdd1_name); //-------------------------------------------------------------------------- rtc @@ -627,10 +619,10 @@ void x86_init() 0x00, //0x03: ALARM MIN BCD bin2bcd(tm.tm_hour), //0x04: HOUR BCD 24h 0x12, //0x05: ALARM HOUR BCD 24h - (uint32_t)tm.tm_wday+1, //0x06: DAY OF WEEK Sunday=1 + (uint32_t)tm.tm_wday + 1, //0x06: DAY OF WEEK Sunday=1 bin2bcd(tm.tm_mday), //0x07: DAY OF MONTH BCD from 1 - bin2bcd(tm.tm_mon+1), //0x08: MONTH BCD from 1 - bin2bcd((tm.tm_year<117) ? 17 : tm.tm_year-100), //0x09: YEAR BCD + bin2bcd(tm.tm_mon + 1), //0x08: MONTH BCD from 1 + bin2bcd((tm.tm_year < 117) ? 17 : tm.tm_year - 100), //0x09: YEAR BCD 0x26, //0x0A: REG A 0x02, //0x0B: REG B 0x00, //0x0C: REG C @@ -670,7 +662,7 @@ void x86_init() 0x00, //0x2B: hd 1 configuration 8/9; landing zone high 0x00, //0x2C: hd 1 configuration 9/9; sectors/track - (boot_from_floppy && get_image(IMG_TYPE_FDD0)->f.size)? 0x20u : 0x00u, //0x2D: boot sequence + (fdd0_image.f.size && boot_from_floppy) ? 0x20u : 0x00u, //0x2D: boot sequence 0x00, //0x2E: checksum MSB 0x00, //0x2F: checksum LSB @@ -705,22 +697,23 @@ void x86_init() 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; + printf("cmod[2d] = %x\n", tmp[0x2d]); + memcpy(cmos, tmp, sizeof(cmos)); //count checksum unsigned short sum = 0; - for(int i=0x10; i<=0x2D; i++) sum += cmos[i]; + for (int i = 0x10; i <= 0x2D; i++) sum += cmos[i]; cmos[0x2E] = sum >> 8; cmos[0x2F] = sum & 0xFF; - - for(unsigned int i=0; ilast_lba && next) { //printf("%s next: %d\n", read ? "Read" : "Write", img->last_lba); @@ -747,7 +741,7 @@ static void img_io(image_t *img, uint32_t address, uint32_t basereg, uint8_t rea if (read) { - //printf("Read: 0x%08x, 0x%08x, %d\n", address, sd_params.lba, sd_params.cnt); + //printf("Read: 0x%08x, 0x%08x, %d\n", basereg, sd_params.lba, sd_params.cnt); if (img->f.size) { @@ -756,7 +750,7 @@ static void img_io(image_t *img, uint32_t address, uint32_t basereg, uint8_t rea uint32_t *buf = img_read(img, sd_params.lba, sd_params.cnt); if (buf) { - dma_sendbuf(address, sd_params.cnt * 128, buf); + dma_sendbuf(basereg + 255, sd_params.cnt * 128, buf); img_read(img, sd_params.lba + 1, 1); //prefetch next res = 1; } @@ -774,14 +768,14 @@ static void img_io(image_t *img, uint32_t address, uint32_t basereg, uint8_t rea if (!res) { memset(secbuf, 0, sd_params.cnt * 512); - dma_sendbuf(address, sd_params.cnt * 128, secbuf); + dma_sendbuf(basereg + 255, sd_params.cnt * 128, secbuf); } } else { - //printf("Write: 0x%08x, 0x%08x, %d\n", address, sd_params.lba, sd_params.cnt); + //printf("Write: 0x%08x, 0x%08x, %d\n", basereg, sd_params.lba, sd_params.cnt); - dma_recvbuf(address, sd_params.cnt * 128, secbuf); + dma_recvbuf(basereg + 255, sd_params.cnt * 128, secbuf); if (img->f.size) { if (sd_params.cnt > 0 && sd_params.cnt <= 4) @@ -821,13 +815,28 @@ void img_io_old(uint8_t sd_req) static struct sd_param_t sd_params = {}; static uint32_t secbuf[128 * 4]; + dma_recvbuf(SD_BASE_OLD + (4 << 2), sizeof(sd_params) >> 2, (uint32_t*)&sd_params); + + image_t *img; + switch (sd_params.addr) + { + case IMG_TYPE_HDD0_OLD: + //printf("HDD0 req\n"); + img = &hdd0_image; + break; + case IMG_TYPE_HDD1_OLD: + //printf("HDD1 req\n"); + img = &hdd1_image; + break; + default: + //printf("FDD req\n"); + img = &fdd0_image; + break; + } int res = 0; - image_t *img = get_image(sd_params.addr); - if (sd_req == 1) { - dma_recvbuf(SD_BASE + (4 << 2), sizeof(sd_params) >> 2, (uint32_t*)&sd_params); //printf("Read(old): 0x%08x, 0x%08x, %d\n", sd_params.addr, sd_params.lba, sd_params.bl_cnt); if (img->f.size) @@ -855,7 +864,6 @@ void img_io_old(uint8_t sd_req) } else if (sd_req == 2) { - dma_recvbuf(SD_BASE + (4 << 2), sizeof(sd_params) >> 2, (uint32_t*)&sd_params); //printf("Write(old): 0x%08x, 0x%08x, %d\n", sd_params.addr, sd_params.lba, sd_params.bl_cnt); if (img->f.size) @@ -891,8 +899,11 @@ void img_io_old(uint8_t sd_req) void x86_poll() { - uint32_t cpu_clock = cpu_get_clock(); - if (cpu_clock != old_cpu_clock) set_clock(); + if (!newcore) + { + uint32_t cpu_clock = cpu_get_clock(); + if (cpu_clock != old_cpu_clock) set_clock(); + } x86_share_poll(); @@ -901,11 +912,11 @@ void x86_poll() { if (sd_req & 0x8000) { - if (sd_req & 3) img_io(&hdd_image0, IMG_TYPE_HDD0_FAST, HDD0_BASE, sd_req & 1, sd_req & 4); + if (sd_req & 3) img_io(&hdd0_image, HDD0_BASE_NEW, sd_req & 1, sd_req & 4); sd_req >>= 3; - if (sd_req & 3) img_io(&hdd_image1, IMG_TYPE_HDD1_FAST, HDD1_BASE, sd_req & 1, sd_req & 4); + if (sd_req & 3) img_io(&hdd1_image, HDD1_BASE_NEW, sd_req & 1, sd_req & 4); sd_req >>= 3; - if (sd_req & 3) img_io(&fdd_image0, IMG_TYPE_FDD0, FLOPPY0_BASE, sd_req & 1, 0); + if (sd_req & 3) img_io(&fdd0_image, FDD0_BASE_NEW, sd_req & 1, 0); } else { @@ -944,6 +955,7 @@ void x86_config_save() void x86_config_load() { + newcore = ((dma_sdio(0) & 0xC000) == 0xC000); static x86_config tmp; memset(&config, 0, sizeof(config)); if (FileLoadConfig("ao486sys.cfg", &tmp, sizeof(tmp)) && (tmp.ver == CFG_VER))