From 87cc7dcc3c7dbcbf893fbbe57e59015225c74750 Mon Sep 17 00:00:00 2001 From: OBattler Date: Sun, 13 Nov 2016 20:38:03 +0100 Subject: [PATCH] The Sound Blaster 16 and AWE32 low and high DMA addresses are now reflected in the mixer registers and software-configurable; The AHA-154x can now also use base addresses 0x130, 0x134, 0x230, 0x234, and IRQ's 14 and 15; Reworked the SCSI system resource menu handlers in win.c a bit. --- src/aha154x.c | 4 +- src/resources.h | 24 ++-- src/sound_sb.c | 41 ++++++- src/win.c | 312 ++++++++++++++++++++++++++---------------------- 4 files changed, 223 insertions(+), 158 deletions(-) diff --git a/src/aha154x.c b/src/aha154x.c index 5b7653b11..0efc1fd43 100644 --- a/src/aha154x.c +++ b/src/aha154x.c @@ -290,7 +290,7 @@ typedef struct Adaptec_t Adaptec_t AdaptecLUN; int scsi_base = 0x330; -int scsi_dma = 5; +int scsi_dma = 6; int scsi_irq = 11; static void AdaptecSCSIRequestSetup(Adaptec_t *Adaptec, uint32_t CCBPointer); @@ -831,7 +831,7 @@ void AdaptecWrite(uint16_t Port, uint8_t Val, void *p) case 0x0B: Adaptec->DataBuf[0] = (1 << Adaptec->DmaChannel); - + /* if (Adaptec->DmaChannel >= 0) AdaptecSetDMAChannel(Adaptec->DmaPort1, Adaptec->DmaData1, Adaptec->DmaPort2, Adaptec->DmaData2); */ diff --git a/src/resources.h b/src/resources.h index eef807f75..80abe729c 100644 --- a/src/resources.h +++ b/src/resources.h @@ -32,15 +32,21 @@ #define IDM_CDROM_ENABLED 40300 #define IDM_CDROM_SCSI 40400 #define IDM_SCSI_ENABLED 40500 -#define IDM_SCSI_BASE330 40501 -#define IDM_SCSI_BASE334 40502 -#define IDM_SCSI_IRQ9 40503 -#define IDM_SCSI_IRQ10 40504 -#define IDM_SCSI_IRQ11 40505 -#define IDM_SCSI_IRQ12 40506 -#define IDM_SCSI_DMA5 40507 -#define IDM_SCSI_DMA6 40508 -#define IDM_SCSI_DMA7 40509 +#define IDM_SCSI_BASE130 40501 +#define IDM_SCSI_BASE134 40502 +#define IDM_SCSI_BASE230 40503 +#define IDM_SCSI_BASE234 40504 +#define IDM_SCSI_BASE330 40505 +#define IDM_SCSI_BASE334 40506 +#define IDM_SCSI_IRQ9 40507 +#define IDM_SCSI_IRQ10 40508 +#define IDM_SCSI_IRQ11 40509 +#define IDM_SCSI_IRQ12 40510 +#define IDM_SCSI_IRQ14 40511 +#define IDM_SCSI_IRQ15 40512 +#define IDM_SCSI_DMA5 40513 +#define IDM_SCSI_DMA6 40514 +#define IDM_SCSI_DMA7 40515 #define IDC_COMBO1 1000 #define IDC_COMBOVID 1001 diff --git a/src/sound_sb.c b/src/sound_sb.c index 2191e2d4c..2c8f72335 100644 --- a/src/sound_sb.c +++ b/src/sound_sb.c @@ -277,6 +277,13 @@ void sb_16_mixer_write(uint16_t addr, uint8_t val, void *p) if (val & 2) sb->dsp.sb_irqnum = 5; if (val & 4) sb->dsp.sb_irqnum = 7; if (val & 8) sb->dsp.sb_irqnum = 10; + case 0x81: + if (val & 1) sb->dsp.sb_8_dmanum = 0; + if (val & 2) sb->dsp.sb_8_dmanum = 1; + if (val & 8) sb->dsp.sb_8_dmanum = 3; + if (val & 0x20) sb->dsp.sb_16_dmanum = 5; + if (val & 0x40) sb->dsp.sb_16_dmanum = 6; + if (val & 0x80) sb->dsp.sb_16_dmanum = 7; break; } mixer->master_l = sb_att[mixer->regs[0x30] >> 3]; @@ -303,6 +310,7 @@ uint8_t sb_16_mixer_read(uint16_t addr, void *p) { sb_t *sb = (sb_t *)p; sb_mixer_t *mixer = &sb->mixer; + uint8_t temp = 0; if (!(addr & 1)) return mixer->index; @@ -319,7 +327,38 @@ uint8_t sb_16_mixer_read(uint16_t addr, void *p) } break; case 0x81: - return 0x22; /*DMA 1 and 5*/ + switch (sb->dsp.sb_8_dmanum) + { + case 0: + temp = 1; + break; + case 1: + temp = 2; + break; + case 3: + temp = 8; + break; + default: + temp = 0; + break; + } + switch (sb->dsp.sb_16_dmanum) + { + case 5: + temp |= 0x20; + break; + case 6: + temp |= 0x40; + break; + case 7: + temp |= 0x80; + break; + default: + temp |= 0x00; + break; + } + // return 0x22; /*DMA 1 and 5*/ + return temp; case 0x82: return ((sb->dsp.sb_irq8) ? 1 : 0) | ((sb->dsp.sb_irq16) ? 2 : 0); } diff --git a/src/win.c b/src/win.c index 26f78779a..6eb0d50f3 100644 --- a/src/win.c +++ b/src/win.c @@ -628,14 +628,35 @@ int WINAPI WinMain (HINSTANCE hThisInstance, if (aha154x_enabled) CheckMenuItem(menu, IDM_SCSI_ENABLED, MF_CHECKED); - if (scsi_base == 0x330) + CheckMenuItem(menu, IDM_SCSI_BASE130, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_BASE134, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_BASE230, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_BASE234, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_BASE330, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_BASE334, MF_UNCHECKED); + + if (scsi_base == 0x130) + { + CheckMenuItem(menu, IDM_SCSI_BASE130, MF_CHECKED); + } + else if (scsi_base == 0x134) + { + CheckMenuItem(menu, IDM_SCSI_BASE134, MF_CHECKED); + } + else if (scsi_base == 0x230) + { + CheckMenuItem(menu, IDM_SCSI_BASE230, MF_CHECKED); + } + else if (scsi_base == 0x234) + { + CheckMenuItem(menu, IDM_SCSI_BASE234, MF_CHECKED); + } + else if (scsi_base == 0x330) { CheckMenuItem(menu, IDM_SCSI_BASE330, MF_CHECKED); - CheckMenuItem(menu, IDM_SCSI_BASE334, MF_UNCHECKED); } else if (scsi_base == 0x334) { - CheckMenuItem(menu, IDM_SCSI_BASE330, MF_UNCHECKED); CheckMenuItem(menu, IDM_SCSI_BASE334, MF_CHECKED); } else @@ -643,55 +664,56 @@ int WINAPI WinMain (HINSTANCE hThisInstance, fatal("Unrecognized SCSI base address\n"); } + CheckMenuItem(menu, IDM_SCSI_IRQ9, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_IRQ10, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_IRQ11, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_IRQ12, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_IRQ14, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_IRQ15, MF_UNCHECKED); + if (scsi_irq == 9) { CheckMenuItem(menu, IDM_SCSI_IRQ9, MF_CHECKED); - CheckMenuItem(menu, IDM_SCSI_IRQ10, MF_UNCHECKED); - CheckMenuItem(menu, IDM_SCSI_IRQ11, MF_UNCHECKED); - CheckMenuItem(menu, IDM_SCSI_IRQ12, MF_UNCHECKED); } else if (scsi_irq == 10) { - CheckMenuItem(menu, IDM_SCSI_IRQ9, MF_UNCHECKED); CheckMenuItem(menu, IDM_SCSI_IRQ10, MF_CHECKED); - CheckMenuItem(menu, IDM_SCSI_IRQ11, MF_UNCHECKED); - CheckMenuItem(menu, IDM_SCSI_IRQ12, MF_UNCHECKED); } else if (scsi_irq == 11) { - CheckMenuItem(menu, IDM_SCSI_IRQ9, MF_UNCHECKED); - CheckMenuItem(menu, IDM_SCSI_IRQ10, MF_UNCHECKED); CheckMenuItem(menu, IDM_SCSI_IRQ11, MF_CHECKED); - CheckMenuItem(menu, IDM_SCSI_IRQ12, MF_UNCHECKED); } else if (scsi_irq == 12) { - CheckMenuItem(menu, IDM_SCSI_IRQ9, MF_UNCHECKED); - CheckMenuItem(menu, IDM_SCSI_IRQ10, MF_UNCHECKED); - CheckMenuItem(menu, IDM_SCSI_IRQ11, MF_UNCHECKED); CheckMenuItem(menu, IDM_SCSI_IRQ12, MF_CHECKED); } + else if (scsi_irq == 14) + { + CheckMenuItem(menu, IDM_SCSI_IRQ14, MF_CHECKED); + } + else if (scsi_irq == 15) + { + CheckMenuItem(menu, IDM_SCSI_IRQ15, MF_CHECKED); + } else { fatal("Unrecognized SCSI IRQ\n"); } + CheckMenuItem(menu, IDM_SCSI_DMA5, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_DMA6, MF_UNCHECKED); + CheckMenuItem(menu, IDM_SCSI_DMA7, MF_UNCHECKED); + if (scsi_dma == 5) { CheckMenuItem(menu, IDM_SCSI_DMA5, MF_CHECKED); - CheckMenuItem(menu, IDM_SCSI_DMA6, MF_UNCHECKED); - CheckMenuItem(menu, IDM_SCSI_DMA7, MF_UNCHECKED); } else if (scsi_dma == 6) { - CheckMenuItem(menu, IDM_SCSI_DMA5, MF_UNCHECKED); CheckMenuItem(menu, IDM_SCSI_DMA6, MF_CHECKED); - CheckMenuItem(menu, IDM_SCSI_DMA7, MF_UNCHECKED); } else if (scsi_dma == 7) { - CheckMenuItem(menu, IDM_SCSI_DMA5, MF_UNCHECKED); - CheckMenuItem(menu, IDM_SCSI_DMA6, MF_UNCHECKED); CheckMenuItem(menu, IDM_SCSI_DMA7, MF_CHECKED); } else @@ -1030,6 +1052,81 @@ void cdrom_close(void) char *floppy_image_extensions = "All floppy images (*.12;*.144;*.360;*.720;*.86F;*.BIN;*.DSK;*.FDI;*.FLP;*.HDM;*.IMA;*.IMD;*.IMG;*.TD0;*.VFD;*.XDF)\0*.12;*.144;*.360;*.720;*.86F;*.BIN;*.DSK;*.FDI;*.FLP;*.HDM;*.IMA;*.IMD;*.IMG;*.TD0;*.VFD;*.XDF\0Advanced sector-based images (*.IMD;*.TD0)\0*.IMD;*.TD0\0Basic sector-based images (*.12;*.144;*.360;*.720;*.BIN;*.DSK;*.FDI;*.FLP;*.HDM;*.IMA;*.IMG;*.VFD;*.XDF)\0*.12;*.144;*.360;*.720;*.BIN;*.DSK;*.FDI;*.FLP;*.HDM;*.IMA;*.IMG;*.VFD;*.XDF\0Flux images (*.FDI)\0*.FDI\0Surface-based images (*.86F)\0*.86F\0All files (*.*)\0*.*\0"; +int scsi_set_base(int base, int id) +{ + if (scsi_base == base) + { + return 0; + } + if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) + { + return 0; + } + pause = 1; + Sleep(100); + scsi_base = base; + CheckMenuItem(hmenu, IDM_SCSI_BASE130, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_BASE134, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_BASE230, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_BASE234, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_BASE330, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_BASE334, MF_UNCHECKED); + CheckMenuItem(hmenu, id, MF_CHECKED); + saveconfig(); + resetpchard(); + pause = 0; + return 1; +} + +int scsi_set_irq(int base, int id) +{ + if (scsi_irq == irq) + { + return 0; + } + if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) + { + return 0; + } + pause = 1; + Sleep(100); + scsi_irq = irq; + CheckMenuItem(hmenu, IDM_SCSI_IRQ9, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_IRQ10, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_IRQ11, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_IRQ12, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_IRQ14, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_IRQ15, MF_UNCHECKED); + CheckMenuItem(hmenu, id, MF_CHECKED); + saveconfig(); + resetpchard(); + pause = 0; + return 1; +} + +int scsi_set_dma(int base, int id) +{ + if (scsi_dma == dma) + { + return 0; + } + if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) + { + return 0; + } + pause = 1; + Sleep(100); + scsi_dma = dma; + CheckMenuItem(hmenu, IDM_SCSI_DMA5, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_DMA6, MF_UNCHECKED); + CheckMenuItem(hmenu, IDM_SCSI_DMA7, MF_UNCHECKED); + CheckMenuItem(hmenu, id, MF_CHECKED); + saveconfig(); + resetpchard(); + pause = 0; + return 1; +} + LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HMENU hmenu; @@ -1283,186 +1380,109 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM pause = 0; break; + case IDM_SCSI_BASE130: + if (scsi_set_base(0x130, IDM_SCSI_BASE130) == 0) + { + break; + } + break; + + case IDM_SCSI_BASE134: + if (scsi_set_base(0x134, IDM_SCSI_BASE134) == 0) + { + break; + } + break; + + case IDM_SCSI_BASE230: + if (scsi_set_base(0x230, IDM_SCSI_BASE230) == 0) + { + break; + } + break; + + case IDM_SCSI_BASE234: + if (scsi_set_base(0x234, IDM_SCSI_BASE234) == 0) + { + break; + } + break; + case IDM_SCSI_BASE330: - if (scsi_base == 0x330) + if (scsi_set_base(0x330, IDM_SCSI_BASE330) == 0) { break; } - if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) - { - break; - } - pause = 1; - Sleep(100); - scsi_base = 0x330; - CheckMenuItem(hmenu, IDM_SCSI_BASE330, MF_CHECKED); - CheckMenuItem(hmenu, IDM_SCSI_BASE334, MF_UNCHECKED); - saveconfig(); - resetpchard(); - pause = 0; break; case IDM_SCSI_BASE334: - if (scsi_base == 0x334) + if (scsi_set_base(0x334, IDM_SCSI_BASE334) == 0) { break; } - if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) - { - break; - } - pause = 1; - Sleep(100); - scsi_base = 0x334; - CheckMenuItem(hmenu, IDM_SCSI_BASE330, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_BASE334, MF_CHECKED); - saveconfig(); - resetpchard(); - pause = 0; break; case IDM_SCSI_IRQ9: - if (scsi_irq == 9) + if (scsi_set_irq(9, IDM_SCSI_IRQ9) == 0) { break; } - if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) - { - break; - } - pause = 1; - Sleep(100); - scsi_irq = 9; - CheckMenuItem(hmenu, IDM_SCSI_IRQ9, MF_CHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ10, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ11, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ12, MF_UNCHECKED); - saveconfig(); - resetpchard(); - pause = 0; break; case IDM_SCSI_IRQ10: - if (scsi_irq == 10) + if (scsi_set_irq(10, IDM_SCSI_IRQ10) == 0) { break; } - if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) - { - break; - } - pause = 1; - Sleep(100); - scsi_irq = 10; - CheckMenuItem(hmenu, IDM_SCSI_IRQ9, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ10, MF_CHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ11, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ12, MF_UNCHECKED); - saveconfig(); - resetpchard(); - pause = 0; break; case IDM_SCSI_IRQ11: - if (scsi_irq == 11) + if (scsi_set_irq(11, IDM_SCSI_IRQ11) == 0) { break; } - if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) - { - break; - } - pause = 1; - Sleep(100); - scsi_irq = 11; - CheckMenuItem(hmenu, IDM_SCSI_IRQ9, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ10, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ11, MF_CHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ12, MF_UNCHECKED); - saveconfig(); - resetpchard(); - pause = 0; break; case IDM_SCSI_IRQ12: - if (scsi_irq == 12) + if (scsi_set_irq(12, IDM_SCSI_IRQ12) == 0) { break; } - if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) + break; + + case IDM_SCSI_IRQ14: + if (scsi_set_irq(14, IDM_SCSI_IRQ14) == 0) + { + break; + } + break; + + case IDM_SCSI_IRQ15: + if (scsi_set_irq(15, IDM_SCSI_IRQ15) == 0) { break; } - pause = 1; - Sleep(100); - scsi_irq = 12; - CheckMenuItem(hmenu, IDM_SCSI_IRQ9, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ10, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ11, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_IRQ12, MF_CHECKED); - saveconfig(); - resetpchard(); - pause = 0; break; case IDM_SCSI_DMA5: - if (scsi_dma == 5) + if (scsi_set_dma(5, IDM_SCSI_DMA5) == 0) { break; } - if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) - { - break; - } - pause = 1; - Sleep(100); - scsi_dma = 5; - CheckMenuItem(hmenu, IDM_SCSI_DMA5, MF_CHECKED); - CheckMenuItem(hmenu, IDM_SCSI_DMA6, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_DMA7, MF_UNCHECKED); - saveconfig(); - resetpchard(); - pause = 0; break; case IDM_SCSI_DMA6: - if (scsi_dma == 6) + if (scsi_set_dma(6, IDM_SCSI_DMA6) == 0) { break; } - if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) - { - break; - } - pause = 1; - Sleep(100); - scsi_dma = 6; - CheckMenuItem(hmenu, IDM_SCSI_DMA5, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_DMA6, MF_CHECKED); - CheckMenuItem(hmenu, IDM_SCSI_DMA7, MF_UNCHECKED); - saveconfig(); - resetpchard(); - pause = 0; break; case IDM_SCSI_DMA7: - if (scsi_dma == 7) + if (scsi_set_dma(7, IDM_SCSI_DMA7) == 0) { break; } - if (MessageBox(NULL,"This will reset 86Box!\nOkay to continue?","86Box",MB_OKCANCEL) != IDOK) - { - break; - } - pause = 1; - Sleep(100); - scsi_dma = 7; - CheckMenuItem(hmenu, IDM_SCSI_DMA5, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_DMA6, MF_UNCHECKED); - CheckMenuItem(hmenu, IDM_SCSI_DMA7, MF_CHECKED); - saveconfig(); - resetpchard(); - pause = 0; break; case IDM_CDROM_EMPTY: