GUS: Add the UltraSound ACE

This commit is contained in:
Alexander Babikov
2025-09-01 05:33:02 +05:00
parent 7f7461620d
commit eec9b52151
27 changed files with 165 additions and 15 deletions

View File

@@ -203,9 +203,10 @@ extern const device_t es1373_onboard_device;
extern const device_t ct5880_device; extern const device_t ct5880_device;
extern const device_t ct5880_onboard_device; extern const device_t ct5880_onboard_device;
/* Gravis UltraSound and UltraSound Max */ /* Gravis UltraSound family */
extern const device_t gus_device; extern const device_t gus_device;
extern const device_t gus_max_device; extern const device_t gus_max_device;
extern const device_t gus_ace_device;
/* IBM PS/1 Audio Card */ /* IBM PS/1 Audio Card */
extern const device_t ps1snd_device; extern const device_t ps1snd_device;

View File

@@ -2136,6 +2136,9 @@ msgstr ""
msgid "Enable Game port" msgid "Enable Game port"
msgstr "" msgstr ""
msgid "Enable Adlib ports"
msgstr ""
msgid "SID Model" msgid "SID Model"
msgstr "" msgstr ""

View File

@@ -2136,6 +2136,9 @@ msgstr "Nízký DMA kanál"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Povolit herní port" msgstr "Povolit herní port"
msgid "Enable Adlib ports"
msgstr "Povolit porty Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Model SID" msgstr "Model SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "Niedrige DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Game-Port einschalten" msgstr "Game-Port einschalten"
msgid "Enable Adlib ports"
msgstr "Adlib-Ports einschalten"
msgid "SID Model" msgid "SID Model"
msgstr "SID-Modell" msgstr "SID-Modell"

View File

@@ -2136,6 +2136,9 @@ msgstr "DMA bajo"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Habilitar puerto de juegos" msgstr "Habilitar puerto de juegos"
msgid "Enable Adlib ports"
msgstr "Habilitar puertos Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Modelo de SID" msgstr "Modelo de SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "Matala DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Peliportti" msgstr "Peliportti"
msgid "Enable Adlib ports"
msgstr "Adlib-portit"
msgid "SID Model" msgid "SID Model"
msgstr "SID-malli" msgstr "SID-malli"

View File

@@ -2136,6 +2136,9 @@ msgstr "DMA bas"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Activer le port de jeu" msgstr "Activer le port de jeu"
msgid "Enable Adlib ports"
msgstr "Activer les ports Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Modèle SID" msgstr "Modèle SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "Niski DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Omogoći vrata za igru" msgstr "Omogoći vrata za igru"
msgid "Enable Adlib ports"
msgstr "Omogući Adlib portove"
msgid "SID Model" msgid "SID Model"
msgstr "Model SID-a" msgstr "Model SID-a"

View File

@@ -2136,6 +2136,9 @@ msgstr "DMA basso"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Abilita la porta giochi" msgstr "Abilita la porta giochi"
msgid "Enable Adlib ports"
msgstr "Abilita porte Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Modello SID" msgstr "Modello SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "低DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "ゲームポートを有効にする" msgstr "ゲームポートを有効にする"
msgid "Enable Adlib ports"
msgstr "Adlibポートを有効にする"
msgid "SID Model" msgid "SID Model"
msgstr "SIDモデル" msgstr "SIDモデル"

View File

@@ -2136,6 +2136,9 @@ msgstr "낮은 DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "게임 포트 사용" msgstr "게임 포트 사용"
msgid "Enable Adlib ports"
msgstr "Adlib 포트 활성화"
msgid "SID Model" msgid "SID Model"
msgstr "SID 모델" msgstr "SID 모델"

View File

@@ -2136,6 +2136,9 @@ msgstr "Lav DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Aktiver spillport" msgstr "Aktiver spillport"
msgid "Enable Adlib ports"
msgstr "Aktiver Adlib-porter"
msgid "SID Model" msgid "SID Model"
msgstr "SID-modell" msgstr "SID-modell"

View File

@@ -2136,6 +2136,9 @@ msgstr "Lage DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Game-poort inschakelen" msgstr "Game-poort inschakelen"
msgid "Enable Adlib ports"
msgstr "Adlib-poorten inschakelen"
msgid "SID Model" msgid "SID Model"
msgstr "SID-model" msgstr "SID-model"

View File

@@ -2136,6 +2136,9 @@ msgstr "Niski poziom DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Włącz port gier" msgstr "Włącz port gier"
msgid "Enable Adlib ports"
msgstr "Włącz porty Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Model SID" msgstr "Model SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "DMA baixo"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Ativar a porta do jogo" msgstr "Ativar a porta do jogo"
msgid "Enable Adlib ports"
msgstr "Ativar portas Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Modelo do SID" msgstr "Modelo do SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "DMA baixo"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Ativar a porta de jogos" msgstr "Ativar a porta de jogos"
msgid "Enable Adlib ports"
msgstr "Ativar portas Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Modelo do SID" msgstr "Modelo do SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "Низкий DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Включить игровой порт" msgstr "Включить игровой порт"
msgid "Enable Adlib ports"
msgstr "Включить порты Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Модель SID" msgstr "Модель SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "Nízka hodnota DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Povolenie herného portu" msgstr "Povolenie herného portu"
msgid "Enable Adlib ports"
msgstr "Povoliť porty Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Model SID" msgstr "Model SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "Nizki DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Omogočanje igralnih vrat" msgstr "Omogočanje igralnih vrat"
msgid "Enable Adlib ports"
msgstr "Omogoči vrata Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Model SID-a" msgstr "Model SID-a"

View File

@@ -2136,6 +2136,9 @@ msgstr "Låg DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Aktivera spelport" msgstr "Aktivera spelport"
msgid "Enable Adlib ports"
msgstr "Aktivera Adlib-portar"
msgid "SID Model" msgid "SID Model"
msgstr "SID-modell" msgstr "SID-modell"

View File

@@ -2136,6 +2136,9 @@ msgstr "Düşük DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Gameport'ı etkinleştir" msgstr "Gameport'ı etkinleştir"
msgid "Enable Adlib ports"
msgstr "Adlib bağlantı noktalarını etkinleştir"
msgid "SID Model" msgid "SID Model"
msgstr "SID Modeli" msgstr "SID Modeli"

View File

@@ -2136,6 +2136,9 @@ msgstr "Низький рівень DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Увімкнути ігровий порт" msgstr "Увімкнути ігровий порт"
msgid "Enable Adlib ports"
msgstr "Увімкнути порти Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Модель SID" msgstr "Модель SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "DMA thấp"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "Bật cổng trò chơi" msgstr "Bật cổng trò chơi"
msgid "Enable Adlib ports"
msgstr "Bật cổng Adlib"
msgid "SID Model" msgid "SID Model"
msgstr "Mẫu SID" msgstr "Mẫu SID"

View File

@@ -2136,6 +2136,9 @@ msgstr "低 DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "启用游戏端口" msgstr "启用游戏端口"
msgid "Enable Adlib ports"
msgstr "启用 Adlib 端口"
msgid "SID Model" msgid "SID Model"
msgstr "SID 芯片型号" msgstr "SID 芯片型号"

View File

@@ -2136,6 +2136,9 @@ msgstr "低 DMA"
msgid "Enable Game port" msgid "Enable Game port"
msgstr "啟用遊戲埠" msgstr "啟用遊戲埠"
msgid "Enable Adlib ports"
msgstr "啟用 Adlib 連接埠"
msgid "SID Model" msgid "SID Model"
msgstr "SID 型號" msgstr "SID 型號"

View File

@@ -46,6 +46,7 @@ enum {
enum { enum {
GUS_CLASSIC = 0, GUS_CLASSIC = 0,
GUS_MAX = 1, GUS_MAX = 1,
GUS_ACE = 2,
}; };
typedef struct gus_t { typedef struct gus_t {
@@ -651,6 +652,7 @@ gus_write(uint16_t addr, uint8_t val, void *priv)
break; break;
case 6: case 6:
if (gus->type > GUS_CLASSIC) { if (gus->type > GUS_CLASSIC) {
if (gus->type != GUS_ACE) {
if (!(val & 0x2) && (gus->jumper & 0x2)) if (!(val & 0x2) && (gus->jumper & 0x2))
io_removehandler(0x0100 + gus->base, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus); io_removehandler(0x0100 + gus->base, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
else if ((val & 0x2) && !(gus->jumper & 0x2)) else if ((val & 0x2) && !(gus->jumper & 0x2))
@@ -660,6 +662,7 @@ gus_write(uint16_t addr, uint8_t val, void *priv)
gameport_remap(gus->gameport, 0x0); gameport_remap(gus->gameport, 0x0);
else if ((val & 0x4) && !(gus->jumper & 0x4)) else if ((val & 0x4) && !(gus->jumper & 0x4))
gameport_remap(gus->gameport, 0x201); gameport_remap(gus->gameport, 0x201);
}
gus->jumper = val; gus->jumper = val;
} }
@@ -899,6 +902,8 @@ gus_read(uint16_t addr, void *priv)
case 0x706: case 0x706:
if (gus->type == GUS_MAX) if (gus->type == GUS_MAX)
val = 0x0a; /* GUS MAX */ val = 0x0a; /* GUS MAX */
else if (gus->type == GUS_ACE)
val = 0x30; /* GUS ACE */
else else
val = 0xff; /*Pre 3.7 - no mixer*/ val = 0xff; /*Pre 3.7 - no mixer*/
break; break;
@@ -943,8 +948,11 @@ gus_read(uint16_t addr, void *priv)
case 0x20e: case 0x20e:
return gus->sb_2xe; return gus->sb_2xe;
case 0x208:
case 0x388: case 0x388:
if ((gus->type == GUS_ACE) && !device_get_config_int("adlib_ports"))
break;
fallthrough;
case 0x208:
if (gus->tctrl & GUS_TIMER_CTRL_AUTO) if (gus->tctrl & GUS_TIMER_CTRL_AUTO)
val = gus->sb_2xa; val = gus->sb_2xa;
else { else {
@@ -959,8 +967,10 @@ gus_read(uint16_t addr, void *priv)
#ifdef OLD_NMI_BEHAVIOR #ifdef OLD_NMI_BEHAVIOR
nmi = 0; nmi = 0;
#endif /* OLD_NMI_BEHAVIOR */ #endif /* OLD_NMI_BEHAVIOR */
fallthrough; val = gus->ad_data;
break;
case 0x389: case 0x389:
if ((gus->type != GUS_ACE) || device_get_config_int("adlib_ports"))
val = gus->ad_data; val = gus->ad_data;
break; break;
@@ -1393,13 +1403,14 @@ gus_init(UNUSED(const device_t *info))
gus->base = device_get_config_hex16("base"); gus->base = device_get_config_hex16("base");
io_sethandler(gus->base, 0x0010, gus_read, NULL, NULL, gus_write, NULL, NULL, gus); io_sethandler(gus->base, 0x0010, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
if (gus->type != GUS_ACE)
io_sethandler(0x0100 + gus->base, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus); io_sethandler(0x0100 + gus->base, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
io_sethandler(0x0102 + gus->base, 0x000e, gus_read, NULL, NULL, gus_write, NULL, NULL, gus); io_sethandler(0x0102 + gus->base, 0x000e, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
io_sethandler(0x0506 + gus->base, 0x0001, gus_read, NULL, NULL, gus_write, NULL, NULL, gus); io_sethandler(0x0506 + gus->base, 0x0001, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
io_sethandler(0x0388, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus); io_sethandler(0x0388, 0x0002, gus_read, NULL, NULL, gus_write, NULL, NULL, gus);
if (gus->type == GUS_CLASSIC && device_get_config_int("gameport")) if (gus->type == GUS_CLASSIC && device_get_config_int("gameport"))
gus->gameport = gameport_add(&gameport_201_device); gus->gameport = gameport_add(&gameport_201_device);
else { else if (gus->type != GUS_ACE) {
gus->gameport = gameport_add(&gameport_pnp_1io_device); gus->gameport = gameport_add(&gameport_pnp_1io_device);
gameport_remap(gus->gameport, 0x201); gameport_remap(gus->gameport, 0x201);
} }
@@ -1418,7 +1429,7 @@ gus_init(UNUSED(const device_t *info))
sound_add_handler(gus_get_buffer, gus); sound_add_handler(gus_get_buffer, gus);
if (device_get_config_int("receive_input")) if ((gus->type != GUS_ACE) && (device_get_config_int("receive_input")))
midi_in_handler(1, gus_input_msg, gus_input_sysex, gus); midi_in_handler(1, gus_input_msg, gus_input_sysex, gus);
return gus; return gus;
@@ -1561,6 +1572,57 @@ static const device_config_t gus_max_config[] = {
// clang-format off // clang-format off
}; };
static const device_config_t gus_ace_config[] = {
// clang-format off
{
.name = "base",
.description = "Address",
.type = CONFIG_HEX16,
.default_string = NULL,
.default_int = 0x260,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "210H", .value = 0x210 },
{ .description = "220H", .value = 0x220 },
{ .description = "230H", .value = 0x230 },
{ .description = "240H", .value = 0x240 },
{ .description = "250H", .value = 0x250 },
{ .description = "260H", .value = 0x260 },
{ NULL }
},
.bios = { { 0 } }
},
{
.name = "gus_ram",
.description = "Memory size",
.type = CONFIG_SELECTION,
.default_string = NULL,
.default_int = 1,
.file_filter = NULL,
.spinner = { 0 },
.selection = {
{ .description = "512 KB", .value = 1 },
{ .description = "1 MB", .value = 2 },
{ NULL }
},
.bios = { { 0 } }
},
{
.name = "adlib_ports",
.description = "Enable Adlib ports",
.type = CONFIG_BINARY,
.default_string = NULL,
.default_int = 0,
.file_filter = NULL,
.spinner = { 0 },
.selection = { { 0 } },
.bios = { { 0 } }
},
{ .name = "", .description = "", .type = CONFIG_END }
// clang-format off
};
const device_t gus_device = { const device_t gus_device = {
.name = "Gravis UltraSound", .name = "Gravis UltraSound",
.internal_name = "gus", .internal_name = "gus",
@@ -1588,3 +1650,17 @@ const device_t gus_max_device = {
.force_redraw = NULL, .force_redraw = NULL,
.config = gus_max_config .config = gus_max_config
}; };
const device_t gus_ace_device = {
.name = "Gravis UltraSound ACE",
.internal_name = "gusace",
.flags = DEVICE_ISA16,
.local = GUS_ACE,
.init = gus_init,
.close = gus_close,
.reset = gus_reset,
.available = NULL,
.speed_changed = gus_speed_changed,
.force_redraw = NULL,
.config = gus_ace_config
};

View File

@@ -139,6 +139,7 @@ static const SOUND_CARD sound_cards[] = {
{ &cs4236b_device }, { &cs4236b_device },
{ &gus_device }, { &gus_device },
{ &gus_max_device }, { &gus_max_device },
{ &gus_ace_device },
{ &mirosound_pcm10_device }, { &mirosound_pcm10_device },
{ &pas16_device }, { &pas16_device },
{ &pas16d_device }, { &pas16d_device },